Faaala galera! Tudo bom? Eu estava olhando uns tutoriais por ai, os quais ensinavam como colocar cooldown, ou tempo de exaustão, entre as magias. O problema é que, em todos estes, utilizava-se 1 storage para cada spell. Você pode vir a me perguntar: "qual o problema disso?". O problema é que, quanto mais storages você utiliza, mais são as chances de ocorrer bugs em seu servidor graças ao mesmo storage sendo usado ao mesmo tempo.
Agora que eu já expliquei as vantagens de usar apenas 1 storage, podemos começar a explicar as funções. Antes de mais nada, vamos a elas:
Lib
function getCooldown(cid, spellname) local storage = tostring(getPlayerStorageValue(cid, 40001)) local spellname = '"' .. spellname .. '"' return string.find(storage, spellname) and tonumber(string.match(storage, "%d+", string.find(storage, spellname) + #spellname)) - os.time() or 0 end function setCooldown(cid, spellname, seconds) local storage = getPlayerStorageValue(cid, 40001) == -1 and "" or tostring(getPlayerStorageValue(cid, 40001)) local spellname = '"' .. spellname .. '"' if string.find(storage, spellname) then local gsub = string.gsub(storage, string.match(storage, "%d+", string.find(storage, spellname) + #spellname), tostring(os.time() + seconds)) setPlayerStorageValue(cid, 40001, gsub) else setPlayerStorageValue(cid, 40001, storage .. spellname .. " " .. tostring(seconds + os.time()) .. " ") end end function isExhausted(cid, spellname) return getCooldown(cid, spellname) > 0 end
Certo, você pode adicionar isto em data/lib/function.lua, ou, pode criar um arquivo com o formato .lua nesta mesma pasta e nomeá-lo para qualquer coisa.
--
Agora vamos explicar as funções:
*As informações em itálico são apenas por curiosidade:
function getCooldown - Bom, esta função vai retornar o tempo, em segundos, do cooldown da mágia. Seus argumentos são o uid do jogador e o nome da mágia. Cuidado, Exura é diferente de exura. Se não houver cooldown para a magia no jogador, retorna 0.
Utilizei o storage 40001 para colocar os cooldowns. Você pode perceber que ele adiciona uma string ao storage, ficando, por exemplo, assim: "Exura" 1308376293 "Exori" 1308376393
As aspas são para precaver bugs como Exura e Exura gran. O número ao lado é o cooldown somado a função os.time() que é o segundos retornados pela CPU na hora que o cooldown foi adicionado.
function setCooldown - Aqui teremos a função que vai adicionar o cooldown ao jogador. Seus argumentos são o uid do jogador, o nome da magia e os segundos de cooldown.
A função vai checar se já há o cooldown no storage do jogador. Se já houver, a função simplesmente troca este velho tempo pelo novo. Se não houver, ela simplesmente adicionar no final da string o nome da spell e o tempo mais a função os.time.
function isExhausted - Por ultimo, temos a função que retorna se o jogador está, ou não, exausto de usar aquela magia.
Retorna TRUE se o cooldown for acima e zero, caso contrário, retorna FALSE.
--
Simples não? Vamos a um exemplo, usaremos o script do exevo mas san (Divine Caldera):
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HOLYAREA) setAttackFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 4, 6) local area = createCombatArea(AREA_CIRCLE3X3) setCombatArea(combat, area) function onCastSpell(cid, var) return doCombat(cid, combat, var) end
Para adicionar o cooldown, simplesmente fazemos algumas alterações, deste jeito:
local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_HOLYAREA) setAttackFormula(combat, COMBAT_FORMULA_LEVELMAGIC, 5, 5, 4, 6) local area = createCombatArea(AREA_CIRCLE3X3) setCombatArea(combat, area) function onCastSpell(cid, var) if isExhausted(cid, "exevo mas san") == FALSE then return doCombat(cid, combat, var), setCooldown(cid, "exevo mas san", 10) end return FALSE, doPlayerSendCancel(cid, "You are exhausted.") end
Observe o que muda:
function onCastSpell(cid, var) if isExhausted(cid, "exevo mas san") == FALSE then return doCombat(cid, combat, var), setCooldown(cid, "exevo mas san", 10) end return FALSE, doPlayerSendCancel(cid, "You are exhausted.") end
Esta será a base de todas as spells, você só tem que trocar o nome e o tempo.
--
Avisem se encontrarem algum bug comprometedor. Abraços.