RE

[Npc] Quest - Tem Como?

Por Renatogold7, 12 de jul. de 2010 em Scripts

script
6
1.7k
Renatogold7R
12 de julho de 2010 às 22:57

[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 Julho 12 por Renatogold7

OneshotO
13 de julho de 2010 às 09:30

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 Julho 13 por Oneshot

Renatogold7R
13 de julho de 2010 às 13:26

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?

OneshotO
13 de julho de 2010 às 13:45

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 Julho 13 por Oneshot

Renatogold7R
13 de julho de 2010 às 13:57

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 Julho 13 por Renatogold7

AlissowA
13 de julho de 2010 às 14:49

Tópico movido para Dúvidas Sanadas.

Deixarei ainda o link aqui em Dúvidas sobre Scripts para a outra duvida do colega Renatogold7.