Este script, pode ser considerado como uma implementação no sistema Jiddo.
Você adiciona o script, como se fosse um script normal, e depois usa ele mesmo em vários arquivos XML, para fazer suas quests de NPC mais rapidamente e facilmente.
Screenshoots:
Primeira missão do NPC de Exemplo (Encontrado no final do tópico):
Segunda missão do NPC de Exemplo (Encontrado no final do tópico):
Mensagem quando não tem mais missões:
Adicionando o sistema no seu server:
Crie um arquivo chamado yuniesystemquest.lua em npc/scripts contendo:
local keywordHandler = KeywordHandler:new()local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
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 getNPCConfigs(cid)
configs = {storageid = NpcSystem.getParameter('storageid')}
configs.mission = getPlayerStorageValue(cid, configs.storageid)
if (configs.mission < 1) then
configs.mission = 1
end
configs.addon_looktype = NpcSystem.getParameter('addon_looktype['..configs.mission..']') or 0
configs.addon_number = NpcSystem.getParameter('addon_number['..configs.mission..']') or 0
configs.minimumlevel = tonumber(NpcSystem.getParameter('minimumlevel')) or 0
a = 0
items = NpcSystem.getParameter('missionItems['..configs.mission..']')
if (items ~= nil) then
configs.items = transformInTable(items)
else
configs.items = nil
end
configs.noquests = nil
configs.msg = NpcSystem.getParameter('missionMsg['..configs.mission..']')
if (configs.msg == nil) then
configs.msg = NpcSystem.getParameter('finishedMissionsMsg')
configs.noquests = 1
else
configs.thanks = parseMessages(cid, NpcSystem.getParameter('missionThanks['..configs.mission..']'))
configs.experience = NpcSystem.getParameter('missionExperienceGain['..configs.mission..']') or nil
itemgain = NpcSystem.getParameter('missionItemGain['..configs.mission..']')
if (itemgain ~= nil) then
configs.itemgain = transformInTable(itemgain)
else
configs.itemgain = nil
end
end
configs.msg = parseMessages(cid, configs.msg)
return configs
end
function transformInTable(data)
-- based in npchandler:traveldata...
items = {}
for item in string.gmatch(data, '[^;]+') do
local i = 1
a = a + 1
itemid = nil
quantity = nil
for temp in string.gmatch(item, '[^,]+') do
if(i == 1) then
itemid = tonumber(temp)
elseif(i == 2) then
quantity = tonumber(temp)
else break
end
i = i+1
end
items[a] = {itemid = itemid, quantity = quantity}
end
return items
end
function parseMessages(cid, msg)
-- based in npchandler:parsemsg
TAG_PLAYERNAME = '|PLAYERNAME|'
parseInfo = { [TAG_PLAYERNAME] = getCreatureName(cid)}
local ret = msg
for search, replace in pairs(parseInfo) do
ret = string.gsub(ret, search, replace)
end
return ret
end
function askMission(cid, message, keywords, parameters, node)
--TODO: buyAddons function in modules.lua
if(not npcHandler:isFocused(cid)) then
return false
end
configs = getNPCConfigs(cid)
error = 'Sorry, but you need to have these items: '
itemshave = 0
itemsneeded = 0
if (parameters.confirm ~= true) and (parameters.decline ~= true) then
if (getPlayerLevel(cid) >= configs.minimumlevel) then
npcHandler:say(configs.msg, cid)
else
npcHandler:say('Only players higher than level '.. configs.minimumlevel ..' can do this quest.', cid)
npcHandler:resetNpc()
end
elseif (parameters.confirm == true) then
a = 1
itemstext = ''
-- checking items
if (configs.items == nil) then
else
for k, item in pairs(configs.items) do
itemsneeded = itemsneeded + 1
quantity = nil
itemid = nil
for i, v in pairs(item) do
if (i == 'quantity') then
quantity = v
elseif (i == 'itemid') then
itemid = v
end
end
if(getPlayerItemCount(cid,itemid) >= quantity) then
itemshave = itemshave + 1
else
error = error .." ".. quantity .." ".. getItemName(itemid).."(s)"
if (itemsneeded == table.maxn(configs.items)) then
error = error .. "."
else
error = error .. ","
end
end
end
end
-- end checking items
if itemshave == table.maxn(configs.items) and configs.items ~= nil or configs.items == nil then
if (configs.experience ~= nil) then
doPlayerAddExp(cid,configs.experience)
end
-- removing items
if (configs.items == nil) then
else
for k, item in pairs(configs.items) do
itemsneeded = itemsneeded + 1
quantity = nil
itemid = nil
for i, v in pairs(item) do
if (i == 'quantity') then
quantity = v
elseif (i == 'itemid') then
itemid = v
end
end
doPlayerRemoveItem(cid, itemid, quantity)
end
end
-- end removing items
-- add items
if (configs.itemgain == nil) then
else
for k, item in pairs(configs.itemgain) do
itemsneeded = itemsneeded + 1
quantity = nil
itemid = nil
for i, v in pairs(item) do
if (i == 'quantity') then
quantity = v
elseif (i == 'itemid') then
itemid = v
end
end
doPlayerAddItem(cid, itemid, quantity)
end
end
-- end add items
-- add addons
if (configs.addon_looktype ~= 0) then
doPlayerAddOutfit(cid, configs.addon_looktype, configs.addon_number)
end
-- end add addons
-- add storage
setPlayerStorageValue(cid, configs.storageid, configs.mission+1)
-- end add storage
npcHandler:say(configs.thanks, cid)
else
npcHandler:say(error, cid)
end
npcHandler:resetNpc()
elseif (parameters.decline == true) then
npcHandler:say('Ok then.', cid)
npcHandler:resetNpc()
end
return true
end
local node1 = keywordHandler:addKeyword({'mission'}, askMission, {})
node1:addChildKeyword({'yes'}, askMission, {confirm = true})
node1:addChildKeyword({'no'}, askMission, {decline = true})
npcHandler:addModule(FocusModule:new())
O script poderia ser menor sim, mas eu fiquei com preguiça de pesquisar algumas functions que eu tinha esquecido
Pronto, você adicionou o sistema no seu server
Utilizando o sistema:
Irei fazer aqui um exemplo de NPC usando todos os parâmetros contidos nesta lib.
Crie um arquivo chamado Yunie System Quest.xml em data/npc contendo:
<?xml version="1.0" encoding="UTF-8"?><npc name="Yunie System Quest" script="data/npc/scripts/yuniesystemquest.lua" walkinterval="2000" floorchange="0">
<health now="100" max="100"/>
<look type="130" head="39" body="122" legs="125" feet="57" addons="0"/>
<parameters>
<!-- Main Configs -->
<parameter key="storageid" value="26015"/> <!-- Must have -->
<parameter key="finishedMissionsMsg" value="Sorry, I have no missions to you now."/> <!-- Must have -->
<parameter key="minimumlevel" value="8" /> <!-- Not necessary -->
<!-- Begin first mission -->
<!-- First missions messages -->
<parameter key="missionMsg[1]" value="Hello, |PLAYERNAME|. Do you want a mission, ye? I have one... I need some items (100 green dragon leathers, 100 red dragon leathers). Can you help me?"/> <!-- Must have -->
<parameter key="missionThanks[1]" value="Thank you for helping..."/> <!-- Must have -->
<!-- Addon configurations for first mission -->
<parameter key="addon_looktype[1]" value="136" /> <!-- Not necessary -->
<parameter key="addon_number[1]" value="1" /> <!-- Not necessary -->
<!-- Experience you win when completing the mission -->
<parameter key="missionExperienceGain[1]" value="2000"/> <!-- Not necessary -->
<!-- Items that you obtain, completing the quest -->
<parameter key="missionItemGain[1]" value="5908,1"/> <!-- Not necessary -->
<!-- Items needed to complete the mission -->
<parameter key="missionItems[1]" value="5877,100;5948,100"/> <!-- Not necessary -->
<!-- Begin second mission -->
<!-- second missions messages -->
<parameter key="missionMsg[2]" value="Right, you already did a mission. Now I want more 30 green dragon leathers, and you will have your shaman addon full. Ok?"/> <!-- Must have -->
<parameter key="missionThanks[2]" value="Ok, thanks again."/> <!-- Must have -->
<!-- Addon configurations for second mission -->
<parameter key="addon_looktype[2]" value="136" /> <!-- Not necessary -->
<parameter key="addon_number[2]" value="2" /> <!-- Not necessary -->
<!-- Experience you win when completing the mission -->
<parameter key="missionExperienceGain[2]" value="500"/> <!-- Not necessary -->
<!-- Items that you obtain, completing the quest -->
<parameter key="missionItemGain[2]" value="2472,1"/> <!-- Not necessary -->
<!-- Items needed to complete the mission -->
<parameter key="missionItems[2]" value="5877,30"/> <!-- Not necessary -->
</parameters>
</npc>
Em negrito, seria onde você adiciona a lib do NPC, para usar todos estes parameters, e fazer o NPC...
No próprio NPC tem algumas explicações do sistema.
Parameters Feitos:
Uma lista aqui, com as caractéristicas e descrições de cada parameter que pode ser adicionado no seu NPC.
-
storageid (Obrigatório) - Armazena o storage value que será usado em toda a quest de um NPC, para determinar a missão em que você se encontra.
-
finishedMissionsMsg (Obrigatório) - Mensagem que o NPC vai dizer quando não tiver mais missões.
-
minimumlevel (Não obrigatório) - Level mínimo para fazer missões.
-
missionMsg[mission_id] (Obrigatório) - Mensagem que o NPC diz, ao você pedir informações sobre 'mission'.
-
missionThanks[missionid] (Obrigatório) - Mensagem de agradecimento do NPC, ao terminar uma missão.
-
addon_looktype[missionid] (Não obrigatório) - Outfit looktype, caso você queira que o player ganhe um addon.
-
addon_number[missionid] (Não obrigatório) - Addon ID, varia de 1 a 2, depende do addon que você quer.
-
missionExperienceGain[missionid] (Não obrigatório) - Experiência ganha ao terminar a missão.
-
missionItemGain[missionid] (Não obrigatório) - Items que ganha, ao terminar a missão (array).
-
missionItems[missionid] (Não obrigatório) - Items necessários para terminar a missão (array).
Caso tenham dúvidas, quanto a parameters ou outros... podem postar, responderei assim que ver a dúvida.
//Yunie~