byakuya_spell.lua

main 239 lines · 10.4 KB Raw
Alex Alex Commit Server upload 18/10/2026 23:38
1-- Description: Byakuya's Wrath is a powerful spell that targets creatures within a specific area.
2-- It applies a paralyze condition, reducing their speed by 25% for 15 seconds, and a burn condition
3-- that deals fire damage over time. The spell also deals physical damage to the targets.
4-- After the effects are applied, the caster and the targets are teleported to a new location
5-- and then returned to their original positions after a delay.
6
7local function getCreaturesInRange(position, range)
8 local creaturesInRange = {}
9 local minX, maxX = position.x - range, position.x + range
10 local minY, maxY = position.y - range, position.y + range
11 local minZ, maxZ = position.z, position.z
12
13
14 for x = minX, maxX do
15 for y = minY, maxY do
16 for z = minZ, maxZ do
17 local pos = {x = x, y = y, z = z}
18 local creature = getTopCreature(pos).uid
19 if creature > 0 and isCreature(creature) then
20 table.insert(creaturesInRange, {uid = creature, pos = pos})
21 end
22 end
23 end
24 end
25 return creaturesInRange
26end
27
28local areaSize = 7
29local wmPattern = {
30 {0, 0, 1, 0, 0, 1, 0},
31 {0, 1, 0, 1, 0, 1, 0},
32 {1, 0, 0, 0, 1, 0, 1},
33 {0, 1, 0, 1, 0, 1, 0},
34 {0, 0, 1, 0, 0, 1, 0},
35 {0, 1, 0, 1, 0, 1, 0},
36 {1, 0, 0, 0, 1, 0, 1}
37}
38
39local spellName = "Byakuya's Wrath"
40
41local function applyEffects(cid, position)
42 local creatures = getCreaturesInRange(position, 1)
43 local affectedCreatures = {}
44 local accumulatedDamage = 0
45
46 for _, creature in ipairs(creatures) do
47 local target = creature.uid
48 if target > 0 then
49 local slowCondition = createConditionObject(CONDITION_PARALYZE)
50 setConditionParam(slowCondition, CONDITION_PARAM_TICKS, 15000)
51 setConditionFormula(slowCondition, -0.25, 0, -0.25, 0)
52 doAddCondition(target, slowCondition)
53
54 local burnCondition = createConditionObject(CONDITION_FIRE)
55 setConditionParam(burnCondition, CONDITION_PARAM_TICKS, 15000)
56 setConditionParam(burnCondition, CONDITION_PARAM_DELAYED, true)
57 doAddCondition(target, burnCondition)
58
59 local baseDamage = -math.random(100, 200)
60 accumulatedDamage = accumulatedDamage + baseDamage
61 local totalDamage = baseDamage + accumulatedDamage
62 doTargetCombatHealth(cid, target, COMBAT_PHYSICALDAMAGE, totalDamage, totalDamage, CONST_ME_HITAREA)
63
64 table.insert(affectedCreatures, {uid = target, originalPosition = getCreaturePosition(target), originalOutfit = getCreatureOutfit(target)})
65 end
66 end
67 return affectedCreatures
68end
69
70local function teleportToWorld(parameters)
71 local cid = parameters.cid
72 local target = parameters.target
73 local affectedCreatures = parameters.affectedCreatures
74 local originalPositionCid = parameters.originalPositionCid
75 local originalPositionTarget = parameters.originalPositionTarget
76 local originalOutfit = parameters.originalOutfit
77
78 local newPositionCid = {x = 4390, y = 1361, z = 7}
79 local newPositionTarget = {x = 4390, y = 1362, z = 7}
80
81 doSendMagicEffect(originalPositionCid, 244)
82 doCreatureChangeOutfit(cid, {lookType = 0})
83 doTeleportThing(cid, newPositionCid)
84 doSendMagicEffect(newPositionCid, 244)
85 doCreatureChangeOutfit(cid, originalOutfit)
86
87 if isCreature(target) then
88 doSendMagicEffect(originalPositionTarget, 244)
89 doCreatureChangeOutfit(target, {lookType = 0})
90 doTeleportThing(target, newPositionTarget)
91 doSendMagicEffect(newPositionTarget, 244)
92 end
93
94 for _, creatureData in ipairs(affectedCreatures) do
95 if isCreature(creatureData.uid) then
96 doSendMagicEffect(creatureData.originalPosition, 244)
97 doCreatureChangeOutfit(creatureData.uid, {lookType = 0})
98 doTeleportThing(creatureData.uid, newPositionTarget)
99 doSendMagicEffect(newPositionTarget, 244)
100 doCreatureChangeOutfit(creatureData.uid, creatureData.originalOutfit)
101 end
102 end
103
104 if isCreature(cid) then
105 doSendMagicEffect(originalPositionCid, 244)
106 doCreatureChangeOutfit(cid, {lookType = 0})
107 doTeleportThing(cid, newPositionCid)
108 doSendMagicEffect(newPositionCid, 244)
109 doCreatureChangeOutfit(cid, originalOutfit)
110 end
111 if isCreature(target) then
112 doTeleportThing(target, newPositionTarget)
113 doSendMagicEffect(newPositionTarget, 244)
114 end
115
116 addEvent(function(params)
117 for _, creatureData in ipairs(params.affectedCreatures) do
118 if isCreature(creatureData.uid) then
119 doSendMagicEffect(creatureData.originalPosition, 244)
120 addEvent(function()
121 doSendMagicEffect(creatureData.uid, 244)
122 doCreatureChangeOutfit(creatureData.uid, {lookType = 0})
123 doTeleportThing(creatureData.uid, creatureData.originalPosition)
124 doSendMagicEffect(creatureData.originalPosition, 244)
125 doCreatureChangeOutfit(creatureData.uid, creatureData.originalOutfit)
126 end, 900)
127 end
128 end
129 if isCreature(params.cid) then
130 doSendMagicEffect(params.originalPositionCid, 244)
131 addEvent(function()
132 doSendMagicEffect(params.cid, 244)
133 doCreatureChangeOutfit(params.cid, {lookType = 0})
134 doTeleportThing(params.cid, params.originalPositionCid)
135 doSendMagicEffect(params.originalPositionCid, 244)
136 doCreatureChangeOutfit(params.cid, params.originalOutfit)
137 end, 900)
138 end
139 if isCreature(params.target) then
140 doSendMagicEffect(params.originalPositionTarget, 244)
141 addEvent(function()
142 doSendMagicEffect(params.target, 244)
143 doCreatureChangeOutfit(params.target, {lookType = 0})
144 doTeleportThing(params.target, params.originalPositionTarget)
145 doSendMagicEffect(params.originalPositionTarget, 244)
146 doCreatureChangeOutfit(params.target, getCreatureOutfit(params.target))
147 end, 900)
148 end
149 end, 14000, {affectedCreatures = affectedCreatures, originalPositionCid = originalPositionCid, originalPositionTarget = originalPositionTarget, cid = cid, target = target, originalOutfit = originalOutfit})
150
151 addEvent(function(params)
152 for _, creatureData in ipairs(params.affectedCreatures) do
153 if isCreature(creatureData.uid) then
154 doTeleportThing(creatureData.uid, creatureData.originalPosition)
155 doSendMagicEffect(creatureData.originalPosition, 244)
156 doCreatureChangeOutfit(creatureData.uid, creatureData.originalOutfit)
157 end
158 end
159 if isCreature(params.cid) then
160 doTeleportThing(params.cid, params.originalPositionCid)
161 doSendMagicEffect(params.originalPositionCid, 244)
162 doCreatureChangeOutfit(params.cid, params.originalOutfit)
163 end
164 if isCreature(params.target) then
165 doTeleportThing(params.target, params.originalPositionTarget)
166 doSendMagicEffect(params.originalPositionTarget, 244)
167 doCreatureChangeOutfit(params.target, getCreatureOutfit(params.target))
168 end
169 end, 15000, {affectedCreatures = affectedCreatures, originalPositionCid = originalPositionCid, originalPositionTarget = originalPositionTarget, cid = cid, target = target, originalOutfit = originalOutfit})
170end
171
172local function byakuyaSpell(cid)
173 local position = getCreaturePosition(cid)
174 local target = getCreatureTarget(cid)
175 if not target then
176 return false
177 end
178 local targetPosition = getCreaturePosition(target)
179
180 local affectedCreatures = {}
181 local totalDelay = 0
182 for x = -3, 3 do
183 for y = -3, 3 do
184 local patternX, patternY = x + 4, y + 4
185
186 if wmPattern[patternX] and wmPattern[patternX][patternY] and wmPattern[patternX][patternY] == 1 then
187 local newPos = {
188 x = targetPosition.x + x,
189 y = targetPosition.y + y,
190 z = targetPosition.z
191 }
192 for effectIndex, effectId in ipairs({241, 247, 253, 245}) do
193 local delay = (effectIndex - 1) * 500
194 addEvent(function()
195 local effectPos = newPos
196 if effectId == 247 then
197 effectPos = {x = newPos.x + 1, y = newPos.y + 1, z = newPos.z}
198 elseif effectId == 253 then
199 effectPos = {x = newPos.x + 1, y = newPos.y + 1, z = newPos.z}
200 elseif effectId == 245 then
201 effectPos = {x = newPos.x + 3, y = newPos.y + 3, z = newPos.z}
202 end
203 doSendMagicEffect(effectPos, effectId)
204 end, delay)
205 totalDelay = math.max(totalDelay, delay)
206 end
207 local affected = applyEffects(cid, newPos)
208 for _, creatureData in ipairs(affected) do
209 table.insert(affectedCreatures, creatureData)
210 end
211 end
212 end
213 end
214
215 local originalPositionCid = getCreaturePosition(cid)
216 local originalPositionTarget = getCreaturePosition(target)
217 local originalOutfit = getCreatureOutfit(cid)
218
219 addEvent(function()
220 doSendMagicEffect(originalPositionCid, 244)
221 doCreatureChangeOutfit(cid, {lookType = 0})
222 end, totalDelay + 500)
223
224 for _, creatureData in ipairs(affectedCreatures) do
225 addEvent(function()
226 if isCreature(creatureData.uid) then
227 doSendMagicEffect(creatureData.originalPosition, 244)
228 doCreatureChangeOutfit(creatureData.uid, {lookType = 0})
229 end
230 end, totalDelay + 500)
231 end
232
233 addEvent(teleportToWorld, totalDelay + 1000, {cid = cid, target = target, affectedCreatures = affectedCreatures, originalPositionCid = originalPositionCid, originalPositionTarget = originalPositionTarget, originalOutfit = originalOutfit})
234end
235
236function onCastSpell(cid, var)
237 byakuyaSpell(cid)
238 return true
239end
Top