Postado Agosto 1, 2019 5 anos Este é um post popular. Fala galera do TK tudo belezura? Espero que sim com todo mundo... Peço caridosamente a moderação que me mova para a área correta caso eu tenha feito o post no lugar errado. ?? Bom o que eu vim trazer na faixa para vocês é um sistema onde o jogador vai poder ter um PET que vai subindo até certo level e com isso vai ganhando mais força. Eu me baseei no sistema desse amiguinho aqui: @PsyMcKenzie Link para o Post do amiguinho. Onde eu vi que tava muito legal mas estavam faltando algumas verificações. Demorei para fazer esses scripts e toda a lógica mexendo apenas 2 horas por dia, por isso vou dar um alert: <<<< -------------------- >>>> "PAM: não me peça para mudar scripts ou adaptar de algum jeito pois eu não vou ter muito tempo para atender pedidos. Vou postar do jeito que está funcionando e se por acaso precisar de ajuste, peço para que outros scripters dêem a devida atenção. Obrigado pela compreensão amiguinhos ?" <<<< -------------------- >>>> Vamos lá, saiba que você vai ter que alterar várias partes de vários fontes, então deixa de preguiça e coloque a mão na massa... Espero que esse script incentive a continuação e aperfeiçõamento de mais desenvolvedores a trabalhar com a nossa comunidade. Na sua pasta de Movements Ex.: "Pasta do Ot Sever\data\movements" no arquivo movements.xml acrescente essas 2 tags: Citar <movement type="Equip" itemid="9980" slot="ammo" event="script" value="equippet.lua"/> <movement type="DeEquip" itemid="9980" slot="ammo" event="script" value="equippet.lua"/> Na pasta scripts dentro da pasta Movements Ex.: "Pasta do Ot Server\data\movements\scripts" crie um arquivo com nome equippet.lua e cole isso dentro do arquivo Citar messagesinvoke = { "Hora de treinar ", "Vamos nessa ", "Hora da aventura ", "Chega de descanso ", "Vai ", "Vamos " } messagesdevoke = { "Por hoje chega ", "Vamos para casa ", "Acredito que ja basta ", "Chega de treinar ", "Volte " } function onEquip(cid, item) if tonumber(getItemAttribute(item.uid, "status")) ~= nil then namepet = getItemAttribute(item.uid, "namepet") description = getItemAttribute(item.uid, "description") lifepet = tonumber(getItemAttribute(item.uid, "lifepet")) maxlifepet = tonumber(getItemAttribute(item.uid, "maxlifepet")) level = tonumber(getItemAttribute(item.uid, "level")) experience = tonumber(getItemAttribute(item.uid, "experience")) basename = getItemAttribute(item.uid, "basename") domador = getItemAttribute(item.uid, "domador") status = tonumber(getItemAttribute(item.uid, "status")) itemdopet = 9980 if status == 2 then doPlayerSendTextMessage(cid, 28, "Seu Pet esta morto.") return false end --[[ Este condicional verifica se o player não está em protection zone ]] if getTilePzInfo(getPlayerPosition(cid)) then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendTextMessage(cid, 28, "Saia da Protection Zone para chamar seu pet.") return false --[[ Esse condicional verifica se já existe um summon criado e nao permite chamar o pet ]] elseif #getCreatureSummons(cid) > 0 and getCreatureName(getCreatureSummons(cid)[1]) ~= namepet then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendTextMessage(cid, 28, "Voce nao pode chamar seu Pet com um summon ja criado.") return false --[[ Este condicional restaura o status do pet caso o player tenha removido o monstro com battle status ]] elseif #getCreatureSummons(cid) > 0 and getCreatureName(getCreatureSummons(cid)[1]) == namepet and getItemAttribute(item.uid, "status") == 1 then return true --[[ Esse condicional verifica se não existe um Pet, se o status no item de Pet é = 0 e se o jogador não está em PZ, se for ele entra aqui e faz o Pet. ]] elseif #getCreatureSummons(cid) == 0 and status == 0 and not getTilePzInfo(getPlayerPosition(cid)) then local summon = doSummonCreature(basename..level, getThingPos(cid)) doConvinceCreature(cid, summon) setCreatureMaxHealth(summon, maxlifepet) doCreatureAddHealth(summon, maxlifepet) doCreatureAddHealth(summon, lifepet - maxlifepet) doItemSetAttribute(item.uid, "status", 1) db.executeQuery("INSERT INTO `pet_experience_info_system` (`id`, `experience_base`) values(\'"..getPlayerGUID(cid).."\', \'"..getPlayerExperience(cid).."\');") doCreatureSay(cid, messagesinvoke[math.random(1, #messagesinvoke)]..namepet.."!", TALKTYPE_SAY) return true --[[ Esse condicional verifica se não existe um Pet e se o status no item de Pet é = 1, significa que ele está morto, e ele retira o item que sumona o Pet do jogador. ]] elseif #getCreatureSummons(cid) == 0 and status == 1 then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendTextMessage(cid, 28, "Este Pet esta morto.") doItemSetAttribute(item.uid, "status", 2) return false end end return false end function onDeEquip(cid, item) namepet = getItemAttribute(item.uid, "namepet") description = getItemAttribute(item.uid, "description") lifepet = tonumber(getItemAttribute(item.uid, "lifepet")) maxlifepet = tonumber(getItemAttribute(item.uid, "maxlifepet")) level = tonumber(getItemAttribute(item.uid, "level")) experience = tonumber(getItemAttribute(item.uid, "experience")) basename = getItemAttribute(item.uid, "basename") domador = getItemAttribute(item.uid, "domador") status = tonumber(getItemAttribute(item.uid, "status")) itemdopet = 9980 --[[ Esse condicional vai verificar se existe um summon e se é o PET, se for ele traz o pet de volta. ]] if status == 2 then doPlayerSendTextMessage(cid, 28, "Seu Pet esta morto.") return false end if #getCreatureSummons(cid) > 0 and status == 1 and getCreatureName(getCreatureSummons(cid)[1]) == namepet then -- [[ Esse condicional verifica se o player esta com Battle Status, se tiver nao remove o Pet. ]] if getCreatureCondition(cid, CONDITION_INFIGHT) then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) updateAttributes(cid, item) doPlayerSendTextMessage(cid, 27, "Voce precisa perder o Battle Status antes de trazer seu Pet de volta") return false end if not getCreatureCondition(cid, CONDITION_INFIGHT) then doCreatureSay(cid, messagesdevoke[math.random(1, #messagesdevoke)]..namepet.."!", TALKTYPE_SAY) updateAttributes(cid, item) doRemoveCreature(getCreatureSummons(cid)[1]) return true end --[[ Esse condicional vai verificar se existe um summon e se é o PET sumonado, se não for ele entra no condicional e remove o item que sumona o pet do jogador. ]] elseif #getCreatureSummons(cid) > 0 and status == 1 and getCreatureName(getCreatureSummons(cid)[1]) ~= namepet then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) updateAttributes(cid, item) doPlayerSendTextMessage(cid, 28, "Esse nao eh seu Pet. Seu Pet esta morto.") doItemSetAttribute(item.uid, "status", 2) return false end return false end function updateAttributes(cid, item) local experiencebase = db.getResult("SELECT * FROM `pet_experience_info_system` WHERE `id` = "..getPlayerGUID(cid)..";") local experiencenew = (tonumber(getPlayerExperience(cid) - tonumber(experiencebase:getDataInt("experience_base"))) + experience) --[[ Atualizacao dos atributos na remoção do PET ]] -- [[ Essa parte faz a verificação do level do PET com base na experiencia ]] if getItemAttribute(item.uid, "level") == 0 and experiencenew >= 100000 then doItemSetAttribute(item.uid, "level", 1) doItemSetAttribute(item.uid, "maxlifepet", tonumber(maxlifepet * 1.2)) end if getItemAttribute(item.uid, "level") == 1 and experiencenew >= 1000000 then doItemSetAttribute(item.uid, "level", 2) doItemSetAttribute(item.uid, "maxlifepet", tonumber(maxlifepet * 1.2)) end if getItemAttribute(item.uid, "level") == 2 and experiencenew >= 10000000 then doItemSetAttribute(item.uid, "level", 3) doItemSetAttribute(item.uid, "maxlifepet", tonumber(maxlifepet * 1.2)) end if getItemAttribute(item.uid, "level") == 3 and experiencenew >= 100000000 then doItemSetAttribute(item.uid, "level", 4) doItemSetAttribute(item.uid, "maxlifepet", tonumber(maxlifepet * 1.2)) end if getItemAttribute(item.uid, "level") == 4 and experiencenew >= 1000000000 then doItemSetAttribute(item.uid, "level", 5) doItemSetAttribute(item.uid, "maxlifepet", tonumber(maxlifepet * 1.2)) end if getItemAttribute(item.uid, "level") == 5 and experiencenew >= 10000000000 then doItemSetAttribute(item.uid, "level", 6) doItemSetAttribute(item.uid, "maxlifepet", tonumber(maxlifepet * 1.2)) end if getItemAttribute(item.uid, "level") == 6 and experiencenew >= 100000000000 then doItemSetAttribute(item.uid, "level", 7) doItemSetAttribute(item.uid, "maxlifepet", tonumber(maxlifepet * 1.2)) end if getItemAttribute(item.uid, "level") == 7 and experiencenew >= 1000000000000 then doItemSetAttribute(item.uid, "level", ? doItemSetAttribute(item.uid, "maxlifepet", tonumber(maxlifepet * 1.2)) end if getItemAttribute(item.uid, "level") == 8 and experiencenew >= 10000000000000 then doItemSetAttribute(item.uid, "level", 9) doItemSetAttribute(item.uid, "maxlifepet", tonumber(maxlifepet * 1.2)) end if getItemAttribute(item.uid, "level") == 9 and experiencenew >= 100000000000000 then doItemSetAttribute(item.uid, "level", 10) doItemSetAttribute(item.uid, "maxlifepet", tonumber(maxlifepet * 1.2)) end --[[ Essa parte atualiza experiencia e a life do PET caso ele tenha sofrido dano durante batalhas ]] doItemSetAttribute(item.uid, "lifepet", getCreatureHealth(getCreatureSummons(cid)[1])) doItemSetAttribute(item.uid, "experience", experiencenew) doItemSetAttribute(item.uid, "status", 0) doItemSetAttribute(item.uid, "description", "Contem um "..namepet..", Level: "..getItemAttribute(item.uid, "level")..", Xp: "..experiencenew.." Domado por: "..domador..".") db.executeQuery("DELETE FROM `pet_experience_info_system` WHERE `id` = " ..getPlayerGUID(cid).. ";") end Na pasta Actions Ex.: "Pasta do Ot Server\data\actions" no arquivo actions.xml cole a TAG: Citar <action itemid="2263" event="script" value="catchpet.lua"/> Na pasta Scripts em Actions Ex.: "Pasta do Ot Server\data\actions\scripts" crie um arquivo chamado catchpet.lua e cole isso dentro: Citar -- [[ Essa parte monta a lista de monstros que podem ser capturados ]] local mtrs = { ["Rat Pet"] = {hp = 500, maxhp = 1000, corpse = 2813, chance = 100, level = 0, experience = 0, basename = 'Rat Pet'}, ["Dragon Lord Pet"] = {hp = 500, maxhp = 500, corpse = 7622, chance = 100, level = 0, experience = 0, basename = 'Dragon Lord Pet'} } function onUse(cid, item, frompos, item2, topos) local petCount = db.getResult("SELECT `player_id` FROM `pet_all_info_system` WHERE `player_id` = " ..getPlayerGUID(cid).. ";") local marcador = 0 for pet_name, v in pairs(mtrs) do if item2.itemid == v.corpse then marcador = 1 if math.random(0,100) <= v.chance then doPlayerSendTextMessage(cid, 25, "Voce transformou esse monstro em um Pet.\nParabens!!!!") doSendMagicEffect(getCreaturePosition(cid), 28) doRemoveItem(item2.uid, 1) doRemoveItem(item.uid, 1) db.executeQuery("INSERT INTO `pet_all_info_system` (`player_id`,`player_name`,`pet_name`,`pet_level`,`pet_experience`,`pet_hp`,`pet_hp_max`,`pet_base_name`,`date`) values ("..getPlayerGUID(cid)..", \'"..getPlayerName(cid).."\', \'"..v.basename.."\', "..v.level..", "..v.experience..", "..v.hp..", "..v.maxhp..", \'"..v.basename.."0\', "..os.time()..")") local itemcatch = doPlayerAddItem(cid, 9980, 1, false, 1, 3) -- Cristal que contem o monstro. doItemSetAttribute(itemcatch, "namepet", pet_name) doItemSetAttribute(itemcatch, "name", pet_name) doItemSetAttribute(itemcatch, "description", "Contem um "..pet_name..", Level: "..v.level..", Xp: "..v.experience.." Domado por: "..getPlayerName(cid)..".") doItemSetAttribute(itemcatch, "lifepet", v.hp) doItemSetAttribute(itemcatch, "maxlifepet", v.maxhp) doItemSetAttribute(itemcatch, "level", v.level) doItemSetAttribute(itemcatch, "experience", v.experience) doItemSetAttribute(itemcatch, "domador", getPlayerName(cid)) doItemSetAttribute(itemcatch, "basename", v.basename) doItemSetAttribute(itemcatch, "status", 0) else doRemoveItem(item2.uid, 1) doRemoveItem(item.uid, 1) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doPlayerSendTextMessage(cid, 28, "Voce nao conseguiu capturar esse monstro.") end end end if marcador == 0 then return doPlayerSendTextMessage(cid, 28, "Esse monstro nao pode ser capturado.") end return true end Na pasta creaturescripts Ex.: "Pasta do Ot Server\data\creaturescripts" no arquivo creaturescripts.xml cole a TAG: Citar <event type="logout" name="LogoutSave" event="script" value="save.lua"/> No arquivo dentro da pasta Scripts em CreatureScripts Ex.: "Pasta do Ot Server\data\creaturescripts\scripts" com o arquivo login.lua aberto, procure por "registerCreatureEvent" e adicione abaixo de qualquer um, a seguinte linha de comando: Citar registerCreatureEvent(cid, "LogoutSave") Se o seu Ot server tiver o arquivo save.lua dentro da pasta de creaturescripts Ex.: "Pasta do Ot Server\creaturescripts\scripts\save.lua" você precisa adaptar o script abaixo para se adequar ao seu save.lua. caso seu ot server não tenha o arquivo save.lua apenas insira o script abaixo: Citar function onLogout(cid) local itemdopet = 9980 local checkpet = (getCreatureSummons(cid)[1]) local itemnoslot = getPlayerSlotItem(cid, CONST_SLOT_AMMO) if not checkpet or not tonumber(checkpet) then else if itemnoslot.itemid == itemdopet then doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF) doItemSetAttribute(itemnoslot.uid, "status", 0) for _, pid in ipairs(getCreatureSummons(cid)) do doRemoveCreature(pid) end db.executeQuery("DELETE FROM `pet_experience_info_system` WHERE `id` = " ..getPlayerGUID(cid).. ";") doPlayerSave(cid, true) return true end end doPlayerSave(cid, true) return true end Na pasta Monster Ex.: "Pasta do Ot Server\data\monster" no arquivo monster.xml você vai precisar inserir as tags dos pets que for adicionando, por exemplo no meu caso eu criei 5 níveis de pet e você vai entender porque na explicação mais a frente. Citar <monster name="Dragon Lord Pet0" file="Pet/Dragon Lord Pet0.xml"/> <monster name="Dragon Lord Pet1" file="Pet/Dragon Lord Pet1.xml"/> <monster name="Dragon Lord Pet2" file="Pet/Dragon Lord Pet2.xml"/> <monster name="Dragon Lord Pet3" file="Pet/Dragon Lord Pet3.xml"/> <monster name="Dragon Lord Pet4" file="Pet/Dragon Lord Pet4.xml"/> <monster name="Dragon Lord Pet5" file="Pet/Dragon Lord Pet5.xml"/> Na pasta Scripts em Monster Ex.: "Pasta do Ot Server\data\monster\scripts" crie uma pasta chamada Pet e dentro dela o monstro deve ter o mesmo nome que está no arquivo "catchpet.lua" que criamos no começo do processo. Por exemplo no arquivo catchpet.lua que criamos o pet do Dragon Lord está definido como ["Dragon Lord Pet"] = {hp = 500, maxhp = 500, corpse = 7622, chance = 100, level = 0, experience = 0, basename = 'Dragon Lord Pet'} então o monstro deve ser Dragon Lord Pet seguido dos níveis: 0, 1, 2, 3, 4, 5, 6. Por exemplo dentro da pasta "Pasta do Ot Server\data\monster\scripts\Pet" tem que ter os monstros DragonLord Pet0.xml, DragonLord Pet1.xml, DragonLord Pet2.xml, DragonLord Pet3.xml ---------------------------------- Na pasta lib Ex.: "Pasta do Ot Server\data\lib" acrescente no fim do arquivo 050-function.lua o script abaixo: Obs.: Esse script foi feito pelo amiguinho @Orochi Elf e ficou espetacular, parabéns cara... eu só precisei remover o local da variável item pq quando o script verificava itens na BP e nos Slots estava fechando o servidor. Mas o crédito é todo dele, ótimo desenvolvedor sem dúvida. Citar function getPlayerItems(cid, id) local retItems = {} for slots = 1, 10 do item = getPlayerSlotItem(cid, slots) if isContainer(item.uid) then for slotsBp = 0, getContainerSize(item.uid) - 1 do local itemBp = getContainerItem(item.uid, slotsBp) if id ~= nil then if itemBp.itemid == id then table.insert(retItems, itemBp) end else table.insert(retItems, itemBp) end end end if id ~= nil then if item.itemid == id then table.insert(retItems, item) end else table.insert(retItems, item) end end return retItems end Na pasta npc Ex.: "Pasta do Ot Server\data\npc" crie um arquivo com nome PetHealer.xml e acrescente o código abaixo: Citar <?xml version="1.0" encoding="UTF-8"?> <npc name="Curandeiro de animais" script="pethealer.lua" walkinterval="2000" floorchange="0"> <health now="100" max="100"/> <look type="128" head="17" body="54" legs="114" feet="0" addons="2"/> <parameters> <parameter key="message_greet" value="Ola |PLAYERNAME|, eu sou um curandeiro de animais. Se tiver {duvidas} basta perguntar."/> </parameters> </npc> Na pasta Scripts de npc Ex.: "Pasta do Ot Server\data\npc\scripts" crie um arquivo com nome pethealer.lua e acrescente o código abaixo: Obs.: Esse script do TalkAlot não fui eu quem desenvolveu, foi alguém aqui do fórum mas tem muito tempo que eu peguei e uso e não lembro a quem devo os créditos, foi mal ai... Citar local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local npcTalkState = 0 function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end function doCreatureSayWithDelay(cid,text,type,delay,e) if delay<=0 then doCreatureSay(cid,text,type) else local func=function(pars) doCreatureSay(pars.cid,pars.text,pars.type) pars.e.done=TRUE end e.done=FALSE e.event=addEvent(func,delay,{cid=cid, text=text, type=type, e=e}) end end function cancelNPCTalk(events) local ret=1 for aux=1,table.getn(events) do if events[aux].done==FALSE then stopEvent(events[aux].event) else ret=ret+1 end end events=nil return(ret) end function doNPCTalkALot(msgs,interval) local e={} local ret={} if interval==nil then interval=3000 end for aux=1,table.getn(msgs) do e[aux]={} doCreatureSayWithDelay(getNpcCid(),msgs[aux],TALKTYPE_PRIVATE_NP,(aux-1)*interval,e[aux]) table.insert(ret,e[aux]) end return(ret) end function creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end if ((msgcontains(msg, 'duvidas') or msgcontains(msg, 'duvida')) and npcTalkState == 0) then npcHandler:say('Posso esclarecer varias duvidas. Sobre o que quer saber? {Capturar}, {Treinar}, {Curar}, {Ressucitar}, {Detalhes}.', cid) end if ((msgcontains(msg, 'Capturar') or msgcontains(msg, 'capturar') or msgcontains(msg, 'Captura') or msgcontains(msg, 'captura')) and npcTalkState == 0) then local msg={ "Para capturar um animal eh simples...", "Voce precisa encontrar um item magico que vai fazer com que ele te siga...", "Esses itens magicos podem ser conseguidos de muitas formas...", "Podem ser conseguidos em quests, premio de eventos que ocorrem pela cidade ou por criaturas magicas...", "Duvida sobre mais alguma coisa? {Capturar}, {Treinar}, {Utilizar}, {Curar}, {Ressucitar}, {Detalhes}." } doNPCTalkALot(msg,4000) end if ((msgcontains(msg, 'Treinar') or msgcontains(msg, 'treinar') or msgcontains(msg, 'Treina') or msgcontains(msg, 'treina')) and npcTalkState == 0) then local msg={ "Para treinar seu animal eh um processo bem simples", "Voce precisa colocar o item correspondente ao animal, no seu slot de flechas...", "Com isso ele vai ser invocado para trabalhar com voce...", "Para fazer com que ele nao fique exposto a nenhum risco, voce precisa tirar o item do slot de flechas...", "E isso vai mante-lo a salvo e em seguranca...", "Voce pode usa-lo em suas lutas, ou apenas como animal de estimacao, ou em exposicoes que ocorrem pela cidade...", "Para fazer com que ele fique mais forte ele precisa lutar com voce...", "Duvida sobre mais alguma coisa? {Capturar}, {Treinar}, {Utilizar}, {Curar}, {Ressucitar}, {Detalhes}." } doNPCTalkALot(msg,4000) end if ((msgcontains(msg, 'Curar') or msgcontains(msg, 'curar') or msgcontains(msg, 'Cura') or msgcontains(msg, 'cura')) and npcTalkState == 0) then local msg={ "Para curar seus animais voce pode utilizar as mesmas ferramentas que usa em si mesmo...", "Como por exemplo runas, magias de cura ou pocoes...", "Duvida sobre mais alguma coisa? {Capturar}, {Treinar}, {Utilizar}, {Curar}, {Ressucitar}, {Detalhes}." } doNPCTalkALot(msg,4000) end if ((msgcontains(msg, 'Ressucitar') or msgcontains(msg, 'ressucitar') or msgcontains(msg, 'Ressucita') or msgcontains(msg, 'ressucita')) and npcTalkState == 0) then local msg={ "Somente um curandeiro de animais pode ressucitar seu animal...", "Somente nos possuimos as ferramentas magicas corretas para esse processo...", "Se for o caso basta me pedir para {Reanimar} seu animal que eu o farei por uma irrisoria quantia de dinheiro...", "Duvida sobre mais alguma coisa? {Capturar}, {Treinar}, {Utilizar}, {Curar}, {Ressucitar}, {Detalhes}." } doNPCTalkALot(msg,4000) end if ((msgcontains(msg, 'Detalhes') or msgcontains(msg, 'detalhes') or msgcontains(msg, 'Detalhe') or msgcontains(msg, 'detalhe')) and npcTalkState == 0) then local msg={ "Um animal nao pode ser invocado em uma area de protecao(protection zone - PZ)...", "Um animal nao pode ser colocado em seguranca se voce estiver em combate(procetion zone locked - PZ Locked)...", "Voce nao pode invocar um animal se estiver com um summon ja ao seu lado...", "As informacoes de um animal so atualizam quando ele eh posto em seguranca...", "Ou seja removido do seu arrow slot(slot de flechas)...", "Informacoes do tipo: Level, Experiencia, Quantidade de vida maxima, Ataques e etc...", "Duvida sobre mais alguma coisa? {Capturar}, {Treinar}, {Utilizar}, {Curar}, {Ressucitar}, {Detalhes}." } doNPCTalkALot(msg,4000) end if ((msgcontains(msg, 'Reanimar') or msgcontains(msg, 'reanimar') or msgcontains(msg, 'Reanima') or msgcontains(msg, 'reanima')) and npcTalkState == 0) then contadorPetDead = 0 if getPlayerItemCount(cid, 9980) > 0 then for _, item in ipairs(getPlayerItems(cid, 9980)) do -- Retornaria a quantidade e o nome do item, cuja o ID fosse (2160). if tonumber(getItemAttribute(item.uid, "status")) == 2 then -- Status = 2 significa morto contadorPetDead = contadorPetDead + 1 npcTalkState = 1 end end end if contadorPetDead == 0 then local msg={ "Voce nao tem animais mortos." } doNPCTalkALot(msg,2000) end end if npcTalkState == 1 and contadorPetDead == 1 and (getPlayerMoney(cid) >= 300000) then local msg={ "Eu encontrei "..contadorPetDead.." animal morto posso reanima-lo por uma quantia singela de 300000 golds?" } npcTalkState = 2 doNPCTalkALot(msg,2000) end if npcTalkState == 1 and contadorPetDead > 1 and (getPlayerMoney(cid) >= 300000) then local msg={ "Eu encontrei "..contadorPetDead.." animais mortos posso reanima-los por uma quantia singela de 300000 golds cada?" } npcTalkState = 2 doNPCTalkALot(msg,2000) end -- esse condicional significa que o player pediu para reanimar o pet e ele encontrou algum morto if ((msgcontains(msg, 'yes') or msgcontains(msg, 'Yes') or msgcontains(msg, 'y') or msgcontains(msg, 'Y')) and npcTalkState == 2 and getPlayerMoney(cid) >= 300000) then for _, item in ipairs(getPlayerItems(cid, 9980)) do if tonumber(getItemAttribute(item.uid, "status")) == 2 and getPlayerMoney(cid) >= 300000 then doItemSetAttribute(item.uid, "lifepet", tonumber(getItemAttribute(item.uid, "maxlifepet"))) doItemSetAttribute(item.uid, "status", 0) doPlayerRemoveMoney(cid, 300000) end local msg={ "Seu animal foi trazido de volta." } doNPCTalkALot(msg,2000) end npcTalkState = 0 elseif getPlayerMoney(cid) < 300000 then local msg={ "Voce nao tem dinheiro suficiente." } doNPCTalkALot(msg,2000) end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) Execute essa query no seu banco de dados: Citar CREATE TABLE `pet_all_info_system` ( `id` int(11) NOT NULL auto_increment, `player_id` int(11) NOT NULL, `player_name` varchar(255) NOT NULL, `pet_name` varchar(255) NOT NULL, `pet_level` int(11) NOT NULL, `pet_experience` int(11) NOT NULL, `pet_hp` int(11) NOT NULL, `pet_hp_max` int(11) NOT NULL, `pet_base_name` varchar(255) NOT NULL, `date` int(11), PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1; CREATE TABLE `pet_experience_info_system` ( `id` int(11) NOT NULL, `experience_base` bigint(11) NOT NULL, PRIMARY KEY (`id`) )ENGINE=MyISAM DEFAULT CHARSET=latin1; E agora finalmente a explicação do código: Bom primeiramente o sistema inicial estava utilizando actions e não movements, mas eu resolvi colocar como movements para evitar um pouco de transtorno na lógica apesar de não ter evitado muito... Bem, o sistema consiste em utilizar um item no corpse de um monstro morto para capturá-lo essa é a função do script: catchpet.lua as definições de monstros que podem ser capturados estão no objeto local mtrs = { ["Rat Pet"] = {hp = 500, maxhp = 1000, corpse = 2813, chance = 100, level = 0, experience = 0, basename = 'Rat Pet'}, ["Dragon Lord Pet"] = {hp = 500, maxhp = 500, corpse = 7622, chance = 100, level = 0, experience = 0, basename = 'Dragon Lord Pet'} } Como podem ver o nome entre colchetes e o basename são iguais e tem que ser assim para não dar nenhum erro... o base name tem que ser o mesmo nome do monstro criado na pasta monster\Pet... na pasta como falei antes, o basename tem que ser acompanhado dos níveis no caso do Rat por exemplo, seria Rat Pet0.xml, Rat Pet1.xml, Rat Pet2.xml, até o nível que você determinar, esse sistema do jeito que está, habilita os pets até o nível 10. Os pets são como summons, então coisas relacionadas a ATK, DEF, Magias que os pets tem, tem que ser configuradas no arquivo do monstro. Por exemplo se eu quiser que um Rat nível 2 use UE, vou configurar isso no XML Rat Pet2.xml - hp e maxhp, são as configurações para o hp máximo e hp atual, - chance é a chance em % que o player tem de capturar o monstro, - corpse é o id do corpo que o player pode usar o item para capturar o monstro. na linha de comando "local itemcatch = doPlayerAddItem(cid, 9980, 1, false, 1, 3) -- Cristal que contem o monstro." o id 9980 é o item que vai armazenar as informações do pet e isso você pode mudar sem a necessidade de mexer no items.xml. Obs.: Lembrando que se esse id for alterado, você precisa verificar nos fontes onde mais ele faz referência para esse id, por exemplo no save.lua na pasta data\creaturescripts\scripts Obs2.: não use itens stackáveis pois eles perdem a informação do pet quando você os movimenta, pelo menos nessa source que eu estou usando. O itemid definido na tag actions.xml é o item que vai ser usado na captura do monstro. No fonte do equippet.lua as informações cruciais são: Toda vez que que o pet é equipado com sucesso, uma linha é gravada na database com o xp do player atualmente, e quando desequipado com sucesso, essa linha é removida, e a diferença de exp adiquirida é acrescentada no Pet. Você pode alterar as condições de level do Pet dentro do método updateAttributes. O arquivo save.lua só foi alterado para avaliar algumas condições antes do player deslogar caso ele esteja com o pet. Para usar o pet, vc precisa estar com o item do pet capturado e colocar no slot da flecha, se as condições estiverem certas ele sumona o pet. Se o item for removido do slot e tiver com as condições corretas, ele remove o summon. O sistema não tem muitos efeitos especiais pois acredito que isso é uma coisa particular de cada Host. Se por acaso o pet for morto, o PetHealer pode trazê-lo de volta por uma quantia de 300k mas isso pode ser alterado no script é bem simples. Além disso o NPC PetHealer tem uma micro IA que explica como utilizar o Pet. <<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Bom, espero que vocês gostem do sistema, testem e me avaliem nos comentários se tiverem algum problema e se for útil para você, da um REP++ ai ? <<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Editado Agosto 1, 2019 5 anos por Azzus22 Alteração no rodapé (veja o histórico de edições)
Postado Agosto 3, 2019 5 anos Parabéns, seu tópico de conteúdo foi aprovado! Muito obrigado pela sua contribuição, nós do Tibia King agradecemos. Seu conteúdo com certeza ajudará à muitos outros, você recebeu +1 REP. Spoiler Congratulations, your content has been approved! Thank you for your contribution, we of Tibia King we are grateful. Your content will help many other users, you received +1 REP.
Postado Agosto 6, 2019 5 anos @Azzus22 só não estou conseguindo executar a query na Database ( dando erro de syntax no ENGINE e auto_increment ) , to procurando no google mas não estou conseguindo , se tiver algum tutorialzinho aí já ajuda. REP++ pelo System Editado Agosto 6, 2019 5 anos por zLockey9 (veja o histórico de edições)
Postado Agosto 6, 2019 5 anos 1 hora atrás, zLockey9 disse: @Azzus22 só não estou conseguindo executar a query na Database ( dando erro de syntax no ENGINE e auto_increment ) , to procurando no google mas não estou conseguindo , se tiver algum tutorialzinho aí já ajuda. REP++ pelo System Tira um print do erro que eu tento ajudar.
Postado Agosto 6, 2019 5 anos 11 minutos atrás, Rayo disse: Tira um print do erro que eu tento ajudar. Não sei em que parte do SqlEditor eu executo , fiz uma cópia da database e to tentando de qualquer jeito aqui kkk mas apareceu esse erro aqui:
Participe da conversa
Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.