Ir para conteúdo

[Npc] - Gemeos Briguentos


cough

Posts Recomendados

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

 

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

<npc name="Jaum" script="data/npc/scripts/Jaum.lua" walkinterval="5000" floorchange="0">

<health now="100" max="100"/>

<look type="130" head="0" body="87" legs="106" feet="125" addons="3"/>

<parameters>

<parameter key="message_greet" value="Diiia |PLAYERNAME|! Quer um {trabalho}?" />

<parameter key="message_farewell" value="Inteh mais sow" />

<parameter key="module_keywords" value="1" />

<parameter key="keywords" value="hi" />

<parameter key="keyword_reply1" value="Sei que {hi} eh oi, mas falo ingles naum... Aprende a falar igual homem sow!" />

 

<parameter key="module_shop" value="1"/>

<parameter key="shop_buyable" value="blueberries,2677,2"/>

<parameter key="shop_sellable" value="blueberries,2677,1"/>

</parameters>

</npc>

 

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.

 

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

<npc name="Adaum" script="data/npc/scripts/Adaum.lua" walkinterval="5000" floorchange="0">

<health now="100" max="100"/>

<look type="130" head="0" body="94" legs="113" feet="132" addons="3"/>

<parameters>

<parameter key="message_greet" value="Opa |PLAYERNAME|! Duvida eu roubar a shovel do meu irmao e a esconder soh de sacanagem?" />

<parameter key="message_farewell" value="Flw..." />

<parameter key="module_keywords" value="1" />

<parameter key="keyword_reply1" value="Hi, bom to see oce. Como are you? My name's Adaum... blablabla..." />

 

<parameter key="module_shop" value="1"/>

<parameter key="shop_buyable" value="blueberries,2677,2"/>

<parameter key="shop_sellable" value="blueberries,2677,3"/>

</parameters>

</npc>

 

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:

 

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 shovelid = 2554

local storage = 2554

local getstorage = getPlayerStorageValue(cid, storage)

local sorrymessage = "Larga de ser mentiroso... Estah parecendo o Adaum"

local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid

 

if msgcontains(msg, 'shovel') then

if getstorage == 1 then

npcHandler:say("Voce jah completou o trabalho!", cid)

elseif getstorage < 1 then

npcHandler:say("Encontrou-a?", cid)

talkState[talkUser] = 1

end

elseif msgcontains(msg, 'trabalho') then

if getstorage < 1 then

npcHandler:say("Meu irmao gemeo escondeu minha {shovel} de novo. ", cid)

elseif getstorage == 1 then

npcHandler:say("Voce completou o trabalho, obrigado.", cid)

end

 

elseif msgcontains(msg, 'sim') then

if talkState[talkUser] == 1 then

if getstorage < 1 then

if doPlayerRemoveItem(cid, shovelid, 1) == TRUE then

npcHandler:say("Voce me trouxe a shovel, agora posso cavar em paz...", cid)

setPlayerStorageValue(cid, storage, 1)

doPlayerAddExp(cid, 200)

talkState[talkUser] = 0

elseif doPlayerRemoveItem(cid, shovelid, 1) == FALSE then

npcHandler:say(sorrymessage, cid)

talkState[talkUser] = 0

end

end

end

 

elseif(msgcontains(msg, 'nao') and talkState[talkUser] == 1) then

npcHandler:say("Tudo bem... Volte ao concluir o trabalho.", cid)

talkState[talkUser] = 0

end

 

return TRUE

end

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)

npcHandler:addModule(FocusModule:new())

 

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()) 

 

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 shovelid = 2554

local storage = 2554

local getstorage = getPlayerStorageValue(cid, storage)

local sorrymessage = "Ele naum estah com a shovel."

local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid

 

if msgcontains(msg, 'duvido') then

if getstorage < 1 then

npcHandler:say("Jah te entreguei a shovel rapah...", cid)

elseif getstorage == 1 then

npcHandler:say("Duvida mesmo? Ele tah me olhando, esconde por mim?", cid)

talkState[talkUser] = 1

end

 

elseif msgcontains(msg, 'sim') then

if talkState[talkUser] == 1 then

if getstorage == 1 then

npcHandler:say("Tome, escolha um lugar dificil hein.", cid)

setPlayerStorageValue(cid, storage, 0)

doPlayerAddItem(cid, 2554, 1)

talkState[talkUser] = 0

elseif getstorage == 0 then

npcHandler:say(sorrymessage, cid)

talkState[talkUser] = 0

end

end

 

elseif(msgcontains(msg, 'nao') and talkState[talkUser] == 1) then

npcHandler:say("Tah com medo de uma brincadeira boba eh?", cid)

talkState[talkUser] = 0

end

 

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

Link para o comentário
Compartilhar em outros sites

  • 1 year later...
×
×
  • Criar Novo...