Parabéns pelo script
- Fórum
- OTServ
- Recursos
- Scripting
- Mods, funções e outros
- [RPG] Forge System
info
Grupo: Cavaleiro
Registrado: 25/02/13
Posts: 169
Reputação: +42
Gênero: Masculino
Char no Tibia: Fodinha

info
Grupo: Visconde
Registrado: 24/07/09
Posts: 356
Reputação: +28
Gênero: Masculino

Interessante ![]()
Obrigado por partilha..
info
Grupo: Campones
Registrado: 12/08/11
Posts: 83
Reputação: +3
Char no Tibia: Che Mc

Mais uma vez um grande script do grande Roksas parabéns irmão rep+ garantido ![]()
info
Grupo: Herói
Registrado: 14/12/10
Posts: 3.6k
Reputação: +846
Gênero: Masculino

Obrigado galera, é pra ressuscitar o nosso querido RPG, façam bom uso ![]()
Boa Roksas vou usa-lo em meu server ![]()
info
Grupo: Grão-Duque
Registrado: 28/07/11
Posts: 3.5k
Reputação: +570
Gênero: Masculino
Char no Tibia: Transloko

Mando bem em man!
info
Grupo: Herói
Registrado: 14/12/10
Posts: 3.6k
Reputação: +846
Gênero: Masculino

Obrigado galerinha, foi uma boa ideia nossa hein vital900 ![]()
info
Grupo: Campones
Registrado: 22/11/11
Posts: 66
Reputação: +2
Gênero: Masculino
Char no Tibia: Angelykal

Aqui deu o seguinte erro;

se puder ver oque eh :S
Editado Maio 19 por Starliks
info
Grupo: Herói
Registrado: 14/12/10
Posts: 3.6k
Reputação: +846
Gênero: Masculino

Você deve ter copiado errado, rsrs. Vê de novo.
info
Grupo: Campones
Registrado: 22/11/11
Posts: 66
Reputação: +2
Gênero: Masculino
Char no Tibia: Angelykal

Editado Maio 19 por Starliks
Ótimo script,ótima idéia parabéns.
Sistema bem legal,que será de grande utilidade.
Obrigado.
info
Grupo: Herói
Registrado: 14/12/10
Posts: 3.6k
Reputação: +846
Gênero: Masculino

Não é pra dar use na bigorna, olha a GIF no final do tópico, vai derreter o IRON ORE, quando derreter vai aparecer ele em cima da bigorna, vc pega o HAMMER, de ITEM ID 4846 e clica no metal, se tiver sucesso vira o refinador, rs.
Ótimo script,ótima idéia parabéns.
Sistema bem legal,que será de grande utilidade.
Obrigado.
Obrigado cara, sucesso aí ![]()
info
Grupo: Marquês
Registrado: 18/05/11
Posts: 1.1k
Reputação: +150
Gênero: Masculino

Sem dúvidas, ótimo sistema!
Parabéns Roksas!
Obrigado por compartilhar, está sempre ajudando os usuários.
Bom, posso ver que tens melhorado bem em nivel de scripting, está no caminho certo, continue assim.
Agora que está melhor em scripting, precisa começar a se atentar a tempo de processamento, quanto menos gasto de memoria melhor. Por exemplo, voce pega varias vezes o thing da cfg.pos, ficaria mais leve salvar esse thing numa variavel, sendo assim usaria a função getThingFromPos apenas uma vez.
Identação e organização também são de suma importancia, e não misture portugues com ingles nos seus scripts, ou faça em ingles ou portugues, como 'minerioTo' por exemplo.
De qualquer maneira, meus parabéns, e continue estudando.
Cya








info
Grupo: Herói
Registrado: 14/12/10
Posts: 3.6k
Reputação: +846
Gênero: Masculino
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 endVolte para a pasta (data/actions), abra com o bloco de notas o arquivo actions.xml, e dentro dele adicione essa tag:
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, }Na tag do actions.xml você encontra isso:
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, }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
Editado Abril 8 por CyberBot