warscript 0.0.1-dev.aefeacb → 0.0.1-dev.b23de5c

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 (175) hide show
  1. package/attributes.d.ts +6 -0
  2. package/attributes.lua +17 -1
  3. package/core/types/effect.d.ts +1 -3
  4. package/core/types/effect.lua +26 -29
  5. package/core/types/frame.lua +24 -21
  6. package/core/types/player.d.ts +16 -0
  7. package/core/types/player.lua +60 -15
  8. package/core/types/playerCamera.d.ts +2 -0
  9. package/core/types/playerCamera.lua +123 -5
  10. package/core/types/sound.d.ts +17 -25
  11. package/core/types/sound.lua +85 -44
  12. package/core/types/tileCell.d.ts +11 -1
  13. package/core/types/tileCell.lua +97 -0
  14. package/core/types/timer.d.ts +9 -8
  15. package/core/types/timer.lua +45 -23
  16. package/decl/native.d.ts +846 -790
  17. package/destroyable.d.ts +1 -0
  18. package/destroyable.lua +9 -0
  19. package/engine/behavior.d.ts +14 -1
  20. package/engine/behavior.lua +230 -70
  21. package/engine/behaviour/ability/apply-buff.lua +5 -5
  22. package/engine/behaviour/ability/apply-unit-behavior.lua +1 -0
  23. package/engine/behaviour/ability/damage.d.ts +9 -3
  24. package/engine/behaviour/ability/damage.lua +26 -38
  25. package/engine/behaviour/ability/emulate-impact.d.ts +1 -1
  26. package/engine/behaviour/ability/emulate-impact.lua +18 -3
  27. package/engine/behaviour/ability/remove-buffs.d.ts +9 -0
  28. package/engine/behaviour/ability/remove-buffs.lua +21 -0
  29. package/engine/behaviour/ability/restore-mana.d.ts +1 -1
  30. package/engine/behaviour/ability/restore-mana.lua +6 -6
  31. package/engine/behaviour/ability.d.ts +15 -6
  32. package/engine/behaviour/ability.lua +56 -21
  33. package/engine/behaviour/unit/stun-immunity.d.ts +12 -6
  34. package/engine/behaviour/unit/stun-immunity.lua +57 -31
  35. package/engine/behaviour/unit.d.ts +40 -2
  36. package/engine/behaviour/unit.lua +269 -6
  37. package/engine/buff.d.ts +58 -18
  38. package/engine/buff.lua +347 -150
  39. package/engine/internal/ability.d.ts +7 -1
  40. package/engine/internal/ability.lua +49 -9
  41. package/engine/internal/item/ability.lua +63 -11
  42. package/engine/internal/item+owner.lua +12 -6
  43. package/engine/internal/item.d.ts +18 -17
  44. package/engine/internal/item.lua +135 -49
  45. package/engine/internal/mechanics/ability-duration.lua +1 -1
  46. package/engine/internal/mechanics/cast-ability.lua +6 -3
  47. package/engine/internal/misc/damage-metadata-by-target.d.ts +2 -0
  48. package/engine/internal/misc/damage-metadata-by-target.lua +5 -0
  49. package/engine/internal/misc/frame-coordinates.d.ts +2 -0
  50. package/engine/internal/misc/frame-coordinates.lua +21 -0
  51. package/engine/internal/misc/get-terrain-z.d.ts +2 -0
  52. package/engine/internal/misc/get-terrain-z.lua +11 -0
  53. package/engine/internal/misc/player-local-handle.d.ts +2 -0
  54. package/engine/internal/misc/player-local-handle.lua +5 -0
  55. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.d.ts +2 -0
  56. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.lua +16 -0
  57. package/engine/internal/unit/ability.d.ts +35 -0
  58. package/engine/internal/unit/ability.lua +98 -9
  59. package/engine/internal/unit/allowed-targets.d.ts +1 -1
  60. package/engine/internal/unit/allowed-targets.lua +9 -1
  61. package/engine/internal/unit/attributes.d.ts +17 -0
  62. package/engine/internal/unit/attributes.lua +46 -0
  63. package/engine/internal/unit/bonus.d.ts +2 -0
  64. package/engine/internal/unit/bonus.lua +10 -0
  65. package/engine/internal/unit/fly-height.d.ts +7 -0
  66. package/engine/internal/unit/fly-height.lua +20 -0
  67. package/engine/internal/unit/interrupts.d.ts +12 -0
  68. package/engine/internal/unit/interrupts.lua +28 -0
  69. package/engine/internal/unit/main-selected.lua +12 -27
  70. package/engine/internal/unit/order.d.ts +20 -0
  71. package/engine/internal/unit/order.lua +136 -0
  72. package/engine/internal/unit/range-event.d.ts +12 -0
  73. package/engine/internal/unit/range-event.lua +90 -0
  74. package/engine/internal/unit/scale.d.ts +7 -0
  75. package/engine/internal/unit/scale.lua +20 -0
  76. package/engine/internal/unit+ability.lua +10 -1
  77. package/engine/internal/unit+damage.d.ts +2 -11
  78. package/engine/internal/unit+damage.lua +10 -14
  79. package/engine/internal/unit+spellSteal.lua +1 -2
  80. package/engine/internal/unit-missile-launch.lua +52 -14
  81. package/engine/internal/unit.d.ts +43 -25
  82. package/engine/internal/unit.lua +384 -260
  83. package/engine/local-client.d.ts +2 -0
  84. package/engine/local-client.lua +30 -0
  85. package/engine/object-data/auxiliary/armor-type.d.ts +11 -0
  86. package/engine/object-data/auxiliary/armor-type.lua +46 -0
  87. package/engine/object-data/auxiliary/attachment-preset.d.ts +7 -2
  88. package/engine/object-data/auxiliary/attachment-preset.lua +4 -3
  89. package/engine/object-data/auxiliary/attack-type.d.ts +7 -8
  90. package/engine/object-data/auxiliary/attack-type.lua +42 -0
  91. package/engine/object-data/auxiliary/health-regeneration-type.d.ts +8 -0
  92. package/engine/object-data/auxiliary/health-regeneration-type.lua +2 -0
  93. package/engine/object-data/auxiliary/movement-type.d.ts +7 -7
  94. package/engine/object-data/auxiliary/movement-type.lua +22 -0
  95. package/engine/object-data/auxiliary/sound-eax.d.ts +10 -0
  96. package/engine/object-data/auxiliary/sound-eax.lua +2 -0
  97. package/engine/object-data/auxiliary/unit-attribute.d.ts +6 -0
  98. package/engine/object-data/auxiliary/unit-attribute.lua +9 -0
  99. package/engine/object-data/entry/ability-type/berserk.d.ts +2 -0
  100. package/engine/object-data/entry/ability-type/berserk.lua +13 -0
  101. package/engine/object-data/entry/ability-type/carrion-swarm.d.ts +14 -0
  102. package/engine/object-data/entry/ability-type/carrion-swarm.lua +65 -0
  103. package/engine/object-data/entry/ability-type/curse.lua +2 -2
  104. package/engine/object-data/entry/ability-type/ensnare.d.ts +12 -0
  105. package/engine/object-data/entry/ability-type/ensnare.lua +52 -0
  106. package/engine/object-data/entry/ability-type/mana-regeneration.d.ts +8 -0
  107. package/engine/object-data/entry/ability-type/mana-regeneration.lua +26 -0
  108. package/engine/object-data/entry/ability-type/permanent-invisibility.d.ts +8 -0
  109. package/engine/object-data/entry/ability-type/permanent-invisibility.lua +26 -0
  110. package/engine/object-data/entry/ability-type/phase-shift.d.ts +10 -0
  111. package/engine/object-data/entry/ability-type/phase-shift.lua +39 -0
  112. package/engine/object-data/entry/ability-type/raise-dead.d.ts +17 -0
  113. package/engine/object-data/entry/ability-type/raise-dead.lua +78 -0
  114. package/engine/object-data/entry/ability-type/reincarnation.d.ts +8 -0
  115. package/engine/object-data/entry/ability-type/reincarnation.lua +26 -0
  116. package/engine/object-data/entry/ability-type/shock-wave.d.ts +4 -0
  117. package/engine/object-data/entry/ability-type/shock-wave.lua +26 -0
  118. package/engine/object-data/entry/ability-type/slow-poison.d.ts +10 -0
  119. package/engine/object-data/entry/ability-type/slow-poison.lua +58 -0
  120. package/engine/object-data/entry/ability-type/web.d.ts +12 -0
  121. package/engine/object-data/entry/ability-type/web.lua +52 -0
  122. package/engine/object-data/entry/ability-type.d.ts +13 -11
  123. package/engine/object-data/entry/ability-type.lua +119 -17
  124. package/engine/object-data/entry/buff-type/applicable.lua +5 -0
  125. package/engine/object-data/entry/buff-type.d.ts +5 -11
  126. package/engine/object-data/entry/buff-type.lua +11 -27
  127. package/engine/object-data/entry/destructible-type.d.ts +27 -1
  128. package/engine/object-data/entry/destructible-type.lua +155 -0
  129. package/engine/object-data/entry/sound-preset.d.ts +17 -0
  130. package/engine/object-data/entry/sound-preset.lua +104 -0
  131. package/engine/object-data/entry/unit-type.d.ts +17 -4
  132. package/engine/object-data/entry/unit-type.lua +197 -85
  133. package/engine/object-field/ability.d.ts +4 -4
  134. package/engine/object-field/ability.lua +7 -6
  135. package/engine/object-field/unit.d.ts +72 -3
  136. package/engine/object-field/unit.lua +268 -7
  137. package/engine/object-field.d.ts +25 -6
  138. package/engine/object-field.lua +357 -118
  139. package/engine/random.d.ts +10 -0
  140. package/engine/random.lua +21 -0
  141. package/engine/standard/entries/buff-type.d.ts +3 -0
  142. package/engine/standard/entries/buff-type.lua +3 -0
  143. package/engine/standard/fields/ability.d.ts +2 -2
  144. package/engine/standard/fields/ability.lua +2 -2
  145. package/engine/standard/fields/unit.d.ts +12 -0
  146. package/engine/standard/fields/unit.lua +20 -0
  147. package/engine/synchronization.d.ts +11 -0
  148. package/engine/synchronization.lua +77 -0
  149. package/engine/text-tag.d.ts +36 -2
  150. package/engine/text-tag.lua +250 -10
  151. package/engine/unit.d.ts +6 -0
  152. package/engine/unit.lua +6 -0
  153. package/net/socket.lua +1 -1
  154. package/objutil/buff.lua +11 -10
  155. package/package.json +2 -2
  156. package/patch-lua.lua +15 -0
  157. package/patch-lualib.lua +1 -1
  158. package/utility/arrays.d.ts +2 -0
  159. package/utility/arrays.lua +11 -0
  160. package/utility/callback-array.d.ts +17 -0
  161. package/utility/callback-array.lua +61 -0
  162. package/utility/functions.d.ts +8 -0
  163. package/utility/functions.lua +13 -0
  164. package/utility/linked-map.d.ts +34 -0
  165. package/utility/linked-map.lua +101 -0
  166. package/utility/linked-set.d.ts +4 -1
  167. package/utility/linked-set.lua +43 -1
  168. package/utility/lua-maps.d.ts +15 -2
  169. package/utility/lua-maps.lua +53 -2
  170. package/utility/lua-sets.d.ts +2 -0
  171. package/utility/lua-sets.lua +7 -0
  172. package/utility/records.lua +20 -1
  173. package/utility/types.d.ts +3 -0
  174. package/core/types/order.d.ts +0 -25
  175. package/core/types/order.lua +0 -55
@@ -53,34 +53,40 @@ local ____math = require("math")
53
53
  local min = ____math.min
54
54
  local ____ignore_2Devents_2Ditems = require("engine.internal.unit.ignore-events-items")
55
55
  local ignoreEventsItems = ____ignore_2Devents_2Ditems.ignoreEventsItems
56
+ local ____attack_2Dtype = require("engine.object-data.auxiliary.attack-type")
57
+ local attackTypeToNative = ____attack_2Dtype.attackTypeToNative
58
+ local nativeToAttackType = ____attack_2Dtype.nativeToAttackType
59
+ local ____damage_2Dmetadata_2Dby_2Dtarget = require("engine.internal.misc.damage-metadata-by-target")
60
+ local damageMetadataByTarget = ____damage_2Dmetadata_2Dby_2Dtarget.damageMetadataByTarget
61
+ local ____attributes = require("attributes")
62
+ local isAttribute = ____attributes.isAttribute
63
+ local ____ability = require("engine.internal.item.ability")
64
+ local doUnitAbilityAction = ____ability.doUnitAbilityAction
65
+ local ____synchronization = require("engine.synchronization")
66
+ local synchronizer = ____synchronization.synchronizer
67
+ local ____linked_2Dmap = require("utility.linked-map")
68
+ local LinkedMap = ____linked_2Dmap.LinkedMap
56
69
  local match = string.match
57
70
  local ____tostring = _G.tostring
58
71
  local setUnitAnimation = SetUnitAnimation
59
- local setUnitAnimationWithRarity = SetUnitAnimationWithRarity
60
72
  local setUnitAnimationByIndex = SetUnitAnimationByIndex
61
- local queueUnitAnimation = QueueUnitAnimation
62
73
  local getUnitIntegerField = BlzGetUnitIntegerField
63
74
  local getUnitRealField = BlzGetUnitRealField
64
75
  local getHeroStr = GetHeroStr
65
76
  local getHeroAgi = GetHeroAgi
66
77
  local getHeroInt = GetHeroInt
67
- local setHeroStr = SetHeroStr
68
- local setHeroAgi = SetHeroAgi
69
- local setHeroInt = SetHeroInt
70
78
  local getUnitBooleanField = BlzGetUnitBooleanField
71
79
  local getUnitStringField = BlzGetUnitStringField
72
80
  local setUnitIntegerField = BlzSetUnitIntegerField
73
81
  local setUnitRealField = BlzSetUnitRealField
74
82
  local setUnitBooleanField = BlzSetUnitBooleanField
75
83
  local setUnitStringField = BlzSetUnitStringField
76
- local setUnitScale = SetUnitScale
77
84
  local setUnitPosition = SetUnitPosition
78
85
  local setUnitTimeScale = SetUnitTimeScale
79
86
  local getHandleId = GetHandleId
80
87
  local getUnitCurrentOrder = GetUnitCurrentOrder
81
88
  local createUnit = CreateUnit
82
89
  local killUnit = KillUnit
83
- local setUnitExploded = SetUnitExploded
84
90
  local removeUnit = RemoveUnit
85
91
  local getUnitTypeId = GetUnitTypeId
86
92
  local isHeroUnitId = IsHeroUnitId
@@ -96,15 +102,12 @@ local getSpellTargetItem = GetSpellTargetItem
96
102
  local getSpellTargetDestructable = GetSpellTargetDestructable
97
103
  local isUnitInRangeXY = IsUnitInRangeXY
98
104
  local isUnitInRange = IsUnitInRange
99
- local setResourceAmount = SetResourceAmount
100
- local getResourceAmount = GetResourceAmount
101
105
  local getUnitWeaponRealField = BlzGetUnitWeaponRealField
102
106
  local setUnitWeaponRealField = BlzSetUnitWeaponRealField
103
107
  local getUnitWeaponStringField = BlzGetUnitWeaponStringField
104
108
  local setUnitWeaponStringField = BlzSetUnitWeaponStringField
105
109
  local getUnitAbilityLevel = GetUnitAbilityLevel
106
110
  local unitDisableAbility = BlzUnitDisableAbility
107
- local unitInterruptAttack = BlzUnitInterruptAttack
108
111
  local isUnitInvisible = IsUnitInvisible
109
112
  local isUnitVisible = IsUnitVisible
110
113
  local getUnitX = GetUnitX
@@ -121,15 +124,9 @@ local getOrderedUnit = GetOrderedUnit
121
124
  local getIssuedOrderId = GetIssuedOrderId
122
125
  local isUnitInvulnerable = BlzIsUnitInvulnerable
123
126
  local unitAlive = UnitAlive
124
- local unitAddType = UnitAddType
125
- local unitRemoveType = UnitRemoveType
126
- local isUnitIllusion = IsUnitIllusion
127
- local isUnitType = IsUnitType
128
127
  local isUnitAlly = IsUnitAlly
129
128
  local isUnitEnemy = IsUnitEnemy
130
129
  local getOwningPlayer = GetOwningPlayer
131
- local setUnitColor = SetUnitColor
132
- local showUnitTeamGlow = BlzShowUnitTeamGlow
133
130
  ____exports.UnitClassification = {}
134
131
  local UnitClassification = ____exports.UnitClassification
135
132
  do
@@ -139,6 +136,7 @@ do
139
136
  UnitClassification.GROUND = UNIT_TYPE_GROUND
140
137
  UnitClassification.SUMMONED = UNIT_TYPE_SUMMONED
141
138
  UnitClassification.MECHANICAL = UNIT_TYPE_MECHANICAL
139
+ UnitClassification.WORKER = UNIT_TYPE_PEON
142
140
  UnitClassification.ANCIENT = UNIT_TYPE_ANCIENT
143
141
  UnitClassification.SUICIDAL = UNIT_TYPE_SAPPER
144
142
  UnitClassification.TAUREN = UNIT_TYPE_TAUREN
@@ -346,6 +344,9 @@ local function dispatchAbility(event)
346
344
  }
347
345
  )
348
346
  end
347
+ local function damagingEventPreventRetaliation(self)
348
+ self[0] = true
349
+ end
349
350
  local function damageEventPreventDeath(self, callback, ...)
350
351
  if self[0] ~= nil then
351
352
  return
@@ -357,7 +358,14 @@ local function damageEventPreventDeath(self, callback, ...)
357
358
  rawset(self, 1 + i, (select(i, ...)))
358
359
  end
359
360
  end
360
- local damageSetters = {amount = BlzSetEventDamage, attackType = BlzSetEventAttackType, damageType = BlzSetEventDamageType, weaponType = BlzSetEventWeaponType}
361
+ local damageSetters = {
362
+ amount = BlzSetEventDamage,
363
+ attackType = function(attackType)
364
+ return BlzSetEventAttackType(attackTypeToNative(attackType))
365
+ end,
366
+ damageType = BlzSetEventDamageType,
367
+ weaponType = BlzSetEventWeaponType
368
+ }
361
369
  local jlimitopByOperator = {
362
370
  [0] = LESS_THAN_OR_EQUAL,
363
371
  [1] = LESS_THAN_OR_EQUAL,
@@ -375,15 +383,27 @@ local modifiers = {
375
383
  end,
376
384
  armor = function(unit, value)
377
385
  if UnitAddAbility(unit, armorBonusAbilityId) then
378
- assert(UnitMakeAbilityPermanent(unit, true, armorBonusAbilityId))
386
+ assert(
387
+ UnitMakeAbilityPermanent(unit, true, armorBonusAbilityId),
388
+ "armor bonus ability must be made permanent",
389
+ unit
390
+ )
379
391
  end
380
- local ability = assert(BlzGetUnitAbility(unit, armorBonusAbilityId))
381
- assert(BlzSetAbilityRealLevelField(
382
- ability,
383
- armorBonusField,
384
- 0,
385
- BlzGetAbilityRealLevelField(ability, armorBonusField, 0) + value
386
- ))
392
+ local ability = assert(
393
+ BlzGetUnitAbility(unit, armorBonusAbilityId),
394
+ "armor bonus ability must be existing",
395
+ unit
396
+ )
397
+ assert(
398
+ BlzSetAbilityRealLevelField(
399
+ ability,
400
+ armorBonusField,
401
+ 0,
402
+ BlzGetAbilityRealLevelField(ability, armorBonusField, 0) + value
403
+ ),
404
+ "armor bonus ability field must be set",
405
+ unit
406
+ )
387
407
  end
388
408
  }
389
409
  local getters = {
@@ -401,6 +421,19 @@ function UnitWeapon.prototype.____constructor(self, unit, index)
401
421
  self.unit = unit
402
422
  self.index = index
403
423
  end
424
+ __TS__SetDescriptor(
425
+ UnitWeapon.prototype,
426
+ "isEnabled",
427
+ {
428
+ get = function(self)
429
+ return BlzGetUnitWeaponBooleanField(self.unit.handle, UNIT_WEAPON_BF_ATTACKS_ENABLED, self.index)
430
+ end,
431
+ set = function(self, isEnabled)
432
+ BlzSetUnitWeaponBooleanField(self.unit.handle, UNIT_WEAPON_BF_ATTACKS_ENABLED, self.index, isEnabled)
433
+ end
434
+ },
435
+ true
436
+ )
404
437
  __TS__SetDescriptor(
405
438
  UnitWeapon.prototype,
406
439
  "cooldown",
@@ -435,6 +468,19 @@ __TS__SetDescriptor(
435
468
  },
436
469
  true
437
470
  )
471
+ __TS__SetDescriptor(
472
+ UnitWeapon.prototype,
473
+ "allowedTargetCombatClassifications",
474
+ {
475
+ get = function(self)
476
+ return BlzGetUnitWeaponIntegerField(self.unit.handle, UNIT_WEAPON_IF_ATTACK_TARGETS_ALLOWED, self.index)
477
+ end,
478
+ set = function(self, allowedTargetCombatClassifications)
479
+ BlzSetUnitWeaponIntegerField(self.unit.handle, UNIT_WEAPON_IF_ATTACK_TARGETS_ALLOWED, self.index, allowedTargetCombatClassifications)
480
+ end
481
+ },
482
+ true
483
+ )
438
484
  __TS__SetDescriptor(
439
485
  UnitWeapon.prototype,
440
486
  "damageBase",
@@ -611,26 +657,30 @@ local fieldSetters = {
611
657
  }
612
658
  local dummies = {}
613
659
  for ____, player in ipairs(Player.all) do
614
- local dummy = assert(createUnit(
615
- player.handle,
616
- dummyUnitId,
617
- 0,
618
- 0,
619
- 270
620
- ))
660
+ local dummy = assert(
661
+ createUnit(
662
+ player.handle,
663
+ dummyUnitId,
664
+ 0,
665
+ 0,
666
+ 270
667
+ ),
668
+ "dummy must be created",
669
+ player
670
+ )
621
671
  ShowUnit(dummy, false)
622
672
  dummies[player] = dummy
623
673
  end
624
674
  local function delayHealthChecksCallback(unit)
625
- local counter = (unit[103] or 0) - 1
675
+ local counter = (unit[104] or 0) - 1
626
676
  if counter ~= 0 then
627
- unit[103] = counter
677
+ unit[104] = counter
628
678
  return
629
679
  end
630
- unit[103] = nil
631
- local healthBonus = unit[104]
680
+ unit[104] = nil
681
+ local healthBonus = unit[105]
632
682
  if healthBonus ~= nil then
633
- unit[104] = nil
683
+ unit[105] = nil
634
684
  local handle = unit.handle
635
685
  BlzSetUnitMaxHP(
636
686
  handle,
@@ -639,50 +689,78 @@ local function delayHealthChecksCallback(unit)
639
689
  end
640
690
  end
641
691
  local nextSyncId = 1
642
- local unitBySyncId = setmetatable({}, {__mode = "k"})
692
+ local unitBySyncId = setmetatable({}, {__mode = "v"})
693
+ local damagingEventByTarget = setmetatable({}, {__mode = "k"})
694
+ local function addAbility(unit, abilityTypeId)
695
+ local ____unitAddAbility_result_0
696
+ if unitAddAbility(unit, abilityTypeId) then
697
+ ____unitAddAbility_result_0 = getUnitAbility(unit, abilityTypeId)
698
+ else
699
+ ____unitAddAbility_result_0 = nil
700
+ end
701
+ return ____unitAddAbility_result_0
702
+ end
643
703
  ____exports.Unit = __TS__Class()
644
704
  local Unit = ____exports.Unit
645
705
  Unit.name = "Unit"
646
706
  __TS__ClassExtends(Unit, Handle)
647
707
  function Unit.prototype.____constructor(self, handle)
648
708
  Handle.prototype.____constructor(self, handle)
649
- local ____nextSyncId_0 = nextSyncId
650
- nextSyncId = ____nextSyncId_0 + 1
651
- self.syncId = ____nextSyncId_0
709
+ local ____nextSyncId_1 = nextSyncId
710
+ nextSyncId = ____nextSyncId_1 + 1
711
+ self.syncId = ____nextSyncId_1
652
712
  self._owner = Player:of(getOwningPlayer(handle))
653
- assert(unitAddAbility(handle, leaveDetectAbilityId) and UnitMakeAbilityPermanent(handle, true, leaveDetectAbilityId))
654
- assert(unitAddAbility(handle, morphDetectAbilityId))
713
+ assert(
714
+ unitAddAbility(handle, leaveDetectAbilityId) and UnitMakeAbilityPermanent(handle, true, leaveDetectAbilityId),
715
+ "leave detection ability must be added",
716
+ self
717
+ )
718
+ assert(
719
+ unitAddAbility(handle, morphDetectAbilityId),
720
+ "morph detection ability must be added",
721
+ self
722
+ )
655
723
  if unitAddAbility(
656
724
  handle,
657
725
  fourCC("Amrf")
658
726
  ) then
659
- assert(unitRemoveAbility(
660
- handle,
661
- fourCC("Amrf")
662
- ))
727
+ assert(
728
+ unitRemoveAbility(
729
+ handle,
730
+ fourCC("Amrf")
731
+ ),
732
+ "fly ability must be removed after addition",
733
+ self
734
+ )
663
735
  end
664
736
  unitBySyncId[self.syncId] = self
665
737
  local ____ = self.abilities
666
738
  end
667
- function Unit.prototype.getEvent(self, event, collector)
668
- self.events = self.events or ({})
669
- local eventId = GetHandleId(event)
670
- if not self.events[eventId] then
671
- self.events[eventId] = __TS__New(
739
+ function Unit.prototype.getEvent(self, jevent, collector)
740
+ self.events = self.events or __TS__New(LinkedMap)
741
+ local eventId = GetHandleId(jevent)
742
+ local event = self.events:get(eventId)
743
+ if event == nil then
744
+ event = __TS__New(
672
745
  TriggerEvent,
673
746
  function(trigger)
674
- TriggerRegisterUnitEvent(trigger, self.handle, event)
747
+ TriggerRegisterUnitEvent(trigger, self.handle, jevent)
675
748
  end,
676
749
  collector or (function() return {} end)
677
750
  )
751
+ self.events:put(eventId, event)
678
752
  end
679
- return self.events[eventId]
753
+ return event
754
+ end
755
+ function Unit.prototype.saveData(self)
756
+ local handle = self.handle
757
+ self[108] = self[108] or getUnitX(handle)
758
+ self[109] = self[109] or getUnitY(handle)
759
+ self._owner = self._owner or Player:of(getOwningPlayer(handle))
680
760
  end
681
761
  function Unit.prototype.onDestroy(self)
682
762
  local handle = self.handle
683
- if not self._owner then
684
- self._owner = Player:of(getOwningPlayer(handle))
685
- end
763
+ self:saveData()
686
764
  local abilities = self.abilities
687
765
  for ____, ability in ipairs(abilities) do
688
766
  ability:destroy()
@@ -718,7 +796,11 @@ function Unit.prototype.addAttackHandler(self, condition, action)
718
796
  self._attackHandlers = handlers
719
797
  if #handlers == 1 then
720
798
  local handle = self.handle
721
- assert(unitAddAbility(handle, attackHandlerAbilityId) and UnitMakeAbilityPermanent(handle, true, attackHandlerAbilityId))
799
+ assert(
800
+ unitAddAbility(handle, attackHandlerAbilityId) and UnitMakeAbilityPermanent(handle, true, attackHandlerAbilityId),
801
+ "attack handler ability must be added",
802
+ self
803
+ )
722
804
  end
723
805
  return handler
724
806
  end
@@ -747,17 +829,17 @@ function Unit.prototype.addModifier(self, property, modifier)
747
829
  end}
748
830
  end
749
831
  function Unit.prototype.hasCombatClassification(self, combatClassification)
750
- local ____combatClassification_1 = combatClassification
751
- return getUnitIntegerField(self.handle, UNIT_IF_TARGETED_AS) & ____combatClassification_1 == ____combatClassification_1
832
+ local ____combatClassification_2 = combatClassification
833
+ return getUnitIntegerField(self.handle, UNIT_IF_TARGETED_AS) & ____combatClassification_2 == ____combatClassification_2
752
834
  end
753
835
  function Unit.prototype.addClassification(self, classification)
754
- return unitAddType(self.handle, classification)
836
+ return UnitAddType(self.handle, classification)
755
837
  end
756
838
  function Unit.prototype.removeClassification(self, classification)
757
- return unitRemoveType(self.handle, classification)
839
+ return UnitRemoveType(self.handle, classification)
758
840
  end
759
841
  function Unit.prototype.hasClassification(self, classification)
760
- return isUnitType(self.handle, classification)
842
+ return IsUnitType(self.handle, classification)
761
843
  end
762
844
  function Unit.prototype.isVisibleTo(self, player)
763
845
  return isUnitVisible(self.handle, player.handle)
@@ -766,13 +848,13 @@ function Unit.prototype.isInvisibleTo(self, player)
766
848
  return isUnitInvisible(self.handle, player.handle)
767
849
  end
768
850
  function Unit.prototype.isInRangeOf(self, x, y, range)
769
- local ____temp_2
851
+ local ____temp_3
770
852
  if type(x) == "number" then
771
- ____temp_2 = isUnitInRangeXY(self.handle, x, y, range)
853
+ ____temp_3 = isUnitInRangeXY(self.handle, x, y, range)
772
854
  else
773
- ____temp_2 = isUnitInRange(self.handle, x.handle, y)
855
+ ____temp_3 = isUnitInRange(self.handle, x.handle, y)
774
856
  end
775
- return ____temp_2
857
+ return ____temp_3
776
858
  end
777
859
  function Unit.prototype.isAllyOf(self, unit)
778
860
  return isUnitAlly(
@@ -790,16 +872,30 @@ function Unit.prototype.playAnimation(self, animation, rarity)
790
872
  if type(animation) == "number" then
791
873
  setUnitAnimationByIndex(self.handle, animation)
792
874
  elseif rarity then
793
- setUnitAnimationWithRarity(self.handle, animation, rarity)
875
+ SetUnitAnimationWithRarity(self.handle, animation, rarity)
794
876
  else
795
877
  setUnitAnimation(self.handle, animation)
796
878
  end
797
879
  end
880
+ function Unit.prototype.resetAnimation(self)
881
+ ResetUnitAnimation(self.handle)
882
+ end
798
883
  function Unit.prototype.queueAnimation(self, animation)
799
- queueUnitAnimation(self.handle, animation)
884
+ QueueUnitAnimation(self.handle, animation)
885
+ end
886
+ function Unit.prototype.chooseWeapon(self, target)
887
+ local firstWeapon = self.firstWeapon
888
+ if firstWeapon.isEnabled and target:isAllowedTarget(self, firstWeapon.allowedTargetCombatClassifications) then
889
+ return firstWeapon
890
+ end
891
+ local secondWeapon = self.secondWeapon
892
+ if secondWeapon.isEnabled and target:isAllowedTarget(target, secondWeapon.allowedTargetCombatClassifications) then
893
+ return secondWeapon
894
+ end
895
+ return nil
800
896
  end
801
897
  function Unit.prototype.delayHealthChecks(self)
802
- self[103] = (self[103] or 0) + 1
898
+ self[104] = (self[104] or 0) + 1
803
899
  Timer:run(delayHealthChecksCallback, self)
804
900
  end
805
901
  function Unit.prototype.setPosition(self, x, y)
@@ -809,21 +905,21 @@ function Unit.prototype.isSelected(self, player)
809
905
  return IsUnitSelected(self.handle, player.handle)
810
906
  end
811
907
  function Unit.prototype.explode(self)
812
- setUnitExploded(self.handle, true)
908
+ SetUnitExploded(self.handle, true)
813
909
  killUnit(self.handle)
814
910
  end
815
911
  function Unit.prototype.kill(self)
816
912
  killUnit(self.handle)
817
913
  end
818
914
  function Unit.prototype.revive(self, x, y, doEffect)
819
- local ____ReviveHero_5 = ReviveHero
820
- local ____array_4 = __TS__SparseArrayNew(self.handle, x, y)
821
- local ____doEffect_3 = doEffect
822
- if ____doEffect_3 == nil then
823
- ____doEffect_3 = false
915
+ local ____ReviveHero_6 = ReviveHero
916
+ local ____array_5 = __TS__SparseArrayNew(self.handle, x, y)
917
+ local ____doEffect_4 = doEffect
918
+ if ____doEffect_4 == nil then
919
+ ____doEffect_4 = false
824
920
  end
825
- __TS__SparseArrayPush(____array_4, ____doEffect_3)
826
- ____ReviveHero_5(__TS__SparseArraySpread(____array_4))
921
+ __TS__SparseArrayPush(____array_5, ____doEffect_4)
922
+ ____ReviveHero_6(__TS__SparseArraySpread(____array_5))
827
923
  end
828
924
  function Unit.prototype.healTarget(self, target, amount)
829
925
  if __TS__InstanceOf(target, ____exports.Unit) and target:hasAbility(fourCC("BIhm")) then
@@ -866,17 +962,16 @@ function Unit.prototype.itemInSlot(self, slot)
866
962
  return Item:of(unitItemInSlot(self.handle, slot))
867
963
  end
868
964
  function Unit.prototype.addAbility(self, abilityId)
869
- if unitAddAbility(self.handle, abilityId) then
870
- local ability = UnitAbility:of(
871
- checkNotNull(getUnitAbility(self.handle, abilityId)),
872
- abilityId,
873
- self
874
- )
965
+ local ability = UnitAbility:of(
966
+ doUnitAbilityAction(self.handle, abilityId, addAbility, abilityId),
967
+ abilityId,
968
+ self
969
+ )
970
+ if ability ~= nil then
875
971
  local abilities = self.abilities
876
972
  abilities[#abilities + 1] = ability
877
- return ability
878
973
  end
879
- return nil
974
+ return ability
880
975
  end
881
976
  function Unit.prototype.makeAbilityPermanent(self, abilityId, permanent)
882
977
  return UnitMakeAbilityPermanent(self.handle, permanent, abilityId)
@@ -890,31 +985,21 @@ end
890
985
  function Unit.prototype.hasAbility(self, abilityId)
891
986
  return getUnitAbilityLevel(self.handle, abilityId) > 0
892
987
  end
893
- function Unit.prototype.getAbilityById(self, abilityId)
894
- local handle = self.handle
895
- if unitAddAbility(handle, abilityId) then
896
- assert(unitRemoveAbility(handle, abilityId))
897
- return nil
898
- end
899
- return UnitAbility:of(
900
- getUnitAbility(self.handle, abilityId),
901
- abilityId,
902
- self
903
- )
988
+ function Unit.prototype.getAbility(self, abilityId)
989
+ local ability = doUnitAbilityAction(self.handle, abilityId, getUnitAbility, abilityId)
990
+ return UnitAbility:of(ability, abilityId, self)
904
991
  end
905
- function Unit.prototype.removeAbility(self, abilityId)
906
- if unitRemoveAbility(self.handle, abilityId) then
907
- local abilities = self.abilities
908
- for i = 1, #abilities do
909
- if abilities[i].typeId == abilityId then
910
- abilities[i]:destroy()
911
- tremove(abilities, i)
912
- return true
913
- end
992
+ function Unit.prototype.removeAbility(self, abilityTypeId)
993
+ local abilities = self.abilities
994
+ for i = 1, #abilities do
995
+ if abilities[i].typeId == abilityTypeId then
996
+ local ability = abilities[i]
997
+ tremove(abilities, i)
998
+ ability:destroy()
999
+ return true
914
1000
  end
915
- return true
916
1001
  end
917
- return false
1002
+ return doUnitAbilityAction(self.handle, abilityTypeId, unitRemoveAbility, abilityTypeId)
918
1003
  end
919
1004
  function Unit.prototype.hideAbility(self, abilityId, flag)
920
1005
  BlzUnitHideAbility(self.handle, abilityId, flag)
@@ -928,9 +1013,6 @@ end
928
1013
  function Unit.prototype.endAbilityCooldown(self, abilityId)
929
1014
  BlzEndUnitAbilityCooldown(self.handle, abilityId)
930
1015
  end
931
- function Unit.prototype.interruptAttack(self)
932
- unitInterruptAttack(self.handle)
933
- end
934
1016
  function Unit.prototype.interruptCast(self, abilityId)
935
1017
  local handle = self.handle
936
1018
  unitDisableAbility(handle, abilityId, true, false)
@@ -1001,18 +1083,44 @@ function Unit.prototype.unpauseEx(self)
1001
1083
  end
1002
1084
  function Unit.prototype.incrementStunCounter(self)
1003
1085
  local stunCounter = self[102] or 0
1004
- if not self[101] or stunCounter >= 0 then
1086
+ if not self[101] and (self[103] or 0) <= 0 or stunCounter >= 0 then
1005
1087
  BlzPauseUnitEx(self.handle, true)
1006
1088
  end
1007
1089
  self[102] = stunCounter + 1
1008
1090
  end
1009
1091
  function Unit.prototype.decrementStunCounter(self)
1010
1092
  local stunCounter = self[102] or 0
1011
- if not self[101] or stunCounter >= 1 then
1093
+ if not self[101] and (self[103] or 0) <= 0 or stunCounter >= 1 then
1012
1094
  BlzPauseUnitEx(self.handle, false)
1013
1095
  end
1014
1096
  self[102] = stunCounter - 1
1015
1097
  end
1098
+ function Unit.prototype.incrementForceStunCounter(self)
1099
+ local forceStunCounter = self[103] or 0
1100
+ if forceStunCounter == 0 then
1101
+ local handle = self.handle
1102
+ if not self[101] then
1103
+ for _ = self[102] or 0, -1 do
1104
+ BlzPauseUnitEx(handle, true)
1105
+ end
1106
+ end
1107
+ BlzPauseUnitEx(handle, true)
1108
+ end
1109
+ self[103] = forceStunCounter + 1
1110
+ end
1111
+ function Unit.prototype.decrementForceStunCounter(self)
1112
+ local forceStunCounter = self[103] or 0
1113
+ if forceStunCounter == 1 then
1114
+ local handle = self.handle
1115
+ if not self[101] then
1116
+ for _ = self[102] or 0, -1 do
1117
+ BlzPauseUnitEx(handle, false)
1118
+ end
1119
+ end
1120
+ BlzPauseUnitEx(handle, false)
1121
+ end
1122
+ self[103] = forceStunCounter - 1
1123
+ end
1016
1124
  function Unit.create(self, owner, id, x, y, facing, skinId)
1017
1125
  local handle = skinId and BlzCreateUnitWithSkin(
1018
1126
  owner.handle,
@@ -1201,7 +1309,7 @@ __TS__SetDescriptor(
1201
1309
  Unit.prototype,
1202
1310
  "isIllusion",
1203
1311
  {get = function(self)
1204
- return isUnitIllusion(self.handle)
1312
+ return IsUnitIllusion(self.handle)
1205
1313
  end},
1206
1314
  true
1207
1315
  )
@@ -1288,13 +1396,13 @@ __TS__SetDescriptor(
1288
1396
  )
1289
1397
  __TS__SetDescriptor(
1290
1398
  Unit.prototype,
1291
- "strengthBase",
1399
+ "primaryAttribute",
1292
1400
  {
1293
1401
  get = function(self)
1294
- return getHeroStr(self.handle, false)
1402
+ return getUnitIntegerField(self.handle, UNIT_IF_PRIMARY_ATTRIBUTE)
1295
1403
  end,
1296
- set = function(self, strengthBase)
1297
- setHeroStr(self.handle, strengthBase, true)
1404
+ set = function(self, primaryAttribute)
1405
+ setUnitIntegerField(self.handle, UNIT_IF_PRIMARY_ATTRIBUTE, primaryAttribute)
1298
1406
  end
1299
1407
  },
1300
1408
  true
@@ -1316,19 +1424,6 @@ __TS__SetDescriptor(
1316
1424
  end},
1317
1425
  true
1318
1426
  )
1319
- __TS__SetDescriptor(
1320
- Unit.prototype,
1321
- "agilityBase",
1322
- {
1323
- get = function(self)
1324
- return getHeroAgi(self.handle, false)
1325
- end,
1326
- set = function(self, agilityBase)
1327
- setHeroAgi(self.handle, agilityBase, true)
1328
- end
1329
- },
1330
- true
1331
- )
1332
1427
  __TS__SetDescriptor(
1333
1428
  Unit.prototype,
1334
1429
  "agilityBonus",
@@ -1346,19 +1441,6 @@ __TS__SetDescriptor(
1346
1441
  end},
1347
1442
  true
1348
1443
  )
1349
- __TS__SetDescriptor(
1350
- Unit.prototype,
1351
- "intelligenceBase",
1352
- {
1353
- get = function(self)
1354
- return getHeroInt(self.handle, false)
1355
- end,
1356
- set = function(self, intelligenceBase)
1357
- setHeroInt(self.handle, intelligenceBase, true)
1358
- end
1359
- },
1360
- true
1361
- )
1362
1444
  __TS__SetDescriptor(
1363
1445
  Unit.prototype,
1364
1446
  "intelligenceBonus",
@@ -1407,17 +1489,17 @@ __TS__SetDescriptor(
1407
1489
  "isTeamGlowVisible",
1408
1490
  {
1409
1491
  get = function(self)
1410
- return not self[106]
1492
+ return not self[107]
1411
1493
  end,
1412
1494
  set = function(self, isTeamGlowVisible)
1413
- showUnitTeamGlow(self.handle, isTeamGlowVisible)
1414
- local ____temp_6
1495
+ BlzShowUnitTeamGlow(self.handle, isTeamGlowVisible)
1496
+ local ____temp_7
1415
1497
  if not isTeamGlowVisible then
1416
- ____temp_6 = true
1498
+ ____temp_7 = true
1417
1499
  else
1418
- ____temp_6 = nil
1500
+ ____temp_7 = nil
1419
1501
  end
1420
- self[106] = ____temp_6
1502
+ self[107] = ____temp_7
1421
1503
  end
1422
1504
  },
1423
1505
  true
@@ -1426,9 +1508,9 @@ __TS__SetDescriptor(
1426
1508
  Unit.prototype,
1427
1509
  "color",
1428
1510
  {set = function(self, color)
1429
- setUnitColor(self.handle, color.handle)
1430
- if self[106] then
1431
- showUnitTeamGlow(self.handle, false)
1511
+ SetUnitColor(self.handle, color.handle)
1512
+ if self[107] then
1513
+ BlzShowUnitTeamGlow(self.handle, false)
1432
1514
  end
1433
1515
  end},
1434
1516
  true
@@ -1451,14 +1533,14 @@ __TS__SetDescriptor(
1451
1533
  "maxHealth",
1452
1534
  {
1453
1535
  get = function(self)
1454
- return BlzGetUnitMaxHP(self.handle) - (self[104] or 0) - (self[105] or 0)
1536
+ return BlzGetUnitMaxHP(self.handle) - (self[105] or 0) - (self[106] or 0)
1455
1537
  end,
1456
1538
  set = function(self, maxHealth)
1457
- if maxHealth < 1 and self[103] ~= nil then
1458
- self[104] = (self[104] or 0) + (1 - maxHealth)
1539
+ if maxHealth < 1 and self[104] ~= nil then
1540
+ self[105] = (self[105] or 0) + (1 - maxHealth)
1459
1541
  maxHealth = 1
1460
1542
  end
1461
- BlzSetUnitMaxHP(self.handle, maxHealth + (self[105] or 0))
1543
+ BlzSetUnitMaxHP(self.handle, maxHealth + (self[106] or 0))
1462
1544
  end
1463
1545
  },
1464
1546
  true
@@ -1500,10 +1582,10 @@ __TS__SetDescriptor(
1500
1582
  "health",
1501
1583
  {
1502
1584
  get = function(self)
1503
- return GetWidgetLife(self.handle) - (self[105] or 0)
1585
+ return GetWidgetLife(self.handle) - (self[106] or 0)
1504
1586
  end,
1505
1587
  set = function(self, health)
1506
- SetWidgetLife(self.handle, health + (self[105] or 0))
1588
+ SetWidgetLife(self.handle, health + (self[106] or 0))
1507
1589
  end
1508
1590
  },
1509
1591
  true
@@ -1579,25 +1661,12 @@ __TS__SetDescriptor(
1579
1661
  },
1580
1662
  true
1581
1663
  )
1582
- __TS__SetDescriptor(
1583
- Unit.prototype,
1584
- "flyHeight",
1585
- {
1586
- get = function(self)
1587
- return getUnitFlyHeight(self.handle)
1588
- end,
1589
- set = function(self, v)
1590
- SetUnitFlyHeight(self.handle, v, 100000)
1591
- end
1592
- },
1593
- true
1594
- )
1595
1664
  __TS__SetDescriptor(
1596
1665
  Unit.prototype,
1597
1666
  "x",
1598
1667
  {
1599
1668
  get = function(self)
1600
- return getUnitX(self.handle)
1669
+ return self[108] or getUnitX(self.handle)
1601
1670
  end,
1602
1671
  set = function(self, v)
1603
1672
  SetUnitX(self.handle, v)
@@ -1610,7 +1679,7 @@ __TS__SetDescriptor(
1610
1679
  "y",
1611
1680
  {
1612
1681
  get = function(self)
1613
- return getUnitY(self.handle)
1682
+ return self[109] or getUnitY(self.handle)
1614
1683
  end,
1615
1684
  set = function(self, v)
1616
1685
  SetUnitY(self.handle, v)
@@ -1696,10 +1765,10 @@ __TS__SetDescriptor(
1696
1765
  "gold",
1697
1766
  {
1698
1767
  get = function(self)
1699
- return getResourceAmount(self.handle)
1768
+ return GetResourceAmount(self.handle)
1700
1769
  end,
1701
1770
  set = function(self, gold)
1702
- setResourceAmount(self.handle, gold)
1771
+ SetResourceAmount(self.handle, gold)
1703
1772
  end
1704
1773
  },
1705
1774
  true
@@ -1715,14 +1784,18 @@ __TS__SetDescriptor(
1715
1784
  local handle = self.handle
1716
1785
  if isPaused and not IsUnitPaused(handle) then
1717
1786
  self[101] = true
1718
- for _ = self[102] or 0, -1 do
1719
- BlzPauseUnitEx(handle, true)
1787
+ if (self[103] or 0) <= 0 then
1788
+ for _ = self[102] or 0, -1 do
1789
+ BlzPauseUnitEx(handle, true)
1790
+ end
1720
1791
  end
1721
1792
  PauseUnit(handle, true)
1722
1793
  elseif not isPaused and IsUnitPaused(handle) then
1723
1794
  PauseUnit(handle, false)
1724
- for _ = self[102] or 0, -1 do
1725
- BlzPauseUnitEx(handle, false)
1795
+ if (self[103] or 0) <= 0 then
1796
+ for _ = self[102] or 0, -1 do
1797
+ BlzPauseUnitEx(handle, false)
1798
+ end
1726
1799
  end
1727
1800
  self[101] = nil
1728
1801
  end
@@ -1780,20 +1853,6 @@ __TS__SetDescriptor(
1780
1853
  },
1781
1854
  true
1782
1855
  )
1783
- __TS__SetDescriptor(
1784
- Unit.prototype,
1785
- "scale",
1786
- {
1787
- get = function(self)
1788
- return getUnitRealField(self.handle, UNIT_RF_SCALING_VALUE)
1789
- end,
1790
- set = function(self, v)
1791
- setUnitScale(self.handle, v, v, v)
1792
- setUnitRealField(self.handle, UNIT_RF_SCALING_VALUE, v)
1793
- end
1794
- },
1795
- true
1796
- )
1797
1856
  __TS__SetDescriptor(
1798
1857
  Unit.prototype,
1799
1858
  "timeScale",
@@ -1827,6 +1886,19 @@ __TS__SetDescriptor(
1827
1886
  end},
1828
1887
  true
1829
1888
  )
1889
+ __TS__SetDescriptor(
1890
+ Unit.prototype,
1891
+ "movementType",
1892
+ {
1893
+ get = function(self)
1894
+ return getUnitIntegerField(self.handle, UNIT_IF_MOVE_TYPE)
1895
+ end,
1896
+ set = function(self, movementType)
1897
+ setUnitIntegerField(self.handle, UNIT_IF_MOVE_TYPE, movementType)
1898
+ end
1899
+ },
1900
+ true
1901
+ )
1830
1902
  __TS__SetDescriptor(
1831
1903
  Unit.prototype,
1832
1904
  "pathing",
@@ -1917,30 +1989,6 @@ __TS__SetDescriptor(
1917
1989
  end},
1918
1990
  true
1919
1991
  )
1920
- __TS__SetDescriptor(
1921
- Unit.prototype,
1922
- "onUnitInRange",
1923
- {get = function(self)
1924
- local handle = self.handle
1925
- local onUnitInRange = setmetatable(
1926
- {},
1927
- {__index = function(self, value)
1928
- local event = __TS__New(
1929
- TriggerEvent,
1930
- function(trigger)
1931
- TriggerRegisterUnitInRangeSimple(trigger, value, handle)
1932
- end,
1933
- function() return ____exports.Unit:of(handle) end
1934
- )
1935
- rawset(self, value, event)
1936
- return event
1937
- end}
1938
- )
1939
- rawset(self, "onUnitInRange", onUnitInRange)
1940
- return onUnitInRange
1941
- end},
1942
- true
1943
- )
1944
1992
  __TS__SetDescriptor(
1945
1993
  Unit.prototype,
1946
1994
  "onManaEqual",
@@ -2008,6 +2056,14 @@ __TS__SetDescriptor(
2008
2056
  end},
2009
2057
  true
2010
2058
  )
2059
+ __TS__SetDescriptor(
2060
+ Unit.prototype,
2061
+ "targetAcquiredEvent",
2062
+ {get = function(self)
2063
+ return self:getEvent(EVENT_UNIT_ACQUIRED_TARGET)
2064
+ end},
2065
+ true
2066
+ )
2011
2067
  __TS__SetDescriptor(
2012
2068
  Unit.prototype,
2013
2069
  "onSelect",
@@ -2068,6 +2124,11 @@ __TS__SetDescriptor(
2068
2124
  end},
2069
2125
  true
2070
2126
  )
2127
+ Unit.levelChangedEvent = __TS__New(
2128
+ ____exports.UnitTriggerEvent,
2129
+ EVENT_PLAYER_HERO_LEVEL,
2130
+ function() return ____exports.Unit:of(getTriggerUnit()) end
2131
+ )
2071
2132
  Unit.deathEvent = __TS__New(
2072
2133
  ____exports.UnitTriggerEvent,
2073
2134
  EVENT_PLAYER_UNIT_DEATH,
@@ -2143,25 +2204,25 @@ Unit.onTargetCast = dispatchId(__TS__New(
2143
2204
  InitializingEvent,
2144
2205
  function(event)
2145
2206
  local function listener(unit, id)
2146
- local ____GetSpellTargetUnit_result_9
2207
+ local ____GetSpellTargetUnit_result_10
2147
2208
  if GetSpellTargetUnit() then
2148
- ____GetSpellTargetUnit_result_9 = ____exports.Unit:of(GetSpellTargetUnit())
2209
+ ____GetSpellTargetUnit_result_10 = ____exports.Unit:of(GetSpellTargetUnit())
2149
2210
  else
2150
- local ____GetSpellTargetItem_result_8
2211
+ local ____GetSpellTargetItem_result_9
2151
2212
  if GetSpellTargetItem() then
2152
- ____GetSpellTargetItem_result_8 = Item:of(GetSpellTargetItem())
2213
+ ____GetSpellTargetItem_result_9 = Item:of(GetSpellTargetItem())
2153
2214
  else
2154
- local ____GetSpellTargetDestructable_result_7
2215
+ local ____GetSpellTargetDestructable_result_8
2155
2216
  if GetSpellTargetDestructable() then
2156
- ____GetSpellTargetDestructable_result_7 = Destructable:of(GetSpellTargetDestructable())
2217
+ ____GetSpellTargetDestructable_result_8 = Destructable:of(GetSpellTargetDestructable())
2157
2218
  else
2158
- ____GetSpellTargetDestructable_result_7 = nil
2219
+ ____GetSpellTargetDestructable_result_8 = nil
2159
2220
  end
2160
- ____GetSpellTargetItem_result_8 = ____GetSpellTargetDestructable_result_7
2221
+ ____GetSpellTargetItem_result_9 = ____GetSpellTargetDestructable_result_8
2161
2222
  end
2162
- ____GetSpellTargetUnit_result_9 = ____GetSpellTargetItem_result_8
2223
+ ____GetSpellTargetUnit_result_10 = ____GetSpellTargetItem_result_9
2163
2224
  end
2164
- local target = ____GetSpellTargetUnit_result_9
2225
+ local target = ____GetSpellTargetUnit_result_10
2165
2226
  if target then
2166
2227
  invoke(event, unit, id, target)
2167
2228
  end
@@ -2369,38 +2430,57 @@ Unit.onDamaging = (function()
2369
2430
  if source and source.typeId == dummyUnitId then
2370
2431
  source = nil
2371
2432
  end
2372
- local target = BlzGetEventDamageTarget()
2433
+ local target = ____exports.Unit:of(BlzGetEventDamageTarget())
2434
+ local metadata = damageMetadataByTarget[target]
2435
+ damageMetadataByTarget[target] = nil
2373
2436
  local data = {
2374
2437
  amount = GetEventDamage(),
2375
- attackType = BlzGetEventAttackType(),
2438
+ attackType = nativeToAttackType(BlzGetEventAttackType()),
2376
2439
  damageType = BlzGetEventDamageType(),
2377
2440
  weaponType = BlzGetEventWeaponType(),
2378
- isAttack = BlzGetEventIsAttack()
2441
+ metadata = metadata,
2442
+ isAttack = BlzGetEventIsAttack(),
2443
+ originalAmount = GetEventDamage(),
2444
+ originalMetadata = metadata,
2445
+ preventRetaliation = damagingEventPreventRetaliation
2379
2446
  }
2380
2447
  if data.isAttack and source then
2381
- local weapon = BlzGetUnitWeaponBooleanField(source.handle, UNIT_WEAPON_BF_ATTACKS_ENABLED, 1) and (BlzGetUnitWeaponBooleanField(source.handle, UNIT_WEAPON_BF_ATTACKS_ENABLED, 0) and -1 or 1) or 0
2382
- if weapon == -1 then
2383
- local targetsAllowed = BlzGetUnitWeaponIntegerField(source.handle, UNIT_WEAPON_IF_ATTACK_TARGETS_ALLOWED, 0)
2384
- weapon = 0
2385
- end
2386
- data.weapon = assert(source.weapons[weapon + 1])
2448
+ data.weapon = source:chooseWeapon(target)
2387
2449
  end
2388
2450
  if not data.isAttack or not source or not source._attackHandlers then
2389
2451
  invoke(
2390
2452
  event,
2391
2453
  source,
2392
- ____exports.Unit:of(target),
2454
+ target,
2393
2455
  setmetatable(
2394
2456
  {},
2395
2457
  {
2396
2458
  __index = data,
2397
2459
  __newindex = function(self, key, value)
2398
- damageSetters[key](value)
2460
+ local damageSetter = damageSetters[key]
2461
+ if damageSetter ~= nil then
2462
+ damageSetter(value)
2463
+ end
2399
2464
  data[key] = value
2400
2465
  end
2401
2466
  }
2402
2467
  )
2403
2468
  )
2469
+ if data[0] and source then
2470
+ local sourceOwner = source.owner.handle
2471
+ data[1] = sourceOwner
2472
+ local targetOwner = target.owner.handle
2473
+ data[2] = targetOwner
2474
+ if not GetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE) then
2475
+ SetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE, true)
2476
+ data[3] = true
2477
+ end
2478
+ if not GetPlayerAlliance(targetOwner, sourceOwner, ALLIANCE_PASSIVE) then
2479
+ SetPlayerAlliance(targetOwner, sourceOwner, ALLIANCE_PASSIVE, true)
2480
+ data[4] = true
2481
+ end
2482
+ end
2483
+ damagingEventByTarget[target] = data
2404
2484
  return
2405
2485
  end
2406
2486
  BlzSetEventDamage(0)
@@ -2408,7 +2488,7 @@ Unit.onDamaging = (function()
2408
2488
  BlzSetEventDamageType(DAMAGE_TYPE_UNKNOWN)
2409
2489
  BlzSetEventWeaponType(WEAPON_TYPE_WHOKNOWS)
2410
2490
  local sourceOwner = source.owner.handle
2411
- local targetOwner = GetOwningPlayer(target)
2491
+ local targetOwner = target.owner.handle
2412
2492
  if not GetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE) then
2413
2493
  SetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE, true)
2414
2494
  Timer:run(function()
@@ -2424,23 +2504,19 @@ Unit.onDamaging = (function()
2424
2504
  for ____, ____value in ipairs(source._attackHandlers) do
2425
2505
  local condition = ____value[1]
2426
2506
  local action = ____value[2]
2427
- if condition(
2428
- source,
2429
- ____exports.Unit:of(target),
2430
- data
2431
- ) then
2507
+ if condition(source, target, data) then
2432
2508
  action(
2433
2509
  source,
2434
- ____exports.Unit:of(target),
2510
+ target,
2435
2511
  setmetatable(
2436
2512
  {fire = function()
2437
2513
  UnitDamageTarget(
2438
2514
  source.handle,
2439
- target,
2515
+ target.handle,
2440
2516
  data.amount,
2441
2517
  true,
2442
2518
  true,
2443
- data.attackType,
2519
+ attackTypeToNative(data.attackType),
2444
2520
  data.damageType,
2445
2521
  data.weaponType
2446
2522
  )
@@ -2467,30 +2543,54 @@ Unit.onDamage = __TS__New(
2467
2543
  if source and source.typeId == dummyUnitId then
2468
2544
  source = nil
2469
2545
  end
2546
+ local target = ____exports.Unit:of(BlzGetEventDamageTarget())
2547
+ local damagingEvent = damagingEventByTarget[target]
2548
+ damagingEventByTarget[target] = nil
2470
2549
  local data = {
2471
2550
  amount = GetEventDamage(),
2472
- attackType = BlzGetEventAttackType(),
2551
+ attackType = nativeToAttackType(BlzGetEventAttackType()),
2473
2552
  damageType = BlzGetEventDamageType(),
2474
2553
  weaponType = BlzGetEventWeaponType(),
2554
+ metadata = damagingEvent and damagingEvent.metadata,
2475
2555
  isAttack = BlzGetEventIsAttack(),
2476
- originalAmount = GetEventDamage(),
2556
+ originalAmount = damagingEvent and damagingEvent.originalAmount or GetEventDamage(),
2557
+ originalMetadata = damagingEvent and damagingEvent.originalMetadata,
2477
2558
  preventDeath = damageEventPreventDeath
2478
2559
  }
2560
+ if damagingEvent then
2561
+ for key, value in pairs(damagingEvent) do
2562
+ if isAttribute(key) then
2563
+ data[key] = value
2564
+ end
2565
+ end
2566
+ local sourceOwner = damagingEvent[1]
2567
+ if sourceOwner then
2568
+ local targetOwner = damagingEvent[2]
2569
+ if damagingEvent[3] then
2570
+ SetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE, false)
2571
+ end
2572
+ if damagingEvent[4] then
2573
+ SetPlayerAlliance(targetOwner, sourceOwner, ALLIANCE_PASSIVE, false)
2574
+ end
2575
+ end
2576
+ end
2479
2577
  local evData = setmetatable(
2480
2578
  {},
2481
2579
  {
2482
2580
  __index = data,
2483
2581
  __newindex = function(self, key, value)
2484
- damageSetters[key](value)
2582
+ local damageSetter = damageSetters[key]
2583
+ if damageSetter ~= nil then
2584
+ damageSetter(value)
2585
+ end
2485
2586
  data[key] = value
2486
2587
  end
2487
2588
  }
2488
2589
  )
2489
- local target = ____exports.Unit:of(BlzGetEventDamageTarget())
2490
2590
  invoke(event, source, target, evData)
2491
2591
  if evData[0] ~= nil and target.health - evData.amount < 0.405 then
2492
2592
  local bonusHealth = math.ceil(evData.amount)
2493
- target[105] = (target[105] or 0) + bonusHealth
2593
+ target[106] = (target[106] or 0) + bonusHealth
2494
2594
  BlzSetUnitMaxHP(
2495
2595
  target.handle,
2496
2596
  BlzGetUnitMaxHP(target.handle) + bonusHealth
@@ -2504,7 +2604,7 @@ Unit.onDamage = __TS__New(
2504
2604
  evData[0],
2505
2605
  table.unpack(evData, 1 + 1, 1 + (evData[1] or 0))
2506
2606
  )
2507
- target[105] = (target[105] or 0) - bonusHealth
2607
+ target[106] = (target[106] or 0) - bonusHealth
2508
2608
  SetWidgetLife(
2509
2609
  target.handle,
2510
2610
  GetWidgetLife(target.handle) - bonusHealth
@@ -2540,10 +2640,14 @@ Unit.itemPickedUpEvent = __TS__New(
2540
2640
  ____exports.UnitTriggerEvent,
2541
2641
  EVENT_PLAYER_UNIT_PICKUP_ITEM,
2542
2642
  function()
2543
- local unit = getTriggerUnit()
2544
- local item = getManipulatedItem()
2545
- if getUnitTypeId(unit) ~= dummyUnitId and not (ignoreEventsItems[item] ~= nil) then
2546
- return ____exports.Unit:of(unit), Item:of(item)
2643
+ local unitHandle = getTriggerUnit()
2644
+ local itemHandle = getManipulatedItem()
2645
+ if getUnitTypeId(unitHandle) ~= dummyUnitId and not (ignoreEventsItems[itemHandle] ~= nil) then
2646
+ local unit = ____exports.Unit:of(unitHandle)
2647
+ local item = Item:of(itemHandle)
2648
+ if item.owner ~= unit then
2649
+ return unit, item
2650
+ end
2547
2651
  end
2548
2652
  return IgnoreEvent
2549
2653
  end
@@ -2563,7 +2667,22 @@ Unit.itemUsedEvent = __TS__New(
2563
2667
  Unit.itemStackedEvent = __TS__New(
2564
2668
  ____exports.UnitTriggerEvent,
2565
2669
  EVENT_PLAYER_UNIT_STACK_ITEM,
2566
- function() return ____exports.Unit:of(getTriggerUnit()), Item:of(getManipulatedItem()) end
2670
+ function() return ____exports.Unit:of(getTriggerUnit()), Item:of(BlzGetStackingItemTarget()), Item:of(BlzGetStackingItemSource()) end
2671
+ )
2672
+ __TS__ObjectDefineProperty(
2673
+ Unit,
2674
+ "itemChargesChangedEvent",
2675
+ {get = function(self)
2676
+ local event = __TS__New(Event)
2677
+ Item.chargesChangedEvent:addListener(function(item)
2678
+ local unit = item.owner
2679
+ if unit ~= nil then
2680
+ invoke(event, unit, item)
2681
+ end
2682
+ end)
2683
+ rawset(self, "itemChargesChangedEvent", event)
2684
+ return event
2685
+ end}
2567
2686
  )
2568
2687
  __TS__ObjectDefineProperty(
2569
2688
  Unit,
@@ -2635,6 +2754,10 @@ __TS__ObjectDefineProperty(
2635
2754
  rawset(self, "destroyEvent", destroyEvent)
2636
2755
  return destroyEvent
2637
2756
  end}
2757
+ )
2758
+ Unit.synchronize = synchronizer(
2759
+ function(unit) return unit.syncId end,
2760
+ function(syncId) return unitBySyncId[syncId] end
2638
2761
  );
2639
2762
  (function(self)
2640
2763
  local leaveAbilityIds = postcompile(function()
@@ -2664,7 +2787,8 @@ __TS__ObjectDefineProperty(
2664
2787
  return
2665
2788
  end
2666
2789
  end
2667
- unit:destroy()
2790
+ unit:saveData()
2791
+ Timer:run(unit, "destroy")
2668
2792
  end)
2669
2793
  end
2670
2794
  end)(Unit)