warscript 0.0.1-dev.7821093 → 0.0.1-dev.78e14b3

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