Ir para conteúdo

Featured Replies

Postado

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:

 

 

 

 

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.

Visitante
Responder

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.6k

Informação Importante

Confirmação de Termo