Ir para conteúdo
  • Cadastre-se

Posts Recomendados

Créditos: 100% eu.

 

 

Boa tarde, vim fazer um rápido tutorial de como se fazer um gerenciador de quests.

 

Primeiro, crie um arquivo que lhe ajude a localizar as suas quests, exemplo:
 

<quest recommendedLevel="80" desc="head" x="162" y="93" z="7" uniqueID="9006" storageID="40006">
		<teleports>
			<teleport desc="city" fx="210" fy="158" fz="8" tx="146" ty="121" tz="7" /> <!-- f: from ; t: to -->
			<teleport desc="return" fx="161" fy="93" fz="7" tx="218" ty="176" tz="8" /><!-- f: from ; t: to -->
		</teleports>
		<prizes timeToReceive=""> <!-- anti sobe e desce -->
			<prize vocation="sorcerer" id="2323" count="1" experience="5250000" addon=""  />
			<prize vocation="druid" id="2323" count="1" experience="5250000" addon=""  />
			<prize vocation="paladin" id="7957" count="1" experience="5250000" addon=""  />
			<prize vocation="knight" id="2475" count="1" experience="5250000" addon="" />
		</prizes>
	</quest>
	
	<quest recommendedLevel="80" desc="armor" x="153" y="103" z="7" uniqueID="9007" storageID="40007">
		<teleports>
			<teleport desc="city" fx="210" fy="156" fz="8" tx="151" ty="106" tz="7" /> <!-- f: from ; t: to -->
			<teleport desc="return" fx="154" fy="103" fz="7" tx="218" ty="176" tz="8" /><!-- f: from ; t: to -->
		</teleports>
		<prizes timeToReceive=""> <!-- anti sobe e desce -->
			<prize vocation="sorcerer" id="8865" count="1" experience="2000000" addon=""  />
			<prize vocation="druid" id="8865" count="1" experience="2000000" addon=""  />
			<prize vocation="paladin" id="2660" count="1" experience="2000000" addon=""  />
			<prize vocation="knight" id="2483" count="1" experience="2000000" addon="" />
		</prizes>
	</quest>
	
	<quest recommendedLevel="80" desc="legs" x="165" y="95" z="7" uniqueID="9008" storageID="40008">
		<teleports>
			<teleport desc="city" fx="210" fy="154" fz="8" tx="176" ty="98" tz="5" /> <!-- f: from ; t: to -->
			<teleport desc="return" fx="167" fy="95" fz="7" tx="218" ty="176" tz="8" /><!-- f: from ; t: to -->
		</teleports>
		<prizes timeToReceive=""> <!-- anti sobe e desce -->
			<prize vocation="sorcerer" id="5918" count="1" experience="3000000" addon=""  />
			<prize vocation="druid" id="5918" count="1" experience="3000000" addon=""  />
			<prize vocation="paladin" id="8923" count="1" experience="3000000" addon=""  />
			<prize vocation="knight" id="2470" count="1" experience="3000000" addon="" />
		</prizes>
	</quest>
</quests>

Em seguida, crie um arquivo chamado questsManager.lua na pasta "actions\scripts\quests"

 

dentro deste arquivo, insira as constantes

local V_S = 1 -- voc sorcerer
local V_D = 2 -- voc druid
local V_P = 3 -- voc paladin
local V_K = 4 -- voc knight

Insira também uma tabela que cotenha todas as quests, com os seus respectivos storages

local allQuests = { -- quest UID with its STORAGE
[7500] = 25001,
[8000] = 30000,																[8001] = 30001,
[8002] = 30002, 															[8003] = 30003,
[8004] = 30004, 															[8005] = 30005
} 

novamente, crie uma outra tabela que conterá um item de recompensa

local setItemReward = { -- set piece reward or another item
[7500] = {[V_S] =  2175, [V_D] =  2175, [V_P] =  2175, [V_K] =  2175},
[8000] = {[V_S] =   nil, [V_D] =   nil, [V_P] =   nil, [V_K] =   nil},		[8001] = {[V_S] =   nil, [V_D] =   nil, [V_P] =   nil, [V_K] =   nil},
[8002] = {[V_S] =   nil, [V_D] =   nil, [V_P] =   nil, [V_K] =   nil},		[8003] = {[V_S] =   nil, [V_D] =   nil, [V_P] =   nil, [V_K] =   nil},
[8004] = {[V_S] =   nil, [V_D] =   nil, [V_P] =   nil, [V_K] =   nil},		[8005] = {[V_S] =   nil, [V_D] =   nil, [V_P] =   nil, [V_K] =   nil}
}

e outra, para a recompensa de experiência

local expReward = { -- set the amount of exp that player will gain
[7500] =    50000,
[8000] =   300000, 															[8001] =   300000,
[8002] =   300000, 															[8003] =   300000,
[8004] =   150000, 															[8005] =   750000
}

e finalmente, outra para a recompensa de gold

local platCoinsReward = { -- set money reward
[7500] =   0,
[8000] =   5, 																[8001] =   5,
[8002] =   5, 																[8003] =   5,
[8004] =   1, 																[8005] =   5
}

agora, ainda em questsManager.lua, insira uma função para verificar se a determinada quest já foi completada

function questAlreadyCompleted(cid, item)
	local queststatus = getPlayerStorageValue(cid,allQuests[item.uid])
	if queststatus == -1 then
		return false
	else
		return true
	end
end

logo após a função acima, insira a função principal

function onUse(cid, item, frompos, item2, topos)
        if not questAlreadyCompleted(cid, item) then
		
		-- getting player vocation
		local vocation = nil
		if isSorcerer(cid) then vocation = V_S end
		if isDruid(cid) then vocation = V_D end
		if isPaladin(cid) then vocation = V_P end
		if isKnight(cid) then vocation = V_K end
		
		-- adding rewards
		-- set item reward
		local setItemReward = setItemReward[item.uid][vocation]
		
		-- experience reward
		local experienceReward = expReward[item.uid]
		
		-- platinum coins reward
		local quantityOfPlatinumCoinsReward = platCoinsReward[item.uid]
		
		-- addon reward
		local addonReward = addonReward[item.uid]
		
		if setItemReward ~= nil then
			doPlayerAddItem(cid,setItemReward,1)
		end
		
		if experienceReward ~= nil and experienceReward > 0 then
			doPlayerAddExp(cid, experienceReward)
		end
		
		if quantityOfPlatinumCoinsReward ~= nil and quantityOfPlatinumCoinsReward> 0 then
			doPlayerAddItem(cid,2152,1)
		end
		
		setPlayerStorageValue(cid,allQuests[item.uid],1)
        else
		doPlayerSendTextMessage(cid,22,"Voce ja completou essa quest.")
	end
end

Agora, em "data\actions", abra o arquivo "actions.xml" e adicione a seguinte linha de código

<action uniqueid="7500; 8000-8005" event="script" value="quests/questsManager.lua"/> 

Bom, é isso.

Editado por warotserv (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Caro Daaniel, tentarei esclarecer suas dúvidas.

Pense no "questsManager.lua" como se fosse uma classe que implemente uma interface "Quest" cuja única assinatura é "function onUse(cid, item, frompos, item2, topos)".  Agora pense que cada quest seja uma classe que precise implementar a interface "Quest". Ao invés de implementar a interface "Quest" em cada uma dessas novas classes, não seria mais fácil extender a classe "questsManager.lua"? Então, é basicamente isso que o quest manager faz.

 

Caso ainda possua dúvidas, por favor, pergunte.

Link para o post
Compartilhar em outros sites
  • 3 months later...

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo