-- Description: Byakuya's Wrath is a powerful spell that targets creatures within a specific area. -- It applies a paralyze condition, reducing their speed by 25% for 15 seconds, and a burn condition -- that deals fire damage over time. The spell also deals physical damage to the targets. -- After the effects are applied, the caster and the targets are teleported to a new location -- and then returned to their original positions after a delay. local function getCreaturesInRange(position, range) local creaturesInRange = {} local minX, maxX = position.x - range, position.x + range local minY, maxY = position.y - range, position.y + range local minZ, maxZ = position.z, position.z for x = minX, maxX do for y = minY, maxY do for z = minZ, maxZ do local pos = {x = x, y = y, z = z} local creature = getTopCreature(pos).uid if creature > 0 and isCreature(creature) then table.insert(creaturesInRange, {uid = creature, pos = pos}) end end end end return creaturesInRange end local areaSize = 7 local wmPattern = { {0, 0, 1, 0, 0, 1, 0}, {0, 1, 0, 1, 0, 1, 0}, {1, 0, 0, 0, 1, 0, 1}, {0, 1, 0, 1, 0, 1, 0}, {0, 0, 1, 0, 0, 1, 0}, {0, 1, 0, 1, 0, 1, 0}, {1, 0, 0, 0, 1, 0, 1} } local spellName = "Byakuya's Wrath" local function applyEffects(cid, position) local creatures = getCreaturesInRange(position, 1) local affectedCreatures = {} local accumulatedDamage = 0 for _, creature in ipairs(creatures) do local target = creature.uid if target > 0 then local slowCondition = createConditionObject(CONDITION_PARALYZE) setConditionParam(slowCondition, CONDITION_PARAM_TICKS, 15000) setConditionFormula(slowCondition, -0.25, 0, -0.25, 0) doAddCondition(target, slowCondition) local burnCondition = createConditionObject(CONDITION_FIRE) setConditionParam(burnCondition, CONDITION_PARAM_TICKS, 15000) setConditionParam(burnCondition, CONDITION_PARAM_DELAYED, true) doAddCondition(target, burnCondition) local baseDamage = -math.random(100, 200) accumulatedDamage = accumulatedDamage + baseDamage local totalDamage = baseDamage + accumulatedDamage doTargetCombatHealth(cid, target, COMBAT_PHYSICALDAMAGE, totalDamage, totalDamage, CONST_ME_HITAREA) table.insert(affectedCreatures, {uid = target, originalPosition = getCreaturePosition(target), originalOutfit = getCreatureOutfit(target)}) end end return affectedCreatures end local function teleportToWorld(parameters) local cid = parameters.cid local target = parameters.target local affectedCreatures = parameters.affectedCreatures local originalPositionCid = parameters.originalPositionCid local originalPositionTarget = parameters.originalPositionTarget local originalOutfit = parameters.originalOutfit local newPositionCid = {x = 4390, y = 1361, z = 7} local newPositionTarget = {x = 4390, y = 1362, z = 7} doSendMagicEffect(originalPositionCid, 244) doCreatureChangeOutfit(cid, {lookType = 0}) doTeleportThing(cid, newPositionCid) doSendMagicEffect(newPositionCid, 244) doCreatureChangeOutfit(cid, originalOutfit) if isCreature(target) then doSendMagicEffect(originalPositionTarget, 244) doCreatureChangeOutfit(target, {lookType = 0}) doTeleportThing(target, newPositionTarget) doSendMagicEffect(newPositionTarget, 244) end for _, creatureData in ipairs(affectedCreatures) do if isCreature(creatureData.uid) then doSendMagicEffect(creatureData.originalPosition, 244) doCreatureChangeOutfit(creatureData.uid, {lookType = 0}) doTeleportThing(creatureData.uid, newPositionTarget) doSendMagicEffect(newPositionTarget, 244) doCreatureChangeOutfit(creatureData.uid, creatureData.originalOutfit) end end if isCreature(cid) then doSendMagicEffect(originalPositionCid, 244) doCreatureChangeOutfit(cid, {lookType = 0}) doTeleportThing(cid, newPositionCid) doSendMagicEffect(newPositionCid, 244) doCreatureChangeOutfit(cid, originalOutfit) end if isCreature(target) then doTeleportThing(target, newPositionTarget) doSendMagicEffect(newPositionTarget, 244) end addEvent(function(params) for _, creatureData in ipairs(params.affectedCreatures) do if isCreature(creatureData.uid) then doSendMagicEffect(creatureData.originalPosition, 244) addEvent(function() doSendMagicEffect(creatureData.uid, 244) doCreatureChangeOutfit(creatureData.uid, {lookType = 0}) doTeleportThing(creatureData.uid, creatureData.originalPosition) doSendMagicEffect(creatureData.originalPosition, 244) doCreatureChangeOutfit(creatureData.uid, creatureData.originalOutfit) end, 900) end end if isCreature(params.cid) then doSendMagicEffect(params.originalPositionCid, 244) addEvent(function() doSendMagicEffect(params.cid, 244) doCreatureChangeOutfit(params.cid, {lookType = 0}) doTeleportThing(params.cid, params.originalPositionCid) doSendMagicEffect(params.originalPositionCid, 244) doCreatureChangeOutfit(params.cid, params.originalOutfit) end, 900) end if isCreature(params.target) then doSendMagicEffect(params.originalPositionTarget, 244) addEvent(function() doSendMagicEffect(params.target, 244) doCreatureChangeOutfit(params.target, {lookType = 0}) doTeleportThing(params.target, params.originalPositionTarget) doSendMagicEffect(params.originalPositionTarget, 244) doCreatureChangeOutfit(params.target, getCreatureOutfit(params.target)) end, 900) end end, 14000, {affectedCreatures = affectedCreatures, originalPositionCid = originalPositionCid, originalPositionTarget = originalPositionTarget, cid = cid, target = target, originalOutfit = originalOutfit}) addEvent(function(params) for _, creatureData in ipairs(params.affectedCreatures) do if isCreature(creatureData.uid) then doTeleportThing(creatureData.uid, creatureData.originalPosition) doSendMagicEffect(creatureData.originalPosition, 244) doCreatureChangeOutfit(creatureData.uid, creatureData.originalOutfit) end end if isCreature(params.cid) then doTeleportThing(params.cid, params.originalPositionCid) doSendMagicEffect(params.originalPositionCid, 244) doCreatureChangeOutfit(params.cid, params.originalOutfit) end if isCreature(params.target) then doTeleportThing(params.target, params.originalPositionTarget) doSendMagicEffect(params.originalPositionTarget, 244) doCreatureChangeOutfit(params.target, getCreatureOutfit(params.target)) end end, 15000, {affectedCreatures = affectedCreatures, originalPositionCid = originalPositionCid, originalPositionTarget = originalPositionTarget, cid = cid, target = target, originalOutfit = originalOutfit}) end local function byakuyaSpell(cid) local position = getCreaturePosition(cid) local target = getCreatureTarget(cid) if not target then return false end local targetPosition = getCreaturePosition(target) local affectedCreatures = {} local totalDelay = 0 for x = -3, 3 do for y = -3, 3 do local patternX, patternY = x + 4, y + 4 if wmPattern[patternX] and wmPattern[patternX][patternY] and wmPattern[patternX][patternY] == 1 then local newPos = { x = targetPosition.x + x, y = targetPosition.y + y, z = targetPosition.z } for effectIndex, effectId in ipairs({241, 247, 253, 245}) do local delay = (effectIndex - 1) * 500 addEvent(function() local effectPos = newPos if effectId == 247 then effectPos = {x = newPos.x + 1, y = newPos.y + 1, z = newPos.z} elseif effectId == 253 then effectPos = {x = newPos.x + 1, y = newPos.y + 1, z = newPos.z} elseif effectId == 245 then effectPos = {x = newPos.x + 3, y = newPos.y + 3, z = newPos.z} end doSendMagicEffect(effectPos, effectId) end, delay) totalDelay = math.max(totalDelay, delay) end local affected = applyEffects(cid, newPos) for _, creatureData in ipairs(affected) do table.insert(affectedCreatures, creatureData) end end end end local originalPositionCid = getCreaturePosition(cid) local originalPositionTarget = getCreaturePosition(target) local originalOutfit = getCreatureOutfit(cid) addEvent(function() doSendMagicEffect(originalPositionCid, 244) doCreatureChangeOutfit(cid, {lookType = 0}) end, totalDelay + 500) for _, creatureData in ipairs(affectedCreatures) do addEvent(function() if isCreature(creatureData.uid) then doSendMagicEffect(creatureData.originalPosition, 244) doCreatureChangeOutfit(creatureData.uid, {lookType = 0}) end end, totalDelay + 500) end addEvent(teleportToWorld, totalDelay + 1000, {cid = cid, target = target, affectedCreatures = affectedCreatures, originalPositionCid = originalPositionCid, originalPositionTarget = originalPositionTarget, originalOutfit = originalOutfit}) end function onCastSpell(cid, var) byakuyaSpell(cid) return true end