warscript 0.0.1-dev.ed60fea → 0.0.1-dev.edf7fad

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