Código Lua:
local spell = Spell("instant")
-- Función para mostrar un efecto de fuego en la posición especificada
local function showFireEffect(position)
local fireEffect = Position(position):getTile()
if fireEffect then
fireEffect:getPosition():sendMagicEffect(CONST_ME_FIREAREA)
end
end
-- Variable para almacenar la última posición de salto del jugador
local lastJumpPosition = nil
-- Variable para rastrear si el hechizo ha causado daño ascendente
local delayedDamageHits = 0
local maxDelayedDamageHits = 10 -- Número máximo de hits de daño ascendente
-- Tabla para almacenar los tiempos de reutilización de los jugadores
local playerCooldowns = {}
-- Función para actualizar los cooldowns de los jugadores
local function updateCooldowns()
for playerId, cooldown in pairs(playerCooldowns) do
if cooldown > 0 then
cooldown = cooldown - 1
playerCooldowns[playerId] = cooldown
-- Obtener al jugador por su ID
local player = Player(playerId)
if player then
player:sendTextMessage(MESSAGE_STATUS_DEFAULT, "Wait " .. cooldown .. " seconds before using Exori Blaze again.")
end
end
end
addEvent(updateCooldowns, 1000) -- Espera 1 segundo antes de actualizar nuevamente
end
-- Iniciar la función para descuento de cooldowns
updateCooldowns()
-- Modifica la función spell.onCastSpell para aplicar el cooldown
function spell.onCastSpell(creature, variant)
local playerId = creature:getId()
if playerCooldowns[playerId] and playerCooldowns[playerId] > 0 then
local player = Player(creature)
player:sendTextMessage(MESSAGE_STATUS_DEFAULT, "Wait " .. playerCooldowns[playerId] .. " seconds before using Exori Blaze again.")
return false
end
-- Verifica si hay un objetivo válido para el hechizo
local target = creature:getTarget()
if target == nil or not target:isCreature() then
creature:sendCancelMessage("You have no target.")
return false
end
-- Calcula la distancia entre el jugador y el objetivo
local distance = creature:getPosition():getDistance(target:getPosition())
-- Verifica si el jugador está lo suficientemente cerca para atacar (máximo 7 posiciones)
if distance <= 7 then
-- Almacena la última posición de salto del jugador
lastJumpPosition = creature:getPosition()
-- Realiza el movimiento hacia el objetivo (teletransportación instantánea al objetivo)
creature:teleportTo(target:getPosition())
-- Mostrar el efecto de fuego en la posición del jugador
showFireEffect(creature:getPosition())
-- Calcula el daño basado en el nivel del jugador y un rango de daño variable
local playerLevel = creature:getLevel()
local minDamage = playerLevel * 0.1 -- Daño mínimo basado en el nivel del jugador
local maxDamage = playerLevel * 0.12 -- Daño máximo basado en el nivel del jugador
-- Función para causar daño ascendente
local function causeDelayedDamage()
if delayedDamageHits < maxDelayedDamageHits and target:getHealth() > 0 then
delayedDamageHits = delayedDamageHits + 1
local delayedDamage = math.random(minDamage, maxDamage) -- Daño ascendente aleatorio dentro del rango
target:addHealth(-delayedDamage, COMBAT_PHYSICALDAMAGE)
addEvent(causeDelayedDamage, 100) -- Espera 1 segundo para el siguiente hit de daño ascendente
else
delayedDamageHits = 0 -- Restablece el contador de hits de daño ascendente
end
end
-- Inicia el daño ascendente
causeDelayedDamage()
-- Espera un momento antes de regresar (simulando el tiempo que lleva el salto)
addEvent(function()
-- Regresa a la última posición de salto después del tiempo de espera
if lastJumpPosition ~= nil then
creature:teleportTo(lastJumpPosition) -- Teletransporta al jugador de regreso a la última posición de salto
end
end, 2000) -- 2000 milisegundos (2 segundos) de espera antes de regresar
else
creature:sendCancelMessage("You are too far from your target.")
return false
end
playerCooldowns[playerId] = 5 -- 5 segundos de cooldown para este jugador
return true
end
spell:group("attack")
spell:id(232)
spell:name("Exori Jump Fire")
spell:words("Exori Blaze")
spell:level(300)
spell:mana(300)
spell:isAggressive(true)
spell:needTarget(true)
spell:blockWalls(true)
spell:groupCooldown(1 * 1000)
spell:needLearn(false)
spell:vocation("knight;true", "elite knight;true")
spell:register()