Ir para conteúdo

Featured Replies

Postado
  • 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.

 

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 por Azzus22
Alteração no rodapé (veja o histórico de edições)

  • Respostas 10
  • Visualizações 3.4k
  • Created
  • Última resposta

Top Posters In This Topic

Posted Images

Postado

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

@Azzus22 só não estou conseguindo executar a query na Database ( dando erro de syntax no ENGINE auto_increment ) , to procurando no google mas não estou conseguindo , se tiver algum tutorialzinho aí já ajuda.

REP++ pelo System

Editado por zLockey9 (veja o histórico de edições)

Postado
1 hora atrás, zLockey9 disse:

@Azzus22 só não estou conseguindo executar a query na Database ( dando erro de syntax no ENGINE 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
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:

Screenshot_78.png

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.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo