josegremista 2 Postado Julho 11, 2013 Share Postado Julho 11, 2013 (editado) Como diz no Título, eu queria saber como faço para tipo: Eu fui em um npc e peguei uma task, aí digamos na pxg quando você clica no nome Quest, aparece todas as Quests que você está fazendo ou já completou e eu queria fazer o mesmo. Exemplo com print: Como fazer para fazer isso? Rep++ por 1 semana pra quem me ajudar!!! Editado Julho 11, 2013 por josegremista Link para o comentário Compartilhar em outros sites More sharing options...
StyloMaldoso 330 Postado Julho 11, 2013 Share Postado Julho 11, 2013 (editado) olha..até que é interessante e nunca fui mexer ai..porém testa ai data/XML/quests.xml creio que tara assim o arquivo.. <?xml version="1.0" encoding="UTF-8"?> <quests> <quest name="Example Quest I" startstorageid="30031" startstoragevalue="1"> <mission name="The head of Kiper" storageid="1001" startvalue="1" endvalue="3"> <missionstate id="1" description="Kill Kiper!"/> <missionstate id="2" description="Give his head to Talaturen!"/> <missionstate id="3" description="Take the medal you got from Talaturen to Ruly!"/> </mission> <mission name="Ruly's Revenge" storageid="30031" startvalue="4" endvalue="6"> <missionstate id="4" description="You received a document with instructions from Ruly, follow them."/> <missionstate id="5" description="Go back to Ruly and tell him that you followed his instructions to the end."/> <missionstate id="6" description="You got a reward from Ruly, he was very thankful with that you helped him to take his revenge."/> </mission> </quest> </quests> ai tipo e só voce i adicinando.. <quest name="Nome da Quest" startstorageid="Storage da Quest ao termina" startstoragevalue="1"> <mission name="The head of Kiper" storageid="1001" startvalue="1" endvalue="3"> <missionstate id="1" description="Kill Kiper!"/> <missionstate id="2" description="Give his head to Talaturen!"/> <missionstate id="3" description="Take the medal you got from Talaturen to Ruly!"/> </mission> Editado Julho 11, 2013 por StyloMaldoso Link para o comentário Compartilhar em outros sites More sharing options...
josegremista 2 Postado Julho 12, 2013 Autor Share Postado Julho 12, 2013 @Stylo eu tentei mais não apareceu veja como está o meu Quest.xml e veja print após eu pegarm quest. <?xml version="1.0" encoding="UTF-8"?><quests> <quest name="Example Quest I" startstorageid="30031" startstoragevalue="1"> <mission name="The head of Kiper" storageid="1001" startvalue="1" endvalue="3"> <missionstate id="1" description="Kill Kiper!"/> <missionstate id="2" description="Give his head to Talaturen!"/> <missionstate id="3" description="Take the medal you got from Talaturen to Ruly!"/> </mission> <mission name="Ruly's Revenge" storageid="30031" startvalue="4" endvalue="6"> <missionstate id="4" description="You received a document with instructions from Ruly, follow them."/> <missionstate id="5" description="Go back to Ruly and tell him that you followed his instructions to the end."/> <missionstate id="6" description="You got a reward from Ruly, he was very thankful with that you helped him to take his revenge."/> </mission> <mission name="Junior" storageid="30031" startvalue="7" endvalue="7"> <missionstate id="7" description="Mate 20 Abras, 20 Kadabras, 20 Hypnos e 25 Alakazams."/> </mission> </quest></quests> imagem mostrando que não funfo mas vou dar rep+ só por ter tentando me ajudar Link para o comentário Compartilhar em outros sites More sharing options...
Slicer 1070 Postado Julho 12, 2013 Share Postado Julho 12, 2013 (editado) nao eh pra por outro <mission>... eh pra por outro <quest>... e se for meu sistema de task, isso ae n vai da muito certo n... -a n ser q tu 'sete' uma storage para cada npc... ;p- Editado Julho 12, 2013 por Slicer Link para o comentário Compartilhar em outros sites More sharing options...
josegremista 2 Postado Julho 13, 2013 Autor Share Postado Julho 13, 2013 (editado) @slicer veja assim: <?xml version="1.0" encoding="UTF-8"?><quests> <quest name="Example Quest I" startstorageid="30031" startstoragevalue="1"> <mission name="The head of Kiper" storageid="1001" startvalue="1" endvalue="3"> <missionstate id="1" description="Kill Kiper!"/> <missionstate id="2" description="Give his head to Talaturen!"/> <missionstate id="3" description="Take the medal you got from Talaturen to Ruly!"/> </mission> <mission name="Ruly's Revenge" storageid="30031" startvalue="4" endvalue="6"> <missionstate id="4" description="You received a document with instructions from Ruly, follow them."/> <missionstate id="5" description="Go back to Ruly and tell him that you followed his instructions to the end."/> <missionstate id="6" description="You got a reward from Ruly, he was very thankful with that you helped him to take his revenge."/> </mission> <quest name="Junior" startstorageid="30031" startstoragevalue="1"> <mission name="Matar pokes psiquicos" storageid="1001" startvalue="7" endvalue="9"> <missionstate id="7" description="Mate 20 Abras, 20 Kadabras, 20 Hypnos e 25 Alakazams."/> <missionstate id="8" description="Depois me traga 2 mil colares de água"/> <missionstate id="9" description="Take the medal you got from Talaturen to Ruly!"/> </mission></quest></quests> Apareceu um error no distro assim: [12/07/2013 21:04:01] [Warning - Quests::loadFromXml] Cannot load quests file.[12/07/2013 21:04:01] Line: 21, Info: Premature end of data in tag quests line 2 @Slicer e como faço para "setar" uma storage para cada npc? Editado Julho 13, 2013 por josegremista Link para o comentário Compartilhar em outros sites More sharing options...
PostadorHunter 99 Postado Julho 13, 2013 Share Postado Julho 13, 2013 <?xml version="1.0" encoding="UTF-8"?> <quests> <quest name="Example Quest I" startstorageid="30031" startstoragevalue="1"> <mission name="The head of Kiper" storageid="1001" startvalue="1" endvalue="3"> <missionstate id="1" description="Kill Kiper!"/> <missionstate id="2" description="Give his head to Talaturen!"/> <missionstate id="3" description="Take the medal you got from Talaturen to Ruly!"/> </mission> <mission name="Ruly's Revenge" storageid="30031" startvalue="4" endvalue="6"> <missionstate id="4" description="You received a document with instructions from Ruly, follow them."/> <missionstate id="5" description="Go back to Ruly and tell him that you followed his instructions to the end."/> <missionstate id="6" description="You got a reward from Ruly, he was very thankful with that you helped him to take his revenge."/> </mission> </quest> <quest name="Junior" startstorageid="30031" startstoragevalue="1"> <mission name="Matar pokes psiquicos" storageid="1001" startvalue="7" endvalue="9"> <missionstate id="7" description="Mate 20 Abras, 20 Kadabras, 20 Hypnos e 25 Alakazams."/> <missionstate id="8" description="Depois me traga 2 mil colares de água"/> <missionstate id="9" description="Take the medal you got from Talaturen to Ruly!"/> </mission> </quest> </quests> Link para o comentário Compartilhar em outros sites More sharing options...
josegremista 2 Postado Julho 13, 2013 Autor Share Postado Julho 13, 2013 <?xml version="1.0" encoding="UTF-8"?> <quests> <quest name="Example Quest I" startstorageid="30031" startstoragevalue="1"> <mission name="The head of Kiper" storageid="1001" startvalue="1" endvalue="3"> <missionstate id="1" description="Kill Kiper!"/> <missionstate id="2" description="Give his head to Talaturen!"/> <missionstate id="3" description="Take the medal you got from Talaturen to Ruly!"/> </mission> <mission name="Ruly's Revenge" storageid="30031" startvalue="4" endvalue="6"> <missionstate id="4" description="You received a document with instructions from Ruly, follow them."/> <missionstate id="5" description="Go back to Ruly and tell him that you followed his instructions to the end."/> <missionstate id="6" description="You got a reward from Ruly, he was very thankful with that you helped him to take his revenge."/> </mission> </quest> <quest name="Junior" startstorageid="30031" startstoragevalue="1"> <mission name="Matar pokes psiquicos" storageid="1001" startvalue="7" endvalue="9"> <missionstate id="7" description="Mate 20 Abras, 20 Kadabras, 20 Hypnos e 25 Alakazams."/> <missionstate id="8" description="Depois me traga 2 mil colares de água"/> <missionstate id="9" description="Take the medal you got from Talaturen to Ruly!"/> </mission> </quest> </quests> Fui no npc, falei com ele peguei a task, mais nada apareceu no registro de quest. Mas valeu mesmo assim postadorHunter, quando eu poder dou rep+ pra você só por ter tentando me ajudar Link para o comentário Compartilhar em outros sites More sharing options...
StyloMaldoso 330 Postado Julho 13, 2013 Share Postado Julho 13, 2013 <?xml version="1.0" encoding="UTF-8"?> <quests> <quest name="Example Quest I" startstorageid="30031" startstoragevalue="1"> <mission name="The head of Kiper" storageid="1001" startvalue="1" endvalue="3"> <missionstate id="1" description="Kill Kiper!"/> <missionstate id="2" description="Give his head to Talaturen!"/> <missionstate id="3" description="Take the medal you got from Talaturen to Ruly!"/> </mission> <mission name="Ruly's Revenge" storageid="30031" startvalue="4" endvalue="6"> <missionstate id="4" description="You received a document with instructions from Ruly, follow them."/> <missionstate id="5" description="Go back to Ruly and tell him that you followed his instructions to the end."/> <missionstate id="6" description="You got a reward from Ruly, he was very thankful with that you helped him to take his revenge."/> </mission> </quest> <quest name="Junior" startstorageid="30031" startstoragevalue="1"> <mission name="Matar pokes psiquicos" storageid="1001" startvalue="7" endvalue="9"> <missionstate id="7" description="Mate 20 Abras, 20 Kadabras, 20 Hypnos e 25 Alakazams."/> <missionstate id="8" description="Depois me traga 2 mil colares de água"/> <missionstate id="9" description="Take the medal you got from Talaturen to Ruly!"/> </mission> </quest> </quests> vc não leo oque o Slicer postou.. ? se for para colokar o npc de task dele n da..pq sao todas ms storage (eu acho) Link para o comentário Compartilhar em outros sites More sharing options...
josegremista 2 Postado Julho 13, 2013 Autor Share Postado Julho 13, 2013 @Stylomaldoso mas ele falou se eu "sete" uma storage para cada npc, só poderia me dizer como faço isso ? Link para o comentário Compartilhar em outros sites More sharing options...
StyloMaldoso 330 Postado Julho 14, 2013 Share Postado Julho 14, 2013 Tipo..acho que ele quiz dizer assim.. vai no seu NPC de task do PDA v1.9 e procure por.. local stoFinal = Ai em cima disso voce adiciona.. local sto = 234324 Ai em baixo disso.. doPlayerAddItem(cid, 2152, 5) --premio vc adiciona isso.... setPlayerStorageValue(cid, sto, 1) Ai no quest.xml voce adiciona essa storage da quest e pah essa é a storage.. 234324 Link para o comentário Compartilhar em outros sites More sharing options...
josegremista 2 Postado Julho 14, 2013 Autor Share Postado Julho 14, 2013 (editado) Tipo..acho que ele quiz dizer assim.. vai no seu NPC de task do PDA v1.9 e procure por.. local stoFinal = Ai em cima disso voce adiciona.. local sto = 234324 Ai em baixo disso.. doPlayerAddItem(cid, 2152, 5) --premio vc adiciona isso.... setPlayerStorageValue(cid, sto, 1) Ai no quest.xml voce adiciona essa storage da quest e pah essa é a storage.. 234324 Hum ok, vou ver aqui, mas levou meu curti @Edit @Stylo eu tentei procurar o local stoFinal = mas não aparecia veja tentei em todos os npc de tasks veja print: Veja a scripter 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 local task = { ["Junior"] = {{"Abra", 20}, {"Kadabra", 20}, {"Alakazam", 25}, {"Hypno", 20}}, } if msgcontains(msg, 'tarefa') or msgcontains(msg, 'Tarefa') then if isMyTaskComplete(cid, getNpcCid()) then selfSay("Uau você já completou minha tarefa! Ok, então, tome a sua recompensa!", cid) doPlayerAddItem(cid, 2152, 5) --premio local sto = getMyTaskSto(cid, getNpcCid()) setPlayerStorageValue(cid, sto, -1) talkState[talkUser] = 0 return true else selfSay("Então, é uma tarefa simples, eu quero que você mate {20 Abras, 20 Kadabras, 20 Hypnos and 25 Alakazams}, você aceita está tarefa?", cid) talkState[talkUser] = 2 end elseif (msgcontains(msg, 'sim') or msgcontains(msg, 'Sim')) and talkState[talkUser] == 2 then if getMyTaskSto(cid, getNpcCid()) ~= -1 then selfSay("Você já está fazendo o meu trabalho! vai terminar ele!!", cid) talkState[talkUser] = 0 return true end local sto = getFreeTaskStorage(cid) if sto == -1 then selfSay("Você não pode pegar mais tarefas! Você já está com o máximo de "..(maxTasks).." tarefas!", cid) talkState[talkUser] = 0 return true end selfSay("K, então ... Vai matar seus alvos!", cid) setStorageArray(cid, sto, task) talkState[talkUser] = 0 return true end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) tu poderia me passar um npc de task que já tenha isso nele? @Edite @stylo cara eu peguei um npc de task, consegui fazer mais ou menos, mas o npc de task é só de item não é de matar pokémon, veja a scripter: 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 stg = 17760 -- storage para falar com o npc local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid if msgcontains(msg, 'mission') then if getPlayerStorageValue(cid, stg) >= 1 then selfSay("Sorry, you already completed this mission!!", cid) talkState[talkUser] = 0 else selfSay("Ooooh good! I'm looking for 35 remains of magikarp... They are: 35 remains of magikarp. You have this item?", cid) talkState[talkUser] = 1 end end --------------------------------------------------------- if (msgcontains(msg, "yes") or msgcontains(msg, "sim")) and talkState[talkUser] == 1 then if doPlayerRemoveItem(cid, 12334, 35) == TRUE then selfSay("Thank you!", cid) setPlayerStorageValue(cid, stg, 1) -- para ele nao fazer a missao novamente doPlayerAddExperience(cid,15000) -- experiencia local bags = getPlayerSlotItem(cid, 3) doAddContainerItem(bags.uid, 11452, 1) -- Enigma Stone else selfSay("Sorry, but you don't have one of these items.", cid) talkState[talkUser] = 0 end elseif (msgcontains(msg, "no") or msgcontains(msg, "nao")) and talkState[talkUser] == 1 then selfSay("Good bye '..getCreatureName(cid)..'.", cid) talkState[talkUser] = 0 end end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) Ele já tinha uma storage essa: local stg = 17760 -- storage para falar com o npc Ai eu peguei a storag e colouquei no quest.xml e dps que eu completei a task apareceu o nome junior no registro de quest, mas num apareceu nenhuma outra informação dps que eu cliko no nome junior fica todo preto só isso veja print: Só apareceu o nome no registro de quest dps que eu terminei a task, dps eu tava com os 35 resto de magikarp, dps que eu tava, eu falei com ele e ele removeu os restos de magikarp e o me deu uma enigma stone, e o nome dele apareceu lá no registro de quest. @Edited @Stylo eu peguei outro npc do 1.9 Fiz tudo certinho, mas na hora de falar com o npc dá error no distro error: [14/07/2013 20:12:20] [Error - Npc interface] [14/07/2013 20:12:20] data/npc/scripts/.JuniorTask.lua:onCreatureSay [14/07/2013 20:12:20] Description: [14/07/2013 20:12:20] data/lib/011-string.lua:29: attempt to index local 'str' (a number value) [14/07/2013 20:12:20] stack traceback: [14/07/2013 20:12:20] data/lib/011-string.lua:29: in function 'explode' [14/07/2013 20:12:20] data/npc/scripts/.JuniorTask.lua:21: in function 'callback' [14/07/2013 20:12:20] data/npc/lib/npcsystem/npchandler.lua:391: in function 'onCreatureSay' [14/07/2013 20:12:20] data/npc/scripts/.JuniorTask.lua:7: in function <data/npc/scripts/.JuniorTask.lua:7> Scripter do np c: 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 local task = { ["Junior"] = {{"Abra", 20}, {"Kadabra", 20}, {"Alakazam", 25}, {"Hypno", 20}}, } local sto = 234324 local stoFinal = 9659448 local tFinal = string.explode(getPlayerStorageValue(cid, stoFinal), ",") or {} if msgcontains(msg, 'task') or msgcontains(msg, 'Task') then if getPlayerStorageValue(cid, stoFinal) ~= -1 and isInArray(tFinal, getNpcName()) then selfSay("You already complete my task!", cid) talkState[talkUser] = 0 return true elseif isMyTaskComplete(cid, getNpcCid()) then selfSay("Wow you have already complete my task! Ok then, take your reward!", cid) doPlayerAddItem(cid, 2152, 5) --premio setPlayerStorageValue(cid, sto, 1) local sto = getMyTaskSto(cid, getNpcCid()) setPlayerStorageValue(cid, sto, -1) local SF = getPlayerStorageValue(cid, stoFinal) setPlayerStorageValue(cid, stoFinal, SF == -1 and getNpcName().."," or SF.. getNpcName()..",") talkState[talkUser] = 0 return true else selfSay("Then, is a simple task, i want to you kill {20 Abras, 20 Kadabras, 20 Hypnos and 25 Alakazams}, you accept the task?", cid) talkState[talkUser] = 2 end elseif (msgcontains(msg, 'yes') or msgcontains(msg, 'Yes')) and talkState[talkUser] == 2 then if getMyTaskSto(cid, getNpcCid()) ~= -1 then selfSay("You are already doing my task! go end it!", cid) talkState[talkUser] = 0 return true end local sto = getFreeTaskStorage(cid) if sto == -1 then selfSay("You can't catch more tasks! You are already with the maximum of "..(maxTasks).." tasks!", cid) talkState[talkUser] = 0 return true end selfSay("OK then... Go kill your targets!", cid) setStorageArray(cid, sto, task) talkState[talkUser] = 0 return true end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) Script do data/npc/lib/npcsystem/npchandler.lua -- Advanced NPC System (Created by Jiddo), -- Modified by Talaturen. if(NpcHandler == nil) then -- Constant talkdelay behaviors. TALKDELAY_NONE = 0 -- No talkdelay. Npc will reply immedeatly. TALKDELAY_ONTHINK = 1 -- Talkdelay handled through the onThink callback function. (Default) TALKDELAY_EVENT = 2 -- Not yet implemented -- Currently applied talkdelay behavior. TALKDELAY_ONTHINK is default. NPCHANDLER_TALKDELAY = TALKDELAY_ONTHINK -- Constant conversation behaviors. CONVERSATION_DEFAULT = 0 -- Conversation through default window, like it was before 8.2 update. CONVERSATION_PRIVATE = 1 -- Conversation through NPCs chat window, as of 8.2 update. (Default) --Small Note: Private conversations also means the NPC will use multi-focus system. -- Currently applied conversation behavior. CONVERSATION_PRIVATE is default. NPCHANDLER_CONVBEHAVIOR = CONVERSATION_PRIVATE -- Constant indexes for defining default messages. MESSAGE_GREET = 1 -- When the player greets the npc. MESSAGE_FAREWELL = 2 -- When the player unGreets the npc. MESSAGE_BUY = 3 -- When the npc asks the player if he wants to buy something. MESSAGE_ONBUY = 4 -- When the player successfully buys something via talk. MESSAGE_BOUGHT = 5 -- When the player bought something through the shop window. MESSAGE_SELL = 6 -- When the npc asks the player if he wants to sell something. MESSAGE_ONSELL = 7 -- When the player successfully sells something via talk. MESSAGE_SOLD = 8 -- When the player sold something through the shop window. MESSAGE_MISSINGMONEY = 9 -- When the player does not have enough money. MESSAGE_NEEDMONEY = 10 -- Same as above, used for shop window. MESSAGE_MISSINGITEM = 11 -- When the player is trying to sell an item he does not have. MESSAGE_NEEDITEM = 12 -- Same as above, used for shop window. MESSAGE_NEEDSPACE = 13 -- When the player don't have any space to buy an item MESSAGE_NEEDMORESPACE = 14 -- When the player has some space to buy an item, but not enough space MESSAGE_IDLETIMEOUT = 15 -- When the player has been idle for longer then idleTime allows. MESSAGE_WALKAWAY = 16 -- When the player walks out of the talkRadius of the npc. MESSAGE_DECLINE = 17 -- When the player says no to something. MESSAGE_SENDTRADE = 18 -- When the npc sends the trade window to the player MESSAGE_NOSHOP = 19 -- When the npc's shop is requested but he doesn't have any MESSAGE_ONCLOSESHOP = 20 -- When the player closes the npc's shop window MESSAGE_ALREADYFOCUSED = 21 -- When the player already has the focus of this npc. MESSAGE_PLACEDINQUEUE = 22 -- When the player has been placed in the costumer queue. -- Constant indexes for callback functions. These are also used for module callback ids. CALLBACK_CREATURE_APPEAR = 1 CALLBACK_CREATURE_DISAPPEAR = 2 CALLBACK_CREATURE_SAY = 3 CALLBACK_ONTHINK = 4 CALLBACK_GREET = 5 CALLBACK_FAREWELL = 6 CALLBACK_MESSAGE_DEFAULT = 7 CALLBACK_PLAYER_ENDTRADE = 8 CALLBACK_PLAYER_CLOSECHANNEL = 9 CALLBACK_ONBUY = 10 CALLBACK_ONSELL = 11 -- Addidional module callback ids CALLBACK_MODULE_INIT = 12 CALLBACK_MODULE_RESET = 13 -- Constant strings defining the keywords to replace in the default messages. TAG_PLAYERNAME = '|PLAYERNAME|' TAG_ITEMCOUNT = '|ITEMCOUNT|' TAG_TOTALCOST = '|TOTALCOST|' TAG_ITEMNAME = '|ITEMNAME|' TAG_QUEUESIZE = '|QUEUESIZE|' NpcHandler = { keywordHandler = nil, focuses = nil, talkStart = nil, idleTime = 90, talkRadius = 3, talkDelayTime = 5000, -- Seconds to delay outgoing messages. queue = nil, talkDelay = 5000, callbackFunctions = nil, modules = nil, shopItems = nil, -- They must be here since ShopModule uses "static" functions messages = { -- These are the default replies of all npcs. They can/should be changed individually for each npc. [MESSAGE_GREET] = 'Welcome, |PLAYERNAME|! I have been expecting you.', [MESSAGE_FAREWELL] = 'Good bye, |PLAYERNAME|!', [MESSAGE_BUY] = 'Do you want to buy |ITEMCOUNT| |ITEMNAME| for |TOTALCOST| gold coins?', [MESSAGE_ONBUY] = 'It was a pleasure doing business with you.', [MESSAGE_BOUGHT] = 'Bought |ITEMCOUNT|x |ITEMNAME| for |TOTALCOST| gold.', [MESSAGE_SELL] = 'Do you want to sell |ITEMCOUNT| |ITEMNAME| for |TOTALCOST| gold coins?', [MESSAGE_ONSELL] = 'Thank you for this |ITEMNAME|, |PLAYERNAME| gold.', [MESSAGE_SOLD] = 'Sold |ITEMCOUNT|x |ITEMNAME| for |TOTALCOST| gold.', [MESSAGE_MISSINGMONEY] = 'Sorry, you don\'t have enough money.', [MESSAGE_NEEDMONEY] = 'You do not have enough money.', [MESSAGE_MISSINGITEM] = 'You don\'t even have that item, |PLAYERNAME|!', [MESSAGE_NEEDITEM] = 'You do not have this object.', [MESSAGE_NEEDSPACE] = 'You do not have enough capacity.', [MESSAGE_NEEDMORESPACE] = 'You do not have enough capacity for all items.', [MESSAGE_IDLETIMEOUT] = 'Next, please!', [MESSAGE_WALKAWAY] = 'How rude!', [MESSAGE_DECLINE] = 'Not good enough, is it... ?', [MESSAGE_SENDTRADE] = 'Here\'s my offer, |PLAYERNAME|. Don\'t you like it?', [MESSAGE_NOSHOP] = 'Sorry, I\'m not offering anything.', [MESSAGE_ONCLOSESHOP] = 'Thank you, come back when you want something more.', [MESSAGE_ALREADYFOCUSED]= '', [MESSAGE_PLACEDINQUEUE] = '|PLAYERNAME|, please wait for your turn. There are |QUEUESIZE| customers before you.' } } -- Creates a new NpcHandler with an empty callbackFunction stack. function NpcHandler:new(keywordHandler) local obj = {} obj.callbackFunctions = {} obj.modules = {} if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then obj.focuses = {} obj.talkStart = {} else obj.queue = Queue:new(obj) obj.focuses = 0 obj.talkStart = 0 end obj.talkDelay = {} obj.keywordHandler = keywordHandler obj.messages = {} obj.shopItems = {} setmetatable(obj.messages, self.messages) self.messages.__index = self.messages setmetatable(obj, self) self.__index = self return obj end -- Re-defines the maximum idle time allowed for a player when talking to this npc. function NpcHandler:setMaxIdleTime(newTime) self.idleTime = newTime end -- Attackes a new keyword handler to this npchandler function NpcHandler:setKeywordHandler(newHandler) self.keywordHandler = newHandler end -- Function used to change the focus of this npc. function NpcHandler:addFocus(newFocus) if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then if(self:isFocused(newFocus)) then return end table.insert(self.focuses, newFocus) else self.focuses = newFocus end self:updateFocus() end NpcHandler.changeFocus = NpcHandler.addFocus --"changeFocus" looks better for CONVERSATION_DEFAULT -- Function used to verify if npc is focused to certain player function NpcHandler:isFocused(focus) if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then for k,v in pairs(self.focuses) do if v == focus then return true end end return false end return (self.focuses == focus) end -- This function should be called on each onThink and makes sure the npc faces the player it is talking to. -- Should also be called whenever a new player is focused. function NpcHandler:updateFocus() if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then for pos, focus in pairs(self.focuses) do if(focus ~= nil) then doNpcSetCreatureFocus(focus) return end end doNpcSetCreatureFocus(0) else doNpcSetCreatureFocus(self.focuses) end end -- Used when the npc should un-focus the player. function NpcHandler:releaseFocus(focus) if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then if(not self:isFocused(focus)) then return end local pos = nil for k,v in pairs(self.focuses) do if v == focus then pos = k end end table.remove(self.focuses, pos) self.talkStart[focus] = nil closeShopWindow(focus) --Even if it can not exist, we need to prevent it. self:updateFocus() else closeShopWindow(focus) self:changeFocus(0) end end -- Returns the callback function with the specified id or nil if no such callback function exists. function NpcHandler:getCallback(id) local ret = nil if(self.callbackFunctions ~= nil) then ret = self.callbackFunctions[id] end return ret end -- Changes the callback function for the given id to callback. function NpcHandler:setCallback(id, callback) if(self.callbackFunctions ~= nil) then self.callbackFunctions[id] = callback end end -- Adds a module to this npchandler and inits it. function NpcHandler:addModule(module) if(self.modules == nil or module == nil) then return false end module:init(self) if(module.parseParameters ~= nil) then module:parseParameters() end table.insert(self.modules, module) return true end -- Calls the callback function represented by id for all modules added to this npchandler with the given arguments. function NpcHandler:processModuleCallback(id, ...) local ret = true for i, module in pairs(self.modules) do local tmpRet = true if(id == CALLBACK_CREATURE_APPEAR and module.callbackOnCreatureAppear ~= nil) then tmpRet = module:callbackOnCreatureAppear(unpack(arg)) elseif(id == CALLBACK_CREATURE_DISAPPEAR and module.callbackOnCreatureDisappear ~= nil) then tmpRet = module:callbackOnCreatureDisappear(unpack(arg)) elseif(id == CALLBACK_CREATURE_SAY and module.callbackOnCreatureSay ~= nil) then tmpRet = module:callbackOnCreatureSay(unpack(arg)) elseif(id == CALLBACK_PLAYER_ENDTRADE and module.callbackOnPlayerEndTrade ~= nil) then tmpRet = module:callbackOnPlayerEndTrade(unpack(arg)) elseif(id == CALLBACK_PLAYER_CLOSECHANNEL and module.callbackOnPlayerCloseChannel ~= nil) then tmpRet = module:callbackOnPlayerCloseChannel(unpack(arg)) elseif(id == CALLBACK_ONBUY and module.callbackOnBuy ~= nil) then tmpRet = module:callbackOnBuy(unpack(arg)) elseif(id == CALLBACK_ONSELL and module.callbackOnSell ~= nil) then tmpRet = module:callbackOnSell(unpack(arg)) elseif(id == CALLBACK_ONTHINK and module.callbackOnThink ~= nil) then tmpRet = module:callbackOnThink(unpack(arg)) elseif(id == CALLBACK_GREET and module.callbackOnGreet ~= nil) then tmpRet = module:callbackOnGreet(unpack(arg)) elseif(id == CALLBACK_FAREWELL and module.callbackOnFarewell ~= nil) then tmpRet = module:callbackOnFarewell(unpack(arg)) elseif(id == CALLBACK_MESSAGE_DEFAULT and module.callbackOnMessageDefault ~= nil) then tmpRet = module:callbackOnMessageDefault(unpack(arg)) elseif(id == CALLBACK_MODULE_RESET and module.callbackOnModuleReset ~= nil) then tmpRet = module:callbackOnModuleReset(unpack(arg)) end if(not tmpRet) then ret = false break end end return ret end -- Returns the message represented by id. function NpcHandler:getMessage(id) local ret = nil if(self.messages ~= nil) then ret = self.messages[id] end return ret end -- Changes the default response message with the specified id to newMessage. function NpcHandler:setMessage(id, newMessage) if(self.messages ~= nil) then self.messages[id] = newMessage end end -- Translates all message tags found in msg using parseInfo function NpcHandler:parseMessage(msg, parseInfo) local ret = msg for search, replace in pairs(parseInfo) do ret = string.gsub(ret, search, replace) end return ret end -- Makes sure the npc un-focuses the currently focused player function NpcHandler:unGreet(cid) if(not self:isFocused(cid)) then return end local callback = self:getCallback(CALLBACK_FAREWELL) if(callback == nil or callback(cid)) then if(self:processModuleCallback(CALLBACK_FAREWELL)) then if(self.queue == nil or not self.queue:greetNext()) then local msg = self:getMessage(MESSAGE_FAREWELL) local parseInfo = { [TAG_PLAYERNAME] = getPlayerName(cid) } msg = self:parseMessage(msg, parseInfo) self:releaseFocus(cid) self:say(msg) end end end end -- Greets a new player. function NpcHandler:greet(cid) if(cid ~= 0) then local callback = self:getCallback(CALLBACK_GREET) if(callback == nil or callback(cid)) then if(self:processModuleCallback(CALLBACK_GREET, cid)) then local msg = self:getMessage(MESSAGE_GREET) local parseInfo = { [TAG_PLAYERNAME] = getCreatureName(cid) } msg = self:parseMessage(msg, parseInfo) if #msg >= 1 then selfSay(msg, cid)--alterado v1.4 --self:say(msg) else end self:addFocus(cid) end end end end -- Handles onCreatureAppear events. If you with to handle this yourself, please use the CALLBACK_CREATURE_APPEAR callback. function NpcHandler:onCreatureAppear(cid) local callback = self:getCallback(CALLBACK_CREATURE_APPEAR) if(callback == nil or callback(cid)) then if(self:processModuleCallback(CALLBACK_CREATURE_APPEAR, cid)) then -- end end end -- Handles onCreatureDisappear events. If you with to handle this yourself, please use the CALLBACK_CREATURE_DISAPPEAR callback. function NpcHandler:onCreatureDisappear(cid) local callback = self:getCallback(CALLBACK_CREATURE_DISAPPEAR) if(callback == nil or callback(cid)) then if(self:processModuleCallback(CALLBACK_CREATURE_DISAPPEAR, cid)) then if(self:isFocused(cid)) then self:unGreet(cid) end end end end -- Handles onCreatureSay events. If you with to handle this yourself, please use the CALLBACK_CREATURE_SAY callback. function NpcHandler:onCreatureSay(cid, class, msg) local callback = self:getCallback(CALLBACK_CREATURE_SAY) if(callback == nil or callback(cid, class, msg)) then if(self:processModuleCallback(CALLBACK_CREATURE_SAY, cid, class, msg)) then if(not self:isInRange(cid)) then return end if(self.keywordHandler ~= nil) then if((self:isFocused(cid) and (class == TALKTYPE_PRIVATE_PN or NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT)) or not self:isFocused(cid)) then local ret = self.keywordHandler:processMessage(cid, msg) if(not ret) then local callback = self:getCallback(CALLBACK_MESSAGE_DEFAULT) if(callback ~= nil and callback(cid, class, msg)) then if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then self.talkStart[cid] = os.time() else self.talkStart = os.time() end end else if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then self.talkStart[cid] = os.time() else self.talkStart = os.time() end end end end end end end -- Handles onPlayerEndTrade events. If you wish to handle this yourself, use the CALLBACK_PLAYER_ENDTRADE callback. function NpcHandler:onPlayerEndTrade(cid) local callback = self:getCallback(CALLBACK_PLAYER_ENDTRADE) if(callback == nil or callback(cid)) then if(self:processModuleCallback(CALLBACK_PLAYER_ENDTRADE, cid, class, msg)) then if(self:isFocused(cid)) then local parseInfo = { [TAG_PLAYERNAME] = getPlayerName(cid) } local msg = self:parseMessage(self:getMessage(MESSAGE_ONCLOSESHOP), parseInfo) self:say(msg, cid) end end end end -- Handles onPlayerCloseChannel events. If you wish to handle this yourself, use the CALLBACK_PLAYER_CLOSECHANNEL callback. function NpcHandler:onPlayerCloseChannel(cid) local callback = self:getCallback(CALLBACK_PLAYER_CLOSECHANNEL) if(callback == nil or callback(cid)) then if(self:processModuleCallback(CALLBACK_PLAYER_CLOSECHANNEL, cid, class, msg)) then if(self:isFocused(cid)) then self:unGreet(cid) end end end end -- Handles onBuy events. If you wish to handle this yourself, use the CALLBACK_ONBUY callback. function NpcHandler:onBuy(cid, itemid, subType, amount, ignoreCap, inBackpacks) local callback = self:getCallback(CALLBACK_ONBUY) if(callback == nil or callback(cid, itemid, subType, amount, ignoreCap, inBackpacks)) then if(self:processModuleCallback(CALLBACK_ONBUY, cid, itemid, subType, amount, ignoreCap, inBackpacks)) then -- end end end -- Handles onSell events. If you wish to handle this yourself, use the CALLBACK_ONSELL callback. function NpcHandler:onSell(cid, itemid, subType, amount, ignoreCap, inBackpacks) local callback = self:getCallback(CALLBACK_ONSELL) if(callback == nil or callback(cid, itemid, subType, amount, ignoreCap, inBackpacks)) then if(self:processModuleCallback(CALLBACK_ONSELL, cid, itemid, subType, amount, ignoreCap, inBackpacks)) then -- end end end -- Handles onThink events. If you wish to handle this yourself, please use the CALLBACK_ONTHINK callback. function NpcHandler:onThink() local callback = self:getCallback(CALLBACK_ONTHINK) if(callback == nil or callback()) then if(NPCHANDLER_TALKDELAY == TALKDELAY_ONTHINK) then if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then for cid, talkDelay in pairs(self.talkDelay) do if(talkDelay.time ~= nil and talkDelay.message ~= nil and os.time() >= talkDelay.time) then selfSay(talkDelay.message, cid) self.talkDelay[cid] = nil end end elseif(self.talkDelay.time ~= nil and self.talkDelay.message ~= nil and os.time() >= self.talkDelay.time) then selfSay(self.talkDelay.message) self.talkDelay.time = nil self.talkDelay.message = nil end end if(self:processModuleCallback(CALLBACK_ONTHINK)) then if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then for pos, focus in pairs(self.focuses) do if(focus ~= nil) then if(not self:isInRange(focus)) then self:onWalkAway(focus) elseif((os.time() - self.talkStart[focus]) > self.idleTime) then self:unGreet(focus) else self:updateFocus() end end end elseif(self.focuses ~= 0) then if(not self:isInRange(self.focuses)) then self:onWalkAway(self.focuses) elseif(os.time()-self.talkStart > self.idleTime) then self:unGreet(self.focuses) else self:updateFocus() end end end end end -- Tries to greet the player with the given cid. function NpcHandler:onGreet(cid) if(self:isInRange(cid)) then if(NPCHANDLER_CONVBEHAVIOR == CONVERSATION_PRIVATE) then if(not self:isFocused(cid)) then self:greet(cid) return end elseif(NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT) then if(self.focuses == 0) then self:greet(cid) elseif(self.focuses == cid) then local msg = self:getMessage(MESSAGE_ALREADYFOCUSED) local parseInfo = { [TAG_PLAYERNAME] = getCreatureName(cid) } msg = self:parseMessage(msg, parseInfo) if #msg >= 1 then self:say(msg) else end else if(not self.queue:isInQueue(cid)) then self.queue:push(cid) end local msg = self:getMessage(MESSAGE_PLACEDINQUEUE) local parseInfo = { [TAG_PLAYERNAME] = getCreatureName(cid), [TAG_QUEUESIZE] = self.queue:getSize() } msg = self:parseMessage(msg, parseInfo) self:say(msg) end end end end -- Simply calls the underlying unGreet function. function NpcHandler:onFarewell(cid) self:unGreet(cid) end -- Should be called on this npc's focus if the distance to focus is greater then talkRadius. function NpcHandler:onWalkAway(cid) if(self:isFocused(cid)) then local callback = self:getCallback(CALLBACK_CREATURE_DISAPPEAR) if(callback == nil or callback(cid)) then if(self:processModuleCallback(CALLBACK_CREATURE_DISAPPEAR, cid)) then if(self.queue == nil or not self.queue:greetNext()) then local msg = self:getMessage(MESSAGE_WALKAWAY) local parseInfo = { [TAG_PLAYERNAME] = getPlayerName(cid) } msg = self:parseMessage(msg, parseInfo) self:releaseFocus(cid) self:say(msg) end end end end end -- Returns true if cid is within the talkRadius of this npc. function NpcHandler:isInRange(cid) local distance = getDistanceTo(cid) or -1 if(distance == -1) then return false end return (distance <= self.talkRadius) end -- Resets the npc into it's initial state (in regard of the keyrodhandler). -- All modules are also receiving a reset call through their callbackOnModuleReset function. function NpcHandler:resetNpc() if(self:processModuleCallback(CALLBACK_MODULE_RESET)) then self.keywordHandler:reset() end end -- Makes the npc represented by this instance of NpcHandler say something. -- This implements the currently set type of talkdelay. -- shallDelay is a boolean value. If it is false, the message is not delayed. Default value is false. function NpcHandler:say(message, focus, shallDelay) local shallDelay = shallDelay or false if(NPCHANDLER_TALKDELAY == TALKDELAY_NONE or not shallDelay) then if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then selfSay(message, focus) return else selfSay(message) return end end -- TODO: Add an event handling method for delayed messages if(NPCHANDLER_CONVBEHAVIOR ~= CONVERSATION_DEFAULT) then self.talkDelay[focus] = { message = message, time = os.time() + self.talkDelayTime, } else self.talkDelay = { message = message, time = os.time() + self.talkDelayTime } end end end data/lib/011-string.lua string.split = function (str) local t = {} return not str:gsub("%w+", function(s) table.insert(t, s) return "" end):find("%S") and t or {} end string.trim = function (str) return str:gsub("^%s*(.-)%s*$", "%1") end string.explode = function (str, sep, limit) if(type(sep) ~= 'string' or isInArray({tostring(str):len(), sep:len()}, 0)) then return {} end local i, pos, tmp, t = 0, 1, "", {} for s, e in function() return string.find(str, sep, pos) end do tmp = str:sub(pos, s - 1):trim() if tmp ~= "" then --alterado v1.8 table.insert(t, tmp) end pos = e + 1 i = i + 1 if(limit ~= nil and i == limit) then break end end tmp = str:sub(pos):trim() if tmp ~= "" then --alterado v1.8 table.insert(t, tmp) end return t end string.expand = function (str) return string.gsub(str, "$(%w+)", function(n) return _G[n] end) end string.timediff = function (diff) local format = { {"week", diff / 60 / 60 / 24 / 7}, {"day", diff / 60 / 60 / 24 % 7}, {"hour", diff / 60 / 60 % 24}, {"minute", diff / 60 % 60}, {"second", diff % 60} } local t = {} for k, v in ipairs(format) do local d, tmp = math.floor(v[2]), "" if(d > 0) then tmp = (k < table.maxn(format) and (table.maxn(t) > 0 and ", " or "") or " and ") .. d .. " " .. v[1] .. (d ~= 1 and "s" or "") table.insert(t, tmp) end end return table.concat(t) end Se quiser o quest.xml aki também: <quests> <quest name="Example Quest I" startstorageid="30031" startstoragevalue="1"> <mission name="The head of Kiper" storageid="1001" startvalue="1" endvalue="3"> <missionstate id="1" description="Kill Kiper!"/> <missionstate id="2" description="Give his head to Talaturen!"/> <missionstate id="3" description="Take the medal you got from Talaturen to Ruly!"/> </mission> <mission name="Ruly's Revenge" storageid="30031" startvalue="4" endvalue="6"> <missionstate id="4" description="You received a document with instructions from Ruly, follow them."/> <missionstate id="5" description="Go back to Ruly and tell him that you followed his instructions to the end."/> <missionstate id="6" description="You got a reward from Ruly, he was very thankful with that you helped him to take his revenge."/> </mission> </quest> <quest name="Junior" startstorageid="234324" startstoragevalue="1"> <mission name="Matar pokes psiquicos" storageid="234324" startvalue="7" endvalue="9"> <missionstate id="7" description="Mate 20 Abras, 20 Kadabras, 20 Hypnos e 25 Alakazams."/> <missionstate id="8" description="Depois me traga 2 mil colares de água"/> <missionstate id="9" description="Take the medal you got from Talaturen to Ruly!"/> </mission> </quest> <quest name="Saulo" startstorageid="35565" startstoragevalue="1"> <mission name="Matar pokes psiquicos" storageid="35565" startvalue="10" endvalue="112"> <missionstate id="10" description="Vá em busca de 1000 jóias de água."/> <missionstate id="11" description="Depois me traga 100 colares de água"/> <missionstate id="12" description="E um water stone!"/> </mission> </quest> </quests> Editado Julho 14, 2013 por josegremista Link para o comentário Compartilhar em outros sites More sharing options...
vital900 570 Postado Agosto 4, 2013 Share Postado Agosto 4, 2013 Tópico movido para a seção de dúvidas e pedidos resolvidos. Tópico movido para a seção de dúvidas e pedidos resolvidos. Link para o comentário Compartilhar em outros sites More sharing options...
Stigal 584 Postado Abril 21, 2018 Share Postado Abril 21, 2018 A questão neste tópico de suporte foi encerrada por falta de respostas. Este tópico está fechado e foi movido para Suporte - Tópicos Sem Resposta. + Caso a dúvida não tenha sido resolvida você poderá criar outro tópico solicitando ajuda. * Lembre-se que é permitido dar UP no tópico a cada 24 horas para assim o destacar e manter movimentado. Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados