warscript 0.0.1-dev.c79b20b → 0.0.1-dev.c7b0c06

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