Revirei a web procurando por um NPC que nos enviasse em uma missão atrás de um item, não sei se os membros daqui acham isso fácil, mas eu tive que me desdobrar durante uma tarde inteira!!! >_<'
Espero que curtam... ._.
Vamos ao que interessa:
A idéia é simples: Criar 2 NPCs gêmeos, um buscando por um item, outro o tirando do irmão.
No caso nosso item será uma pá.
Os chamei, respectivamente, de Jaum e Adaum pois o cenário no qual eles ficam é campestre, mas fiquem a vontade para alterar pelo que quiserem, tanto os nomes, quanto os objetos envolvidos.
Duplique um .xml da pasta \npc e apague tudo o que estiver nele. Cole o código abaixo e nomeie o arquivo como Jaum
Acho interessante ressaltar que a tag <parameters> controla, nesse caso, as ações de fala e comércio do NPC.
<parameter key="message_greet" value="Mensagem dita ao falarmos hi" />
<parameter_key="message_farewell" value="Mensagem dita ao falarmos bye" />
<parameter key="module_keywords" value="1" /> -- ativa o módulo Palavra-Chave
<parameter key="keywords" value="primeirakeyword;segundakeyword;enesimakeyword;separadasporpontoevirgula" />
<parameter key="keyword_reply1" value="Aqui fica a resposta do npc referente à primeirakeyword" />
<parameter key="keyword_reply2" value="Aqui fica a resposta do npc referente à segundakeyword" />
<parameter key="keyword_reply3" value="Aqui fica a resposta do npc referente à enesimakeyword" />
<parameter key="keyword_reply4" value="Sacaram né? o_O... Separe as palavras-chave por ponto e vírgula" />
<parameter key="module_shop" value="1"/> -- ativa o módulo de Compra
<parameter key="shop_buyable" value="blueberries,2677,2"/> -- Itens compráveis (no caso, blueberries, cujo ID é 2677 e o preço de compra 2gps.
<parameter key="shop_sellable" value="blueberries,2677,1"/> -- Itens a venda (no caso, blueberries, cujo ID é 2677 e o preço de venda, 1 gp.
Faça o mesmo, usando o código abaixo, e nomeio o arquivo de Adaum.
Os parâmetros são os mesmos do outro NPC, só que o Adaum compra blueberries 1gp mais caro. Grande merda né?
Agora, na pasta \npc\scripts crie dois arquivos.lua, Jaum e Adaum e use os códigos abaixo, respectivamente, para eles:
EXPLICAÇÃO POR PARTES (ou você achou que ia ficar no vácuo?):
PARTE I - O básico para funcionar
Essa parte eu não sei do que trata, não a ponto de explicar pelo menos. E, confesso, não me fez falta alguma. xDDD
Se alguém estiver interessado em complementar a explicação, fique a vontade.
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
PARTE II - Chamar números de palavras mais convenientes facilita a compreensão
local shovelid = 2554 -- onde houver a palavra shovelid o script entenderá como o número 2554 (id da shovel)
local storage = 2554 -- onde houve a palavra storage o script entenderá como o número 2554 (tal número será uma variável, pra podermos atribuirmos valores)
local getstorage = getPlayerStorageValue(cid, storage) -- getPlayerStorageValue significa que o script vai pegarValorStorageJogador, (ou seja, vai conferir o valor 'STORAGE' que nesse caso significa se você entregou pro NPC a shovel ou não entregou, TER STORAGE=1 SIGNIFICA QUE JÁ ENTREGOU A SHOVEL)
local sorrymessage = "Larga de ser mentiroso... Estah parecendo o Adaum" -- Onde houve sorrymessage o script entenderá como a frase dizendo para largar de ser mentiroso
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid -- Não faço a míiinima. xD
PARTE III - PRESTEM MUITA ATENÇÃO ONDE AS CONDIÇÕES SE (IF) COMEÇAM E ONDE TERMINAM
if msgcontains(msg, 'shovel') then -- se vc disser 'shovel' e
if getstorage == 1 then -- se tem o storage igual a 1 (ou seja, se já entregou a shovel) então
npcHandler:say("Voce jah completou o trabalho!", cid) -- npc diz
elseif getstorage < 1 then -- senão, caso tenha o storage abaixo de 1 (não tenha dado a shovel), então
npcHandler:say("Encontrou-a?", cid) --npc diz
talkState[talkUser] = 1 -- ativa fala1
end
elseif msgcontains(msg, 'trabalho') then -- se vc disser 'trabalho' e
if getstorage < 1 then -- tiver o storage abaixo de 1
npcHandler:say("Meu irmao gemeo escondeu minha {shovel} de novo. ", cid) -- npc diz
elseif getstorage == 1 then -- senão, caso tenha o storage igual a 1
npcHandler:say("Voce completou o trabalho, obrigado.", cid) -- npc diz
end
elseif msgcontains(msg, 'sim') then -- se disser 'sim' e
if talkState[talkUser] == 1 then -- se a fala1 estiver ativa (olhe mais acima, ter a fala1 ativa significa que o npc está perguntando se encontrou a shovel e vc acabou de dizer que sim)
if getstorage < 1 then -- se storage for menor que 1 (novamente: se não entregou a SHOVEL)
if doPlayerRemoveItem(cid, shovelid, 1) == TRUE then -- e se for possível remover a shovelid (olhe no início, verá que shovelid = 2554) do seu char, então
npcHandler:say("Voce me trouxe a shovel, agora posso cavar em paz...", cid) -- npc diz
setPlayerStorageValue(cid, storage, 1) -- ativa o storage valendo 1 (Isso significará que você entregou a SHOVEL)
doPlayerAddExp(cid, 200) -- adiciona 200 exp pro teu char
talkState[talkUser] = 0 -- desativa fala1
elseif doPlayerRemoveItem(cid, shovelid, 1) == FALSE then -- se não for possível remover a shovel (ou seja, se não estiver carregando uma) então
npcHandler:say(sorrymessage, cid) -- npc diz a 'sorrymessage' (leia no início qual é a sorrymessage)
talkState[talkUser] = 0 -- desativa fala1
end
end
end
elseif(msgcontains(msg, 'nao') and talkState[talkUser] == 1) then -- se vc disser que 'não' com a fala1 ativa respondeu negativamente a pergunta 'Encontrou-a?')
npcHandler:say("Tudo bem... Volte ao concluir o trabalho.", cid) -- e o npc dirá isso
talkState[talkUser] = 0 -- e desativa a fala1
end
PARTE IV - Mais comandos indispensáveis (TEM QUE TER) mas dispensáveis de compreender (ao menos eu penso assim)
return TRUE
end
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
-- OBS: PARTE I e IV idênticas ao evento anterior
PARTE II - Só muda a sorrymsg
local shovelid = 2554
local storage = 2554
local getstorage = getPlayerStorageValue(cid, storage)
local sorrymessage = "Ele naum estah com a shovel." -- Será usada quando você nem tiver entregue a shovel pro Jaum ainda e for falar com o Adaum
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
PARTE III - Gêmeo sacana! XD (Continue prestando atenção onde os IF começam e acabam
if msgcontains(msg, 'duvido') then -- se disser 'duvido' (olha a msg_greet do segundo quote <parameter key="message_greet" value="Opa |PLAYERNAME|! Duvida eu roubar a shovel do meu irmao e a esconder soh de sacanagem?" /> e
if getstorage < 1 then -- o storage estiver abaixo de um (ou seja, a SHOVEL foi entregue pro Jaum e roubada pelo Adaum já)
npcHandler:say("Jah te entreguei a shovel rapah...", cid) -- npc diz
elseif getstorage == 1 then -- senão, caso o storage seja igual a 1 (ou seja, caso a SHOVEL ainda esteja com o Jaum) então
npcHandler:say("Duvida mesmo? Ele tah me olhando, esconde por mim?", cid) -- npc diz
talkState[talkUser] = 1 -- ativa fala1
end
elseif msgcontains(msg, 'sim') then -- se disser 'sim' e
if talkState[talkUser] == 1 then -- se a fala1 estiver ativa (ou seja, se estiver dizendo sim para a pergunta: "Duvida mesmo? Ele tah me olhando, esconde por mim?")
if getstorage == 1 then -- se storage for igual a 1 (ou seja... se a SHOVEL estiver com o Jaum)
npcHandler:say("Tome, escolha um lugar dificil hein.", cid) -- npc diz
setPlayerStorageValue(cid, storage, 0) -- storage passa a valer zero agora! (A SHOVEL EH RETIRADA DO JAUM!)
doPlayerAddItem(cid, 2554, 1) -- o Adaum passa a Shovel pra vc esconder!
talkState[talkUser] = 0 -- desativa fala1
elseif getstorage == 0 then -- se storage for igual a zero... (ou seja, se o Jaum não tiver Shovel nehuma ainda) então
npcHandler:say(sorrymessage, cid) -- ...o Adaum dirá a sorrymessage dele (olhe mais acima aew que vc acha)
talkState[talkUser] = 0 -- desativa fala1
end
end
elseif(msgcontains(msg, 'nao') and talkState[talkUser] == 1) then -- se disser 'nao' e a fala1 estiver ativa estará dizendo negando a pergunta "Duvida mesmo? Ele tah me olhando, esconde por mim?")
npcHandler:say("Tah com medo de uma brincadeira boba eh?", cid) -- e npc dirá isso
talkState[talkUser] = 0 -- depois cancelará a fala1
end
É isso aew. Foi meu primeiro tutorial, espero ter ajudado... O fiz porque, sinceramente, é uma droga encontrar tutoriais ensinando como fazer NPC's aceitando itens de quest. Esse aqui aceita e rouba o item também, dá pra fazer a quest quantas vezes quiser fazer... Aí vai da imaginação de cada um colocar os irmãos longe um do outro, trocar a shovel por um item mais legal... Por bichos fortes no caminho pra esse item, aumentar a experiência da missão... Enfim. Mudem a vontade
Se gostou, comente. ^-^ Se não gostou, por favor, comente dizendo os motivos. ^^
Adoro críticas, são elas, unidas à nossa força de vontade, que nos fazem evoluir.
______________________________
Att. Cough
Orkut: Cough
Msn: fernando._.fsb@hotmail.com