Vamos lá!
Primeiramente, vai em Data/NPC e crie um arquivo xml chamado Tasker.xml (ou nome de sua preferência) e adicione o script dentro:
<?xml version="1.0" encoding="UTF-8"?>
<npc name="Tasker" script="Tasker.lua" walkinterval="0" floorchange="0">
<health now="150" max="150"/>
<look type="1419" head="10" body="15" legs="20" feet="25"/>
<parameters>
<parameter key="message_greet" value="Hello |PLAYERNAME|, I need a service... Say {task} to more informations."/>
</parameters>
</npc>
Lembrando que se dar crash é por conta do looktype do npc que você não deve ter no seu server, só trocar.
Agora em Data/NPC/Scripts crie um arquivo chamado Tasker.lua e adicione o código dentro:
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
-- VARIÁVEIS --
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
msg = string.lower(msg)
local id_item = 2160 -- ITEM QUE VAI GANHAR AO CONCLUIR A TASK
local quantidade_item = 1 -- QUANTIDADE DE ITENS QUE VAI GANHAR
local exp = 500000 -- EXPERIÊNCIA QUE VAI GANHAR
local monstro = "Magmar" -- NOME DO MONSTRO
local quantidade_monstro = 50 -- QUANTIDADE DE MONSTROS (TEM QUE SER A MESMA DO CREATURESCRIPTS E NÃO PODE MUDAR O VALOR APÓS COMEÇAR A TASK)
local storage = 32500 -- STORAGE DO NPC
local storage_npc = 34900 -- STORAGE PARA COMEÇAR A TASK
local storage_quantidade = 32510 -- STORAGE QUE ARMAZENA A QUANTIDADE DE MONSTROS DERROTADOS DA TASK.
local storage_task = 32600 -- STORAGE DE CONCLUSÃO DA TASK
local storage_mensagem = 32505 -- STORAGE PARA DEIXAR O DIALOGO MAIS BONITO
local restante = (quantidade_monstro - getPlayerStorageValue(cid, storage_quantidade))
----------------------------------- [ DIALOGO COM NPC] ---------------------------------
if msgcontains(msg, 'task') then
if getPlayerStorageValue(cid, storage) == 1 then
selfSay("You have already done my task.", cid)
talkState[talkUser] = 0
return true
else
if getPlayerStorageValue(cid, storage_npc) < 1 then
selfSay("I need you kill " ..quantidade_monstro.. " " ..monstro.. ". Do you accept my task?", cid)
else
selfSay("Have you already finished my task?", cid)
end
talkState[talkUser] = 1
return true
end
elseif (msgcontains(msg, 'yes') or msgcontains(msg, 'sim')) and talkState[talkUser] == 1 then
if getPlayerStorageValue(cid, storage_mensagem) < 1 and getPlayerStorageValue(cid, storage_npc) < 1 then
selfSay("Ok, go to complete my task.", cid)
talkState[talkUser] = 0
setPlayerStorageValue(cid, storage_mensagem, 1)
setPlayerStorageValue(cid, storage_npc, 1)
setPlayerStorageValue(cid, storage_quantidade, 0)
return true
end
if getPlayerStorageValue(cid, storage_task) < 1 then
selfSay("You don't finish my task yet. You need to kill " ..restante.. " " ..monstro.. " yet." , cid)
talkState[talkUser] = 0
return true
else
selfSay("Congratulations! You finished my task! Receive your reward.", cid)
doSendMagicEffect(getThingPos(cid), 27)
doPlayerAddExp(cid, exp)
doPlayerAddItem(cid, id_item, quantidade_item)
setPlayerStorageValue(cid, storage, 1)
talkState[talkUser] = 0
return true
end
end
end
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
Explicação: Precisa prestar bastante atenção nessa parte e na próxima, são detalhes que fazem a diferença e qualquer coisa já da problema. Recomendo que deixe essas storages caso não use, até porque usa bastante e pode te confundir na hora de trocar. Mas como comentei todas, da para saber qual é qual.
Agora vai em Data/Creaturescripts/Scripts e crie o arquivo Tasker.lua e adicione o script:
local monstro = "Magmar" -- NOME DO MONSTRO (VERIFICAR A NOMENCLATURA CORRETA NO ARQUIVO XML DO MONSTRO, SE COMEÇA COM MINÚSCULA OU MAIÚSCULA)
local quantidade = 50 -- QUANTIDADE DE MONSTROS (MESMA QUANTIDADE DO SCRIPT DO NPC)
local storage_npc = 34900 -- STORAGE QUE O NPC LIBERA A TASK PARA FAZER
local storage_quantidade = 32510 -- STORAGE PARA CONTABILIZAR (CONTADOR) OS MONSTROS DERROTADOS
local storage_task = 32600 -- STORAGE QUE VERIFICA SE A TASK JÁ FOI CONCLUIDA
local nome_npc = "Tasker" -- NOME DO NPC AQUI
function onKill(cid, target, lasthit)
if getPlayerStorageValue(cid, storage_task) < 1 then
if (getPlayerStorageValue(cid, storage_npc) > 0) and (getPlayerStorageValue(cid, storage_quantidade) < quantidade) then
if isCreature(target) and getCreatureName(target) == monstro then
setPlayerStorageValue(cid, storage_quantidade, getPlayerStorageValue(cid, storage_quantidade) + 1)
local restante = quantidade - getPlayerStorageValue(cid, storage_quantidade)
if restante > 1 then
doPlayerSendTextMessage(cid, 27, nome_npc.. ": " ..restante.. " " ..monstro.. " restantes para derrotar.")
return true
elseif restante == 1 then
doPlayerSendTextMessage(cid, 27, nome_npc.. ": " ..restante.. " " ..monstro.. " restante para derrotar.")
return true
elseif restante == 0 then
doPlayerSendTextMessage(cid, 27, nome_npc.. ": Não há mais " ..monstro.. " para derrotar. Você já pode vir pegar sua recompensa!")
setPlayerStorageValue(cid, storage_task, 1)
return true
end
else
return true
end
else
return true
end
else
return true
end
end
Agora abra o creaturescripts.xml e adicione a tag:
<event type="kill" name="Tasker" event="script" value="Tasker.lua"/>
E por fim, abra o arquivo Data/Creaturescripts/Scripts/login.lua e registre o evento (de preferência por último) :
registerCreatureEvent(cid, "Tasker")
Lembrando que o nome do evento registrado tem que ser o mesmo que está na tag xml.
E cuidado com o nome do monstro que coloca, alguns podem começar com letra minúscula ou maiúscula, e se tiver diferente, uma letra que seja em tamanho, já vai dar errado. Então precisa olhar no xml do monstro.
Eu testei e funcionou, qualquer problema só falar.