warscript 0.0.1-dev.d63794c → 0.0.1-dev.d6e2c10

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 (195) 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 +12 -1
  23. package/engine/behavior.lua +172 -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 +22 -8
  31. package/engine/behaviour/ability/on-command-impact.lua +7 -0
  32. package/engine/behaviour/ability/remove-buffs.d.ts +9 -0
  33. package/engine/behaviour/ability/remove-buffs.lua +21 -0
  34. package/engine/behaviour/ability/restore-mana.d.ts +1 -1
  35. package/engine/behaviour/ability/restore-mana.lua +6 -6
  36. package/engine/behaviour/ability.d.ts +14 -4
  37. package/engine/behaviour/ability.lua +76 -25
  38. package/engine/behaviour/unit/stun-immunity.d.ts +11 -5
  39. package/engine/behaviour/unit/stun-immunity.lua +53 -28
  40. package/engine/behaviour/unit.d.ts +40 -2
  41. package/engine/behaviour/unit.lua +259 -6
  42. package/engine/buff.d.ts +67 -44
  43. package/engine/buff.lua +347 -232
  44. package/engine/internal/ability.d.ts +7 -1
  45. package/engine/internal/ability.lua +66 -33
  46. package/engine/internal/item/ability.lua +136 -10
  47. package/engine/internal/item+owner.lua +12 -6
  48. package/engine/internal/item.d.ts +20 -19
  49. package/engine/internal/item.lua +191 -74
  50. package/engine/internal/mechanics/ability-duration.lua +1 -1
  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/unit/ability.d.ts +35 -0
  64. package/engine/internal/unit/ability.lua +98 -9
  65. package/engine/internal/unit/add-item-to-slot-init.d.ts +2 -0
  66. package/engine/internal/unit/add-item-to-slot-init.lua +23 -0
  67. package/engine/internal/unit/add-item-to-slot.d.ts +2 -0
  68. package/engine/internal/unit/add-item-to-slot.lua +52 -0
  69. package/engine/internal/unit/allowed-targets.d.ts +1 -1
  70. package/engine/internal/unit/allowed-targets.lua +9 -1
  71. package/engine/internal/unit/bonus.d.ts +2 -0
  72. package/engine/internal/unit/bonus.lua +17 -0
  73. package/engine/internal/unit/fly-height.d.ts +7 -0
  74. package/engine/internal/unit/fly-height.lua +20 -0
  75. package/engine/internal/unit/ignore-events-items.d.ts +2 -0
  76. package/engine/internal/unit/ignore-events-items.lua +5 -0
  77. package/engine/internal/unit/item.lua +3 -4
  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/scale.d.ts +7 -0
  82. package/engine/internal/unit/scale.lua +20 -0
  83. package/engine/internal/unit+ability.lua +10 -1
  84. package/engine/internal/unit+damage.d.ts +2 -11
  85. package/engine/internal/unit+damage.lua +10 -14
  86. package/engine/internal/unit+spellSteal.lua +1 -2
  87. package/engine/internal/unit-missile-launch.lua +45 -14
  88. package/engine/internal/unit.d.ts +43 -17
  89. package/engine/internal/unit.lua +368 -173
  90. package/engine/lightning.d.ts +12 -5
  91. package/engine/lightning.lua +48 -14
  92. package/engine/local-client.d.ts +2 -0
  93. package/engine/local-client.lua +30 -0
  94. package/engine/object-data/auxiliary/animation-name.d.ts +1 -0
  95. package/engine/object-data/auxiliary/animation-name.lua +16 -0
  96. package/engine/object-data/auxiliary/armor-type.d.ts +11 -0
  97. package/engine/object-data/auxiliary/armor-type.lua +46 -0
  98. package/engine/object-data/auxiliary/attachment-preset.d.ts +7 -2
  99. package/engine/object-data/auxiliary/attachment-preset.lua +4 -3
  100. package/engine/object-data/auxiliary/attack-type.d.ts +7 -8
  101. package/engine/object-data/auxiliary/attack-type.lua +42 -0
  102. package/engine/object-data/auxiliary/movement-type.d.ts +7 -7
  103. package/engine/object-data/auxiliary/movement-type.lua +22 -0
  104. package/engine/object-data/auxiliary/sound-eax.d.ts +10 -0
  105. package/engine/object-data/auxiliary/sound-eax.lua +2 -0
  106. package/engine/object-data/auxiliary/tech-tree-dependency.d.ts +1 -1
  107. package/engine/object-data/auxiliary/unit-attribute.d.ts +6 -0
  108. package/engine/object-data/auxiliary/unit-attribute.lua +9 -0
  109. package/engine/object-data/entry/ability-type/berserk.d.ts +2 -0
  110. package/engine/object-data/entry/ability-type/berserk.lua +13 -0
  111. package/engine/object-data/entry/ability-type/blank-configurable.lua +12 -1
  112. package/engine/object-data/entry/ability-type/carrion-swarm.d.ts +14 -0
  113. package/engine/object-data/entry/ability-type/carrion-swarm.lua +65 -0
  114. package/engine/object-data/entry/ability-type/disease-cloud.lua +2 -2
  115. package/engine/object-data/entry/ability-type/engineering-upgrade.lua +2 -2
  116. package/engine/object-data/entry/ability-type/ensnare.d.ts +12 -0
  117. package/engine/object-data/entry/ability-type/ensnare.lua +52 -0
  118. package/engine/object-data/entry/ability-type/feral-spirit.lua +2 -2
  119. package/engine/object-data/entry/ability-type/permanent-invisibility.d.ts +8 -0
  120. package/engine/object-data/entry/ability-type/permanent-invisibility.lua +26 -0
  121. package/engine/object-data/entry/ability-type/phase-shift.d.ts +10 -0
  122. package/engine/object-data/entry/ability-type/phase-shift.lua +39 -0
  123. package/engine/object-data/entry/ability-type/phoenix-morph.lua +4 -4
  124. package/engine/object-data/entry/ability-type/raise-dead.d.ts +17 -0
  125. package/engine/object-data/entry/ability-type/raise-dead.lua +78 -0
  126. package/engine/object-data/entry/ability-type/shock-wave.d.ts +4 -0
  127. package/engine/object-data/entry/ability-type/shock-wave.lua +26 -0
  128. package/engine/object-data/entry/ability-type/slow-poison.d.ts +10 -0
  129. package/engine/object-data/entry/ability-type/slow-poison.lua +58 -0
  130. package/engine/object-data/entry/ability-type/summon-quilbeast.lua +2 -2
  131. package/engine/object-data/entry/ability-type/summon-water-elemental.lua +2 -2
  132. package/engine/object-data/entry/ability-type/web.d.ts +12 -0
  133. package/engine/object-data/entry/ability-type/web.lua +52 -0
  134. package/engine/object-data/entry/ability-type.d.ts +19 -17
  135. package/engine/object-data/entry/ability-type.lua +93 -36
  136. package/engine/object-data/entry/buff-type/applicable.lua +18 -37
  137. package/engine/object-data/entry/buff-type.d.ts +6 -12
  138. package/engine/object-data/entry/buff-type.lua +13 -29
  139. package/engine/object-data/entry/destructible-type.d.ts +18 -2
  140. package/engine/object-data/entry/destructible-type.lua +90 -0
  141. package/engine/object-data/entry/item-type.d.ts +3 -1
  142. package/engine/object-data/entry/item-type.lua +15 -2
  143. package/engine/object-data/entry/lightning-type.d.ts +1 -1
  144. package/engine/object-data/entry/sound-preset.d.ts +33 -0
  145. package/engine/object-data/entry/sound-preset.lua +140 -0
  146. package/engine/object-data/entry/unit-type.d.ts +25 -5
  147. package/engine/object-data/entry/unit-type.lua +258 -93
  148. package/engine/object-data/entry/upgrade.d.ts +1 -1
  149. package/engine/object-data/entry/upgrade.lua +4 -4
  150. package/engine/object-data/entry.d.ts +16 -14
  151. package/engine/object-data/entry.lua +60 -32
  152. package/engine/object-data/utility/object-data-entry-id-generator.lua +7 -0
  153. package/engine/object-field/ability.d.ts +8 -5
  154. package/engine/object-field/ability.lua +8 -4
  155. package/engine/object-field/unit.d.ts +69 -3
  156. package/engine/object-field/unit.lua +264 -7
  157. package/engine/object-field.d.ts +23 -6
  158. package/engine/object-field.lua +311 -124
  159. package/engine/random.d.ts +9 -0
  160. package/engine/random.lua +13 -0
  161. package/engine/standard/entries/buff-type.d.ts +3 -0
  162. package/engine/standard/entries/buff-type.lua +3 -0
  163. package/engine/standard/entries/sound-preset.d.ts +10 -0
  164. package/engine/standard/entries/sound-preset.lua +10 -0
  165. package/engine/standard/fields/ability.d.ts +2 -2
  166. package/engine/standard/fields/ability.lua +2 -2
  167. package/engine/standard/fields/unit.d.ts +6 -0
  168. package/engine/standard/fields/unit.lua +11 -0
  169. package/engine/synchronization.d.ts +11 -0
  170. package/engine/synchronization.lua +77 -0
  171. package/engine/text-tag.d.ts +36 -2
  172. package/engine/text-tag.lua +250 -10
  173. package/engine/unit.d.ts +4 -0
  174. package/engine/unit.lua +4 -0
  175. package/net/socket.lua +1 -1
  176. package/objutil/buff.lua +2 -3
  177. package/objutil/unit.lua +8 -0
  178. package/package.json +2 -2
  179. package/patch-lualib.lua +1 -1
  180. package/utility/arrays.d.ts +2 -0
  181. package/utility/arrays.lua +11 -0
  182. package/utility/callback-array.d.ts +17 -0
  183. package/utility/callback-array.lua +61 -0
  184. package/utility/functions.d.ts +8 -0
  185. package/utility/functions.lua +13 -0
  186. package/utility/linked-set.d.ts +2 -0
  187. package/utility/linked-set.lua +22 -1
  188. package/utility/lua-maps.d.ts +15 -2
  189. package/utility/lua-maps.lua +53 -2
  190. package/utility/lua-sets.d.ts +2 -0
  191. package/utility/lua-sets.lua +7 -0
  192. package/utility/reflection.lua +11 -7
  193. package/utility/types.d.ts +3 -0
  194. package/core/types/order.d.ts +0 -25
  195. 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
@@ -44,12 +43,18 @@ local ____unit = require("engine.behaviour.unit")
44
43
  local UnitBehavior = ____unit.UnitBehavior
45
44
  local ____arrays = require("utility.arrays")
46
45
  local forEach = ____arrays.forEach
46
+ local ____event = require("event")
47
+ local Event = ____event.Event
47
48
  local ____ability_2Dduration = require("engine.internal.mechanics.ability-duration")
48
49
  local getAbilityDuration = ____ability_2Dduration.getAbilityDuration
49
50
  local ____item = require("engine.internal.item")
50
51
  local Item = ____item.Item
51
52
  local ____destructable = require("core.types.destructable")
52
53
  local Destructable = ____destructable.Destructable
54
+ local ____ability = require("engine.standard.fields.ability")
55
+ local COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD = ____ability.COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD
56
+ local ____ability = require("engine.behaviour.ability")
57
+ local AbilityBehavior = ____ability.AbilityBehavior
53
58
  local getUnitAbility = BlzGetUnitAbility
54
59
  local stringValueByBuffTypeIdByFieldId = postcompile(function()
55
60
  local stringValueByBuffTypeIdByFieldId = {}
@@ -98,12 +103,15 @@ local buffParametersKeys = {
98
103
  armorIncreaseFactor = true,
99
104
  attackSpeedIncreaseFactor = true,
100
105
  movementSpeedIncreaseFactor = true,
106
+ evasionProbability = true,
107
+ missProbability = true,
101
108
  damageFactor = true,
102
109
  receivedDamageFactor = true,
103
110
  receivedMagicDamageFactor = true,
104
111
  durationIncreaseOnAutoAttack = true,
105
112
  maximumDuration = true,
106
113
  maximumRemainingDuration = true,
114
+ turnsIntoGhost = true,
107
115
  stuns = true,
108
116
  ignoresStunImmunity = true,
109
117
  providesStunImmunity = true,
@@ -118,7 +126,8 @@ local buffParametersKeys = {
118
126
  damageOnExpiration = true,
119
127
  healingOnExpiration = true,
120
128
  killsOnExpiration = true,
121
- explodesOnExpiration = true
129
+ explodesOnExpiration = true,
130
+ abilityCooldownFactor = true
122
131
  }
123
132
  local function resolveEnumValue(ability, level, value)
124
133
  if value == nil or type(value) == "number" then
@@ -169,6 +178,7 @@ local function resolveAndSetNumberValue(buff, property, ability, level, value, d
169
178
  end
170
179
  end
171
180
  local buffBooleanParameters = {
181
+ "turnsIntoGhost",
172
182
  "stuns",
173
183
  "ignoresStunImmunity",
174
184
  "disablesAutoAttack",
@@ -180,6 +190,7 @@ local buffNumberParameters = {
180
190
  "durationIncreaseOnAutoAttack",
181
191
  "attackSpeedIncreaseFactor",
182
192
  "movementSpeedIncreaseFactor",
193
+ "evasionProbability",
183
194
  "armorIncrease",
184
195
  "damageFactor",
185
196
  "receivedDamageFactor",
@@ -193,7 +204,8 @@ local buffNumberParameters = {
193
204
  "healingPerInterval",
194
205
  "healingOverDuration",
195
206
  "damageOnExpiration",
196
- "healingOnExpiration"
207
+ "healingOnExpiration",
208
+ "abilityCooldownFactor"
197
209
  }
198
210
  local unsuccessfulApplicationMarker = {}
199
211
  local function selectBuffTypeIdWithLeastDuration(buffTypeIds, unit)
@@ -220,7 +232,7 @@ local function selectBuffTypeIdWithLeastDuration(buffTypeIds, unit)
220
232
  return checkNotNull(firstNativeBuffTypeId)
221
233
  end
222
234
  local function destroyBuffIfItHasSameUniqueGroup(buff, uniqueGroup)
223
- if buff[103] == uniqueGroup then
235
+ if buff[104] == uniqueGroup then
224
236
  buff:destroy()
225
237
  end
226
238
  end
@@ -228,17 +240,17 @@ local function destroyBuff(buff)
228
240
  buff:destroy()
229
241
  end
230
242
  local function expireBuff(buff)
231
- local remainingDamageOverDuration = buff[112] or 0
232
- local remainingHealingOverDuration = buff[112] or 0
243
+ local remainingDamageOverDuration = buff[113] or 0
244
+ local remainingHealingOverDuration = buff[113] or 0
233
245
  if remainingDamageOverDuration ~= 0 or remainingHealingOverDuration ~= 0 then
234
246
  buff:flashSpecialEffect()
235
247
  if remainingDamageOverDuration ~= 0 then
236
- (buff[101] or buff[100]):damageTarget(buff[100], remainingDamageOverDuration)
237
- buff[112] = nil
248
+ (buff[102] or buff[101]):damageTarget(buff[101], remainingDamageOverDuration)
249
+ buff[113] = nil
238
250
  end
239
251
  if remainingHealingOverDuration ~= 0 then
240
- (buff[101] or buff[100]):healTarget(buff[100], remainingHealingOverDuration)
241
- buff[117] = nil
252
+ (buff[102] or buff[101]):healTarget(buff[101], remainingHealingOverDuration)
253
+ buff[118] = nil
242
254
  end
243
255
  end
244
256
  Timer:run(destroyBuff, buff)
@@ -246,56 +258,58 @@ local function expireBuff(buff)
246
258
  end
247
259
  local function buffDamageIntervalInitialTimerCallback(buff)
248
260
  buffDamageIntervalTimerCallback(buff)
249
- local timer = buff[113]
250
- local damageInterval = buff[111]
261
+ local timer = buff[114]
262
+ local damageInterval = buff[112]
251
263
  if timer ~= nil and damageInterval ~= nil and damageInterval > 0 then
252
264
  timer:start(damageInterval, true, buffDamageIntervalTimerCallback, buff)
253
265
  end
254
266
  end
255
267
  buffDamageIntervalTimerCallback = function(buff)
256
268
  buff:flashSpecialEffect()
257
- local source = buff[101] or buff[100]
258
- local remainingDamageOverDuration = buff[112] or 0
269
+ local source = buff[102] or buff[101]
270
+ local remainingDamageOverDuration = buff[113] or 0
259
271
  if remainingDamageOverDuration ~= 0 then
260
- local damageInterval = buff[111] or 0
272
+ local damageInterval = buff[112] or 0
261
273
  if damageInterval ~= 0 then
262
274
  local damage = remainingDamageOverDuration / (1 + buff.remainingDuration / damageInterval)
263
- source:damageTarget(buff[100], damage)
264
- buff[112] = remainingDamageOverDuration - damage
275
+ source:damageTarget(buff[101], damage)
276
+ buff[113] = remainingDamageOverDuration - damage
265
277
  end
266
278
  end
267
- local damagePerInterval = buff[110] or 0
279
+ local damagePerInterval = buff[111] or 0
268
280
  if remainingDamageOverDuration == 0 or damagePerInterval ~= 0 then
269
- source:damageTarget(buff[100], damagePerInterval)
281
+ source:damageTarget(buff[101], damagePerInterval)
270
282
  end
271
283
  end
272
284
  local function buffHealingIntervalInitialTimerCallback(buff)
273
285
  buffHealingIntervalTimerCallback(buff)
274
- local timer = buff[118]
275
- local healingInterval = buff[116]
286
+ local timer = buff[119]
287
+ local healingInterval = buff[117]
276
288
  if timer ~= nil and healingInterval ~= nil and healingInterval > 0 then
277
289
  timer:start(healingInterval, true, buffHealingIntervalTimerCallback, buff)
278
290
  end
279
291
  end
280
292
  buffHealingIntervalTimerCallback = function(buff)
281
- if buff[116] ~= buff[111] then
293
+ if buff[117] ~= buff[112] then
282
294
  buff:flashSpecialEffect()
283
295
  end
284
- local source = buff[101] or buff[100]
285
- local remainingHealingOverDuration = buff[117] or 0
296
+ local source = buff[102] or buff[101]
297
+ local remainingHealingOverDuration = buff[118] or 0
286
298
  if remainingHealingOverDuration ~= 0 then
287
- local healingInterval = buff[116] or 0
299
+ local healingInterval = buff[117] or 0
288
300
  if healingInterval ~= 0 then
289
301
  local healing = remainingHealingOverDuration / (1 + buff.remainingDuration / healingInterval)
290
- source:healTarget(buff[100], healing)
291
- buff[117] = remainingHealingOverDuration - healing
302
+ source:healTarget(buff[101], healing)
303
+ buff[118] = remainingHealingOverDuration - healing
292
304
  end
293
305
  end
294
- local healingPerInterval = buff[115] or 0
306
+ local healingPerInterval = buff[116] or 0
295
307
  if remainingHealingOverDuration == 0 or healingPerInterval ~= 0 then
296
- source:healTarget(buff[100], healingPerInterval)
308
+ source:healTarget(buff[101], healingPerInterval)
297
309
  end
298
310
  end
311
+ local buffCreatedEvent = __TS__New(Event)
312
+ local buffBeingDestroyedEvent = __TS__New(Event)
299
313
  ____exports.Buff = __TS__Class()
300
314
  local Buff = ____exports.Buff
301
315
  Buff.name = "Buff"
@@ -304,38 +318,44 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
304
318
  UnitBehavior.prototype.____constructor(self, _unit)
305
319
  self._unit = _unit
306
320
  self.parameters = nil
307
- self[100] = _unit
321
+ self[100] = 0
322
+ self[101] = _unit
308
323
  local typeId
309
324
  local polarity
310
325
  local resistanceType
311
326
  local ability
327
+ local abilityBehavior
312
328
  if type(typeIdOrTypeIds) ~= "number" then
313
329
  typeId = selectBuffTypeIdWithLeastDuration(typeIdOrTypeIds, _unit)
314
330
  polarity = resistanceTypeOrPolarity
315
331
  resistanceType = abilityOrParametersOrResistanceType
316
- if __TS__InstanceOf(parametersOrAbility, Ability) then
332
+ if __TS__InstanceOf(parametersOrAbility, AbilityBehavior) then
333
+ abilityBehavior = parametersOrAbility
334
+ ability = abilityBehavior.ability
335
+ elseif __TS__InstanceOf(parametersOrAbility, Ability) then
317
336
  ability = parametersOrAbility
318
- else
319
- ability = nil
337
+ elseif parametersOrAbility ~= nil then
320
338
  parameters = parametersOrAbility
321
339
  end
322
340
  else
323
341
  typeId = typeIdOrTypeIds
324
342
  polarity = polarityOrTypeIdSelectionPolicy
325
343
  resistanceType = resistanceTypeOrPolarity
326
- if __TS__InstanceOf(abilityOrParametersOrResistanceType, Ability) then
344
+ if __TS__InstanceOf(abilityOrParametersOrResistanceType, AbilityBehavior) then
345
+ abilityBehavior = abilityOrParametersOrResistanceType
346
+ ability = abilityBehavior.ability
347
+ parameters = parametersOrAbility
348
+ elseif __TS__InstanceOf(abilityOrParametersOrResistanceType, Ability) then
327
349
  ability = abilityOrParametersOrResistanceType
328
350
  parameters = parametersOrAbility
329
- else
330
- ability = nil
351
+ elseif abilityOrParametersOrResistanceType ~= nil then
331
352
  parameters = abilityOrParametersOrResistanceType
353
+ else
354
+ parameters = parametersOrAbility
332
355
  end
333
356
  end
357
+ self.sourceAbilityBehavior = abilityBehavior
334
358
  self.typeId = typeId
335
- if not __TS__InstanceOf(ability, Ability) then
336
- parameters = ability
337
- ability = nil
338
- end
339
359
  local defaultParameters = self.constructor.defaultParameters
340
360
  local level = parameters and parameters.level or defaultParameters.level
341
361
  local spellStealPriority = parameters and parameters.spellStealPriority or defaultParameters.spellStealPriority
@@ -360,14 +380,19 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
360
380
  end
361
381
  self.polarity = resolveEnumValue(ability, level, polarity)
362
382
  self.resistanceType = resolveEnumValue(ability, level, resistanceType)
383
+ local missProbability = parameters and parameters.missProbability or defaultParameters.missProbability
384
+ if missProbability ~= nil then
385
+ missProbability = resolveNumberValue(ability, level, missProbability)
386
+ self[142] = missProbability
387
+ end
363
388
  local buffByTypeId = buffByTypeIdByUnit[_unit]
364
389
  if buffByTypeId == nil then
365
390
  buffByTypeId = {}
366
391
  buffByTypeIdByUnit[_unit] = buffByTypeId
367
392
  end
368
- local ____opt_13 = buffByTypeId[typeId]
369
- if ____opt_13 ~= nil then
370
- ____opt_13:destroy()
393
+ local ____opt_15 = buffByTypeId[typeId]
394
+ if ____opt_15 ~= nil then
395
+ ____opt_15:destroy()
371
396
  end
372
397
  local uniqueGroup = parameters and parameters.uniqueGroup or defaultParameters and defaultParameters.uniqueGroup
373
398
  if uniqueGroup ~= nil then
@@ -381,13 +406,16 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
381
406
  level,
382
407
  duration,
383
408
  spellStealPriority,
384
- learnLevelMinimum
409
+ learnLevelMinimum,
410
+ missProbability
385
411
  ) then
412
+ self[100] = 1
386
413
  UnitBehavior.prototype.destroy(self)
387
414
  error(unsuccessfulApplicationMarker, 0)
388
415
  end
389
416
  local handle = BlzGetUnitAbility(_unit.handle, typeId)
390
417
  if handle == nil then
418
+ self[100] = 1
391
419
  UnitBehavior.prototype.destroy(self)
392
420
  error(unsuccessfulApplicationMarker, 0)
393
421
  end
@@ -396,20 +424,20 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
396
424
  self._level = level
397
425
  self._spellStealPriority = spellStealPriority
398
426
  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)
427
+ self[102] = source
428
+ self[103] = duration or 0
429
+ self[104] = uniqueGroup
430
+ self[105] = BlzGetAbilityStringLevelField(self.handle, ABILITY_SLF_EFFECT, 0)
431
+ self[106] = BlzGetAbilityStringLevelField(self.handle, ABILITY_SLF_SPECIAL, 0)
404
432
  if parameters ~= nil or (next(defaultParameters)) ~= nil then
405
433
  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]
434
+ local ____ability_24 = ability
435
+ local ____level_25 = level
436
+ local ____temp_23 = parameters and parameters[buffBooleanParameter]
437
+ if ____temp_23 == nil then
438
+ ____temp_23 = defaultParameters[buffBooleanParameter]
411
439
  end
412
- if resolveBooleanValue(____ability_22, ____level_23, ____temp_21) then
440
+ if resolveBooleanValue(____ability_24, ____level_25, ____temp_23) then
413
441
  self[buffBooleanParameter] = true
414
442
  end
415
443
  end
@@ -425,11 +453,11 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
425
453
  end
426
454
  local maximumDuration = parameters and parameters.maximumDuration or defaultParameters.maximumDuration
427
455
  if maximumDuration ~= nil then
428
- self[107] = resolveNumberValue(ability, level, maximumDuration)
456
+ self[108] = resolveNumberValue(ability, level, maximumDuration)
429
457
  end
430
458
  local maximumRemainingDuration = parameters and parameters.maximumRemainingDuration or defaultParameters.maximumRemainingDuration
431
459
  if maximumRemainingDuration ~= nil then
432
- self[108] = resolveNumberValue(ability, level, maximumRemainingDuration)
460
+ self[109] = resolveNumberValue(ability, level, maximumRemainingDuration)
433
461
  end
434
462
  local parametersAbilityTypeIds = parameters and parameters.abilityTypeIds or defaultParameters.abilityTypeIds
435
463
  if parametersAbilityTypeIds ~= nil then
@@ -487,29 +515,34 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
487
515
  self._timer = timer
488
516
  end
489
517
  self:onCreate()
518
+ self[100] = 1
519
+ Event.invoke(buffCreatedEvent, self)
490
520
  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)
521
+ function Buff.prototype.onAbilityGained(self, ability)
522
+ if __TS__InstanceOf(ability, UnitAbility) then
523
+ local abilityCooldownModifier = self[144]
524
+ if abilityCooldownModifier then
525
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:applyModifier(ability, abilityCooldownModifier)
526
+ end
527
+ end
495
528
  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
529
+ function Buff.prototype.onAbilityLost(self, ability)
530
+ if __TS__InstanceOf(ability, UnitAbility) then
531
+ local abilityCooldownModifier = self[144]
532
+ if abilityCooldownModifier then
533
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, abilityCooldownModifier)
534
+ end
501
535
  end
502
- bonusIdByBonusType[bonusType] = addOrUpdateOrRemoveUnitBonus(self._unit, bonusType, bonusIdByBonusType[bonusType], value)
503
536
  end
504
537
  function Buff.prototype.flashEffect(self, widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
505
538
  if type(widgetOrXOrParametersOrDuration) == "number" and type(yOrParametersOrDuration) == "number" then
506
- Effect:flash(self[104], widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
539
+ Effect:flash(self[105], widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
507
540
  else
508
541
  local isWidgetProvided = __TS__InstanceOf(widgetOrXOrParametersOrDuration, Unit) or __TS__InstanceOf(widgetOrXOrParametersOrDuration, Item) or __TS__InstanceOf(widgetOrXOrParametersOrDuration, Destructable)
509
542
  local ____Effect_40 = Effect
510
543
  local ____Effect_flash_41 = Effect.flash
511
544
  local ____array_39 = __TS__SparseArrayNew(
512
- self[104],
545
+ self[105],
513
546
  isWidgetProvided and widgetOrXOrParametersOrDuration or self._unit,
514
547
  stringValueByBuffTypeIdByFieldId[fourCC("feft")][self.typeId] or "origin"
515
548
  )
@@ -531,7 +564,7 @@ function Buff.prototype.flashSpecialEffect(self, widgetOrDuration, duration)
531
564
  local ____Effect_44 = Effect
532
565
  local ____Effect_flash_45 = Effect.flash
533
566
  local ____array_43 = __TS__SparseArrayNew(
534
- self[105],
567
+ self[106],
535
568
  isWidgetProvided and widgetOrDuration or self._unit,
536
569
  stringValueByBuffTypeIdByFieldId[fourCC("fspt")][self.typeId] or "origin"
537
570
  )
@@ -550,20 +583,22 @@ end
550
583
  function Buff.prototype.onCreate(self)
551
584
  end
552
585
  function Buff.prototype.onDestroy(self)
586
+ check(self[100] ~= 0, "Cannot destroy a buff that has not finished creating yet.")
587
+ self[100] = 2
553
588
  local unit = self._unit
554
589
  if getUnitAbility(unit.handle, self.typeId) == self.handle then
555
590
  removeBuff(unit.handle, self.typeId)
556
591
  end
557
592
  buffByTypeIdByUnit[unit][self.typeId] = nil
558
- local healingIntervalTimer = self[118]
593
+ local healingIntervalTimer = self[119]
559
594
  if healingIntervalTimer ~= nil then
560
595
  healingIntervalTimer:destroy()
561
- self[118] = nil
596
+ self[119] = nil
562
597
  end
563
- local damageIntervalTimer = self[113]
598
+ local damageIntervalTimer = self[114]
564
599
  if damageIntervalTimer ~= nil then
565
600
  damageIntervalTimer:destroy()
566
- self[113] = nil
601
+ self[114] = nil
567
602
  end
568
603
  if self._timer ~= nil then
569
604
  self._timer:destroy()
@@ -573,25 +608,34 @@ function Buff.prototype.onDestroy(self)
573
608
  behavior:destroy()
574
609
  end
575
610
  end
576
- if self[136] then
611
+ local previousAbilityCooldownModifier = self[144]
612
+ if previousAbilityCooldownModifier then
613
+ for ____, ability in ipairs(self._unit.abilities) do
614
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, previousAbilityCooldownModifier)
615
+ end
616
+ end
617
+ if self[139] then
618
+ unit:decrementInvulnerabilityCounter()
619
+ end
620
+ if self[138] then
577
621
  unit:decrementDisableAutoAttackCounter()
578
622
  end
579
- if self[134] then
580
- if self[135] then
581
- unit:decrementStunCounter()
623
+ if self[136] then
624
+ if self[137] then
625
+ unit:decrementForceStunCounter()
582
626
  end
583
627
  unit:decrementStunCounter()
584
628
  end
629
+ if self[135] then
630
+ unit:decrementGhostCounter()
631
+ end
585
632
  if self._abilityTypeIds ~= nil then
586
633
  for abilityTypeId in pairs(self._abilityTypeIds) do
587
634
  unit:removeAbility(abilityTypeId)
588
635
  end
589
636
  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
637
+ Event.invoke(buffBeingDestroyedEvent, self)
638
+ self[100] = 3
595
639
  return UnitBehavior.prototype.onDestroy(self)
596
640
  end
597
641
  function Buff.apply(self, ...)
@@ -628,72 +672,72 @@ function Buff.getByTypeId(self, unit, typeId)
628
672
  end
629
673
  function Buff.prototype.onExpiration(self)
630
674
  local unit = self.unit
631
- if self[119] ~= nil then
632
- (self[101] or unit):damageTarget(unit, self[119] or 0)
633
- end
634
675
  if self[120] ~= nil then
635
- (self[101] or unit):healTarget(unit, self[119] or 0)
676
+ (self[102] or unit):damageTarget(unit, self[120] or 0)
636
677
  end
637
- if self[139] then
678
+ if self[121] ~= nil then
679
+ (self[102] or unit):healTarget(unit, self[120] or 0)
680
+ end
681
+ if self[141] then
638
682
  unit:explode()
639
- elseif self[138] then
683
+ elseif self[140] then
640
684
  unit:kill()
641
685
  end
642
686
  end
643
687
  function Buff.prototype.onDeath(self, source)
644
688
  local unit = self.unit
645
- if self[121] ~= nil then
689
+ if self[122] ~= nil then
646
690
  damageArea(
647
- self[101] or unit,
648
- self[121],
691
+ self[102] or unit,
692
+ self[122],
649
693
  unit.x,
650
694
  unit.y,
695
+ self[124] or 0,
651
696
  self[123] or 0,
652
- self[122] or 0,
697
+ self[126] or 0,
653
698
  self[125] or 0,
654
- self[124] or 0,
655
- self[127] or 0,
656
- self[126] or 0
699
+ self[128] or 0,
700
+ self[127] or 0
657
701
  )
658
702
  end
659
703
  end
660
704
  function Buff.prototype.onDamageDealt(self, target, event)
661
705
  if event.isAttack then
662
- if self[106] ~= nil then
663
- local durationIncrease = self[106]
664
- local maximumDuration = self[107] or 0
706
+ if self[107] ~= nil then
707
+ local durationIncrease = self[107]
708
+ local maximumDuration = self[108] or 0
665
709
  if maximumDuration > 0 then
666
710
  durationIncrease = min(
667
711
  durationIncrease,
668
- max(0, maximumDuration - self[102])
712
+ max(0, maximumDuration - self[103])
669
713
  )
670
714
  end
671
715
  local remainingDuration = self.remainingDuration + durationIncrease
672
- local maximumRemainingDuration = self[108] or 0
716
+ local maximumRemainingDuration = self[109] or 0
673
717
  if maximumRemainingDuration > 0 then
674
718
  remainingDuration = min(remainingDuration, maximumRemainingDuration)
675
719
  end
676
720
  self.remainingDuration = remainingDuration
677
721
  end
678
- local autoAttackCount = (self[128] or 0) + 1
679
- self[128] = autoAttackCount
680
- if autoAttackCount == self[129] then
722
+ local autoAttackCount = (self[129] or 0) + 1
723
+ self[129] = autoAttackCount
724
+ if autoAttackCount == self[130] then
681
725
  self:destroy()
682
726
  end
683
727
  end
684
728
  if event.originalAmount ~= 0 then
685
- local damageDealtEventCount = (self[130] or 0) + 1
686
- self[130] = damageDealtEventCount
687
- if damageDealtEventCount == self[131] then
729
+ local damageDealtEventCount = (self[131] or 0) + 1
730
+ self[131] = damageDealtEventCount
731
+ if damageDealtEventCount == self[132] then
688
732
  self:destroy()
689
733
  end
690
734
  end
691
735
  end
692
736
  function Buff.prototype.onDamageReceived(self, source, event)
693
737
  if event.originalAmount ~= 0 then
694
- local damageReceivedEventCount = (self[132] or 0) + 1
695
- self[132] = damageReceivedEventCount
696
- if damageReceivedEventCount == self[133] then
738
+ local damageReceivedEventCount = (self[133] or 0) + 1
739
+ self[133] = damageReceivedEventCount
740
+ if damageReceivedEventCount == self[134] then
697
741
  self:destroy()
698
742
  end
699
743
  end
@@ -703,7 +747,7 @@ __TS__SetDescriptor(
703
747
  Buff.prototype,
704
748
  "source",
705
749
  {get = function(self)
706
- return self[101] or self._unit
750
+ return self[102] or self._unit
707
751
  end},
708
752
  true
709
753
  )
@@ -720,13 +764,13 @@ __TS__SetDescriptor(
720
764
  "remainingDamageOverDuration",
721
765
  {
722
766
  get = function(self)
723
- return self[112] or 0
767
+ return self[113] or 0
724
768
  end,
725
769
  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
770
+ local remainingDamageOverDurationDelta = remainingDamageOverDuration - (self[113] or 0)
771
+ self[113] = remainingDamageOverDuration ~= 0 and remainingDamageOverDuration or nil
772
+ local damageOverDuration = (self[110] or 0) + remainingDamageOverDurationDelta
773
+ self[110] = damageOverDuration ~= 0 and damageOverDuration or nil
730
774
  end
731
775
  },
732
776
  true
@@ -736,13 +780,13 @@ __TS__SetDescriptor(
736
780
  "damageOverDuration",
737
781
  {
738
782
  get = function(self)
739
- return self[109] or 0
783
+ return self[110] or 0
740
784
  end,
741
785
  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
786
+ local damageOverDurationDelta = damageOverDuration - (self[110] or 0)
787
+ self[110] = damageOverDuration ~= 0 and damageOverDuration or nil
788
+ local remainingDamageOverDuration = (self[113] or 0) + damageOverDurationDelta
789
+ self[113] = remainingDamageOverDuration ~= 0 and remainingDamageOverDuration or nil
746
790
  end
747
791
  },
748
792
  true
@@ -752,10 +796,10 @@ __TS__SetDescriptor(
752
796
  "damagePerInterval",
753
797
  {
754
798
  get = function(self)
755
- return self[110] or 0
799
+ return self[111] or 0
756
800
  end,
757
801
  set = function(self, damagePerInterval)
758
- self[110] = damagePerInterval ~= 0 and damagePerInterval or nil
802
+ self[111] = damagePerInterval ~= 0 and damagePerInterval or nil
759
803
  end
760
804
  },
761
805
  true
@@ -765,25 +809,25 @@ __TS__SetDescriptor(
765
809
  "damageInterval",
766
810
  {
767
811
  get = function(self)
768
- return self[111] or 0
812
+ return self[112] or 0
769
813
  end,
770
814
  set = function(self, damageInterval)
771
815
  if damageInterval <= 0 then
772
- self[111] = damageInterval ~= 0 and damageInterval or nil
773
- local timer = self[113]
816
+ self[112] = damageInterval ~= 0 and damageInterval or nil
817
+ local timer = self[114]
774
818
  if timer ~= nil then
775
819
  timer:destroy()
776
- self[113] = nil
820
+ self[114] = nil
777
821
  end
778
822
  return
779
823
  end
780
- self[111] = damageInterval
824
+ self[112] = damageInterval
781
825
  local ____opt_48 = self._timer
782
826
  local elapsed = ____opt_48 and ____opt_48.elapsed or 0
783
- local timer = self[113]
827
+ local timer = self[114]
784
828
  if timer == nil then
785
829
  timer = Timer:create()
786
- self[113] = timer
830
+ self[114] = timer
787
831
  end
788
832
  local initialDelay = damageInterval - (elapsed >= damageInterval and math.fmod(elapsed, damageInterval) or elapsed)
789
833
  if initialDelay == damageInterval then
@@ -800,13 +844,13 @@ __TS__SetDescriptor(
800
844
  "remainingHealingOverDuration",
801
845
  {
802
846
  get = function(self)
803
- return self[117] or 0
847
+ return self[118] or 0
804
848
  end,
805
849
  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
850
+ local remainingHealingOverDurationDelta = remainingHealingOverDuration - (self[118] or 0)
851
+ self[113] = remainingHealingOverDuration ~= 0 and remainingHealingOverDuration or nil
852
+ local healingOverDuration = (self[115] or 0) + remainingHealingOverDurationDelta
853
+ self[115] = healingOverDuration ~= 0 and healingOverDuration or nil
810
854
  end
811
855
  },
812
856
  true
@@ -816,13 +860,13 @@ __TS__SetDescriptor(
816
860
  "healingOverDuration",
817
861
  {
818
862
  get = function(self)
819
- return self[114] or 0
863
+ return self[115] or 0
820
864
  end,
821
865
  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
866
+ local healingOverDurationDelta = healingOverDuration - (self[115] or 0)
867
+ self[115] = healingOverDuration ~= 0 and healingOverDuration or nil
868
+ local remainingHealingOverDuration = (self[118] or 0) + healingOverDurationDelta
869
+ self[118] = remainingHealingOverDuration ~= 0 and remainingHealingOverDuration or nil
826
870
  end
827
871
  },
828
872
  true
@@ -832,10 +876,10 @@ __TS__SetDescriptor(
832
876
  "healingPerInterval",
833
877
  {
834
878
  get = function(self)
835
- return self[115] or 0
879
+ return self[116] or 0
836
880
  end,
837
881
  set = function(self, healingPerInterval)
838
- self[115] = healingPerInterval ~= 0 and healingPerInterval or nil
882
+ self[116] = healingPerInterval ~= 0 and healingPerInterval or nil
839
883
  end
840
884
  },
841
885
  true
@@ -845,25 +889,25 @@ __TS__SetDescriptor(
845
889
  "healingInterval",
846
890
  {
847
891
  get = function(self)
848
- return self[116] or 0
892
+ return self[117] or 0
849
893
  end,
850
894
  set = function(self, healingInterval)
851
895
  if healingInterval <= 0 then
852
- self[116] = healingInterval ~= 0 and healingInterval or nil
853
- local timer = self[118]
896
+ self[117] = healingInterval ~= 0 and healingInterval or nil
897
+ local timer = self[119]
854
898
  if timer ~= nil then
855
899
  timer:destroy()
856
- self[118] = nil
900
+ self[119] = nil
857
901
  end
858
902
  return
859
903
  end
860
- self[116] = healingInterval
904
+ self[117] = healingInterval
861
905
  local ____opt_50 = self._timer
862
906
  local elapsed = ____opt_50 and ____opt_50.elapsed or 0
863
- local timer = self[118]
907
+ local timer = self[119]
864
908
  if timer == nil then
865
909
  timer = Timer:create()
866
- self[118] = timer
910
+ self[119] = timer
867
911
  end
868
912
  local initialDelay = healingInterval - (elapsed >= healingInterval and math.fmod(elapsed, healingInterval) or elapsed)
869
913
  if initialDelay == healingInterval then
@@ -880,10 +924,10 @@ __TS__SetDescriptor(
880
924
  "damageOnExpiration",
881
925
  {
882
926
  get = function(self)
883
- return self[119] or 0
927
+ return self[120] or 0
884
928
  end,
885
929
  set = function(self, damageOnExpiration)
886
- self[119] = damageOnExpiration ~= 0 and damageOnExpiration or nil
930
+ self[120] = damageOnExpiration ~= 0 and damageOnExpiration or nil
887
931
  end
888
932
  },
889
933
  true
@@ -893,10 +937,10 @@ __TS__SetDescriptor(
893
937
  "healingOnExpiration",
894
938
  {
895
939
  get = function(self)
896
- return self[120] or 0
940
+ return self[121] or 0
897
941
  end,
898
942
  set = function(self, healingOnExpiration)
899
- self[120] = healingOnExpiration ~= 0 and healingOnExpiration or nil
943
+ self[121] = healingOnExpiration ~= 0 and healingOnExpiration or nil
900
944
  end
901
945
  },
902
946
  true
@@ -940,30 +984,53 @@ __TS__SetDescriptor(
940
984
  },
941
985
  true
942
986
  )
987
+ __TS__SetDescriptor(
988
+ Buff.prototype,
989
+ "turnsIntoGhost",
990
+ {
991
+ get = function(self)
992
+ local ____self__135_52 = self[135]
993
+ if ____self__135_52 == nil then
994
+ ____self__135_52 = false
995
+ end
996
+ return ____self__135_52
997
+ end,
998
+ set = function(self, turnsIntoGhost)
999
+ if not turnsIntoGhost and self[135] then
1000
+ self.object:decrementGhostCounter()
1001
+ self[135] = nil
1002
+ elseif turnsIntoGhost and not self[135] then
1003
+ self.object:incrementGhostCounter()
1004
+ self[135] = true
1005
+ end
1006
+ end
1007
+ },
1008
+ true
1009
+ )
943
1010
  __TS__SetDescriptor(
944
1011
  Buff.prototype,
945
1012
  "stuns",
946
1013
  {
947
1014
  get = function(self)
948
- local ____self__134_52 = self[134]
949
- if ____self__134_52 == nil then
950
- ____self__134_52 = false
1015
+ local ____self__136_53 = self[136]
1016
+ if ____self__136_53 == nil then
1017
+ ____self__136_53 = false
951
1018
  end
952
- return ____self__134_52
1019
+ return ____self__136_53
953
1020
  end,
954
1021
  set = function(self, stuns)
955
- if not stuns and self[134] then
956
- if self[135] then
957
- self.object:decrementStunCounter()
1022
+ if not stuns and self[136] then
1023
+ if self[137] then
1024
+ self.object:decrementForceStunCounter()
958
1025
  end
959
1026
  self.object:decrementStunCounter()
960
- self[134] = nil
961
- elseif stuns and not self[134] then
962
- if self[135] then
963
- self.object:incrementStunCounter()
1027
+ self[136] = nil
1028
+ elseif stuns and not self[136] then
1029
+ if self[137] then
1030
+ self.object:incrementForceStunCounter()
964
1031
  end
965
1032
  self.object:incrementStunCounter()
966
- self[134] = true
1033
+ self[136] = true
967
1034
  end
968
1035
  end
969
1036
  },
@@ -974,23 +1041,23 @@ __TS__SetDescriptor(
974
1041
  "ignoresStunImmunity",
975
1042
  {
976
1043
  get = function(self)
977
- local ____self__135_53 = self[135]
978
- if ____self__135_53 == nil then
979
- ____self__135_53 = false
1044
+ local ____self__137_54 = self[137]
1045
+ if ____self__137_54 == nil then
1046
+ ____self__137_54 = false
980
1047
  end
981
- return ____self__135_53
1048
+ return ____self__137_54
982
1049
  end,
983
1050
  set = function(self, ignoresStunImmunity)
984
- if not ignoresStunImmunity and self[135] then
985
- if self[134] then
986
- self.object:decrementStunCounter()
1051
+ if not ignoresStunImmunity and self[137] then
1052
+ if self[136] then
1053
+ self.object:decrementForceStunCounter()
987
1054
  end
988
- self[135] = nil
989
- elseif ignoresStunImmunity and not self[135] then
990
- if self[134] then
991
- self.object:incrementStunCounter()
1055
+ self[137] = nil
1056
+ elseif ignoresStunImmunity and not self[137] then
1057
+ if self[136] then
1058
+ self.object:incrementForceStunCounter()
992
1059
  end
993
- self[135] = true
1060
+ self[137] = true
994
1061
  end
995
1062
  end
996
1063
  },
@@ -1001,19 +1068,19 @@ __TS__SetDescriptor(
1001
1068
  "disablesAutoAttack",
1002
1069
  {
1003
1070
  get = function(self)
1004
- local ____self__136_54 = self[136]
1005
- if ____self__136_54 == nil then
1006
- ____self__136_54 = false
1071
+ local ____self__138_55 = self[138]
1072
+ if ____self__138_55 == nil then
1073
+ ____self__138_55 = false
1007
1074
  end
1008
- return ____self__136_54
1075
+ return ____self__138_55
1009
1076
  end,
1010
1077
  set = function(self, disablesAutoAttack)
1011
- if not disablesAutoAttack and self[136] then
1078
+ if not disablesAutoAttack and self[138] then
1012
1079
  self.object:decrementDisableAutoAttackCounter()
1013
- self[136] = nil
1014
- elseif disablesAutoAttack and not self[136] then
1080
+ self[138] = nil
1081
+ elseif disablesAutoAttack and not self[138] then
1015
1082
  self.object:incrementDisableAutoAttackCounter()
1016
- self[136] = true
1083
+ self[138] = true
1017
1084
  end
1018
1085
  end
1019
1086
  },
@@ -1024,19 +1091,19 @@ __TS__SetDescriptor(
1024
1091
  "providesInvulnerability",
1025
1092
  {
1026
1093
  get = function(self)
1027
- local ____self__137_55 = self[137]
1028
- if ____self__137_55 == nil then
1029
- ____self__137_55 = false
1094
+ local ____self__139_56 = self[139]
1095
+ if ____self__139_56 == nil then
1096
+ ____self__139_56 = false
1030
1097
  end
1031
- return ____self__137_55
1098
+ return ____self__139_56
1032
1099
  end,
1033
1100
  set = function(self, providesInvulnerability)
1034
- if not providesInvulnerability and self[137] then
1101
+ if not providesInvulnerability and self[139] then
1035
1102
  self.object:decrementInvulnerabilityCounter()
1036
- self[137] = nil
1037
- elseif providesInvulnerability and not self[137] then
1103
+ self[139] = nil
1104
+ elseif providesInvulnerability and not self[139] then
1038
1105
  self.object:incrementInvulnerabilityCounter()
1039
- self[137] = true
1106
+ self[139] = true
1040
1107
  end
1041
1108
  end
1042
1109
  },
@@ -1047,17 +1114,17 @@ __TS__SetDescriptor(
1047
1114
  "killsOnExpiration",
1048
1115
  {
1049
1116
  get = function(self)
1050
- local ____self__138_56 = self[138]
1051
- if ____self__138_56 == nil then
1052
- ____self__138_56 = false
1117
+ local ____self__140_57 = self[140]
1118
+ if ____self__140_57 == nil then
1119
+ ____self__140_57 = false
1053
1120
  end
1054
- return ____self__138_56
1121
+ return ____self__140_57
1055
1122
  end,
1056
1123
  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
1124
+ if not killsOnExpiration and self[140] then
1125
+ self[140] = nil
1126
+ elseif killsOnExpiration and not self[140] then
1127
+ self[140] = true
1061
1128
  end
1062
1129
  end
1063
1130
  },
@@ -1068,17 +1135,17 @@ __TS__SetDescriptor(
1068
1135
  "explodesOnExpiration",
1069
1136
  {
1070
1137
  get = function(self)
1071
- local ____self__139_57 = self[139]
1072
- if ____self__139_57 == nil then
1073
- ____self__139_57 = false
1138
+ local ____self__141_58 = self[141]
1139
+ if ____self__141_58 == nil then
1140
+ ____self__141_58 = false
1074
1141
  end
1075
- return ____self__139_57
1142
+ return ____self__141_58
1076
1143
  end,
1077
1144
  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
1145
+ if not killsOnExpiration and self[141] then
1146
+ self[141] = nil
1147
+ elseif killsOnExpiration and not self[141] then
1148
+ self[141] = true
1082
1149
  end
1083
1150
  end
1084
1151
  },
@@ -1089,13 +1156,13 @@ __TS__SetDescriptor(
1089
1156
  "maximumDamageDealtEventCount",
1090
1157
  {
1091
1158
  get = function(self)
1092
- return self[131] or 0
1159
+ return self[132] or 0
1093
1160
  end,
1094
1161
  set = function(self, maximumDamageDealtEventCount)
1095
1162
  if maximumDamageDealtEventCount == 0 then
1096
- self[131] = nil
1163
+ self[132] = nil
1097
1164
  else
1098
- self[131] = maximumDamageDealtEventCount
1165
+ self[132] = maximumDamageDealtEventCount
1099
1166
  end
1100
1167
  end
1101
1168
  },
@@ -1106,13 +1173,13 @@ __TS__SetDescriptor(
1106
1173
  "maximumDamageReceivedEventCount",
1107
1174
  {
1108
1175
  get = function(self)
1109
- return self[133] or 0
1176
+ return self[134] or 0
1110
1177
  end,
1111
1178
  set = function(self, maximumDamageReceivedEventCount)
1112
1179
  if maximumDamageReceivedEventCount == 0 then
1113
- self[133] = nil
1180
+ self[134] = nil
1114
1181
  else
1115
- self[133] = maximumDamageReceivedEventCount
1182
+ self[134] = maximumDamageReceivedEventCount
1116
1183
  end
1117
1184
  end
1118
1185
  },
@@ -1123,13 +1190,13 @@ __TS__SetDescriptor(
1123
1190
  "maximumAutoAttackCount",
1124
1191
  {
1125
1192
  get = function(self)
1126
- return self[129] or 0
1193
+ return self[130] or 0
1127
1194
  end,
1128
1195
  set = function(self, maximumAutoAttackCount)
1129
1196
  if maximumAutoAttackCount == 0 then
1130
- self[129] = nil
1197
+ self[130] = nil
1131
1198
  else
1132
- self[129] = maximumAutoAttackCount
1199
+ self[130] = maximumAutoAttackCount
1133
1200
  end
1134
1201
  end
1135
1202
  },
@@ -1140,10 +1207,10 @@ __TS__SetDescriptor(
1140
1207
  "durationIncreaseOnAutoAttack",
1141
1208
  {
1142
1209
  get = function(self)
1143
- return self[106] or 0
1210
+ return self[107] or 0
1144
1211
  end,
1145
1212
  set = function(self, durationIncreaseOnAutoAttack)
1146
- self[106] = durationIncreaseOnAutoAttack
1213
+ self[107] = durationIncreaseOnAutoAttack
1147
1214
  end
1148
1215
  },
1149
1216
  true
@@ -1174,11 +1241,24 @@ __TS__SetDescriptor(
1174
1241
  },
1175
1242
  true
1176
1243
  )
1244
+ __TS__SetDescriptor(
1245
+ Buff.prototype,
1246
+ "evasionProbability",
1247
+ {
1248
+ get = function(self)
1249
+ return self:getUnitBonus(UnitBonusType.EVASION_PROBABILITY)
1250
+ end,
1251
+ set = function(self, evasionProbability)
1252
+ self:addOrUpdateOrRemoveUnitBonus(UnitBonusType.EVASION_PROBABILITY, evasionProbability)
1253
+ end
1254
+ },
1255
+ true
1256
+ )
1177
1257
  __TS__SetDescriptor(
1178
1258
  Buff.prototype,
1179
1259
  "duration",
1180
1260
  {get = function(self)
1181
- return self[102]
1261
+ return self[103]
1182
1262
  end},
1183
1263
  true
1184
1264
  )
@@ -1187,15 +1267,15 @@ __TS__SetDescriptor(
1187
1267
  "remainingDuration",
1188
1268
  {
1189
1269
  get = function(self)
1190
- local ____opt_58 = self._timer
1191
- return ____opt_58 and ____opt_58.remaining or 0
1270
+ local ____opt_59 = self._timer
1271
+ return ____opt_59 and ____opt_59.remaining or 0
1192
1272
  end,
1193
1273
  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)
1274
+ local ____remainingDuration_63 = remainingDuration
1275
+ local ____opt_61 = self._timer
1276
+ local remainingDurationDelta = ____remainingDuration_63 - (____opt_61 and ____opt_61.remaining or 0)
1197
1277
  if remainingDurationDelta ~= 0 then
1198
- self[102] = self[102] + remainingDurationDelta
1278
+ self[103] = self[103] + remainingDurationDelta
1199
1279
  if remainingDuration <= 0 then
1200
1280
  Timer:run(destroyBuff, self)
1201
1281
  else
@@ -1207,7 +1287,8 @@ __TS__SetDescriptor(
1207
1287
  self._level,
1208
1288
  remainingDuration,
1209
1289
  self._spellStealPriority,
1210
- self._learnLevelMinimum
1290
+ self._learnLevelMinimum,
1291
+ self[142]
1211
1292
  ) then
1212
1293
  local timer = self._timer
1213
1294
  if timer == nil then
@@ -1221,10 +1302,38 @@ __TS__SetDescriptor(
1221
1302
  end
1222
1303
  },
1223
1304
  true
1224
- );
1305
+ )
1306
+ __TS__SetDescriptor(
1307
+ Buff.prototype,
1308
+ "abilityCooldownFactor",
1309
+ {
1310
+ get = function(self)
1311
+ return self[143] or 1
1312
+ end,
1313
+ set = function(self, abilityCooldownFactor)
1314
+ local previousAbilityCooldownModifier = self[144]
1315
+ if previousAbilityCooldownModifier then
1316
+ for ____, ability in ipairs(self._unit.abilities) do
1317
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, previousAbilityCooldownModifier)
1318
+ end
1319
+ end
1320
+ local function modifier(ability, level, cooldown)
1321
+ return cooldown * abilityCooldownFactor
1322
+ end
1323
+ for ____, ability in ipairs(self._unit.abilities) do
1324
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:applyModifier(ability, modifier)
1325
+ end
1326
+ self[144] = modifier
1327
+ self[143] = abilityCooldownFactor
1328
+ end
1329
+ },
1330
+ true
1331
+ )
1332
+ Buff.createdEvent = buffCreatedEvent
1333
+ Buff.beingDestroyedEvent = buffBeingDestroyedEvent;
1225
1334
  (function(self)
1226
1335
  local function destroyBuffIfNeeded(buff)
1227
- if getUnitAbility(buff[100].handle, buff.typeId) ~= buff.handle then
1336
+ if getUnitAbility(buff[101].handle, buff.typeId) ~= buff.handle and buff[100] == 1 then
1228
1337
  buff:destroy()
1229
1338
  end
1230
1339
  end
@@ -1275,5 +1384,11 @@ __TS__SetDescriptor(
1275
1384
  ____exports.checkBuffs(target)
1276
1385
  end
1277
1386
  )
1387
+ buffCreatedEvent:addListener(function(buff)
1388
+ UnitBehavior:forAll(buff.unit, "onBuffGained", buff)
1389
+ end)
1390
+ buffBeingDestroyedEvent:addListener(function(buff)
1391
+ UnitBehavior:forAll(buff.unit, "onBuffLost", buff)
1392
+ end)
1278
1393
  end)(Buff)
1279
1394
  return ____exports