Ir para conteúdo
  • 0

Ajuda com NPC e CreatureEvents TASK


julhinhuu

Pergunta

Olá, tudo bem com vocês? Bem o que eu procuro é uma solução para meu problema... tenho o npc e creatureevents de uma task só que não conta os monstros, gostaria de saber o porque.

TFS:0.3.6

 

NPC XML:

<?xml version="1.0" encoding="UTF-8"?>
<npc name="Kahn" script="npcdragonstask.lua" walkinterval="2000" floorchange="0">
<health now="150" max="150"/>
<look type="129" head="95" body="116" legs="121" feet="115" addons="3"/>
<parameters>
<parameter key="message_greet" value="Ola |PLAYERNAME|! Meu nome e Kahn, sou cacador de {dragoes}."/>
</parameters>
</npc>

NPC SCRIPT:

 

 

 

local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}
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 creatureSayCallback(cid, type, msg)
if(not npcHandler:isFocused(cid)) then
return false
end

local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
local stoTime = 96588
local stoKill = 96589
local stoName = 96590
----
local msg = string.lower(msg)
local left = math.ceil((getPlayerStorageValue(cid, stoTime) - os.time())/(24 * 60 * 60)) --nao mexe!
local task = {
["dragon"] = {kill = "Dragon", qnt = 1500, exp = 1000000},
["dragon lord"] = {kill = "Dragon Lord", qnt = 1000, exp = 800000},
["hydra"] = {kill = "Hydra", qnt = 800, exp = 700000},
["frost dragon"] = {kill = "Frost Dragon", qnt = 600, exp = 500000},
["dragon guardian"] = {kill = "Dragon Guardian", qnt = 500, exp = 400000},
["thunder dragon"] = {kill = "Thunder Dragon", qnt = 400, exp = 300000},
["multi"] = {kill = "Multi", qnt = 200, exp = 200000},
["demodras"] = {kill = "Demodras", qnt = 300, exp = 200000},
}
local myTask = task[string.lower(getPlayerStorageValue(cid, stoName))] or {}


if (msgcontains(msg, 'dragoes') or msgcontains(msg, 'missao')) then
if getPlayerStorageValue(cid, stoTime) ~= -1 and left > 0 and getPlayerStorageValue(cid, stoKill) > 0 then
local faltaMatar = getPlayerStorageValue(cid, stoKill)
local jaMatou = math.abs(getPlayerStorageValue(cid, stoKill)-myTask.qnt)
local prazo = os.date("%d/%m/%y %X", getPlayerStorageValue(cid, stoTime))
selfSay("Você ainda não matou os "..myTask.qnt.." "..myTask.kill..", atualmente você matou ".. (jaMatou)..", resta "..faltaMatar..". Seu prazo é de até "..prazo..".", cid)
talkState[talkUser] = 0
return true
elseif getPlayerStorageValue(cid, stoTime) ~= -1 and left <= 0 and getPlayerStorageValue(cid, stoKill) ~= -1 then
selfSay("Infelismente você não matou os "..myTask.qnt.." "..myTask.kill.." a tempo. Se você quiser, você pode tentar fazer denovo a missao.", cid)
setPlayerStorageValue(cid, stoTime, -1)
setPlayerStorageValue(cid, stoKill, -1)
setPlayerStorageValue(cid, stoName, -1)
talkState[talkUser] = 0
return true
elseif getPlayerStorageValue(cid, stoTime) ~= -1 and left > 0 and getPlayerStorageValue(cid, stoKill) == -1 then
local prazo = os.date("%d/%m/%y %X", getPlayerStorageValue(cid, stoTime))
selfSay("Você tem que esperar pelo menos 1 semana para poder pegar essa tarefa denovo. O prazo acaba dia ".. prazo..".", cid)
talkState[talkUser] = 0
return true
elseif getPlayerStorageValue(cid, stoTime) ~= -1 and left > 0 and getPlayerStorageValue(cid, stoKill) == 0 then
selfSay("Obrigado! você matou os "..myTask.qnt.." "..myTask.kill.." em menos de 1 semana. Aqui esta sua recompensa! Lembre-se que você pode fazer esta task quantas vezes quiser,desde que tenha concluído 1 semana contado a partir do dia de inicio.", cid)
doPlayerAddExp(cid, myTask.exp) --premio
setPlayerStorageValue(cid, stoKill, -1)
setPlayerStorageValue(cid, stoName, -1)
talkState[talkUser] = 0
return true
else
if getPlayerStorageValue(cid, stoTime) ~= -1 and getPlayerStorageValue(cid, stoKill) == -1 then
setPlayerStorageValue(cid, stoTime, -1) --soh pra evitar problemas...
end
selfSay("Eu caço vários tipos, como dragon, dragon lord, hydra, frost dragon, dragon guardian, thunder dragon e demodras. Você quer me ajudar a caçar um deles? Qual?", cid)
talkState[talkUser] = 1
end

elseif task[msg] and talkState[talkUser] == 1 then
setPlayerStorageValue(cid, stoName, task[msg].kill)
myTask = task[string.lower(getPlayerStorageValue(cid, stoName))]
selfSay("Ótimo! Você precisa matar pelo menos "..myTask.qnt.." "..myTask.kill.." em um prazo de 1 semana para te dar recompensa. Aceita?", cid)
talkState[talkUser] = 2

elseif (msgcontains(msg, 'no') or msgcontains(msg, 'nao')) and talkState[talkUser] == 2 then
selfSay("Ok então, fale comigo denovo quando você quiser me ajudar a matar esses malditos dragões!", cid)
talkState[talkUser] = 0

elseif (msgcontains(msg, 'yes') or msgcontains(msg, 'sim')) and talkState[talkUser] == 2 then
local semana = 7 * 24 * 60 * 60
setPlayerStorageValue(cid, stoTime, os.time()+semana)
setPlayerStorageValue(cid, stoKill, myTask.qnt)
setPlayerStorageValue(cid, stoName, myTask.kill)
local sto = getPlayerStorageValue(cid, stoTime)
selfSay("Você já pode começar a matar os ".. (myTask.kill) ..", mas cuidado! É uma criatura muito forte. Volte aqui quando matar ".. (myTask.qnt) .." ".. (myTask.kill) .." para ser recompensado. O prazo é até ".. os.date("%d/%m/%y %X", sto) ..".", cid)

end

return true
end

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

Agora CreatureEvents XML:

local function isSummon(cid)
if not isCreature(cid) then return false end
if getCreatureMaster(cid) ~= cid then
return true
end
return false
end

function onDeath(cid, corpse, deathList)

local stoTime = 96586
local stoKill = 96587
local stoName = 96587
local task = {
["dragon"] = {kill = "Dragon", qnt = 1500, exp = 1000000},
["dragon lord"] = {kill = "Dragon Lord", qnt = 1000, exp = 800000},
["hydra"] = {kill = "Hydra", qnt = 800, exp = 700000},
["frost dragon"] = {kill = "Frost Dragon", qnt = 600, exp = 500000},
["dragon guardian"] = {kill = "Dragon Guardian", qnt = 500, exp = 400000},
["thunder dragon"] = {kill = "Thunder Dragon", qnt = 400, exp = 300000},
["multi"] = {kill = "Multi", qnt = 600, exp = 200000},
["demodras"] = {kill = "Demodras", qnt = 300, exp = 200000},
}

for a = 1, #deathList do
local pk = deathList[a]
local myTask = task[string.lower(getPlayerStorageValue(pk, stoName))]
local left = math.ceil((getPlayerStorageValue(pk, stoTime) - os.time())/(24 * 60 * 60))

if myTask and getCreatureName(cid) == getPlayerStorageValue(pk, stoName) and not isSummon(cid) then
if left > 0 and getPlayerStorageValue(pk, stoKill) > 0 then
setPlayerStorageValue(pk, stoKill, getPlayerStorageValue(pk, stoKill) - 1)
local sto = getPlayerStorageValue(pk, stoKill)
local jaMatou = math.abs(getPlayerStorageValue(pk, stoKill)-myTask.qntdade)

if sto == 0 then
doPlayerSendTextMessage(pk, 22, "["..myTask.kill.." Task Finalizada] ("..myTask.qntdade.."/"..myTask.qnt..")")
else
doPlayerSendTextMessage(pk, 22, "["..myTask.kill.." Task] ("..jaMatou.."/"..myTask.qntdade..")")
end
end
end
end
return true
end

 

 

 

CreatureEvents LOGIN:

registerCreatureEvent(cid, "DragonsTask")

então muito bem esta ai o script, não da erro nenhum só não conta os monstros quando estou matando... Me ajudem por favor. facepalm.gif

Editado por julhinhokullitz
Formatação da Duvida
Link para o comentário
Compartilhar em outros sites

Posts Recomendados

  • 0

Tente mudar a parte do CreatureScripts, a função .LUA dele para esta abaixo:

local function isSummon(cid)
    if not isCreature(cid) then return false end
        if getCreatureMaster(cid) ~= cid then
            return true
        end
    return false
    end
end

function onDeath(cid, corpse, deathList)

local stoTime = 96586
local stoKill = 96587
local stoName = 96587
local task = {
["dragon"] = {kill = "Dragon", qnt = 1500, exp = 1000000},
["dragon lord"] = {kill = "Dragon Lord", qnt = 1000, exp = 800000},
["hydra"] = {kill = "Hydra", qnt = 800, exp = 700000},
["frost dragon"] = {kill = "Frost Dragon", qnt = 600, exp = 500000},
["dragon guardian"] = {kill = "Dragon Guardian", qnt = 500, exp = 400000},
["thunder dragon"] = {kill = "Thunder Dragon", qnt = 400, exp = 300000},
["multi"] = {kill = "Multi", qnt = 600, exp = 200000},
["demodras"] = {kill = "Demodras", qnt = 300, exp = 200000},
}

    for a = 1, #deathList do
        local pk = deathList[a]
        local myTask = task[string.lower(getPlayerStorageValue(pk, stoName))]
        local left = math.ceil((getPlayerStorageValue(pk, stoTime) - os.time())/(24 * 60 * 60))
        if myTask and getCreatureName(cid) == getPlayerStorageValue(pk, stoName) and not isSummon(cid) then
            if left > 0 and getPlayerStorageValue(pk, stoKill) > 0 then
                setPlayerStorageValue(pk, stoKill, getPlayerStorageValue(pk, stoKill) - 1)
                    local sto = getPlayerStorageValue(pk, stoKill)
                    local jaMatou = math.abs(getPlayerStorageValue(pk, stoKill)-myTask.qnt)
                    if sto == 0 then
                        doPlayerSendTextMessage(pk, 22, "["..myTask.kill.." Task Finalizada] ("..myTask.qnt.."/"..myTask.qnt..")")
                    else
                        doPlayerSendTextMessage(pk, 22, "["..myTask.kill.." Task] ("..jaMatou.."/"..myTask.qnt..")")
                    end
            end
        end
    end
return true
end

Lembre-se de registrar a tag abaixo em login.lua:

 

registerCreatureEvent(cid, "DragonsTask")

 

E também de registrar a função onDeath em creaturescripts.xml com o nome do arquivo.lua do script acima.

 

Estou indo para o trabalho e nem deu para olhar direito.

 

Boa sorte.

Editado por Adriano Swatt
Link para o comentário
Compartilhar em outros sites

  • 0

Por gentileza, informe se alguma mensagem é imprimida na distro. Assim, saberemos onde exatamente se encontra o erro.

local function isSummon(cid)
    if not isCreature(cid) then return false end
    if getCreatureMaster(cid) ~= cid then
        return true
    end
    return false
end
 
function onDeath(cid, corpse, deathList)
 
    print("Script sendo executado.")
    local stoTime = 96586
    local stoKill = 96587
    local stoName = 96587
    local task = {
        ["dragon"] = {kill = "Dragon", qnt = 1500, exp = 1000000},
        ["dragon lord"] = {kill = "Dragon Lord", qnt = 1000, exp = 800000},
        ["hydra"] = {kill = "Hydra", qnt = 800, exp = 700000},
        ["frost dragon"] = {kill = "Frost Dragon", qnt = 600, exp = 500000},
        ["dragon guardian"] = {kill = "Dragon Guardian", qnt = 500, exp = 400000},
        ["thunder dragon"] = {kill = "Thunder Dragon", qnt = 400, exp = 300000},
        ["multi"] = {kill = "Multi", qnt = 600, exp = 200000},
        ["demodras"] = {kill = "Demodras", qnt = 300, exp = 200000},
    }
 
    for a = 1, #deathList do
        print("Loop iterando jogadores sendo executado.")
        local pk = deathList[a]
        local myTask = task[string.lower(getPlayerStorageValue(pk, stoName))]
        local left = math.ceil((getPlayerStorageValue(pk, stoTime) - os.time())/(24 * 60 * 60))
 
        if myTask and getCreatureName(cid) == getPlayerStorageValue(pk, stoName) and not isSummon(cid) then
            print("Primeira condição sendo executada.")
            if left > 0 and getPlayerStorageValue(pk, stoKill) > 0 then
                print("Segunda condição sendo executada.")
                setPlayerStorageValue(pk, stoKill, getPlayerStorageValue(pk, stoKill) - 1)
                local sto = getPlayerStorageValue(pk, stoKill)
                local jaMatou = math.abs(getPlayerStorageValue(pk, stoKill)-myTask.qntdade)
 
                if sto == 0 then
                    doPlayerSendTextMessage(pk, 22, "["..myTask.kill.." Task Finalizada] ("..myTask.qntdade.."/"..myTask.qnt..")")
                else
                    doPlayerSendTextMessage(pk, 22, "["..myTask.kill.." Task] ("..jaMatou.."/"..myTask.qntdade..")")
                end
            end
        end
    end
    return true
end
Editado por zipter98
Link para o comentário
Compartilhar em outros sites

  • 0

 

Por gentileza, informe se alguma mensagem é imprimida na distro. Assim, saberemos onde exatamente se encontra o erro.

local function isSummon(cid)    if not isCreature(cid) then return false end    if getCreatureMaster(cid) ~= cid then        return true    end    return falseend function onDeath(cid, corpse, deathList)     print("Script sendo executado.")    local stoTime = 96586    local stoKill = 96587    local stoName = 96587    local task = {        ["dragon"] = {kill = "Dragon", qnt = 1500, exp = 1000000},        ["dragon lord"] = {kill = "Dragon Lord", qnt = 1000, exp = 800000},        ["hydra"] = {kill = "Hydra", qnt = 800, exp = 700000},        ["frost dragon"] = {kill = "Frost Dragon", qnt = 600, exp = 500000},        ["dragon guardian"] = {kill = "Dragon Guardian", qnt = 500, exp = 400000},        ["thunder dragon"] = {kill = "Thunder Dragon", qnt = 400, exp = 300000},        ["multi"] = {kill = "Multi", qnt = 600, exp = 200000},        ["demodras"] = {kill = "Demodras", qnt = 300, exp = 200000},    }     for a = 1, #deathList do        print("Loop iterando jogadores sendo executado.")        local pk = deathList[a]        local myTask = task[string.lower(getPlayerStorageValue(pk, stoName))]        local left = math.ceil((getPlayerStorageValue(pk, stoTime) - os.time())/(24 * 60 * 60))         if myTask and getCreatureName(cid) == getPlayerStorageValue(pk, stoName) and not isSummon(cid) then            print("Primeira condição sendo executada.")            if left > 0 and getPlayerStorageValue(pk, stoKill) > 0 then                print("Segunda condição sendo executada.")                setPlayerStorageValue(pk, stoKill, getPlayerStorageValue(pk, stoKill) - 1)                local sto = getPlayerStorageValue(pk, stoKill)                local jaMatou = math.abs(getPlayerStorageValue(pk, stoKill)-myTask.qntdade)                 if sto == 0 then                    doPlayerSendTextMessage(pk, 22, "["..myTask.kill.." Task Finalizada] ("..myTask.qntdade.."/"..myTask.qnt..")")                else                    doPlayerSendTextMessage(pk, 22, "["..myTask.kill.." Task] ("..jaMatou.."/"..myTask.qntdade..")")                end            end        end    end    return trueend

Bem zipter não dava nenhum erro na distro, apenas não conta ao matar os monstros.

Link para o comentário
Compartilhar em outros sites

  • 0

@zipter98 repare uma coisa.

doPlayerSendTextMessage(pk, 22, "["..myTask.kill.." Task Finalizada] ("..myTask.qntdade.."/"..myTask.qnt..")")

No código acima usa um atalho "qnt" e "qntdade", sendo que no script todo só tem declarado a variável "qnt".

 

Por exemplo:

 

 

["dragon"] = {kill = "Dragon", qnt = 1500, exp = 1000000},

 

É algo a considerar, correto?

Já que é onde registra quantos monstros precisarão matar.

 

Acho que o caminho da contagem dos monstros está aí, pois há vários lugares usando ".qntdade".

 

Abraços.

Editado por Adriano Swatt
Link para o comentário
Compartilhar em outros sites

  • 0

@zipter98 repare uma coisa.

doPlayerSendTextMessage(pk, 22, "["..myTask.kill.." Task Finalizada] ("..myTask.qntdade.."/"..myTask.qnt..")")

No código acima usa um atalho "qnt" e "qntdade", sendo que no script todo só tem declarado a variável "qnt".

 

Por exemplo:

 

 

 

É algo a considerar, correto?

Já que é onde registra quantos monstros precisarão matar.

 

Acho que o caminho da contagem dos monstros está aí, pois há vários lugares usando ".qntdade".

 

Abraços.

  local myTask = task[string.lower(getPlayerStorageValue(pk, stoName))]
Link para o comentário
Compartilhar em outros sites

  • 0

Sim, o que me leva a indagar do porquê não tem aparecido erro algum na distro. É sempre informado no console quando uma variável inexistente é declarada. Mesmo assim, a storage responsável por armazenar os dados da task é ainda alterada.

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...