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.
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
<?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
-- 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
Quotefunction 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:
Quotelocal 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.