Ir para conteúdo

[NPC][TFS 1.x] Forja/Troca


Leohige

Posts Recomendados

Bom, comecei a aprender Lua hoje e como joguei Tibia a alguns anos atrás decidi desenvolver scripts pro joguinho. Este script é o meu primeiro trabalho com a linguagem, portanto está bem simples mas também funcional.

 

A ideia do NPC é que você possa definir um ou mais itens para serem trocados/forjados por/em um item X. Você também pode por uma ou mais storages para que o player possa efetuar a troca/forja, ou se precisa ser premium account.

 

Aqui tem um GIF demonstrando como o NPC funciona.

 npc.thumb.gif.fb27bbd1cd38932698160a95f8a1b448.gif

 

Se você gostou e quer usar em seu servidor, a instalação é bem simples.

 

Crie um arquivo chamado Marcus Vinicius.xml na pasta data/npc

 

Spoiler

<?xml version="1.0" encoding="UTF-8"?>
<npc name="Marcus Vinicius" script="forge.lua" walkinterval="2000" floorchange="0">
	<health now="100" max="100" />
	<look type="131" head="20" body="39" legs="45" feet="7" addons="2" />
</npc>

 

 

Crie um arquivo chamado forge.lua na pasta data/npc/scripts

 

Spoiler

-- Items to forge
local items = {
    {
        id = 2466, 
        requirements = {
            {id = 9971, count = 20}
        },
        storages = {
            {key = 1010, value = 1}
        },
        premium = true
    },
    {
        id = 2183, 
        requirements = {
            {id = 12508, count = 2}
        }
    },
    {
        id = 7753, 
        requirements = {
            {id = 5887, count = 10},
            {id = 7760, count = 1}
        }
    }
}

local nodes = {}
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

for i = 1, #items, 1 do
    local requirements = items[i].requirements
    local storages = items[i].storages or {}
    local premium = items[i].premium or false
    local itemId = items[i].id 
    local item = doCreateItemEx(itemId)
    
    if not isItem(item) then
        error('Item ' .. itemId .. ' is not valid!')
    end
    
    -- Items message
    if i == 1 then
        msgItems = 'I can forge: {' .. getItemName(itemId) .. '}'
    elseif #items == i then
        msgItems = msgItems .. ' and {' .. getItemName(itemId) .. '}.'
        table.insert(nodes, keywordHandler:addKeyword({'items'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = msgItems} ))        
    else
        msgItems = msgItems .. ', {' .. getItemName(itemId) .. '}'
    end
    
    for j = 1, #requirements, 1 do
        local rCountItem = requirements[j].count
        local rItemId = requirements[j].id
        local rItem = doCreateItemEx(rItemId)
        
        if not isItem(rItem) then
            error('Item ' .. itemId .. ' is not valid!')
        end
        
        -- Requirements message
        if j == 1 and j == #requirements then
            msg = 'Would you like to forge ' .. rCountItem .. ' ' .. getItemName(rItemId)
            msg = msg .. ' into 1 ' .. getItemName(itemId) .. '?'
        elseif j == 1 then
            msg = 'Would you like to forge ' .. rCountItem .. ' ' .. getItemName(rItemId)
        elseif j == #requirements then
            msg = msg .. ' and ' .. rCountItem .. ' ' .. getItemName(rItemId)
            msg = msg .. ' into 1 ' .. getItemName(itemId) .. '?'
        else
            msg = msg .. ', ' .. rCountItem .. ' ' .. getItemName(rItemId)
        end
    end
    
    nodes[i] = keywordHandler:addKeyword({getItemName(itemId)}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = msg} )
    nodes[i]:addChildKeyword({'yes'}, StdModule.forge, {npcHandler = npcHandler, premium = premium, cost = requirements, item = itemId, storages = storages})
    nodes[i]:addChildKeyword({'no'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, reset = true, text = 'Ok!'})
end

npcHandler:addModule(FocusModule:new())

 

 

Agora vá até o arquivo data/npc/lib/npcsystem/modules.lua e antes do último end adicione o seguinte código

 

Quote

    function StdModule.forge(cid, message, keywords, parameters, node)
        local npcHandler = parameters.npcHandler
        local player = Player(cid)

        if npcHandler == nil then
            error("StdModule.forge called without any npcHandler instance.")
        end

        if not npcHandler:isFocused(cid) then
            return false
        end

        if not player:isPremium() and parameters.premium then
            npcHandler:say("You need to be premium.", cid)
            return false
        end

        for i = 1, #parameters.storages, 1 do
            if player:getStorageValue(parameters.storages[i].key) ~= parameters.storages[i].value then
                npcHandler:say("I can't do it for you now.", cid)
                return false
            end
        end

        for i = 1, #parameters.cost, 1 do
            if player:getItemCount(parameters.cost[i].id) < parameters.cost[i].count then
                npcHandler:say("You don't have all the necessary items for the forge.", cid)
                return false
            end
        end

        for i = 1, #parameters.cost, 1 do
            player:removeItem(parameters.cost[i].id, parameters.cost[i].count)
        end

        player:addItem(parameters.item, 1, false)
        npcHandler:say("Here's your " .. getItemName(parameters.item) .. "!.", cid)

        npcHandler:resetNpc(cid)
        return true
    end

 

 

Depois de tudo isso o NPC já estará funcionando 100%.

 

Para adicionar novos itens na forja/troca é bem simples, logo nas primeiras linhas do forge.lua você encontrara a configuração do NPC.

 

Aqui tem uma breve explicação de como configurar o NPC:

 

Quote

local items = {
    {
        id = 2466, -- Este é o ID do item no qual você deja realizar a forja/troca.
        requirements = {
            {id = 9971, count = 20} -- Aqui fica o ID e a quantidade do material para a forja/troca.
        },
        storages = {
            {key = 1010, value = 1} -- Pode ser inserido o número da storage e o valor dela para a forja/troca ser realizada.
        },
        premium = true -- Também pode ser definido se o player precisa ser premium ou não para realizar a forja/troca.
    }
}

 

 

Bom galera é isso ai, se vocês tiverem algum problema ou sugestão podem falar.

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...