warscript 0.0.1-dev.ee2345e → 0.0.1-dev.ee6e396

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