warscript 0.0.1-dev.ac556d2 → 0.0.1-dev.aeaf398

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