KA

Pedido de NPC que da quests paralelas

Por kamus9629, 22 de dez. de 2019 em Scripts

npc
npc 3d
rpg
npc multiuso
20
3.4k
kamus9629K
22 de dezembro de 2019 às 19:14

Ele quis dizer: 
NPC 1:
Fale com o NPC 2.

Npc 2:
(Se não falou com NPC 1: Voce ainda não pode fazer essa quest.)
(Se falou: Hola, preciso 100 seeds pra minha invenção)
(Se tiver e falar: "seeds", receber item e ganhar storage 10000)
Npc3: 
(Se tiver sorage 10000= Te dou a missã ode matar 100 charmander)
(Se não tiver storage 10000: voce ainda não pode fazer essa missão)

Editado Dezembro 22 por kamus9629

23 de dezembro de 2019 às 23:52
Em 22/12/2019 em 19:14, kamus9629 disse:

Ele quis dizer: 
NPC 1:
Fale com o NPC 2.

Npc 2:
(Se não falou com NPC 1: Voce ainda não pode fazer essa quest.)
(Se falou: Hola, preciso 100 seeds pra minha invenção)
(Se tiver e falar: "seeds", receber item e ganhar storage 10000)
Npc3: 
(Se tiver sorage 10000= Te dou a missã ode matar 100 charmander)
(Se não tiver storage 10000: voce ainda não pode fazer essa missão)

Usa como base aqueles npc de clan po

kamus9629K
23 de dezembro de 2019 às 23:54
Agora, brazvct disse:

Usa como base aqueles npc de clan po

qual nome dos npc clan porque vou fala real oque eu tou fazendo e todo do zero eu removir map todo todos os pokemon para refazer ele so ta faltando quest sistem

 

24 de dezembro de 2019 às 00:45
51 minutos atrás, kamus9629 disse:

qual nome dos npc clan porque vou fala real oque eu tou fazendo e todo do zero eu removir map todo todos os pokemon para refazer ele so ta faltando quest sistem

 

Aqueles de task de clan tipo seeds trainer
Baixa ai denovo e usa aquilo como base é igualzin o que vc procura

kamus9629K
24 de dezembro de 2019 às 20:05
19 horas atrás, brazvct disse:

Aqueles de task de clan tipo seeds trainer
Baixa ai denovo e usa aquilo como base é igualzin o que vc procura

vou da uma olhada e que eu nao sou de joga otpokemon eu parei de joga tibia faz 2015 eu so mecho  com ot fasso cenario do zero e sprite  propria  tavo penssando se eu coloco old client o project ja que o pessoal gosta muito de bot 

24 de dezembro de 2019 às 23:15
3 horas atrás, kamus9629 disse:

vou da uma olhada e que eu nao sou de joga otpokemon eu parei de joga tibia faz 2015 eu so mecho  com ot fasso cenario do zero e sprite  propria  tavo penssando se eu coloco old client o project ja que o pessoal gosta muito de bot 

Tem um Bot mais avançado pra Otclient chamado CandyBot é só compilar o OTC sem bot protection

kamus9629K
25 de dezembro de 2019 às 23:06
23 horas atrás, brazvct disse:

Tem um Bot mais avançado pra Otclient chamado CandyBot é só compilar o OTC sem bot protection

vlw eu conheço candy bot mais ele nao ta incompleto ?

26 de dezembro de 2019 às 00:53
1 hora atrás, kamus9629 disse:

vlw eu conheço candy bot mais ele nao ta incompleto ?

100% funcional o Candy Bot, só precisa estar com otc compilado sem proteção

Yan OliveiraY
31 de dezembro de 2019 às 19:08

Sobre o pedido do tópico, começando pelo primeiro NPC, vá em Data/NPC e crie um arquivo Carl.xml (lembrando que coloquei o nome do arquivo do mesmo nome do npc, caso queira mudar nome do npc sugiro mudar o do arquivo para ficar fácil de fazer manutenções futuras), após criar adicione o seguinte código dentro: 

<?xml version="1.0" encoding="UTF-8"?>

<npc name="Carl" script="Carl.lua" walkinterval="0" floorchange="0" access="5" level="1" maglevel="1">
<health now="150" max="150"/>
<look type="516" head="10" body="15" legs="20" feet="25"/>

<parameters>
	<parameter key="message_greet" value="Olá |PLAYERNAME|, o que você procura?"/>
</parameters>
</npc>

Agora vá em Data/NPC/Scripts e crie um arquivo Carl.lua e adicione o seguinte 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 nome_segundo_npc = "Joey"
local storage = 9999

----------------------------------- [ DIALOGO COM NPC] ---------------------------------
  
if msgcontains(msg, 'help') or msgcontains(msg, 'ajuda') or msgcontains(msg, 'missao') then
 	
  if getPlayerStorageValue(cid, storage) == 1 then
	  selfSay("Você deve falar diretamente com o NPC " ..nome_segundo_npc, cid)
	  talkState[talkUser] = 0
	return true 
  else
    selfSay("Você gostaria de fazer a missão do NPC " ..nome_segundo_npc.. " ?", cid)  
    talkState[talkUser] = 1
  return true
  end
   
elseif (msgcontains(msg, 'yes') or msgcontains(msg, 'sim')) and talkState[talkUser] == 1 then
	selfSay("Agora você está autorizado para fazer a missão do NPC "..nome_segundo_npc.. "!", cid)
        setPlayerStorageValue(cid, storage, 1)
	talkState[talkUser] = 0        
return true

elseif (msgcontains(msg, 'no') or msgcontains(msg, 'não') or msgcontains(msg, 'nao')) and talkState[talkUser] == 1 then
  selfSay("Ok, fale comigo novamente caso queira fazer a missão do NPC " ..nome_segundo_npc.. ".", cid)
  talkState[talkUser] = 0
return true
end

return true
end
 
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

 

Segundo NPC:

 

Agora iremos criar o segundo NPC, vá em Data/NPC e crie um arquivo Joey.xml e adicione o código dentro:

<?xml version="1.0" encoding="UTF-8"?>

<npc name="Joey" script="Joey.lua" walkinterval="0" floorchange="0" access="5" level="1" maglevel="1">
<health now="150" max="150"/>
<look type="1421" head="114" body="119" legs="114" feet="114"/>

<parameters>
	<parameter key="message_greet" value="Olá |PLAYERNAME|, em que posso ajudar? Diga {help}, {ajuda} ou {missão} para mais informações."/>
</parameters>
</npc>

E vá em Data/NPC/Scripts, crie um arquivo Joey.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 nome_primeiro_npc = "Carl"
local nome_terceiro_npc = "Peter"
local id_item = 12163
local quantidade_item = 100
local id_item_recebido = 16563
local quantidade_item_recebido = 1

----------------------------------- [ DIALOGO COM NPC] ---------------------------------
  
if msgcontains(msg, 'help') or msgcontains(msg, 'ajuda') or msgcontains(msg, 'missao') then
 	
  if getPlayerStorageValue(cid, 9999) == 1 then -- STORAGE DO PRIMEIRO NPC, OU SEJA, VERIFICA SE FALOU COM PRIMEIRO NPC.
  
    if getPlayerStorageValue(cid, 10000) == 1 then -- VERIFICA SE JÁ FEZ A MISSÃO DO SEGUNDO NPC
      selfSay("Você já fez minha missão, agora você deve falar diretamente com o NPC " ..nome_terceiro_npc.. ".", cid)
      talkState[talkUser] = 0
	  return true 
    else
      selfSay("Preciso que você me traga " ..quantidade_item.. " seeds. Você trouxe?", cid) 
      talkState[talkUser] = 1
    return true
    end
  
  else
    selfSay("Você deve falar com o NPC " ..nome_primeiro_npc.. " para conseguir fazer minha missão.", cid)
    talkState[talkUser] = 0
  return true
  end

elseif (msgcontains(msg, 'yes') or msgcontains(msg, 'sim')) and talkState[talkUser] == 1 then

  if getPlayerItemCount(cid, id_item) >= quantidade_item then
    doPlayerRemoveItem(cid, id_item, quantidade_item)
    selfSay("Você me trouxe as " ..quantidade_item.. " que eu precisava. Agora você consegue falar com o NPC " ..nome_terceiro_npc.. ".", cid)
    doPlayerAddItem(cid, id_item_recebido, quantidade_item_recebido)
    doSendMagicEffect(getThingPos(cid), 29)
    setPlayerStorageValue(cid, 10000, 1)
    talkState[talkUser] = 0
  return true
  else
    selfSay("Você não trouxe a quantidade de seeds que eu preciso. Me traga " ..quantidade_item.. " seeds para prosseguir com a missão.", cid)
    talkState[talkUser] = 0
  return true
  end

return true
end

return true
end
 
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

 

Terceiro NPC

 

Agora com o terceiro e último NPC, vá em Data/NPC e crie um arquivo Peter.xml e adicione o código dentro:

<?xml version="1.0" encoding="UTF-8"?>

<npc name="Peter" script="Peter.lua" walkinterval="0" floorchange="0" access="5" level="1" maglevel="1">
<health now="150" max="150"/>
<look type="1413" head="114" body="119" legs="114" feet="114" corpse="2212"/>

<parameters>
	<parameter key="message_greet" value="Olá |PLAYERNAME|, o que você procura aqui? Diga {help}, {ajuda} ou {missão} para mais informações."/>
</parameters>
</npc>

E vá em Data/NPC/Scripts e crie um arquivo Peter.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 nome_segundo_npc = "Joey"

----------------------------------- [ DIALOGO COM NPC] ---------------------------------
  
if msgcontains(msg, 'help') or msgcontains(msg, 'ajuda') or msgcontains(msg, 'missao') then
 	
  if getPlayerStorageValue(cid, 10000) == 1 then -- VERIFICA SE FALOU COM SEGUNDO NPC
  
    if getPlayerStorageValue(cid, 10001) == 1 then -- VERIFICA SE TERMINOU A TASK
      selfSay("Você já completou minha missão.", cid)
      talkState[talkUser] = 0
	  return true 
    else
      selfSay("Preciso que você derrote alguns {Charmanders} para mim. Você quer fazer essa missão?", cid) 
      talkState[talkUser] = 1
    return true
    end
  
  else
    selfSay("Você deve falar com o NPC " ..nome_segundo_npc.. " para conseguir fazer minha missão.", cid)
    talkState[talkUser] = 0
  return true
  end

elseif (msgcontains(msg, 'yes') or msgcontains(msg, 'sim') or (msgcontains(msg, 'task'))) and talkState[talkUser] == 1 then           

local id_item = 12545
local quantidade_item = 1
local exp = 10000
 
  if getPlayerStorageValue(cid, 10002) == 1 then
    selfSay("Você completou minha missão! Receba sua recompensa.", cid)
    doPlayerAddExp(cid, exp)
    doPlayerAddItem(cid, id_item, quantidade_item)
    doSendAnimatedText(getThingPos(cid), exp, 27)
    setPlayerStorageValue(cid, 72451, 1)
    talkState[talkUser] = 0
  return true

  else
    if getPlayerStorageValue(cid, 10002) < 0 then
      selfSay("Vá derrotar todos os {Charmanders} para mim.")
      setPlayerStorageValue(cid, 35000, 0)
      talkState[talkUser] = 0
    return true
    
    elseif getPlayerStorageValue(cid, 10002) == 0 then
      selfSay("Você ainda não derrotou todos os {100 Charmanders}. Termine a missão primeiro antes de falar comigo.")
      talkState[talkUser] = 0
    return true
    end
  return true
  end

 return true
 
elseif (msgcontains(msg, 'no') or msgcontains(msg, 'não')) and talkState[talkUser] == 1 then
  selfSay("Ok, fale comigo novamente caso queira fazer minha missão.", cid)    
  talkState[talkUser] = 0
return true
end

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

 

Agora é a configuração da task.

 

Vá em Data/Creaturescripts/Scripts crie um arquivo chamado task_peter.lua e adicione o código dentro:

local nome_terceiro_npc = "Peter"
local storage_npc = 10002
local storage_contador = 10003

local pokemon = {
   [1] = {name = "Charmander", count = 100},
}

local nome = pokemon[1].name
local restante  

function onKill(cid, target)
  for _, t in ipairs(pokemon) do
  local quantidade = t.count

  if getCreatureName(target) == nome then

    if getPlayerStorageValue(cid, storage_npc) == 0 then
	  
     	if getPlayerStorageValue(cid, storage_contador) == quantidade then        
	      doPlayerSendTextMessage(cid, 27, "Não há mais " ..nome.. " para derrotar.")
       	doPlayerSendTextMessage(cid, 20, "Parabéns! Você concluiu a task do " ..nome_terceiro_npc)
        setPlayerStorageValue(cid, storage_contador, getPlayerStorageValue(cid, storage_contador) + 1)
        setPlayerStorageValue(cid, storage_npc, 1)
     	return true
  
      elseif getPlayerStorageValue(cid, storage_contador) < quantidade then     
      
  -- AS STORAGES COMEÇAM COM -1, ENTÃO NESSA PARTE EU APENAS DEFINO COMO 0 PARA NA LINHA SEGUINTE JÁ IR PARA 1. NÃO COLOQUE RETURN NESSE LAÇO PORQUE VAI ENCERRAR O ESCOPO E NÃO VAI CONTAR CORRETAMENTE --  
        if getPlayerStorageValue(cid, storage_contador) < 0 then	
           setPlayerStorageValue(cid, storage_contador, 0)
        end	 

        setPlayerStorageValue(cid, storage_contador, getPlayerStorageValue(cid, storage_contador) + 1)
        restante = quantidade - getPlayerStorageValue(cid, storage_contador)
        doPlayerSendTextMessage(cid, 27, "Faltam " ..restante.. " " ..nome.. "s para derrotar.")
      return true
      end
    
    elseif (getPlayerStorageValue(cid, storage_npc) < 0) or (getPlayerStorageValue(cid, storage_npc) > 0) then
      return true
    end
  
  return true
  end

return true
end

end

 

Agora vá em Data/Creaturescripts e abra o creaturescripts.xml e adicione o evento:

<event type="kill" name="task_peter" script="task_peter.lua"/>

 

E por último, vá em Data/Creaturescripts/Scripts ou Data/Creaturescripts/Scripts/Player (dependendo da base tem essa divisão de diretório) e procure pelo arquivo login.lua e procure pela parte dos registros de evento e adicione após o último a linha:

registerCreatureEvent(cid, "task_peter")

 

Explicação:

 

Pelo que entendi o primeiro NPC não pedirá nada, só dará acesso ao player, então para o player falar com o segundo NPC ele tem que falar com o primeiro antes! Eu deixei também o valor das storages em sequência para ficar mais fácil de alterar, e deixei o segundo com o valor 10000 como pediu. 

 

Eu tinha feito os scripts faz tempo haha, mas eu estava testando na base DXP e nela não funciona o evento onKill, não da erro mas não funciona haha, ai perdi um tempinho até descobrir kk. Mas está ai a série de missão de npc.

 

Testei aqui e todos os NPCs estão funcionando normalmente e a task do creaturescript está funcionando normal também, mas qualquer problema me fale.

Editado Janeiro 1 por Yan18

1 mês depois...
kamus9629K
15 de janeiro de 2020 às 20:15
Em 31/12/2019 em 19:08, Yan18 disse:

Sobre o pedido do tópico, começando pelo primeiro NPC, vá em Data/NPC e crie um arquivo Carl.xml (lembrando que coloquei o nome do arquivo do mesmo nome do npc, caso queira mudar nome do npc sugiro mudar o do arquivo para ficar fácil de fazer manutenções futuras), após criar adicione o seguinte código dentro: 

<?xml version="1.0" encoding="UTF-8"?>

<npc name="Carl" script="Carl.lua" walkinterval="0" floorchange="0" access="5" level="1" maglevel="1">
<health now="150" max="150"/>
<look type="516" head="10" body="15" legs="20" feet="25"/>

<parameters>
	<parameter key="message_greet" value="Olá |PLAYERNAME|, o que você procura?"/>
</parameters>
</npc>

Agora vá em Data/NPC/Scripts e crie um arquivo Carl.lua e adicione o seguinte 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 nome_segundo_npc = "Joey"
local storage = 9999

----------------------------------- [ DIALOGO COM NPC] ---------------------------------
  
if msgcontains(msg, 'help') or msgcontains(msg, 'ajuda') or msgcontains(msg, 'missao') then
 	
  if getPlayerStorageValue(cid, storage) == 1 then
	  selfSay("Você deve falar diretamente com o NPC " ..nome_segundo_npc, cid)
	  talkState[talkUser] = 0
	return true 
  else
    selfSay("Você gostaria de fazer a missão do NPC " ..nome_segundo_npc.. " ?", cid)  
    talkState[talkUser] = 1
  return true
  end
   
elseif (msgcontains(msg, 'yes') or msgcontains(msg, 'sim')) and talkState[talkUser] == 1 then
	selfSay("Agora você está autorizado para fazer a missão do NPC "..nome_segundo_npc.. "!", cid)
        setPlayerStorageValue(cid, storage, 1)
	talkState[talkUser] = 0        
return true

elseif (msgcontains(msg, 'no') or msgcontains(msg, 'não') or msgcontains(msg, 'nao')) and talkState[talkUser] == 1 then
  selfSay("Ok, fale comigo novamente caso queira fazer a missão do NPC " ..nome_segundo_npc.. ".", cid)
  talkState[talkUser] = 0
return true
end

return true
end
 
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

 

Segundo NPC:

 

Agora iremos criar o segundo NPC, vá em Data/NPC e crie um arquivo Joey.xml e adicione o código dentro:

<?xml version="1.0" encoding="UTF-8"?>

<npc name="Joey" script="Joey.lua" walkinterval="0" floorchange="0" access="5" level="1" maglevel="1">
<health now="150" max="150"/>
<look type="1421" head="114" body="119" legs="114" feet="114"/>

<parameters>
	<parameter key="message_greet" value="Olá |PLAYERNAME|, em que posso ajudar? Diga {help}, {ajuda} ou {missão} para mais informações."/>
</parameters>
</npc>

E vá em Data/NPC/Scripts, crie um arquivo Joey.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 nome_primeiro_npc = "Carl"
local nome_terceiro_npc = "Peter"
local id_item = 12163
local quantidade_item = 100
local id_item_recebido = 16563
local quantidade_item_recebido = 1

----------------------------------- [ DIALOGO COM NPC] ---------------------------------
  
if msgcontains(msg, 'help') or msgcontains(msg, 'ajuda') or msgcontains(msg, 'missao') then
 	
  if getPlayerStorageValue(cid, 9999) == 1 then -- STORAGE DO PRIMEIRO NPC, OU SEJA, VERIFICA SE FALOU COM PRIMEIRO NPC.
  
    if getPlayerStorageValue(cid, 10000) == 1 then -- VERIFICA SE JÁ FEZ A MISSÃO DO SEGUNDO NPC
      selfSay("Você já fez minha missão, agora você deve falar diretamente com o NPC " ..nome_terceiro_npc.. ".", cid)
      talkState[talkUser] = 0
	  return true 
    else
      selfSay("Preciso que você me traga " ..quantidade_item.. " seeds. Você trouxe?", cid) 
      talkState[talkUser] = 1
    return true
    end
  
  else
    selfSay("Você deve falar com o NPC " ..nome_primeiro_npc.. " para conseguir fazer minha missão.", cid)
    talkState[talkUser] = 0
  return true
  end

elseif (msgcontains(msg, 'yes') or msgcontains(msg, 'sim')) and talkState[talkUser] == 1 then

  if getPlayerItemCount(cid, id_item) >= quantidade_item then
    doPlayerRemoveItem(cid, id_item, quantidade_item)
    selfSay("Você me trouxe as " ..quantidade_item.. " que eu precisava. Agora você consegue falar com o NPC " ..nome_terceiro_npc.. ".", cid)
    doPlayerAddItem(cid, id_item_recebido, quantidade_item_recebido)
    doSendMagicEffect(getThingPos(cid), 29)
    setPlayerStorageValue(cid, 10000, 1)
    talkState[talkUser] = 0
  return true
  else
    selfSay("Você não trouxe a quantidade de seeds que eu preciso. Me traga " ..quantidade_item.. " seeds para prosseguir com a missão.", cid)
    talkState[talkUser] = 0
  return true
  end

return true
end

return true
end
 
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

 

Terceiro NPC

 

Agora com o terceiro e último NPC, vá em Data/NPC e crie um arquivo Peter.xml e adicione o código dentro:

<?xml version="1.0" encoding="UTF-8"?>

<npc name="Peter" script="Peter.lua" walkinterval="0" floorchange="0" access="5" level="1" maglevel="1">
<health now="150" max="150"/>
<look type="1413" head="114" body="119" legs="114" feet="114" corpse="2212"/>

<parameters>
	<parameter key="message_greet" value="Olá |PLAYERNAME|, o que você procura aqui? Diga {help}, {ajuda} ou {missão} para mais informações."/>
</parameters>
</npc>

E vá em Data/NPC/Scripts e crie um arquivo Peter.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 nome_segundo_npc = "Joey"

----------------------------------- [ DIALOGO COM NPC] ---------------------------------
  
if msgcontains(msg, 'help') or msgcontains(msg, 'ajuda') or msgcontains(msg, 'missao') then
 	
  if getPlayerStorageValue(cid, 10000) == 1 then -- VERIFICA SE FALOU COM SEGUNDO NPC
  
    if getPlayerStorageValue(cid, 10001) == 1 then -- VERIFICA SE TERMINOU A TASK
      selfSay("Você já completou minha missão.", cid)
      talkState[talkUser] = 0
	  return true 
    else
      selfSay("Preciso que você derrote alguns {Charmanders} para mim. Você quer fazer essa missão?", cid) 
      talkState[talkUser] = 1
    return true
    end
  
  else
    selfSay("Você deve falar com o NPC " ..nome_segundo_npc.. " para conseguir fazer minha missão.", cid)
    talkState[talkUser] = 0
  return true
  end

elseif (msgcontains(msg, 'yes') or msgcontains(msg, 'sim') or (msgcontains(msg, 'task'))) and talkState[talkUser] == 1 then           

local id_item = 12545
local quantidade_item = 1
local exp = 10000
 
  if getPlayerStorageValue(cid, 10002) == 1 then
    selfSay("Você completou minha missão! Receba sua recompensa.", cid)
    doPlayerAddExp(cid, exp)
    doPlayerAddItem(cid, id_item, quantidade_item)
    doSendAnimatedText(getThingPos(cid), exp, 27)
    setPlayerStorageValue(cid, 72451, 1)
    talkState[talkUser] = 0
  return true

  else
    if getPlayerStorageValue(cid, 10002) < 0 then
      selfSay("Vá derrotar todos os {Charmanders} para mim.")
      setPlayerStorageValue(cid, 35000, 0)
      talkState[talkUser] = 0
    return true
    
    elseif getPlayerStorageValue(cid, 10002) == 0 then
      selfSay("Você ainda não derrotou todos os {100 Charmanders}. Termine a missão primeiro antes de falar comigo.")
      talkState[talkUser] = 0
    return true
    end
  return true
  end

 return true
 
elseif (msgcontains(msg, 'no') or msgcontains(msg, 'não')) and talkState[talkUser] == 1 then
  selfSay("Ok, fale comigo novamente caso queira fazer minha missão.", cid)    
  talkState[talkUser] = 0
return true
end

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

 

Agora é a configuração da task.

 

Vá em Data/Creaturescripts/Scripts crie um arquivo chamado task_peter.lua e adicione o código dentro:

local nome_terceiro_npc = "Peter"
local storage_npc = 10002
local storage_contador = 10003

local pokemon = {
   [1] = {name = "Charmander", count = 100},
}

local nome = pokemon[1].name
local restante  

function onKill(cid, target)
  for _, t in ipairs(pokemon) do
  local quantidade = t.count

  if getCreatureName(target) == nome then

    if getPlayerStorageValue(cid, storage_npc) == 0 then
	  
     	if getPlayerStorageValue(cid, storage_contador) == quantidade then        
	      doPlayerSendTextMessage(cid, 27, "Não há mais " ..nome.. " para derrotar.")
       	doPlayerSendTextMessage(cid, 20, "Parabéns! Você concluiu a task do " ..nome_terceiro_npc)
        setPlayerStorageValue(cid, storage_contador, getPlayerStorageValue(cid, storage_contador) + 1)
        setPlayerStorageValue(cid, storage_npc, 1)
     	return true
  
      elseif getPlayerStorageValue(cid, storage_contador) < quantidade then     
      
  -- AS STORAGES COMEÇAM COM -1, ENTÃO NESSA PARTE EU APENAS DEFINO COMO 0 PARA NA LINHA SEGUINTE JÁ IR PARA 1. NÃO COLOQUE RETURN NESSE LAÇO PORQUE VAI ENCERRAR O ESCOPO E NÃO VAI CONTAR CORRETAMENTE --  
        if getPlayerStorageValue(cid, storage_contador) < 0 then	
           setPlayerStorageValue(cid, storage_contador, 0)
        end	 

        setPlayerStorageValue(cid, storage_contador, getPlayerStorageValue(cid, storage_contador) + 1)
        restante = quantidade - getPlayerStorageValue(cid, storage_contador)
        doPlayerSendTextMessage(cid, 27, "Faltam " ..restante.. " " ..nome.. "s para derrotar.")
      return true
      end
    
    elseif (getPlayerStorageValue(cid, storage_npc) < 0) or (getPlayerStorageValue(cid, storage_npc) > 0) then
      return true
    end
  
  return true
  end

return true
end

end

 

Agora vá em Data/Creaturescripts e abra o creaturescripts.xml e adicione o evento:

<event type="kill" name="task_peter" script="task_peter.lua"/>

 

E por último, vá em Data/Creaturescripts/Scripts ou Data/Creaturescripts/Scripts/Player (dependendo da base tem essa divisão de diretório) e procure pelo arquivo login.lua e procure pela parte dos registros de evento e adicione após o último a linha:

registerCreatureEvent(cid, "task_peter")

 

Explicação:

 

Pelo que entendi o primeiro NPC não pedirá nada, só dará acesso ao player, então para o player falar com o segundo NPC ele tem que falar com o primeiro antes! Eu deixei também o valor das storages em sequência para ficar mais fácil de alterar, e deixei o segundo com o valor 10000 como pediu. 

 

Eu tinha feito os scripts faz tempo haha, mas eu estava testando na base DXP e nela não funciona o evento onKill, não da erro mas não funciona haha, ai perdi um tempinho até descobrir kk. Mas está ai a série de missão de npc.

 

Testei aqui e todos os NPCs estão funcionando normalmente e a task do creaturescript está funcionando normal também, mas qualquer problema me fale.

 

 

O sistem Task Nao funcionou aqui 

Yan OliveiraY
15 de janeiro de 2020 às 20:19
1 minuto atrás, kamus9629 disse:

 

 

O sistem Task Nao funcionou aqui 

Você fez o procedimento certo como falei no tutorial ? Adicionou tudo certo? Porque eu testei no meu servidor e deu certo, e na parte da task eu só usei funções genéricas que tem em qualquer base de poketibia. Mas aparece algum erro na distro?

kamus9629K
15 de janeiro de 2020 às 20:21
Agora, Yan18 disse:

Você fez o procedimento certo como falei no tutorial ? Adicionou tudo certo? Porque eu testei no meu servidor e deu certo, e na parte da task eu só usei funções genéricas que tem em qualquer base de poketibia. Mas aparece algum erro na distro?

tipo da uma olhada na scripte que eu te passei porqe eu editei ela ver se eu fiz algo de errado ae me fala aonde eu errei para eu concertar

Yan OliveiraY
16 de janeiro de 2020 às 00:48
29 minutos atrás, kamus9629 disse:

tipo da uma olhada na scripte que eu te passei porqe eu editei ela ver se eu fiz algo de errado ae me fala aonde eu errei para eu concertar

Então ai é outro caso kkk, não é que o script não funcionou, mas você usou ele como base para fazer uma adaptação, então o problema deve estar no que você mudou, pois esse script funciona porque eu testei antes de postar e testei em duas bases diferentes e funcionou. Irei olhar seu script que mandou por PM.

 

 

kamus9629K
16 de janeiro de 2020 às 01:14
Agora, Yan18 disse:

Então ai é outro caso kkk, não é que o script não funcionou, mas você usou ele como base para fazer uma adaptação, então o problema deve estar no que você mudou, pois esse script funciona porque eu testei antes de postar e testei em duas bases diferentes e funcionou. Irei olhar seu script que mandou por PM.

 

 

VLW

kamus9629K
16 de janeiro de 2020 às 16:19
Agora, kamus9629 disse:

VLW

mesmo erro eu nao sei se isso vai ajudar mais   tem isso aqui 

 

(luaDoCreateMonster) Monster with name 'Peter' not found