Eu criei um NPC de Task aqui, porém eu fiz em uma base Poketibia TFS 0.3.6, pois não tenho outra base com versão de TFS diferente. Porém olhei as funções do TFS 1.0 (que é a que você descreveu) e as funções que utilizei nos scripts tem no TFS 1.0.
Vai em Data/NPC e cria um arquivo xml chamado Billie.xml e adicione o código dentro:
<?xml version="1.0" encoding="UTF-8"?>
<npc name="Billie" script="Billie.lua" walkinterval="10000" floorchange="0" speed="100">
<health now="150" max="150"/>
<look type="1421" head="114" body="119" legs="114" feet="114" corpse="2212"/>
<parameters>
<parameter key="message_greet" value="Hello |PLAYERNAME|, I need a service... Say {help} or {task} to more informations."/>
</parameters>
</npc>
Agora em Data/NPC/Scripts crie um arquivo chamado Billie.lua e insira 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
local storage = 32500 -- STORAGE DO NPC
local storage_npc = 34900 -- STORAGE QUE O NPC DA PARA O PLAYER PARA COMEÇAR A TASK
local storage_quantidade = 32510 -- STORAGE QUE CONTÉM A QUANTIDADE DE MONSTROS DERROTADOS PELO PLAYER
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)) + 1
----------------------------------- [ 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, 1)
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())
Agora vai em Data/Creaturescripts/Scripts e crie um arquivo chamado task_billie e adicione o código dentro:
local monstro = "Magmar" -- NOME DO MONSTRO
local quantidade = 50 -- QUANTIDADE DO MONSTRO
local storage_npc = 34900 -- NÃO MEXE
local storage_quantidade = 32510 -- NÃO MEXE
local storage_task = 32600 -- NÃO MEXE
function onKill(cid, target, lasthit)
if getPlayerStorageValue(cid, storage_npc) > 0 then
if getPlayerStorageValue(cid, storage_task) < 1 then
if getPlayerStorageValue(cid, storage_quantidade) < quantidade then
if isPlayer(cid) and getCreatureName(target) == monstro then
local restantes = quantidade - getPlayerStorageValue(cid, storage_quantidade)
doPlayerSendTextMessage(cid, 27, "Billie: " ..restantes.. " " ..monstro.. " restantes para derrotar." )
setPlayerStorageValue(cid, storage_quantidade, getPlayerStorageValue(cid, storage_quantidade) + 1)
return true
end
elseif getPlayerStorageValue(cid, storage_quantidade) == quantidade then
doPlayerSendTextMessage(cid, 27, "Billie: You don't have more " ..monstro.. " to defeat. Come back to get your reward.")
setPlayerStorageValue(cid, storage_quantidade, -1)
setPlayerStorageValue(cid, storage_task, 1)
return true
end
else
return true
end
else
return true
end
end
Ainda em Data/Creaturescripts/Scripts abra o arquivo login.lua e vá procure pela parte onde fica os registros de eventos no código, e adicione a seguinte linha embaixo do último evento:
registerCreatureEvent(cid, "task_billie")
E por último, em Data/Creaturescripts abra o creaturescripts.xml e adicione a tag:
<event type="kill" name="task_billie" script="task_billie.lua"/>
Explicação: Deixei comentado as variáveis e cada parte, no arquivo Billie.lua coloque o nome do monstro na variável monstro e a quantidade na variável quantidade_monstro, e o coloque o id e quantidade do item que o player vai ganhar nas variáveis conforme deixei comentado, está bem simples de ver. No arquivo task_billie a mesma coisa, só que lá só vai precisar colocar nome do monstro e quantidade.
O player irá ganhar o item conforme o id que está na variável, a quantidade e experiência definida no Billie.lua, só alterar lá as recompensas. O resto não precisa mexer.
Eu testei aqui e funcionou normal, mas teste e me fale se der algum problema.