Ir para conteúdo
  • 0

Preciso de 1 NPC Quest (Pokemon)


adrianokk

Pergunta

Base: Pokemon DXP.
TFS 0.3.6

 

Estou precisando de 1 NPC de quest que pede para matar uma quantidade "X" de pokemons.

Verifica se matou todos os pokemons depois de ter iniciado a quest e entrega o premio.

 

PS: Porque o Xtibia ta caindo tanto !?

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

2 respostass a esta questão

Posts Recomendados

  • 1

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.

 

 

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

  • 0

Cara, o log fica esse abaixo e não contabiliza quando mato os pokes.

[20/11/2023 18:04:17] -1
[20/11/2023 18:04:17] 1
[20/11/2023 18:04:17] 0
[20/11/2023 18:04:17] -1
[20/11/2023 18:04:17] 1
[20/11/2023 18:04:17] -1

Link para o comentário
Compartilhar em outros sites

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...