warscript 0.0.1-dev.91da42b → 0.0.1-dev.9381e62

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 (301) hide show
  1. package/core/dummy.lua +4 -2
  2. package/core/types/effect.d.ts +11 -1
  3. package/core/types/effect.lua +43 -77
  4. package/core/types/frame.d.ts +1 -0
  5. package/core/types/frame.lua +112 -37
  6. package/core/types/handle.lua +9 -9
  7. package/core/types/item.d.ts +1 -0
  8. package/core/types/item.lua +1 -0
  9. package/core/types/player.d.ts +2 -1
  10. package/core/types/player.lua +18 -13
  11. package/core/types/playerColor.lua +4 -3
  12. package/core/types/sound.d.ts +1 -1
  13. package/core/types/sound.lua +14 -9
  14. package/core/types/unit.d.ts +5 -0
  15. package/core/types/unit.lua +5 -0
  16. package/core/util.d.ts +3 -1
  17. package/core/util.lua +109 -3
  18. package/decl/native.d.ts +705 -7
  19. package/engine/behaviour/ability/apply-unit-behavior.lua +5 -0
  20. package/engine/behaviour/ability/damage.d.ts +4 -0
  21. package/engine/behaviour/ability/damage.lua +19 -15
  22. package/engine/behaviour/ability/emulate-impact.lua +5 -4
  23. package/engine/behaviour/ability/on-command-impact.d.ts +1 -0
  24. package/engine/behaviour/ability/on-command-impact.lua +1 -0
  25. package/engine/behaviour/ability.d.ts +11 -5
  26. package/engine/behaviour/ability.lua +54 -0
  27. package/engine/behaviour/unit/stun-immunity.d.ts +1 -1
  28. package/engine/behaviour/unit/stun-immunity.lua +5 -4
  29. package/engine/behaviour/unit.d.ts +1 -0
  30. package/engine/behaviour/unit.lua +14 -3
  31. package/engine/buff.d.ts +61 -25
  32. package/engine/buff.lua +330 -156
  33. package/engine/index.d.ts +2 -1
  34. package/engine/internal/ability.d.ts +4 -0
  35. package/engine/internal/ability.lua +56 -36
  36. package/engine/internal/item/fields.d.ts +12 -0
  37. package/engine/internal/item/fields.lua +33 -0
  38. package/engine/internal/item/owner-cache.d.ts +5 -0
  39. package/engine/internal/item/owner-cache.lua +4 -0
  40. package/engine/internal/item+owner.d.ts +2 -0
  41. package/engine/internal/item+owner.lua +27 -4
  42. package/engine/internal/item.d.ts +20 -5
  43. package/engine/internal/item.lua +146 -57
  44. package/engine/internal/mechanics/cast-ability.lua +6 -3
  45. package/engine/internal/misc/unit-ability-level-natives.lua +12 -0
  46. package/engine/internal/object-data/armor-bonus.d.ts +2 -0
  47. package/engine/internal/object-data/attribute-bonus.lua +2 -2
  48. package/engine/internal/object-data/health-bonus.d.ts +2 -0
  49. package/engine/internal/object-data/health-bonus.lua +16 -0
  50. package/engine/internal/object-data/health-regeneration-rate-increase.d.ts +2 -0
  51. package/engine/internal/object-data/health-regeneration-rate-increase.lua +48 -0
  52. package/engine/internal/object-data/mana-bonus.d.ts +2 -0
  53. package/engine/internal/object-data/mana-bonus.lua +16 -0
  54. package/engine/internal/unit/ability.lua +15 -3
  55. package/engine/internal/unit/add-item-to-slot-init.lua +3 -14
  56. package/engine/internal/unit/add-item-to-slot.lua +53 -12
  57. package/engine/internal/unit/appearance.d.ts +15 -0
  58. package/engine/internal/unit/appearance.lua +85 -0
  59. package/engine/internal/unit/bonus.d.ts +12 -0
  60. package/engine/internal/unit/bonus.lua +92 -8
  61. package/engine/internal/unit/buff.d.ts +2 -2
  62. package/engine/internal/unit/buff.lua +34 -19
  63. package/engine/internal/unit/equipment-inventory.d.ts +44 -0
  64. package/engine/internal/unit/equipment-inventory.lua +233 -0
  65. package/engine/internal/unit/expiration-timer.lua +1 -1
  66. package/engine/internal/unit/extended-inventory.d.ts +25 -0
  67. package/engine/internal/unit/extended-inventory.lua +99 -0
  68. package/engine/internal/unit/ignore-events-items.lua +10 -1
  69. package/engine/internal/unit/{item.d.ts → inventory.d.ts} +7 -3
  70. package/engine/internal/unit/inventory.lua +87 -0
  71. package/engine/internal/unit/item-container.d.ts +25 -0
  72. package/engine/internal/unit/item-container.lua +11 -0
  73. package/engine/internal/unit/item-order-events.d.ts +17 -0
  74. package/engine/internal/unit/item-order-events.lua +67 -0
  75. package/engine/internal/unit/item-slot.d.ts +27 -0
  76. package/engine/internal/unit/item-slot.lua +92 -0
  77. package/engine/internal/unit/order.d.ts +3 -3
  78. package/engine/internal/unit/order.lua +10 -10
  79. package/engine/internal/unit/pseudo-passive-abilities.d.ts +2 -0
  80. package/engine/internal/unit/pseudo-passive-abilities.lua +11 -0
  81. package/engine/internal/unit/range-event.d.ts +12 -0
  82. package/engine/internal/unit/range-event.lua +90 -0
  83. package/engine/internal/unit+ability.d.ts +2 -1
  84. package/engine/internal/unit+ability.lua +63 -2
  85. package/engine/internal/unit+bonus.lua +3 -3
  86. package/engine/internal/unit+damage.d.ts +9 -0
  87. package/engine/internal/unit+damage.lua +33 -0
  88. package/engine/internal/unit+rally.lua +9 -31
  89. package/engine/internal/unit-missile-data.lua +58 -32
  90. package/engine/internal/unit-missile-launch.lua +13 -13
  91. package/engine/internal/unit.d.ts +2 -10
  92. package/engine/internal/unit.lua +92 -133
  93. package/engine/local-client.d.ts +26 -0
  94. package/engine/local-client.lua +294 -54
  95. package/engine/object-data/auxiliary/attachment-preset.d.ts +7 -0
  96. package/engine/object-data/auxiliary/attachment-preset.lua +7 -0
  97. package/engine/object-data/auxiliary/equipment-slot.d.ts +12 -0
  98. package/engine/object-data/auxiliary/equipment-slot.lua +2 -0
  99. package/engine/object-data/auxiliary/equipment-type.d.ts +12 -0
  100. package/engine/object-data/auxiliary/equipment-type.lua +26 -0
  101. package/engine/object-data/auxiliary/item-class.d.ts +11 -0
  102. package/engine/object-data/auxiliary/item-class.lua +2 -0
  103. package/engine/object-data/auxiliary/item-tag.d.ts +12 -0
  104. package/engine/object-data/auxiliary/item-tag.lua +2 -0
  105. package/engine/object-data/auxiliary/order-type.d.ts +939 -0
  106. package/engine/object-data/auxiliary/order-type.lua +2 -0
  107. package/engine/object-data/auxiliary/sound-set-name.d.ts +14 -3
  108. package/engine/object-data/auxiliary/unit-attribute.lua +1 -1
  109. package/engine/object-data/entry/ability-type/apprehend.d.ts +22 -0
  110. package/engine/object-data/entry/ability-type/apprehend.lua +66 -0
  111. package/engine/object-data/entry/ability-type/armor-bonus.d.ts +8 -0
  112. package/engine/object-data/entry/ability-type/{armor-increase.lua → armor-bonus.lua} +9 -9
  113. package/engine/object-data/entry/ability-type/aura-of-blight.d.ts +13 -0
  114. package/engine/object-data/entry/ability-type/aura-of-blight.lua +39 -0
  115. package/engine/object-data/entry/ability-type/banshee.d.ts +8 -0
  116. package/engine/object-data/entry/ability-type/banshee.lua +13 -0
  117. package/engine/object-data/entry/ability-type/banshees-wail-damage-amp.d.ts +12 -0
  118. package/engine/object-data/entry/ability-type/banshees-wail-damage-amp.lua +27 -0
  119. package/engine/object-data/entry/ability-type/banshees-wail.d.ts +31 -0
  120. package/engine/object-data/entry/ability-type/banshees-wail.lua +117 -0
  121. package/engine/object-data/entry/ability-type/battering-ram.d.ts +33 -0
  122. package/engine/object-data/entry/ability-type/battering-ram.lua +130 -0
  123. package/engine/object-data/entry/ability-type/blank-configurable.d.ts +3 -0
  124. package/engine/object-data/entry/ability-type/blank-configurable.lua +30 -0
  125. package/engine/object-data/entry/ability-type/breath-of-fire.d.ts +11 -0
  126. package/engine/object-data/entry/ability-type/breath-of-fire.lua +27 -0
  127. package/engine/object-data/entry/ability-type/cleansing-fire.d.ts +27 -0
  128. package/engine/object-data/entry/ability-type/cleansing-fire.lua +104 -0
  129. package/engine/object-data/entry/ability-type/consecration.d.ts +15 -0
  130. package/engine/object-data/entry/ability-type/consecration.lua +52 -0
  131. package/engine/object-data/entry/ability-type/cooldown-reduction.d.ts +12 -0
  132. package/engine/object-data/entry/ability-type/cooldown-reduction.lua +39 -0
  133. package/engine/object-data/entry/ability-type/critical-strike-system.d.ts +18 -0
  134. package/engine/object-data/entry/ability-type/critical-strike-system.lua +65 -0
  135. package/engine/object-data/entry/ability-type/deathseeker-arrows.d.ts +21 -0
  136. package/engine/object-data/entry/ability-type/deathseeker-arrows.lua +78 -0
  137. package/engine/object-data/entry/ability-type/equipment-inventory-interface.d.ts +8 -0
  138. package/engine/object-data/entry/ability-type/equipment-inventory-interface.lua +13 -0
  139. package/engine/object-data/entry/ability-type/equipment-inventory.d.ts +13 -0
  140. package/engine/object-data/entry/ability-type/equipment-inventory.lua +27 -0
  141. package/engine/object-data/entry/ability-type/equipment.d.ts +13 -0
  142. package/engine/object-data/entry/ability-type/equipment.lua +27 -0
  143. package/engine/object-data/entry/ability-type/firebolt.d.ts +7 -0
  144. package/engine/object-data/entry/ability-type/firebolt.lua +13 -0
  145. package/engine/object-data/entry/ability-type/flame-strike.d.ts +25 -0
  146. package/engine/object-data/entry/ability-type/flame-strike.lua +92 -0
  147. package/engine/object-data/entry/ability-type/grant-talent-point.d.ts +8 -0
  148. package/engine/object-data/entry/ability-type/grant-talent-point.lua +13 -0
  149. package/engine/object-data/entry/ability-type/grim-conviction.d.ts +36 -0
  150. package/engine/object-data/entry/ability-type/grim-conviction.lua +131 -0
  151. package/engine/object-data/entry/ability-type/grit.d.ts +18 -0
  152. package/engine/object-data/entry/ability-type/grit.lua +65 -0
  153. package/engine/object-data/entry/ability-type/guiding-hand.d.ts +27 -0
  154. package/engine/object-data/entry/ability-type/guiding-hand.lua +104 -0
  155. package/engine/object-data/entry/ability-type/headsplitter.d.ts +27 -0
  156. package/engine/object-data/entry/ability-type/headsplitter.lua +104 -0
  157. package/engine/object-data/entry/ability-type/{armor-increase.d.ts → healing-modifier.d.ts} +4 -3
  158. package/engine/object-data/entry/ability-type/healing-modifier.lua +26 -0
  159. package/engine/object-data/entry/ability-type/healing-ward-aura.d.ts +13 -0
  160. package/engine/object-data/entry/ability-type/healing-ward-aura.lua +39 -0
  161. package/engine/object-data/entry/ability-type/health-bonus.d.ts +8 -0
  162. package/engine/object-data/entry/ability-type/health-bonus.lua +26 -0
  163. package/engine/object-data/entry/ability-type/heroic-slash.d.ts +18 -0
  164. package/engine/object-data/entry/ability-type/heroic-slash.lua +65 -0
  165. package/engine/object-data/entry/ability-type/holy-wrath.d.ts +30 -0
  166. package/engine/object-data/entry/ability-type/holy-wrath.lua +117 -0
  167. package/engine/object-data/entry/ability-type/inspire-courage.d.ts +18 -0
  168. package/engine/object-data/entry/ability-type/inspire-courage.lua +65 -0
  169. package/engine/object-data/entry/ability-type/item-life-regeneration.d.ts +10 -0
  170. package/engine/object-data/entry/ability-type/item-life-regeneration.lua +26 -0
  171. package/engine/object-data/entry/ability-type/life-drain.d.ts +37 -0
  172. package/engine/object-data/entry/ability-type/life-drain.lua +144 -0
  173. package/engine/object-data/entry/ability-type/lights-mercy.d.ts +27 -0
  174. package/engine/object-data/entry/ability-type/lights-mercy.lua +104 -0
  175. package/engine/object-data/entry/ability-type/mana-bonus.d.ts +8 -0
  176. package/engine/object-data/entry/ability-type/mana-bonus.lua +26 -0
  177. package/engine/object-data/entry/ability-type/mana-efficiency.d.ts +12 -0
  178. package/engine/object-data/entry/ability-type/mana-efficiency.lua +39 -0
  179. package/engine/object-data/entry/ability-type/mind-control.d.ts +21 -0
  180. package/engine/object-data/entry/ability-type/mind-control.lua +78 -0
  181. package/engine/object-data/entry/ability-type/on-attack-cast-spell.d.ts +21 -0
  182. package/engine/object-data/entry/ability-type/on-attack-cast-spell.lua +52 -0
  183. package/engine/object-data/entry/ability-type/on-basic-attack-cast-spell.d.ts +19 -0
  184. package/engine/object-data/entry/ability-type/on-basic-attack-cast-spell.lua +65 -0
  185. package/engine/object-data/entry/ability-type/on-hit-cast-spell.d.ts +15 -0
  186. package/engine/object-data/entry/ability-type/on-hit-cast-spell.lua +26 -0
  187. package/engine/object-data/entry/ability-type/on-magic-attack-cast-spell.d.ts +6 -0
  188. package/engine/object-data/entry/ability-type/on-magic-attack-cast-spell.lua +12 -0
  189. package/engine/object-data/entry/ability-type/provoke.d.ts +21 -0
  190. package/engine/object-data/entry/ability-type/provoke.lua +66 -0
  191. package/engine/object-data/entry/ability-type/rain-of-fire.d.ts +7 -0
  192. package/engine/object-data/entry/ability-type/rain-of-fire.lua +13 -0
  193. package/engine/object-data/entry/ability-type/raise-the-banner.d.ts +9 -0
  194. package/engine/object-data/entry/ability-type/raise-the-banner.lua +26 -0
  195. package/engine/object-data/entry/ability-type/reincarnation.d.ts +8 -0
  196. package/engine/object-data/entry/ability-type/reincarnation.lua +26 -0
  197. package/engine/object-data/entry/ability-type/resolve.d.ts +12 -0
  198. package/engine/object-data/entry/ability-type/resolve.lua +39 -0
  199. package/engine/object-data/entry/ability-type/righteous-fury.d.ts +33 -0
  200. package/engine/object-data/entry/ability-type/righteous-fury.lua +130 -0
  201. package/engine/object-data/entry/ability-type/sacred-aura.d.ts +27 -0
  202. package/engine/object-data/entry/ability-type/sacred-aura.lua +104 -0
  203. package/engine/object-data/entry/ability-type/soul-burn.d.ts +22 -0
  204. package/engine/object-data/entry/ability-type/soul-burn.lua +79 -0
  205. package/engine/object-data/entry/ability-type/soul-lantern.d.ts +30 -0
  206. package/engine/object-data/entry/ability-type/soul-lantern.lua +117 -0
  207. package/engine/object-data/entry/ability-type/spell-amp.d.ts +15 -0
  208. package/engine/object-data/entry/ability-type/spell-amp.lua +52 -0
  209. package/engine/object-data/entry/ability-type/spell-critical-strike.d.ts +12 -0
  210. package/engine/object-data/entry/ability-type/spell-critical-strike.lua +39 -0
  211. package/engine/object-data/entry/ability-type/spell-vamp.d.ts +12 -0
  212. package/engine/object-data/entry/ability-type/spell-vamp.lua +39 -0
  213. package/engine/object-data/entry/ability-type/stackable-evasion.d.ts +9 -0
  214. package/engine/object-data/entry/ability-type/stackable-evasion.lua +13 -0
  215. package/engine/object-data/entry/ability-type/stackable-hardened-skin.d.ts +21 -0
  216. package/engine/object-data/entry/ability-type/stackable-hardened-skin.lua +78 -0
  217. package/engine/object-data/entry/ability-type/stackable-life-steal.d.ts +9 -0
  218. package/engine/object-data/entry/ability-type/stackable-life-steal.lua +26 -0
  219. package/engine/object-data/entry/ability-type/stackable-spell-damage-reduction.d.ts +9 -0
  220. package/engine/object-data/entry/ability-type/stackable-spell-damage-reduction.lua +13 -0
  221. package/engine/object-data/entry/ability-type/stackable-thorn-shield.d.ts +9 -0
  222. package/engine/object-data/entry/ability-type/stackable-thorn-shield.lua +13 -0
  223. package/engine/object-data/entry/ability-type/stat-details.d.ts +12 -0
  224. package/engine/object-data/entry/ability-type/stat-details.lua +27 -0
  225. package/engine/object-data/entry/ability-type/surge-of-light.d.ts +33 -0
  226. package/engine/object-data/entry/ability-type/surge-of-light.lua +130 -0
  227. package/engine/object-data/entry/ability-type/sweeping-strike.d.ts +57 -0
  228. package/engine/object-data/entry/ability-type/sweeping-strike.lua +234 -0
  229. package/engine/object-data/entry/ability-type/talents.d.ts +12 -0
  230. package/engine/object-data/entry/ability-type/talents.lua +27 -0
  231. package/engine/object-data/entry/ability-type/unyielding-guard.d.ts +30 -0
  232. package/engine/object-data/entry/ability-type/unyielding-guard.lua +117 -0
  233. package/engine/object-data/entry/ability-type/valiant-charge.d.ts +27 -0
  234. package/engine/object-data/entry/ability-type/valiant-charge.lua +104 -0
  235. package/engine/object-data/entry/ability-type/warcry.d.ts +9 -0
  236. package/engine/object-data/entry/ability-type/warcry.lua +26 -0
  237. package/engine/object-data/entry/ability-type/withering-fire.d.ts +21 -0
  238. package/engine/object-data/entry/ability-type/withering-fire.lua +78 -0
  239. package/engine/object-data/entry/ability-type.d.ts +25 -6
  240. package/engine/object-data/entry/ability-type.lua +244 -8
  241. package/engine/object-data/entry/buff-type/applicable.lua +113 -109
  242. package/engine/object-data/entry/buff-type.d.ts +6 -2
  243. package/engine/object-data/entry/buff-type.lua +26 -0
  244. package/engine/object-data/entry/destructible-type.d.ts +6 -2
  245. package/engine/object-data/entry/destructible-type.lua +26 -0
  246. package/engine/object-data/entry/item-type.d.ts +18 -3
  247. package/engine/object-data/entry/item-type.lua +84 -0
  248. package/engine/object-data/entry/lightning-type.d.ts +6 -8
  249. package/engine/object-data/entry/lightning-type.lua +1 -1
  250. package/engine/object-data/entry/sound-preset.d.ts +2 -2
  251. package/engine/object-data/entry/unit-type.d.ts +47 -2
  252. package/engine/object-data/entry/unit-type.lua +383 -49
  253. package/engine/object-data/entry/upgrade.d.ts +2 -2
  254. package/engine/object-data/entry.d.ts +6 -1
  255. package/engine/object-data/entry.lua +8 -0
  256. package/engine/object-field/ability.lua +2 -2
  257. package/engine/object-field/item.d.ts +22 -0
  258. package/engine/object-field/item.lua +118 -0
  259. package/engine/object-field.d.ts +1 -1
  260. package/engine/object-field.lua +9 -7
  261. package/engine/random.d.ts +1 -0
  262. package/engine/random.lua +8 -0
  263. package/engine/standard/entries/ability-type.d.ts +3102 -7
  264. package/engine/standard/entries/ability-type.lua +0 -6
  265. package/engine/standard/entries/buff-type.d.ts +45 -0
  266. package/engine/standard/entries/buff-type.lua +43 -0
  267. package/engine/standard/entries/item-type.d.ts +1299 -0
  268. package/engine/standard/entries/item-type.lua +2 -0
  269. package/engine/standard/entries/lightning-type.d.ts +42 -15
  270. package/engine/standard/entries/lightning-type.lua +0 -14
  271. package/engine/standard/entries/unit-type.d.ts +5 -0
  272. package/engine/standard/entries/unit-type.lua +5 -0
  273. package/engine/standard/fields/item.d.ts +4 -0
  274. package/engine/standard/fields/item.lua +6 -0
  275. package/engine/unit.d.ts +6 -1
  276. package/engine/unit.lua +6 -1
  277. package/event.d.ts +1 -1
  278. package/lualib_bundle.lua +1 -1
  279. package/math.d.ts +2 -0
  280. package/math.lua +14 -0
  281. package/network.lua +25 -1
  282. package/objutil/buff.lua +10 -8
  283. package/objutil/object.lua +1 -1
  284. package/operation.d.ts +8 -1
  285. package/operation.lua +38 -18
  286. package/package.json +3 -23
  287. package/patch-lua.lua +15 -0
  288. package/utility/linked-map.d.ts +35 -0
  289. package/utility/linked-map.lua +107 -0
  290. package/utility/linked-set.d.ts +3 -1
  291. package/utility/linked-set.lua +27 -0
  292. package/utility/random.d.ts +102 -0
  293. package/utility/random.lua +273 -0
  294. package/utility/records.lua +20 -1
  295. package/utility/unordered-map.d.ts +27 -0
  296. package/utility/unordered-map.lua +99 -0
  297. package/engine/internal/unit/item.lua +0 -78
  298. /package/engine/internal/{object-data/armor-increase.d.ts → misc/unit-ability-level-natives.d.ts} +0 -0
  299. /package/engine/internal/object-data/{armor-increase.lua → armor-bonus.lua} +0 -0
  300. /package/engine/object-data/entry/ability-type/{attribute-increase.d.ts → attribute-bonus.d.ts} +0 -0
  301. /package/engine/object-data/entry/ability-type/{attribute-increase.lua → attribute-bonus.lua} +0 -0
package/engine/buff.lua CHANGED
@@ -42,6 +42,7 @@ local BuffType = ____buff_2Dtype.BuffType
42
42
  local ____unit = require("engine.behaviour.unit")
43
43
  local UnitBehavior = ____unit.UnitBehavior
44
44
  local ____arrays = require("utility.arrays")
45
+ local emptyArray = ____arrays.emptyArray
45
46
  local forEach = ____arrays.forEach
46
47
  local ____event = require("event")
47
48
  local Event = ____event.Event
@@ -55,6 +56,8 @@ local ____ability = require("engine.standard.fields.ability")
55
56
  local COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD = ____ability.COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD
56
57
  local ____ability = require("engine.behaviour.ability")
57
58
  local AbilityBehavior = ____ability.AbilityBehavior
59
+ local ____records = require("utility.records")
60
+ local sortedKeysUnnested = ____records.sortedKeysUnnested
58
61
  local getUnitAbility = BlzGetUnitAbility
59
62
  local stringValueByBuffTypeIdByFieldId = postcompile(function()
60
63
  local stringValueByBuffTypeIdByFieldId = {}
@@ -100,7 +103,8 @@ local buffParametersKeys = {
100
103
  damageIncrease = true,
101
104
  damageIncreaseFactor = true,
102
105
  armorIncrease = true,
103
- armorIncreaseFactor = true,
106
+ maxHealthIncrease = true,
107
+ maxManaIncrease = true,
104
108
  attackSpeedIncreaseFactor = true,
105
109
  movementSpeedIncreaseFactor = true,
106
110
  manaRegenerationRateIncreaseFactor = true,
@@ -123,6 +127,9 @@ local buffParametersKeys = {
123
127
  maximumAutoAttackCount = true,
124
128
  maximumDamageDealtEventCount = true,
125
129
  maximumDamageReceivedEventCount = true,
130
+ absorbedDamageFactor = true,
131
+ maximumDamageAbsorbed = true,
132
+ destroysOnMaximumDamageAbsorbed = true,
126
133
  uniqueGroup = true,
127
134
  damageOnExpiration = true,
128
135
  healingOnExpiration = true,
@@ -179,6 +186,7 @@ local function resolveAndSetNumberValue(buff, property, ability, level, value, d
179
186
  end
180
187
  end
181
188
  local buffBooleanParameters = {
189
+ "destroysOnMaximumDamageAbsorbed",
182
190
  "turnsIntoGhost",
183
191
  "stuns",
184
192
  "ignoresStunImmunity",
@@ -194,6 +202,8 @@ local buffNumberParameters = {
194
202
  "manaRegenerationRateIncreaseFactor",
195
203
  "evasionProbability",
196
204
  "armorIncrease",
205
+ "maxHealthIncrease",
206
+ "maxManaIncrease",
197
207
  "damageFactor",
198
208
  "receivedDamageFactor",
199
209
  "maximumAutoAttackCount",
@@ -207,6 +217,8 @@ local buffNumberParameters = {
207
217
  "healingOverDuration",
208
218
  "damageOnExpiration",
209
219
  "healingOnExpiration",
220
+ "absorbedDamageFactor",
221
+ "maximumDamageAbsorbed",
210
222
  "abilityCooldownFactor"
211
223
  }
212
224
  local unsuccessfulApplicationMarker = {}
@@ -242,6 +254,10 @@ local function destroyBuff(buff)
242
254
  buff:destroy()
243
255
  end
244
256
  local function expireBuff(buff)
257
+ if buff.isDestroyed or buff[100] ~= 1 then
258
+ return
259
+ end
260
+ buff[100] = 2
245
261
  local remainingDamageOverDuration = buff[113] or 0
246
262
  local remainingHealingOverDuration = buff[113] or 0
247
263
  if remainingDamageOverDuration ~= 0 or remainingHealingOverDuration ~= 0 then
@@ -385,14 +401,15 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
385
401
  local missProbability = parameters and parameters.missProbability or defaultParameters.missProbability
386
402
  if missProbability ~= nil then
387
403
  missProbability = resolveNumberValue(ability, level, missProbability)
388
- self[142] = missProbability
404
+ self[146] = missProbability
389
405
  end
390
406
  local buffByTypeId = buffByTypeIdByUnit[_unit]
391
407
  if buffByTypeId == nil then
392
408
  buffByTypeId = {}
393
409
  buffByTypeIdByUnit[_unit] = buffByTypeId
394
410
  end
395
- local ____opt_15 = buffByTypeId[typeId]
411
+ self.previousBuff = buffByTypeId[typeId]
412
+ local ____opt_15 = self.previousBuff
396
413
  if ____opt_15 ~= nil then
397
414
  ____opt_15:destroy()
398
415
  end
@@ -468,24 +485,22 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
468
485
  abilityTypeIds = {}
469
486
  self._abilityTypeIds = abilityTypeIds
470
487
  end
471
- for abilityTypeId, abilityParameters in pairs(parametersAbilityTypeIds) do
488
+ for ____, abilityTypeId in ipairs(sortedKeysUnnested(parametersAbilityTypeIds)) do
489
+ local abilityParameters = checkNotNull(parametersAbilityTypeIds[abilityTypeId])
472
490
  local addedAbility = _unit:addAbility(abilityTypeId)
473
491
  if addedAbility ~= nil then
474
492
  _unit:makeAbilityPermanent(abilityTypeId, true)
475
493
  _unit:setAbilityLevel(abilityTypeId, 1 + (abilityParameters.level or ability and ability.level or 0))
476
- for abilityParameterKey, abilityParameterValue in pairs(abilityParameters) do
477
- if abilityParameterKey == "isButtonVisible" then
478
- if not resolveBooleanValue(ability, level, abilityParameterValue) then
479
- _unit:hideAbility(abilityTypeId, true)
480
- end
481
- elseif abilityParameterKey ~= "level" then
482
- abilityParameterKey:setValue(
483
- addedAbility,
484
- resolveNumberValue(ability, level, abilityParameterValue)
485
- )
486
- end
494
+ if abilityParameters.isButtonVisible == false then
495
+ _unit:hideAbility(abilityTypeId, true)
487
496
  end
488
- abilityTypeIds[abilityTypeId] = true
497
+ for ____, field in ipairs(abilityParameters.fields or emptyArray()) do
498
+ field[1]:setValue(
499
+ addedAbility,
500
+ resolveNumberValue(ability, level, field[2])
501
+ )
502
+ end
503
+ abilityTypeIds[#abilityTypeIds + 1] = abilityTypeId
489
504
  end
490
505
  end
491
506
  local behaviorConstructors = parameters and parameters.behaviorConstructors or defaultParameters.behaviorConstructors
@@ -497,18 +512,20 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
497
512
  self._behaviors = behaviors
498
513
  end
499
514
  end
500
- local additionalParameters = {}
501
- for key, value in pairs(parameters) do
502
- if not buffParametersKeys[key] then
503
- if ability then
504
- additionalParameters[key] = resolveCurrentAbilityDependentValue(ability, value)
505
- else
506
- additionalParameters[key] = value
515
+ if parameters ~= nil then
516
+ local additionalParameters = {}
517
+ for ____, key in ipairs(sortedKeysUnnested(parameters)) do
518
+ if not buffParametersKeys[key] then
519
+ if ability then
520
+ additionalParameters[key] = resolveCurrentAbilityDependentValue(ability, parameters[key])
521
+ else
522
+ additionalParameters[key] = parameters[key]
523
+ end
507
524
  end
508
525
  end
509
- end
510
- if (next(additionalParameters)) ~= nil then
511
- self.parameters = additionalParameters
526
+ if (next(additionalParameters)) ~= nil then
527
+ self.parameters = additionalParameters
528
+ end
512
529
  end
513
530
  end
514
531
  if duration ~= nil and duration > 0 then
@@ -522,7 +539,7 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
522
539
  end
523
540
  function Buff.prototype.onAbilityGained(self, ability)
524
541
  if __TS__InstanceOf(ability, UnitAbility) then
525
- local abilityCooldownModifier = self[144]
542
+ local abilityCooldownModifier = self[148]
526
543
  if abilityCooldownModifier then
527
544
  COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:applyModifier(ability, abilityCooldownModifier)
528
545
  end
@@ -530,24 +547,38 @@ function Buff.prototype.onAbilityGained(self, ability)
530
547
  end
531
548
  function Buff.prototype.onAbilityLost(self, ability)
532
549
  if __TS__InstanceOf(ability, UnitAbility) then
533
- local abilityCooldownModifier = self[144]
550
+ local abilityCooldownModifier = self[148]
534
551
  if abilityCooldownModifier then
535
552
  COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, abilityCooldownModifier)
536
553
  end
537
554
  end
538
555
  end
539
556
  function Buff.prototype.flashEffect(self, widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
557
+ self:flash(
558
+ self[105],
559
+ stringValueByBuffTypeIdByFieldId[fourCC("feft")][self.typeId] or "origin",
560
+ widgetOrXOrParametersOrDuration,
561
+ yOrParametersOrDuration,
562
+ parametersOrDuration
563
+ )
564
+ end
565
+ function Buff.prototype.flashSpecialEffect(self, widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
566
+ self:flash(
567
+ self[106],
568
+ stringValueByBuffTypeIdByFieldId[fourCC("fspt")][self.typeId] or "origin",
569
+ widgetOrXOrParametersOrDuration,
570
+ yOrParametersOrDuration,
571
+ parametersOrDuration
572
+ )
573
+ end
574
+ function Buff.prototype.flash(self, modelPath, attachmentPoint, widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
540
575
  if type(widgetOrXOrParametersOrDuration) == "number" and type(yOrParametersOrDuration) == "number" then
541
- Effect:flash(self[105], widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
576
+ Effect:flash(modelPath, widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
542
577
  else
543
578
  local isWidgetProvided = __TS__InstanceOf(widgetOrXOrParametersOrDuration, Unit) or __TS__InstanceOf(widgetOrXOrParametersOrDuration, Item) or __TS__InstanceOf(widgetOrXOrParametersOrDuration, Destructable)
544
579
  local ____Effect_40 = Effect
545
580
  local ____Effect_flash_41 = Effect.flash
546
- local ____array_39 = __TS__SparseArrayNew(
547
- self[105],
548
- isWidgetProvided and widgetOrXOrParametersOrDuration or self._unit,
549
- stringValueByBuffTypeIdByFieldId[fourCC("feft")][self.typeId] or "origin"
550
- )
581
+ local ____array_39 = __TS__SparseArrayNew(modelPath, isWidgetProvided and widgetOrXOrParametersOrDuration or self._unit, attachmentPoint)
551
582
  local ____isWidgetProvided_38
552
583
  if isWidgetProvided then
553
584
  ____isWidgetProvided_38 = yOrParametersOrDuration
@@ -561,26 +592,22 @@ function Buff.prototype.flashEffect(self, widgetOrXOrParametersOrDuration, yOrPa
561
592
  )
562
593
  end
563
594
  end
564
- function Buff.prototype.flashSpecialEffect(self, widgetOrDuration, duration)
565
- local isWidgetProvided = type(widgetOrDuration) == "table"
566
- local ____Effect_44 = Effect
567
- local ____Effect_flash_45 = Effect.flash
568
- local ____array_43 = __TS__SparseArrayNew(
569
- self[106],
570
- isWidgetProvided and widgetOrDuration or self._unit,
571
- stringValueByBuffTypeIdByFieldId[fourCC("fspt")][self.typeId] or "origin"
572
- )
573
- local ____isWidgetProvided_42
574
- if isWidgetProvided then
575
- ____isWidgetProvided_42 = duration
576
- else
577
- ____isWidgetProvided_42 = widgetOrDuration
595
+ function Buff.prototype.expire(self)
596
+ expireBuff(self)
597
+ end
598
+ function Buff.prototype.dispel(self, source)
599
+ if self.isDestroyed or self[100] ~= 1 then
600
+ return
601
+ end
602
+ self[100] = 2
603
+ do
604
+ pcall(function()
605
+ self:onDispel(source)
606
+ end)
607
+ do
608
+ self:destroy()
609
+ end
578
610
  end
579
- __TS__SparseArrayPush(____array_43, ____isWidgetProvided_42)
580
- ____Effect_flash_45(
581
- ____Effect_44,
582
- __TS__SparseArraySpread(____array_43)
583
- )
584
611
  end
585
612
  function Buff.prototype.onCreate(self)
586
613
  end
@@ -610,29 +637,29 @@ function Buff.prototype.onDestroy(self)
610
637
  behavior:destroy()
611
638
  end
612
639
  end
613
- local previousAbilityCooldownModifier = self[144]
640
+ local previousAbilityCooldownModifier = self[148]
614
641
  if previousAbilityCooldownModifier then
615
642
  for ____, ability in ipairs(self._unit.abilities) do
616
643
  COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, previousAbilityCooldownModifier)
617
644
  end
618
645
  end
619
- if self[139] then
646
+ if self[143] then
620
647
  unit:decrementInvulnerabilityCounter()
621
648
  end
622
- if self[138] then
649
+ if self[142] then
623
650
  unit:decrementDisableAutoAttackCounter()
624
651
  end
625
- if self[136] then
626
- if self[137] then
652
+ if self[140] then
653
+ if self[141] then
627
654
  unit:decrementForceStunCounter()
628
655
  end
629
656
  unit:decrementStunCounter()
630
657
  end
631
- if self[135] then
658
+ if self[139] then
632
659
  unit:decrementGhostCounter()
633
660
  end
634
661
  if self._abilityTypeIds ~= nil then
635
- for abilityTypeId in pairs(self._abilityTypeIds) do
662
+ for ____, abilityTypeId in ipairs(self._abilityTypeIds) do
636
663
  unit:removeAbility(abilityTypeId)
637
664
  end
638
665
  end
@@ -665,13 +692,15 @@ function Buff.apply(self, ...)
665
692
  end
666
693
  end
667
694
  function Buff.getByTypeId(self, unit, typeId)
668
- local ____opt_46 = buffByTypeIdByUnit[unit]
669
- local buff = ____opt_46 and ____opt_46[typeId]
695
+ local ____opt_42 = buffByTypeIdByUnit[unit]
696
+ local buff = ____opt_42 and ____opt_42[typeId]
670
697
  if __TS__InstanceOf(buff, self) then
671
698
  return buff
672
699
  end
673
700
  return nil
674
701
  end
702
+ function Buff.prototype.onDispel(self, source)
703
+ end
675
704
  function Buff.prototype.onExpiration(self)
676
705
  local unit = self.unit
677
706
  if self[120] ~= nil then
@@ -680,9 +709,9 @@ function Buff.prototype.onExpiration(self)
680
709
  if self[121] ~= nil then
681
710
  (self[102] or unit):healTarget(unit, self[120] or 0)
682
711
  end
683
- if self[141] then
712
+ if self[145] then
684
713
  unit:explode()
685
- elseif self[140] then
714
+ elseif self[144] then
686
715
  unit:kill()
687
716
  end
688
717
  end
@@ -737,6 +766,18 @@ function Buff.prototype.onDamageDealt(self, target, event)
737
766
  end
738
767
  function Buff.prototype.onDamageReceived(self, source, event)
739
768
  if event.originalAmount ~= 0 then
769
+ local absorbedDamage = min(event.amount * (self[135] or 1), (self[136] or 0) - (self[137] or 0))
770
+ if absorbedDamage > 0 then
771
+ event.amount = event.amount - absorbedDamage
772
+ self[137] = (self[137] or 0) + absorbedDamage
773
+ local ____self__138_44 = self[138]
774
+ if ____self__138_44 == nil then
775
+ ____self__138_44 = true
776
+ end
777
+ if ____self__138_44 and self[137] >= (self[136] or 0) then
778
+ self:destroy()
779
+ end
780
+ end
740
781
  local damageReceivedEventCount = (self[133] or 0) + 1
741
782
  self[133] = damageReceivedEventCount
742
783
  if damageReceivedEventCount == self[134] then
@@ -824,8 +865,8 @@ __TS__SetDescriptor(
824
865
  return
825
866
  end
826
867
  self[112] = damageInterval
827
- local ____opt_48 = self._timer
828
- local elapsed = ____opt_48 and ____opt_48.elapsed or 0
868
+ local ____opt_45 = self._timer
869
+ local elapsed = ____opt_45 and ____opt_45.elapsed or 0
829
870
  local timer = self[114]
830
871
  if timer == nil then
831
872
  timer = Timer:create()
@@ -904,8 +945,8 @@ __TS__SetDescriptor(
904
945
  return
905
946
  end
906
947
  self[117] = healingInterval
907
- local ____opt_50 = self._timer
908
- local elapsed = ____opt_50 and ____opt_50.elapsed or 0
948
+ local ____opt_47 = self._timer
949
+ local elapsed = ____opt_47 and ____opt_47.elapsed or 0
909
950
  local timer = self[119]
910
951
  if timer == nil then
911
952
  timer = Timer:create()
@@ -986,24 +1027,50 @@ __TS__SetDescriptor(
986
1027
  },
987
1028
  true
988
1029
  )
1030
+ __TS__SetDescriptor(
1031
+ Buff.prototype,
1032
+ "maxHealthIncrease",
1033
+ {
1034
+ get = function(self)
1035
+ return self:getUnitBonus(UnitBonusType.HEALTH)
1036
+ end,
1037
+ set = function(self, maxHealthIncrease)
1038
+ self:addOrUpdateOrRemoveUnitBonus(UnitBonusType.HEALTH, maxHealthIncrease)
1039
+ end
1040
+ },
1041
+ true
1042
+ )
1043
+ __TS__SetDescriptor(
1044
+ Buff.prototype,
1045
+ "maxManaIncrease",
1046
+ {
1047
+ get = function(self)
1048
+ return self:getUnitBonus(UnitBonusType.MANA)
1049
+ end,
1050
+ set = function(self, maxManaIncrease)
1051
+ self:addOrUpdateOrRemoveUnitBonus(UnitBonusType.MANA, maxManaIncrease)
1052
+ end
1053
+ },
1054
+ true
1055
+ )
989
1056
  __TS__SetDescriptor(
990
1057
  Buff.prototype,
991
1058
  "turnsIntoGhost",
992
1059
  {
993
1060
  get = function(self)
994
- local ____self__135_52 = self[135]
995
- if ____self__135_52 == nil then
996
- ____self__135_52 = false
1061
+ local ____self__139_49 = self[139]
1062
+ if ____self__139_49 == nil then
1063
+ ____self__139_49 = false
997
1064
  end
998
- return ____self__135_52
1065
+ return ____self__139_49
999
1066
  end,
1000
1067
  set = function(self, turnsIntoGhost)
1001
- if not turnsIntoGhost and self[135] then
1068
+ if not turnsIntoGhost and self[139] then
1002
1069
  self.object:decrementGhostCounter()
1003
- self[135] = nil
1004
- elseif turnsIntoGhost and not self[135] then
1070
+ self[139] = nil
1071
+ elseif turnsIntoGhost and not self[139] then
1005
1072
  self.object:incrementGhostCounter()
1006
- self[135] = true
1073
+ self[139] = true
1007
1074
  end
1008
1075
  end
1009
1076
  },
@@ -1014,25 +1081,25 @@ __TS__SetDescriptor(
1014
1081
  "stuns",
1015
1082
  {
1016
1083
  get = function(self)
1017
- local ____self__136_53 = self[136]
1018
- if ____self__136_53 == nil then
1019
- ____self__136_53 = false
1084
+ local ____self__140_50 = self[140]
1085
+ if ____self__140_50 == nil then
1086
+ ____self__140_50 = false
1020
1087
  end
1021
- return ____self__136_53
1088
+ return ____self__140_50
1022
1089
  end,
1023
1090
  set = function(self, stuns)
1024
- if not stuns and self[136] then
1025
- if self[137] then
1091
+ if not stuns and self[140] then
1092
+ if self[141] then
1026
1093
  self.object:decrementForceStunCounter()
1027
1094
  end
1028
1095
  self.object:decrementStunCounter()
1029
- self[136] = nil
1030
- elseif stuns and not self[136] then
1031
- if self[137] then
1096
+ self[140] = nil
1097
+ elseif stuns and not self[140] then
1098
+ if self[141] then
1032
1099
  self.object:incrementForceStunCounter()
1033
1100
  end
1034
1101
  self.object:incrementStunCounter()
1035
- self[136] = true
1102
+ self[140] = true
1036
1103
  end
1037
1104
  end
1038
1105
  },
@@ -1043,23 +1110,23 @@ __TS__SetDescriptor(
1043
1110
  "ignoresStunImmunity",
1044
1111
  {
1045
1112
  get = function(self)
1046
- local ____self__137_54 = self[137]
1047
- if ____self__137_54 == nil then
1048
- ____self__137_54 = false
1113
+ local ____self__141_51 = self[141]
1114
+ if ____self__141_51 == nil then
1115
+ ____self__141_51 = false
1049
1116
  end
1050
- return ____self__137_54
1117
+ return ____self__141_51
1051
1118
  end,
1052
1119
  set = function(self, ignoresStunImmunity)
1053
- if not ignoresStunImmunity and self[137] then
1054
- if self[136] then
1120
+ if not ignoresStunImmunity and self[141] then
1121
+ if self[140] then
1055
1122
  self.object:decrementForceStunCounter()
1056
1123
  end
1057
- self[137] = nil
1058
- elseif ignoresStunImmunity and not self[137] then
1059
- if self[136] then
1124
+ self[141] = nil
1125
+ elseif ignoresStunImmunity and not self[141] then
1126
+ if self[140] then
1060
1127
  self.object:incrementForceStunCounter()
1061
1128
  end
1062
- self[137] = true
1129
+ self[141] = true
1063
1130
  end
1064
1131
  end
1065
1132
  },
@@ -1070,19 +1137,19 @@ __TS__SetDescriptor(
1070
1137
  "disablesAutoAttack",
1071
1138
  {
1072
1139
  get = function(self)
1073
- local ____self__138_55 = self[138]
1074
- if ____self__138_55 == nil then
1075
- ____self__138_55 = false
1140
+ local ____self__142_52 = self[142]
1141
+ if ____self__142_52 == nil then
1142
+ ____self__142_52 = false
1076
1143
  end
1077
- return ____self__138_55
1144
+ return ____self__142_52
1078
1145
  end,
1079
1146
  set = function(self, disablesAutoAttack)
1080
- if not disablesAutoAttack and self[138] then
1147
+ if not disablesAutoAttack and self[142] then
1081
1148
  self.object:decrementDisableAutoAttackCounter()
1082
- self[138] = nil
1083
- elseif disablesAutoAttack and not self[138] then
1149
+ self[142] = nil
1150
+ elseif disablesAutoAttack and not self[142] then
1084
1151
  self.object:incrementDisableAutoAttackCounter()
1085
- self[138] = true
1152
+ self[142] = true
1086
1153
  end
1087
1154
  end
1088
1155
  },
@@ -1093,19 +1160,19 @@ __TS__SetDescriptor(
1093
1160
  "providesInvulnerability",
1094
1161
  {
1095
1162
  get = function(self)
1096
- local ____self__139_56 = self[139]
1097
- if ____self__139_56 == nil then
1098
- ____self__139_56 = false
1163
+ local ____self__143_53 = self[143]
1164
+ if ____self__143_53 == nil then
1165
+ ____self__143_53 = false
1099
1166
  end
1100
- return ____self__139_56
1167
+ return ____self__143_53
1101
1168
  end,
1102
1169
  set = function(self, providesInvulnerability)
1103
- if not providesInvulnerability and self[139] then
1170
+ if not providesInvulnerability and self[143] then
1104
1171
  self.object:decrementInvulnerabilityCounter()
1105
- self[139] = nil
1106
- elseif providesInvulnerability and not self[139] then
1172
+ self[143] = nil
1173
+ elseif providesInvulnerability and not self[143] then
1107
1174
  self.object:incrementInvulnerabilityCounter()
1108
- self[139] = true
1175
+ self[143] = true
1109
1176
  end
1110
1177
  end
1111
1178
  },
@@ -1116,17 +1183,17 @@ __TS__SetDescriptor(
1116
1183
  "killsOnExpiration",
1117
1184
  {
1118
1185
  get = function(self)
1119
- local ____self__140_57 = self[140]
1120
- if ____self__140_57 == nil then
1121
- ____self__140_57 = false
1186
+ local ____self__144_54 = self[144]
1187
+ if ____self__144_54 == nil then
1188
+ ____self__144_54 = false
1122
1189
  end
1123
- return ____self__140_57
1190
+ return ____self__144_54
1124
1191
  end,
1125
1192
  set = function(self, killsOnExpiration)
1126
- if not killsOnExpiration and self[140] then
1127
- self[140] = nil
1128
- elseif killsOnExpiration and not self[140] then
1129
- self[140] = true
1193
+ if not killsOnExpiration and self[144] then
1194
+ self[144] = nil
1195
+ elseif killsOnExpiration and not self[144] then
1196
+ self[144] = true
1130
1197
  end
1131
1198
  end
1132
1199
  },
@@ -1137,17 +1204,17 @@ __TS__SetDescriptor(
1137
1204
  "explodesOnExpiration",
1138
1205
  {
1139
1206
  get = function(self)
1140
- local ____self__141_58 = self[141]
1141
- if ____self__141_58 == nil then
1142
- ____self__141_58 = false
1207
+ local ____self__145_55 = self[145]
1208
+ if ____self__145_55 == nil then
1209
+ ____self__145_55 = false
1143
1210
  end
1144
- return ____self__141_58
1211
+ return ____self__145_55
1145
1212
  end,
1146
1213
  set = function(self, killsOnExpiration)
1147
- if not killsOnExpiration and self[141] then
1148
- self[141] = nil
1149
- elseif killsOnExpiration and not self[141] then
1150
- self[141] = true
1214
+ if not killsOnExpiration and self[145] then
1215
+ self[145] = nil
1216
+ elseif killsOnExpiration and not self[145] then
1217
+ self[145] = true
1151
1218
  end
1152
1219
  end
1153
1220
  },
@@ -1272,9 +1339,23 @@ __TS__SetDescriptor(
1272
1339
  __TS__SetDescriptor(
1273
1340
  Buff.prototype,
1274
1341
  "duration",
1275
- {get = function(self)
1276
- return self[103]
1277
- end},
1342
+ {
1343
+ get = function(self)
1344
+ return self[103]
1345
+ end,
1346
+ set = function(self, duration)
1347
+ if duration <= 0 then
1348
+ local timer = self._timer
1349
+ if timer ~= nil then
1350
+ timer:destroy()
1351
+ self._timer = nil
1352
+ end
1353
+ self[103] = 0
1354
+ else
1355
+ self.remainingDuration = self.remainingDuration + (duration - self[103])
1356
+ end
1357
+ end
1358
+ },
1278
1359
  true
1279
1360
  )
1280
1361
  __TS__SetDescriptor(
@@ -1282,13 +1363,13 @@ __TS__SetDescriptor(
1282
1363
  "remainingDuration",
1283
1364
  {
1284
1365
  get = function(self)
1285
- local ____opt_59 = self._timer
1286
- return ____opt_59 and ____opt_59.remaining or 0
1366
+ local ____opt_56 = self._timer
1367
+ return ____opt_56 and ____opt_56.remaining or 0
1287
1368
  end,
1288
1369
  set = function(self, remainingDuration)
1289
- local ____remainingDuration_63 = remainingDuration
1290
- local ____opt_61 = self._timer
1291
- local remainingDurationDelta = ____remainingDuration_63 - (____opt_61 and ____opt_61.remaining or 0)
1370
+ local ____remainingDuration_60 = remainingDuration
1371
+ local ____opt_58 = self._timer
1372
+ local remainingDurationDelta = ____remainingDuration_60 - (____opt_58 and ____opt_58.remaining or 0)
1292
1373
  if remainingDurationDelta ~= 0 then
1293
1374
  self[103] = self[103] + remainingDurationDelta
1294
1375
  if remainingDuration <= 0 then
@@ -1303,7 +1384,7 @@ __TS__SetDescriptor(
1303
1384
  remainingDuration,
1304
1385
  self._spellStealPriority,
1305
1386
  self._learnLevelMinimum,
1306
- self[142]
1387
+ self[146]
1307
1388
  ) then
1308
1389
  local timer = self._timer
1309
1390
  if timer == nil then
@@ -1318,15 +1399,80 @@ __TS__SetDescriptor(
1318
1399
  },
1319
1400
  true
1320
1401
  )
1402
+ __TS__SetDescriptor(
1403
+ Buff.prototype,
1404
+ "absorbedDamageFactor",
1405
+ {
1406
+ get = function(self)
1407
+ return self[135] or 1
1408
+ end,
1409
+ set = function(self, absorbedDamageFactor)
1410
+ if absorbedDamageFactor == 1 then
1411
+ self[135] = nil
1412
+ else
1413
+ self[135] = absorbedDamageFactor
1414
+ end
1415
+ end
1416
+ },
1417
+ true
1418
+ )
1419
+ __TS__SetDescriptor(
1420
+ Buff.prototype,
1421
+ "maximumDamageAbsorbed",
1422
+ {
1423
+ get = function(self)
1424
+ return self[136] or 0
1425
+ end,
1426
+ set = function(self, maximumDamageAbsorbed)
1427
+ if maximumDamageAbsorbed == 0 then
1428
+ self[136] = nil
1429
+ else
1430
+ self[136] = maximumDamageAbsorbed
1431
+ end
1432
+ end
1433
+ },
1434
+ true
1435
+ )
1436
+ __TS__SetDescriptor(
1437
+ Buff.prototype,
1438
+ "damageAbsorbed",
1439
+ {get = function(self)
1440
+ return self[137] or 0
1441
+ end},
1442
+ true
1443
+ )
1444
+ __TS__SetDescriptor(
1445
+ Buff.prototype,
1446
+ "destroysOnMaximumDamageAbsorbed",
1447
+ {
1448
+ get = function(self)
1449
+ local ____self__138_61 = self[138]
1450
+ if ____self__138_61 == nil then
1451
+ ____self__138_61 = true
1452
+ end
1453
+ return ____self__138_61
1454
+ end,
1455
+ set = function(self, destroysOnMaximumDamageAbsorbed)
1456
+ local ____destroysOnMaximumDamageAbsorbed_62
1457
+ if destroysOnMaximumDamageAbsorbed then
1458
+ ____destroysOnMaximumDamageAbsorbed_62 = nil
1459
+ else
1460
+ ____destroysOnMaximumDamageAbsorbed_62 = false
1461
+ end
1462
+ self[138] = ____destroysOnMaximumDamageAbsorbed_62
1463
+ end
1464
+ },
1465
+ true
1466
+ )
1321
1467
  __TS__SetDescriptor(
1322
1468
  Buff.prototype,
1323
1469
  "abilityCooldownFactor",
1324
1470
  {
1325
1471
  get = function(self)
1326
- return self[143] or 1
1472
+ return self[147] or 1
1327
1473
  end,
1328
1474
  set = function(self, abilityCooldownFactor)
1329
- local previousAbilityCooldownModifier = self[144]
1475
+ local previousAbilityCooldownModifier = self[148]
1330
1476
  if previousAbilityCooldownModifier then
1331
1477
  for ____, ability in ipairs(self._unit.abilities) do
1332
1478
  COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, previousAbilityCooldownModifier)
@@ -1338,8 +1484,8 @@ __TS__SetDescriptor(
1338
1484
  for ____, ability in ipairs(self._unit.abilities) do
1339
1485
  COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:applyModifier(ability, modifier)
1340
1486
  end
1341
- self[144] = modifier
1342
- self[143] = abilityCooldownFactor
1487
+ self[148] = modifier
1488
+ self[147] = abilityCooldownFactor
1343
1489
  end
1344
1490
  },
1345
1491
  true
@@ -1347,35 +1493,40 @@ __TS__SetDescriptor(
1347
1493
  Buff.createdEvent = buffCreatedEvent
1348
1494
  Buff.beingDestroyedEvent = buffBeingDestroyedEvent;
1349
1495
  (function(self)
1350
- local function destroyBuffIfNeeded(buff)
1351
- if getUnitAbility(buff[101].handle, buff.typeId) ~= buff.handle and buff[100] == 1 then
1352
- buff:destroy()
1496
+ local function destroyBuffIfNeeded(buff, isDispel, source)
1497
+ local currentHandle = getUnitAbility(buff[101].handle, buff.typeId)
1498
+ if currentHandle ~= buff.handle and buff[100] == 1 then
1499
+ if isDispel and currentHandle == nil and buff.unit.isAlive and buff.resistanceType == 1 and (buff._timer == nil or buff.remainingDuration > 0) then
1500
+ buff:dispel(source)
1501
+ else
1502
+ buff:destroy()
1503
+ end
1353
1504
  end
1354
1505
  end
1355
- ____exports.checkBuff = function(unit, buffTypeId)
1506
+ ____exports.checkBuff = function(unit, buffTypeId, isDispel, source)
1356
1507
  local buffByTypeId = buffByTypeIdByUnit[unit]
1357
1508
  if buffByTypeId ~= nil then
1358
1509
  local buff = buffByTypeId[buffTypeId]
1359
1510
  if buff ~= nil then
1360
- destroyBuffIfNeeded(buff)
1511
+ destroyBuffIfNeeded(buff, isDispel, source)
1361
1512
  end
1362
1513
  end
1363
1514
  end
1364
- ____exports.checkBuffs = function(unit)
1365
- ____exports.Buff:forAll(unit, destroyBuffIfNeeded)
1515
+ ____exports.checkBuffs = function(unit, isDispel, source)
1516
+ ____exports.Buff:forAll(unit, destroyBuffIfNeeded, isDispel, source)
1366
1517
  end
1367
1518
  Unit.abilityChannelingStartEvent:addListener(
1368
1519
  0,
1369
1520
  function(caster)
1370
- ____exports.checkBuffs(caster)
1371
- Timer:run(____exports.checkBuffs, caster)
1521
+ ____exports.checkBuffs(caster, true, caster)
1522
+ Timer:run(____exports.checkBuffs, caster, true, caster)
1372
1523
  end
1373
1524
  )
1374
1525
  Unit.abilityUnitTargetChannelingStartEvent:addListener(
1375
1526
  0,
1376
1527
  function(caster, ability, target)
1377
- ____exports.checkBuffs(target)
1378
- Timer:run(____exports.checkBuffs, target)
1528
+ ____exports.checkBuffs(target, true, caster)
1529
+ Timer:run(____exports.checkBuffs, target, true, caster)
1379
1530
  end
1380
1531
  )
1381
1532
  Unit.abilityPointTargetChannelingStartEvent:addListener(
@@ -1386,17 +1537,40 @@ Buff.beingDestroyedEvent = buffBeingDestroyedEvent;
1386
1537
  y,
1387
1538
  ability:getField(ABILITY_RLF_AREA_OF_EFFECT)
1388
1539
  )
1389
- forEach(units, ____exports.checkBuffs)
1390
- Timer:run(forEach, units, ____exports.checkBuffs)
1540
+ forEach(units, ____exports.checkBuffs, true, caster)
1541
+ Timer:run(
1542
+ forEach,
1543
+ units,
1544
+ ____exports.checkBuffs,
1545
+ true,
1546
+ caster
1547
+ )
1548
+ end
1549
+ )
1550
+ Unit.abilityNoTargetChannelingStartEvent:addListener(
1551
+ 0,
1552
+ function(caster, ability)
1553
+ local radius = ability:getField(ABILITY_RLF_AREA_OF_EFFECT)
1554
+ if radius > 0 then
1555
+ local units = Unit:getInCollisionRange(caster.x, caster.y, radius)
1556
+ forEach(units, ____exports.checkBuffs, true, caster)
1557
+ Timer:run(
1558
+ forEach,
1559
+ units,
1560
+ ____exports.checkBuffs,
1561
+ true,
1562
+ caster
1563
+ )
1564
+ end
1391
1565
  end
1392
1566
  )
1393
1567
  Unit.onDamage:addListener(
1394
1568
  0,
1395
1569
  function(source, target)
1396
1570
  if source ~= nil then
1397
- ____exports.checkBuffs(source)
1571
+ Timer:run(____exports.checkBuffs, source, false)
1398
1572
  end
1399
- ____exports.checkBuffs(target)
1573
+ Timer:run(____exports.checkBuffs, target, false)
1400
1574
  end
1401
1575
  )
1402
1576
  buffCreatedEvent:addListener(function(buff)