Postado Março 27, 2023 2 anos Olá! Estou disponibilizando um NPC que desenvolvi. Porém, devo avisar que só testei em TFS 0.4, e não posso garantir que funcionará em outras versões. Sobre: O NPC em questão é o "Gênio da Lâmpada". Para chegar até ele, o jogador precisa ter a "Lâmpada Mágica", que pode ser adquirida através de uma quest ou em algum evento do servidor, por exemplo. A lâmpada pode ser usada apenas uma vez e, mesmo que o jogador obtenha outra lâmpada, não poderá usá-la novamente. Ao usar a Lâmpada, o jogador será teleportado para a sala do Gênio. Lá, ele não poderá sair até realizar os três desejos. O Gênio pode atender desejos como "entregar itens", "reiniciar tasks", "completar addons" e até mesmo "matar um jogador". Você pode personalizar o NPC para oferecer outras recompensas, como "vip days", "premium points" ou "remover redskull". Seja criativo! :) Após o Gênio realizar os três desejos, o jogador será teleportado para o seu templo de origem. Vídeo demonstrativo: Spoiler NPCGenioDaLampadaByImperius-26-03-2023.mp4 data > actions > actions.xml Spoiler <!-- adicione o itemID que será a lâmpada do gênio --> <action itemid="XXXX" script="lampadaDoGenio.lua" /> data > actions > lampadaDoGenio.lua Spoiler function onUse(cid, item) -- Posição do NPC que o jogador irá teleportar local npcPosition = {x = 33180, y = 32824, z = 6} -- O valor do storage que será usado para controlar a quantidade de desejos do jogador. local storageValue = 5000000 local wishesUsed = tonumber(getPlayerStorageValue(cid, storageValue)) if wishesUsed >= 0 then doPlayerSendCancel(cid, "Voce so pode usar a "..getItemNameById(item.itemid).." uma unica vez.") doSendMagicEffect(getCreaturePosition(cid), 2) return true else setPlayerStorageValue(cid, storageValue, 0) end doTeleportThing(cid, npcPosition) doSendMagicEffect(getCreaturePosition(cid), 36) -- 36 | 53 doCreatureSay(getCreatureByName("Genio"), "Ola, "..getCreatureName(cid).."! Voce pode me pedir 3 desejos.") doRemoveItem(item.uid, 1) return true end data > npc > Genio.xml Spoiler <?xml version="1.0" encoding="UTF-8"?> <npc name="Genio" script="data/npc/scripts/Genio.lua" walkinterval="2000" floorchange="0"> <health now="100" max="100"/> <look type="80" head="0" body="0" legs="0" feet="0" addons="0"/> <voices> <voice text="Qual sera o seu desejo?" interval2="120" margin="1" yell="no"/> </voices> <parameters> <parameter key="message_greet" value="|PLAYERNAME| O que deseja pedir? {Desejos}"/> <parameter key="message_farewell" value="Adeus!"/> <parameter key="message_walkaway" value="Tchauzinho!" /> </parameters> </npc> data > npc > scripts > Genio.lua Spoiler -- NPC DESENVOLVIDO POR "Imperius". -- versão: 8.60 | TFS 0.4 -- data: 26/03/2023 -- SOBRE: -- Este NPC oferece ao jogador que possuir a lâmpada mágica do gênio a oportunidade de fazer três desejos. -- A lâmpada pode ser usada apenas uma vez e, mesmo que o jogador obtenha outra lâmpada, não poderá usá-la novamente. -- FUNCIONAMENTO - IMPORTANTE: -- É importante observar que (tasks e addons) pode ter storages diferentes do seu servidor, portanto, -- é necessário alterá-las, se necessário. -- LOCALIZAÇÃO DO NPC: -- O NPC deve ser colocado em um local fechado no mapa, onde os jogadores não possam chegar ou sair. -- Após conceder todos os três desejos, o NPC teleportará automaticamente o jogador de volta ao seu templo de origem. -- CONFIGURAÇÃO DO ITEM: -- Por fim, é importante criar um novo item com uma ID exclusiva para a lâmpada do gênio. 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:lower()) end function onThink() npcHandler:onThink() end local talkState = {} local storage = 5000000 -- Storage que salvará a quantidade de desejos do jogador. (recomendo não mexer). local npc = getCreatureByName("Genio") -- nome do NPC que será o gênio. -- ADICIONE AS IDs DOS ITENS QUE PODERÃO SER ENTREGUES PELO GÊNIO. -- a quantidade que será entregue sempre será "1" para qualquer item. local itemsID = {2493, 2523, 2640, 2400, 6579} -- TASKS QUE PODERÃO SER REINICIADAS. -- em seu servidor pode ser diferente os storage das tasks. Altere-os para não ter erro. local tasks = { -- [NAME TASK] = STORAGE TASK ["crocodiles"] = 320000, ["tarantulas"] = 320001, ["sea serpents"] = 14001, ["serpent spawns"] = 14002, ["stone golems"] = 14010, ["mammoths"] = 14011, ["ice golems"] = 14012, ["giant spiders"] = 14020, ["hydras"] = 14021, ["behemoths"] = 14022 } -- ADDONS QUE PODERÃO SER ENTREGUES AO JOGADOR. -- em seu servidor pode ser diferente os storage e os looktypes dos outfits. Altere-os para não ter erro. local addons = { -- [OUTFIT NAME] = {["first"]} = STORAGE, ["second"] = STORAGE, ["female"] = LOOKTYPE, ["male"] = LOOKTYPE} ["citizen"] = {["first"] = 10001, ["second"] = 10002, ["female"] = 136, ["male"] = 128}, ["hunter"] = {["first"] = 10003, ["second"] = 10004, ["female"] = 137, ["male"] = 129}, ["knight"] = {["first"] = 10005, ["second"] = 10006, ["female"] = 139, ["male"] = 131}, ["mage"] = {["first"] = 10007, ["second"] = 10008, ["female"] = 138, ["male"] = 130}, ["summoner"] = {["first"] = 10009, ["second"] = 10010, ["female"] = 141, ["male"] = 133}, ["barbarian"] = {["first"] = 10011, ["second"] = 10012, ["female"] = 147, ["male"] = 143}, ["druid"] = {["first"] = 10013, ["second"] = 10014, ["female"] = 148, ["male"] = 144}, ["oriental"] = {["first"] = 10017, ["second"] = 10018, ["female"] = 150, ["male"] = 146}, ["warrior"] = {["first"] = 10019, ["second"] = 10020, ["female"] = 142, ["male"] = 134}, ["wizard"] = {["first"] = 10021, ["second"] = 10022, ["female"] = 149, ["male"] = 145}, ["assassin"] = {["first"] = 10023, ["second"] = 10024, ["female"] = 156, ["male"] = 152}, ["beggar"] = {["first"] = 10025, ["second"] = 10026, ["female"] = 157, ["male"] = 153}, ["pirate"] = {["first"] = 10027, ["second"] = 10028, ["female"] = 155, ["male"] = 151}, ["shaman"] = {["first"] = 10029, ["second"] = 10030, ["female"] = 158, ["male"] = 154}, ["norseman"] = {["first"] = 10031, ["second"] = 10032, ["female"] = 252, ["male"] = 251}, ["jester"] = {["first"] = 10033, ["second"] = 10034, ["female"] = 270, ["male"] = 273}, ["demonhunter"] = {["first"] = 10034, ["second"] = 10036, ["female"] = 288, ["male"] = 289}, ["nightmare"] = {["first"] = 10037, ["second"] = 10038, ["female"] = 269, ["male"] = 268}, ["brotherhood"] = {["first"] = 10039, ["second"] = 10040, ["female"] = 279, ["male"] = 278} } -- ==== [INICIO - FUNÇÕES DE CONFIGURAÇÕES] ==== -- -- RECOMENDO NÃO MEXER PARA NÃO TER PROBLEMAS -- -- Retorna uma string concatenada com o nome de cada item da lista de "itemsID". function getListItemsName() local itemsName = {} for i, id in ipairs(itemsID) do table.insert(itemsName, "{{"..getItemNameById(id).."}}") end local result = table.concat(itemsName, ", ") return result:gsub(",([^,]+)$", " ou%1") end -- Retorna uma string concatenada com o nome de cada task que pode ser reiniciada. function getListTasksName() local tasksName = {} for name, storage in pairs(tasks) do table.insert(tasksName, "{{"..name.."}}") end local result = table.concat(tasksName, ", ") return result:gsub(",([^,]+)$", " ou%1") end -- Retorna uma string concatenada com o nome de cada addon de outfit function getListAddonsName() local addonsName = {} for name, data in pairs(addons) do table.insert(addonsName, "{{"..name.."}}") end local result = table.concat(addonsName, ", ") return result:gsub(",([^,]+)$", " ou%1") end -- Sempre que um desejo for concedido, adicionará +1 no storage dos desejos. -- Quando todos os "3" desejos forem concedidos, o jogador será teleportado ao seu templo e o npc "Genio" se despedirá function checkRemainingWishes(cid, storage, desejosUsados) setPlayerStorageValue(cid, storage, desejosUsados) if desejosUsados == 3 then local npc = getCreatureByName("Genio") doCreatureSay(npc, "Meu trabalho terminou por aqui.") doCreatureSay(npc, "Adeus "..getCreatureName(cid).."! :)") -- teleporta o player até o seu templo local pos = getTownTemplePosition(getPlayerTown(cid), false) doTeleportThing(cid, pos, true) doSendMagicEffect(getCreaturePosition(cid), 23) end end -- Envia o item escolhido dentro de uma parcel para o DEPOT da CITY do jogador. function sendItemToPlayerDepot(cid, itemID) local parcel = doCreateItemEx(2595) local item = doCreateItemEx(itemID) doAddContainerItemEx(parcel, item) doPlayerSendMailByName(getCreatureName(cid), parcel, getPlayerTown(cid)) end -- ==== [FIM - FUNÇÕES DE CONFIGURAÇÕES] ==== -- function creatureSayCallback(cid, type, msg, item) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid local msg = string.lower(msg) local desejosUsados = tonumber(getPlayerStorageValue(cid, storage)) local desejosRestantes = (desejosUsados >= 1) and 3 - desejosUsados or 3 -- caso nao foi o jogador que invocou o genio if getPlayerStorageValue(cid, storage) < 0 then selfSay('Voce nao e o meu mestre', cid) npcHandler:releaseFocus(cid) -- Caso o jogador já tenha utilizado todos os desejos elseif desejosRestantes == 0 then selfSay('Sinto muito, voce ja usou todos os seus desejos.', cid) npcHandler:releaseFocus(cid) ----- Opção: Desejos elseif isInArray({"desejos"}, msg) then talkState[talkUser] = 1 selfSay('Voce pode me pedir '..desejosRestantes..' desejos.', cid) selfSay('{{5kk}}, {{itens}}, {{addons}}, {{tasks}} ou {{matar um jogador}}', cid) -- Opção: 5kk elseif isInArray({"5kk"}, msg) and talkState[talkUser] == 1 then talkState[talkUser] = '5kk' selfSay('Precisando de grana? Posso te ajudar com isso...', cid) selfSay('Deseja realmente os 5kk? {{sim}} ou {{nao}}', cid) -- Confirmação: 5kk elseif isInArray({"sim"}, msg) and talkState[talkUser] == '5kk' then doPlayerAddItem(cid, 2160, 500) doSendMagicEffect(getCreaturePosition(cid), 11) selfSay('Feito! Aproveite os seus {{5kks}}.', cid) talkState[talkUser] = 0 checkRemainingWishes(cid, storage, desejosUsados + 1) npcHandler:releaseFocus(cid) -- Opção: Itens elseif isInArray({"itens"}, msg) and talkState[talkUser] == 1 then talkState[talkUser] = 'itens' selfSay('Certo... Me diga o {{nome}} de um item que voce deseja.', cid) selfSay(getListItemsName(), cid) -- Escolhendo: Itens elseif talkState[talkUser] == 'itens' then local itemName = msg local itemID = getItemIdByName(itemName) if not isInArray(itemsID, itemID) then selfSay('Esse item nao esta na minha lista.', cid) else selfSay('Posso te ajudar com isso.', cid) selfSay('enviarei o item para o depot da sua city.', cid) selfSay('{{'..itemName..'}}. Entao esse e o seu desejo? {{sim}} ou {{nao}}', cid) talkState[talkUser] = {'item_yes', itemID} end -- Confirmação: Itens elseif isInArray({"sim"}, msg) and talkState[talkUser][1] == "item_yes" then selfSay('Tudo bem, divirta-se com o seu novo brinquedinho...', cid) sendItemToPlayerDepot(cid, talkState[talkUser][2]) doSendMagicEffect(getCreaturePosition(cid), 11) talkState[talkUser] = 0 checkRemainingWishes(cid, storage, desejosUsados + 1) npcHandler:releaseFocus(cid) -- Opção: Addons elseif isInArray({"addons"}, msg) and talkState[talkUser] == 1 then talkState[talkUser] = 'addons' selfSay('Querendo dar um tapa no visual? Posso te ajudar com isso...', cid) selfSay('Qual addon voce deseja? '..getListAddonsName()..'', cid) -- Escolhendo: Addons elseif talkState[talkUser] == 'addons' then if addons[msg] ~= nil then talkState[talkUser] = {'addons_choice', msg} selfSay('Certo! Qual voce deseja? {{first}} ou {{second}', cid) selfSay('Apos escolher, nao podera voltar atras.', cid) else selfSay('Esse addon nao esta na minha lista. Sinto muito.', cid) end -- Confirmação: Addons elseif isInArray({"first", "second"}, msg) and talkState[talkUser][1] == 'addons_choice' then local typeAddon = (msg == "first") and 1 or 2 setPlayerStorageValue(cid, addons[talkState[talkUser][2]][msg], 1) doPlayerAddOutfit(cid, addons[talkState[talkUser][2]]["male"], typeAddon) doPlayerAddOutfit(cid, addons[talkState[talkUser][2]]["female"], typeAddon) selfSay('Seu desejo foi concedido!', cid) selfSay('Voce agora tem o {{'..msg..' '..talkState[talkUser][2]..' addon}}', cid) doSendMagicEffect(getCreaturePosition(cid), 51) talkState[talkUser] = 0 checkRemainingWishes(cid, storage, desejosUsados + 1) npcHandler:releaseFocus(cid) -- Opção: Tasks elseif isInArray({"tasks"}, msg) and talkState[talkUser] == 1 then talkState[talkUser] = 'task' selfSay('Posso reiniciar qualquer task', cid) selfSay('Basta me dizer um {{nome}}. '..getListTasksName()..'', cid) -- Escolhendo: Tasks elseif talkState[talkUser] == 'task' then if tasks[msg] then talkState[talkUser] = {'task_yes', msg} selfSay('Posso reiniciar a task {{'..msg..'}} para voce.', cid) selfSay('Esse e o seu desejo? {{sim}} ou {{nao}}', cid) else selfSay('Nao encontrei nenhuma task com este nome', cid) end -- Confirmação: Tasks elseif msg == "sim" and talkState[talkUser][1] == 'task_yes' then selfSay('Feito!', cid) setPlayerStorageValue(cid, tasks[talkState[talkUser][2]], 1) doSendMagicEffect(getCreaturePosition(cid), 11) checkRemainingWishes(cid, storage, desejosUsados + 1) talkState[talkUser] = 0 npcHandler:releaseFocus(cid) -- Opção: Matar um jogador elseif isInArray({"matar jogador", "matar um jogador"}, msg) then talkState[talkUser] = 'kill' doCreatureSay(npc, 'HeHeHaHeAhAHe!', TALKTYPE_ORANGE_1) selfSay('Hmmm... Tem alguem te incomodando?', cid) selfSay('Me fale o {{nome}} do meliante e eu o matarei para voce!', cid) -- Escolhendo: Matar um jogador elseif msg and talkState[talkUser] == 'kill' then local playerName = msg local player = getCreatureByName(playerName) if not player then selfSay('Desculpe, eu nao consegui encontrar o jogador '..playerName..'.', cid) elseif getPlayerAccess(player) >= 3 then selfSay('Voce e muito ousado meu caro...', cid) selfSay('Infelizmente nao tenho esse poder, mas voce pode escolher outro jogador.', cid) selfSay('Basta me dizer um {{nome}}.', cid) else if player == cid then selfSay('Voce e bem estranho...', cid) selfSay('Nao posso fazer isso. Tenho meus principios...', cid) else selfSay('Interessante! Cuidarei de {{'..playerName..'}} para voce se e isso que voce quer.', cid) selfSay('Tem realmente certeza disso? {{sim}} ou {{nao}}', cid) talkState[talkUser] = {'kill_yes', player} end end -- Confirmação: Matar um jogador elseif msg == "sim" and talkState[talkUser][1] == 'kill_yes' then local playerToKill = talkState[talkUser][2] local playerToKillName = getCreatureName(talkState[talkUser][2]) if playerToKillName then doSendMagicEffect(getCreaturePosition(npc), 65) selfSay('Seu desejo foi concedido, {{'..playerToKillName..'}} foi morto!', cid) doSendMagicEffect(getCreaturePosition(playerToKill), 40) doCreatureSay(playerToKill, 'HaHaHaHa!', TALKTYPE_ORANGE_1) doCreatureAddHealth(playerToKill, -getCreatureMaxHealth(playerToKill)) talkState[talkUser] = 0 checkRemainingWishes(cid, storage, desejosUsados + 1) npcHandler:releaseFocus(cid) else selfSay('Puts! O meliante acabou de sair, que safado!', cid) selfSay('Voce pode me dizer outro {{nome}} se quiser.', cid) talkState[talkUser] = 'kill' end -- Cancelamento elseif isInArray({"nao"}, msg) then selfSay('Tudo bem entao', cid) talkState[talkUser] = 0 npcHandler:releaseFocus(cid) end return true end --npcHandler:setCallback(MESSAGE_GREET) npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) Isso é tudo! Se tiverem sugestões ou dúvidas, estou à disposição!
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.