RevScript Spell Druid y Sorcerer

Shuyin

Miembro
LV
23
 
Awards
17
Spell para Druid y Sorcerer "ethereal velocity"

Nota: Los efectos para druid y sorcerer son diferentes cada vez que se usa


Ver archivo adjunto Tibia - Deixis 2023-12-12 21-41-27.mp4
Código Lua:
local spell = Spell("instant")

-- 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 ethereal velocity again.")
            end
        end
    end
    addEvent(updateCooldowns, 1000) -- Espera 1 segundo antes de actualizar nuevamente
end

-- Iniciar la función para descuento de cooldowns
updateCooldowns()

-- Define la función de la magia
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 ethereal velocity again.")
        return false
    end

    local range = 6 -- Define el rango de la magia
    local speed = 50 -- Define la velocidad en milisegundos (ajusta según sea necesario)
    local playerPos = creature:getPosition() -- Obtenemos la posición actual del jugador
    local playerDirection = creature:getDirection() -- Obtenemos la dirección en la que el jugador está mirando
    local playerLevel = creature:getLevel() -- Obtenemos el nivel del jugador
    local vocation = creature:getVocation():getId() -- Obtenemos la ID de la vocación del jugador

    local xOffset, yOffset
    if playerDirection == DIRECTION_NORTH then
        xOffset, yOffset = 0, -1 -- Mover hacia el norte
    elseif playerDirection == DIRECTION_EAST then
        xOffset, yOffset = 1, 0 -- Mover hacia el este
    elseif playerDirection == DIRECTION_SOUTH then
        xOffset, yOffset = 0, 1 -- Mover hacia el sur
    elseif playerDirection == DIRECTION_WEST then
        xOffset, yOffset = -1, 0 -- Mover hacia el oeste
    else
        xOffset, yOffset = 0, 0 -- No se mueve si la dirección no es válida
    end

    local effectPosition = playerPos -- Inicialmente, la posición del efecto es la del jugador
    local damageType, magicEffect

    if vocation == 2 or vocation == 6 then -- Druid o Elder Druid
        -- Crea una lista de efectos de hielo
        local iceEffects = {42, 44, 53} -- Puedes agregar más IDs de efectos de hielo aquí

        -- Selecciona un efecto al azar de la lista
        magicEffect = iceEffects[math.random(#iceEffects)]
        damageType = COMBAT_ICEDAMAGE -- Tipo de daño de hielo
    elseif vocation == 1 or vocation == 5 then -- Sorcerer o Master Sorcerer
        -- Crea una lista de efectos de energía
        local energyEffects = {176, 177, 178, 179} -- Puedes agregar más IDs de efectos de energía aquí

        -- Selecciona un efecto al azar de la lista
        magicEffect = energyEffects[math.random(#energyEffects)]
        damageType = COMBAT_ENERGYDAMAGE -- Tipo de daño de energía
    else
        -- Otras vocaciones no tienen efecto específico
        damageType = COMBAT_PHYSICALDAMAGE -- Tipo de daño físico
        magicEffect = 6 -- Efecto predeterminado (cambia el número según tu elección)
    end

    local function moveEffect()
        effectPosition.x = effectPosition.x + xOffset
        effectPosition.y = effectPosition.y + yOffset

        local newTile = Tile(effectPosition)
        if not newTile or not newTile:isWalkable() or newTile:hasProperty(CONST_PROP_BLOCKINGANDNOTMOVEABLE) or newTile:hasFlag(TILESTATE_PROTECTIONZONE) then
            -- La casilla no es válida, detener el movimiento
            return
        end

        local baseDamage = math.random(10, 20) -- Daño base
        local scalingFactor = 1.0 -- Factor de escala para el daño basado en el nivel
        local damage = baseDamage + math.floor(playerLevel * scalingFactor) -- Calcula el daño basado en el nivel

        effectPosition:sendMagicEffect(magicEffect) -- Aplica el efecto mágico

        -- Aplica el daño usando el tipo de daño correspondiente
        local targetCreature = Tile(effectPosition):getTopCreature()
        if targetCreature and targetCreature:isCreature() then
            targetCreature:addHealth(-damage, damageType)
           
            -- Muestra el mensaje de daño en inglés
            creature:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Damage: " .. damage .. "!")
        end

        creature:teleportTo(effectPosition) -- Mueve al jugador a la posición del efecto
    end

    for i = 1, range do
        addEvent(moveEffect, i * speed)
    end
    playerCooldowns[playerId] = 5 -- 5 segundos de cooldown para este jugador
    return true
end

spell:group("attack")
spell:id(250)
spell:name("ethereal velocity")
spell:words("ethereal velocity")
spell:level(200)
spell:mana(650)
spell:groupCooldown(1 * 1000)
spell:isPremium(true)
spell:needLearn(false)
spell:vocation("sorcerer;true", "master sorcerer;true", "druid;true", "elder druid;true")
spell:register()
 
Arriba