Postado Dezembro 10, 2017 7 anos 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. 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 Janeiro 14, 2018 7 anos por Leohige Correção de bug. (veja o histórico de edições)
Postado Dezembro 10, 2017 7 anos 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.
Postado Janeiro 14, 2018 7 anos @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 Janeiro 14, 2018 7 anos por acan (veja o histórico de edições)
Postado Janeiro 14, 2018 7 anos Autor Dei uma editada no script, recrie o forge.lua e teste novamente. Caso ocorra algum outro erro poste novamente que irei ajudar.
Postado Janeiro 14, 2018 7 anos 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 Janeiro 14, 2018 7 anos 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.