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
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()