warscript 0.0.1-dev.32c305a → 0.0.1-dev.32e76f5

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 (147) hide show
  1. package/attributes.d.ts +1 -0
  2. package/attributes.lua +9 -0
  3. package/core/types/frame.lua +24 -21
  4. package/core/types/player.d.ts +16 -0
  5. package/core/types/player.lua +60 -15
  6. package/core/types/playerCamera.d.ts +2 -0
  7. package/core/types/playerCamera.lua +123 -5
  8. package/core/types/sound.lua +1 -1
  9. package/core/types/tileCell.d.ts +11 -1
  10. package/core/types/tileCell.lua +97 -0
  11. package/core/types/timer.d.ts +3 -1
  12. package/core/types/timer.lua +27 -2
  13. package/decl/native.d.ts +6 -4
  14. package/destroyable.d.ts +1 -0
  15. package/destroyable.lua +9 -0
  16. package/engine/behavior.d.ts +14 -1
  17. package/engine/behavior.lua +230 -70
  18. package/engine/behaviour/ability/apply-buff.lua +5 -5
  19. package/engine/behaviour/ability/emulate-impact.d.ts +1 -1
  20. package/engine/behaviour/ability/emulate-impact.lua +2 -1
  21. package/engine/behaviour/ability/remove-buffs.d.ts +9 -0
  22. package/engine/behaviour/ability/remove-buffs.lua +21 -0
  23. package/engine/behaviour/ability/restore-mana.d.ts +1 -1
  24. package/engine/behaviour/ability/restore-mana.lua +6 -6
  25. package/engine/behaviour/ability.d.ts +11 -6
  26. package/engine/behaviour/ability.lua +37 -16
  27. package/engine/behaviour/unit/stun-immunity.d.ts +12 -6
  28. package/engine/behaviour/unit/stun-immunity.lua +57 -31
  29. package/engine/behaviour/unit.d.ts +26 -5
  30. package/engine/behaviour/unit.lua +180 -27
  31. package/engine/buff.d.ts +65 -21
  32. package/engine/buff.lua +369 -181
  33. package/engine/internal/ability.d.ts +3 -1
  34. package/engine/internal/ability.lua +34 -11
  35. package/engine/internal/item/ability.lua +51 -1
  36. package/engine/internal/item+owner.lua +12 -6
  37. package/engine/internal/item.d.ts +14 -15
  38. package/engine/internal/item.lua +70 -52
  39. package/engine/internal/mechanics/cast-ability.lua +6 -3
  40. package/engine/internal/misc/frame-coordinates.lua +21 -0
  41. package/engine/internal/misc/get-terrain-z.d.ts +2 -0
  42. package/engine/internal/misc/get-terrain-z.lua +11 -0
  43. package/engine/internal/misc/player-local-handle.d.ts +2 -0
  44. package/engine/internal/misc/player-local-handle.lua +5 -0
  45. package/engine/internal/object-data/armor-bonus.d.ts +2 -0
  46. package/engine/internal/object-data/attribute-bonus.lua +2 -2
  47. package/engine/internal/object-data/health-bonus.d.ts +2 -0
  48. package/engine/internal/object-data/health-bonus.lua +16 -0
  49. package/engine/internal/object-data/mana-bonus.d.ts +2 -0
  50. package/engine/internal/object-data/mana-bonus.lua +16 -0
  51. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.d.ts +2 -0
  52. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.lua +16 -0
  53. package/engine/internal/unit/ability.d.ts +35 -5
  54. package/engine/internal/unit/ability.lua +96 -21
  55. package/engine/internal/unit/attributes.d.ts +17 -0
  56. package/engine/internal/unit/attributes.lua +46 -0
  57. package/engine/internal/unit/bonus.d.ts +6 -0
  58. package/engine/internal/unit/bonus.lua +33 -3
  59. package/engine/internal/unit/fly-height.d.ts +7 -0
  60. package/engine/internal/unit/fly-height.lua +20 -0
  61. package/engine/internal/unit/interrupts.d.ts +12 -0
  62. package/engine/internal/unit/interrupts.lua +28 -0
  63. package/engine/internal/unit/item.lua +1 -1
  64. package/engine/internal/unit/main-selected.lua +12 -27
  65. package/engine/internal/unit/order.d.ts +20 -0
  66. package/engine/internal/unit/order.lua +136 -0
  67. package/engine/internal/unit/range-event.d.ts +12 -0
  68. package/engine/internal/unit/range-event.lua +90 -0
  69. package/engine/internal/unit/scale.d.ts +7 -0
  70. package/engine/internal/unit/scale.lua +20 -0
  71. package/engine/internal/unit+ability.lua +10 -1
  72. package/engine/internal/unit+bonus.lua +3 -3
  73. package/engine/internal/unit-missile-launch.lua +52 -14
  74. package/engine/internal/unit.d.ts +20 -24
  75. package/engine/internal/unit.lua +232 -240
  76. package/engine/local-client.d.ts +2 -0
  77. package/engine/local-client.lua +30 -0
  78. package/engine/object-data/auxiliary/armor-type.d.ts +11 -0
  79. package/engine/object-data/auxiliary/armor-type.lua +46 -0
  80. package/engine/object-data/auxiliary/health-regeneration-type.d.ts +8 -0
  81. package/engine/object-data/auxiliary/health-regeneration-type.lua +2 -0
  82. package/engine/object-data/auxiliary/unit-attribute.lua +1 -1
  83. package/engine/object-data/entry/ability-type/{armor-increase.d.ts → armor-bonus.d.ts} +3 -3
  84. package/engine/object-data/entry/ability-type/{armor-increase.lua → armor-bonus.lua} +9 -9
  85. package/engine/object-data/entry/ability-type/health-bonus.d.ts +8 -0
  86. package/engine/object-data/entry/ability-type/health-bonus.lua +26 -0
  87. package/engine/object-data/entry/ability-type/mana-bonus.d.ts +8 -0
  88. package/engine/object-data/entry/ability-type/mana-bonus.lua +26 -0
  89. package/engine/object-data/entry/ability-type/mana-regeneration.d.ts +8 -0
  90. package/engine/object-data/entry/ability-type/mana-regeneration.lua +26 -0
  91. package/engine/object-data/entry/ability-type/reincarnation.d.ts +8 -0
  92. package/engine/object-data/entry/ability-type/reincarnation.lua +26 -0
  93. package/engine/object-data/entry/ability-type.d.ts +2 -0
  94. package/engine/object-data/entry/ability-type.lua +89 -8
  95. package/engine/object-data/entry/buff-type/applicable.lua +113 -109
  96. package/engine/object-data/entry/destructible-type.d.ts +27 -1
  97. package/engine/object-data/entry/destructible-type.lua +155 -0
  98. package/engine/object-data/entry/unit-type.d.ts +15 -2
  99. package/engine/object-data/entry/unit-type.lua +135 -33
  100. package/engine/object-field/ability.d.ts +3 -3
  101. package/engine/object-field/ability.lua +7 -6
  102. package/engine/object-field/unit.d.ts +31 -5
  103. package/engine/object-field/unit.lua +95 -0
  104. package/engine/object-field.d.ts +17 -6
  105. package/engine/object-field.lua +291 -134
  106. package/engine/random.d.ts +10 -0
  107. package/engine/random.lua +21 -0
  108. package/engine/standard/fields/ability.d.ts +2 -2
  109. package/engine/standard/fields/ability.lua +2 -2
  110. package/engine/standard/fields/unit.d.ts +12 -0
  111. package/engine/standard/fields/unit.lua +20 -0
  112. package/engine/synchronization.d.ts +11 -0
  113. package/engine/synchronization.lua +77 -0
  114. package/engine/text-tag.d.ts +36 -2
  115. package/engine/text-tag.lua +250 -10
  116. package/engine/unit.d.ts +6 -0
  117. package/engine/unit.lua +6 -0
  118. package/lualib_bundle.lua +118 -47
  119. package/net/socket.lua +1 -1
  120. package/objutil/buff.lua +10 -8
  121. package/objutil/object.lua +1 -1
  122. package/operation.lua +23 -17
  123. package/package.json +5 -5
  124. package/patch-lua.lua +15 -0
  125. package/patch-lualib.lua +1 -1
  126. package/utility/arrays.d.ts +1 -0
  127. package/utility/arrays.lua +8 -0
  128. package/utility/callback-array.d.ts +17 -0
  129. package/utility/callback-array.lua +61 -0
  130. package/utility/functions.d.ts +7 -0
  131. package/utility/functions.lua +12 -0
  132. package/utility/linked-map.d.ts +34 -0
  133. package/utility/linked-map.lua +101 -0
  134. package/utility/linked-set.d.ts +3 -1
  135. package/utility/linked-set.lua +40 -1
  136. package/utility/lua-maps.d.ts +12 -2
  137. package/utility/lua-maps.lua +37 -2
  138. package/utility/lua-sets.d.ts +1 -0
  139. package/utility/lua-sets.lua +4 -0
  140. package/utility/records.lua +20 -1
  141. package/utility/types.d.ts +3 -0
  142. package/core/types/order.d.ts +0 -26
  143. package/core/types/order.lua +0 -65
  144. /package/engine/internal/{object-data/armor-increase.d.ts → misc/frame-coordinates.d.ts} +0 -0
  145. /package/engine/internal/object-data/{armor-increase.lua → armor-bonus.lua} +0 -0
  146. /package/engine/object-data/entry/ability-type/{attribute-increase.d.ts → attribute-bonus.d.ts} +0 -0
  147. /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,9 +29,6 @@ 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
@@ -44,6 +42,7 @@ local BuffType = ____buff_2Dtype.BuffType
44
42
  local ____unit = require("engine.behaviour.unit")
45
43
  local UnitBehavior = ____unit.UnitBehavior
46
44
  local ____arrays = require("utility.arrays")
45
+ local emptyArray = ____arrays.emptyArray
47
46
  local forEach = ____arrays.forEach
48
47
  local ____event = require("event")
49
48
  local Event = ____event.Event
@@ -53,6 +52,12 @@ local ____item = require("engine.internal.item")
53
52
  local Item = ____item.Item
54
53
  local ____destructable = require("core.types.destructable")
55
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
56
61
  local getUnitAbility = BlzGetUnitAbility
57
62
  local stringValueByBuffTypeIdByFieldId = postcompile(function()
58
63
  local stringValueByBuffTypeIdByFieldId = {}
@@ -98,9 +103,11 @@ local buffParametersKeys = {
98
103
  damageIncrease = true,
99
104
  damageIncreaseFactor = true,
100
105
  armorIncrease = true,
101
- armorIncreaseFactor = true,
106
+ maxHealthIncrease = true,
107
+ maxManaIncrease = true,
102
108
  attackSpeedIncreaseFactor = true,
103
109
  movementSpeedIncreaseFactor = true,
110
+ manaRegenerationRateIncreaseFactor = true,
104
111
  evasionProbability = true,
105
112
  missProbability = true,
106
113
  damageFactor = true,
@@ -120,11 +127,15 @@ local buffParametersKeys = {
120
127
  maximumAutoAttackCount = true,
121
128
  maximumDamageDealtEventCount = true,
122
129
  maximumDamageReceivedEventCount = true,
130
+ absorbedDamageFactor = true,
131
+ maximumDamageAbsorbed = true,
132
+ destroysOnMaximumDamageAbsorbed = true,
123
133
  uniqueGroup = true,
124
134
  damageOnExpiration = true,
125
135
  healingOnExpiration = true,
126
136
  killsOnExpiration = true,
127
- explodesOnExpiration = true
137
+ explodesOnExpiration = true,
138
+ abilityCooldownFactor = true
128
139
  }
129
140
  local function resolveEnumValue(ability, level, value)
130
141
  if value == nil or type(value) == "number" then
@@ -175,6 +186,7 @@ local function resolveAndSetNumberValue(buff, property, ability, level, value, d
175
186
  end
176
187
  end
177
188
  local buffBooleanParameters = {
189
+ "destroysOnMaximumDamageAbsorbed",
178
190
  "turnsIntoGhost",
179
191
  "stuns",
180
192
  "ignoresStunImmunity",
@@ -187,8 +199,11 @@ local buffNumberParameters = {
187
199
  "durationIncreaseOnAutoAttack",
188
200
  "attackSpeedIncreaseFactor",
189
201
  "movementSpeedIncreaseFactor",
202
+ "manaRegenerationRateIncreaseFactor",
190
203
  "evasionProbability",
191
204
  "armorIncrease",
205
+ "maxHealthIncrease",
206
+ "maxManaIncrease",
192
207
  "damageFactor",
193
208
  "receivedDamageFactor",
194
209
  "maximumAutoAttackCount",
@@ -201,7 +216,10 @@ local buffNumberParameters = {
201
216
  "healingPerInterval",
202
217
  "healingOverDuration",
203
218
  "damageOnExpiration",
204
- "healingOnExpiration"
219
+ "healingOnExpiration",
220
+ "absorbedDamageFactor",
221
+ "maximumDamageAbsorbed",
222
+ "abilityCooldownFactor"
205
223
  }
206
224
  local unsuccessfulApplicationMarker = {}
207
225
  local function selectBuffTypeIdWithLeastDuration(buffTypeIds, unit)
@@ -304,7 +322,8 @@ buffHealingIntervalTimerCallback = function(buff)
304
322
  source:healTarget(buff[101], healingPerInterval)
305
323
  end
306
324
  end
307
- local buffDestroyEvent = __TS__New(Event)
325
+ local buffCreatedEvent = __TS__New(Event)
326
+ local buffBeingDestroyedEvent = __TS__New(Event)
308
327
  ____exports.Buff = __TS__Class()
309
328
  local Buff = ____exports.Buff
310
329
  Buff.name = "Buff"
@@ -319,33 +338,38 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
319
338
  local polarity
320
339
  local resistanceType
321
340
  local ability
341
+ local abilityBehavior
322
342
  if type(typeIdOrTypeIds) ~= "number" then
323
343
  typeId = selectBuffTypeIdWithLeastDuration(typeIdOrTypeIds, _unit)
324
344
  polarity = resistanceTypeOrPolarity
325
345
  resistanceType = abilityOrParametersOrResistanceType
326
- if __TS__InstanceOf(parametersOrAbility, Ability) or parametersOrAbility == nil then
346
+ if __TS__InstanceOf(parametersOrAbility, AbilityBehavior) then
347
+ abilityBehavior = parametersOrAbility
348
+ ability = abilityBehavior.ability
349
+ elseif __TS__InstanceOf(parametersOrAbility, Ability) then
327
350
  ability = parametersOrAbility
328
- else
329
- ability = nil
351
+ elseif parametersOrAbility ~= nil then
330
352
  parameters = parametersOrAbility
331
353
  end
332
354
  else
333
355
  typeId = typeIdOrTypeIds
334
356
  polarity = polarityOrTypeIdSelectionPolicy
335
357
  resistanceType = resistanceTypeOrPolarity
336
- if __TS__InstanceOf(abilityOrParametersOrResistanceType, Ability) or abilityOrParametersOrResistanceType == nil 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
337
363
  ability = abilityOrParametersOrResistanceType
338
364
  parameters = parametersOrAbility
339
- else
340
- ability = nil
365
+ elseif abilityOrParametersOrResistanceType ~= nil then
341
366
  parameters = abilityOrParametersOrResistanceType
367
+ else
368
+ parameters = parametersOrAbility
342
369
  end
343
370
  end
371
+ self.sourceAbilityBehavior = abilityBehavior
344
372
  self.typeId = typeId
345
- if not (__TS__InstanceOf(ability, Ability) or ability == nil) then
346
- parameters = ability
347
- ability = nil
348
- end
349
373
  local defaultParameters = self.constructor.defaultParameters
350
374
  local level = parameters and parameters.level or defaultParameters.level
351
375
  local spellStealPriority = parameters and parameters.spellStealPriority or defaultParameters.spellStealPriority
@@ -373,7 +397,7 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
373
397
  local missProbability = parameters and parameters.missProbability or defaultParameters.missProbability
374
398
  if missProbability ~= nil then
375
399
  missProbability = resolveNumberValue(ability, level, missProbability)
376
- self[142] = missProbability
400
+ self[146] = missProbability
377
401
  end
378
402
  local buffByTypeId = buffByTypeIdByUnit[_unit]
379
403
  if buffByTypeId == nil then
@@ -456,24 +480,22 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
456
480
  abilityTypeIds = {}
457
481
  self._abilityTypeIds = abilityTypeIds
458
482
  end
459
- for abilityTypeId, abilityParameters in pairs(parametersAbilityTypeIds) do
483
+ for ____, abilityTypeId in ipairs(sortedKeysUnnested(parametersAbilityTypeIds)) do
484
+ local abilityParameters = parametersAbilityTypeIds[abilityTypeId]
460
485
  local addedAbility = _unit:addAbility(abilityTypeId)
461
486
  if addedAbility ~= nil then
462
487
  _unit:makeAbilityPermanent(abilityTypeId, true)
463
488
  _unit:setAbilityLevel(abilityTypeId, 1 + (abilityParameters.level or ability and ability.level or 0))
464
- for abilityParameterKey, abilityParameterValue in pairs(abilityParameters) do
465
- if abilityParameterKey == "isButtonVisible" then
466
- if not resolveBooleanValue(ability, level, abilityParameterValue) then
467
- _unit:hideAbility(abilityTypeId, true)
468
- end
469
- elseif abilityParameterKey ~= "level" then
470
- abilityParameterKey:setValue(
471
- addedAbility,
472
- resolveNumberValue(ability, level, abilityParameterValue)
473
- )
474
- end
489
+ if abilityParameters.isButtonVisible == false then
490
+ _unit:hideAbility(abilityTypeId, true)
491
+ end
492
+ for ____, field in ipairs(abilityParameters.fields or emptyArray()) do
493
+ field[1]:setValue(
494
+ addedAbility,
495
+ resolveNumberValue(ability, level, field[2])
496
+ )
475
497
  end
476
- abilityTypeIds[abilityTypeId] = true
498
+ abilityTypeIds[#abilityTypeIds + 1] = abilityTypeId
477
499
  end
478
500
  end
479
501
  local behaviorConstructors = parameters and parameters.behaviorConstructors or defaultParameters.behaviorConstructors
@@ -485,18 +507,20 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
485
507
  self._behaviors = behaviors
486
508
  end
487
509
  end
488
- local additionalParameters = {}
489
- for key, value in pairs(parameters) do
490
- if not buffParametersKeys[key] then
491
- if ability then
492
- additionalParameters[key] = resolveCurrentAbilityDependentValue(ability, value)
493
- else
494
- additionalParameters[key] = value
510
+ if parameters ~= nil then
511
+ local additionalParameters = {}
512
+ for ____, key in ipairs(sortedKeysUnnested(parameters)) do
513
+ if not buffParametersKeys[key] then
514
+ if ability then
515
+ additionalParameters[key] = resolveCurrentAbilityDependentValue(ability, parameters[key])
516
+ else
517
+ additionalParameters[key] = parameters[key]
518
+ end
495
519
  end
496
520
  end
497
- end
498
- if (next(additionalParameters)) ~= nil then
499
- self.parameters = additionalParameters
521
+ if (next(additionalParameters)) ~= nil then
522
+ self.parameters = additionalParameters
523
+ end
500
524
  end
501
525
  end
502
526
  if duration ~= nil and duration > 0 then
@@ -506,65 +530,65 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
506
530
  end
507
531
  self:onCreate()
508
532
  self[100] = 1
533
+ Event.invoke(buffCreatedEvent, self)
509
534
  end
510
- function Buff.prototype.getUnitBonus(self, bonusType)
511
- local ____opt_38 = self._bonusIdByBonusType
512
- local bonusId = ____opt_38 and ____opt_38[bonusType]
513
- return bonusId == nil and 0 or getUnitBonus(self._unit, bonusType, bonusId)
535
+ function Buff.prototype.onAbilityGained(self, ability)
536
+ if __TS__InstanceOf(ability, UnitAbility) then
537
+ local abilityCooldownModifier = self[148]
538
+ if abilityCooldownModifier then
539
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:applyModifier(ability, abilityCooldownModifier)
540
+ end
541
+ end
514
542
  end
515
- function Buff.prototype.addOrUpdateOrRemoveUnitBonus(self, bonusType, value)
516
- local bonusIdByBonusType = self._bonusIdByBonusType
517
- if bonusIdByBonusType == nil then
518
- bonusIdByBonusType = {}
519
- self._bonusIdByBonusType = bonusIdByBonusType
543
+ function Buff.prototype.onAbilityLost(self, ability)
544
+ if __TS__InstanceOf(ability, UnitAbility) then
545
+ local abilityCooldownModifier = self[148]
546
+ if abilityCooldownModifier then
547
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, abilityCooldownModifier)
548
+ end
520
549
  end
521
- bonusIdByBonusType[bonusType] = addOrUpdateOrRemoveUnitBonus(self._unit, bonusType, bonusIdByBonusType[bonusType], value)
522
550
  end
523
551
  function Buff.prototype.flashEffect(self, widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
552
+ self:flash(
553
+ self[105],
554
+ stringValueByBuffTypeIdByFieldId[fourCC("feft")][self.typeId] or "origin",
555
+ widgetOrXOrParametersOrDuration,
556
+ yOrParametersOrDuration,
557
+ parametersOrDuration
558
+ )
559
+ end
560
+ function Buff.prototype.flashSpecialEffect(self, widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
561
+ self:flash(
562
+ self[106],
563
+ stringValueByBuffTypeIdByFieldId[fourCC("fspt")][self.typeId] or "origin",
564
+ widgetOrXOrParametersOrDuration,
565
+ yOrParametersOrDuration,
566
+ parametersOrDuration
567
+ )
568
+ end
569
+ function Buff.prototype.flash(self, modelPath, attachmentPoint, widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
524
570
  if type(widgetOrXOrParametersOrDuration) == "number" and type(yOrParametersOrDuration) == "number" then
525
- Effect:flash(self[105], widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
571
+ Effect:flash(modelPath, widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
526
572
  else
527
573
  local isWidgetProvided = __TS__InstanceOf(widgetOrXOrParametersOrDuration, Unit) or __TS__InstanceOf(widgetOrXOrParametersOrDuration, Item) or __TS__InstanceOf(widgetOrXOrParametersOrDuration, Destructable)
528
- local ____Effect_42 = Effect
529
- local ____Effect_flash_43 = Effect.flash
530
- local ____array_41 = __TS__SparseArrayNew(
531
- self[105],
532
- isWidgetProvided and widgetOrXOrParametersOrDuration or self._unit,
533
- stringValueByBuffTypeIdByFieldId[fourCC("feft")][self.typeId] or "origin"
534
- )
535
- local ____isWidgetProvided_40
574
+ local ____Effect_40 = Effect
575
+ local ____Effect_flash_41 = Effect.flash
576
+ local ____array_39 = __TS__SparseArrayNew(modelPath, isWidgetProvided and widgetOrXOrParametersOrDuration or self._unit, attachmentPoint)
577
+ local ____isWidgetProvided_38
536
578
  if isWidgetProvided then
537
- ____isWidgetProvided_40 = yOrParametersOrDuration
579
+ ____isWidgetProvided_38 = yOrParametersOrDuration
538
580
  else
539
- ____isWidgetProvided_40 = widgetOrXOrParametersOrDuration
581
+ ____isWidgetProvided_38 = widgetOrXOrParametersOrDuration
540
582
  end
541
- __TS__SparseArrayPush(____array_41, ____isWidgetProvided_40)
542
- ____Effect_flash_43(
543
- ____Effect_42,
544
- __TS__SparseArraySpread(____array_41)
583
+ __TS__SparseArrayPush(____array_39, ____isWidgetProvided_38)
584
+ ____Effect_flash_41(
585
+ ____Effect_40,
586
+ __TS__SparseArraySpread(____array_39)
545
587
  )
546
588
  end
547
589
  end
548
- function Buff.prototype.flashSpecialEffect(self, widgetOrDuration, duration)
549
- local isWidgetProvided = type(widgetOrDuration) == "table"
550
- local ____Effect_46 = Effect
551
- local ____Effect_flash_47 = Effect.flash
552
- local ____array_45 = __TS__SparseArrayNew(
553
- self[106],
554
- isWidgetProvided and widgetOrDuration or self._unit,
555
- stringValueByBuffTypeIdByFieldId[fourCC("fspt")][self.typeId] or "origin"
556
- )
557
- local ____isWidgetProvided_44
558
- if isWidgetProvided then
559
- ____isWidgetProvided_44 = duration
560
- else
561
- ____isWidgetProvided_44 = widgetOrDuration
562
- end
563
- __TS__SparseArrayPush(____array_45, ____isWidgetProvided_44)
564
- ____Effect_flash_47(
565
- ____Effect_46,
566
- __TS__SparseArraySpread(____array_45)
567
- )
590
+ function Buff.prototype.expire(self)
591
+ expireBuff(self)
568
592
  end
569
593
  function Buff.prototype.onCreate(self)
570
594
  end
@@ -594,32 +618,33 @@ function Buff.prototype.onDestroy(self)
594
618
  behavior:destroy()
595
619
  end
596
620
  end
597
- if self[139] then
621
+ local previousAbilityCooldownModifier = self[148]
622
+ if previousAbilityCooldownModifier then
623
+ for ____, ability in ipairs(self._unit.abilities) do
624
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, previousAbilityCooldownModifier)
625
+ end
626
+ end
627
+ if self[143] then
598
628
  unit:decrementInvulnerabilityCounter()
599
629
  end
600
- if self[138] then
630
+ if self[142] then
601
631
  unit:decrementDisableAutoAttackCounter()
602
632
  end
603
- if self[136] then
604
- if self[137] then
605
- unit:decrementStunCounter()
633
+ if self[140] then
634
+ if self[141] then
635
+ unit:decrementForceStunCounter()
606
636
  end
607
637
  unit:decrementStunCounter()
608
638
  end
609
- if self[135] then
639
+ if self[139] then
610
640
  unit:decrementGhostCounter()
611
641
  end
612
642
  if self._abilityTypeIds ~= nil then
613
- for abilityTypeId in pairs(self._abilityTypeIds) do
643
+ for ____, abilityTypeId in ipairs(self._abilityTypeIds) do
614
644
  unit:removeAbility(abilityTypeId)
615
645
  end
616
646
  end
617
- if self._bonusIdByBonusType ~= nil then
618
- for bonusType, bonusId in pairs(self._bonusIdByBonusType) do
619
- removeUnitBonus(unit, bonusType, bonusId)
620
- end
621
- end
622
- Event.invoke(buffDestroyEvent, self)
647
+ Event.invoke(buffBeingDestroyedEvent, self)
623
648
  self[100] = 3
624
649
  return UnitBehavior.prototype.onDestroy(self)
625
650
  end
@@ -648,8 +673,8 @@ function Buff.apply(self, ...)
648
673
  end
649
674
  end
650
675
  function Buff.getByTypeId(self, unit, typeId)
651
- local ____opt_48 = buffByTypeIdByUnit[unit]
652
- local buff = ____opt_48 and ____opt_48[typeId]
676
+ local ____opt_42 = buffByTypeIdByUnit[unit]
677
+ local buff = ____opt_42 and ____opt_42[typeId]
653
678
  if __TS__InstanceOf(buff, self) then
654
679
  return buff
655
680
  end
@@ -663,9 +688,9 @@ function Buff.prototype.onExpiration(self)
663
688
  if self[121] ~= nil then
664
689
  (self[102] or unit):healTarget(unit, self[120] or 0)
665
690
  end
666
- if self[141] then
691
+ if self[145] then
667
692
  unit:explode()
668
- elseif self[140] then
693
+ elseif self[144] then
669
694
  unit:kill()
670
695
  end
671
696
  end
@@ -720,6 +745,18 @@ function Buff.prototype.onDamageDealt(self, target, event)
720
745
  end
721
746
  function Buff.prototype.onDamageReceived(self, source, event)
722
747
  if event.originalAmount ~= 0 then
748
+ local absorbedDamage = min(event.amount * (self[135] or 1), (self[136] or 0) - (self[137] or 0))
749
+ if absorbedDamage > 0 then
750
+ event.amount = event.amount - absorbedDamage
751
+ self[137] = (self[137] or 0) + absorbedDamage
752
+ local ____self__138_44 = self[138]
753
+ if ____self__138_44 == nil then
754
+ ____self__138_44 = true
755
+ end
756
+ if ____self__138_44 and self[137] >= (self[136] or 0) then
757
+ self:destroy()
758
+ end
759
+ end
723
760
  local damageReceivedEventCount = (self[133] or 0) + 1
724
761
  self[133] = damageReceivedEventCount
725
762
  if damageReceivedEventCount == self[134] then
@@ -807,8 +844,8 @@ __TS__SetDescriptor(
807
844
  return
808
845
  end
809
846
  self[112] = damageInterval
810
- local ____opt_50 = self._timer
811
- local elapsed = ____opt_50 and ____opt_50.elapsed or 0
847
+ local ____opt_45 = self._timer
848
+ local elapsed = ____opt_45 and ____opt_45.elapsed or 0
812
849
  local timer = self[114]
813
850
  if timer == nil then
814
851
  timer = Timer:create()
@@ -887,8 +924,8 @@ __TS__SetDescriptor(
887
924
  return
888
925
  end
889
926
  self[117] = healingInterval
890
- local ____opt_52 = self._timer
891
- local elapsed = ____opt_52 and ____opt_52.elapsed or 0
927
+ local ____opt_47 = self._timer
928
+ local elapsed = ____opt_47 and ____opt_47.elapsed or 0
892
929
  local timer = self[119]
893
930
  if timer == nil then
894
931
  timer = Timer:create()
@@ -969,24 +1006,50 @@ __TS__SetDescriptor(
969
1006
  },
970
1007
  true
971
1008
  )
1009
+ __TS__SetDescriptor(
1010
+ Buff.prototype,
1011
+ "maxHealthIncrease",
1012
+ {
1013
+ get = function(self)
1014
+ return self:getUnitBonus(UnitBonusType.HEALTH)
1015
+ end,
1016
+ set = function(self, maxHealthIncrease)
1017
+ self:addOrUpdateOrRemoveUnitBonus(UnitBonusType.HEALTH, maxHealthIncrease)
1018
+ end
1019
+ },
1020
+ true
1021
+ )
1022
+ __TS__SetDescriptor(
1023
+ Buff.prototype,
1024
+ "maxManaIncrease",
1025
+ {
1026
+ get = function(self)
1027
+ return self:getUnitBonus(UnitBonusType.MANA)
1028
+ end,
1029
+ set = function(self, maxManaIncrease)
1030
+ self:addOrUpdateOrRemoveUnitBonus(UnitBonusType.MANA, maxManaIncrease)
1031
+ end
1032
+ },
1033
+ true
1034
+ )
972
1035
  __TS__SetDescriptor(
973
1036
  Buff.prototype,
974
1037
  "turnsIntoGhost",
975
1038
  {
976
1039
  get = function(self)
977
- local ____self__135_54 = self[135]
978
- if ____self__135_54 == nil then
979
- ____self__135_54 = false
1040
+ local ____self__139_49 = self[139]
1041
+ if ____self__139_49 == nil then
1042
+ ____self__139_49 = false
980
1043
  end
981
- return ____self__135_54
1044
+ return ____self__139_49
982
1045
  end,
983
1046
  set = function(self, turnsIntoGhost)
984
- if not turnsIntoGhost and self[135] then
1047
+ if not turnsIntoGhost and self[139] then
985
1048
  self.object:decrementGhostCounter()
986
- self[135] = nil
987
- elseif turnsIntoGhost and not self[135] then
1049
+ self[139] = nil
1050
+ elseif turnsIntoGhost and not self[139] then
988
1051
  self.object:incrementGhostCounter()
989
- self[135] = true
1052
+ self[139] = true
990
1053
  end
991
1054
  end
992
1055
  },
@@ -997,25 +1060,25 @@ __TS__SetDescriptor(
997
1060
  "stuns",
998
1061
  {
999
1062
  get = function(self)
1000
- local ____self__136_55 = self[136]
1001
- if ____self__136_55 == nil then
1002
- ____self__136_55 = false
1063
+ local ____self__140_50 = self[140]
1064
+ if ____self__140_50 == nil then
1065
+ ____self__140_50 = false
1003
1066
  end
1004
- return ____self__136_55
1067
+ return ____self__140_50
1005
1068
  end,
1006
1069
  set = function(self, stuns)
1007
- if not stuns and self[136] then
1008
- if self[137] then
1009
- self.object:decrementStunCounter()
1070
+ if not stuns and self[140] then
1071
+ if self[141] then
1072
+ self.object:decrementForceStunCounter()
1010
1073
  end
1011
1074
  self.object:decrementStunCounter()
1012
- self[136] = nil
1013
- elseif stuns and not self[136] then
1014
- if self[137] then
1015
- self.object:incrementStunCounter()
1075
+ self[140] = nil
1076
+ elseif stuns and not self[140] then
1077
+ if self[141] then
1078
+ self.object:incrementForceStunCounter()
1016
1079
  end
1017
1080
  self.object:incrementStunCounter()
1018
- self[136] = true
1081
+ self[140] = true
1019
1082
  end
1020
1083
  end
1021
1084
  },
@@ -1026,23 +1089,23 @@ __TS__SetDescriptor(
1026
1089
  "ignoresStunImmunity",
1027
1090
  {
1028
1091
  get = function(self)
1029
- local ____self__137_56 = self[137]
1030
- if ____self__137_56 == nil then
1031
- ____self__137_56 = false
1092
+ local ____self__141_51 = self[141]
1093
+ if ____self__141_51 == nil then
1094
+ ____self__141_51 = false
1032
1095
  end
1033
- return ____self__137_56
1096
+ return ____self__141_51
1034
1097
  end,
1035
1098
  set = function(self, ignoresStunImmunity)
1036
- if not ignoresStunImmunity and self[137] then
1037
- if self[136] then
1038
- self.object:decrementStunCounter()
1099
+ if not ignoresStunImmunity and self[141] then
1100
+ if self[140] then
1101
+ self.object:decrementForceStunCounter()
1039
1102
  end
1040
- self[137] = nil
1041
- elseif ignoresStunImmunity and not self[137] then
1042
- if self[136] then
1043
- self.object:incrementStunCounter()
1103
+ self[141] = nil
1104
+ elseif ignoresStunImmunity and not self[141] then
1105
+ if self[140] then
1106
+ self.object:incrementForceStunCounter()
1044
1107
  end
1045
- self[137] = true
1108
+ self[141] = true
1046
1109
  end
1047
1110
  end
1048
1111
  },
@@ -1053,19 +1116,19 @@ __TS__SetDescriptor(
1053
1116
  "disablesAutoAttack",
1054
1117
  {
1055
1118
  get = function(self)
1056
- local ____self__138_57 = self[138]
1057
- if ____self__138_57 == nil then
1058
- ____self__138_57 = false
1119
+ local ____self__142_52 = self[142]
1120
+ if ____self__142_52 == nil then
1121
+ ____self__142_52 = false
1059
1122
  end
1060
- return ____self__138_57
1123
+ return ____self__142_52
1061
1124
  end,
1062
1125
  set = function(self, disablesAutoAttack)
1063
- if not disablesAutoAttack and self[138] then
1126
+ if not disablesAutoAttack and self[142] then
1064
1127
  self.object:decrementDisableAutoAttackCounter()
1065
- self[138] = nil
1066
- elseif disablesAutoAttack and not self[138] then
1128
+ self[142] = nil
1129
+ elseif disablesAutoAttack and not self[142] then
1067
1130
  self.object:incrementDisableAutoAttackCounter()
1068
- self[138] = true
1131
+ self[142] = true
1069
1132
  end
1070
1133
  end
1071
1134
  },
@@ -1076,19 +1139,19 @@ __TS__SetDescriptor(
1076
1139
  "providesInvulnerability",
1077
1140
  {
1078
1141
  get = function(self)
1079
- local ____self__139_58 = self[139]
1080
- if ____self__139_58 == nil then
1081
- ____self__139_58 = false
1142
+ local ____self__143_53 = self[143]
1143
+ if ____self__143_53 == nil then
1144
+ ____self__143_53 = false
1082
1145
  end
1083
- return ____self__139_58
1146
+ return ____self__143_53
1084
1147
  end,
1085
1148
  set = function(self, providesInvulnerability)
1086
- if not providesInvulnerability and self[139] then
1149
+ if not providesInvulnerability and self[143] then
1087
1150
  self.object:decrementInvulnerabilityCounter()
1088
- self[139] = nil
1089
- elseif providesInvulnerability and not self[139] then
1151
+ self[143] = nil
1152
+ elseif providesInvulnerability and not self[143] then
1090
1153
  self.object:incrementInvulnerabilityCounter()
1091
- self[139] = true
1154
+ self[143] = true
1092
1155
  end
1093
1156
  end
1094
1157
  },
@@ -1099,17 +1162,17 @@ __TS__SetDescriptor(
1099
1162
  "killsOnExpiration",
1100
1163
  {
1101
1164
  get = function(self)
1102
- local ____self__140_59 = self[140]
1103
- if ____self__140_59 == nil then
1104
- ____self__140_59 = false
1165
+ local ____self__144_54 = self[144]
1166
+ if ____self__144_54 == nil then
1167
+ ____self__144_54 = false
1105
1168
  end
1106
- return ____self__140_59
1169
+ return ____self__144_54
1107
1170
  end,
1108
1171
  set = function(self, killsOnExpiration)
1109
- if not killsOnExpiration and self[140] then
1110
- self[140] = nil
1111
- elseif killsOnExpiration and not self[140] then
1112
- self[140] = true
1172
+ if not killsOnExpiration and self[144] then
1173
+ self[144] = nil
1174
+ elseif killsOnExpiration and not self[144] then
1175
+ self[144] = true
1113
1176
  end
1114
1177
  end
1115
1178
  },
@@ -1120,17 +1183,17 @@ __TS__SetDescriptor(
1120
1183
  "explodesOnExpiration",
1121
1184
  {
1122
1185
  get = function(self)
1123
- local ____self__141_60 = self[141]
1124
- if ____self__141_60 == nil then
1125
- ____self__141_60 = false
1186
+ local ____self__145_55 = self[145]
1187
+ if ____self__145_55 == nil then
1188
+ ____self__145_55 = false
1126
1189
  end
1127
- return ____self__141_60
1190
+ return ____self__145_55
1128
1191
  end,
1129
1192
  set = function(self, killsOnExpiration)
1130
- if not killsOnExpiration and self[141] then
1131
- self[141] = nil
1132
- elseif killsOnExpiration and not self[141] then
1133
- self[141] = true
1193
+ if not killsOnExpiration and self[145] then
1194
+ self[145] = nil
1195
+ elseif killsOnExpiration and not self[145] then
1196
+ self[145] = true
1134
1197
  end
1135
1198
  end
1136
1199
  },
@@ -1239,12 +1302,39 @@ __TS__SetDescriptor(
1239
1302
  },
1240
1303
  true
1241
1304
  )
1305
+ __TS__SetDescriptor(
1306
+ Buff.prototype,
1307
+ "manaRegenerationRateIncreaseFactor",
1308
+ {
1309
+ get = function(self)
1310
+ return self:getUnitBonus(UnitBonusType.MANA_REGENERATION_RATE_FACTOR)
1311
+ end,
1312
+ set = function(self, manaRegenerationRateIncreaseFactor)
1313
+ self:addOrUpdateOrRemoveUnitBonus(UnitBonusType.MANA_REGENERATION_RATE_FACTOR, manaRegenerationRateIncreaseFactor)
1314
+ end
1315
+ },
1316
+ true
1317
+ )
1242
1318
  __TS__SetDescriptor(
1243
1319
  Buff.prototype,
1244
1320
  "duration",
1245
- {get = function(self)
1246
- return self[103]
1247
- end},
1321
+ {
1322
+ get = function(self)
1323
+ return self[103]
1324
+ end,
1325
+ set = function(self, duration)
1326
+ if duration <= 0 then
1327
+ local timer = self._timer
1328
+ if timer ~= nil then
1329
+ timer:destroy()
1330
+ self._timer = nil
1331
+ end
1332
+ self[103] = 0
1333
+ else
1334
+ self.remainingDuration = self.remainingDuration + (duration - self[103])
1335
+ end
1336
+ end
1337
+ },
1248
1338
  true
1249
1339
  )
1250
1340
  __TS__SetDescriptor(
@@ -1252,13 +1342,13 @@ __TS__SetDescriptor(
1252
1342
  "remainingDuration",
1253
1343
  {
1254
1344
  get = function(self)
1255
- local ____opt_61 = self._timer
1256
- return ____opt_61 and ____opt_61.remaining or 0
1345
+ local ____opt_56 = self._timer
1346
+ return ____opt_56 and ____opt_56.remaining or 0
1257
1347
  end,
1258
1348
  set = function(self, remainingDuration)
1259
- local ____remainingDuration_65 = remainingDuration
1260
- local ____opt_63 = self._timer
1261
- local remainingDurationDelta = ____remainingDuration_65 - (____opt_63 and ____opt_63.remaining or 0)
1349
+ local ____remainingDuration_60 = remainingDuration
1350
+ local ____opt_58 = self._timer
1351
+ local remainingDurationDelta = ____remainingDuration_60 - (____opt_58 and ____opt_58.remaining or 0)
1262
1352
  if remainingDurationDelta ~= 0 then
1263
1353
  self[103] = self[103] + remainingDurationDelta
1264
1354
  if remainingDuration <= 0 then
@@ -1273,7 +1363,7 @@ __TS__SetDescriptor(
1273
1363
  remainingDuration,
1274
1364
  self._spellStealPriority,
1275
1365
  self._learnLevelMinimum,
1276
- self[142]
1366
+ self[146]
1277
1367
  ) then
1278
1368
  local timer = self._timer
1279
1369
  if timer == nil then
@@ -1288,7 +1378,99 @@ __TS__SetDescriptor(
1288
1378
  },
1289
1379
  true
1290
1380
  )
1291
- Buff.destroyEvent = buffDestroyEvent;
1381
+ __TS__SetDescriptor(
1382
+ Buff.prototype,
1383
+ "absorbedDamageFactor",
1384
+ {
1385
+ get = function(self)
1386
+ return self[135] or 1
1387
+ end,
1388
+ set = function(self, absorbedDamageFactor)
1389
+ if absorbedDamageFactor == 1 then
1390
+ self[135] = nil
1391
+ else
1392
+ self[135] = absorbedDamageFactor
1393
+ end
1394
+ end
1395
+ },
1396
+ true
1397
+ )
1398
+ __TS__SetDescriptor(
1399
+ Buff.prototype,
1400
+ "maximumDamageAbsorbed",
1401
+ {
1402
+ get = function(self)
1403
+ return self[136] or 0
1404
+ end,
1405
+ set = function(self, maximumDamageAbsorbed)
1406
+ if maximumDamageAbsorbed == 0 then
1407
+ self[136] = nil
1408
+ else
1409
+ self[136] = maximumDamageAbsorbed
1410
+ end
1411
+ end
1412
+ },
1413
+ true
1414
+ )
1415
+ __TS__SetDescriptor(
1416
+ Buff.prototype,
1417
+ "damageAbsorbed",
1418
+ {get = function(self)
1419
+ return self[137] or 0
1420
+ end},
1421
+ true
1422
+ )
1423
+ __TS__SetDescriptor(
1424
+ Buff.prototype,
1425
+ "destroysOnMaximumDamageAbsorbed",
1426
+ {
1427
+ get = function(self)
1428
+ local ____self__138_61 = self[138]
1429
+ if ____self__138_61 == nil then
1430
+ ____self__138_61 = true
1431
+ end
1432
+ return ____self__138_61
1433
+ end,
1434
+ set = function(self, destroysOnMaximumDamageAbsorbed)
1435
+ local ____destroysOnMaximumDamageAbsorbed_62
1436
+ if destroysOnMaximumDamageAbsorbed then
1437
+ ____destroysOnMaximumDamageAbsorbed_62 = nil
1438
+ else
1439
+ ____destroysOnMaximumDamageAbsorbed_62 = false
1440
+ end
1441
+ self[138] = ____destroysOnMaximumDamageAbsorbed_62
1442
+ end
1443
+ },
1444
+ true
1445
+ )
1446
+ __TS__SetDescriptor(
1447
+ Buff.prototype,
1448
+ "abilityCooldownFactor",
1449
+ {
1450
+ get = function(self)
1451
+ return self[147] or 1
1452
+ end,
1453
+ set = function(self, abilityCooldownFactor)
1454
+ local previousAbilityCooldownModifier = self[148]
1455
+ if previousAbilityCooldownModifier then
1456
+ for ____, ability in ipairs(self._unit.abilities) do
1457
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:removeModifier(ability, previousAbilityCooldownModifier)
1458
+ end
1459
+ end
1460
+ local function modifier(ability, level, cooldown)
1461
+ return cooldown * abilityCooldownFactor
1462
+ end
1463
+ for ____, ability in ipairs(self._unit.abilities) do
1464
+ COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD:applyModifier(ability, modifier)
1465
+ end
1466
+ self[148] = modifier
1467
+ self[147] = abilityCooldownFactor
1468
+ end
1469
+ },
1470
+ true
1471
+ )
1472
+ Buff.createdEvent = buffCreatedEvent
1473
+ Buff.beingDestroyedEvent = buffBeingDestroyedEvent;
1292
1474
  (function(self)
1293
1475
  local function destroyBuffIfNeeded(buff)
1294
1476
  if getUnitAbility(buff[101].handle, buff.typeId) ~= buff.handle and buff[100] == 1 then
@@ -1342,5 +1524,11 @@ Buff.destroyEvent = buffDestroyEvent;
1342
1524
  ____exports.checkBuffs(target)
1343
1525
  end
1344
1526
  )
1527
+ buffCreatedEvent:addListener(function(buff)
1528
+ UnitBehavior:forAll(buff.unit, "onBuffGained", buff)
1529
+ end)
1530
+ buffBeingDestroyedEvent:addListener(function(buff)
1531
+ UnitBehavior:forAll(buff.unit, "onBuffLost", buff)
1532
+ end)
1345
1533
  end)(Buff)
1346
1534
  return ____exports