Ir para conteúdo

Featured Replies

Postado
  • Este é um post popular.

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 item == nil 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

 

Citar

    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:

 

Citar

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.

Editado por Leohige
Correção de bug. (veja o histórico de edições)

  • Respostas 10
  • Visualizações 1.8k
  • Created
  • Última resposta

Top Posters In This Topic

Posted Images

Postado

Parabéns, seu tópico de conteúdo foi aprovado!
Muito obrigado pela sua contribuição, nós do Tibia King agradecemos.
Seu conteúdo com certeza ajudará à muitos outros, você recebeu +1 REP.

Spoiler

Congratulations, your content has been approved!
Thank you for your contribution, we of Tibia King we are grateful.
Your content will help many other users, you received +1 REP.

 

Projeto ATS (Naruto)

Informações Abaixo

Facebook

Youtube
Discord

 

Tutoriais / Conteúdos

Clique Aqui

  • 1 month later...
Postado

@Leohige

help me plx

 

[14/01/2018 18:36:23] [Error - Npc interface] 
[14/01/2018 18:36:23] data/npc/scripts/Raiton Master.lua
[14/01/2018 18:36:23] Description: 
[14/01/2018 18:36:23] data/npc/scripts/Raiton Master.lua:45: attempt to call global 'isItem' (a nil value)
[14/01/2018 18:36:23] [Warning - NpcScript::NpcScript] Cannot load script: data/npc/scripts/Raiton Master.lua

Editado por acan (veja o histórico de edições)

Postado
Spoiler

14/01/2018 19:20:02] [Error - Npc interface] 
[14/01/2018 19:20:02] data/npc/scripts/Raiton Master.lua
[14/01/2018 19:20:02] Description: 
[14/01/2018 19:20:02] (luaGetThing) Thing not found

 

14/01/2018 19:20:02] [Error - Npc interface] 
[14/01/2018 19:20:02] data/npc/scripts/Raiton Master.lua
[14/01/2018 19:20:02] Description: 
[14/01/2018 19:20:02] data/lib/050-function.lua:306: attempt to index a boolean value
[14/01/2018 19:20:02] [Warning - NpcScript::NpcScript] Cannot load script: data/npc/scripts/Raiton Master.lua

@Leohige un nuevo error...

Editado por acan (veja o histórico de edições)

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.7k

Informação Importante

Confirmação de Termo