Ir para conteúdo
  • 0

[Npc] Quest - Tem Como?


Renatogold7

Pergunta

[NPC] Npc de quest Alfredo

 

Desculpa se postei no lugar errado, se for preciso mover ou deletar o topico fiquem a vontade.

 

Continuando o meu script de npc, queria que ele foce um pouco mais complexo, mais não consigo acertar algumas coisas nele, ja que sou iniciante em scripts:

-quando você fala "no" para algo ele não responde a fala que eu quero que ele responda.

 

Ah Vodkart ja me ajudou neste script, fico muito grato, mais queria algumas coisas a mais nele, mais não consigo fazer que isto de certo...

 

O que eu quero ao certo é mais ou menos este dialogo quando você ja iniciou a converssa:

 

Player: ajuda

NPC: Eu preciso de 30 worms para ir pescar hoje com um grande amigo, prometi a ele que levaria elas. Você poderia me ajudar?

 

Agora você teria duas opções:

Player: yes

NPC: Obrigado! Estarei te esperando aqui!

A outra:

Player: no

NPC: Er, ok.. Acho que não vou poder ir pescar hoje..

 

Até ai deu certo, mais as outras partes que você tem a opção de falar "yes" ou "no" não deu certo...

Mais em geral é um npc que vai te dando várias quests conforme você vai completando outras quests ja propostas por ele, seguindo uma história... So quero saber como deixar mais opções de respostas para o player, como "yes" e "no" e que dependendo desta ação o npc dirá algo, e que também se você não tiver as "30 worms" ele dirá algo, como: "Vá logo pegar as worms, estou esperando!".

 

Se der para ver os erros e corrigirem ele para mim fico agradecido.. Com isso acho que minha dúvida nisto acabará.

 

Obrigado!

 

Script do NPC:

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

if msgcontains(msg, 'ajuda') then
if (getPlayerStorageValue(cid,8002) == -1) then
selfSay('Eu preciso de 30 worms para ir pescar hoje com um grande amigo, prometi a ele que levaria elas. Você poderia me ajudar?', cid)
talkState[talkUser] = 1
elseif (getPlayerStorageValue(cid,8002) == 1) then
selfSay('Ja trouxe minhas worms?', cid)
talkState[talkUser] = 2
elseif (getPlayerStorageValue(cid,8002) == 2) then
selfSay('Hmm, agora abri um negocio de venda de minhocas, mas estou meio sem estoque, agora preciso de 100 worms, sera que você poderia me ajudar novamente?', cid)
talkState[talkUser] = 3
elseif (getPlayerStorageValue(cid,8002) == 3) then
selfSay('Conseguiu as worms?', cid)
talkState[talkUser] = 4
else
selfSay('Por enquanto não preciso mais de sua ajuda..', cid)
talkState[talkUser] = 0
end

elseif talkState[talkUser] == 1 then
if msgcontains(msg, 'yes') then
selfSay('Obrigado! Estarei te esperando aqui!', cid)
setPlayerStorageValue(cid, 8002, 1)
talkState[talkUser] = 0
else
selfSay('Er, ok.. Acho que não vou poder ir pescar hoje..', cid)
talkState[talkUser] = 0
end

elseif talkState[talkUser] == 3 then
if msgcontains(msg, 'yes') then
selfSay('Você é demais! Estarei esperando as worms.', cid)
setPlayerStorageValue(cid, 8002, 3)
talkState[talkUser] = 0
else
selfSay('Er, ok.. Estou arruinado..', cid)
talkState[talkUser] = 0
end

elseif talkState[talkUser] == 2 and getPlayerItemCount(cid, 3976) >= 30 then 
if msgcontains(msg, 'yes') then
selfSay('Hmm, bom bom, aqui esta sua recompença! {Você recebeu 1000 exp e 500 gps}.', cid)
if (doPlayerRemoveItem(cid, 3976, 30) == TRUE) then
doPlayerAddExp(cid,1000)
doPlayerAddMoney(cid, 500)
setPlayerStorageValue(cid, 8002, 2)
talkState[talkUser] = 0
elseif msgcontains(msg, 'no') then
selfSay('O que esta esperando? Vá logo porfavor.', cid)
talkState[talkUser] = 0
else
talkState[talkUser] = 0
end
end

elseif talkState[talkUser] == 4 and getPlayerItemCount(cid, 3976) >= 100 then 
if msgcontains(msg, 'yes') then
selfSay('Brigadão! Eu sabia que você era confiavel! Pensou que você não ganharia nada em troca né? {Você recebeu 2500 exp e 1500 gps}.', cid)
if (doPlayerRemoveItem(cid, 3976, 100) == TRUE) then
doPlayerAddExp(cid,2500)
doPlayerAddMoney(cid, 1500)
setPlayerStorageValue(cid, 8002, 4)
talkState[talkUser] = 0
elseif msgcontains(msg, 'no') then
selfSay('Estou esperando as worms...', cid)
talkState[talkUser] = 0
else
talkState[talkUser] = 0
end
end

talkState[talkUser] = 0
   elseif(msgcontains(msg, 'no') and isInArray({1}, talkState[talkUser]) == TRUE) then
       talkState[talkUser] = 0
   end

return true
end

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

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

5 respostass a esta questão

Posts Recomendados

  • 0

Renatogold7,

Testei o script abaixo na distribuição The Forgotten Server 0.3.6pl1, veja se funciona,

 

local config = {
storage = 8002 --Coloque o storage que você irá usar
}

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 greetCallback(cid)
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
if (getPlayerStorageValue(cid, config.storage) == -1) then
	npcHandler:setMessage(MESSAGE_GREET, "Olá ".. getCreatureName(cid) ..". Estou precisando de {ajuda}!")
elseif (getPlayerStorageValue(cid, config.storage) == 0) then
	npcHandler:setMessage(MESSAGE_GREET, "Já trouxe minhas Worms?")
	talkState[talkUser] = 2
elseif (getPlayerStorageValue(cid, config.storage) == 1) then
	npcHandler:setMessage(MESSAGE_GREET, "Olá novamente ".. getCreatureName(cid) ..", meu amigo e eu abrimos um comércio de minhocas, mas estamos meio que sem estoque. Estou precisando de 100 Worms, será que você poderia me ajudar novamente?")
	talkState[talkUser] = 3
elseif (getPlayerStorageValue(cid, config.storage) == 2) then
	npcHandler:setMessage(MESSAGE_GREET, "Conseguiu as Worms?")
	talkState[talkUser] = 4
else
	npcHandler:setMessage(MESSAGE_GREET, "Olá ".. getCreatureName(cid) ..". Não estou precisando de ajuda por enquanto!")
	talkState[talkUser] = 0
	npcHandler:releaseFocus(cid)
end
return true
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

if (msgcontains(msg, 'ajuda')) then
	npcHandler:say("Eu preciso de 30 Worms para ir pescar hoje com um grande amigo, prometi a ele que as levaria. Você poderia me ajudar?", cid)
	talkState[talkUser] = 1
end

if (msgcontains(msg, 'yes') and talkState[talkUser] == 1) then
	npcHandler:say("Obrigado! Estarei te esperando aqui!", cid)
	setPlayerStorageValue(cid, config.storage, 0)
	talkState[talkUser] = 0
	npcHandler:releaseFocus(cid)
elseif (msgcontains(msg, 'no') and talkState[talkUser] == 1) then
    npcHandler:say("Er, ok... Acho que não vou poder pescar hoje...", cid)
	talkState[talkUser] = 0
	npcHandler:releaseFocus(cid)
end

if (msgcontains(msg, 'yes') and talkState[talkUser] == 2) then
	if (doPlayerRemoveItem(cid, 3976, 30)) then
		npcHandler:say("Hmm, bom, bom... Aqui está a sua recompensa!", cid)
		doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Você recebeu 1000 exp e 500 gps")
		doPlayerAddExperience(cid, 1000)
		doPlayerAddMoney(cid, 500)
		setPlayerStorageValue(cid, config.storage, 1)
		talkState[talkUser] = 0
		npcHandler:releaseFocus(cid)
	else
		npcHandler:say("Ei! Eu sei contar, você só tem ".. getPlayerItemCount(cid, 3976) .." Worms", cid)
		talkState[talkUser] = 0
		npcHandler:releaseFocus(cid)
	end
elseif (msgcontains(msg, 'no') and talkState[talkUser] == 2) then
	npcHandler:say("O que você está esperando? Vá logo, por favor!", cid)
	talkState[talkUser] = 0
	npcHandler:releaseFocus(cid)
end

if (msgcontains(msg, 'yes') and talkState[talkUser] == 3) then
	npcHandler:say("Você não sabe como está me ajudando. Estarei esperando por aqui.", cid)
	setPlayerStorageValue(cid, config.storage, 2)
	npcHandler:releaseFocus(cid)
	talkState[talkUser] = 0
elseif (msgcontains(msg, 'no') and talkState[talkUser] == 3) then
    npcHandler:say("Er... ok! Estou arruinado!", cid)
	npcHandler:releaseFocus(cid)
	talkState[talkUser] = 0
end

if (msgcontains(msg, 'yes') and talkState[talkUser] == 4) then
	if (doPlayerRemoveItem(cid, 3976, 100)) then
		npcHandler:say("Brigadão! Eu sabia que você era confiável! Pensou que não ganharia nada em troca, não é?", cid)
		doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Você recebeu 2500 exp e 1500 gps")
		doPlayerAddExperience(cid, 2500)
		doPlayerAddMoney(cid, 1500)
		setPlayerStorageValue(cid, config.storage, 3)
		npcHandler:releaseFocus(cid)
		talkState[talkUser] = 0
	else
		npcHandler:say("Você tem apenas ".. getPlayerItemCount(cid, 3976) .." Worms!", cid)
		npcHandler:releaseFocus(cid)
		talkState[talkUser] = 0
	end
elseif (msgcontains(msg, 'no') and talkState[talkUser] == 4) then
	npcHandler:say("Estou esperando as Worms...", cid)
	npcHandler:releaseFocus(cid)
	talkState[talkUser] = 0
end
return true
end

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

 

Cya

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

  • 0

Obrigado Oneshot, mais ainda esta com um problema...

Como você ja viu é duas quests no mesmo NPC, mas esta com um problema, parece que quando eu termino as duas quests e digito "ajuda" ele repete a fala dele, com isso podendo fazer a quest tudo denovo, será que é so eu mudar esta linha?

 

      if (msgcontains(msg, 'ajuda')) then
               npcHandler:say("Eu preciso de 30 Worms para ir pescar hoje com um grande amigo, prometi a ele que as levaria. Você poderia me ajudar?", cid)
               talkState[talkUser] = 1
       end

 

Para isso?

      if (msgcontains(msg, 'ajuda') and getPlayerStorageValue(cid, config.storage) == -1) then
               npcHandler:say("Eu preciso de 30 Worms para ir pescar hoje com um grande amigo, prometi a ele que as levaria. Você poderia me ajudar?", cid)
               talkState[talkUser] = 1
       end

 

Seria isso? Ou algo diferente?

Link para o comentário
Compartilhar em outros sites

  • 0

Renatogold7,


Verdade, cometi um erro.

Você não precisa colocar a verificação de um storage, só usar mais um talkState.

 

local config = {
       storage = 8002 --Coloque o storage que você irá usar
}

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 greetCallback(cid)
local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid
       if (getPlayerStorageValue(cid, config.storage) == -1) then
               npcHandler:setMessage(MESSAGE_GREET, "Olá ".. getCreatureName(cid) ..". Estou precisando de {ajuda}!")
               talkState[talkUser] = 10
       elseif (getPlayerStorageValue(cid, config.storage) == 0) then
               npcHandler:setMessage(MESSAGE_GREET, "Já trouxe minhas Worms?")
               talkState[talkUser] = 2
       elseif (getPlayerStorageValue(cid, config.storage) == 1) then
               npcHandler:setMessage(MESSAGE_GREET, "Olá novamente ".. getCreatureName(cid) ..", meu amigo e eu abrimos um comércio de minhocas, mas estamos meio que sem estoque. Estou precisando de 100 Worms, será que você poderia me ajudar novamente?")
               talkState[talkUser] = 3
       elseif (getPlayerStorageValue(cid, config.storage) == 2) then
               npcHandler:setMessage(MESSAGE_GREET, "Conseguiu as Worms?")
               talkState[talkUser] = 4
       else
               npcHandler:setMessage(MESSAGE_GREET, "Olá ".. getCreatureName(cid) ..". Não estou precisando de ajuda por enquanto!")
               talkState[talkUser] = 0
               npcHandler:releaseFocus(cid)
       end
       return true
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

       if (msgcontains(msg, 'ajuda') and talkState[talkUser] == 10) then
               npcHandler:say("Eu preciso de 30 Worms para ir pescar hoje com um grande amigo, prometi a ele que as levaria. Você poderia me ajudar?", cid)
               talkState[talkUser] = 1
       end

       if (msgcontains(msg, 'yes') and talkState[talkUser] == 1) then
               npcHandler:say("Obrigado! Estarei te esperando aqui!", cid)
               setPlayerStorageValue(cid, config.storage, 0)
               talkState[talkUser] = 0
               npcHandler:releaseFocus(cid)
       elseif (msgcontains(msg, 'no') and talkState[talkUser] == 1) then
           npcHandler:say("Er, ok... Acho que não vou poder pescar hoje...", cid)
               talkState[talkUser] = 0
               npcHandler:releaseFocus(cid)
       end

       if (msgcontains(msg, 'yes') and talkState[talkUser] == 2) then
               if (doPlayerRemoveItem(cid, 3976, 30)) then
                       npcHandler:say("Hmm, bom, bom... Aqui está a sua recompensa!", cid)
                       doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Você recebeu 1000 exp e 500 gps")
                       doPlayerAddExperience(cid, 1000)
                       doPlayerAddMoney(cid, 500)
                       setPlayerStorageValue(cid, config.storage, 1)
                       talkState[talkUser] = 0
                       npcHandler:releaseFocus(cid)
               else
                       npcHandler:say("Ei! Eu sei contar, você só tem ".. getPlayerItemCount(cid, 3976) .." Worms", cid)
                       talkState[talkUser] = 0
                       npcHandler:releaseFocus(cid)
               end
       elseif (msgcontains(msg, 'no') and talkState[talkUser] == 2) then
               npcHandler:say("O que você está esperando? Vá logo, por favor!", cid)
               talkState[talkUser] = 0
               npcHandler:releaseFocus(cid)
       end

       if (msgcontains(msg, 'yes') and talkState[talkUser] == 3) then
               npcHandler:say("Você não sabe como está me ajudando. Estarei esperando por aqui.", cid)
               setPlayerStorageValue(cid, config.storage, 2)
               npcHandler:releaseFocus(cid)
               talkState[talkUser] = 0
       elseif (msgcontains(msg, 'no') and talkState[talkUser] == 3) then
           npcHandler:say("Er... ok! Estou arruinado!", cid)
               npcHandler:releaseFocus(cid)
               talkState[talkUser] = 0
       end

       if (msgcontains(msg, 'yes') and talkState[talkUser] == 4) then
               if (doPlayerRemoveItem(cid, 3976, 100)) then
                       npcHandler:say("Brigadão! Eu sabia que você era confiável! Pensou que não ganharia nada em troca, não é?", cid)
                       doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "Você recebeu 2500 exp e 1500 gps")
                       doPlayerAddExperience(cid, 2500)
                       doPlayerAddMoney(cid, 1500)
                       setPlayerStorageValue(cid, config.storage, 3)
                       npcHandler:releaseFocus(cid)
                       talkState[talkUser] = 0
               else
                       npcHandler:say("Você tem apenas ".. getPlayerItemCount(cid, 3976) .." Worms!", cid)
                       npcHandler:releaseFocus(cid)
                       talkState[talkUser] = 0
               end
       elseif (msgcontains(msg, 'no') and talkState[talkUser] == 4) then
               npcHandler:say("Estou esperando as Worms...", cid)
               npcHandler:releaseFocus(cid)
               talkState[talkUser] = 0
       end
       return true
end

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

 

No caso eu usei o talkState 10 para não compremeter o resto do script.

De modo que ele só vai responder ao "ajuda" se antes tiver falado que precisa dela.

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

  • 0

Vlw ai Oneshot, e obrigado por me dar esta dica! :smile_positivo:

 

Agora deu tudo certinho, obrigado por ter me ajudado, você até tinha melhorado meu script, vlw!

Qual quer duvida que eu tiver vou recorrer a você, pode ser? :positive:

 

E novamente, obrigado!

 

 

|-|-|-| EDIT |-|-|-|

 

Uma dúvida minha... Tem como depois de que você fizer uma quest com um npc ele começar a vender coisas? Ou ainda não é possivel?

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

×
×
  • Criar Novo...