Forje System
Como vai galerinha, tive uma ideia bem legal com a ajuda do vital900, é para dar um pouco mais de RPG ao seu servidor.
No caso é um sistema de Forja, no qual um NPC te leva para uma ilha, nela você deve levar junto um minério (Iron Ore) e um Hammer, você vai aquecer o Iron Ore jogando-o no coal basin e clicando no assoprador, em seguida se obter chance vai criar um metal derretido, e aí você deve bater nele, novamente se obter chance poderá ser transformado num item, este item faz com que seus equipamentos subam + 1 de Ataque, Defesa e Armor.
Instalação
Vá em data/actions/scripts, copie algum arquivo da pasta e cole, ou crie, renomeie para forge_system.lua em seguida adicione isso dentro dele, usando algum editor de texto:
function onUse(cid, item, frompos, item2, topos) local cfg = { pos = {x = 1021, y = 1032, z = 7, stackpos = 255}, minerioTo = 5880, meltedTo = 5892, burnTo = 12404, hammerId = 4846, refinerId = 8299, secsInterval = 10, } -- // -- // -- // -- // -- // -- // -- // -- if item.actionid == 17000 then if getPlayerStorageValue(cid, 17001) > os.time() then doPlayerSendTextMessage(cid, 27, "Aguarde um intervalo de "..getPlayerStorageValue(cid, 17001) - os.time().." segundos para forjar novamente.") return true end if getThingFromPos(cfg.pos).itemid <= 0 then doPlayerSendTextMessage(cid, 20, "Você deve colocar no coal basin, um material de forja.") return true end if getThingFromPos(cfg.pos).itemid == cfg.minerioTo then doCreateItem(getItemIdByName(getItemName(getThingFromPos(cfg.pos).uid)), {x = cfg.pos.x + 1, y = cfg.pos.y, z = cfg.pos.z, stackpos = cfg.pos.stackpos}) doRemoveItem(getThingFromPos(cfg.pos).uid, 1) doSendMagicEffect({x = cfg.pos.x + 1, y = cfg.pos.y - 4, z = cfg.pos.z}, 15) addEvent(doSendMagicEffect, 1 * 1000, {x = cfg.pos.x + 1, y = cfg.pos.y - 2, z = cfg.pos.z}, 15) addEvent(doSendMagicEffect, 2 * 1000, {x = cfg.pos.x + 1, y = cfg.pos.y, z = cfg.pos.z}, 15) setPlayerStorageValue(cid, 17001, os.time() + cfg.secsInterval) local function removeOre() doRemoveItem(getThingfromPos({x = cfg.pos.x + 1, y = cfg.pos.y, z = cfg.pos.z, stackpos = cfg.pos.stackpos}).uid, 1) if math.random(100) < 75 then doCreateItem(cfg.meltedTo, {x = cfg.pos.x - 3, y = cfg.pos.y - 4, z = cfg.pos.z, stackpos = cfg.pos.stackpos}) doPlayerSendTextMessage(cid, 20, "Você derreteu o seu minério, bata ele na bigorna para virar um refinador.") else doPlayerSendTextMessage(cid, 20, "O seu minério material se queimou, tente novamente.") doSendMagicEffect({x = cfg.pos.x + 2, y = cfg.pos.y, z = 7}, 67) doCreateItem(cfg.burnTo, {x = cfg.pos.x, y = cfg.pos.y, z = cfg.pos.z}) end return true end addEvent(removeOre, 2 * 1000, true) end return true end if item.itemid == cfg.hammerId and item2.itemid == cfg.meltedTo then if math.random(100) < 40 then doPlayerSendTextMessage(cid, 20, "Você bateu muito forte no material derretido, ele se quebrou.") doTransformItem(getThingFromPos({x = cfg.pos.x - 3, y = cfg.pos.y - 4, z = cfg.pos.z, stackpos = cfg.pos.stackpos}).uid, 2225) else doPlayerSendTextMessage(cid, 20, "Você forjou um refinador, utilize ele em seus equipamentos.") doTransformItem(getThingFromPos({x = cfg.pos.x - 3, y = cfg.pos.y - 4, z = cfg.pos.z, stackpos = cfg.pos.stackpos}).uid, 8299) end return true end if item.itemid == cfg.refinerId and item2.itemid ~= cfg.refinerId then if isCreature(item2.uid) == true then return false end -- // FUNCTIONS REFINERS // -- function getAttack(v) if getItemAttribute(v.uid,'attack') == nil then doItemSetAttribute(v.uid, "attack",getItemInfo(v.itemid).attack) end return tonumber(getItemAttribute(v.uid,'attack')) end function getArmor(v) if getItemAttribute(v.uid,'armor') == nil then doItemSetAttribute(v.uid, "armor",getItemInfo(v.itemid).armor) end return tonumber(getItemAttribute(v.uid,'armor')) end function getDefense(v) if getItemAttribute(v.uid,'defense') == nil then doItemSetAttribute(v.uid,"defense", getItemInfo(v.itemid).defense) end return tonumber(getItemAttribute(v.uid,'defense')) end function setDefense(v,number) return doItemSetAttribute(v.uid, "defense", number) end function setAttack(v,number) return doItemSetAttribute(v.uid, "attack", number) end function setArmor(v,number) return doItemSetAttribute(v.uid, "armor", number) end -- // -- // -- // -- // -- // -- // -- doPlayerSendTextMessage(cid, 20, "Você acaba de refinar um "..getItemNameById(item2.itemid)..". O seu item refinador foi removido.") doSendMagicEffect(getCreaturePosition(cid), 13) doRemoveItem(item.uid, 1) if getAttack(item2) > 1 then setAttack(item2, tonumber(getAttack(item2)) + 1) elseif getArmor(item2) > 1 then setArmor(item2, tonumber(getArmor(item2)) + 1) elseif getDefense(item2) > 1 then setDefense(item2, tonumber(getDefense(item2)) + 1) end end return true end
Volte para a pasta (data/actions), abra com o bloco de notas o arquivo actions.xml, e dentro dele adicione essa tag:
<action actionid="17000" itemid="4846;8299" event="script" value="forje.lua" />
Agora siga para a pasta data/npc, copie algum arquivo da pasta e cole, renomeie para Forger e adicione dentro usando o bloco de notas:
<?xml version="1.0" encoding="UTF-8"?> <npc name="Forger" script="forge_npc.lua" walkinterval="0" floorchange="0"> <health now="150" max="150"/> <look type="71" head="114" body="119" legs="114" feet="114" corpse="2212"/> <parameters> <parameter key="message_greet" value="Hello |PLAYERNAME|. If you want forge say {forge}, need HAMMER and IRON ORE!"/> </parameters> </npc>
Abra a pasta scripts dentro de data/npc, copie algum arquivo da pasta e cole, renomeie para forge_npc e adicione dentro usando algum editor de texto:
local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} 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 function creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end function getPlayersInArea(area) local players = {} for x = area.fromx,area.tox do for y = area.fromy,area.toy do for z = area.fromz,area.toz do local m = getTopCreature({x=x, y=y, z=z}).uid if m ~= 0 and isPlayer(m) then table.insert(players, m) end end end end return players end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid local cfg = { area = {fromx = 1015, fromy = 1028, z = 7, tox = 1028, y = 1019, z = 7}, forgePosition = {x = 1018, y = 1034, z = 7}, templePosition = {x = 999, y = 1018, z = 7}, hammerId = 4846, minerioTo = 5880, needMoney = 1000, maxTime = 1, } if msgcontains(msg, 'forge') or msgcontains(msg, 'forjar') then if getPlayersInArea(cfg.area) >= 1 then selfSay('Have another player forging, wait someones minutes', cid) talkState[talkUser] = 0 return false end if getPlayerStorageValue(cid, 14500) > os.time() then selfSay('You can forge only 1x each '..cfg.maxForge..'hours.', cid) talkState[talkUser] = 0 return false end selfSay('Do you want to forge your equipaments? Need hammer and iron ore.', cid) talkState[talkUser] = 1 elseif msgcontains(msg, 'yes') and talkState[talkUser] == 1 then if getPlayerItemCount(cid, cfg.hammerId) >= 1 and getPlayerItemCount(cfg.minerioTo) then if doPlayerRemoveMoney(cid, cfg.needMoney) then doTeleportThing(cid, cfg.forgePosition) addEvent(doTeleportThing, cfg.maxTime * 60 * 1000, cid, cfg.templePosition) doPlayerSendTextMessage(cid, 20, "Aparir de agora você tem "..cfg.maxTime.." minutos para forjar.") addEvent(doPlayerSendTextMessage, cfg.maxTime * 60 * 1000, cid, 20, "Seu tempo de forja acabou, você foi teleportado para o templo.") selfSay('Here you are.', cid) else selfSay('What? You need '..cfg.needMoney..', hammer and iron ore.', cid) end end end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())
Configuração
No código de actions forge_system.lua, procure por este trecho e edite conforme citado abaixo:
local cfg = { pos = {x = 1021, y = 1032, z = 7, stackpos = 255}, minerioTo = 5880, meltedTo = 5892, burnTo = 12404, hammerId = 4846, refinerId = 8299, secsInterval = 10, }
pos = Coordenadas do coal basin do mapa postado para download minerioTo = O itemid do minério que vai ser derretido, (iron ore) meltedTo = ItemId do minério derretido burnTo = itemId do minério queimado hammerId = Item ID do martelo que vai bater na bigorna refinerId = O ID do item final, oque vai refinar os equips secsInterval = A cada quantos segundos pode fazer uma tentativa de forge.
Na tag do actions.xml você encontra isso:
<action actionid="17000" itemid="4846;8299" event="script" value="forje.lua" />
Mude apenas aonde está itemid, coloque na ordem: (O ItemID do Hammer e do Refiner derretido).
No código de NPC, no caso o arquivo forge_npc.lua, você encontra esse trecho:
local cfg = { area = {fromx = 1015, fromy = 1028, z = 7, tox = 1028, y = 1019, z = 7}, forgePosition = {x = 1018, y = 1034, z = 7}, templePosition = {x = 999, y = 1018, z = 7}, hammerId = 4846, minerioTo = 5880, needMoney = 1000, maxTime = 1, maxForge = 24, }
area = Coloque as coordenadas do canto superior esquerdo da área de forja e do canto inferior direito forgePosition = coloque as coordenadas da sala de forja templePosition = pra aonde vai ser teleportado após acabar o tempo, no caso um Templo hammerId = O mesmo do forge_system.lua, coloque o Item ID do hammer (martelo) minerioTo = Coloque o Item ID do iron ore needMoney = Quanto de dinheiro precisa pra ir pra sala de forja maxTime = Quantos minutos no máximo pode ficar na sala de forja maxForge = A cada quantas horas pode entrar na sala de forja, coloquei 24, ou seja, 1x ao dia.
Demonstração
Créditos GIF: curruwilliam
Finalizações
Muito obrigado pela atenção galera e um forte abraço ao vital900 que me ajudou com o mapa e as ideias. Qualquer dúvida e/ou crítica estou aqui para atendê-los. Espero que façam um bom uso do mesmo
Download Forge Mapa - Scan Forge Mapa
Download Forge System - Scan Forge System