RevScript Spell knight

Shuyin

Miembro
LV
23
 
Awards
17
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()
 
Arriba