

CarlosPain
-
Posts
606 -
Joined
-
Last visited
-
Days Won
1
Reputation Activity
-
CarlosPain got a reaction from cocotonete in Deixe Seu Ot E Seu Site Online Com Xampp
Bom.. eu sei que já existem vários tutoriais com esse pelo XTibia, e embora seja copiado de outro membro, tá legal, bem formatado e talz.
Aprovado.
-
CarlosPain got a reaction from firegreen in Deixe Seu Ot E Seu Site Online Com Xampp
Bom.. eu sei que já existem vários tutoriais com esse pelo XTibia, e embora seja copiado de outro membro, tá legal, bem formatado e talz.
Aprovado.
-
CarlosPain got a reaction from Fepks in Começar Otserver Online, Site Online, Ip Fixo, Net Compartilhada, Liberando Portas, E Muito Mais!
Ui, fico muito sexy
É isso que falta no XTibia, conteúdo de qualidade, com uma boa formatação,
apesar de eu preferir alinhado a esquerda.
Parabéns, eu não tenho o poder de aprovar, mas se tivesse já teria feito
Mas bem, acho que faltou mais imagens, e você poderia ter simplificado
algumas coisas, deichar de usar tanto as tags code, e bem
separar por tópicos seria legal, criar uma introdução no Tutorial é fundamental
e também a formatação.
Obrigado pela indicação
Frozen
-
CarlosPain got a reaction from bibi260 in Deixe Seu Ot E Seu Site Online Com Xampp
Bom.. eu sei que já existem vários tutoriais com esse pelo XTibia, e embora seja copiado de outro membro, tá legal, bem formatado e talz.
Aprovado.
-
CarlosPain got a reaction from realquimista in Novidades No Sistema De Reputação
Olá XTibianos!
Fazem algumas semanas que o sistema de reputação foi implementado na comunidade, na verdade foi inserido junto com o update do fórum para o IPB 3. Há muito tempo vocês vinham pedindo para que algo do tipo fosse criado, mas desde a época em que o JV Chequer ainda era o responsável pela manutenção do fórum, estávamos esperando que a Invision criasse esse sistema, para que então o XTibia pudesse utilizá-lo.
Depois de muito tempo de espera vocês receberam o tão desejado sistema de reputação, entretanto alguns usuários não souberam fazer bom uso e avacalharam tudo. Então o Rotciv retirou os acessos dos usuários para dar e tirar reputação de outros membros, e agora somente a equipe pode fazer isso.
Daí agora as coisas mudaram por completo, inclusive algumas regras do XTibia :-)
Essa atitude do Rotciv foi simplesmente genial, por que deu espaço a várias pirações entre minhas conversas com o Rafael Medeiros!
Ahhhh, ok! Mas e aí, como vai ser agora?
O sistema de reputação - o qual o nome já é bem sugestivo - vai ser utilizado como forma de reconhecer o trabalho realizado por vocês para com a comunidade, e também como forma de punição àqueles que infligirem as regras estabelecidas pela nossa equipe. Esse sistema de reputação aplicar-se-à exclusivamente a vocês xtibianos, os nossos membros da equipe não estarão passíveis de tal, enquanto fizerem parte da nossa equipe, é claro.
Como ganho reputação? +REP
Reportando tópicos; Criando tutoriais; Divulgando serviços do XTibia; Participando dos eventos da comunidade; Respondendo as dúvidas de outros membros; Criando Artigos e Matérias; Trazendo notícias sobre Tibia e OTServ; Disponibilizando downloads (sem vírus) para os usuários; Propondo melhorias para o XTibia; Indicando amigos; Atendendo pedidos dos usuários.
Como perco reputação? -REP
Criando tópicos em seções incorretas (com reincidência); Postando mensagens sem sentido (flood), em áreas comuns do XTibia, exceto Barzinho do Éks; Xingando ou ofendendo outros membros da comunidade; Perturbando o convívio dos usuários dentro do XTibia.
Todos vocês serão avaliados a partir de hoje conforme agem dentro da comunidade, quanto mais ajudarem a comunidade melhor para vocês, àqueles que só pensam em infligir as regras só tem a perder aqui dentro. Se você não curte ajudar, não tem problema, você não vai perder reputação a não ser que quebre alguma das nossas regras.
As áreas onde o sistema de +REP (reputação positiva) serão aplicadas são:
- Suporte Site/Fórum XTibia: Críticas & Sugestões;
- OTServ: Tutoriais, Downloads, Matérias & Artigos, Pedidos, Dúvidas, Notícias;
- Tibia: Noticias, Matérias & Artigos, Informações para iniciantes, Quests, Downloads;
- Design: Suporte, Pedidos, Pixel Art, Fakes, Tutoriais, Recursos para Design/Gráficos.
Então você se pergunta: e o que eu ganho com isso?
Muiiiiiiiiita coisa!
Além do reconhecimento de nossa comunidade, de nossa equipe e dos nossos visitantes, você pode acumular pontos de reputação para poder trocar por prêmios. Isso mesmo, você vai poder trocar por prêmios muito em breve! Eu e o Rafael já estamos estudando como será feita a distribuição de prêmios aos nossos usuários de acordo com a quantidade de pontos de reputação que eles possuem.
Vai ser como uma "moeda virtual".. lembra daquele sistema de cash que vocês proporam? Então nós resolvemos - em uma de nossas pirações - utilizar os pontos de reputação como forma de recompensar cada vez mais os nossos usuários. Eu sei que vocês devem estar curiosos sobre o que irão ganhar com esses tais pontos, e vou liberar alguns dos possíveis itens em nossa lista:
Premmium Time (1 e 3 meses); Itens na Gamerchants; Camisetas e gadgets XTibia; Pendrives e acessórios para seu computador; Contas premmium em sites da web. Não vou garantir de cara para vocês que é certeza esses prêmios, nem como tudo vai funcionar, até por que começamos a desenvolver a idéia hoje, mas enquanto isso vocês já vão acumulando pontos por tudo aquilo que fizerem no XTibia, e assim que lançarmos o sistema de trocas de pontos vocês já poderão adquirir seus premios.
É claro que isso não vai substituir os nossos eventos mensais, que tenho que dizer a vocês, estão ficando excelentes! Nossa equipe de Coordenadores está trabalhando para desenvolver eventos bem bacanas. Aproveitando o show de spoiler que está sendo esse tópico, mês de Fevereiro teremos 5 eventos fixos, ou seja, todo mês serão realizados, sendo eles:
- X-Mapping
- X-Scripting
- X-Developing
- X-Design
- X-Blogs
HAHAHA, mal consigo me conter de emoção ao escrever este tópico!
Além disso ainda vai ter maaaaais premiação para a galera que segue a gente no Twitter, e também nos outros serviços oferecidos pelo XTibia :-)
Clique sobre as imagens para visitar os serviços
É isso ai galera, espero que vocês tenham gostado das notícias, e façam um bom trabalho para a comunidade, nós queremos recompensá-los por tudo que fizerem aqui.
Tendo alguma dúvida, é só perguntar!
-
CarlosPain got a reaction from will777 in Parceria De Sucesso!
Fala galeeeeera!
Depois de muito tempo e alguns e-mails perguntando sobre o nosso sistema de parcerias, venho trazer-lhes a notícia de que...
ESTAMOS DE VOLTA!
<br>
Se você está desenvolvendo algum projeto que tenha relação com Tibia e OTserv, como por exemplo:
Aulas de mapping, scripiting, programação; Criação de mapas exclusivos; Criação de programas para OTServ; Criação de utilitários para Tibia (exceto bots); Desenvolvimento de website e frameworks para OTServ; Blogs com conteúdo sobre Tibia/OTserv Servidor de OTserv online O XTibia tem o interesse em te ajudar, oferecendo todo o suporte necessário para desenvolvimento do seu projeto.
Para maiores informações sobre como proceder, clique aqui!
Se você tiver alguma dúvida sobre nosso sistema de parcerias, basta perguntá-la aqu!
-
CarlosPain got a reaction from Mophus in Parceria De Sucesso!
Fala galeeeeera!
Depois de muito tempo e alguns e-mails perguntando sobre o nosso sistema de parcerias, venho trazer-lhes a notícia de que...
ESTAMOS DE VOLTA!
<br>
Se você está desenvolvendo algum projeto que tenha relação com Tibia e OTserv, como por exemplo:
Aulas de mapping, scripiting, programação; Criação de mapas exclusivos; Criação de programas para OTServ; Criação de utilitários para Tibia (exceto bots); Desenvolvimento de website e frameworks para OTServ; Blogs com conteúdo sobre Tibia/OTserv Servidor de OTserv online O XTibia tem o interesse em te ajudar, oferecendo todo o suporte necessário para desenvolvimento do seu projeto.
Para maiores informações sobre como proceder, clique aqui!
Se você tiver alguma dúvida sobre nosso sistema de parcerias, basta perguntá-la aqu!
-
CarlosPain reacted to DevilMoon in Pet System ! Tfs= 0.3.4
Ola Xtibianos, Vejo Muintas Pessoas Com Problemas em Seus Pets como Eu!! Entao decidi Achar um Para minha TFS 0.3.4 e Achei um Perfeitinho e Quis Compartilhar a Galera Xtibiana!!
Comandos:
!pet summon
!pet buy Cat
!pet release
!pet move
!pet say
Começando:
Vá em Data>Talkactions.xml Adicione Isso:
<talkaction words="!pet" script="pet.lua"/>
Agora em Data>Talkactions>Scripts crie uma pasta.lua chamada pet e coloque isso:
local PET = -- CONFIG -- { -- storages name = 7700, petuid = 7701, online = 7702, damage = 7703, allowed = { -- allowed pets, costs & level required ["cat"] = {cost = 50, level = 1}, ["dog"] = {cost = 50, level = 1}, ["deer"] = {cost = 50, level = 1}, ["pig"] = {cost = 50, level = 1}, ["parrot"] = {cost = 50, level = 1}, ["seagull"] = {cost = 50, level = 1}, ["chicken"] = {cost = 50, level = 1}, ["rabbit"] = {cost = 50, level = 1}, ["squirrel"] = {cost = 50, level = 1}, ["frog"] = {cost = 50, level = 1}, ["rat"] = {cost = 50, level = 1}, ["sheep"] = {cost = 100, level = 1}, ["wolf"] = {cost = 300, level = 8}, ["skeleton"] = {cost = 300, level = 15}, ["war wolf"] = {cost = 1000, level = 20}, ["demon skeleton"] = {cost = 3000, level = 25} }, direction = {["up"] = NORTH, ["down"] = SOUTH, ["right"] = EAST, ["left"] = WEST}, -- used with !pet move help = { -- used with !pet say "Type '!pet summon' to summon your pet.", "Type '!pet buy [petname]' to buy a pet. e.g. '!pet buy war_wolf'", "Type '!pet move [direction]' to ask your pet to move.", "Type '!pet say \"text' to ask your pet to say something.", "Type '!pet release' to release your pet." } } function petHelp(p) doPlayerSendTextMessage(p.cid, 19, PET.help[p.i]) end function onSay(cid, words, param) local p = {""} if param ~= "" then p = string.explode(param, " ") end local petuid = getPlayerStorageValue(cid, PET.petuid) local online = getPlayerStorageValue(cid, PET.online) if p[1] == "help" then for i = 1, #PET.help do addEvent(petHelp, 1000*i - 1000, {i = i, cid = cid}) end elseif p[1] == "summon" then local name = getPlayerStorageString(cid, PET.name) if isCreature(petuid) == FALSE then if online == 1 then local tile = getClosestFreeTile(cid, getThingPos(cid), FALSE, FALSE) if getTilePzInfo(getThingPos(cid)) ~= 1 and getTilePzInfo(tile) ~= 1 then if name ~= "" then if getMonsterInfo(name) ~= nil then petuid = doSummonCreature(name, tile) doConvinceCreature(cid, petuid) doCreatureSay(petuid, 'hey, sup', TALKTYPE_ORANGE_1) doChangeSpeed(petuid, getCreatureBaseSpeed(cid) - getCreatureBaseSpeed(petuid)) setPlayerStorageValue(cid, PET.online, 2) setPlayerStorageValue(cid, PET.petuid, petuid) doPlayerSendCancel(cid, 'Summoning '..name..'.') if getPlayerStorageValue(cid, PET.damage) > 0 then if getPlayerStorageValue(cid, PET.damage) < getCreatureMaxHealth(petuid) then doCreatureAddHealth(petuid, getPlayerStorageValue(cid, PET.damage)*-1) end end else doPlayerSendCancel(cid, 'Invalid pet name.') end else doPlayerSendCancel(cid, 'Invalid pet name.') end else doPlayerSendCancel(cid, 'You may not summon your pet here.') end else doPlayerSendCancel(cid, 'You do not have a pet. Type !pet <pet name> to get one.') end else setPlayerStorageValue(cid, PET.damage, getCreatureMaxHealth(petuid) - getCreatureHealth(petuid)) doCreatureSay(petuid, 'gtg, cya', TALKTYPE_ORANGE_1) doSendMagicEffect(getThingPos(petuid),CONST_ME_POFF) doRemoveCreature(petuid) doPlayerSendCancel(cid, 'Retrieving '..name..'.') setPlayerStorageValue(cid, 7702, 1) end elseif p[1] == "buy" then local text if p[2] ~= nil then name = string.gsub(p[2], "_", " ") if (isCreature(petuid) ~= TRUE and online == 2) or online <= 0 then if PET.allowed[name] ~= nil then if getPlayerLevel(cid) >= PET.allowed[name].level then if getPlayerMoney(cid) >= PET.allowed[name].cost then doPlayerRemoveMoney(cid, PET.allowed[name].cost) setPlayerStorageValue(cid, PET.online, 1) setPlayerStorageValue(cid, PET.damage, 0) setPlayerStorageString(cid, PET.name, name) text = "You have bought a pet \""..name.."\" for "..PET.allowed[name].cost.." gold coins." else text = "You do not have enough money. It costs "..PET.allowed[name].cost.." gold coins to buy a "..name.."." end else text = "You need level "..PET.allowed[name].level.." to buy this pet." end else text = "You may not buy that pet." end else text = "You already have a pet." end else text = "!pet buy [petname]" end if text ~= nil then doPlayerSendTextMessage(cid, 19, text) end elseif p[1] == "move" then if isCreature(petuid) == TRUE then if p[2] ~= nil then if PET.direction[p[2]] ~= nil then if doTileQueryAdd(petuid, getPosByDir(getThingPos(petuid), PET.direction[p[2]], 1)) == 1 then doMoveCreature(petuid, PET.direction[p[2]]) else doPlayerSendCancel(cid, 'Tile is blocked.') end else doPlayerSendCancel(cid, '!pet move [up/down/left/right]') end else doPlayerSendCancel(cid, '!pet move [up/down/left/right]') end else doPlayerSendCancel(cid, 'Summon a pet first.') end elseif p[1] == "say" then text = string.explode(param, "\"") if isCreature(petuid) == TRUE then if text[2] ~= nil then if string.len(text[2]) < 39 then doCreatureSay(petuid, text[2], TALKTYPE_ORANGE_1) else doPlayerSendCancel(cid, 'Too long text.') end else doPlayerSendCancel(cid, '!pet say "I am '..getCreatureName(cid)..'\'s pet.') end else doPlayerSendCancel(cid, 'Summon a pet first.') end elseif p[1] == "release" then if isCreature(petuid) == TRUE and getPlayerStorageValue(cid, PET.online) == 2 then doCreatureSay(petuid, ':\'(', TALKTYPE_ORANGE_1) doSendMagicEffect(getThingPos(petuid),CONST_ME_POFF) doRemoveCreature(petuid) doPlayerSendCancel(cid, 'Releasing '..name..'.') setPlayerStorageValue(cid, 7702, 1) end setPlayerStorageValue(cid, PET.online, 2) setPlayerStorageValue(cid, PET.damage, 0) doPlayerSendTextMessage(cid, 19, "You have released your pet \""..name.."\".") setPlayerStorageString(cid, PET.name, "") else doPlayerSendTextMessage(cid, 19, "!pet [help/summon/buy/move/say/release]") end return TRUE end
Ok Acabamos com as Talkactions agora vá em Data>CreatureEvents.xml e Adicione Isso:
Obs: ( Caso Ja Ouver a Pasta Logout.lua Delete Tudu dela e Coloque a Nova )
<event type="logout" name="logout" event="script" value="logout.lua"/>
Agora vá em Data>CreatureEvents>Scripts crie uma pasta.lua chamada logout e coloque isso:
local petuidstor = 7701 -- storages, have to be same as your other script. local onlinestor = 7702 local damagestor = 7703 function onLogout(cid) if isCreature(getPlayerStorageValue(cid, petuidstor)) == 1 then if getPlayerStorageValue(cid, onlinestor) == 2 then local petuid = getPlayerStorageValue(cid, petuidstor) setPlayerStorageValue(cid, damagestor, getCreatureMaxHealth(petuid) - getCreatureHealth(petuid)) doSendMagicEffect(getThingPos(petuid),CONST_ME_POFF) setPlayerStorageValue(cid, onlinestor, 1) end end return TRUE end
Abra a pata login.lua que se localiza em Data>CreatureEvents>Scripts abra ela e coloque isso:
registerCreatureEvent(cid, "logout")
Agora para Finalizar vá em Data>Lib>Function.lua e Acresente Isso:
string.explode = function (str, sep) local pos, t = 1, {} if #sep == 0 or #str == 0 then return end for s, e in function() return str:find(sep, pos) end do table.insert(t, str:sub(pos, s - 1):trim()) pos = e + 1 end table.insert(t, str:sub(pos):trim()) return t end _warpzone = 2147483648 -- start storing strings here (THIS IS THE ABSOLUTE MAXIMUM VALUE FOR THIS) _maxlength = 1024 -- multiply by 3 to get the true length. setPlayerStorageInteger = setPlayerStorageValue getPlayerStorageInteger = getPlayerStorageValue function setPlayerStorageString(cid, key, value) if #value > (_maxlength-1) * 3 - 1 then -- Last word is reserved for 0 termination of the string. error("Storage string is too long") end if key > _warpzone / _maxlength then error("Storage string key is too large (" .. key .. ")") end key = _warpzone + key * _maxlength local word = 0 local wordwrap = 0 local wordcount = 0 local i = 1 while i <= #value do local byte = string.byte(string.sub(value, i, i)) word = bit.bor(word, bit.lshift(byte, wordwrap)) wordwrap = wordwrap + 8 if wordwrap == 24 then --[[ In the ideal world we would be able to store 4 characters per word, however, as the default return value for getPlayerStorageValue is -1, we can't use the last bit. ]]-- setPlayerStorageInteger(cid, key + wordcount, word) word = 0 wordwrap = 0 wordcount = wordcount + 1 end i = i + 1 end -- store the last word setPlayerStorageInteger(cid, key + wordcount, word) end function getPlayerStorageString(cid, key) if key > _warpzone / _maxlength then error("Storage string key is too large (" .. key .. ")") end key = _warpzone + key * _maxlength local wordcount = 0 local str = "" while true do if wordcount >= _maxlength then break end local word = getPlayerStorageInteger(cid, key + wordcount) if word == -1 then -- end of string break else -- Extract the 3 characters from the value byte = bit.band(word, 255) if byte == 0 then break else str = str .. string.char(byte) end byte = bit.rshift(bit.band(word, 65280), 8) if byte == 0 then break else str = str .. string.char(byte) end byte = bit.rshift(bit.band(word, 16711680), 16) if byte == 0 then break else str = str .. string.char(byte) end end wordcount = wordcount + 1 end return str end
Obs²: Delete Todos Arquivos de Pets System Velhos para nao Causar nem um Bug!!
Creditos:
jordanhenry.
Sugestoes, Duvidas Somente neste Topico!!
Abraços..
-
CarlosPain reacted to Zutun in Corno Tutorial
Outcome:
Tuto:
http://img826.imageshack.us/img826/8671/57268313.jpg
Render
Créditos totais ao Luccas
Beijos Xtibianos!
-
CarlosPain got a reaction from Tucoww in Opine Sobre O Sistema De Reputação!
Bem vindos ao tópico: QUEM TEM BOCA FALA!
Salve XTibianos!
Eu sei que vocês não vão falar, e sim digitar... mas é que foi o nome que me veio em mente primeiro, uheuhaehauh.
É o seguinte, vocês devem ter percebido que nós adicionamos um novo sistema de reputação, e muitas coisas vão mudar de agora em diante, mas mudarão para melhor é claro!
Se você ainda não viu o tópico,
clique aqui!
Precisamos de sua opinião para continuarmos crescendo :-)
Contribua com um comentário.
-
CarlosPain reacted to Koddy in Aprendendo A Modificar Extensions
Saudações XTibianos!
Bom, depois de muitos pedirem, insistirem, e beijarem meus pés; cá estou eu. Mas não para lhe dar uma extension de mão beijada, e sim para lhe ensinar a como fazer a sua própria.
É isso mesmo! Agora você vai aprender a customizar seu Palette, criar um novo Palette; enfim, colocar os atalhos para os itens que você quiser, onde você quiser e na ordem que você quiser.
Sem contar também que agora os novos itens da versão 8.6 poderão ser juntados aos diferentes pisos/paredes para facilitar na hora de mappear. Espero que ajude muita gente, e que todos possam entender com clareza.
Lembrando que eu ainda não aprendi todos as funções de cada palavra, mas independente delas, consegui fazer o que quis, então vamos lá (se conserguir fazer de um jeito melhor, fique a vontade para fazer, e se quiser poste aqui sua sugestão).
Aprendendo a modificar extensions
Índice/Partes:
•Introdução
•Alterando posições de itens no Palette
•Criando seu próprio Piso, com direito a borda
•Criando sua própria parede, com todos os 'quatro cantos'
•Criando Doodads 'Espaçosos' (estilo Fontes)
•Criando Doodads 'Aleatórios' (estilo Flores)
•Frequently Asked Questions - FAQ
Introdução
A. Alterando posições de itens no Palette
B. Criando seu próprio Piso, com direito a borda
C. Criando sua própria parede, com todos os 'quatro cantos'
D. Criando Doodads 'Espaçosos' (estilo Fontes)
E. Criando Doodads 'Aleatórios' (estilo Flores)
---
Obs: Não sabe o que significa uma opção? Tente alterá-la e veja no que dá (mas por favor, não esqueça do 'BackUp'). (:
---
Dicionário:
'AB' = Auto Border
---
Frequently Asked Questions - FAQ (Leia antes de postar uma Dúvida):
---
No mais, desejo boa sorte para o que quer que você faça modificando suas "Extensions". Ensinei tudo que eu sei, e espero continuar aprendendo para que eu possa compartilhar com vocês.
Acho que este foi o tutorial mais cansativo longo (que levou alguns dias) que já fiz até hoje. Espero que tenham gostado, e por favor, agradeçam para que eu possa continuar fazendo meus tutoriais ver que meu esforço valeu a pena.
Obrigado por lerem até aqui. Não deixem de continuar visitando o XTibia.
Atenciosamente,
Koddy.
-
CarlosPain reacted to comedinhasss in Passando Um Otserv Para 8.60
Fala ae galerinha do xtibia...
Bom vejo que muitos programadores ainda estão em dúvida para passar o seu ot para 8.6 ...
Bom então estou fazendo um tutorial...
Testado em tfs 0.3.6pl1
Sources:
Em House.cpp:
Procure:
std::string metachars = ".[{}()\\+|^{:content:}quot;;
Substitua por:
std::string metachars = ".[{}()\\+|^$*?";
Procure:
if(metachars.find(*it) != std::string::npos) outExp += "\\";
Subistitua por:
if(metachars.find(*it) != std::string::npos) outExp += "";
Procure:
replaceString(outExp, "*", ".*"); replaceString(outExp, "?", ".?");
Subistitua por:
replaceString(outExp, "*", ""); replaceString(outExp, "?", "");
Em resources.h:
Procure:
#define CLIENT_VERSION_MIN 854 #define CLIENT_VERSION_MAX 854 #define CLIENT_VERSION_STRING "Only clients with protocol 8.54 are allowed!" #define STATUS_SERVER_NAME "TheForgottenServer" #define STATUS_SERVER_VERSION "0.3.6" #define STATUS_SERVER_CODENAME "Crying Damson" #define STATUS_SERVER_PROTOCOL "8.54"
Substitua por:
#define CLIENT_VERSION_MIN 860 #define CLIENT_VERSION_MAX 860 #define CLIENT_VERSION_STRING "Only clients with protocol 8.60 are allowed!" #define STATUS_SERVER_NAME "TheForgottenServer" #define STATUS_SERVER_VERSION "0.3.6" #define STATUS_SERVER_CODENAME "Crying Damson" #define STATUS_SERVER_PROTOCOL "8.60"
Em itemloader.h:
Procure:
CLIENT_VERSION_854 = 16
Substitua e adicione por:
CLIENT_VERSION_854 = 16, CLIENT_VERSION_855 = 17, CLIENT_VERSION_856 = 18, CLIENT_VERSION_857 = 19, CLIENT_VERSION_860 = 20
Em items.cpp:
Procure:
else if(Items::dwMinorVersion != CLIENT_VERSION_854)
Substitua e adicione por:
else if(Items::dwMinorVersion != 19)
Em protocolgame.cpp:
Procure:
void ProtocolGame::parseAttack(NetworkMessage& msg) { uint32_t creatureId = msg.GetU32(); addGameTask(&Game::playerSetAttackedCreature, player->getID(), creatureId); }
Substitua por:
void ProtocolGame::parseAttack(NetworkMessage& msg) { uint32_t creatureId = msg.GetU32(); msg.GetU32(); msg.GetU32(); addGameTask(&Game::playerSetAttackedCreature, player->getID(), creatureId); }
Também procure:
void ProtocolGame::sendCancelTarget() { NetworkMessage_ptr msg = getOutputBuffer(); if(msg) { TRACK_MESSAGE(msg); msg->AddByte(0xA3); } }
Substitua por:
void ProtocolGame::sendCancelTarget() { NetworkMessage_ptr msg = getOutputBuffer(); if(msg) { TRACK_MESSAGE(msg); msg->AddByte(0xA3); msg->AddU32(0); } }
Em spells.cpp (somente em spells.cpp)
Procure:
g_game.transformItem(item, item->getID(), std::max((int32_t)0, ((int32_t)item->getCharges()) - 1));
Substitua por:
g_game.transformItem(item, item->getID(), std::max((int32_t)0, ((int32_t)item->getItemCount()) - 1));
Em tools.cpp:
Procure:
{"insects", MAGIC_EFFECT_INSECTS}
Substitua por:
{"insects", MAGIC_EFFECT_INSECTS}, {"dragonhead", MAGIC_EFFECT_DRAGONHEAD}
Em const.h:
Procure:
MAGIC_EFFECT_INSECTS = 0x44, //68 MAGIC_EFFECT_LAST = MAGIC_EFFECT_INSECTS,
Substitua por:
MAGIC_EFFECT_INSECTS = 0x44, //68, MAGIC_EFFECT_DRAGONHEAD = 0x45, //69 MAGIC_EFFECT_LAST = MAGIC_EFFECT_DRAGONHEAD,
Em game.cpp:
Procure:
void Game::showHotkeyUseMessage(Player* player, Item* item) { int32_t subType = -1; if(item->hasSubType() && !item->hasCharges()) subType = item->getSubType(); const ItemType& it = Item::items[item->getID()]; uint32_t count = player->__getItemTypeCount(item->getID(), subType, false); char buffer[40 + it.name.size()]; if(count == 1) sprintf(buffer, "Using the last %s...", it.name.c_str()); else sprintf(buffer, "Using one of %d %s...", count, it.pluralName.c_str()); player->sendTextMessage(MSG_INFO_DESCR, buffer); }
Substitua por:
void Game::showHotkeyUseMessage(Player* player, Item* item) { const ItemType& it = Item::items[item->getID()]; uint32_t count = player->__getItemTypeCount(item->getID(), -1); char buffer[40 + it.name.size()]; if(count == 1) sprintf(buffer, "Using the last %s...", it.name.c_str()); else sprintf(buffer, "Using one of %d %s...", count, it.pluralName.c_str()); player->sendTextMessage(MSG_INFO_DESCR, buffer); }
Em npc.cpp:
Procure:
li.itemId = intValue;
Embaixo adicione:
const ItemType& it = Item::items[li.itemId];
Também procure:
if(readXMLInteger(tmpNode, "subtype", intValue)) li.subType = intValue;
Embaixo adicione:
else { if(it.stackable) li.subType = 1; else if(it.isFluidContainer() || it.isSplash()) li.subType = 0; }
Em item.cpp:
Procure:
s << "("; if(!it.runeSpellName.empty()) s << "\"" << it.runeSpellName << "\", "; s << "Charges:" << subType <<")";
Embaixo adicione:
if(!it.runeSpellName.empty()) s << "(\"" << it.runeSpellName << "\")";
Em luascript.cpp:
Procure por:
//getCreatureHealth(cid) lua_register(m_luaState, "getCreatureHealth", LuaScriptInterface::luaGetCreatureHealth);
Embaixo adicione:
//getItemParent(uid) lua_register(m_luaState, "getItemParent", LuaScriptInterface::luaGetItemParent);
Também procure por:
int32_t LuaScriptInterface::luaGetCreatureHealth(lua_State* L) { //getCreatureHealth(cid) ScriptEnviroment* env = getEnv(); if(Creature* creature = env->getCreatureByUID(popNumber(L))) lua_pushnumber(L, creature->getHealth()); else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1; }
Substitua por:
int32_t LuaScriptInterface::luaGetItemParent(lua_State* L) { //getItemParent(uid) ScriptEnviroment* env = getEnv(); Item* item = env->getItemByUID(popNumber(L)); if(!item) { errorEx(getError(LUA_ERROR_ITEM_NOT_FOUND)); lua_pushnil(L); return 1; } Item* container = item->getParent()->getItem(); pushThing(L, container, env->addThing(container)); return 1; }
Em luascript.h:
Procure por:
static int32_t luaDoRemoveItem(lua_State* L);
Embaixo adicione:
static int32_t luaGetItemParent(lua_State* L);
Pasta Data:
Na pasta data\actions\scripts\liquids\potions.lua:
Delete tudo e adicione:
local config = { removeOnUse = "no", usableOnTarget = "yes", -- can be used on target? (fe. healing friend) splashable = "no", realAnimation = "no", -- make text effect visible only for players in range 1x1 healthMultiplier = 1.0, manaMultiplier = 1.0 } config.removeOnUse = getBooleanFromString(config.removeOnUse) config.usableOnTarget = getBooleanFromString(config.usableOnTarget) config.splashable = getBooleanFromString(config.splashable) config.realAnimation = getBooleanFromString(config.realAnimation) local POTIONS = { [8704] = {empty = 7636, splash = 2, health = {50, 100}}, -- small health potion [7618] = {empty = 7636, splash = 2, health = {100, 200}}, -- health potion [7588] = {empty = 7634, splash = 2, health = {200, 400}, level = 50, vocations = {3, 4, 7, 8}, vocStr = "knights and paladins"}, -- strong health potion [7591] = {empty = 7635, splash = 2, health = {500, 700}, level = 80, vocations = {4, 8}, vocStr = "knights"}, -- great health potion [8473] = {empty = 7635, splash = 2, health = {800, 1000}, level = 130, vocations = {4, 8}, vocStr = "knights"}, -- ultimate health potion [7620] = {empty = 7636, splash = 7, mana = {70, 130}}, -- mana potion [7589] = {empty = 7634, splash = 7, mana = {110, 190}, level = 50, vocations = {1, 2, 3, 5, 6, 7}, vocStr = "sorcerers, druids and paladins"}, -- strong mana potion [7590] = {empty = 7635, splash = 7, mana = {200, 300}, level = 80, vocations = {1, 2, 5, 6}, vocStr = "sorcerers and druids"}, -- great mana potion [8472] = {empty = 7635, splash = 3, health = {200, 400}, mana = {110, 190}, level = 80, vocations = {3, 7}, vocStr = "paladins"} -- great spirit potion } local exhaust = createConditionObject(CONDITION_EXHAUST) setConditionParam(exhaust, CONDITION_PARAM_TICKS, (getConfigInfo('timeBetweenExActions') - 100)) function onUse(cid, item, fromPosition, itemEx, toPosition) local potion = POTIONS[item.itemid] if(not potion) then return false end if(not isPlayer(itemEx.uid) or (not config.usableOnTarget and cid ~= itemEx.uid)) then if(not config.splashable) then return false end if(toPosition.x == CONTAINER_POSITION) then toPosition = getThingPos(item.uid) end doDecayItem(doCreateItem(2016, potion.splash, toPosition)) doTransformItem(item.uid, potion.empty) return true end if(hasCondition(cid, CONDITION_EXHAUST_HEAL)) then doPlayerSendDefaultCancel(cid, RETURNVALUE_YOUAREEXHAUSTED) return true end if(((potion.level and getPlayerLevel(cid) < potion.level) or (potion.vocations and not isInArray(potion.vocations, getPlayerVocation(cid)))) and not getPlayerCustomFlagValue(cid, PLAYERCUSTOMFLAG_GAMEMASTERPRIVILEGES)) then doCreatureSay(itemEx.uid, "Only " .. potion.vocStr .. (potion.level and (" of level " .. potion.level) or "") .. " or above may drink this fluid.", TALKTYPE_ORANGE_1) return true end local health = potion.health if(health and not doCreatureAddHealth(itemEx.uid, math.ceil(math.random(health[1], health[2]) * config.healthMultiplier))) then return false end local mana = potion.mana if(mana and not doPlayerAddMana(itemEx.uid, math.ceil(math.random(mana[1], mana[2]) * config.manaMultiplier))) then return false end doSendMagicEffect(getThingPos(itemEx.uid), CONST_ME_MAGIC_BLUE) if(not realAnimation) then doCreatureSay(itemEx.uid, "Aaaah...", TALKTYPE_ORANGE_1) else for i, tid in ipairs(getSpectators(getCreaturePosition(cid), 1, 1)) do if(isPlayer(tid)) then doCreatureSay(itemEx.uid, "Aaaah...", TALKTYPE_ORANGE_1, false, tid) end end end doAddCondition(cid, exhaust) local v = getItemParent(item.uid) if(not potion.empty or config.removeOnUse) then return true end if fromPosition.x == CONTAINER_POSITION then for _, slot in ipairs({CONST_SLOT_LEFT, CONST_SLOT_RIGHT, CONST_SLOT_AMMO}) do local tmp = getPlayerSlotItem(cid, slot) if tmp.itemid == potion.empty and tmp.type < 100 then doChangeTypeItem(item.uid, item.type - 1) return getPlayerFreeCap(cid) >= getItemInfo(potion.empty).weight and doChangeTypeItem(tmp.uid, tmp.type + 1) or doPlayerAddItem(cid, potion.empty, 1) end end else doChangeTypeItem(item.uid, item.type - 1) doCreateItem(potion.empty, 1, fromPosition) return true end if v.uid == 0 then if item.type == 1 and isInArray({CONST_SLOT_LEFT, CONST_SLOT_RIGHT, CONST_SLOT_AMMO}, fromPosition.y) then doTransformItem(item.uid, potion.empty) else -- serversided autostack should take care of this doPlayerAddItem(cid, potion.empty, 1) doChangeTypeItem(item.uid, item.type - 1) end return true else doChangeTypeItem(item.uid, item.type - 1) local size = getContainerSize(v.uid) for i = 0, size-1 do local tmp = getContainerItem(v.uid, i) if tmp.itemid == potion.empty and tmp.type < 100 then return getPlayerFreeCap(cid) >= getItemInfo(potion.empty).weight and doChangeTypeItem(tmp.uid, tmp.type + 1) or doPlayerAddItem(cid, potion.empty, 1) end end if getContainerSize(v.uid) < getContainerCap(v.uid) then doAddContainerItem(v.uid, potion.empty) else doPlayerAddItem(cid, potion.empty, 1) end end return true end
Na pasta data\lib\000-constant.lua:
Procure
maleOutfits = {128, 129, 130, 131, 132, 133, 134, 143, 144, 145, 146, 151, 152, 153, 154, 251, 268, 273, 278, 289, 325, 328, 335} femaleOutfits = {136, 137, 138, 139, 140, 141, 142, 147, 148, 149, 150, 155, 156, 157, 158, 252, 269, 270, 279, 288, 324, 329, 336}
Subistitua por:
maleOutfits = {128, 129, 130, 131, 132, 133, 134, 143, 144, 145, 146, 151, 152, 153, 154, 251, 268, 273, 278, 289, 325, 328, 335, 367} femaleOutfits = {136, 137, 138, 139, 140, 141, 142, 147, 148, 149, 150, 155, 156, 157, 158, 252, 269, 270, 279, 288, 324, 329, 336, 366}
Em Data\xml\outfit.xml:
Delete tudo e Adicione
<?xml version="1.0"?> <outfits> <outfit id="1"> <list gender="0" lookType="136" name="Citizen"/> <list gender="1" lookType="128" name="Citizen"/> </outfit> <outfit id="2"> <list gender="0" lookType="137" name="Hunter"/> <list gender="1" lookType="129" name="Hunter"/> </outfit> <outfit id="3"> <list gender="0" lookType="138" name="Mage"/> <list gender="1" lookType="130" name="Mage"/> </outfit> <outfit id="4"> <list gender="0" lookType="139" name="Knight"/> <list gender="1" lookType="131" name="Knight"/> </outfit> <outfit id="5" premium="yes"> <list gender="0" lookType="140" name="Noblewoman"/> <list gender="1" lookType="132" name="Nobleman"/> </outfit> <outfit id="6" premium="yes"> <list gender="0" lookType="141" name="Summoner"/> <list gender="1" lookType="133" name="Summoner"/> </outfit> <outfit id="7" premium="yes"> <list gender="0" lookType="142" name="Warrior"/> <list gender="1" lookType="134" name="Warrior"/> </outfit> <outfit id="8" premium="yes"> <list gender="0" lookType="147" name="Barbarian"/> <list gender="1" lookType="143" name="Barbarian"/> </outfit> <outfit id="9" premium="yes"> <list gender="0" lookType="148" name="Druid"/> <list gender="1" lookType="144" name="Druid"/> </outfit> <outfit id="10" premium="yes"> <list gender="0" lookType="149" name="Wizard"/> <list gender="1" lookType="145" name="Wizard"/> </outfit> <outfit id="11" premium="yes"> <list gender="0" lookType="150" name="Oriental"/> <list gender="1" lookType="146" name="Oriental"/> </outfit> <outfit id="12" premium="yes"> <list gender="0" lookType="155" name="Pirate"/> <list gender="1" lookType="151" name="Pirate"/> </outfit> <outfit id="13" premium="yes"> <list gender="0" lookType="156" name="Assassin"/> <list gender="1" lookType="152" name="Assassin"/> </outfit> <outfit id="14" premium="yes"> <list gender="0" lookType="157" name="Beggar"/> <list gender="1" lookType="153" name="Beggar"/> </outfit> <outfit id="15" premium="yes"> <list gender="0" lookType="158" name="Shaman"/> <list gender="1" lookType="154" name="Shaman"/> </outfit> <outfit id="16" premium="yes"> <list gender="0" lookType="252" name="Norsewoman"/> <list gender="1" lookType="251" name="Norseman"/> </outfit> <outfit id="17" premium="yes"> <list gender="0" lookType="269" name="Nightmare"/> <list gender="1" lookType="268" name="Nightmare"/> </outfit> <outfit id="18" premium="yes"> <list gender="0" lookType="270" name="Jester"/> <list gender="1" lookType="273" name="Jester"/> </outfit> <outfit id="19" premium="yes"> <list gender="0" lookType="279" name="Brotherhood"/> <list gender="1" lookType="278" name="Brotherhood"/> </outfit> <outfit id="20" premium="yes"> <list gender="0" lookType="288" name="Demonhunter"/> <list gender="1" lookType="289" name="Demonhunter"/> </outfit> <outfit id="21" premium="yes"> <list gender="0" lookType="324" name="Yalaharian"/> <list gender="1" lookType="325" name="Yalaharian"/> </outfit> <outfit id="22" premium="yes"> <list gender="0" lookType="336" name="Warmaster"/> <list gender="1" lookType="335" name="Warmaster"/> </outfit> <outfit id="23" default="0"> <list gender="0" lookType="329" name="Wife"/> <list gender="1" lookType="328" name="Husband"/> </outfit> <outfit id="24" premium="yes"> <list gender="0" lookType="366" name="Wayfarer"/> <list gender="1" lookType="367" name="Wayfarer"/> </outfit> </outfits>
Em data\items\items.xml:
Delete onde estão configurada as runas a seguinte linha (Em Todas)
<attribute key="charges" value="x" />
X: Qualquer numero
Arquivos para procurar e repassar:
Bom gente eu não gravei como era o antigo desse então procure uma frase e repasse
Em container.cpp:
Procure e repasse:
Cylinder* Container::__queryDestination(int32_t& index, const Thing* thing, Item** destItem, uint32_t&) { if(index == 254 /*move up*/) { index = INDEX_WHEREEVER; *destItem = NULL; Container* parentContainer = dynamic_cast<Container*>(getParent()); if(parentContainer) return parentContainer; return this; } else if(index == 255 /*add wherever*/){ index = INDEX_WHEREEVER; *destItem = NULL; } else if(index >= (int32_t)capacity()){ /* if you have a container, maximize it to show all 20 slots then you open a bag that is inside the container you will have a bag with 8 slots and a "grey" area where the other 12 slots where from the container if you drop the item on that grey area the client calculates the slot position as if the bag has 20 slots */ index = INDEX_WHEREEVER; *destItem = NULL; } const Item* item = thing->getItem(); if(item == NULL){ return this; } if(item->isStackable()){ if(item->getParent() != this){ //try find a suitable item to stack with uint32_t n = 0; for(ItemList::iterator cit = itemlist.begin(); cit != itemlist.end(); ++cit){ if((*cit) != item && (*cit)->getID() == item->getID() && (*cit)->getItemCount() < 100){ *destItem = (*cit); index = n; return this; } ++n; } } } if(index != INDEX_WHEREEVER){ Thing* destThing = __getThing(index); if(destThing) *destItem = destThing->getItem(); Cylinder* subCylinder = dynamic_cast<Cylinder*>(*destItem); if(subCylinder){ index = INDEX_WHEREEVER; *destItem = NULL; return subCylinder; } } return this; }
Em item.cpp:
Procure e repasse:
void Item::setDefaultSubtype() { setItemCount(1); const ItemType& it = items[id]; if(it.charges) setCharges(it.charges); }
Em player.cpp:
Procure e repasse:
Cylinder* Player::__queryDestination(int32_t& index, const Thing* thing, Item** destItem, uint32_t& flags) { if(index == 0 /*drop to capacity window*/ || index == INDEX_WHEREEVER){ *destItem = NULL; const Item* item = thing->getItem(); if(item == NULL){ return this; } //find an appropiate slot std::list<Container*> containerList; for(int i = SLOT_FIRST; i < SLOT_LAST; ++i){ Item* inventoryItem = inventory[i]; if(inventoryItem == tradeItem){ continue; } if(inventoryItem == tradeItem){ continue; } if(inventoryItem){ //try find an already existing item to stack with if(inventoryItem != item && item->isStackable() && inventoryItem->getID() == item->getID() && inventoryItem->getItemCount() < 100){ *destItem = inventoryItem; index = i; return this; } //check sub-containers else if(Container* subContainer = inventoryItem->getContainer()){ Cylinder* tmpCylinder = NULL; int32_t tmpIndex = INDEX_WHEREEVER; Item* tmpDestItem = NULL; tmpCylinder = subContainer->__queryDestination(tmpIndex, item, &tmpDestItem, flags); if(tmpCylinder && tmpCylinder->__queryAdd(tmpIndex, item, item->getItemCount(), flags) == RET_NOERROR){ index = tmpIndex; *destItem = tmpDestItem; return tmpCylinder; } containerList.push_back(subContainer); } } //empty slot else if(__queryAdd(i, item, item->getItemCount(), flags) == RET_NOERROR){ index = i; *destItem = NULL; return this; } } //check deeper in the containers for(std::list<Container*>::iterator it = containerList.begin(); it != containerList.end(); ++it){ for(ContainerIterator iit = (*it)->begin(); iit != (*it)->end(); ++iit){ if(Container* subContainer = (*iit)->getContainer()){ if(subContainer == tradeItem){ continue; } Cylinder* tmpCylinder = NULL; int32_t tmpIndex = INDEX_WHEREEVER; Item* tmpDestItem = NULL; tmpCylinder = subContainer->__queryDestination(tmpIndex, item, &tmpDestItem, flags); if(tmpCylinder && tmpCylinder->__queryAdd(tmpIndex, item, item->getItemCount(), flags) == RET_NOERROR){ index = tmpIndex; *destItem = tmpDestItem; return tmpCylinder; } } } } return this; } Thing* destThing = __getThing(index); if(destThing) *destItem = destThing->getItem(); Cylinder* subCylinder = dynamic_cast<Cylinder*>(destThing); if(subCylinder){ index = INDEX_WHEREEVER; *destItem = NULL; return subCylinder; } else return this; }
Downloads:
Items.otb (8.6): Clique Aqui
Items.xml (8.6): Clique aqui
Creditos á:
darkhaos - Sources
Tauku - Sources
BlueSilver - Sources
Doidin - Data
Cykotitan (O do xtibia) - Sources/Data
Eu - Data/Sources
Outros - Data/Sources
Tutorial atualizado: 24/09/2010
Agora Funciona 99,9% perfeito (deve estar faltando um detalhe ou outro)
Recomendo fazer tudo o que está mandando para não ocorrer erros
-
CarlosPain reacted to Mesenga in [totalmente Reformulado] Colocando Seu Server Sql Online + Site
Hoje, dia das crianças resolvi dar um presente as crianças daqui do fórum e reformulei totalmente o tópico
agora está mais fácil e mais acessivel, as imagens boas e todas tiradas por mim.
Está dividido em:
1º Passo: Preparando o XAMPP 2º Passo: Criando a Database 3º Passo: Criando o banco de dados 4º Passo: Criando uma conta GOD
EXTRA
5º Passo: Criando o site para os players entrarem F.A.Q. - Perguntas e respostas
-Baixando o Xampp-
Xampp download: http://www.baixaki.com.br/download/xampp.htm
Tamanho: 44,20MB
Depois de baixar instale o XAMPP
1º Passo: Preparando o XAMPP (Créditos ao Lord Joel por lembrar do security)
Abra o XAMPP, depois disso verifique se está tudo corretamente ligado clicando no XAMPP_Panel
Mini F.A.Q.
Mas meu apache não esta ligando!
Vá até
C:\xampp\apache\conf\httpd.conf:
Procure por “Listen 80″, mude para “Listen 8090″Procure por “ServerName localhost:80″, mude para “ServerName localhost:8090″
C:\xampp\apache\conf\extra\httpd-ssl.conf
Procure por “Listen 443″, mude para “Listen 4499″Procure por “<VirtualHost _default_:443>”, mude para “<VirtualHost _default_:4499>”Procure por “ServerName localhost:443″, mude para “ServerName localhost:4499″
Explicação: O IIS (Internet Information Service) do windows é padrão para rodar em port 80, então você não conseguira abrir o apache pois vai dar conflito com esta porta que já esta sendo usada, então trocamos!
Mesenga, ainda não funcionou =/
Então recomendo você baixar a versão 1.6.5 por conter a antiga base que pega em todos os windows
Download aqui: AQUI
Continuando...
Agora acesse a página: http://localhost/security/xamppsecurity.php
caso tiver trocado o port acesse: http://localhost:8090/security/xamppsecurity.php
Vá na pasta do seu OT, abra o config.lua
Você irá encontrar linhas parecidadas com essas:
-- DatabasesqlType = "sqlite" >> mude para mysql, pois agora usaremos um servidor mysqlsqlHost = "localhost" >> não mexasqlPort = 3306 >> não mexasqlUser = "root" >> esse é o usuário usado para acessar o servidor XAMPP, NÃO MUDEsqlPass = "" >> password (senha) que você usou no passo 1sqlDatabase = "" >> vamos definir um nome para nossa database, ex: theforgottenserversqlFile = "Styller.s3db" >> isso não irá servir mais pois usaremos um servidor MySqlsqlKeepAlive = 0 >> não mexamysqlReadTimeout = 10 >> não mexamysqlWriteTimeout = 10 >> não mexapasswordType = "plain" >> não mexa
No meu caso ficou assim:
-- DatabasesqlType = "mysql"sqlHost = "localhost"sqlPort = 3306sqlUser = "root"sqlPass = "123"sqlDatabase = "styller"sqlFile = "Styller.s3db"sqlKeepAlive = 0mysqlReadTimeout = 10mysqlWriteTimeout = 10passwordType = "plain"
2º Passo: Criando a Database
abra internet e digite http://localhost
caso tiver mudado o port: http://localhost:8090
escolha Português BR depois disso procure PhpMyAdmin e clique tenha certeza que estará nessa página: http://localhost/phpmyadmin/ caso estiver com port trocado: http://localhost:8090/phpmyadmin/
3º Passo: Criando o banco de dados
Na tela a seguir, você vera onde tem a parte Criar novo banco de dados, digite o mesmo nome que você colocou no config.lua em sqlDatabase=
Agora clique criar
Na tela seguinte clique em "importar" e escolha o arquivo "schema.mysql", em alguns ots o nome é "algumacoisa.sql", ex: forgotten.sql (no caso do The Forgotten Server)
vai isso,dependendo do server que estiver usando, o numero de importações varia:
4º Passo: Criando uma conta GOD
Entre no server e crie uma conta com o Account manager pra ficar mais facil, e também crie 1 player.
Após criado a account e o player, volte a janela do XAMPP na database e clica em accounts, depois vá em visualizar depois clique no pincel
Irá aparecer uma tela com os dados da conta, altere apenas o necessário...
mude o type de 1 para 5 e group id de 1 (se quiser conta normal com GOD) e 5 (se quiser conta GOD com GOD)
depois clique em "executar"
o char ainda não é God apenas a conta, então vá em players na coluna da esquerda...
clique no lápis de novamente....
Troque Group de 1 para 6, agora sim, seu char eh god. se quiser GM troque para 4 ou 5 (Sênior GM)
Group id 1 = PlayerGroup id 2 = TutorGroup id 3 = Sênior TutorGroup id 4 = GMGroup id 5 = Sênior GMGroup id 6 = GOD
*IDs acima baseados no Styller OT 8.52
Seu server está pronto para rodar!
EXTRA
5º Passo: Criando o site para os players entrarem
-Download do site-
Baixe um dos Websites "SQL" na seção de downloads do Xtibia >> http://www.xtibia.com/forum/forum/581-downloads-de-websites/
Recomendados:
Gesior acc maker:
Gesior para 8.54
Nicaw Acc Maker website
http://www.xtibia.com/forum/topic/81939-nicaw-aacmaker-para-otserv-xmlsql/
Todos os sites já vem com configurador, então entre em:
http://localhost
caso tiver trocado o port já sabe: http://localhost:8090
e Configure-o!
-Vamos configurar o Gesior Acc Maker!-
Baixe o Gesior Acc Maker
Gesior para 8.54
Ligue o XAMPP e o OT
Vá em C:\Xampp\htdocs
e delete tudo o que tem dentro da pasta
Agora extraia seu site pra lá, feito isso entre em http://localhost ou http://localhost:8090
você verá uma tela assim:
clique em Set server path
Agora no campo em que aparece digite o diretório no qual se encontra o ot, ex: C:\OTx
Agora é só ir clicando um por um e configurar a seu gosto
1º Quadrado preto:
1. Set server path --> escolhe o diretório do OT2. Check DataBase connection --> você só pode proseguir se não tiver nehum erro nessa parte3. Add tables and columns to DB --> isso carrega uma parte do site4. Add samples to DB --> isso carrega uma parte do site (vocações)5. Set Admin Account --> escolhe o account do admin do site
Quadrado Vermelho:
6. Load Monsters from OTS --> vai dar load automatico nos monstros do OT, verifique se não há nehum erro7. Load Spells from OTS --> ele vai carregar todas as spells do OT, verifique se não há nehum erro antes de proceguir
Pronto, o site está configurado e pronto para criar contas.
Para outras opções clique em ADMIN PAINEL
F.A.Q. - Perguntas e respostas
@Todos
Duvidas:
-Como faço minha account de GM/GOD?
Siga o passo 4
eu nao encontro schema.mysql od está isso??
Em alguns servidores o nome é theforgottenserver.sql
Qual vai ser meu site pros outros poder entra fazer acc?
seu site vai ser http://seuip:8090
ou se quiser por http://seuip:xxxx sendo "xxxx" um número de port variando entre 80 e 9000, faça o seguinte:
vá em "C:\xampp\apache\conf" e abra o arquivo httpd.conf
procure por:
#Listen 12.34.56.78:80
Listen 80
Nas duas linhas ponha Um número variando de 80 à 9000 no lugar do 80
exemplo:
#Listen 12.34.56.78:8090
Listen 8090
Agora procure a linha:
ServerName localhost:80
e troque pelo mesmo número que você colocou
exemplo:
ServerName localhost:8090
-No seu está dando o seguinte problema:
[28/06/2008 03:15:49] Failed to connect to database. MYSQL ERROR: Access denied for user 'root'@'localhost' (using password: YES)[28/06/2008 03:15:49] > ERROR: Couldn't estabilish connection to SQL database!
Antes de colocar oSERVER ONLINE, certifique-se de que o XAMPP está aberto
Até a proxima!
-
CarlosPain reacted to XJhoow in Programação.lua ( Super Teórico, Muita Leitura )
Olá XTibianos.
Eu lí boa parte desse conteúdo, é realmente, muito bom, cansativo.. mas você pode salvar no favorito e ler um tópico por dia.. assim melhora..
Terá DOUBLE, TRIPLE.. POST, por que é muito grande, caso esteja a infringir as regras, me avisem!
Fonte: Site lua
O que é Lua?
Lua é uma linguagem de programação poderosa, rápida e leve, projetada para estender aplicações.
Lua combina sintaxe simples para programação procedural com poderosas construções para descrição de dados baseadas em tabelas associativas e semântica extensível. Lua é tipada dinamicamente, é interpretada a partir de bytecodes para uma máquina virtual baseada em registradores, e tem gerenciamento automático de memória com coleta de lixo incremental. Essas características fazem de Lua uma linguagem ideal para configuração, automação (scripting) e prototipagem rápida.
Por que escolher Lua?
Lua é uma linguagem estabelecida e robusta
Lua é usada em muitas aplicações industriais (e.g., Adobe's Photoshop Lightroom), com ênfase em sistemas embutidos (e.g., o middleware Ginga para TV digital) e jogos (e.g., World of Warcraft). Lua é atualmente a linguagem de script mais usada em jogos. Lua tem um sólido manual de referência e existem vários livros sobre a linguagem. Várias versões de Lua foram lançadas e usadas em aplicações reais desde a sua criação em 1993.
Lua é rápida
Lua tem uma merecida reputação de ótimo desempenho. Outras linguagens de script aspiram ser "tão rápidas quanto Lua". Vários benchmarks mostram Lua como a linguagem mais rápida dentre as linguagens de script interpretadas. Lua é rápida não só em programas específicos para benchmarks, mas no dia-a-dia também. Porções substanciais de aplicações grandes são escritas em Lua.
Lua é portátil
Lua é distribuída via um pequeno pacote e compila sem modificações em todas as plataformas que têm um compilador ANSI/ISO C. Lua roda em todos os tipos de Unix e Windows, e também em dispositivos móveis (como computadores de mão e celulares que usam BREW, Symbian, Pocket PC, etc.) e em microprocessadores embutidos (como ARM e Rabbit) para aplicações como Lego MindStorms.
Lua é embutível
Lua é uma engine rápida e pequena que você pode facilmente embutir na sua aplicação. Lua tem uma API simples e bem documentada que permite uma integração forte com código escrito em outras linguagens. É simples estender Lua com bibliotecas escritas em outras linguagens. Também é simples estender programas escritos em outras linguagens com Lua. Lua é usada para estender programas escritos não só em C e C++, mas também em Java, C#, Smalltalk, Fortran, Ada, Erlang, e mesmo outras linguagens de script, como Perl and Ruby.
Lua é poderosa (e simples)
Um conceito fundamental no projeto de Lua é fornecer meta-mecanismos para a implementação de construções, em vez de fornecer uma multidão de construções diretamente na linguagem. Por exemplo, embora Lua não seja uma linguagem puramente orientada a objetos, ela fornece meta-mecanismos para a implementação de classes e herança. Os meta-mecanismos de Lua trazem uma economia de conceitos e mantêm a linguagem pequena, ao mesmo tempo que permitem que a semântica seja estendida de maneiras não convencionais.
Lua é pequena
Incluir Lua numa aplicação não aumenta quase nada o seu tamanho. O pacote de Lua 5.1.4, contendo o código fonte, documentação e exemplos, ocupa 212K comprimido e 860K descompactado. O fonte contém cerca de 17000 linhas de C. No Linux, o interpretador Lua contendo todas as bibliotecas padrões de Lua ocupa 153K e a biblioteca Lua ocupa 203K.
Lua é livre
Lua é software livre de código aberto, distribuída sob uma licença muito liberal (a conhecida licença MIT). Lua pode ser usada para quaisquer propósitos, incluindo propósitos comerciais, sem qualquer custo ou burocracia. Basta fazer um download e usá-la.
Lua tem importância global
O projeto e a evolução de Lua foram apresentados em junho de 2007 na HOPL III, a 3a Conferência da ACM sobre a História das Linguagens de Programação. Essa conferência ocorre a cada 15 anos (a primeira foi em 1978 e a segunda em 1993) e somente poucas linguagens são apresentadas a cada vez. A escolha de Lua para a HOPL III é um importante reconhecimento do seu impacto mundial. Lua é a única linguagem de programação de impacto desenvolvida fora do primeiro mundo, estando atualmente entre as 20 linguagens mais populares na Internet (segundo o índice TIOBE).
Quais as origens de Lua?
Lua é inteiramente projetada, implementada e desenvolvida no Brasil, por uma equipe na PUC-Rio (Pontifícia Universidade Católica do Rio de Janeiro). Lua nasceu e cresceu no Tecgraf, o Grupo de Tecnologia em Computação Gráfica da PUC-Rio. Atualmente, Lua é desenvolvida no laboratório Lablua. Tanto o Tecgraf quanto Lablua são laboratórios do Departamento de Informática da PUC-Rio.
Eu peço que não postem aqui, que aqui eu quero ir postando curiosidades, e coisas que acho sobre a programação lua. Acho legal, porque acho também que tem bastante gente que quer programar .lua não é mesmo? Criarei um post, em lugar possível, algum lugar do fórum e posteriormente, criarei meu próprio fórum para a discussão do mesmo.
Introdução
Lua é uma linguagem de programação de extensão projetada para dar suporte à programação procedimental em geral e que oferece facilidades para a descrição de dados. A linguagem também oferece um bom suporte para programação orientada a objetos, programação funcional e programação orientada a dados. Lua foi planejada para ser utilizada por qualquer aplicação que necessite de uma linguagem de script leve e poderosa. Lua é implementada como uma biblioteca, escrita em C limpo (isto é, no subconjunto comum de ANSI C e C++).
Por ser uma linguagem de extensão, Lua não possui a noção de um programa principal: ela somente funciona embarcada em um programa cliente anfitrião, chamado de programa hospedeiro ou simplesmente de hospedeiro. Esse programa hospedeiro pode invocar funções para executar um pedaço de código Lua, pode escrever e ler variáveis Lua e pode registrar funções C para serem chamadas pelo código Lua. Através do uso de funções C, Lua pode ser estendida para lidar de maneira apropriada com uma ampla variedade de domínios, permitindo assim a criação de linguagems de programação personalizadas que compartilham um arcabouço sintático. A distribuição Lua inclui um exemplo de um programa hospedeiro chamado lua, o qual usa a biblioteca de Lua para oferecer um interpretador de linha de comando Lua completo.
Lua é um software livre e, como de praxe, é fornecido sem garantias, conforme dito na sua licença. A implementação descrita neste manual está disponível no sítio web oficial de Lua, www.lua.org.
Como qualquer outro manual de referência, este documento é árido em algumas partes. Para uma discussão das decisões por trás do projeto de Lua, veja os artigos técnicos disponíveis no sítio web oficial de Lua. Para uma introdução detalhada à programação em Lua, veja o livro de Roberto Ierusalimschy, Programming in Lua (Segunda Edição).
A Linguagem
Esta seção descreve os aspectos léxicos, sintáticos e semânticos de Lua. Em outras palavras, esta seção descreve quais itens léxicos são válidos, como eles são combinados, e qual o significado da sua combinação.
As construções da linguagem serão explicadas usando a notação BNF estendida usual, na qual {a} significa 0 ou mais a's e [a] significa um a opcional. Não-terminais são mostrados como non-terminal, palavras-chave são mostradas como kword e outros símbolos terminais são mostrados como `=´.
Convenções Léxicas
Em Lua, Nomes (também chamados de identificadores) podem ser qualquer cadeia de letras, dígitos, e sublinhados que não começam com um dígito. Esta definição está de acordo com a definição de nomes na maioria das linguagens. (A definição de letras depende de qual é o idioma (locale): qualquer caractere considerado alfabético pelo idioma corrente pode ser usado como um identificador.) Identificadores são usados para nomear variáveis e campos de tabelas.
As seguintes palavras-chave são reservadas e não podem ser utilizadas como nomes:
and break do else elseif end false for function if in local nil not or repeat return then true until while
Lua é uma linguagem que diferencia minúsculas de maiúsculas: and é uma palavra reservada, mas And e AND são dois nomes válidos diferentes. Como convenção, nomes que começam com um sublinhado seguido por letras maiúsculas (tais como _VERSION) são reservados para variáveis globais internas usadas por Lua.
As seguintes cadeias denotam outros itens léxicos:
+ - * / % ^ # == ~= <= >= < > = ( ) { } [ ] ; : , . .. ...
Cadeias de caracteres literais podem ser delimitadas através do uso de aspas simples ou aspas duplas, e podem conter as seguintes seqüências de escape no estilo de C: '\a' (campainha), '\b' (backspace), '\f' (alimentação de formulário), '\n' (quebra de linha), '\r' (retorno de carro), '\t' (tabulação horizontal), '\v' (tabulação vertical), '\\' (barra invertida), '\"' (citação [aspa dupla]) e '\'' (apóstrofo [aspa simples]). Além disso, uma barra invertida seguida por uma quebra de linha real resulta em uma quebra de linha na cadeia de caracteres. Um caractere em uma cadeia de caracteres também pode ser especificado pelo seu valor numérico usando a seqüência de escape \ddd, onde ddd é uma seqüência de até três dígitos decimais. (Note que se um caractere numérico representado como um seqüência de escape for seguido por um dígito, a seqüência de escape deve possuir exatamente três dígitos.) Cadeias de caracteres em Lua podem conter qualquer valor de 8 bits, incluindo zeros dentro delas, os quais podem ser especificados como '\0'.
Cadeias literais longas também podem ser definidas usando um formato longo delimitado por colchetes longos. Definimos uma abertura de colchete longo de nível n como um abre colchete seguido por n sinais de igual seguido por outro abre colchete. Dessa forma, uma abertura de colchete longo de nível 0 é escrita como [[, uma abertura de colchete longo de nível 1 é escrita como [=[ e assim por diante. Um fechamento de colchete longo é definido de maneira similar; por exemplo, um fechamento de colchete longo de nível 4 é escrito como ]====]. Uma cadeia de caracteres longa começa com uma abertura de colchete longo de qualquer nível e termina no primeiro fechamento de colchete longo do mesmo nível. Literais expressos desta forma podem se estender por várias linhas, não interpretam nenhuma seqüência de escape e ignoram colchetes longos de qualquer outro nível. Estes literais podem conter qualquer coisa, exceto um fechamento de colchete longo de nível igual ao da abertura.
Por conveniência, quando uma abertura de colchete longo é imediatamente seguida por uma quebra de linha, a quebra de linha não é incluída na cadeia de caracteres. Como exemplo, em um sistema usando ASCII (no qual 'a' é codificado como 97, quebra de linha é codificado como 10 e '1' é codificado como 49), as cinco cadeias literais abaixo denotam a mesma cadeia:
a = 'alo\n123"' a = "alo\n123\"" a = '\97lo\10\04923"' a = [[alo 123"]] a = [==[ alo 123"]==]
Uma constante numérica pode ser escrita com uma parte decimal opcional e com um expoente decimal opcional. Lua também aceita constantes hexadecimais inteiras, através do uso do prefixo 0x. Exemplos de constantes numéricas válidas são:
3 3.0 3.1416 314.16e-2 0.31416E1 0xff 0x56
Um comentário começa com um hífen duplo (--) em qualquer lugar, desde que fora de uma cadeia de caracteres. Se o texto imediatamente depois de -- não é uma abertura de colchete longo, o comentário é um comentário curto, o qual se estende até o fim da linha. Caso contrário, ele é um comentário longo, que se estende até o fechamento de colchete longo correspondente. Comentários longos são freqüentemente usados para desabilitar código temporariamente.
Valores e Tipos
Lua é uma linguagem dinamicamente tipada. Isto significa que variáveis não possuem tipos; somente valores possuem tipos. Não existe definição de tipos na linguagem. Todos os valores carregam o seu próprio tipo.
Todos os valores em Lua são valores de primeira classe. Isto significa que todos os valores podem ser armazenados em variáveis, passados como argumentos para outras funções e retornados como resultados.
Existem oito tipos básicos em Lua: nil, boolean, number, string, function, userdata, thread e table. Nil é o tipo do valor nil, cuja propriedade principal é ser diferente de qualquer outro valor; ele geralmente representa a ausência de um valor útil. Boolean é o tipo dos valores false e true. Tanto nil como false tornam uma condição falsa; qualquer outro valor torna a condição verdadeira. Number representa números reais (ponto flutuante de precisão dupla). (É fácil construir interpretadores Lua que usem outra representação interna para números, tais como precisão simples de ponto flutuante ou inteiros longos; veja o arquivo luaconf.h.) O tipo string representa cadeias de caracteres. Em Lua, cadeias de caracteres podem conter qualquer caractere de 8 bits, incluindo zeros ('\0') dentro dela.
Lua pode chamar (e manipular) funções escritas em Lua e funções escritas em C (ver §2.5.8).
O tipo userdata permite que dados C arbitrários possam ser armazenados em variáveis Lua. Este tipo corresponde a um bloco de memória e não tem operações pré-definidas em Lua, exceto atribuição e teste de identidade. Contudo, através do uso de metatables, o programador pode definir operações para valores userdata (ver §2.8). Valores userdata não podem ser criados ou modificados em Lua, somente através da API C. Isto garante a integridade dos dados que pertencem ao programa hospedeiro.
O tipo thread representa fluxos de execução independentes e é usado para implementar co-rotinas (ver §2.11). Não confunda o tipo thread de Lua com processos leves do sistema operacional. Lua dá suporte a co-rotinas em todos os sistemas, até mesmo naqueles que não dão suporte a processos leves.
O tipo table implementa arrays associativos, isto é, arrays que podem ser indexados não apenas por números, mas por qualquer valor (exceto nil). Tabelas podem ser heterogêneas; isto é, elas podem conter valores de todos os tipos (exceto nil). Tabelas são o único mecanismo de estruturação de dados em Lua; elas podem ser usadas para representar arrays comuns, tabelas de símbolos, conjuntos, registros, grafos, árvores, etc. Para representar registros, Lua usa o nome do campo como um índice. A linguagem dá suporte a esta representação oferecendo a.name como um açúcar sintático para a["name"]. Existem várias maneiras convenientes de se criar tabelas em Lua .
Da mesma forma que os índices, o valor de um campo da tabela pode possuir qualquer tipo (exceto nil). Em particular, dado que funções são valores de primeira classe, campos de tabela podem conter funções. Portanto, tabelas podem também possuir metódos .
Valores do tipo table, function, thread e userdata (completo) são objetos: variáveis não contêm realmente estes valores, somente referências para eles. Atribuição, passagem de parâmetro, e retorno de funções sempre lidam com referências para tais valores; estas operações não implicam em qualquer espécie de cópia.
A função type retorna uma cadeia de caracteres descrevendo o tipo de um dado valor.
Coerção
Lua provê conversão automática entre valores do tipo string e do tipo number em tempo de execução. Qualquer operação aritmética aplicada a uma cadeia de caracteres tenta converter esta cadeia para um número, seguindo as regras de conversão usuais. De forma análoga, sempre que um número é usado onde uma cadeia de caracteres é esperada, o número é convertido para uma cadeia, em um formato razoável. Para um controle completo sobre como números são convertidos para cadeias, use a função format da biblioteca string.
Variáveis
Variáveis são lugares usados para armazenar valores.
Existem três tipos de variáveis em Lua: variáveis globais, variáveis locais e campos de tabelas.
Um nome simples pode denotar uma variável global ou uma variávei local (ou um parâmetro formal de uma função, que é um caso particular de variável local):
var = Nome
Assume-se que toda variável é uma variável global a menos que ela seja explicitamente declarada como uma variável local . Variáveis locais possuem escopo léxico: variáveis locais podem ser livremente acessadas por funções definidas dentro do seu escopo .
Antes da variável receber a sua primeira atribuição, o seu valor é nil.
Colchetes são usados para indexar uma tabela:
var = expprefixo `[´ exp `]´
A semântica de acessos a variáveis globais e a campos de tabelas pode ser mudada através do uso de metatabelas. Um acesso a uma variável indexada
t[i] é equivalente a uma chamada gettable_event(t,i).
A sintaxe var.Nome é apenas um açúcar sintático para var["Nome"]:
var = expprefixo `.´ Nome
Todas as variáveis globais são mantidas como campos em tabelas Lua comuns, chamadas de tabelas de ambiente ou simplesmente de ambientes (ver §2.9). Cada função tem sua própria referência para um ambiente, de forma que todas as variáveis globais dentro de uma função irão se referir para esta tabela de ambiente. Quando uma função é criada, ela herda o ambiente da função que a criou. Para obter a tabela de ambiente de uma função Lua, você deve chamar getfenv. Para trocar a tabela de ambiente, você deve chamar setfenv. (A única maneira de tratar o ambiente de funções C é através da a biblioteca de depuração;
Um acesso a uma variável global
x é equivalente a _env.x , que por sua vez é equivalente a
gettable_event(_env, "x") onde
_env é o ambiente da função corrente.
Comandos
Lua oferece um conjunto quase convencional de comandos, similar ao conjunto de comandos disponíveis em Pascal ou C. Este conjunto inclui atribuições, estruturas de controle, chamadas de funções e declarações de variáveis.
Trechos
A unidade de execução de Lua é denominada de trecho. Um trecho é simplesmente uma seqüência de comandos, os quais são executados sequencialmente. Cada comando pode opcionalmente ser seguido por um ponto-e-vírgula:
trecho = {comando [`;´]}
Não existem comandos vazios e portanto a construção ';;' não é válida.
Lua trata um trecho como o corpo de uma função anônima com um número variável de argumentos.
Um trecho pode ser armazenado em um arquivo ou em uma cadeia de caracteres dentro do programa hospedeiro. Para executar um trecho, Lua primeiro pré-compila o trecho em instruções para uma máquina virtual e depois executa o código compilado com um interpretador para a máquina virtual.
Trechos também podem ser pré-compilados em uma forma binária; veja o programa luac para mais detalhes. Programas na forma de código fonte e na forma de um arquivo fonte já compilado são intercambiáveis; Lua automaticamente determina qual é o tipo do arquivo e age em conformidade com ele.
Blocos
Um bloco é uma lista de comandos; sintaticamente, um bloco é a mesma coisa que um trecho:
bloco = trecho
Um bloco pode ser explicitamente delimitado para produzir um único comando:
comando = do bloco end
Blocos explícitos são úteis para controlar o escopo de declarações de variáveis. Blocos explícitos são também usados às vezes para adicionar um comando return ou break no meio de outro bloco .
Atribuição
Lua permite atribuições múltiplas. Em virtude disto, a sintaxe para atribuição define uma lista de variáveis no lado esquerdo e uma lista de expressões no lado direito. Os elementos em ambos os lados são separados por vírgulas:
comando = listavar `=´ listaexp listavar = var {`,´ var} listaexp = exp {`,´ exp}
Antes da atribuição ser realizada, a lista de valores é ajustada para o comprimento da lista de variáveis. Se há mais valores do que o necessário, os valores em excesso são descartados. Se há menos valores do que o necessário, a lista é estendida com tantos nil's quantos sejam necessários. Se a lista de expressões termina com uma chamada de função, então todos os valores retornados por esta chamada entram na lista de valores, antes do ajuste ser realizado.
Um comando de atribuição primeiro avalia todas as suas expressões e somente depois é que a atribuição é realizada. Desta forma, o código
i = 3 i, a[i] = i+1, 20
atribui 20 a a[3], sem afetar a[4] porque o i em a é avaliado (para 3) antes de receber o valor 4. De modo similar, a linha
x, y = y, x
troca os valores de x e y e
x, y, z = y, z, x
permuta de maneira cíclica os valores de x, y e z.
A semântica de atribuições para variáveis globais e campos de tabelas pode ser mudada através do uso de metatabelas. Uma atribuição para uma variável indexada
t[i] = val é equivalente a settable_event(t,i,val) .
Uma atribuição a uma variável global x = val é equivalente à atribuição _env.x = val, que por sua vez é equivalente a
settable_event(_env, "x", val)
onde _env é o ambiente da função sendo executada. (A variável _env não é definida em Lua. Ela foi usada aqui somente para fins didáticos.)
Estruturas de Controle
As estruturas de controle if, while e repeat possuem o significado usual e a sintaxe familiar:
comando = while exp do bloco end comando = repeat bloco until exp comando = if exp then bloco {elseif exp then bloco} [else bloco] end
Lua também possui um comando for, o qual possui duas variações .
A expressão da condição de uma estrutura de controle pode retornar qualquer valor. Tanto false como nil são considerados um valor falso. Todos os valores diferentes de nil e false são considerados como verdadeiros (em particular, o número 0 e a cadeia de caracteres vazia também são considerados valores verdadeiros).
No laço repeat–until, o bloco mais interno não termina na palavra-chave until, mas somente depois da condição. Desta forma, a condição pode referenciar variáveis locais declaradas dentro do bloco do laço.
O comando return é usado para retornar valores de uma função ou de um trecho (que nada mais é do que uma função). Funções e trechos podem retornar mais de um valor, de modo que a sintaxe para o comando return é
comando = return [listaexp]
O comando break é usado para terminar a execução de um laço while, repeat ou for, pulando para o próximo comando depois do laço:
comando = break
Um break termina a execução do laço mais interno.
Os comandos return e break somente podem ser escritos como o último comando de um bloco. Se é realmente necessário ter um return ou break no meio de um bloco, então um bloco interno explícito pode ser usado, como nas expressões idiomáticas do return end e do break end, pois agora tanto o return como o break são os últimos comandos em seus respectivos blocos (internos).
Comando for
O comando for possui duas variações: uma numérica e outra genérica.
O laço for numérico repete um bloco de código enquanto uma variável de controle varia de acordo com uma progressão aritmética. Ele possui a seguinte sintaxe:
comando = for nome `=´ exp `,´ exp [`,´ exp] do bloco end
O bloco é repetido para nome começando com o valor da primeira exp, até que ele passe o valor da segunda exp através de seguidos passos, sendo que a cada passo o valor da terceira exp é somado a nome. De forma mais precisa, um comando for como
for v = e1, e2, e3 do bloco end
é equivalente ao código:
do local var, limite, passo = tonumber(e1), tonumber(e2), tonumber(e3) if not (var and limite and passo) then error() end while (passo > 0 and var <= limite) or (passo <= 0 and var >= limite) do local v = var bloco var = var + passo end end
Note o seguinte:
* Todas as três expressões de controle são avaliadas um única vez, antes do laço começar. Elas devem obrigatoriamente produzir números.
* var, limite e passo são variáveis invisíveis. Os nomes foram utilizados aqui somente para fins didáticos.
* Se a terceira expressão (o passo) está ausente, então um passo de tamanho 1 é usado.
* É possível usar break para sair de um laço for.
* A variável de laço v é local ao laço; não é possível usar o valor desta variável após o fim do for ou depois do for ter sido interrompido pelo uso de um break. Se você precisa do valor desta variável, atribua-o a outra variável antes de interromper ou sair do laço.
O comando for genérico funciona utilizando funções, chamadas de iteradoras. A cada iteração, a função iteradora é chamada para produzir um novo valor, parando quando este novo valor é nil. O laço for genérico possui a seguinte sintaxe:
comando = for listadenomes in listaexp do bloco end listadenomes = Nome {`,´ Nome}
Um comando for como
for var_1, ···, var_n in explist do block end
é equivalente ao código:
do local f, s, var = explist while true do local var_1, ···, var_n = f(s, var) var = var_1 if var == nil then break end block end end
Note o seguinte:
* explist é avaliada somente uma vez. Os seus resultados são uma função iteradora, um estado e um valor inicial para a primeira variável iteradora.
* f, s e var são variáveis invisíveis. Os nomes foram utilizados aqui somente para fins didáticos.
* É possível usar break para sair de um laço for.
* As variáveis de laço var_i são locais ao laço; não é possível usar os valores delas após o término do for. Se você precisa destes valores, você deve atribuí-los a outras variáveis antes de interromper o laço ou sair do mesmo.
Chamadas de Função como Comandos
Para permitir possíveis efeitos colaterais, funções podem ser executadas como comandos:
comando = chamadadefuncao
Neste caso, todos os valores retornados pela função são descartados..
Declarações Locais
Variáveis locais podem ser declaradas em qualquer lugar dentro de um bloco. A declaração pode incluir uma atribuição inicial:
comando = local listadenomes [`=´ listaexp]
Caso ocorra uma atribuição inicial, a sua semântica é a mesma de uma atribuição múltipla (ver §2.4.3). Caso contrário, todas as variáveis são inicializadas com nil.
Um trecho também é um bloco e portanto variáveis locais podem ser declaradas em um trecho fora de qualquer bloco explícito. O escopo de uma variável declarada desta forma se estende até o fim do trecho.
Expressões
As expressões básicas em Lua são as seguintes:
exp = expprefixo exp = nil | false | true exp = Numero exp = Cadeia exp = funcao exp = construtortabela exp = `...´ exp = exp opbin exp exp = opunaria exp expprefixo = var | chamadadefuncao | `(´ exp `)´
Operadores binários compreendem operadores aritméticos , operadores relacionais , operadores lógicos e o operador de concatenação . Operadores unários compreendem o menos unário , o not unário e o operador de comprimento unário .
Tanto chamadas de funções como expressões vararg podem resultar em múltiplos valores. Se uma expressão é usada como um comando (o que somente é possível para chamadas de funções , então a sua lista de retorno é ajustada para zero elementos, descartando portanto todos os valores retornados. Se uma expressão é usada como o último (ou o único) elemento de uma lista de expressões, então nenhum ajuste é feito (a menos que a chamada seja delimitada por parênteses). Em todos os demais contextos, Lua ajusta a lista de resultados para um elemento, descartando todos os valores exceto o primeiro.
Aqui estão alguns exemplos:
f() -- ajusta para 0 resultados g(f(), x) -- f() é ajustado para 1 resultado g(x, f()) -- g recebe x mais todos os resultados de f() a,b,c = f(), x -- f() é ajustado para 1 resultado (c recebe nil) a,b = ... -- a recebe o primeiro parâmetro da lista vararg, -- b recebe o segundo (tanto a como b podem receber nil caso não -- exista um parâmetro correspondente na lista) a,b,c = x, f() -- f() é ajustado para 2 resultados a,b,c = f() -- f() é ajustado para 3 resultados return f() -- retorna todos os resultados de f() return ... -- retorna todos os resultados recebidos da lista vararg return x,y,f() -- retorna x, y e todos os resultados de f() {f()} -- cria uma lista com todos os resultados de f() {...} -- cria uma lista com todos os parâmetros da lista vararg {f(), nil} -- f() é ajustado para 1 resultado
Qualquer expressão delimitada por parênteses sempre resulta em um único valor. Dessa forma, (f(x,y,z)) é sempre um único valor, mesmo que f retorne múltiplos valores. (O valor de (f(x,y,z)) é o primeiro valor retornado por f, ou nil se f não retorna nenhum valor.)
Operadores Aritméticos
Lua provê os operadores aritméticos usuais: os operadores binários + (adição), - (subtração), * (multiplicação), / (divisão), % (módulo) e ^ (exponenciação); e o operador unário - (negação). Se os operandos são números ou cadeias de caracteres que podem ser convertidas para números (ver §2.2.1), então todas as operações possuem o seu significado usual. A exponenciação funciona para qualquer expoente. Por exemplo, x^(-0.5) calcula o inverso da raiz quadrada de x. Módulo é definido como
a % b == a - math.floor(a/b)*b
Ou seja, é o resto de uma divisão arredondada em direção a menos infinito.
Operadores Relacionais
Os operadores relacionais em Lua são
== ~= < > <= >=
Estes operadores sempre possuem como resultado false ou true.
A igualdade (==) primeiro compara o tipo de seus operandos. Se os tipos são diferentes, então o resultado é false. Caso contrário, os valores dos operandos são comparados. Números e cadeias de caracteres são comparados de maneira usual. Objetos (valores do tipo table, userdata, thread e function) são comparados por referência: dois objetos são considerados iguais somente se eles são o mesmo objeto. Toda vez que um novo objeto é criado (um valor com tipo table, userdata, thread ou function) este novo objeto é diferente de qualquer outro objeto que existia anteriormente.
É possível mudar a maneira como Lua compara os tipos table e userdata através do uso do metamétodo "eq" .
As regras de conversão não se aplicam a comparações de igualdade. Portanto, "0"==0 é avaliado como false e t[0] e t["0"] denotam posições diferentes em uma tabela.
O operador ~= é exatamente a negação da igualdade (==).
Os operadores de ordem trabalham da seguinte forma. Se ambos os argumentos são números, então eles são comparados como tais. Caso contrário, se ambos os argumentos são cadeias de caracteres, então seus valores são comparados de acordo com a escolha de idioma atual. Caso contrário, Lua tenta chamar o metamétodo "lt" ou o metamétodo "le" . Uma comparação a > b é traduzida para b < a, ao passo que a >= b é traduzida para b <= a.
Operadores Lógicos
Os operadores lógicos em Lua são and, or e not. Assim como as estruturas de controle, todos os operadores lógicos consideram false e nil como falso e qualquer coisa diferente como verdadeiro.
O operador de negação not sempre retorna false ou true. O operador de conjunção and retorna seu primeiro argumento se este valor é false ou nil; caso contrário, and retorna seu segundo argumento. O operador de disjunção or retorna seu primeiro argumento se o valor deste é diferente de nil e de false; caso contrário, or retorna o seu segundo argumento. Tanto and como or usam avaliação de curto-circuito; isto é, o segundo operando é avaliado somente quando é necessário. Aqui estão alguns exemplos:
10 or 20 --> 10 10 or error() --> 10 nil or "a" --> "a" nil and 10 --> nil false and error() --> false false and nil --> false false or nil --> nil 10 and 20 --> 20
(Neste manual, --> indica o resultado da expressão precedente.)
Concatenação
O operador de concatenação de cadeias de caracteres em Lua é denotado por dois pontos ('..'). Se ambos os operandos são cadeias de caracteres ou números, então eles são convertidos para cadeias de caracteres de acordo com as regras. Caso contrário, o metamétodo "concat" é chamado.
Construtores de Tabelas
Construtores de tabelas são expressões que criam tabelas. Toda vez que um construtor é avaliado, uma nova tabela é criada. Um construtor pode ser usado para criar uma tabelas vazia ou para criar uma tabela e inicializar alguns dos seus campos. A sintaxe geral de construtores é
construtortabela = `{´ [listadecampos] `}´ listadecampos = campo {separadordecampos campo} [separadordecampos] campo = `[´ exp `]´ `=´ exp | Nome `=´ exp | exp separadordecampos = `,´ | `;´
Cada campo da forma [exp1] = exp2 adiciona à nova tabela uma entrada cuja chave é exp1 e cujo valor é exp2. Um campo da forma Nome = exp é equivalente a ["Nome"] = exp. Finalmente, campos da forma exp são equivalentes a = exp, onde i representa números inteiros consecutivos, iniciando com 1. Campos nos outros formatos não afetam esta contagem. Por exemplo,
a = { [f(1)] = g; "x", "y"; x = 1, f(x), [30] = 23; 45 }
é equivalente a
do local t = {} t[f(1)] = g t[1] = "x" -- primeira exp t[2] = "y" -- segunda exp t.x = 1 -- t["x"] = 1 t[3] = f(x) -- terceira exp t[30] = 23 t[4] = 45 -- quarta exp a = t end
Se o último campo na lista possui a forma exp e a expressão é uma chamada de função ou uma expressão com um número variável de argumentos, então todos os valores retornados pela expressão entram na lista consecutivamente. Para evitar isto, coloque parênteses ao redor da chamada de função ou da expressão com número variável de argumentos.
A lista de campos pode ter um separador a mais no fim, como uma conveniência para código gerado automaticamente.
Se gostarem eu continuo , relembrando, tudo tirado do lua.org!
Só tive o empenho de formatar!
-
CarlosPain reacted to Koddy in [Tutorial] Calabouços
Saudações XTibianos!
Venho aqui para abrir a sua mente! Fazê-lo esquecer de todo e qualquer tipo de Prisão que você sequer já viu. Levei um tempo para criá-lo, mas valeu a pena.
O meu único pedido é que acompanhe este tutorial até o fim, e ao postar, não esqueça de desabilitar sua assinatura, se possuir imagens.
Primeiramente, gostaria de me desculpar pela quantidade de imagens. Foi com a intenção de garantir o aprendizado de todos vocês, leitores. Se alguma imagem não abrir por inteira, atualize seu navegador. Caso o problema continue, selecione a imagem com o botão direito, e clique em Mostrar Imagem. Se mesmo assim o erro persistir, formate o seu computador.
Aviso: Este tutorial envolverá outros quatro tutoriais, que serão citados ao longo de sua confortável leitura. Todos eles se encontram aqui mesmo no XTibia, na sessão "Tutoriais de Mapping".
Calabouços
"Calabouço é o andar mais profundo de um castelo, geralmente utilizado como prisão (como na bastilha), como armazém ou como porão.
É descrito em filmes e livros de terror como um lugar com pouca iluminação, muito empoeirado e de difícil acesso."
Fonte:
Wikipédia
Como podemos ver, calabouços são locais no subsolo, ou seja, estão abaixo do nível do mar.
E tem como uma de suas utilidades, a prisão.
Vamos aprender hoje, a criar um calabouço simples; com uma prisão e um pequeno armazém.
Abra seu RME, e crie uma entrada "escondida" para o calabouço, um pouco longe de sua cidade. Será para lá que os prisioneiros irão; em um local isolado.
Obs: Em hipótese alguma crie sua prisão ao céu aberto, estilo Yurots. Esse tipo de prisão não é atual, e por não possuir nada de medieval (ou mitológico), não se assemelha em nada com o Tibia.
Crie uma área montanhosa ao ar livre para a entrada do calabouço. Coloque pedras, plantas ou árvores para dificultar o acesso, fazendo o jogador andar em diagonal, por exemplo. No caso, fiz uma Montanha de Terra. Se quiser fazer também, mas tem difículdades, aconselho dar uma lida neste tutorial, também feito por mim.
Segue abaixo uma pequena lista de ID's que foram utilizados na imagem acima, que podem facilitar a criação de sua passagem para o seu calabouço.
Para que a escada "embutida" na montanha funcione, visite este tutorial feito por Kyvorgury, que apesar de simples é bem útil. Créditos à ele.
Após criar a entrada para seu calabouço, vamos ao andar inferior. Crie o formato dele, e depois detalhe-o. Caso queira ajuda na criação dela ou na decoração, visite os tutoriais feitos anteriormente por mim: Formando Caves e Detalhando Caves. Lembrando que ao terminar este andar, citarei mais uma vez alguns ID's que foram utilizados.
Veja uma imagem de como ficou o piso inferior, feito ao meu estilo.
Como podem ver, utilizei tochas nas paredes, algumas raízes de árvores, sempre com pedras.
Obs: Os suportes para o carvão não são necessários, inclusive não sei se ficaram bem sendo utilizados aqui, mas como não há outro sprite parecido, usei ele mesmo. Se for um bom spriter, ou caso haja um na sua equipe, tente fazer algo parecido com as tochas da primeira imagem.
E continue fazendo o caminho, não muito comprido, nem muito curto.
Faça um caminho razoável até o andar inferior. Um comprimento suficiente para fazer o prisioneiro transpirar para chegar, mas não que faça com que ele seja carregado pelo guarda até chegar ao seu local.
Como prometido, segue mais uma lista com parte dos ID's que foram utilizados neste andar.
No andar inferior, crie uma passagem para os jogadores poderem transitar, e não se esqueça de adicionar o mais importante, as grades!
Se tiver dificuldade na criação de uma 'gaiola', segue a dica de como fazê-la. (Faça-as fechadas, deixei aberta pois não há nenhum preso no momento, e é só para demonstração.
Após fazer uma área com várias prisões, adicione os detalhes básicos.
Crie mais e mais 'compartimentos', caso falte espaço, faça-os no piso inferior. Não se esqueça agora, de adicionar uma "cama" para o prisioneiro, e adicionar os balcões citados penúltima imagem.
Adicione também alguns esqueletos, tanto na parede como no chão. Segue aqui alguns ID's que podem ser uilizados.
Os ID's da última coluna serão utilizados agora, na criação do seu armazém. O barril d'água foi feito para chuva, mas pode servir de estoque para os condenados. Se quiser fazer o armazém cercado por parede, fique a vontade, só fique atento para não colocar uma parede muito esquisita. No armazém, recomendo fazer um estoque de água (com os dois tipos de barris), e também uma pequena quantidade de armas, para que os guardas do calabouço possam se equipar. Faça o acesso ao armazém com uma grade também, ou com uma porta trancada, que necessite de uma chave para realizar a passagem.
É isso aí galera. Acabou. Espero que tenham gostado deste tutorial, e peço que não esqueçam de desabilitar a assinatura, na hora de comentar (sei que vão). Peço desculpas se ficou muito cansativo, mas espero que tenham entendido a ideia de um calabouço. Façam como quiserem. Refaçam. Inventem. Faça o seu próprio Calabouço ao seu estilo. Segue aí mais duas imagens do Calabouço.
E...
Dica: Em nenhuma das imagens acima me lembrei de utilizar teias de aranha. Elas caem super bem, desde que não seja em excesso, perto das grades dos prisioneiros. Principalmente dentro do armazém, próximo aos móveis e objetos.
Obrigado por acompanhar o meu Tutorial até aqui, e peço: não esqueça de criticar. Tem algo que não gostou nas imagens acima? Algum 'bug' na criação do seu Calabouço? Quer elogiar? Faça como queira, apenas não deixe de comentar.
Abraços, e até a próxima!
-
CarlosPain reacted to joaohd in Começando A "scriptear"
Bom, como me foi sugerido a elaboração de um tutorial que ensine a "scriptear" ( do dicionario brumatt ), aqui está. Espero que façam bom proveito.
Para começar com scripts, você deve primeiro ter algumas competências básicas, porém primordiais. São elas:
► Conhecimento de inglês;
► Conhecimento prévio das funções;
► Capacidade de criar sequências de raciocínios.
Mas por que desenvolver estas capacidades?
Como o nome das funções e estruturas são em inglês, você precisa entender o que elas fazem e te retornam. Na maioria das vezes, somente traduzindo o nome da função você consegue detectar sua serventia.
O conhecimento prévio das funções, além de poupar tempo, evita que você cometa erros simples e até mesmo agilize a execução do seu script.
A capacidade de criação de sequências lógicas é a parte que a maioria das pessoas tem dificuldades para desenvolver. Sem ela, os scripts podem conter erros (bugs), falhas de segurança e até mesmo a falha total de seu código. Esta parte, você terá de desenvolver sozinho. Ninguém te ensina.
Após conhecer as competências básicas para se começar a criar scripts, podemos começar a explicar um pouco mais sobre cada uma, individualmente.
→ Inglês
Aqui explicarei somente o básico, dando ênfase aos prefixos.
SET
De acordo com o dicionário, “Set” quer dizer
Logo, as funções que tenham o prefixo “Set”, servem para estabelecer algo para alguma coisa ou alguém. O que será estabelecido pode ser um texto (string), número ou alguma condição.
DO
De acordo com o dicionário, “Do” quer dizer
Logo, as funções que tenham o prefixo “Do”, servem para realizar alguma ação ou consulta.
GET
De acordo com o dicionário, “Get” quer dizer
Logo, as funções que tenham o prefixo “Get”, servem para fazer uma consulta de alguma coisa à alguém ou alguma coisa. O que será consultado pode ser um número ou um texto (string).
IS
De acordo com o dicionário, “Is” quer dizer
Logo, as funções que tenham o prefixo “Is”, servem para fazer uma verificação se alguma coisa é ou não o que foi proposto.
Após ler e entender o básico de inglês para começar com scripts, podemos passar para a parte da lógica.Todos os dias, inconscientemente, você faz uma sequência lógica:
Acordar – Ligar o computador – Abrir os olhos – Acessar o Xtibia
Logo, esta parte, só precisa ser desenvolvida. Os passos para se criar uma sequência interpretável e executável são a análise prévia do problema, destacando os métodos de resolução; Análise dos métodos de resolução, eliminando os que não podem ser executados, seja por falta de conhecimento ou por falta de ferramentas; Escolha do melhor método de resolução; Destaque dos pontos cruciais da resolução; Criação da lógica.
Apesar de parecer complexo, esta parte é bem simples. Para início, tente criar uma sequência para a troca do pneu furado do seu carro.
Bom, acho que é isso.
Tutorial sugerido por Brumatt.
Você também pode pedir o seu aqui
Materiais de apoio:
Funções LUA
Introdução à programação LUA + estruturas
flw
-
CarlosPain reacted to luisfe23 in Auto Restarter - Com Imagens
Alguns falarão qe este conteudo ja é existente aqui no XTibia, sim ele é, mas não tem imagens, então trazerei um tutorial melhor explicado e com imagens.
Vamos la,
Primeiro oq é isso Auto Restarter?
É uma instrução qe faz com qe quando o seu ot for derrubado, ele instantaneamente abrira sozinho sem vc nem tocar no pc, podendo assim deixar ele rodando 24 horas...
Obs: Ele não funciona com distros Console, apenas GUI.
Caramba, oq eu preciso fazer?
Primeiro abra a pasta de seu ot, e abra um arquivo bloco de notas. (Menu Iniciar > Todos os Programas > Acessorios > Bloco de notas)
Agora qe abriu o bloco de notas, coloque o seguinte código dentro dele:
Agora vc tem qe configurar,
Onde está escrito NomedoExecutável.exe vc colocara o nome do executavel qe liga o ot, um exemplo: forgottenserver.exe
E onde está escrito --- MENSAGEM QUE VOCÊ QUISER ---, vc pode por qualqer mensagem qe vc qeira qe apareça qdo ele reabrir seu ot, um exemplo: -= OT REINICIADO =-
Agora o auto restarter está configurado, agora iremos salvar e abrir.
Clique em Arquivo > Salvar Como
Agora no nome do arquivo vc coloca restarter.bat (obs: é obrigatorio o arquivo ser .bat), agora coloque onde está escrito "Salvar como tipo:" deixe todos os arquivos, depois salve-o na pasta de seu ot:
Pronto, agora é só abrir o auto-restarter, e ele abrira seu otserv automaticamente. Caso vc qeira qe o ot feche, basta fechar o arquivo.
Caso de algum erro, poste aqe no topico qe eu respondo.
Espero qe vcs tenhao gostado do tutorial.
Abraços
-
CarlosPain reacted to locosporot in Tudo Sobre Ot Server
Ola Xtibianos
Vo postar algumas coisas sobre OT, nao irei posta comandos porque ja tem um tutorial sobre issu no forum
1 -Como Editar Accounts ou Chars.
2 -Como por munição e runa infinita no seu OT.
3 -Como por POT infinito
4 -Como editar a cor do XP de quando se mata um bixo.
5 - Como Mudar a XP/Skill/ML/ Protection level/ lvl para comprar houses.
6 -Como colocar Teleports no seu OT.
7 - Como botar XP stages em seu ot.
8 - Juntando 2 mapas pelo RME.
9 - Como criar areas Non-PVP/PZ etc...
10 - Criando um Char GM/GOD.
1- Como Editar Accounts ou Chars.
• Abram o SQLite
• Cliquem numa pastinha preta com uma florzinha vermelha em cima.
• Escolham o arquivo q no final esteja escrito .s3db
• Botem OK e cliquem em Substituir
• Clique em Accounts para editar as contas
• Clique em Players para editar os players
2 -Como por munição e runa infinita no seu OT.
• Abram a pasta do seu ot
• Abram o config.lua
• Procurem por uma linha escrita isso:
removeWeaponAmmunition = "no"
removeWeaponCharges = "no"
• Troque o "no" por "yes", se vc baixo o ot e ele ja veio com yes escrito e n estar infinita troque o "yes" por "no".
• Fexem e salvem.
3- Como por POT infinito.
• Abram a pasta do seu ot
• Abram a pasta data/actions/scripts/liquids
• Abram o Script do POT que vcs querem deixar infinito e procurem pela linha
doTransformItem(item.uid, EMPTY_POTION)
• Apaguem ela fechem e salvem.
4-Como editar a cor do XP de quando se mata um bixo
• Abram a pasta do seu OT
• Abram o Config.lua
• Procurem pela linha:
gainExperienceColor = 215
• Troquem o 215 por qualquer numero, o numero 215 é a cor Branca(-1 ela fica colorida).
5- Como Mudar a XP/Skill/ML/ Protection level/ lvl para comprar houses.
• Abram a pasta do seu OT
• Abram o Config.lua
• Procurem pela linha:
rateExperience = essa linha é para mudar a XP do seu ot [ Aqui botem um numero qualquer ] exemplo 50, seu ot vai ter xp 50
rateSkill = aqui é a skill do seu ot
rateMagic = é a ML do seu ot
rateLoot = é o Lot do sue OT
rateSpawn = é o Spawn dos bixos do seu OT
• Fechem e salvel
6- Como colocar Teleports no seu OT.
• Abram o RME ou qual quer otro Map Editor.
• Adicione o seu Teleport aonde quiser.
• Cliquem com o butão direito nele e cliquem em Propriedades.
• Adicionem as Coordenadas de onde vc quer q seu teleport leve '' X: Y: Z: ''
7- Como botar XP stages em seu ot.
• Abram a pasta do seu OT
• Abram o Config.lua
• Procurem pela linha:
experienceStages = false
• Troquem o " False " por " True " sem as aspas.
• Fechem e salvem.
• Abram a pasta data\XML
• Abram o arquivo stages.xml como Bloco de Notas
• Vai estar +/- assim:
?xml version="1.0" encoding="UTF-8"?>
<stages>
<world id="0">
<stage minlevel="1" maxlevel="8" multiplier="9999"/>
<stage minlevel="9" maxlevel="20" multiplier="99999"/>
<stage minlevel="21" maxlevel="50" multiplier="999999"/>
<stage minlevel="51" maxlevel="100" multiplier="999999"/>
<stage minlevel="101" maxlevel="200 multiplier="9999"/>
</world>
</stages>
• Ai está assim: do lvl 1 ate o 8 xp 9999 do lvl 9 até o 20 xp 99999... e assim vai... quer adicionar mais ? é só copiar e colar e midar o min level e deixar 1 level a mais do q o max level de antes, mudar o max level e a XP.
• Exemplo:
<stage minlevel="51" maxlevel="100" multiplier="999999"/>
quer mais 1 ?
adicione:
<stage minlevel="101" maxlevel="200" multiplier="999999"/>
8- Juntando 2 mapas pelo RME.
• Abra o RME com o mapa que você quer copiar, após isso vá em File/Open e procure o mapa em que você quer colar outro.
• E então ficara os dois no mesmo RME, só que em abas diferentes.
• Feito isso vá no mapa que você quer copiar, no canto terá um quadradinho, clique nele, o mesmo vai virar um lápis.
• Continue no mapa que deseja copiar, e então segura shift e arraste o mouse por cima da área que você quer copiar, ele ficará escuro após selecionar.
• Depois é só apertar ctrl + v no mapa que você quer colar.
9- Como criar areas Non-PVP/PZ etc...
• Abram o seu Mapa com o RME.
• Vão até Terrain pallete la em baixo tera uns quadradinhos com as opçoes:
Eraser, Hatch Window, Window, PZ TOOL, NON PVP TOOL, NO LOGOUT TOOL, PVP ZONE TOOL.
• É só escolher oq quer usar e selecionar aonde quer usar.
10-Criando um Char GM/GOD.
• Abram a pasta do seu ot.
• Abram o SQLite.
• Vão ate a parte: Player
• Selecione o player q vai virar GOD/GM
• Na aba Group_ID mude o acces para:
6- GOD
5- CM
4- GM
3- Sênior Tutor
2- Tutor
1- Player
• OBS: o player tem q estar OFF.
• Ou vc fica de frente pro player e fala /attr group (e oque vc quer da para ele)
Creditos:
Caio Felipe
Msn para contato:
caio_games_10@hotmail.com
-
CarlosPain reacted to XJhoow in [Recuperando] Sistema Mineração
Primeiramente, este tuto eu estou recuperando do XTibia, ele deu problema, e muita gente usa, então só estou botando denovo, ele é totalemente do King CPI, eu só mudei as fontes, arrumei erros gramaticais, tirei coisas desnecessárias, deixei cores mais visíveis, etc..
Vamos lá:
Apartir de agora é ele que fala:
Sistema de Mineração By KingCPI v0.1
Como funciona??
Você precisa de uma dwarven pickaxe(id:4874). (Clique na pick e clique na parede da caverna.)
As paredes são os item2.itemid.
Ao conseguir 1 item ele fala um som diferente de quando não consegue nada.
Pro exhausted funcionar nessecita do OtScript.lib 0.1 ou superior.
1º passo:
Crie um arquivo na pasta data/actions/scripts com o nome de minerando.lua
Vá até o arquivo actions.xml e adicione isto:[/size]
Obs: em vermelho é o id da dwarven pickaxe.
Depois de:
[/color]
2º passo:
Volte ao arquivo mineracao.lua.
Abra-o, delete TUDO que tem dentro e coloque isto:
*Altere como quiser*
Em azul: dificuldade
Em rosa: o storage value do skill
Em vermelho: itens que serão dados como prêmio
Em roxo: chance de dar os referidos itens.[/color]
Gostaram???
Espero que sim!!
Lembrando que esta é apenas a 1ª versão da mineração, qualquer dúvida, sugestão, ou critica POSTEM!
Até +
:hi:
Agora sou eu XJhoow
Eu gostei do script, espero que gostem também.. valeu
-
CarlosPain reacted to Renato Ribeiro in Detalhando Montanhas
A idéia surgiu após eu ver o tutorial "detalhando caves" de nosso grande amigo Koddy.
Decidi então criar um para detalhamento de montanhas.
Skin por: Renato
Tutorial por: Renato
Desculpe pela repetição do "agora" eu nem me toquei :x
Gostou? + REP!
Abraços.
Renato Ribeiro.
-
CarlosPain reacted to Renato Ribeiro in Tecnicas Para Cachoeiras
Trabalhando para um futuro melhor do XTibia.
frase by kaonic
Primeiro de tudo vou avisando que essa skin vai ser única, pois
o burrinho aqui só salvou em jpeg. ¬¬
Não enfeitei muito pois o objetivo é mostrar á vocês duas
técnicas muito boas para a criação de cachoeiras.
Skin por: Renato
Tutorial por: Renato
Outra demonstração aplicando a técnica:
* Correção, agora que eu vi: no Tutorial é "Criando sua cachoeira em tile de..."
Comi o em, desculpas '-'
Abraços.
Renato Ribeiro.
-
CarlosPain reacted to lucasatak in Tudo E Todos
Alguns Comandos Para Serem Usados 1.0
OBS:TENTAREI COLOCAR DESCRIÇAO EM TODOS,DIFICIL,MAIS VOU TENTAR.
NORTH = 0 EAST = 1 SOUTH = 2 WEST = 3 SOUTHWEST = 4 SOUTHEAST = 5 NORTHWEST = 6 NORTHEAST = 7
COMBAT_FORMULA_UNDEFINED = 0 COMBAT_FORMULA_LEVELMAGIC = 1 COMBAT_FORMULA_SKILL = 2 COMBAT_FORMULA_DAMAGE = 3
Essas aqui sao as CONDITIOS,aqui eu vo botar o mesmo exemplo do paralyze que eu puis la em baixo,o exemplo:
local condition = createConditionObject(CONDITION_PARALYZE)< explicado la em baixo setConditionParam(condition, [color="#FFA500"]CONDITION_PARAM_TICKS[/color], 5000) < quanto tempo durará a magia,mesma coisa pra CONDITION_HASTE,está la em baixo. setConditionParam(condition, [color="#FFA500"]CONDITION_PARAM_SPEED[/color], -500) < quanto de velocidade o player irá perder,no caso -500 setCombatCondition(combat, condition)
[color="#FFA500"]CONDITION_PARAM_OWNER = 1 CONDITION_PARAM_TICKS = 2 CONDITION_PARAM_OUTFIT = 3 CONDITION_PARAM_HEALTHGAIN = 4 CONDITION_PARAM_HEALTHTICKS = 5 CONDITION_PARAM_MANAGAIN = 6 CONDITION_PARAM_MANATICKS = 7 CONDITION_PARAM_DELAYED = 8 CONDITION_PARAM_SPEED = 9 CONDITION_PARAM_LIGHT_LEVEL = 10 CONDITION_PARAM_LIGHT_COLOR = 11 CONDITION_PARAM_SOULGAIN = 12 CONDITION_PARAM_SOULTICKS = 13 CONDITION_PARAM_MINVALUE = 14 CONDITION_PARAM_MAXVALUE = 15 CONDITION_PARAM_STARTVALUE = 16 CONDITION_PARAM_TICKINTERVAL = 17 CONDITION_PARAM_FORCEUPDATE = 18 CONDITION_PARAM_SKILL_MELEE = 19 CONDITION_PARAM_SKILL_FIST = 20 CONDITION_PARAM_SKILL_CLUB = 21 CONDITION_PARAM_SKILL_SWORD = 22 CONDITION_PARAM_SKILL_AXE = 23 CONDITION_PARAM_SKILL_DISTANCE = 24 CONDITION_PARAM_SKILL_SHIELD = 25 CONDITION_PARAM_SKILL_FISHING = 26 CONDITION_PARAM_STAT_MAXHEALTH = 27 CONDITION_PARAM_STAT_MAXMANA = 28 CONDITION_PARAM_STAT_SOUL = 29 CONDITION_PARAM_STAT_MAGICLEVEL = 30 CONDITION_PARAM_STAT_MAXHEALTHPERCENT = 31 CONDITION_PARAM_STAT_MAXMANAPERCENT = 32 CONDITION_PARAM_STAT_SOULPERCENT = 33 CONDITION_PARAM_STAT_MAGICLEVELPERCENT = 34 CONDITION_PARAM_SKILL_MELEEPERCENT = 35 CONDITION_PARAM_SKILL_FISTPERCENT = 36 CONDITION_PARAM_SKILL_CLUBPERCENT = 37 CONDITION_PARAM_SKILL_SWORDPERCENT = 38 CONDITION_PARAM_SKILL_AXEPERCENT = 39 CONDITION_PARAM_SKILL_DISTANCEPERCENT = 40 CONDITION_PARAM_SKILL_SHIELDPERCENT = 41 CONDITION_PARAM_SKILL_FISHINGPERCENT = 42 CONDITION_PARAM_PERIODICDAMAGE = 43 CONDITION_PARAM_BUFF = 44 CONDITION_PARAM_SUBID = 45[/color]
Esses aqui sao os COMBAT PARAM,aqui ensinarei mais como se usa esse tal de "COMBAT PARAM" é simples,olhe esse pedaço de magia que eu peguei:
setCombatParam(combat, [color="#FF00FF"]COMBAT_PARAM_EFFECT[/color], AQUI O EFEITO)
esses comandos iram ser o tipos de efeitos,voce poderá botar COMBAT_PARAM_EFFECT,logo depois o efeito.
ou COMBAT_PARAM_DISTANCEEFFECT,logo depois o efeito,e será uma magia de distance.
[color="#FF00FF"]COMBAT_PARAM_TYPE = 1 COMBAT_PARAM_EFFECT = 2 COMBAT_PARAM_DISTANCEEFFECT = 3 COMBAT_PARAM_BLOCKSHIELD = 4 COMBAT_PARAM_BLOCKARMOR = 5 COMBAT_PARAM_TARGETCASTERORTOPMOST = 6 COMBAT_PARAM_CREATEITEM = 7 COMBAT_PARAM_AGGRESSIVE = 8 COMBAT_PARAM_DISPEL = 9 COMBAT_PARAM_USECHARGES = 10[/color]
CALLBACK_PARAM_LEVELMAGICVALUE = 1 CALLBACK_PARAM_SKILLVALUE = 2 CALLBACK_PARAM_TARGETTILE = 3 CALLBACK_PARAM_TARGETCREATURE = 4
tipos de magia,um exemplo:
setCombatParam(combat, COMBAT_PARAM_TYPE, [color="#0000FF"]COMBAT_PHYSICALDAMAGE[/color])
esse COMBAT_PARAM_TYPE,será o tipo de sua magia,poderá ser de healar,atacar,defender etc.
se for de healar voce botará ali COMBAT_HEALING ao inves de PHYSICALDAMAGE.
[color="#0000FF"]COMBAT_NONE = 0 COMBAT_PHYSICALDAMAGE = 1 COMBAT_ENERGYDAMAGE = 2 COMBAT_EARTHDAMAGE = 4 COMBAT_POISONDAMAGE = 4 COMBAT_FIREDAMAGE = 8 COMBAT_UNDEFINEDDAMAGE = 16 COMBAT_LIFEDRAIN = 32 COMBAT_MANADRAIN = 64 COMBAT_HEALING = 128 COMBAT_DROWNDAMAGE = 256 COMBAT_ICEDAMAGE = 512 COMBAT_HOLYDAMAGE = 1024 COMBAT_DEATHDAMAGE = 2048[/color]
oque a magia irá ser? irá ser de paralyze? CONDITION_PARALYZE
ou irá ser de fogo?
CONDITION_FIRE
ou ela te dará velocidade?
CONDITION_HASTE
é de acordo com voce,um exemplo para usa-las,um exemplo de utani gran hur.
local condition = createConditionObject(CONDITION_HASTE) [b]< VELOCIDADE[/b] setConditionParam(condition, CONDITION_PARAM_TICKS, 30000) [b]explicarei la em cima.[/b].
se for de paralyze é a quase a mesma coisa,só tem uma coisa a mais,veja:
local condition = createConditionObject(CONDITION_PARALYZE) e aqui eu mudei,ao inves de ganhar velocidade,irá perder porque será magia de paralyze. setConditionParam(condition, CONDITION_PARAM_TICKS, 5000) < explicarei la em cima. setConditionParam(condition, CONDITION_PARAM_SPEED, -500) < explicarei la em cima
CONDITION_NONE = 0 CONDITION_POISON = 1 CONDITION_FIRE = 2 CONDITION_ENERGY = 4 CONDITION_PHYSICAL = 8 CONDITION_HASTE = 16 CONDITION_PARALYZE = 32 CONDITION_OUTFIT = 64 CONDITION_INVISIBLE = 128 CONDITION_LIGHT = 256 CONDITION_MANASHIELD = 512 CONDITION_INFIGHT = 1024 CONDITION_DRUNK = 2048 CONDITION_EXHAUST = 4096 CONDITION_FOOD = 8192 CONDITION_REGENERATION = 8192 CONDITION_SOUL = 16384 CONDITION_DROWN = 32768 CONDITION_MUTED = 65536 CONDITION_ATTRIBUTES = 131072 CONDITION_FREEZING = 262144 CONDITION_DAZZLED = 524288 CONDITION_CURSED = 1048576 CONDITION_PACIFIED = 2097152
aqui por exemplo,voce fez uma movements e ai tem que usar o item pra funcionar,só que voce quer que ele só funcione em um certo lugar do corpo,ai entra isso aqui em baixo,explicarei.
CONST_SLOT_HEAD = 1 - cabeça CONST_SLOT_NECKLACE = 2 - lugar do amuleto CONST_SLOT_BACKPACK = 3 - mochila CONST_SLOT_ARMOR = 4 - armor CONST_SLOT_RIGHT = 5 - mao direita CONST_SLOT_LEFT = 6 - mao esquerda CONST_SLOT_LEGS = 7 - calça CONST_SLOT_FEET = 8 - pé CONST_SLOT_RING = 9 - ring CONST_SLOT_AMMO = 10 - lugar da flexa
tipo efeitos das Magias,aconselho olhar o tutorial que colocarei no final do topico para ver os efeitos.
CONST_ME_DRAWBLOOD = 0 CONST_ME_LOSEENERGY = 1 CONST_ME_POFF = 2 CONST_ME_BLOCKHIT = 3 CONST_ME_EXPLOSIONAREA = 4 CONST_ME_EXPLOSIONHIT = 5 CONST_ME_FIREAREA = 6 CONST_ME_YELLOW_RINGS = 7 CONST_ME_GREEN_RINGS = 8 CONST_ME_HITAREA = 9 CONST_ME_TELEPORT = 10 CONST_ME_ENERGYHIT = 11 CONST_ME_MAGIC_BLUE = 12 CONST_ME_MAGIC_RED = 13 CONST_ME_MAGIC_GREEN = 14 CONST_ME_HITBYFIRE = 15 CONST_ME_HITBYPOISON = 16 CONST_ME_MORTAREA = 17 CONST_ME_SOUND_GREEN = 18 CONST_ME_SOUND_RED = 19 CONST_ME_POISONAREA = 20 CONST_ME_SOUND_YELLOW = 21 CONST_ME_SOUND_PURPLE = 22 CONST_ME_SOUND_BLUE = 23 CONST_ME_SOUND_WHITE = 24 CONST_ME_BUBBLES = 25 CONST_ME_CRAPS = 26 CONST_ME_GIFT_WRAPS = 27 CONST_ME_FIREWORK_YELLOW = 28 CONST_ME_FIREWORK_RED = 29 CONST_ME_FIREWORK_BLUE = 30 CONST_ME_STUN = 31 CONST_ME_SLEEP = 32 CONST_ME_WATERCREATURE = 33 CONST_ME_GROUNDSHAKER = 34 CONST_ME_HEARTS = 35 CONST_ME_FIREATTACK = 36 CONST_ME_ENERGYAREA = 37 CONST_ME_SMALLCLOUDS = 38 CONST_ME_HOLYDAMAGE = 39 CONST_ME_BIGCLOUDS = 40 CONST_ME_ICEAREA = 41 CONST_ME_ICETORNADO = 42 CONST_ME_ICEATTACK = 43 CONST_ME_STONES = 44 CONST_ME_SMALLPLANTS = 45 CONST_ME_CARNIPHILA = 46 CONST_ME_PURPLEENERGY = 47 CONST_ME_YELLOWENERGY = 48 CONST_ME_HOLYAREA = 49 CONST_ME_BIGPLANTS = 50 CONST_ME_CAKE = 51 CONST_ME_GIANTICE = 52 CONST_ME_WATERSPLASH = 53 CONST_ME_PLANTATTACK = 54 CONST_ME_TUTORIALARROW = 55 CONST_ME_TUTORIALSQUARE = 56 CONST_ME_MIRRORHORIZONTAL = 57 CONST_ME_MIRRORVERTICAL = 58 CONST_ME_SKULLHORIZONTAL = 59 CONST_ME_SKULLVERTICAL = 60 CONST_ME_ASSASSIN = 61 CONST_ME_STEPSHORIZONTAL = 62 CONST_ME_BLOODYSTEPS = 63 CONST_ME_STEPSVERTICAL = 64 CONST_ME_YALAHARIGHOST = 65 CONST_ME_BATS = 66 CONST_ME_NONE = 255
isso aqui pode ser usado no items.xml como atributekey,aqui vai um exemplo:
<attribute key="shootType" value="bluearrow"/>
voce mudara apenas oque está em negrito com os nomes abaixo,se quiser mudar para o efeito de busrtarrow voce nao colocará CONST_ANI_BURSTARROW e só bustarrow.
pode ser usada como DISTANCE_EFFECT nas magias,mais como assim? aqui está:
(COMBAT_PARAM_DISTANCEEFFECT,CONST_ANI_BOLT)
aqui voce colocará tudo,CONST_ANI ....
CONST_ANI_SPEAR = 0 CONST_ANI_BOLT = 1 CONST_ANI_ARROW = 2 CONST_ANI_FIRE = 3 CONST_ANI_ENERGY = 4 CONST_ANI_POISONARROW = 5 CONST_ANI_BURSTARROW = 6 CONST_ANI_THROWINGSTAR = 7 CONST_ANI_THROWINGKNIFE = 8 CONST_ANI_SMALLSTONE = 9 CONST_ANI_DEATH = 10 CONST_ANI_LARGEROCK = 11 CONST_ANI_SNOWBALL = 12 CONST_ANI_POWERBOLT = 13 CONST_ANI_POISON = 14 CONST_ANI_INFERNALBOLT = 15 CONST_ANI_HUNTINGSPEAR = 16 CONST_ANI_ENCHANTEDSPEAR = 17 CONST_ANI_REDSTAR = 18 CONST_ANI_GREENSTAR = 19 CONST_ANI_ROYALSPEAR = 20 CONST_ANI_SNIPERARROW = 21 CONST_ANI_ONYXARROW = 22 CONST_ANI_PIERCINGBOLT = 23 CONST_ANI_WHIRLWINDSWORD = 24 CONST_ANI_WHIRLWINDAXE = 25 CONST_ANI_WHIRLWINDCLUB = 26 CONST_ANI_ETHEREALSPEAR = 27 CONST_ANI_ICE = 28 CONST_ANI_EARTH = 29 CONST_ANI_HOLY = 30 CONST_ANI_SUDDENDEATH = 31 CONST_ANI_FLASHARROW = 32 CONST_ANI_FLAMMINGARROW = 33 CONST_ANI_SHIVERARROW = 34 CONST_ANI_ENERGYBALL = 35 CONST_ANI_SMALLICE = 36 CONST_ANI_SMALLHOLY = 37 CONST_ANI_SMALLEARTH = 38 CONST_ANI_EARTHARROW = 39 CONST_ANI_EXPLOSION = 40 CONST_ANI_CAKE = 41 CONST_ANI_WEAPONTYPE = 254 CONST_ANI_NONE = 255
PLAYERLOSS_EXPERIENCE = 0 PLAYERLOSS_MANA = 1 PLAYERLOSS_SKILL = 2 PLAYERLOSS_ITEMS = 3
STATSCHANGE_HEALTHGAIN = 1 STATSCHANGE_HEALTHLOSS = 2 STATSCHANGE_MANAGAIN = 3 STATSCHANGE_MANALOSS = 4
SKILL_FIST = 0 SKILL_CLUB = 1 SKILL_SWORD = 2 SKILL_AXE = 3 SKILL_DISTANCE = 4 SKILL_SHIELD = 5 SKILL_FISHING = 6 SKILL__MAGLEVEL = 7 SKILL__LEVEL = 8
GUILDLEVEL_MEMBER = 1 GUILDLEVEL_VICE = 2 GUILDLEVEL_LEADER = 3
SKULL_NONE = 0 SKULL_YELLOW = 1 SKULL_GREEN = 2 SKULL_WHITE = 3 SKULL_RED = 4
COMBAT_FORMULA_UNDEFINED = 0 COMBAT_FORMULA_LEVELMAGIC = 1 COMBAT_FORMULA_SKILL = 2 COMBAT_FORMULA_DAMAGE = 3
CONDITION_PARAM_OWNER = 1 CONDITION_PARAM_TICKS = 2 CONDITION_PARAM_OUTFIT = 3 CONDITION_PARAM_HEALTHGAIN = 4 CONDITION_PARAM_HEALTHTICKS = 5 CONDITION_PARAM_MANAGAIN = 6 CONDITION_PARAM_MANATICKS = 7 CONDITION_PARAM_DELAYED = 8 CONDITION_PARAM_SPEED = 9 CONDITION_PARAM_LIGHT_LEVEL = 10 CONDITION_PARAM_LIGHT_COLOR = 11 CONDITION_PARAM_SOULGAIN = 12 CONDITION_PARAM_SOULTICKS = 13 CONDITION_PARAM_MINVALUE = 14 CONDITION_PARAM_MAXVALUE = 15 CONDITION_PARAM_STARTVALUE = 16 CONDITION_PARAM_TICKINTERVAL = 17 CONDITION_PARAM_FORCEUPDATE = 18 CONDITION_PARAM_SKILL_MELEE = 19 CONDITION_PARAM_SKILL_FIST = 20 CONDITION_PARAM_SKILL_CLUB = 21 CONDITION_PARAM_SKILL_SWORD = 22 CONDITION_PARAM_SKILL_AXE = 23 CONDITION_PARAM_SKILL_DISTANCE = 24 CONDITION_PARAM_SKILL_SHIELD = 25 CONDITION_PARAM_SKILL_FISHING = 26 CONDITION_PARAM_STAT_MAXHEALTH = 27 CONDITION_PARAM_STAT_MAXMANA = 28 CONDITION_PARAM_STAT_SOUL = 29 CONDITION_PARAM_STAT_MAGICLEVEL = 30 CONDITION_PARAM_STAT_MAXHEALTHPERCENT = 31 CONDITION_PARAM_STAT_MAXMANAPERCENT = 32 CONDITION_PARAM_STAT_SOULPERCENT = 33 CONDITION_PARAM_STAT_MAGICLEVELPERCENT = 34 CONDITION_PARAM_SKILL_MELEEPERCENT = 35 CONDITION_PARAM_SKILL_FISTPERCENT = 36 CONDITION_PARAM_SKILL_CLUBPERCENT = 37 CONDITION_PARAM_SKILL_SWORDPERCENT = 38 CONDITION_PARAM_SKILL_AXEPERCENT = 39 CONDITION_PARAM_SKILL_DISTANCEPERCENT = 40 CONDITION_PARAM_SKILL_SHIELDPERCENT = 41 CONDITION_PARAM_SKILL_FISHINGPERCENT = 42 CONDITION_PARAM_PERIODICDAMAGE = 43 CONDITION_PARAM_BUFF = 44 CONDITION_PARAM_SUBID = 45
COMBAT_PARAM_TYPE = 1 COMBAT_PARAM_EFFECT = 2 COMBAT_PARAM_DISTANCEEFFECT = 3 COMBAT_PARAM_BLOCKSHIELD = 4 COMBAT_PARAM_BLOCKARMOR = 5 COMBAT_PARAM_TARGETCASTERORTOPMOST = 6 COMBAT_PARAM_CREATEITEM = 7 COMBAT_PARAM_AGGRESSIVE = 8 COMBAT_PARAM_DISPEL = 9 COMBAT_PARAM_USECHARGES = 10 COMBAT_PARAM_TARGETPLAYERSORSUMMONS = 11
CALLBACK_PARAM_LEVELMAGICVALUE = 1 CALLBACK_PARAM_SKILLVALUE = 2 CALLBACK_PARAM_TARGETTILE = 3 CALLBACK_PARAM_TARGETCREATURE = 4
COMBAT_NONE = 0 COMBAT_PHYSICALDAMAGE = 1 COMBAT_ENERGYDAMAGE = 2 COMBAT_EARTHDAMAGE = 4 COMBAT_POISONDAMAGE = 4 COMBAT_FIREDAMAGE = 8 COMBAT_UNDEFINEDDAMAGE = 16 COMBAT_LIFEDRAIN = 32 COMBAT_MANADRAIN = 64 COMBAT_HEALING = 128 COMBAT_DROWNDAMAGE = 256 COMBAT_ICEDAMAGE = 512 COMBAT_HOLYDAMAGE = 1024 COMBAT_DEATHDAMAGE = 2048
CONDITION_NONE = 0 CONDITION_POISON = 1 CONDITION_FIRE = 2 CONDITION_ENERGY = 4 CONDITION_PHYSICAL = 8 CONDITION_HASTE = 16 CONDITION_PARALYZE = 32 CONDITION_OUTFIT = 64 CONDITION_INVISIBLE = 128 CONDITION_LIGHT = 256 CONDITION_MANASHIELD = 512 CONDITION_INFIGHT = 1024 CONDITION_DRUNK = 2048 CONDITION_EXHAUST = 4096 CONDITION_FOOD = 8192 CONDITION_REGENERATION = 8192 CONDITION_SOUL = 16384 CONDITION_DROWN = 32768 CONDITION_MUTED = 65536 CONDITION_ATTRIBUTES = 131072 CONDITION_FREEZING = 262144 CONDITION_DAZZLED = 524288 CONDITION_CURSED = 1048576 CONDITION_PACIFIED = 2097152 CONDITION_GAMEMASTER = 4194304
EXHAUST_OTHER = 0 EXHAUST_COMBAT = 1 EXHAUST_HEALING = 2 EXHAUST_WEAPON = 3
MUTED_BUFFER = 0 MUTED_YELL = 1 MUTED_TRADE = 2 MUTED_TRADE_ROOK = 3
LISTA DE EFEITOS,BY ANTHARAZ:
AQUI.
creditos:thegod.
-
CarlosPain reacted to Oneshot in Advanced Spell System
Bem-vindos, Ékstibianos.
Este é um dos tutoriais que explicam os Advanced Systems que eu criei
para um projeto de servidor alternativo que não se efetivou.
Além de mostrar-lhes o sistema, explicarei cada função usada e como
configurar cada magia no seu servidor.
1 - Requisitos
Ékstibiano, você irá precisar de:
- Uma dose de conhecimento em LUA.
- Uma dose de funções.
- E... senso de localização... os scripts das magias irão ficar grandes.
2 - O corpo do script
Esse é o script mais básico de Spell System que criei, ele permite que a magia Ice Strike possa avançar do nível 1 (básico) ao nível 3 (ótimo)
Irei explicar o script em blocos, exatamente abaixo:
3 - Explicações
3.1 - Bloco 1
local combat_lv1 = createCombatObject() setCombatParam(combat_lv1, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) setCombatParam(combat_lv1, COMBAT_PARAM_EFFECT, CONST_ME_ICEATTACK) local combat_lv2 = createCombatObject() setCombatParam(combat_lv2, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) setCombatParam(combat_lv2, COMBAT_PARAM_EFFECT, CONST_ME_ICEATTACK) local combat_lv3 = createCombatObject() setCombatParam(combat_lv3, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) setCombatParam(combat_lv3, COMBAT_PARAM_EFFECT, CONST_ME_ICEATTACK)
Este é o bloco do script que irá determinar como é o "rosto" da sua magia, veja que eu criei três variáveis local nomeadas de combat_lv1, combat_lv2 e combat_lv3, o efeito delas é determinado pela função SetCombatParam, e as três tem efeitos idênticos com duas diferenças, uma é o dano e a outra é a área.
3.2 - Bloco 2, Áreas
local area_lv1 = createCombatArea({ {3} }) local area_lv2 = createCombatArea({ {1}, {3} }) local area_lv3 = createCombatArea({ {0, 1, 0}, {1, 3, 1} }) setCombatArea(combat_lv1, area_lv1) setCombatArea(combat_lv2, area_lv2) setCombatArea(combat_lv3, area_lv3)
Veja no Bloco 2, que eu crei três váriaveis local nomeadas de area_lv1, area_lv2 e area_lv3.
Cada uma dessas variáveis, cria uma área pela função createCombatArea, perceba também que as três áreas são diferentes, é o nosso objetivo não, quanto mais nível, mas poder de magia! Ah, e a função setCombarArea é responsável por associar cada área ao seu respectivo combat. Vamos ao Bloco 3, de Danos.
3.3 Bloco 3, Danos.
function onGetFormulaValues_lv1(cid, level, maglevel) local magDamage, levelDamage = maglevel, level / 5 return -(magDamage * 1 + levelDamage), -(magDamage * 2 + levelDamage) end function onGetFormulaValues_lv2(cid, level, maglevel) local magDamage, levelDamage = maglevel, level / 5 return -(magDamage * 1.5 + levelDamage), -(magDamage * 3 + levelDamage) end function onGetFormulaValues_lv3(cid, level, maglevel) local magDamage, levelDamage = maglevel, level / 5 return -(magDamage * 2.25 + levelDamage), -(magDamage * 4.5 + levelDamage) end setCombatCallback(combat_lv1, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues_lv1") setCombatCallback(combat_lv2, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues_lv2") setCombatCallback(combat_lv3, CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues_lv3")
Essa é uma parte complicadinha (hehe), agora não são mais variavéis locais e sim três funções onGetFormulaValues, elas são responsáveis por definir o dano que o jogador irá fazer quando utilizar a magia. A estrutura é a mesma, você pode criar quantos onGetFormulaValues quiser para cada nível de magia, mas deve colocar um sufixo _lvX para evitar erros, onde X é o level que cada função é relacionada.
A magia Ice Strike causa dano conforme o level e o maglevel do usuário, as fórmulas de dano tem o prefixo return. Veja abaixo:
return -(magDamage * 1 + levelDamage), -(magDamage * 2 + levelDamage) --Ice Strike Nv1, dano 40~60 return -(magDamage * 1.5 + levelDamage), -(magDamage * 3 + levelDamage) --Ice Strike Nv2, dano 30~80 return -(magDamage * 2.25 + levelDamage), -(magDamage * 4.5 + levelDamage) --Ice Strike Nv3, dano 45~110
Cada fórmula de cada função onGetFormulaValues faz danos diferentes. A função setCombatCallback, associa cada onGetFormulaValues ao seu respectivo combat. Ou seja, cada dano ao seu respectivo nível. Agora, vamos, ao último bloco e o mais complicadinho.
Bloco 4, Avançando o nível
local function onCastSpell1(parameters) doCombat(parameters.cid, combat_lv1, parameters.var) end local function onCastSpell2(parameters) doCombat(parameters.cid, combat_lv2, parameters.var) end local function onCastSpell3(parameters) doCombat(parameters.cid, combat_lv3, parameters.var) end function onCastSpell(cid, var) local parameters = { cid = cid, var = var} local SPELL_LEVEL_STORAGE = 70000 local SPELL_TRIES_STORAGE = 70001 local spell_level = getPlayerStorageValue(cid, SPELL_LEVEL_STORAGE) local spell_tries = getPlayerStorageValue(cid, SPELL_TRIES_STORAGE) if spell_level == -1 then spell_level = 1 end if spell_level == 1 then addEvent(onCastSpell1, 0, parameters) if spell_tries >= 1 then setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, spell_tries+1) else setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, 1) end elseif spell_level == 2 then addEvent(onCastSpell2, 0, parameters) if spell_tries >= 1 then setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, spell_tries+1) else setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, 1) end elseif spell_level == 3 then addEvent(onCastSpell3, 0, parameters) end if spell_tries >= ((spell_level)*12) then if spell_level < 3 then setPlayerStorageValue(cid, SPELL_LEVEL_STORAGE, spell_level + 1) setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, 0) doPlayerSendTextMessage(cid, 22, "You advanced from level " .. spell_level .. " to level " .. spell_level + 1 .. " in Ice Strike spell") doSendMagicEffect(getCreaturePosition(cid),14) doSendAnimatedText(getCreaturePosition(cid), 'Advanced!', 18) end end return TRUE end
Okay, você está saturado de informação se leu até aqui, descanse um pouco, respire e vamos lá:
- Observe no Bloco 4, as funções locais onCastSpell1, onCastSpell2 e onCastSpell3, elas são responsáveis para que quando o personagem invocar a magia Ice Strike, ela seja realmente invocada. E há abaixo da última função local, a onCastSpell mais importante, ela que irá nos trazer a sintaxe geral do script de magia.
- O código abaixo é responsável por duas coisas, ele irá determinar dois Storages onde serão armazenados os pontos de uso da magia e onde será armazenado o valor do nível da magia. LEMBRE-SE que os Storages que você usar aqui não deverão ser usadas em Quests e cada magia deve ter dois Storages distintos.
local SPELL_LEVEL_STORAGE = 70000 local SPELL_TRIES_STORAGE = 70001 local spell_level = getPlayerStorageValue(cid, SPELL_LEVEL_STORAGE) local spell_tries = getPlayerStorageValue(cid, SPELL_TRIES_STORAGE)
- Este outro código abaixo é responsável pela invocação da magia conforme o nível da magia que o personagem detêm.
if spell_level == -1 then spell_level = 1 end if spell_level == 1 then addEvent(onCastSpell1, 0, parameters) if spell_tries >= 1 then setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, spell_tries+1) else setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, 1) end elseif spell_level == 2 then addEvent(onCastSpell2, 0, parameters) if spell_tries >= 1 then setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, spell_tries+1) else setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, 1) end elseif spell_level == 3 then addEvent(onCastSpell3, 0, parameters) end
Veja que o verificador [if spell_level == -1 then] é necessário, porque todo Storage começa em -1, então se o Storage que você atribuiu para ser responsável pelo nível da magia em questão estiver em -1, então o script mudará seu valor para 1.
O verificador [if spell_level == 1 then] faz a função de, SE o nível da magia é 1, invocar a sintaxe do nível 1 e adicionar 1 ponto de uso. O mesmo acontece para os dois outros verificadores [if spell_level == 2 then] e [if spell_level == 3 then], com exceção de quê quando a magia estiver no nível 3, você não ganhará mais pontos de uso.
E o último código:
if spell_tries >= ((spell_level)*12) then if spell_level < 3 then setPlayerStorageValue(cid, SPELL_LEVEL_STORAGE, spell_level + 1) setPlayerStorageValue(cid, SPELL_TRIES_STORAGE, 0) doPlayerSendTextMessage(cid, 22, "You advanced from level " .. spell_level .. " to level " .. spell_level + 1 .. " in Ice Strike spell") doSendMagicEffect(getCreaturePosition(cid),14) doSendAnimatedText(getCreaturePosition(cid), 'Advanced!', 18) end end return TRUE end
Querendo ou não esse é o código mais importante do script, ele verifica que quando os pontos de uso forem maiores iguais a 12 vezes o nível atual da magia em questão, e se o nível da magia for menor que 3, eles adicionem +1 no SPELL_LEVEL_STORAGE e zerem o contador de pontos de uso da magia. Mandando uma mensagem de "Sua magia avançou de nível" com um "Advanced!" bonitinho em cor verde.
Até mais, te vejo no próximo tutorial de Advanced System.
-
CarlosPain reacted to Antharaz in Function Emarea(Cid,frompos,topos)
ATENÇÃO: NÃO SE TRATA DE UM TUTORIAL, MAS DE UMA FUNCTION. COMO NÃO TEM UM LUGAR PARA FUNCTIONS, TIVE QUE POSTAR AQUI.
Nome: emarea(cid,frompos,topos)
Autor: Antharaz
Versão Testada: TFS 0.3.6 e TCS (todas versões)
Informações adicionais: Bem, não sei se já existe um function com este mesmo objetivo, mas eu pelo menos nunca vi. Ela verifica se determinado player está em certa área.
Como se usar:
Declare 2 variáveis, uma com as coordenadas do 1º sqm superior esquerdo da área e outro com as coordenadas do último sqm da parte inferior direita da área.
A da parte superior esquerda corresponde a frompos e a outra a topos. Não precisa colocar a coordenada z de cada sqm, isto é OPCIONAL, mas se colocar, coloque a do andar mais baixó no frompos e a do último andar que deseja verificar na topos.
Caso o player esteja na área, irá retornar TRUE, caso não esteje, irá retornar false.
Exemplos:
Abaixo haverá um exemplo no qual eu usei a function em uma talkction:
1º - usando com a coordenada Z
local frompos = {x=517,y=460,z=3} local topos = {x=524,y=464,z=1} function onSay(cid, words, param, channel) if emarea(cid,frompos,topos) then doBroadcastMessage("Está na área.") else doBroadcastMessage("Não está na área.") end return TRUE end
Resultado com god na pos [X: 520] [Y: 462] [Z: 2]
Resultado com god na pos [X: 520] [Y: 463] [Z: 4]
2º - retirando a coordenada z das variáveis:
local frompos = {x=517,y=460} local topos = {x=524,y=464} function onSay(cid, words, param, channel) if emarea(cid,frompos,topos) then doBroadcastMessage("Está na área.") else doBroadcastMessage("Não está na área.") end return TRUE end
Resultado com god na pos [X: 520] [Y: 462] [Z: 2]
Resultado com god na pos [X: 520] [Y: 463] [Z: 4]
Como deu para ver pelas SSs, a diferença entre colocar o Z e não colocar, é que ele também verificará o andar.
Abaixo segue o code da function:
function emarea(cid,frompos,topos) if frompos.x <= getThingPos(cid).x and topos.x >= getThingPos(cid).x and frompos.y <= getThingPos(cid).y and topos.y >= getThingPos(cid).y then if frompos.z and topos.z then if frompos.z >= getThingPos(cid).z and topos.z <= getThingPos(cid).z then return TRUE end else return TRUE end end return FALSE end
-
CarlosPain reacted to Fickss10 in Spears E Stars Infinitas
Bem, este tutorial serve para quem está afim de deichar spears e stars infinitas, já que em novas versões o ammunition só conta como arrows e bolts!
Primeiramente abra a pasta de seu ot, abra a pasta data e seguidamente a pasta items seguindo assim:
C:\Seuot\data\items
C: é o disco aonde está o seu ot, podendo ser D, E ou até G dependendo do sistema operacional (Ubuntu)
Após abrir a pasta items, procure um arquivo com o nome items.xml, abra-o com o bloco de notas ou algum xml editor.
de Ctrl + F e procure por alguma spear ou star (exemplo: assassin star, hunting spear)
Usarei a Assassin Star como exemplo
Bem agora você removera a attribute key ammoaction, e mudará a breakchance para 0 ficando assim:
Agora a sua assassin star está infinita, porém a outros itens do mesmo tipo que precisam ser infinitos, faça o mesmo processo em todos.
Para-lhe ajudar deicharei aqui os nomes dos seguintes itens que precisam ser infinitos:
Spear
Hunting Spear
Royal Spear
Enchanted Spear
Snowball
Small Stone
Throwing Knife
Viper Star
Throwing Star
Assassin Star
Dica: Se se ot for rate (XP) baixa, não deiche os itens infinitos, porém faça oque lhe der vontade
-
Recently Browsing 0 members
- No registered users viewing this page.