warscript 0.0.1-dev.1bb9186 → 0.0.1-dev.1c7aecc

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/attributes.d.ts +6 -0
  2. package/attributes.lua +17 -1
  3. package/config.d.ts +5 -0
  4. package/config.lua +10 -0
  5. package/core/types/effect.d.ts +1 -3
  6. package/core/types/effect.lua +26 -29
  7. package/core/types/frame.lua +24 -21
  8. package/core/types/player.d.ts +16 -0
  9. package/core/types/player.lua +60 -15
  10. package/core/types/playerCamera.d.ts +2 -0
  11. package/core/types/playerCamera.lua +123 -5
  12. package/core/types/sound.d.ts +17 -24
  13. package/core/types/sound.lua +99 -24
  14. package/core/types/tileCell.d.ts +11 -1
  15. package/core/types/tileCell.lua +97 -0
  16. package/core/types/timer.d.ts +9 -8
  17. package/core/types/timer.lua +45 -23
  18. package/core/util.lua +6 -1
  19. package/decl/native.d.ts +846 -790
  20. package/destroyable.d.ts +1 -0
  21. package/destroyable.lua +9 -0
  22. package/engine/behavior.d.ts +14 -1
  23. package/engine/behavior.lua +230 -70
  24. package/engine/behaviour/ability/apply-buff.d.ts +5 -0
  25. package/engine/behaviour/ability/apply-buff.lua +36 -4
  26. package/engine/behaviour/ability/apply-unit-behavior.lua +1 -0
  27. package/engine/behaviour/ability/damage.d.ts +9 -3
  28. package/engine/behaviour/ability/damage.lua +26 -38
  29. package/engine/behaviour/ability/emulate-impact.d.ts +1 -1
  30. package/engine/behaviour/ability/emulate-impact.lua +18 -3
  31. package/engine/behaviour/ability/remove-buffs.d.ts +9 -0
  32. package/engine/behaviour/ability/remove-buffs.lua +21 -0
  33. package/engine/behaviour/ability/restore-mana.d.ts +1 -1
  34. package/engine/behaviour/ability/restore-mana.lua +6 -6
  35. package/engine/behaviour/ability.d.ts +13 -3
  36. package/engine/behaviour/ability.lua +72 -24
  37. package/engine/behaviour/unit/stun-immunity.d.ts +12 -6
  38. package/engine/behaviour/unit/stun-immunity.lua +57 -31
  39. package/engine/behaviour/unit.d.ts +40 -2
  40. package/engine/behaviour/unit.lua +269 -6
  41. package/engine/buff.d.ts +100 -50
  42. package/engine/buff.lua +495 -262
  43. package/engine/internal/ability.d.ts +7 -1
  44. package/engine/internal/ability.lua +49 -9
  45. package/engine/internal/item/ability.lua +63 -11
  46. package/engine/internal/item+owner.lua +12 -6
  47. package/engine/internal/item.d.ts +20 -19
  48. package/engine/internal/item.lua +191 -74
  49. package/engine/internal/mechanics/ability-duration.lua +1 -1
  50. package/engine/internal/mechanics/cast-ability.lua +6 -3
  51. package/engine/internal/misc/damage-metadata-by-target.d.ts +2 -0
  52. package/engine/internal/misc/damage-metadata-by-target.lua +5 -0
  53. package/engine/internal/misc/frame-coordinates.d.ts +2 -0
  54. package/engine/internal/misc/frame-coordinates.lua +21 -0
  55. package/engine/internal/misc/get-terrain-z.d.ts +2 -0
  56. package/engine/internal/misc/get-terrain-z.lua +11 -0
  57. package/engine/internal/misc/player-local-handle.d.ts +2 -0
  58. package/engine/internal/misc/player-local-handle.lua +5 -0
  59. package/engine/internal/object-data/auto-attack-speed-increase.d.ts +1 -1
  60. package/engine/internal/object-data/auto-attack-speed-increase.lua +2 -0
  61. package/engine/internal/object-data/evasion-probability.d.ts +2 -0
  62. package/engine/internal/object-data/evasion-probability.lua +16 -0
  63. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.d.ts +2 -0
  64. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.lua +16 -0
  65. package/engine/internal/unit/ability.d.ts +35 -0
  66. package/engine/internal/unit/ability.lua +98 -9
  67. package/engine/internal/unit/add-item-to-slot.lua +4 -2
  68. package/engine/internal/unit/allowed-targets.d.ts +1 -1
  69. package/engine/internal/unit/allowed-targets.lua +9 -1
  70. package/engine/internal/unit/attributes.d.ts +17 -0
  71. package/engine/internal/unit/attributes.lua +46 -0
  72. package/engine/internal/unit/bonus.d.ts +4 -0
  73. package/engine/internal/unit/bonus.lua +27 -0
  74. package/engine/internal/unit/fly-height.d.ts +7 -0
  75. package/engine/internal/unit/fly-height.lua +20 -0
  76. package/engine/internal/unit/interrupts.d.ts +12 -0
  77. package/engine/internal/unit/interrupts.lua +28 -0
  78. package/engine/internal/unit/main-selected.lua +12 -27
  79. package/engine/internal/unit/order.d.ts +20 -0
  80. package/engine/internal/unit/order.lua +136 -0
  81. package/engine/internal/unit/range-event.d.ts +12 -0
  82. package/engine/internal/unit/range-event.lua +90 -0
  83. package/engine/internal/unit/scale.d.ts +7 -0
  84. package/engine/internal/unit/scale.lua +20 -0
  85. package/engine/internal/unit+ability.lua +10 -1
  86. package/engine/internal/unit+damage.d.ts +2 -11
  87. package/engine/internal/unit+damage.lua +10 -14
  88. package/engine/internal/unit+spellSteal.lua +1 -2
  89. package/engine/internal/unit-missile-launch.lua +52 -14
  90. package/engine/internal/unit.d.ts +43 -25
  91. package/engine/internal/unit.lua +384 -260
  92. package/engine/lightning.d.ts +4 -3
  93. package/engine/lightning.lua +28 -20
  94. package/engine/local-client.d.ts +2 -0
  95. package/engine/local-client.lua +30 -0
  96. package/engine/object-data/auxiliary/animation-name.d.ts +1 -0
  97. package/engine/object-data/auxiliary/animation-name.lua +16 -0
  98. package/engine/object-data/auxiliary/armor-type.d.ts +11 -0
  99. package/engine/object-data/auxiliary/armor-type.lua +46 -0
  100. package/engine/object-data/auxiliary/attachment-preset.d.ts +7 -2
  101. package/engine/object-data/auxiliary/attachment-preset.lua +4 -3
  102. package/engine/object-data/auxiliary/attack-type.d.ts +7 -8
  103. package/engine/object-data/auxiliary/attack-type.lua +42 -0
  104. package/engine/object-data/auxiliary/health-regeneration-type.d.ts +8 -0
  105. package/engine/object-data/auxiliary/health-regeneration-type.lua +2 -0
  106. package/engine/object-data/auxiliary/movement-type.d.ts +7 -7
  107. package/engine/object-data/auxiliary/movement-type.lua +22 -0
  108. package/engine/object-data/auxiliary/sound-eax.d.ts +10 -0
  109. package/engine/object-data/auxiliary/sound-eax.lua +2 -0
  110. package/engine/object-data/auxiliary/tech-tree-dependency.d.ts +1 -1
  111. package/engine/object-data/auxiliary/unit-attribute.d.ts +6 -0
  112. package/engine/object-data/auxiliary/unit-attribute.lua +9 -0
  113. package/engine/object-data/entry/ability-type/berserk.d.ts +2 -0
  114. package/engine/object-data/entry/ability-type/berserk.lua +13 -0
  115. package/engine/object-data/entry/ability-type/blank-configurable.lua +12 -1
  116. package/engine/object-data/entry/ability-type/carrion-swarm.d.ts +14 -0
  117. package/engine/object-data/entry/ability-type/carrion-swarm.lua +65 -0
  118. package/engine/object-data/entry/ability-type/disease-cloud.lua +2 -2
  119. package/engine/object-data/entry/ability-type/engineering-upgrade.lua +2 -2
  120. package/engine/object-data/entry/ability-type/ensnare.d.ts +12 -0
  121. package/engine/object-data/entry/ability-type/ensnare.lua +52 -0
  122. package/engine/object-data/entry/ability-type/feral-spirit.lua +2 -2
  123. package/engine/object-data/entry/ability-type/mana-regeneration.d.ts +8 -0
  124. package/engine/object-data/entry/ability-type/mana-regeneration.lua +26 -0
  125. package/engine/object-data/entry/ability-type/permanent-invisibility.d.ts +8 -0
  126. package/engine/object-data/entry/ability-type/permanent-invisibility.lua +26 -0
  127. package/engine/object-data/entry/ability-type/phase-shift.d.ts +10 -0
  128. package/engine/object-data/entry/ability-type/phase-shift.lua +39 -0
  129. package/engine/object-data/entry/ability-type/phoenix-morph.lua +4 -4
  130. package/engine/object-data/entry/ability-type/raise-dead.d.ts +17 -0
  131. package/engine/object-data/entry/ability-type/raise-dead.lua +78 -0
  132. package/engine/object-data/entry/ability-type/reincarnation.d.ts +8 -0
  133. package/engine/object-data/entry/ability-type/reincarnation.lua +26 -0
  134. package/engine/object-data/entry/ability-type/shock-wave.d.ts +4 -0
  135. package/engine/object-data/entry/ability-type/shock-wave.lua +26 -0
  136. package/engine/object-data/entry/ability-type/slow-poison.d.ts +10 -0
  137. package/engine/object-data/entry/ability-type/slow-poison.lua +58 -0
  138. package/engine/object-data/entry/ability-type/summon-quilbeast.lua +2 -2
  139. package/engine/object-data/entry/ability-type/summon-water-elemental.lua +2 -2
  140. package/engine/object-data/entry/ability-type/web.d.ts +12 -0
  141. package/engine/object-data/entry/ability-type/web.lua +52 -0
  142. package/engine/object-data/entry/ability-type.d.ts +21 -17
  143. package/engine/object-data/entry/ability-type.lua +169 -28
  144. package/engine/object-data/entry/buff-type/applicable.lua +18 -37
  145. package/engine/object-data/entry/buff-type.d.ts +6 -12
  146. package/engine/object-data/entry/buff-type.lua +13 -29
  147. package/engine/object-data/entry/destructible-type.d.ts +28 -2
  148. package/engine/object-data/entry/destructible-type.lua +155 -0
  149. package/engine/object-data/entry/item-type.d.ts +1 -1
  150. package/engine/object-data/entry/item-type.lua +4 -4
  151. package/engine/object-data/entry/lightning-type.d.ts +1 -1
  152. package/engine/object-data/entry/sound-preset.d.ts +33 -0
  153. package/engine/object-data/entry/sound-preset.lua +140 -0
  154. package/engine/object-data/entry/unit-type.d.ts +25 -5
  155. package/engine/object-data/entry/unit-type.lua +258 -93
  156. package/engine/object-data/entry/upgrade.d.ts +1 -1
  157. package/engine/object-data/entry/upgrade.lua +4 -4
  158. package/engine/object-data/entry.d.ts +16 -14
  159. package/engine/object-data/entry.lua +60 -32
  160. package/engine/object-field/ability.d.ts +4 -4
  161. package/engine/object-field/ability.lua +7 -6
  162. package/engine/object-field/unit.d.ts +72 -3
  163. package/engine/object-field/unit.lua +268 -7
  164. package/engine/object-field.d.ts +25 -6
  165. package/engine/object-field.lua +357 -118
  166. package/engine/random.d.ts +10 -0
  167. package/engine/random.lua +21 -0
  168. package/engine/standard/entries/buff-type.d.ts +3 -0
  169. package/engine/standard/entries/buff-type.lua +3 -0
  170. package/engine/standard/entries/sound-preset.d.ts +10 -0
  171. package/engine/standard/entries/sound-preset.lua +10 -0
  172. package/engine/standard/fields/ability.d.ts +2 -2
  173. package/engine/standard/fields/ability.lua +2 -2
  174. package/engine/standard/fields/unit.d.ts +12 -0
  175. package/engine/standard/fields/unit.lua +20 -0
  176. package/engine/synchronization.d.ts +11 -0
  177. package/engine/synchronization.lua +77 -0
  178. package/engine/text-tag.d.ts +36 -2
  179. package/engine/text-tag.lua +250 -10
  180. package/engine/unit.d.ts +6 -0
  181. package/engine/unit.lua +6 -0
  182. package/net/socket.lua +1 -1
  183. package/objutil/buff.lua +11 -10
  184. package/objutil/unit.lua +8 -0
  185. package/package.json +2 -2
  186. package/patch-lua.lua +15 -0
  187. package/patch-lualib.lua +1 -1
  188. package/utility/arrays.d.ts +2 -0
  189. package/utility/arrays.lua +11 -0
  190. package/utility/callback-array.d.ts +17 -0
  191. package/utility/callback-array.lua +61 -0
  192. package/utility/functions.d.ts +8 -0
  193. package/utility/functions.lua +13 -0
  194. package/utility/linked-map.d.ts +34 -0
  195. package/utility/linked-map.lua +101 -0
  196. package/utility/linked-set.d.ts +4 -1
  197. package/utility/linked-set.lua +43 -1
  198. package/utility/lua-maps.d.ts +15 -2
  199. package/utility/lua-maps.lua +53 -2
  200. package/utility/lua-sets.d.ts +2 -0
  201. package/utility/lua-sets.lua +7 -0
  202. package/utility/records.lua +20 -1
  203. package/utility/reflection.lua +11 -7
  204. package/utility/types.d.ts +3 -0
  205. package/core/types/order.d.ts +0 -25
  206. package/core/types/order.lua +0 -55
package/engine/buff.lua CHANGED
@@ -16,6 +16,7 @@ local internalApplyBuff = ____applicable.internalApplyBuff
16
16
  local removeBuff = ____applicable.removeBuff
17
17
  local ____ability = require("engine.internal.ability")
18
18
  local Ability = ____ability.Ability
19
+ local UnitAbility = ____ability.UnitAbility
19
20
  local ____ability = require("engine.object-field.ability")
20
21
  local AbilityBooleanField = ____ability.AbilityBooleanField
21
22
  local AbilityNumberField = ____ability.AbilityNumberField
@@ -28,13 +29,11 @@ local ____math = require("math")
28
29
  local max = ____math.max
29
30
  local min = ____math.min
30
31
  local ____bonus = require("engine.internal.unit.bonus")
31
- local addOrUpdateOrRemoveUnitBonus = ____bonus.addOrUpdateOrRemoveUnitBonus
32
- local getUnitBonus = ____bonus.getUnitBonus
33
- local removeUnitBonus = ____bonus.removeUnitBonus
34
32
  local UnitBonusType = ____bonus.UnitBonusType
35
33
  local ____area_2Ddamage = require("engine.internal.mechanics.area-damage")
36
34
  local damageArea = ____area_2Ddamage.damageArea
37
35
  local ____preconditions = require("utility.preconditions")
36
+ local check = ____preconditions.check
38
37
  local checkNotNull = ____preconditions.checkNotNull
39
38
  local ____effect = require("core.types.effect")
40
39
  local Effect = ____effect.Effect
@@ -43,13 +42,22 @@ local BuffType = ____buff_2Dtype.BuffType
43
42
  local ____unit = require("engine.behaviour.unit")
44
43
  local UnitBehavior = ____unit.UnitBehavior
45
44
  local ____arrays = require("utility.arrays")
45
+ local emptyArray = ____arrays.emptyArray
46
46
  local forEach = ____arrays.forEach
47
+ local ____event = require("event")
48
+ local Event = ____event.Event
47
49
  local ____ability_2Dduration = require("engine.internal.mechanics.ability-duration")
48
50
  local getAbilityDuration = ____ability_2Dduration.getAbilityDuration
49
51
  local ____item = require("engine.internal.item")
50
52
  local Item = ____item.Item
51
53
  local ____destructable = require("core.types.destructable")
52
54
  local Destructable = ____destructable.Destructable
55
+ local ____ability = require("engine.standard.fields.ability")
56
+ local COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD = ____ability.COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD
57
+ local ____ability = require("engine.behaviour.ability")
58
+ local AbilityBehavior = ____ability.AbilityBehavior
59
+ local ____records = require("utility.records")
60
+ local sortedKeysUnnested = ____records.sortedKeysUnnested
53
61
  local getUnitAbility = BlzGetUnitAbility
54
62
  local stringValueByBuffTypeIdByFieldId = postcompile(function()
55
63
  local stringValueByBuffTypeIdByFieldId = {}
@@ -98,12 +106,16 @@ local buffParametersKeys = {
98
106
  armorIncreaseFactor = true,
99
107
  attackSpeedIncreaseFactor = true,
100
108
  movementSpeedIncreaseFactor = true,
109
+ manaRegenerationRateIncreaseFactor = true,
110
+ evasionProbability = true,
111
+ missProbability = true,
101
112
  damageFactor = true,
102
113
  receivedDamageFactor = true,
103
114
  receivedMagicDamageFactor = true,
104
115
  durationIncreaseOnAutoAttack = true,
105
116
  maximumDuration = true,
106
117
  maximumRemainingDuration = true,
118
+ turnsIntoGhost = true,
107
119
  stuns = true,
108
120
  ignoresStunImmunity = true,
109
121
  providesStunImmunity = true,
@@ -114,11 +126,15 @@ local buffParametersKeys = {
114
126
  maximumAutoAttackCount = true,
115
127
  maximumDamageDealtEventCount = true,
116
128
  maximumDamageReceivedEventCount = true,
129
+ absorbedDamageFactor = true,
130
+ maximumDamageAbsorbed = true,
131
+ destroysOnMaximumDamageAbsorbed = true,
117
132
  uniqueGroup = true,
118
133
  damageOnExpiration = true,
119
134
  healingOnExpiration = true,
120
135
  killsOnExpiration = true,
121
- explodesOnExpiration = true
136
+ explodesOnExpiration = true,
137
+ abilityCooldownFactor = true
122
138
  }
123
139
  local function resolveEnumValue(ability, level, value)
124
140
  if value == nil or type(value) == "number" then
@@ -169,6 +185,8 @@ local function resolveAndSetNumberValue(buff, property, ability, level, value, d
169
185
  end
170
186
  end
171
187
  local buffBooleanParameters = {
188
+ "destroysOnMaximumDamageAbsorbed",
189
+ "turnsIntoGhost",
172
190
  "stuns",
173
191
  "ignoresStunImmunity",
174
192
  "disablesAutoAttack",
@@ -180,6 +198,8 @@ local buffNumberParameters = {
180
198
  "durationIncreaseOnAutoAttack",
181
199
  "attackSpeedIncreaseFactor",
182
200
  "movementSpeedIncreaseFactor",
201
+ "manaRegenerationRateIncreaseFactor",
202
+ "evasionProbability",
183
203
  "armorIncrease",
184
204
  "damageFactor",
185
205
  "receivedDamageFactor",
@@ -193,7 +213,10 @@ local buffNumberParameters = {
193
213
  "healingPerInterval",
194
214
  "healingOverDuration",
195
215
  "damageOnExpiration",
196
- "healingOnExpiration"
216
+ "healingOnExpiration",
217
+ "absorbedDamageFactor",
218
+ "maximumDamageAbsorbed",
219
+ "abilityCooldownFactor"
197
220
  }
198
221
  local unsuccessfulApplicationMarker = {}
199
222
  local function selectBuffTypeIdWithLeastDuration(buffTypeIds, unit)
@@ -220,7 +243,7 @@ local function selectBuffTypeIdWithLeastDuration(buffTypeIds, unit)
220
243
  return checkNotNull(firstNativeBuffTypeId)
221
244
  end
222
245
  local function destroyBuffIfItHasSameUniqueGroup(buff, uniqueGroup)
223
- if buff[103] == uniqueGroup then
246
+ if buff[104] == uniqueGroup then
224
247
  buff:destroy()
225
248
  end
226
249
  end
@@ -228,17 +251,17 @@ local function destroyBuff(buff)
228
251
  buff:destroy()
229
252
  end
230
253
  local function expireBuff(buff)
231
- local remainingDamageOverDuration = buff[112] or 0
232
- local remainingHealingOverDuration = buff[112] or 0
254
+ local remainingDamageOverDuration = buff[113] or 0
255
+ local remainingHealingOverDuration = buff[113] or 0
233
256
  if remainingDamageOverDuration ~= 0 or remainingHealingOverDuration ~= 0 then
234
257
  buff:flashSpecialEffect()
235
258
  if remainingDamageOverDuration ~= 0 then
236
- (buff[101] or buff[100]):damageTarget(buff[100], remainingDamageOverDuration)
237
- buff[112] = nil
259
+ (buff[102] or buff[101]):damageTarget(buff[101], remainingDamageOverDuration)
260
+ buff[113] = nil
238
261
  end
239
262
  if remainingHealingOverDuration ~= 0 then
240
- (buff[101] or buff[100]):healTarget(buff[100], remainingHealingOverDuration)
241
- buff[117] = nil
263
+ (buff[102] or buff[101]):healTarget(buff[101], remainingHealingOverDuration)
264
+ buff[118] = nil
242
265
  end
243
266
  end
244
267
  Timer:run(destroyBuff, buff)
@@ -246,56 +269,58 @@ local function expireBuff(buff)
246
269
  end
247
270
  local function buffDamageIntervalInitialTimerCallback(buff)
248
271
  buffDamageIntervalTimerCallback(buff)
249
- local timer = buff[113]
250
- local damageInterval = buff[111]
272
+ local timer = buff[114]
273
+ local damageInterval = buff[112]
251
274
  if timer ~= nil and damageInterval ~= nil and damageInterval > 0 then
252
275
  timer:start(damageInterval, true, buffDamageIntervalTimerCallback, buff)
253
276
  end
254
277
  end
255
278
  buffDamageIntervalTimerCallback = function(buff)
256
279
  buff:flashSpecialEffect()
257
- local source = buff[101] or buff[100]
258
- local remainingDamageOverDuration = buff[112] or 0
280
+ local source = buff[102] or buff[101]
281
+ local remainingDamageOverDuration = buff[113] or 0
259
282
  if remainingDamageOverDuration ~= 0 then
260
- local damageInterval = buff[111] or 0
283
+ local damageInterval = buff[112] or 0
261
284
  if damageInterval ~= 0 then
262
285
  local damage = remainingDamageOverDuration / (1 + buff.remainingDuration / damageInterval)
263
- source:damageTarget(buff[100], damage)
264
- buff[112] = remainingDamageOverDuration - damage
286
+ source:damageTarget(buff[101], damage)
287
+ buff[113] = remainingDamageOverDuration - damage
265
288
  end
266
289
  end
267
- local damagePerInterval = buff[110] or 0
290
+ local damagePerInterval = buff[111] or 0
268
291
  if remainingDamageOverDuration == 0 or damagePerInterval ~= 0 then
269
- source:damageTarget(buff[100], damagePerInterval)
292
+ source:damageTarget(buff[101], damagePerInterval)
270
293
  end
271
294
  end
272
295
  local function buffHealingIntervalInitialTimerCallback(buff)
273
296
  buffHealingIntervalTimerCallback(buff)
274
- local timer = buff[118]
275
- local healingInterval = buff[116]
297
+ local timer = buff[119]
298
+ local healingInterval = buff[117]
276
299
  if timer ~= nil and healingInterval ~= nil and healingInterval > 0 then
277
300
  timer:start(healingInterval, true, buffHealingIntervalTimerCallback, buff)
278
301
  end
279
302
  end
280
303
  buffHealingIntervalTimerCallback = function(buff)
281
- if buff[116] ~= buff[111] then
304
+ if buff[117] ~= buff[112] then
282
305
  buff:flashSpecialEffect()
283
306
  end
284
- local source = buff[101] or buff[100]
285
- local remainingHealingOverDuration = buff[117] or 0
307
+ local source = buff[102] or buff[101]
308
+ local remainingHealingOverDuration = buff[118] or 0
286
309
  if remainingHealingOverDuration ~= 0 then
287
- local healingInterval = buff[116] or 0
310
+ local healingInterval = buff[117] or 0
288
311
  if healingInterval ~= 0 then
289
312
  local healing = remainingHealingOverDuration / (1 + buff.remainingDuration / healingInterval)
290
- source:healTarget(buff[100], healing)
291
- buff[117] = remainingHealingOverDuration - healing
313
+ source:healTarget(buff[101], healing)
314
+ buff[118] = remainingHealingOverDuration - healing
292
315
  end
293
316
  end
294
- local healingPerInterval = buff[115] or 0
317
+ local healingPerInterval = buff[116] or 0
295
318
  if remainingHealingOverDuration == 0 or healingPerInterval ~= 0 then
296
- source:healTarget(buff[100], healingPerInterval)
319
+ source:healTarget(buff[101], healingPerInterval)
297
320
  end
298
321
  end
322
+ local buffCreatedEvent = __TS__New(Event)
323
+ local buffBeingDestroyedEvent = __TS__New(Event)
299
324
  ____exports.Buff = __TS__Class()
300
325
  local Buff = ____exports.Buff
301
326
  Buff.name = "Buff"
@@ -304,38 +329,44 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
304
329
  UnitBehavior.prototype.____constructor(self, _unit)
305
330
  self._unit = _unit
306
331
  self.parameters = nil
307
- self[100] = _unit
332
+ self[100] = 0
333
+ self[101] = _unit
308
334
  local typeId
309
335
  local polarity
310
336
  local resistanceType
311
337
  local ability
338
+ local abilityBehavior
312
339
  if type(typeIdOrTypeIds) ~= "number" then
313
340
  typeId = selectBuffTypeIdWithLeastDuration(typeIdOrTypeIds, _unit)
314
341
  polarity = resistanceTypeOrPolarity
315
342
  resistanceType = abilityOrParametersOrResistanceType
316
- if __TS__InstanceOf(parametersOrAbility, Ability) then
343
+ if __TS__InstanceOf(parametersOrAbility, AbilityBehavior) then
344
+ abilityBehavior = parametersOrAbility
345
+ ability = abilityBehavior.ability
346
+ elseif __TS__InstanceOf(parametersOrAbility, Ability) then
317
347
  ability = parametersOrAbility
318
- else
319
- ability = nil
348
+ elseif parametersOrAbility ~= nil then
320
349
  parameters = parametersOrAbility
321
350
  end
322
351
  else
323
352
  typeId = typeIdOrTypeIds
324
353
  polarity = polarityOrTypeIdSelectionPolicy
325
354
  resistanceType = resistanceTypeOrPolarity
326
- if __TS__InstanceOf(abilityOrParametersOrResistanceType, Ability) then
355
+ if __TS__InstanceOf(abilityOrParametersOrResistanceType, AbilityBehavior) then
356
+ abilityBehavior = abilityOrParametersOrResistanceType
357
+ ability = abilityBehavior.ability
358
+ parameters = parametersOrAbility
359
+ elseif __TS__InstanceOf(abilityOrParametersOrResistanceType, Ability) then
327
360
  ability = abilityOrParametersOrResistanceType
328
361
  parameters = parametersOrAbility
329
- else
330
- ability = nil
362
+ elseif abilityOrParametersOrResistanceType ~= nil then
331
363
  parameters = abilityOrParametersOrResistanceType
364
+ else
365
+ parameters = parametersOrAbility
332
366
  end
333
367
  end
368
+ self.sourceAbilityBehavior = abilityBehavior
334
369
  self.typeId = typeId
335
- if not __TS__InstanceOf(ability, Ability) then
336
- parameters = ability
337
- ability = nil
338
- end
339
370
  local defaultParameters = self.constructor.defaultParameters
340
371
  local level = parameters and parameters.level or defaultParameters.level
341
372
  local spellStealPriority = parameters and parameters.spellStealPriority or defaultParameters.spellStealPriority
@@ -360,14 +391,19 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
360
391
  end
361
392
  self.polarity = resolveEnumValue(ability, level, polarity)
362
393
  self.resistanceType = resolveEnumValue(ability, level, resistanceType)
394
+ local missProbability = parameters and parameters.missProbability or defaultParameters.missProbability
395
+ if missProbability ~= nil then
396
+ missProbability = resolveNumberValue(ability, level, missProbability)
397
+ self[146] = missProbability
398
+ end
363
399
  local buffByTypeId = buffByTypeIdByUnit[_unit]
364
400
  if buffByTypeId == nil then
365
401
  buffByTypeId = {}
366
402
  buffByTypeIdByUnit[_unit] = buffByTypeId
367
403
  end
368
- local ____opt_13 = buffByTypeId[typeId]
369
- if ____opt_13 ~= nil then
370
- ____opt_13:destroy()
404
+ local ____opt_15 = buffByTypeId[typeId]
405
+ if ____opt_15 ~= nil then
406
+ ____opt_15:destroy()
371
407
  end
372
408
  local uniqueGroup = parameters and parameters.uniqueGroup or defaultParameters and defaultParameters.uniqueGroup
373
409
  if uniqueGroup ~= nil then
@@ -381,13 +417,16 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
381
417
  level,
382
418
  duration,
383
419
  spellStealPriority,
384
- learnLevelMinimum
420
+ learnLevelMinimum,
421
+ missProbability
385
422
  ) then
423
+ self[100] = 1
386
424
  UnitBehavior.prototype.destroy(self)
387
425
  error(unsuccessfulApplicationMarker, 0)
388
426
  end
389
427
  local handle = BlzGetUnitAbility(_unit.handle, typeId)
390
428
  if handle == nil then
429
+ self[100] = 1
391
430
  UnitBehavior.prototype.destroy(self)
392
431
  error(unsuccessfulApplicationMarker, 0)
393
432
  end
@@ -396,20 +435,20 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
396
435
  self._level = level
397
436
  self._spellStealPriority = spellStealPriority
398
437
  self._learnLevelMinimum = learnLevelMinimum
399
- self[101] = source
400
- self[102] = duration or 0
401
- self[103] = uniqueGroup
402
- self[104] = BlzGetAbilityStringLevelField(self.handle, ABILITY_SLF_EFFECT, 0)
403
- self[105] = BlzGetAbilityStringLevelField(self.handle, ABILITY_SLF_SPECIAL, 0)
438
+ self[102] = source
439
+ self[103] = duration or 0
440
+ self[104] = uniqueGroup
441
+ self[105] = BlzGetAbilityStringLevelField(self.handle, ABILITY_SLF_EFFECT, 0)
442
+ self[106] = BlzGetAbilityStringLevelField(self.handle, ABILITY_SLF_SPECIAL, 0)
404
443
  if parameters ~= nil or (next(defaultParameters)) ~= nil then
405
444
  for ____, buffBooleanParameter in ipairs(buffBooleanParameters) do
406
- local ____ability_22 = ability
407
- local ____level_23 = level
408
- local ____temp_21 = parameters and parameters[buffBooleanParameter]
409
- if ____temp_21 == nil then
410
- ____temp_21 = defaultParameters[buffBooleanParameter]
445
+ local ____ability_24 = ability
446
+ local ____level_25 = level
447
+ local ____temp_23 = parameters and parameters[buffBooleanParameter]
448
+ if ____temp_23 == nil then
449
+ ____temp_23 = defaultParameters[buffBooleanParameter]
411
450
  end
412
- if resolveBooleanValue(____ability_22, ____level_23, ____temp_21) then
451
+ if resolveBooleanValue(____ability_24, ____level_25, ____temp_23) then
413
452
  self[buffBooleanParameter] = true
414
453
  end
415
454
  end
@@ -425,11 +464,11 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
425
464
  end
426
465
  local maximumDuration = parameters and parameters.maximumDuration or defaultParameters.maximumDuration
427
466
  if maximumDuration ~= nil then
428
- self[107] = resolveNumberValue(ability, level, maximumDuration)
467
+ self[108] = resolveNumberValue(ability, level, maximumDuration)
429
468
  end
430
469
  local maximumRemainingDuration = parameters and parameters.maximumRemainingDuration or defaultParameters.maximumRemainingDuration
431
470
  if maximumRemainingDuration ~= nil then
432
- self[108] = resolveNumberValue(ability, level, maximumRemainingDuration)
471
+ self[109] = resolveNumberValue(ability, level, maximumRemainingDuration)
433
472
  end
434
473
  local parametersAbilityTypeIds = parameters and parameters.abilityTypeIds or defaultParameters.abilityTypeIds
435
474
  if parametersAbilityTypeIds ~= nil then
@@ -438,24 +477,22 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
438
477
  abilityTypeIds = {}
439
478
  self._abilityTypeIds = abilityTypeIds
440
479
  end
441
- for abilityTypeId, abilityParameters in pairs(parametersAbilityTypeIds) do
480
+ for ____, abilityTypeId in ipairs(sortedKeysUnnested(parametersAbilityTypeIds)) do
481
+ local abilityParameters = parametersAbilityTypeIds[abilityTypeId]
442
482
  local addedAbility = _unit:addAbility(abilityTypeId)
443
483
  if addedAbility ~= nil then
444
484
  _unit:makeAbilityPermanent(abilityTypeId, true)
445
485
  _unit:setAbilityLevel(abilityTypeId, 1 + (abilityParameters.level or ability and ability.level or 0))
446
- for abilityParameterKey, abilityParameterValue in pairs(abilityParameters) do
447
- if abilityParameterKey == "isButtonVisible" then
448
- if not resolveBooleanValue(ability, level, abilityParameterValue) then
449
- _unit:hideAbility(abilityTypeId, true)
450
- end
451
- elseif abilityParameterKey ~= "level" then
452
- abilityParameterKey:setValue(
453
- addedAbility,
454
- resolveNumberValue(ability, level, abilityParameterValue)
455
- )
456
- end
486
+ if abilityParameters.isButtonVisible == false then
487
+ _unit:hideAbility(abilityTypeId, true)
488
+ end
489
+ for ____, field in ipairs(abilityParameters.fields or emptyArray()) do
490
+ field[1]:setValue(
491
+ addedAbility,
492
+ resolveNumberValue(ability, level, field[2])
493
+ )
457
494
  end
458
- abilityTypeIds[abilityTypeId] = true
495
+ abilityTypeIds[#abilityTypeIds + 1] = abilityTypeId
459
496
  end
460
497
  end
461
498
  local behaviorConstructors = parameters and parameters.behaviorConstructors or defaultParameters.behaviorConstructors
@@ -467,18 +504,20 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
467
504
  self._behaviors = behaviors
468
505
  end
469
506
  end
470
- local additionalParameters = {}
471
- for key, value in pairs(parameters) do
472
- if not buffParametersKeys[key] then
473
- if ability then
474
- additionalParameters[key] = resolveCurrentAbilityDependentValue(ability, value)
475
- else
476
- additionalParameters[key] = value
507
+ if parameters ~= nil then
508
+ local additionalParameters = {}
509
+ for ____, key in ipairs(sortedKeysUnnested(parameters)) do
510
+ if not buffParametersKeys[key] then
511
+ if ability then
512
+ additionalParameters[key] = resolveCurrentAbilityDependentValue(ability, parameters[key])
513
+ else
514
+ additionalParameters[key] = parameters[key]
515
+ end
477
516
  end
478
517
  end
479
- end
480
- if (next(additionalParameters)) ~= nil then
481
- self.parameters = additionalParameters
518
+ if (next(additionalParameters)) ~= nil then
519
+ self.parameters = additionalParameters
520
+ end
482
521
  end
483
522
  end
484
523
  if duration ~= nil and duration > 0 then
@@ -487,29 +526,34 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
487
526
  self._timer = timer
488
527
  end
489
528
  self:onCreate()
529
+ self[100] = 1
530
+ Event.invoke(buffCreatedEvent, self)
490
531
  end
491
- function Buff.prototype.getUnitBonus(self, bonusType)
492
- local ____opt_36 = self._bonusIdByBonusType
493
- local bonusId = ____opt_36 and ____opt_36[bonusType]
494
- return bonusId == nil and 0 or getUnitBonus(self._unit, bonusType, bonusId)
532
+ function Buff.prototype.onAbilityGained(self, ability)
533
+ if __TS__InstanceOf(ability, UnitAbility) then
534
+ local abilityCooldownModifier = self[148]
535
+ if abilityCooldownModifier then
536
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:applyModifier(ability, abilityCooldownModifier)
537
+ end
538
+ end
495
539
  end
496
- function Buff.prototype.addOrUpdateOrRemoveUnitBonus(self, bonusType, value)
497
- local bonusIdByBonusType = self._bonusIdByBonusType
498
- if bonusIdByBonusType == nil then
499
- bonusIdByBonusType = {}
500
- self._bonusIdByBonusType = bonusIdByBonusType
540
+ function Buff.prototype.onAbilityLost(self, ability)
541
+ if __TS__InstanceOf(ability, UnitAbility) then
542
+ local abilityCooldownModifier = self[148]
543
+ if abilityCooldownModifier then
544
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, abilityCooldownModifier)
545
+ end
501
546
  end
502
- bonusIdByBonusType[bonusType] = addOrUpdateOrRemoveUnitBonus(self._unit, bonusType, bonusIdByBonusType[bonusType], value)
503
547
  end
504
548
  function Buff.prototype.flashEffect(self, widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
505
549
  if type(widgetOrXOrParametersOrDuration) == "number" and type(yOrParametersOrDuration) == "number" then
506
- Effect:flash(self[104], widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
550
+ Effect:flash(self[105], widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
507
551
  else
508
552
  local isWidgetProvided = __TS__InstanceOf(widgetOrXOrParametersOrDuration, Unit) or __TS__InstanceOf(widgetOrXOrParametersOrDuration, Item) or __TS__InstanceOf(widgetOrXOrParametersOrDuration, Destructable)
509
553
  local ____Effect_40 = Effect
510
554
  local ____Effect_flash_41 = Effect.flash
511
555
  local ____array_39 = __TS__SparseArrayNew(
512
- self[104],
556
+ self[105],
513
557
  isWidgetProvided and widgetOrXOrParametersOrDuration or self._unit,
514
558
  stringValueByBuffTypeIdByFieldId[fourCC("feft")][self.typeId] or "origin"
515
559
  )
@@ -531,7 +575,7 @@ function Buff.prototype.flashSpecialEffect(self, widgetOrDuration, duration)
531
575
  local ____Effect_44 = Effect
532
576
  local ____Effect_flash_45 = Effect.flash
533
577
  local ____array_43 = __TS__SparseArrayNew(
534
- self[105],
578
+ self[106],
535
579
  isWidgetProvided and widgetOrDuration or self._unit,
536
580
  stringValueByBuffTypeIdByFieldId[fourCC("fspt")][self.typeId] or "origin"
537
581
  )
@@ -547,23 +591,28 @@ function Buff.prototype.flashSpecialEffect(self, widgetOrDuration, duration)
547
591
  __TS__SparseArraySpread(____array_43)
548
592
  )
549
593
  end
594
+ function Buff.prototype.expire(self)
595
+ expireBuff(self)
596
+ end
550
597
  function Buff.prototype.onCreate(self)
551
598
  end
552
599
  function Buff.prototype.onDestroy(self)
600
+ check(self[100] ~= 0, "Cannot destroy a buff that has not finished creating yet.")
601
+ self[100] = 2
553
602
  local unit = self._unit
554
603
  if getUnitAbility(unit.handle, self.typeId) == self.handle then
555
604
  removeBuff(unit.handle, self.typeId)
556
605
  end
557
606
  buffByTypeIdByUnit[unit][self.typeId] = nil
558
- local healingIntervalTimer = self[118]
607
+ local healingIntervalTimer = self[119]
559
608
  if healingIntervalTimer ~= nil then
560
609
  healingIntervalTimer:destroy()
561
- self[118] = nil
610
+ self[119] = nil
562
611
  end
563
- local damageIntervalTimer = self[113]
612
+ local damageIntervalTimer = self[114]
564
613
  if damageIntervalTimer ~= nil then
565
614
  damageIntervalTimer:destroy()
566
- self[113] = nil
615
+ self[114] = nil
567
616
  end
568
617
  if self._timer ~= nil then
569
618
  self._timer:destroy()
@@ -573,25 +622,34 @@ function Buff.prototype.onDestroy(self)
573
622
  behavior:destroy()
574
623
  end
575
624
  end
576
- if self[136] then
625
+ local previousAbilityCooldownModifier = self[148]
626
+ if previousAbilityCooldownModifier then
627
+ for ____, ability in ipairs(self._unit.abilities) do
628
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, previousAbilityCooldownModifier)
629
+ end
630
+ end
631
+ if self[143] then
632
+ unit:decrementInvulnerabilityCounter()
633
+ end
634
+ if self[142] then
577
635
  unit:decrementDisableAutoAttackCounter()
578
636
  end
579
- if self[134] then
580
- if self[135] then
581
- unit:decrementStunCounter()
637
+ if self[140] then
638
+ if self[141] then
639
+ unit:decrementForceStunCounter()
582
640
  end
583
641
  unit:decrementStunCounter()
584
642
  end
643
+ if self[139] then
644
+ unit:decrementGhostCounter()
645
+ end
585
646
  if self._abilityTypeIds ~= nil then
586
- for abilityTypeId in pairs(self._abilityTypeIds) do
647
+ for ____, abilityTypeId in ipairs(self._abilityTypeIds) do
587
648
  unit:removeAbility(abilityTypeId)
588
649
  end
589
650
  end
590
- if self._bonusIdByBonusType ~= nil then
591
- for bonusType, bonusId in pairs(self._bonusIdByBonusType) do
592
- removeUnitBonus(unit, bonusType, bonusId)
593
- end
594
- end
651
+ Event.invoke(buffBeingDestroyedEvent, self)
652
+ self[100] = 3
595
653
  return UnitBehavior.prototype.onDestroy(self)
596
654
  end
597
655
  function Buff.apply(self, ...)
@@ -628,72 +686,84 @@ function Buff.getByTypeId(self, unit, typeId)
628
686
  end
629
687
  function Buff.prototype.onExpiration(self)
630
688
  local unit = self.unit
631
- if self[119] ~= nil then
632
- (self[101] or unit):damageTarget(unit, self[119] or 0)
633
- end
634
689
  if self[120] ~= nil then
635
- (self[101] or unit):healTarget(unit, self[119] or 0)
690
+ (self[102] or unit):damageTarget(unit, self[120] or 0)
636
691
  end
637
- if self[139] then
692
+ if self[121] ~= nil then
693
+ (self[102] or unit):healTarget(unit, self[120] or 0)
694
+ end
695
+ if self[145] then
638
696
  unit:explode()
639
- elseif self[138] then
697
+ elseif self[144] then
640
698
  unit:kill()
641
699
  end
642
700
  end
643
701
  function Buff.prototype.onDeath(self, source)
644
702
  local unit = self.unit
645
- if self[121] ~= nil then
703
+ if self[122] ~= nil then
646
704
  damageArea(
647
- self[101] or unit,
648
- self[121],
705
+ self[102] or unit,
706
+ self[122],
649
707
  unit.x,
650
708
  unit.y,
709
+ self[124] or 0,
651
710
  self[123] or 0,
652
- self[122] or 0,
711
+ self[126] or 0,
653
712
  self[125] or 0,
654
- self[124] or 0,
655
- self[127] or 0,
656
- self[126] or 0
713
+ self[128] or 0,
714
+ self[127] or 0
657
715
  )
658
716
  end
659
717
  end
660
718
  function Buff.prototype.onDamageDealt(self, target, event)
661
719
  if event.isAttack then
662
- if self[106] ~= nil then
663
- local durationIncrease = self[106]
664
- local maximumDuration = self[107] or 0
720
+ if self[107] ~= nil then
721
+ local durationIncrease = self[107]
722
+ local maximumDuration = self[108] or 0
665
723
  if maximumDuration > 0 then
666
724
  durationIncrease = min(
667
725
  durationIncrease,
668
- max(0, maximumDuration - self[102])
726
+ max(0, maximumDuration - self[103])
669
727
  )
670
728
  end
671
729
  local remainingDuration = self.remainingDuration + durationIncrease
672
- local maximumRemainingDuration = self[108] or 0
730
+ local maximumRemainingDuration = self[109] or 0
673
731
  if maximumRemainingDuration > 0 then
674
732
  remainingDuration = min(remainingDuration, maximumRemainingDuration)
675
733
  end
676
734
  self.remainingDuration = remainingDuration
677
735
  end
678
- local autoAttackCount = (self[128] or 0) + 1
679
- self[128] = autoAttackCount
680
- if autoAttackCount == self[129] then
736
+ local autoAttackCount = (self[129] or 0) + 1
737
+ self[129] = autoAttackCount
738
+ if autoAttackCount == self[130] then
681
739
  self:destroy()
682
740
  end
683
741
  end
684
742
  if event.originalAmount ~= 0 then
685
- local damageDealtEventCount = (self[130] or 0) + 1
686
- self[130] = damageDealtEventCount
687
- if damageDealtEventCount == self[131] then
743
+ local damageDealtEventCount = (self[131] or 0) + 1
744
+ self[131] = damageDealtEventCount
745
+ if damageDealtEventCount == self[132] then
688
746
  self:destroy()
689
747
  end
690
748
  end
691
749
  end
692
750
  function Buff.prototype.onDamageReceived(self, source, event)
693
751
  if event.originalAmount ~= 0 then
694
- local damageReceivedEventCount = (self[132] or 0) + 1
695
- self[132] = damageReceivedEventCount
696
- if damageReceivedEventCount == self[133] then
752
+ local absorbedDamage = min(event.amount * (self[135] or 1), (self[136] or 0) - (self[137] or 0))
753
+ if absorbedDamage > 0 then
754
+ event.amount = event.amount - absorbedDamage
755
+ self[137] = (self[137] or 0) + absorbedDamage
756
+ local ____self__138_48 = self[138]
757
+ if ____self__138_48 == nil then
758
+ ____self__138_48 = true
759
+ end
760
+ if ____self__138_48 and self[137] >= (self[136] or 0) then
761
+ self:destroy()
762
+ end
763
+ end
764
+ local damageReceivedEventCount = (self[133] or 0) + 1
765
+ self[133] = damageReceivedEventCount
766
+ if damageReceivedEventCount == self[134] then
697
767
  self:destroy()
698
768
  end
699
769
  end
@@ -703,7 +773,7 @@ __TS__SetDescriptor(
703
773
  Buff.prototype,
704
774
  "source",
705
775
  {get = function(self)
706
- return self[101] or self._unit
776
+ return self[102] or self._unit
707
777
  end},
708
778
  true
709
779
  )
@@ -720,13 +790,13 @@ __TS__SetDescriptor(
720
790
  "remainingDamageOverDuration",
721
791
  {
722
792
  get = function(self)
723
- return self[112] or 0
793
+ return self[113] or 0
724
794
  end,
725
795
  set = function(self, remainingDamageOverDuration)
726
- local remainingDamageOverDurationDelta = remainingDamageOverDuration - (self[112] or 0)
727
- self[112] = remainingDamageOverDuration ~= 0 and remainingDamageOverDuration or nil
728
- local damageOverDuration = (self[109] or 0) + remainingDamageOverDurationDelta
729
- self[109] = damageOverDuration ~= 0 and damageOverDuration or nil
796
+ local remainingDamageOverDurationDelta = remainingDamageOverDuration - (self[113] or 0)
797
+ self[113] = remainingDamageOverDuration ~= 0 and remainingDamageOverDuration or nil
798
+ local damageOverDuration = (self[110] or 0) + remainingDamageOverDurationDelta
799
+ self[110] = damageOverDuration ~= 0 and damageOverDuration or nil
730
800
  end
731
801
  },
732
802
  true
@@ -736,13 +806,13 @@ __TS__SetDescriptor(
736
806
  "damageOverDuration",
737
807
  {
738
808
  get = function(self)
739
- return self[109] or 0
809
+ return self[110] or 0
740
810
  end,
741
811
  set = function(self, damageOverDuration)
742
- local damageOverDurationDelta = damageOverDuration - (self[109] or 0)
743
- self[109] = damageOverDuration ~= 0 and damageOverDuration or nil
744
- local remainingDamageOverDuration = (self[112] or 0) + damageOverDurationDelta
745
- self[112] = remainingDamageOverDuration ~= 0 and remainingDamageOverDuration or nil
812
+ local damageOverDurationDelta = damageOverDuration - (self[110] or 0)
813
+ self[110] = damageOverDuration ~= 0 and damageOverDuration or nil
814
+ local remainingDamageOverDuration = (self[113] or 0) + damageOverDurationDelta
815
+ self[113] = remainingDamageOverDuration ~= 0 and remainingDamageOverDuration or nil
746
816
  end
747
817
  },
748
818
  true
@@ -752,10 +822,10 @@ __TS__SetDescriptor(
752
822
  "damagePerInterval",
753
823
  {
754
824
  get = function(self)
755
- return self[110] or 0
825
+ return self[111] or 0
756
826
  end,
757
827
  set = function(self, damagePerInterval)
758
- self[110] = damagePerInterval ~= 0 and damagePerInterval or nil
828
+ self[111] = damagePerInterval ~= 0 and damagePerInterval or nil
759
829
  end
760
830
  },
761
831
  true
@@ -765,25 +835,25 @@ __TS__SetDescriptor(
765
835
  "damageInterval",
766
836
  {
767
837
  get = function(self)
768
- return self[111] or 0
838
+ return self[112] or 0
769
839
  end,
770
840
  set = function(self, damageInterval)
771
841
  if damageInterval <= 0 then
772
- self[111] = damageInterval ~= 0 and damageInterval or nil
773
- local timer = self[113]
842
+ self[112] = damageInterval ~= 0 and damageInterval or nil
843
+ local timer = self[114]
774
844
  if timer ~= nil then
775
845
  timer:destroy()
776
- self[113] = nil
846
+ self[114] = nil
777
847
  end
778
848
  return
779
849
  end
780
- self[111] = damageInterval
781
- local ____opt_48 = self._timer
782
- local elapsed = ____opt_48 and ____opt_48.elapsed or 0
783
- local timer = self[113]
850
+ self[112] = damageInterval
851
+ local ____opt_49 = self._timer
852
+ local elapsed = ____opt_49 and ____opt_49.elapsed or 0
853
+ local timer = self[114]
784
854
  if timer == nil then
785
855
  timer = Timer:create()
786
- self[113] = timer
856
+ self[114] = timer
787
857
  end
788
858
  local initialDelay = damageInterval - (elapsed >= damageInterval and math.fmod(elapsed, damageInterval) or elapsed)
789
859
  if initialDelay == damageInterval then
@@ -800,13 +870,13 @@ __TS__SetDescriptor(
800
870
  "remainingHealingOverDuration",
801
871
  {
802
872
  get = function(self)
803
- return self[117] or 0
873
+ return self[118] or 0
804
874
  end,
805
875
  set = function(self, remainingHealingOverDuration)
806
- local remainingHealingOverDurationDelta = remainingHealingOverDuration - (self[117] or 0)
807
- self[112] = remainingHealingOverDuration ~= 0 and remainingHealingOverDuration or nil
808
- local healingOverDuration = (self[114] or 0) + remainingHealingOverDurationDelta
809
- self[114] = healingOverDuration ~= 0 and healingOverDuration or nil
876
+ local remainingHealingOverDurationDelta = remainingHealingOverDuration - (self[118] or 0)
877
+ self[113] = remainingHealingOverDuration ~= 0 and remainingHealingOverDuration or nil
878
+ local healingOverDuration = (self[115] or 0) + remainingHealingOverDurationDelta
879
+ self[115] = healingOverDuration ~= 0 and healingOverDuration or nil
810
880
  end
811
881
  },
812
882
  true
@@ -816,13 +886,13 @@ __TS__SetDescriptor(
816
886
  "healingOverDuration",
817
887
  {
818
888
  get = function(self)
819
- return self[114] or 0
889
+ return self[115] or 0
820
890
  end,
821
891
  set = function(self, healingOverDuration)
822
- local healingOverDurationDelta = healingOverDuration - (self[114] or 0)
823
- self[114] = healingOverDuration ~= 0 and healingOverDuration or nil
824
- local remainingHealingOverDuration = (self[117] or 0) + healingOverDurationDelta
825
- self[117] = remainingHealingOverDuration ~= 0 and remainingHealingOverDuration or nil
892
+ local healingOverDurationDelta = healingOverDuration - (self[115] or 0)
893
+ self[115] = healingOverDuration ~= 0 and healingOverDuration or nil
894
+ local remainingHealingOverDuration = (self[118] or 0) + healingOverDurationDelta
895
+ self[118] = remainingHealingOverDuration ~= 0 and remainingHealingOverDuration or nil
826
896
  end
827
897
  },
828
898
  true
@@ -832,10 +902,10 @@ __TS__SetDescriptor(
832
902
  "healingPerInterval",
833
903
  {
834
904
  get = function(self)
835
- return self[115] or 0
905
+ return self[116] or 0
836
906
  end,
837
907
  set = function(self, healingPerInterval)
838
- self[115] = healingPerInterval ~= 0 and healingPerInterval or nil
908
+ self[116] = healingPerInterval ~= 0 and healingPerInterval or nil
839
909
  end
840
910
  },
841
911
  true
@@ -845,25 +915,25 @@ __TS__SetDescriptor(
845
915
  "healingInterval",
846
916
  {
847
917
  get = function(self)
848
- return self[116] or 0
918
+ return self[117] or 0
849
919
  end,
850
920
  set = function(self, healingInterval)
851
921
  if healingInterval <= 0 then
852
- self[116] = healingInterval ~= 0 and healingInterval or nil
853
- local timer = self[118]
922
+ self[117] = healingInterval ~= 0 and healingInterval or nil
923
+ local timer = self[119]
854
924
  if timer ~= nil then
855
925
  timer:destroy()
856
- self[118] = nil
926
+ self[119] = nil
857
927
  end
858
928
  return
859
929
  end
860
- self[116] = healingInterval
861
- local ____opt_50 = self._timer
862
- local elapsed = ____opt_50 and ____opt_50.elapsed or 0
863
- local timer = self[118]
930
+ self[117] = healingInterval
931
+ local ____opt_51 = self._timer
932
+ local elapsed = ____opt_51 and ____opt_51.elapsed or 0
933
+ local timer = self[119]
864
934
  if timer == nil then
865
935
  timer = Timer:create()
866
- self[118] = timer
936
+ self[119] = timer
867
937
  end
868
938
  local initialDelay = healingInterval - (elapsed >= healingInterval and math.fmod(elapsed, healingInterval) or elapsed)
869
939
  if initialDelay == healingInterval then
@@ -880,10 +950,10 @@ __TS__SetDescriptor(
880
950
  "damageOnExpiration",
881
951
  {
882
952
  get = function(self)
883
- return self[119] or 0
953
+ return self[120] or 0
884
954
  end,
885
955
  set = function(self, damageOnExpiration)
886
- self[119] = damageOnExpiration ~= 0 and damageOnExpiration or nil
956
+ self[120] = damageOnExpiration ~= 0 and damageOnExpiration or nil
887
957
  end
888
958
  },
889
959
  true
@@ -893,10 +963,10 @@ __TS__SetDescriptor(
893
963
  "healingOnExpiration",
894
964
  {
895
965
  get = function(self)
896
- return self[120] or 0
966
+ return self[121] or 0
897
967
  end,
898
968
  set = function(self, healingOnExpiration)
899
- self[120] = healingOnExpiration ~= 0 and healingOnExpiration or nil
969
+ self[121] = healingOnExpiration ~= 0 and healingOnExpiration or nil
900
970
  end
901
971
  },
902
972
  true
@@ -940,30 +1010,53 @@ __TS__SetDescriptor(
940
1010
  },
941
1011
  true
942
1012
  )
1013
+ __TS__SetDescriptor(
1014
+ Buff.prototype,
1015
+ "turnsIntoGhost",
1016
+ {
1017
+ get = function(self)
1018
+ local ____self__139_53 = self[139]
1019
+ if ____self__139_53 == nil then
1020
+ ____self__139_53 = false
1021
+ end
1022
+ return ____self__139_53
1023
+ end,
1024
+ set = function(self, turnsIntoGhost)
1025
+ if not turnsIntoGhost and self[139] then
1026
+ self.object:decrementGhostCounter()
1027
+ self[139] = nil
1028
+ elseif turnsIntoGhost and not self[139] then
1029
+ self.object:incrementGhostCounter()
1030
+ self[139] = true
1031
+ end
1032
+ end
1033
+ },
1034
+ true
1035
+ )
943
1036
  __TS__SetDescriptor(
944
1037
  Buff.prototype,
945
1038
  "stuns",
946
1039
  {
947
1040
  get = function(self)
948
- local ____self__134_52 = self[134]
949
- if ____self__134_52 == nil then
950
- ____self__134_52 = false
1041
+ local ____self__140_54 = self[140]
1042
+ if ____self__140_54 == nil then
1043
+ ____self__140_54 = false
951
1044
  end
952
- return ____self__134_52
1045
+ return ____self__140_54
953
1046
  end,
954
1047
  set = function(self, stuns)
955
- if not stuns and self[134] then
956
- if self[135] then
957
- self.object:decrementStunCounter()
1048
+ if not stuns and self[140] then
1049
+ if self[141] then
1050
+ self.object:decrementForceStunCounter()
958
1051
  end
959
1052
  self.object:decrementStunCounter()
960
- self[134] = nil
961
- elseif stuns and not self[134] then
962
- if self[135] then
963
- self.object:incrementStunCounter()
1053
+ self[140] = nil
1054
+ elseif stuns and not self[140] then
1055
+ if self[141] then
1056
+ self.object:incrementForceStunCounter()
964
1057
  end
965
1058
  self.object:incrementStunCounter()
966
- self[134] = true
1059
+ self[140] = true
967
1060
  end
968
1061
  end
969
1062
  },
@@ -974,23 +1067,23 @@ __TS__SetDescriptor(
974
1067
  "ignoresStunImmunity",
975
1068
  {
976
1069
  get = function(self)
977
- local ____self__135_53 = self[135]
978
- if ____self__135_53 == nil then
979
- ____self__135_53 = false
1070
+ local ____self__141_55 = self[141]
1071
+ if ____self__141_55 == nil then
1072
+ ____self__141_55 = false
980
1073
  end
981
- return ____self__135_53
1074
+ return ____self__141_55
982
1075
  end,
983
1076
  set = function(self, ignoresStunImmunity)
984
- if not ignoresStunImmunity and self[135] then
985
- if self[134] then
986
- self.object:decrementStunCounter()
1077
+ if not ignoresStunImmunity and self[141] then
1078
+ if self[140] then
1079
+ self.object:decrementForceStunCounter()
987
1080
  end
988
- self[135] = nil
989
- elseif ignoresStunImmunity and not self[135] then
990
- if self[134] then
991
- self.object:incrementStunCounter()
1081
+ self[141] = nil
1082
+ elseif ignoresStunImmunity and not self[141] then
1083
+ if self[140] then
1084
+ self.object:incrementForceStunCounter()
992
1085
  end
993
- self[135] = true
1086
+ self[141] = true
994
1087
  end
995
1088
  end
996
1089
  },
@@ -1001,19 +1094,19 @@ __TS__SetDescriptor(
1001
1094
  "disablesAutoAttack",
1002
1095
  {
1003
1096
  get = function(self)
1004
- local ____self__136_54 = self[136]
1005
- if ____self__136_54 == nil then
1006
- ____self__136_54 = false
1097
+ local ____self__142_56 = self[142]
1098
+ if ____self__142_56 == nil then
1099
+ ____self__142_56 = false
1007
1100
  end
1008
- return ____self__136_54
1101
+ return ____self__142_56
1009
1102
  end,
1010
1103
  set = function(self, disablesAutoAttack)
1011
- if not disablesAutoAttack and self[136] then
1104
+ if not disablesAutoAttack and self[142] then
1012
1105
  self.object:decrementDisableAutoAttackCounter()
1013
- self[136] = nil
1014
- elseif disablesAutoAttack and not self[136] then
1106
+ self[142] = nil
1107
+ elseif disablesAutoAttack and not self[142] then
1015
1108
  self.object:incrementDisableAutoAttackCounter()
1016
- self[136] = true
1109
+ self[142] = true
1017
1110
  end
1018
1111
  end
1019
1112
  },
@@ -1024,19 +1117,19 @@ __TS__SetDescriptor(
1024
1117
  "providesInvulnerability",
1025
1118
  {
1026
1119
  get = function(self)
1027
- local ____self__137_55 = self[137]
1028
- if ____self__137_55 == nil then
1029
- ____self__137_55 = false
1120
+ local ____self__143_57 = self[143]
1121
+ if ____self__143_57 == nil then
1122
+ ____self__143_57 = false
1030
1123
  end
1031
- return ____self__137_55
1124
+ return ____self__143_57
1032
1125
  end,
1033
1126
  set = function(self, providesInvulnerability)
1034
- if not providesInvulnerability and self[137] then
1127
+ if not providesInvulnerability and self[143] then
1035
1128
  self.object:decrementInvulnerabilityCounter()
1036
- self[137] = nil
1037
- elseif providesInvulnerability and not self[137] then
1129
+ self[143] = nil
1130
+ elseif providesInvulnerability and not self[143] then
1038
1131
  self.object:incrementInvulnerabilityCounter()
1039
- self[137] = true
1132
+ self[143] = true
1040
1133
  end
1041
1134
  end
1042
1135
  },
@@ -1047,17 +1140,17 @@ __TS__SetDescriptor(
1047
1140
  "killsOnExpiration",
1048
1141
  {
1049
1142
  get = function(self)
1050
- local ____self__138_56 = self[138]
1051
- if ____self__138_56 == nil then
1052
- ____self__138_56 = false
1143
+ local ____self__144_58 = self[144]
1144
+ if ____self__144_58 == nil then
1145
+ ____self__144_58 = false
1053
1146
  end
1054
- return ____self__138_56
1147
+ return ____self__144_58
1055
1148
  end,
1056
1149
  set = function(self, killsOnExpiration)
1057
- if not killsOnExpiration and self[138] then
1058
- self[138] = nil
1059
- elseif killsOnExpiration and not self[138] then
1060
- self[138] = true
1150
+ if not killsOnExpiration and self[144] then
1151
+ self[144] = nil
1152
+ elseif killsOnExpiration and not self[144] then
1153
+ self[144] = true
1061
1154
  end
1062
1155
  end
1063
1156
  },
@@ -1068,17 +1161,17 @@ __TS__SetDescriptor(
1068
1161
  "explodesOnExpiration",
1069
1162
  {
1070
1163
  get = function(self)
1071
- local ____self__139_57 = self[139]
1072
- if ____self__139_57 == nil then
1073
- ____self__139_57 = false
1164
+ local ____self__145_59 = self[145]
1165
+ if ____self__145_59 == nil then
1166
+ ____self__145_59 = false
1074
1167
  end
1075
- return ____self__139_57
1168
+ return ____self__145_59
1076
1169
  end,
1077
1170
  set = function(self, killsOnExpiration)
1078
- if not killsOnExpiration and self[139] then
1079
- self[139] = nil
1080
- elseif killsOnExpiration and not self[139] then
1081
- self[139] = true
1171
+ if not killsOnExpiration and self[145] then
1172
+ self[145] = nil
1173
+ elseif killsOnExpiration and not self[145] then
1174
+ self[145] = true
1082
1175
  end
1083
1176
  end
1084
1177
  },
@@ -1089,13 +1182,13 @@ __TS__SetDescriptor(
1089
1182
  "maximumDamageDealtEventCount",
1090
1183
  {
1091
1184
  get = function(self)
1092
- return self[131] or 0
1185
+ return self[132] or 0
1093
1186
  end,
1094
1187
  set = function(self, maximumDamageDealtEventCount)
1095
1188
  if maximumDamageDealtEventCount == 0 then
1096
- self[131] = nil
1189
+ self[132] = nil
1097
1190
  else
1098
- self[131] = maximumDamageDealtEventCount
1191
+ self[132] = maximumDamageDealtEventCount
1099
1192
  end
1100
1193
  end
1101
1194
  },
@@ -1106,13 +1199,13 @@ __TS__SetDescriptor(
1106
1199
  "maximumDamageReceivedEventCount",
1107
1200
  {
1108
1201
  get = function(self)
1109
- return self[133] or 0
1202
+ return self[134] or 0
1110
1203
  end,
1111
1204
  set = function(self, maximumDamageReceivedEventCount)
1112
1205
  if maximumDamageReceivedEventCount == 0 then
1113
- self[133] = nil
1206
+ self[134] = nil
1114
1207
  else
1115
- self[133] = maximumDamageReceivedEventCount
1208
+ self[134] = maximumDamageReceivedEventCount
1116
1209
  end
1117
1210
  end
1118
1211
  },
@@ -1123,13 +1216,13 @@ __TS__SetDescriptor(
1123
1216
  "maximumAutoAttackCount",
1124
1217
  {
1125
1218
  get = function(self)
1126
- return self[129] or 0
1219
+ return self[130] or 0
1127
1220
  end,
1128
1221
  set = function(self, maximumAutoAttackCount)
1129
1222
  if maximumAutoAttackCount == 0 then
1130
- self[129] = nil
1223
+ self[130] = nil
1131
1224
  else
1132
- self[129] = maximumAutoAttackCount
1225
+ self[130] = maximumAutoAttackCount
1133
1226
  end
1134
1227
  end
1135
1228
  },
@@ -1140,10 +1233,10 @@ __TS__SetDescriptor(
1140
1233
  "durationIncreaseOnAutoAttack",
1141
1234
  {
1142
1235
  get = function(self)
1143
- return self[106] or 0
1236
+ return self[107] or 0
1144
1237
  end,
1145
1238
  set = function(self, durationIncreaseOnAutoAttack)
1146
- self[106] = durationIncreaseOnAutoAttack
1239
+ self[107] = durationIncreaseOnAutoAttack
1147
1240
  end
1148
1241
  },
1149
1242
  true
@@ -1174,12 +1267,52 @@ __TS__SetDescriptor(
1174
1267
  },
1175
1268
  true
1176
1269
  )
1270
+ __TS__SetDescriptor(
1271
+ Buff.prototype,
1272
+ "evasionProbability",
1273
+ {
1274
+ get = function(self)
1275
+ return self:getUnitBonus(UnitBonusType.EVASION_PROBABILITY)
1276
+ end,
1277
+ set = function(self, evasionProbability)
1278
+ self:addOrUpdateOrRemoveUnitBonus(UnitBonusType.EVASION_PROBABILITY, evasionProbability)
1279
+ end
1280
+ },
1281
+ true
1282
+ )
1283
+ __TS__SetDescriptor(
1284
+ Buff.prototype,
1285
+ "manaRegenerationRateIncreaseFactor",
1286
+ {
1287
+ get = function(self)
1288
+ return self:getUnitBonus(UnitBonusType.MANA_REGENERATION_RATE_FACTOR)
1289
+ end,
1290
+ set = function(self, manaRegenerationRateIncreaseFactor)
1291
+ self:addOrUpdateOrRemoveUnitBonus(UnitBonusType.MANA_REGENERATION_RATE_FACTOR, manaRegenerationRateIncreaseFactor)
1292
+ end
1293
+ },
1294
+ true
1295
+ )
1177
1296
  __TS__SetDescriptor(
1178
1297
  Buff.prototype,
1179
1298
  "duration",
1180
- {get = function(self)
1181
- return self[102]
1182
- end},
1299
+ {
1300
+ get = function(self)
1301
+ return self[103]
1302
+ end,
1303
+ set = function(self, duration)
1304
+ if duration <= 0 then
1305
+ local timer = self._timer
1306
+ if timer ~= nil then
1307
+ timer:destroy()
1308
+ self._timer = nil
1309
+ end
1310
+ self[103] = 0
1311
+ else
1312
+ self.remainingDuration = self.remainingDuration + (duration - self[103])
1313
+ end
1314
+ end
1315
+ },
1183
1316
  true
1184
1317
  )
1185
1318
  __TS__SetDescriptor(
@@ -1187,15 +1320,15 @@ __TS__SetDescriptor(
1187
1320
  "remainingDuration",
1188
1321
  {
1189
1322
  get = function(self)
1190
- local ____opt_58 = self._timer
1191
- return ____opt_58 and ____opt_58.remaining or 0
1323
+ local ____opt_60 = self._timer
1324
+ return ____opt_60 and ____opt_60.remaining or 0
1192
1325
  end,
1193
1326
  set = function(self, remainingDuration)
1194
- local ____remainingDuration_62 = remainingDuration
1195
- local ____opt_60 = self._timer
1196
- local remainingDurationDelta = ____remainingDuration_62 - (____opt_60 and ____opt_60.remaining or 0)
1327
+ local ____remainingDuration_64 = remainingDuration
1328
+ local ____opt_62 = self._timer
1329
+ local remainingDurationDelta = ____remainingDuration_64 - (____opt_62 and ____opt_62.remaining or 0)
1197
1330
  if remainingDurationDelta ~= 0 then
1198
- self[102] = self[102] + remainingDurationDelta
1331
+ self[103] = self[103] + remainingDurationDelta
1199
1332
  if remainingDuration <= 0 then
1200
1333
  Timer:run(destroyBuff, self)
1201
1334
  else
@@ -1207,7 +1340,8 @@ __TS__SetDescriptor(
1207
1340
  self._level,
1208
1341
  remainingDuration,
1209
1342
  self._spellStealPriority,
1210
- self._learnLevelMinimum
1343
+ self._learnLevelMinimum,
1344
+ self[146]
1211
1345
  ) then
1212
1346
  local timer = self._timer
1213
1347
  if timer == nil then
@@ -1221,10 +1355,103 @@ __TS__SetDescriptor(
1221
1355
  end
1222
1356
  },
1223
1357
  true
1224
- );
1358
+ )
1359
+ __TS__SetDescriptor(
1360
+ Buff.prototype,
1361
+ "absorbedDamageFactor",
1362
+ {
1363
+ get = function(self)
1364
+ return self[135] or 1
1365
+ end,
1366
+ set = function(self, absorbedDamageFactor)
1367
+ if absorbedDamageFactor == 1 then
1368
+ self[135] = nil
1369
+ else
1370
+ self[135] = absorbedDamageFactor
1371
+ end
1372
+ end
1373
+ },
1374
+ true
1375
+ )
1376
+ __TS__SetDescriptor(
1377
+ Buff.prototype,
1378
+ "maximumDamageAbsorbed",
1379
+ {
1380
+ get = function(self)
1381
+ return self[136] or 0
1382
+ end,
1383
+ set = function(self, maximumDamageAbsorbed)
1384
+ if maximumDamageAbsorbed == 0 then
1385
+ self[136] = nil
1386
+ else
1387
+ self[136] = maximumDamageAbsorbed
1388
+ end
1389
+ end
1390
+ },
1391
+ true
1392
+ )
1393
+ __TS__SetDescriptor(
1394
+ Buff.prototype,
1395
+ "damageAbsorbed",
1396
+ {get = function(self)
1397
+ return self[137] or 0
1398
+ end},
1399
+ true
1400
+ )
1401
+ __TS__SetDescriptor(
1402
+ Buff.prototype,
1403
+ "destroysOnMaximumDamageAbsorbed",
1404
+ {
1405
+ get = function(self)
1406
+ local ____self__138_65 = self[138]
1407
+ if ____self__138_65 == nil then
1408
+ ____self__138_65 = true
1409
+ end
1410
+ return ____self__138_65
1411
+ end,
1412
+ set = function(self, destroysOnMaximumDamageAbsorbed)
1413
+ local ____destroysOnMaximumDamageAbsorbed_66
1414
+ if destroysOnMaximumDamageAbsorbed then
1415
+ ____destroysOnMaximumDamageAbsorbed_66 = nil
1416
+ else
1417
+ ____destroysOnMaximumDamageAbsorbed_66 = false
1418
+ end
1419
+ self[138] = ____destroysOnMaximumDamageAbsorbed_66
1420
+ end
1421
+ },
1422
+ true
1423
+ )
1424
+ __TS__SetDescriptor(
1425
+ Buff.prototype,
1426
+ "abilityCooldownFactor",
1427
+ {
1428
+ get = function(self)
1429
+ return self[147] or 1
1430
+ end,
1431
+ set = function(self, abilityCooldownFactor)
1432
+ local previousAbilityCooldownModifier = self[148]
1433
+ if previousAbilityCooldownModifier then
1434
+ for ____, ability in ipairs(self._unit.abilities) do
1435
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, previousAbilityCooldownModifier)
1436
+ end
1437
+ end
1438
+ local function modifier(ability, level, cooldown)
1439
+ return cooldown * abilityCooldownFactor
1440
+ end
1441
+ for ____, ability in ipairs(self._unit.abilities) do
1442
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:applyModifier(ability, modifier)
1443
+ end
1444
+ self[148] = modifier
1445
+ self[147] = abilityCooldownFactor
1446
+ end
1447
+ },
1448
+ true
1449
+ )
1450
+ Buff.createdEvent = buffCreatedEvent
1451
+ Buff.beingDestroyedEvent = buffBeingDestroyedEvent;
1225
1452
  (function(self)
1226
1453
  local function destroyBuffIfNeeded(buff)
1227
- if getUnitAbility(buff[100].handle, buff.typeId) ~= buff.handle then
1454
+ if getUnitAbility(buff[101].handle, buff.typeId) ~= buff.handle and buff[100] == 1 then
1228
1455
  buff:destroy()
1229
1456
  end
1230
1457
  end
@@ -1275,5 +1502,11 @@ __TS__SetDescriptor(
1275
1502
  ____exports.checkBuffs(target)
1276
1503
  end
1277
1504
  )
1505
+ buffCreatedEvent:addListener(function(buff)
1506
+ UnitBehavior:forAll(buff.unit, "onBuffGained", buff)
1507
+ end)
1508
+ buffBeingDestroyedEvent:addListener(function(buff)
1509
+ UnitBehavior:forAll(buff.unit, "onBuffLost", buff)
1510
+ end)
1278
1511
  end)(Buff)
1279
1512
  return ____exports