Ir para conteúdo

[RPG] Forge System


Roksas

Posts Recomendados

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

 

2vmc49i.gif

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 por CyberBot
Link para o comentário
Compartilhar em outros sites

Roksas

 

Consegui arruma mais agora ao da use na bigorna nada acontece :S

 

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í :)

Link para o comentário
Compartilhar em outros sites

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

Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...