warscript 0.0.1-dev.ac556d2 → 0.0.1-dev.aeaf398

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 (208) hide show
  1. package/attributes.d.ts +6 -0
  2. package/attributes.lua +17 -1
  3. package/config.d.ts +5 -0
  4. package/config.lua +10 -0
  5. package/core/types/effect.d.ts +1 -3
  6. package/core/types/effect.lua +26 -29
  7. package/core/types/frame.lua +24 -21
  8. package/core/types/player.d.ts +16 -0
  9. package/core/types/player.lua +60 -15
  10. package/core/types/playerCamera.d.ts +2 -0
  11. package/core/types/playerCamera.lua +123 -5
  12. package/core/types/sound.d.ts +17 -24
  13. package/core/types/sound.lua +99 -24
  14. package/core/types/tileCell.d.ts +11 -1
  15. package/core/types/tileCell.lua +97 -0
  16. package/core/types/timer.d.ts +9 -8
  17. package/core/types/timer.lua +45 -23
  18. package/core/util.lua +6 -1
  19. package/decl/native.d.ts +846 -790
  20. package/destroyable.d.ts +1 -0
  21. package/destroyable.lua +9 -0
  22. package/engine/behavior.d.ts +14 -1
  23. package/engine/behavior.lua +230 -70
  24. package/engine/behaviour/ability/apply-buff.d.ts +5 -0
  25. package/engine/behaviour/ability/apply-buff.lua +36 -4
  26. package/engine/behaviour/ability/apply-unit-behavior.lua +1 -0
  27. package/engine/behaviour/ability/damage.d.ts +9 -3
  28. package/engine/behaviour/ability/damage.lua +26 -38
  29. package/engine/behaviour/ability/emulate-impact.d.ts +1 -1
  30. package/engine/behaviour/ability/emulate-impact.lua +22 -8
  31. package/engine/behaviour/ability/remove-buffs.d.ts +9 -0
  32. package/engine/behaviour/ability/remove-buffs.lua +21 -0
  33. package/engine/behaviour/ability/restore-mana.d.ts +1 -1
  34. package/engine/behaviour/ability/restore-mana.lua +6 -6
  35. package/engine/behaviour/ability.d.ts +14 -4
  36. package/engine/behaviour/ability.lua +76 -25
  37. package/engine/behaviour/unit/stun-immunity.d.ts +12 -6
  38. package/engine/behaviour/unit/stun-immunity.lua +57 -31
  39. package/engine/behaviour/unit.d.ts +40 -2
  40. package/engine/behaviour/unit.lua +269 -6
  41. package/engine/buff.d.ts +74 -46
  42. package/engine/buff.lua +389 -256
  43. package/engine/internal/ability.d.ts +7 -1
  44. package/engine/internal/ability.lua +65 -24
  45. package/engine/internal/item/ability.lua +82 -14
  46. package/engine/internal/item+owner.lua +12 -6
  47. package/engine/internal/item.d.ts +20 -19
  48. package/engine/internal/item.lua +191 -74
  49. package/engine/internal/mechanics/ability-duration.lua +1 -1
  50. package/engine/internal/mechanics/cast-ability.lua +6 -3
  51. package/engine/internal/misc/damage-metadata-by-target.d.ts +2 -0
  52. package/engine/internal/misc/damage-metadata-by-target.lua +5 -0
  53. package/engine/internal/misc/frame-coordinates.d.ts +2 -0
  54. package/engine/internal/misc/frame-coordinates.lua +21 -0
  55. package/engine/internal/misc/get-terrain-z.d.ts +2 -0
  56. package/engine/internal/misc/get-terrain-z.lua +11 -0
  57. package/engine/internal/misc/player-local-handle.d.ts +2 -0
  58. package/engine/internal/misc/player-local-handle.lua +5 -0
  59. package/engine/internal/object-data/auto-attack-speed-increase.d.ts +1 -1
  60. package/engine/internal/object-data/auto-attack-speed-increase.lua +2 -0
  61. package/engine/internal/object-data/evasion-probability.d.ts +2 -0
  62. package/engine/internal/object-data/evasion-probability.lua +16 -0
  63. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.d.ts +2 -0
  64. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.lua +16 -0
  65. package/engine/internal/unit/ability.d.ts +35 -0
  66. package/engine/internal/unit/ability.lua +98 -9
  67. package/engine/internal/unit/add-item-to-slot-init.d.ts +2 -0
  68. package/engine/internal/unit/add-item-to-slot-init.lua +23 -0
  69. package/engine/internal/unit/add-item-to-slot.d.ts +2 -0
  70. package/engine/internal/unit/add-item-to-slot.lua +52 -0
  71. package/engine/internal/unit/allowed-targets.d.ts +1 -1
  72. package/engine/internal/unit/allowed-targets.lua +9 -1
  73. package/engine/internal/unit/attributes.d.ts +17 -0
  74. package/engine/internal/unit/attributes.lua +46 -0
  75. package/engine/internal/unit/bonus.d.ts +4 -0
  76. package/engine/internal/unit/bonus.lua +27 -0
  77. package/engine/internal/unit/fly-height.d.ts +7 -0
  78. package/engine/internal/unit/fly-height.lua +20 -0
  79. package/engine/internal/unit/ignore-events-items.d.ts +2 -0
  80. package/engine/internal/unit/ignore-events-items.lua +5 -0
  81. package/engine/internal/unit/interrupts.d.ts +12 -0
  82. package/engine/internal/unit/interrupts.lua +28 -0
  83. package/engine/internal/unit/item.lua +3 -4
  84. package/engine/internal/unit/main-selected.lua +12 -27
  85. package/engine/internal/unit/order.d.ts +20 -0
  86. package/engine/internal/unit/order.lua +136 -0
  87. package/engine/internal/unit/scale.d.ts +7 -0
  88. package/engine/internal/unit/scale.lua +20 -0
  89. package/engine/internal/unit+ability.lua +10 -1
  90. package/engine/internal/unit+damage.d.ts +2 -11
  91. package/engine/internal/unit+damage.lua +10 -14
  92. package/engine/internal/unit+spellSteal.lua +1 -2
  93. package/engine/internal/unit-missile-launch.lua +52 -14
  94. package/engine/internal/unit.d.ts +43 -24
  95. package/engine/internal/unit.lua +403 -237
  96. package/engine/lightning.d.ts +12 -5
  97. package/engine/lightning.lua +48 -14
  98. package/engine/local-client.d.ts +2 -0
  99. package/engine/local-client.lua +30 -0
  100. package/engine/object-data/auxiliary/animation-name.d.ts +1 -0
  101. package/engine/object-data/auxiliary/animation-name.lua +16 -0
  102. package/engine/object-data/auxiliary/armor-type.d.ts +11 -0
  103. package/engine/object-data/auxiliary/armor-type.lua +46 -0
  104. package/engine/object-data/auxiliary/attachment-preset.d.ts +7 -2
  105. package/engine/object-data/auxiliary/attachment-preset.lua +4 -3
  106. package/engine/object-data/auxiliary/attack-type.d.ts +7 -8
  107. package/engine/object-data/auxiliary/attack-type.lua +42 -0
  108. package/engine/object-data/auxiliary/health-regeneration-type.d.ts +8 -0
  109. package/engine/object-data/auxiliary/health-regeneration-type.lua +2 -0
  110. package/engine/object-data/auxiliary/movement-type.d.ts +7 -7
  111. package/engine/object-data/auxiliary/movement-type.lua +22 -0
  112. package/engine/object-data/auxiliary/sound-eax.d.ts +10 -0
  113. package/engine/object-data/auxiliary/sound-eax.lua +2 -0
  114. package/engine/object-data/auxiliary/tech-tree-dependency.d.ts +1 -1
  115. package/engine/object-data/auxiliary/unit-attribute.d.ts +6 -0
  116. package/engine/object-data/auxiliary/unit-attribute.lua +9 -0
  117. package/engine/object-data/entry/ability-type/berserk.d.ts +2 -0
  118. package/engine/object-data/entry/ability-type/berserk.lua +13 -0
  119. package/engine/object-data/entry/ability-type/blank-configurable.lua +12 -1
  120. package/engine/object-data/entry/ability-type/carrion-swarm.d.ts +14 -0
  121. package/engine/object-data/entry/ability-type/carrion-swarm.lua +65 -0
  122. package/engine/object-data/entry/ability-type/disease-cloud.lua +2 -2
  123. package/engine/object-data/entry/ability-type/engineering-upgrade.lua +2 -2
  124. package/engine/object-data/entry/ability-type/ensnare.d.ts +12 -0
  125. package/engine/object-data/entry/ability-type/ensnare.lua +52 -0
  126. package/engine/object-data/entry/ability-type/feral-spirit.lua +2 -2
  127. package/engine/object-data/entry/ability-type/mana-regeneration.d.ts +8 -0
  128. package/engine/object-data/entry/ability-type/mana-regeneration.lua +26 -0
  129. package/engine/object-data/entry/ability-type/permanent-invisibility.d.ts +8 -0
  130. package/engine/object-data/entry/ability-type/permanent-invisibility.lua +26 -0
  131. package/engine/object-data/entry/ability-type/phase-shift.d.ts +10 -0
  132. package/engine/object-data/entry/ability-type/phase-shift.lua +39 -0
  133. package/engine/object-data/entry/ability-type/phoenix-morph.lua +4 -4
  134. package/engine/object-data/entry/ability-type/raise-dead.d.ts +17 -0
  135. package/engine/object-data/entry/ability-type/raise-dead.lua +78 -0
  136. package/engine/object-data/entry/ability-type/shock-wave.d.ts +4 -0
  137. package/engine/object-data/entry/ability-type/shock-wave.lua +26 -0
  138. package/engine/object-data/entry/ability-type/slow-poison.d.ts +10 -0
  139. package/engine/object-data/entry/ability-type/slow-poison.lua +58 -0
  140. package/engine/object-data/entry/ability-type/summon-quilbeast.lua +2 -2
  141. package/engine/object-data/entry/ability-type/summon-water-elemental.lua +2 -2
  142. package/engine/object-data/entry/ability-type/web.d.ts +12 -0
  143. package/engine/object-data/entry/ability-type/web.lua +52 -0
  144. package/engine/object-data/entry/ability-type.d.ts +19 -17
  145. package/engine/object-data/entry/ability-type.lua +85 -24
  146. package/engine/object-data/entry/buff-type/applicable.lua +18 -37
  147. package/engine/object-data/entry/buff-type.d.ts +6 -12
  148. package/engine/object-data/entry/buff-type.lua +13 -29
  149. package/engine/object-data/entry/destructible-type.d.ts +28 -2
  150. package/engine/object-data/entry/destructible-type.lua +155 -0
  151. package/engine/object-data/entry/item-type.d.ts +1 -1
  152. package/engine/object-data/entry/item-type.lua +4 -4
  153. package/engine/object-data/entry/lightning-type.d.ts +1 -1
  154. package/engine/object-data/entry/sound-preset.d.ts +33 -0
  155. package/engine/object-data/entry/sound-preset.lua +140 -0
  156. package/engine/object-data/entry/unit-type.d.ts +25 -5
  157. package/engine/object-data/entry/unit-type.lua +258 -93
  158. package/engine/object-data/entry/upgrade.d.ts +1 -1
  159. package/engine/object-data/entry/upgrade.lua +4 -4
  160. package/engine/object-data/entry.d.ts +16 -14
  161. package/engine/object-data/entry.lua +60 -32
  162. package/engine/object-field/ability.d.ts +8 -5
  163. package/engine/object-field/ability.lua +8 -4
  164. package/engine/object-field/unit.d.ts +72 -3
  165. package/engine/object-field/unit.lua +268 -7
  166. package/engine/object-field.d.ts +25 -6
  167. package/engine/object-field.lua +359 -116
  168. package/engine/random.d.ts +9 -0
  169. package/engine/random.lua +13 -0
  170. package/engine/standard/entries/buff-type.d.ts +3 -0
  171. package/engine/standard/entries/buff-type.lua +3 -0
  172. package/engine/standard/entries/sound-preset.d.ts +10 -0
  173. package/engine/standard/entries/sound-preset.lua +10 -0
  174. package/engine/standard/fields/ability.d.ts +2 -2
  175. package/engine/standard/fields/ability.lua +2 -2
  176. package/engine/standard/fields/unit.d.ts +12 -0
  177. package/engine/standard/fields/unit.lua +20 -0
  178. package/engine/synchronization.d.ts +11 -0
  179. package/engine/synchronization.lua +77 -0
  180. package/engine/text-tag.d.ts +36 -2
  181. package/engine/text-tag.lua +250 -10
  182. package/engine/unit.d.ts +6 -0
  183. package/engine/unit.lua +6 -0
  184. package/net/socket.lua +1 -1
  185. package/objutil/buff.lua +11 -10
  186. package/objutil/unit.lua +8 -0
  187. package/package.json +2 -2
  188. package/patch-lua.lua +9 -0
  189. package/patch-lualib.lua +1 -1
  190. package/utility/arrays.d.ts +2 -0
  191. package/utility/arrays.lua +11 -0
  192. package/utility/callback-array.d.ts +17 -0
  193. package/utility/callback-array.lua +61 -0
  194. package/utility/functions.d.ts +8 -0
  195. package/utility/functions.lua +13 -0
  196. package/utility/linked-map.d.ts +26 -0
  197. package/utility/linked-map.lua +66 -0
  198. package/utility/linked-set.d.ts +2 -0
  199. package/utility/linked-set.lua +26 -1
  200. package/utility/lua-maps.d.ts +15 -2
  201. package/utility/lua-maps.lua +53 -2
  202. package/utility/lua-sets.d.ts +2 -0
  203. package/utility/lua-sets.lua +7 -0
  204. package/utility/records.lua +20 -1
  205. package/utility/reflection.lua +11 -7
  206. package/utility/types.d.ts +3 -0
  207. package/core/types/order.d.ts +0 -25
  208. package/core/types/order.lua +0 -55
@@ -51,33 +51,42 @@ local ____arrays = require("utility.arrays")
51
51
  local forEach = ____arrays.forEach
52
52
  local ____math = require("math")
53
53
  local min = ____math.min
54
+ local ____ignore_2Devents_2Ditems = require("engine.internal.unit.ignore-events-items")
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
54
69
  local match = string.match
55
70
  local ____tostring = _G.tostring
56
71
  local setUnitAnimation = SetUnitAnimation
57
- local setUnitAnimationWithRarity = SetUnitAnimationWithRarity
58
72
  local setUnitAnimationByIndex = SetUnitAnimationByIndex
59
- local queueUnitAnimation = QueueUnitAnimation
60
73
  local getUnitIntegerField = BlzGetUnitIntegerField
61
74
  local getUnitRealField = BlzGetUnitRealField
62
75
  local getHeroStr = GetHeroStr
63
76
  local getHeroAgi = GetHeroAgi
64
77
  local getHeroInt = GetHeroInt
65
- local setHeroStr = SetHeroStr
66
- local setHeroAgi = SetHeroAgi
67
- local setHeroInt = SetHeroInt
68
78
  local getUnitBooleanField = BlzGetUnitBooleanField
69
79
  local getUnitStringField = BlzGetUnitStringField
70
80
  local setUnitIntegerField = BlzSetUnitIntegerField
71
81
  local setUnitRealField = BlzSetUnitRealField
72
82
  local setUnitBooleanField = BlzSetUnitBooleanField
73
83
  local setUnitStringField = BlzSetUnitStringField
74
- local setUnitScale = SetUnitScale
75
84
  local setUnitPosition = SetUnitPosition
76
85
  local setUnitTimeScale = SetUnitTimeScale
77
86
  local getHandleId = GetHandleId
87
+ local getUnitCurrentOrder = GetUnitCurrentOrder
78
88
  local createUnit = CreateUnit
79
89
  local killUnit = KillUnit
80
- local setUnitExploded = SetUnitExploded
81
90
  local removeUnit = RemoveUnit
82
91
  local getUnitTypeId = GetUnitTypeId
83
92
  local isHeroUnitId = IsHeroUnitId
@@ -93,15 +102,12 @@ local getSpellTargetItem = GetSpellTargetItem
93
102
  local getSpellTargetDestructable = GetSpellTargetDestructable
94
103
  local isUnitInRangeXY = IsUnitInRangeXY
95
104
  local isUnitInRange = IsUnitInRange
96
- local setResourceAmount = SetResourceAmount
97
- local getResourceAmount = GetResourceAmount
98
105
  local getUnitWeaponRealField = BlzGetUnitWeaponRealField
99
106
  local setUnitWeaponRealField = BlzSetUnitWeaponRealField
100
107
  local getUnitWeaponStringField = BlzGetUnitWeaponStringField
101
108
  local setUnitWeaponStringField = BlzSetUnitWeaponStringField
102
109
  local getUnitAbilityLevel = GetUnitAbilityLevel
103
110
  local unitDisableAbility = BlzUnitDisableAbility
104
- local unitInterruptAttack = BlzUnitInterruptAttack
105
111
  local isUnitInvisible = IsUnitInvisible
106
112
  local isUnitVisible = IsUnitVisible
107
113
  local getUnitX = GetUnitX
@@ -118,15 +124,9 @@ local getOrderedUnit = GetOrderedUnit
118
124
  local getIssuedOrderId = GetIssuedOrderId
119
125
  local isUnitInvulnerable = BlzIsUnitInvulnerable
120
126
  local unitAlive = UnitAlive
121
- local unitAddType = UnitAddType
122
- local unitRemoveType = UnitRemoveType
123
- local isUnitIllusion = IsUnitIllusion
124
- local isUnitType = IsUnitType
125
127
  local isUnitAlly = IsUnitAlly
126
128
  local isUnitEnemy = IsUnitEnemy
127
129
  local getOwningPlayer = GetOwningPlayer
128
- local setUnitColor = SetUnitColor
129
- local showUnitTeamGlow = BlzShowUnitTeamGlow
130
130
  ____exports.UnitClassification = {}
131
131
  local UnitClassification = ____exports.UnitClassification
132
132
  do
@@ -136,6 +136,7 @@ do
136
136
  UnitClassification.GROUND = UNIT_TYPE_GROUND
137
137
  UnitClassification.SUMMONED = UNIT_TYPE_SUMMONED
138
138
  UnitClassification.MECHANICAL = UNIT_TYPE_MECHANICAL
139
+ UnitClassification.WORKER = UNIT_TYPE_PEON
139
140
  UnitClassification.ANCIENT = UNIT_TYPE_ANCIENT
140
141
  UnitClassification.SUICIDAL = UNIT_TYPE_SAPPER
141
142
  UnitClassification.TAUREN = UNIT_TYPE_TAUREN
@@ -343,6 +344,9 @@ local function dispatchAbility(event)
343
344
  }
344
345
  )
345
346
  end
347
+ local function damagingEventPreventRetaliation(self)
348
+ self[0] = true
349
+ end
346
350
  local function damageEventPreventDeath(self, callback, ...)
347
351
  if self[0] ~= nil then
348
352
  return
@@ -354,7 +358,14 @@ local function damageEventPreventDeath(self, callback, ...)
354
358
  rawset(self, 1 + i, (select(i, ...)))
355
359
  end
356
360
  end
357
- 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
+ }
358
369
  local jlimitopByOperator = {
359
370
  [0] = LESS_THAN_OR_EQUAL,
360
371
  [1] = LESS_THAN_OR_EQUAL,
@@ -372,15 +383,27 @@ local modifiers = {
372
383
  end,
373
384
  armor = function(unit, value)
374
385
  if UnitAddAbility(unit, armorBonusAbilityId) then
375
- assert(UnitMakeAbilityPermanent(unit, true, armorBonusAbilityId))
386
+ assert(
387
+ UnitMakeAbilityPermanent(unit, true, armorBonusAbilityId),
388
+ "armor bonus ability must be made permanent",
389
+ unit
390
+ )
376
391
  end
377
- local ability = assert(BlzGetUnitAbility(unit, armorBonusAbilityId))
378
- assert(BlzSetAbilityRealLevelField(
379
- ability,
380
- armorBonusField,
381
- 0,
382
- BlzGetAbilityRealLevelField(ability, armorBonusField, 0) + value
383
- ))
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
+ )
384
407
  end
385
408
  }
386
409
  local getters = {
@@ -398,6 +421,19 @@ function UnitWeapon.prototype.____constructor(self, unit, index)
398
421
  self.unit = unit
399
422
  self.index = index
400
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
+ )
401
437
  __TS__SetDescriptor(
402
438
  UnitWeapon.prototype,
403
439
  "cooldown",
@@ -432,6 +468,19 @@ __TS__SetDescriptor(
432
468
  },
433
469
  true
434
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
+ )
435
484
  __TS__SetDescriptor(
436
485
  UnitWeapon.prototype,
437
486
  "damageBase",
@@ -608,26 +657,30 @@ local fieldSetters = {
608
657
  }
609
658
  local dummies = {}
610
659
  for ____, player in ipairs(Player.all) do
611
- local dummy = assert(createUnit(
612
- player.handle,
613
- dummyUnitId,
614
- 0,
615
- 0,
616
- 270
617
- ))
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
+ )
618
671
  ShowUnit(dummy, false)
619
672
  dummies[player] = dummy
620
673
  end
621
674
  local function delayHealthChecksCallback(unit)
622
- local counter = (unit[103] or 0) - 1
675
+ local counter = (unit[104] or 0) - 1
623
676
  if counter ~= 0 then
624
- unit[103] = counter
677
+ unit[104] = counter
625
678
  return
626
679
  end
627
- unit[103] = nil
628
- local healthBonus = unit[104]
680
+ unit[104] = nil
681
+ local healthBonus = unit[105]
629
682
  if healthBonus ~= nil then
630
- unit[104] = nil
683
+ unit[105] = nil
631
684
  local handle = unit.handle
632
685
  BlzSetUnitMaxHP(
633
686
  handle,
@@ -636,47 +689,73 @@ local function delayHealthChecksCallback(unit)
636
689
  end
637
690
  end
638
691
  local nextSyncId = 1
639
- 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
640
703
  ____exports.Unit = __TS__Class()
641
704
  local Unit = ____exports.Unit
642
705
  Unit.name = "Unit"
643
706
  __TS__ClassExtends(Unit, Handle)
644
707
  function Unit.prototype.____constructor(self, handle)
645
708
  Handle.prototype.____constructor(self, handle)
646
- local ____nextSyncId_0 = nextSyncId
647
- nextSyncId = ____nextSyncId_0 + 1
648
- self.syncId = ____nextSyncId_0
709
+ local ____nextSyncId_1 = nextSyncId
710
+ nextSyncId = ____nextSyncId_1 + 1
711
+ self.syncId = ____nextSyncId_1
649
712
  self._owner = Player:of(getOwningPlayer(handle))
650
- assert(unitAddAbility(handle, leaveDetectAbilityId) and UnitMakeAbilityPermanent(handle, true, leaveDetectAbilityId))
651
- 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
+ )
652
723
  if unitAddAbility(
653
724
  handle,
654
725
  fourCC("Amrf")
655
726
  ) then
656
- assert(unitRemoveAbility(
657
- handle,
658
- fourCC("Amrf")
659
- ))
727
+ assert(
728
+ unitRemoveAbility(
729
+ handle,
730
+ fourCC("Amrf")
731
+ ),
732
+ "fly ability must be removed after addition",
733
+ self
734
+ )
660
735
  end
661
736
  unitBySyncId[self.syncId] = self
662
737
  local ____ = self.abilities
663
738
  end
664
- function Unit.prototype.getEvent(self, event, collector)
665
- self.events = self.events or ({})
666
- local eventId = GetHandleId(event)
667
- if not self.events[eventId] then
668
- 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(
669
745
  TriggerEvent,
670
746
  function(trigger)
671
- TriggerRegisterUnitEvent(trigger, self.handle, event)
747
+ TriggerRegisterUnitEvent(trigger, self.handle, jevent)
672
748
  end,
673
749
  collector or (function() return {} end)
674
750
  )
751
+ self.events:put(eventId, event)
675
752
  end
676
- return self.events[eventId]
753
+ return event
677
754
  end
678
755
  function Unit.prototype.onDestroy(self)
679
756
  local handle = self.handle
757
+ self[108] = getUnitX(handle)
758
+ self[109] = getUnitY(handle)
680
759
  if not self._owner then
681
760
  self._owner = Player:of(getOwningPlayer(handle))
682
761
  end
@@ -715,7 +794,11 @@ function Unit.prototype.addAttackHandler(self, condition, action)
715
794
  self._attackHandlers = handlers
716
795
  if #handlers == 1 then
717
796
  local handle = self.handle
718
- assert(unitAddAbility(handle, attackHandlerAbilityId) and UnitMakeAbilityPermanent(handle, true, attackHandlerAbilityId))
797
+ assert(
798
+ unitAddAbility(handle, attackHandlerAbilityId) and UnitMakeAbilityPermanent(handle, true, attackHandlerAbilityId),
799
+ "attack handler ability must be added",
800
+ self
801
+ )
719
802
  end
720
803
  return handler
721
804
  end
@@ -744,17 +827,17 @@ function Unit.prototype.addModifier(self, property, modifier)
744
827
  end}
745
828
  end
746
829
  function Unit.prototype.hasCombatClassification(self, combatClassification)
747
- local ____combatClassification_1 = combatClassification
748
- return getUnitIntegerField(self.handle, UNIT_IF_TARGETED_AS) & ____combatClassification_1 == ____combatClassification_1
830
+ local ____combatClassification_2 = combatClassification
831
+ return getUnitIntegerField(self.handle, UNIT_IF_TARGETED_AS) & ____combatClassification_2 == ____combatClassification_2
749
832
  end
750
833
  function Unit.prototype.addClassification(self, classification)
751
- return unitAddType(self.handle, classification)
834
+ return UnitAddType(self.handle, classification)
752
835
  end
753
836
  function Unit.prototype.removeClassification(self, classification)
754
- return unitRemoveType(self.handle, classification)
837
+ return UnitRemoveType(self.handle, classification)
755
838
  end
756
839
  function Unit.prototype.hasClassification(self, classification)
757
- return isUnitType(self.handle, classification)
840
+ return IsUnitType(self.handle, classification)
758
841
  end
759
842
  function Unit.prototype.isVisibleTo(self, player)
760
843
  return isUnitVisible(self.handle, player.handle)
@@ -763,13 +846,13 @@ function Unit.prototype.isInvisibleTo(self, player)
763
846
  return isUnitInvisible(self.handle, player.handle)
764
847
  end
765
848
  function Unit.prototype.isInRangeOf(self, x, y, range)
766
- local ____temp_2
849
+ local ____temp_3
767
850
  if type(x) == "number" then
768
- ____temp_2 = isUnitInRangeXY(self.handle, x, y, range)
851
+ ____temp_3 = isUnitInRangeXY(self.handle, x, y, range)
769
852
  else
770
- ____temp_2 = isUnitInRange(self.handle, x.handle, y)
853
+ ____temp_3 = isUnitInRange(self.handle, x.handle, y)
771
854
  end
772
- return ____temp_2
855
+ return ____temp_3
773
856
  end
774
857
  function Unit.prototype.isAllyOf(self, unit)
775
858
  return isUnitAlly(
@@ -787,16 +870,30 @@ function Unit.prototype.playAnimation(self, animation, rarity)
787
870
  if type(animation) == "number" then
788
871
  setUnitAnimationByIndex(self.handle, animation)
789
872
  elseif rarity then
790
- setUnitAnimationWithRarity(self.handle, animation, rarity)
873
+ SetUnitAnimationWithRarity(self.handle, animation, rarity)
791
874
  else
792
875
  setUnitAnimation(self.handle, animation)
793
876
  end
794
877
  end
878
+ function Unit.prototype.resetAnimation(self)
879
+ ResetUnitAnimation(self.handle)
880
+ end
795
881
  function Unit.prototype.queueAnimation(self, animation)
796
- queueUnitAnimation(self.handle, animation)
882
+ QueueUnitAnimation(self.handle, animation)
883
+ end
884
+ function Unit.prototype.chooseWeapon(self, target)
885
+ local firstWeapon = self.firstWeapon
886
+ if firstWeapon.isEnabled and target:isAllowedTarget(self, firstWeapon.allowedTargetCombatClassifications) then
887
+ return firstWeapon
888
+ end
889
+ local secondWeapon = self.secondWeapon
890
+ if secondWeapon.isEnabled and target:isAllowedTarget(target, secondWeapon.allowedTargetCombatClassifications) then
891
+ return secondWeapon
892
+ end
893
+ return nil
797
894
  end
798
895
  function Unit.prototype.delayHealthChecks(self)
799
- self[103] = (self[103] or 0) + 1
896
+ self[104] = (self[104] or 0) + 1
800
897
  Timer:run(delayHealthChecksCallback, self)
801
898
  end
802
899
  function Unit.prototype.setPosition(self, x, y)
@@ -806,21 +903,21 @@ function Unit.prototype.isSelected(self, player)
806
903
  return IsUnitSelected(self.handle, player.handle)
807
904
  end
808
905
  function Unit.prototype.explode(self)
809
- setUnitExploded(self.handle, true)
906
+ SetUnitExploded(self.handle, true)
810
907
  killUnit(self.handle)
811
908
  end
812
909
  function Unit.prototype.kill(self)
813
910
  killUnit(self.handle)
814
911
  end
815
912
  function Unit.prototype.revive(self, x, y, doEffect)
816
- local ____ReviveHero_5 = ReviveHero
817
- local ____array_4 = __TS__SparseArrayNew(self.handle, x, y)
818
- local ____doEffect_3 = doEffect
819
- if ____doEffect_3 == nil then
820
- ____doEffect_3 = false
913
+ local ____ReviveHero_6 = ReviveHero
914
+ local ____array_5 = __TS__SparseArrayNew(self.handle, x, y)
915
+ local ____doEffect_4 = doEffect
916
+ if ____doEffect_4 == nil then
917
+ ____doEffect_4 = false
821
918
  end
822
- __TS__SparseArrayPush(____array_4, ____doEffect_3)
823
- ____ReviveHero_5(__TS__SparseArraySpread(____array_4))
919
+ __TS__SparseArrayPush(____array_5, ____doEffect_4)
920
+ ____ReviveHero_6(__TS__SparseArraySpread(____array_5))
824
921
  end
825
922
  function Unit.prototype.healTarget(self, target, amount)
826
923
  if __TS__InstanceOf(target, ____exports.Unit) and target:hasAbility(fourCC("BIhm")) then
@@ -863,17 +960,16 @@ function Unit.prototype.itemInSlot(self, slot)
863
960
  return Item:of(unitItemInSlot(self.handle, slot))
864
961
  end
865
962
  function Unit.prototype.addAbility(self, abilityId)
866
- if unitAddAbility(self.handle, abilityId) then
867
- local ability = UnitAbility:of(
868
- checkNotNull(getUnitAbility(self.handle, abilityId)),
869
- abilityId,
870
- self
871
- )
963
+ local ability = UnitAbility:of(
964
+ doUnitAbilityAction(self.handle, abilityId, addAbility, abilityId),
965
+ abilityId,
966
+ self
967
+ )
968
+ if ability ~= nil then
872
969
  local abilities = self.abilities
873
970
  abilities[#abilities + 1] = ability
874
- return ability
875
971
  end
876
- return nil
972
+ return ability
877
973
  end
878
974
  function Unit.prototype.makeAbilityPermanent(self, abilityId, permanent)
879
975
  return UnitMakeAbilityPermanent(self.handle, permanent, abilityId)
@@ -887,31 +983,21 @@ end
887
983
  function Unit.prototype.hasAbility(self, abilityId)
888
984
  return getUnitAbilityLevel(self.handle, abilityId) > 0
889
985
  end
890
- function Unit.prototype.getAbilityById(self, abilityId)
891
- local handle = self.handle
892
- if unitAddAbility(handle, abilityId) then
893
- assert(unitRemoveAbility(handle, abilityId))
894
- return nil
895
- end
896
- return UnitAbility:of(
897
- getUnitAbility(self.handle, abilityId),
898
- abilityId,
899
- self
900
- )
986
+ function Unit.prototype.getAbility(self, abilityId)
987
+ local ability = doUnitAbilityAction(self.handle, abilityId, getUnitAbility, abilityId)
988
+ return UnitAbility:of(ability, abilityId, self)
901
989
  end
902
- function Unit.prototype.removeAbility(self, abilityId)
903
- if unitRemoveAbility(self.handle, abilityId) then
904
- local abilities = self.abilities
905
- for i = 1, #abilities do
906
- if abilities[i].typeId == abilityId then
907
- abilities[i]:destroy()
908
- tremove(abilities, i)
909
- return true
910
- end
990
+ function Unit.prototype.removeAbility(self, abilityTypeId)
991
+ local abilities = self.abilities
992
+ for i = 1, #abilities do
993
+ if abilities[i].typeId == abilityTypeId then
994
+ local ability = abilities[i]
995
+ tremove(abilities, i)
996
+ ability:destroy()
997
+ return true
911
998
  end
912
- return true
913
999
  end
914
- return false
1000
+ return doUnitAbilityAction(self.handle, abilityTypeId, unitRemoveAbility, abilityTypeId)
915
1001
  end
916
1002
  function Unit.prototype.hideAbility(self, abilityId, flag)
917
1003
  BlzUnitHideAbility(self.handle, abilityId, flag)
@@ -925,12 +1011,16 @@ end
925
1011
  function Unit.prototype.endAbilityCooldown(self, abilityId)
926
1012
  BlzEndUnitAbilityCooldown(self.handle, abilityId)
927
1013
  end
928
- function Unit.prototype.interruptAttack(self)
929
- unitInterruptAttack(self.handle)
930
- end
931
1014
  function Unit.prototype.interruptCast(self, abilityId)
932
- unitDisableAbility(self.handle, abilityId, true, false)
933
- unitDisableAbility(self.handle, abilityId, false, false)
1015
+ local handle = self.handle
1016
+ unitDisableAbility(handle, abilityId, true, false)
1017
+ Timer:run(
1018
+ unitDisableAbility,
1019
+ handle,
1020
+ abilityId,
1021
+ false,
1022
+ false
1023
+ )
934
1024
  end
935
1025
  function Unit.prototype.getDistanceTo(self, target)
936
1026
  local handle = self.handle
@@ -991,18 +1081,44 @@ function Unit.prototype.unpauseEx(self)
991
1081
  end
992
1082
  function Unit.prototype.incrementStunCounter(self)
993
1083
  local stunCounter = self[102] or 0
994
- if not self[101] or stunCounter >= 0 then
1084
+ if not self[101] and (self[103] or 0) <= 0 or stunCounter >= 0 then
995
1085
  BlzPauseUnitEx(self.handle, true)
996
1086
  end
997
1087
  self[102] = stunCounter + 1
998
1088
  end
999
1089
  function Unit.prototype.decrementStunCounter(self)
1000
1090
  local stunCounter = self[102] or 0
1001
- if not self[101] or stunCounter >= 1 then
1091
+ if not self[101] and (self[103] or 0) <= 0 or stunCounter >= 1 then
1002
1092
  BlzPauseUnitEx(self.handle, false)
1003
1093
  end
1004
1094
  self[102] = stunCounter - 1
1005
1095
  end
1096
+ function Unit.prototype.incrementForceStunCounter(self)
1097
+ local forceStunCounter = self[103] or 0
1098
+ if forceStunCounter == 0 then
1099
+ local handle = self.handle
1100
+ if not self[101] then
1101
+ for _ = self[102] or 0, -1 do
1102
+ BlzPauseUnitEx(handle, true)
1103
+ end
1104
+ end
1105
+ BlzPauseUnitEx(handle, true)
1106
+ end
1107
+ self[103] = forceStunCounter + 1
1108
+ end
1109
+ function Unit.prototype.decrementForceStunCounter(self)
1110
+ local forceStunCounter = self[103] or 0
1111
+ if forceStunCounter == 1 then
1112
+ local handle = self.handle
1113
+ if not self[101] then
1114
+ for _ = self[102] or 0, -1 do
1115
+ BlzPauseUnitEx(handle, false)
1116
+ end
1117
+ end
1118
+ BlzPauseUnitEx(handle, false)
1119
+ end
1120
+ self[103] = forceStunCounter - 1
1121
+ end
1006
1122
  function Unit.create(self, owner, id, x, y, facing, skinId)
1007
1123
  local handle = skinId and BlzCreateUnitWithSkin(
1008
1124
  owner.handle,
@@ -1191,7 +1307,15 @@ __TS__SetDescriptor(
1191
1307
  Unit.prototype,
1192
1308
  "isIllusion",
1193
1309
  {get = function(self)
1194
- return isUnitIllusion(self.handle)
1310
+ return IsUnitIllusion(self.handle)
1311
+ end},
1312
+ true
1313
+ )
1314
+ __TS__SetDescriptor(
1315
+ Unit.prototype,
1316
+ "isStunned",
1317
+ {get = function(self)
1318
+ return getUnitCurrentOrder(self.handle) == orderId("stunned")
1195
1319
  end},
1196
1320
  true
1197
1321
  )
@@ -1270,13 +1394,13 @@ __TS__SetDescriptor(
1270
1394
  )
1271
1395
  __TS__SetDescriptor(
1272
1396
  Unit.prototype,
1273
- "strengthBase",
1397
+ "primaryAttribute",
1274
1398
  {
1275
1399
  get = function(self)
1276
- return getHeroStr(self.handle, false)
1400
+ return getUnitIntegerField(self.handle, UNIT_IF_PRIMARY_ATTRIBUTE)
1277
1401
  end,
1278
- set = function(self, strengthBase)
1279
- setHeroStr(self.handle, strengthBase, true)
1402
+ set = function(self, primaryAttribute)
1403
+ setUnitIntegerField(self.handle, UNIT_IF_PRIMARY_ATTRIBUTE, primaryAttribute)
1280
1404
  end
1281
1405
  },
1282
1406
  true
@@ -1298,19 +1422,6 @@ __TS__SetDescriptor(
1298
1422
  end},
1299
1423
  true
1300
1424
  )
1301
- __TS__SetDescriptor(
1302
- Unit.prototype,
1303
- "agilityBase",
1304
- {
1305
- get = function(self)
1306
- return getHeroAgi(self.handle, false)
1307
- end,
1308
- set = function(self, agilityBase)
1309
- setHeroAgi(self.handle, agilityBase, true)
1310
- end
1311
- },
1312
- true
1313
- )
1314
1425
  __TS__SetDescriptor(
1315
1426
  Unit.prototype,
1316
1427
  "agilityBonus",
@@ -1328,19 +1439,6 @@ __TS__SetDescriptor(
1328
1439
  end},
1329
1440
  true
1330
1441
  )
1331
- __TS__SetDescriptor(
1332
- Unit.prototype,
1333
- "intelligenceBase",
1334
- {
1335
- get = function(self)
1336
- return getHeroInt(self.handle, false)
1337
- end,
1338
- set = function(self, intelligenceBase)
1339
- setHeroInt(self.handle, intelligenceBase, true)
1340
- end
1341
- },
1342
- true
1343
- )
1344
1442
  __TS__SetDescriptor(
1345
1443
  Unit.prototype,
1346
1444
  "intelligenceBonus",
@@ -1389,17 +1487,17 @@ __TS__SetDescriptor(
1389
1487
  "isTeamGlowVisible",
1390
1488
  {
1391
1489
  get = function(self)
1392
- return not self[106]
1490
+ return not self[107]
1393
1491
  end,
1394
1492
  set = function(self, isTeamGlowVisible)
1395
- showUnitTeamGlow(self.handle, isTeamGlowVisible)
1396
- local ____temp_6
1493
+ BlzShowUnitTeamGlow(self.handle, isTeamGlowVisible)
1494
+ local ____temp_7
1397
1495
  if not isTeamGlowVisible then
1398
- ____temp_6 = true
1496
+ ____temp_7 = true
1399
1497
  else
1400
- ____temp_6 = nil
1498
+ ____temp_7 = nil
1401
1499
  end
1402
- self[106] = ____temp_6
1500
+ self[107] = ____temp_7
1403
1501
  end
1404
1502
  },
1405
1503
  true
@@ -1408,9 +1506,9 @@ __TS__SetDescriptor(
1408
1506
  Unit.prototype,
1409
1507
  "color",
1410
1508
  {set = function(self, color)
1411
- setUnitColor(self.handle, color.handle)
1412
- if self[106] then
1413
- showUnitTeamGlow(self.handle, false)
1509
+ SetUnitColor(self.handle, color.handle)
1510
+ if self[107] then
1511
+ BlzShowUnitTeamGlow(self.handle, false)
1414
1512
  end
1415
1513
  end},
1416
1514
  true
@@ -1433,14 +1531,14 @@ __TS__SetDescriptor(
1433
1531
  "maxHealth",
1434
1532
  {
1435
1533
  get = function(self)
1436
- return BlzGetUnitMaxHP(self.handle) - (self[104] or 0) - (self[105] or 0)
1534
+ return BlzGetUnitMaxHP(self.handle) - (self[105] or 0) - (self[106] or 0)
1437
1535
  end,
1438
1536
  set = function(self, maxHealth)
1439
- if maxHealth < 1 and self[103] ~= nil then
1440
- self[104] = (self[104] or 0) + (1 - maxHealth)
1537
+ if maxHealth < 1 and self[104] ~= nil then
1538
+ self[105] = (self[105] or 0) + (1 - maxHealth)
1441
1539
  maxHealth = 1
1442
1540
  end
1443
- BlzSetUnitMaxHP(self.handle, maxHealth + (self[105] or 0))
1541
+ BlzSetUnitMaxHP(self.handle, maxHealth + (self[106] or 0))
1444
1542
  end
1445
1543
  },
1446
1544
  true
@@ -1482,10 +1580,10 @@ __TS__SetDescriptor(
1482
1580
  "health",
1483
1581
  {
1484
1582
  get = function(self)
1485
- return GetWidgetLife(self.handle) - (self[105] or 0)
1583
+ return GetWidgetLife(self.handle) - (self[106] or 0)
1486
1584
  end,
1487
1585
  set = function(self, health)
1488
- SetWidgetLife(self.handle, health + (self[105] or 0))
1586
+ SetWidgetLife(self.handle, health + (self[106] or 0))
1489
1587
  end
1490
1588
  },
1491
1589
  true
@@ -1561,25 +1659,12 @@ __TS__SetDescriptor(
1561
1659
  },
1562
1660
  true
1563
1661
  )
1564
- __TS__SetDescriptor(
1565
- Unit.prototype,
1566
- "flyHeight",
1567
- {
1568
- get = function(self)
1569
- return getUnitFlyHeight(self.handle)
1570
- end,
1571
- set = function(self, v)
1572
- SetUnitFlyHeight(self.handle, v, 100000)
1573
- end
1574
- },
1575
- true
1576
- )
1577
1662
  __TS__SetDescriptor(
1578
1663
  Unit.prototype,
1579
1664
  "x",
1580
1665
  {
1581
1666
  get = function(self)
1582
- return getUnitX(self.handle)
1667
+ return self[108] or getUnitX(self.handle)
1583
1668
  end,
1584
1669
  set = function(self, v)
1585
1670
  SetUnitX(self.handle, v)
@@ -1592,7 +1677,7 @@ __TS__SetDescriptor(
1592
1677
  "y",
1593
1678
  {
1594
1679
  get = function(self)
1595
- return getUnitY(self.handle)
1680
+ return self[109] or getUnitY(self.handle)
1596
1681
  end,
1597
1682
  set = function(self, v)
1598
1683
  SetUnitY(self.handle, v)
@@ -1678,10 +1763,10 @@ __TS__SetDescriptor(
1678
1763
  "gold",
1679
1764
  {
1680
1765
  get = function(self)
1681
- return getResourceAmount(self.handle)
1766
+ return GetResourceAmount(self.handle)
1682
1767
  end,
1683
1768
  set = function(self, gold)
1684
- setResourceAmount(self.handle, gold)
1769
+ SetResourceAmount(self.handle, gold)
1685
1770
  end
1686
1771
  },
1687
1772
  true
@@ -1697,14 +1782,18 @@ __TS__SetDescriptor(
1697
1782
  local handle = self.handle
1698
1783
  if isPaused and not IsUnitPaused(handle) then
1699
1784
  self[101] = true
1700
- for _ = self[102] or 0, -1 do
1701
- BlzPauseUnitEx(handle, true)
1785
+ if (self[103] or 0) <= 0 then
1786
+ for _ = self[102] or 0, -1 do
1787
+ BlzPauseUnitEx(handle, true)
1788
+ end
1702
1789
  end
1703
1790
  PauseUnit(handle, true)
1704
1791
  elseif not isPaused and IsUnitPaused(handle) then
1705
1792
  PauseUnit(handle, false)
1706
- for _ = self[102] or 0, -1 do
1707
- BlzPauseUnitEx(handle, false)
1793
+ if (self[103] or 0) <= 0 then
1794
+ for _ = self[102] or 0, -1 do
1795
+ BlzPauseUnitEx(handle, false)
1796
+ end
1708
1797
  end
1709
1798
  self[101] = nil
1710
1799
  end
@@ -1762,20 +1851,6 @@ __TS__SetDescriptor(
1762
1851
  },
1763
1852
  true
1764
1853
  )
1765
- __TS__SetDescriptor(
1766
- Unit.prototype,
1767
- "scale",
1768
- {
1769
- get = function(self)
1770
- return getUnitRealField(self.handle, UNIT_RF_SCALING_VALUE)
1771
- end,
1772
- set = function(self, v)
1773
- setUnitScale(self.handle, v, v, v)
1774
- setUnitRealField(self.handle, UNIT_RF_SCALING_VALUE, v)
1775
- end
1776
- },
1777
- true
1778
- )
1779
1854
  __TS__SetDescriptor(
1780
1855
  Unit.prototype,
1781
1856
  "timeScale",
@@ -1809,6 +1884,19 @@ __TS__SetDescriptor(
1809
1884
  end},
1810
1885
  true
1811
1886
  )
1887
+ __TS__SetDescriptor(
1888
+ Unit.prototype,
1889
+ "movementType",
1890
+ {
1891
+ get = function(self)
1892
+ return getUnitIntegerField(self.handle, UNIT_IF_MOVE_TYPE)
1893
+ end,
1894
+ set = function(self, movementType)
1895
+ setUnitIntegerField(self.handle, UNIT_IF_MOVE_TYPE, movementType)
1896
+ end
1897
+ },
1898
+ true
1899
+ )
1812
1900
  __TS__SetDescriptor(
1813
1901
  Unit.prototype,
1814
1902
  "pathing",
@@ -1990,6 +2078,14 @@ __TS__SetDescriptor(
1990
2078
  end},
1991
2079
  true
1992
2080
  )
2081
+ __TS__SetDescriptor(
2082
+ Unit.prototype,
2083
+ "targetAcquiredEvent",
2084
+ {get = function(self)
2085
+ return self:getEvent(EVENT_UNIT_ACQUIRED_TARGET)
2086
+ end},
2087
+ true
2088
+ )
1993
2089
  __TS__SetDescriptor(
1994
2090
  Unit.prototype,
1995
2091
  "onSelect",
@@ -2050,6 +2146,11 @@ __TS__SetDescriptor(
2050
2146
  end},
2051
2147
  true
2052
2148
  )
2149
+ Unit.levelChangedEvent = __TS__New(
2150
+ ____exports.UnitTriggerEvent,
2151
+ EVENT_PLAYER_HERO_LEVEL,
2152
+ function() return ____exports.Unit:of(getTriggerUnit()) end
2153
+ )
2053
2154
  Unit.deathEvent = __TS__New(
2054
2155
  ____exports.UnitTriggerEvent,
2055
2156
  EVENT_PLAYER_UNIT_DEATH,
@@ -2125,25 +2226,25 @@ Unit.onTargetCast = dispatchId(__TS__New(
2125
2226
  InitializingEvent,
2126
2227
  function(event)
2127
2228
  local function listener(unit, id)
2128
- local ____GetSpellTargetUnit_result_9
2229
+ local ____GetSpellTargetUnit_result_10
2129
2230
  if GetSpellTargetUnit() then
2130
- ____GetSpellTargetUnit_result_9 = ____exports.Unit:of(GetSpellTargetUnit())
2231
+ ____GetSpellTargetUnit_result_10 = ____exports.Unit:of(GetSpellTargetUnit())
2131
2232
  else
2132
- local ____GetSpellTargetItem_result_8
2233
+ local ____GetSpellTargetItem_result_9
2133
2234
  if GetSpellTargetItem() then
2134
- ____GetSpellTargetItem_result_8 = Item:of(GetSpellTargetItem())
2235
+ ____GetSpellTargetItem_result_9 = Item:of(GetSpellTargetItem())
2135
2236
  else
2136
- local ____GetSpellTargetDestructable_result_7
2237
+ local ____GetSpellTargetDestructable_result_8
2137
2238
  if GetSpellTargetDestructable() then
2138
- ____GetSpellTargetDestructable_result_7 = Destructable:of(GetSpellTargetDestructable())
2239
+ ____GetSpellTargetDestructable_result_8 = Destructable:of(GetSpellTargetDestructable())
2139
2240
  else
2140
- ____GetSpellTargetDestructable_result_7 = nil
2241
+ ____GetSpellTargetDestructable_result_8 = nil
2141
2242
  end
2142
- ____GetSpellTargetItem_result_8 = ____GetSpellTargetDestructable_result_7
2243
+ ____GetSpellTargetItem_result_9 = ____GetSpellTargetDestructable_result_8
2143
2244
  end
2144
- ____GetSpellTargetUnit_result_9 = ____GetSpellTargetItem_result_8
2245
+ ____GetSpellTargetUnit_result_10 = ____GetSpellTargetItem_result_9
2145
2246
  end
2146
- local target = ____GetSpellTargetUnit_result_9
2247
+ local target = ____GetSpellTargetUnit_result_10
2147
2248
  if target then
2148
2249
  invoke(event, unit, id, target)
2149
2250
  end
@@ -2351,38 +2452,57 @@ Unit.onDamaging = (function()
2351
2452
  if source and source.typeId == dummyUnitId then
2352
2453
  source = nil
2353
2454
  end
2354
- local target = BlzGetEventDamageTarget()
2455
+ local target = ____exports.Unit:of(BlzGetEventDamageTarget())
2456
+ local metadata = damageMetadataByTarget[target]
2457
+ damageMetadataByTarget[target] = nil
2355
2458
  local data = {
2356
2459
  amount = GetEventDamage(),
2357
- attackType = BlzGetEventAttackType(),
2460
+ attackType = nativeToAttackType(BlzGetEventAttackType()),
2358
2461
  damageType = BlzGetEventDamageType(),
2359
2462
  weaponType = BlzGetEventWeaponType(),
2360
- isAttack = BlzGetEventIsAttack()
2463
+ metadata = metadata,
2464
+ isAttack = BlzGetEventIsAttack(),
2465
+ originalAmount = GetEventDamage(),
2466
+ originalMetadata = metadata,
2467
+ preventRetaliation = damagingEventPreventRetaliation
2361
2468
  }
2362
2469
  if data.isAttack and source then
2363
- 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
2364
- if weapon == -1 then
2365
- local targetsAllowed = BlzGetUnitWeaponIntegerField(source.handle, UNIT_WEAPON_IF_ATTACK_TARGETS_ALLOWED, 0)
2366
- weapon = 0
2367
- end
2368
- data.weapon = assert(source.weapons[weapon + 1])
2470
+ data.weapon = source:chooseWeapon(target)
2369
2471
  end
2370
2472
  if not data.isAttack or not source or not source._attackHandlers then
2371
2473
  invoke(
2372
2474
  event,
2373
2475
  source,
2374
- ____exports.Unit:of(target),
2476
+ target,
2375
2477
  setmetatable(
2376
2478
  {},
2377
2479
  {
2378
2480
  __index = data,
2379
2481
  __newindex = function(self, key, value)
2380
- damageSetters[key](value)
2482
+ local damageSetter = damageSetters[key]
2483
+ if damageSetter ~= nil then
2484
+ damageSetter(value)
2485
+ end
2381
2486
  data[key] = value
2382
2487
  end
2383
2488
  }
2384
2489
  )
2385
2490
  )
2491
+ if data[0] and source then
2492
+ local sourceOwner = source.owner.handle
2493
+ data[1] = sourceOwner
2494
+ local targetOwner = target.owner.handle
2495
+ data[2] = targetOwner
2496
+ if not GetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE) then
2497
+ SetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE, true)
2498
+ data[3] = true
2499
+ end
2500
+ if not GetPlayerAlliance(targetOwner, sourceOwner, ALLIANCE_PASSIVE) then
2501
+ SetPlayerAlliance(targetOwner, sourceOwner, ALLIANCE_PASSIVE, true)
2502
+ data[4] = true
2503
+ end
2504
+ end
2505
+ damagingEventByTarget[target] = data
2386
2506
  return
2387
2507
  end
2388
2508
  BlzSetEventDamage(0)
@@ -2390,7 +2510,7 @@ Unit.onDamaging = (function()
2390
2510
  BlzSetEventDamageType(DAMAGE_TYPE_UNKNOWN)
2391
2511
  BlzSetEventWeaponType(WEAPON_TYPE_WHOKNOWS)
2392
2512
  local sourceOwner = source.owner.handle
2393
- local targetOwner = GetOwningPlayer(target)
2513
+ local targetOwner = target.owner.handle
2394
2514
  if not GetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE) then
2395
2515
  SetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE, true)
2396
2516
  Timer:run(function()
@@ -2406,23 +2526,19 @@ Unit.onDamaging = (function()
2406
2526
  for ____, ____value in ipairs(source._attackHandlers) do
2407
2527
  local condition = ____value[1]
2408
2528
  local action = ____value[2]
2409
- if condition(
2410
- source,
2411
- ____exports.Unit:of(target),
2412
- data
2413
- ) then
2529
+ if condition(source, target, data) then
2414
2530
  action(
2415
2531
  source,
2416
- ____exports.Unit:of(target),
2532
+ target,
2417
2533
  setmetatable(
2418
2534
  {fire = function()
2419
2535
  UnitDamageTarget(
2420
2536
  source.handle,
2421
- target,
2537
+ target.handle,
2422
2538
  data.amount,
2423
2539
  true,
2424
2540
  true,
2425
- data.attackType,
2541
+ attackTypeToNative(data.attackType),
2426
2542
  data.damageType,
2427
2543
  data.weaponType
2428
2544
  )
@@ -2449,30 +2565,54 @@ Unit.onDamage = __TS__New(
2449
2565
  if source and source.typeId == dummyUnitId then
2450
2566
  source = nil
2451
2567
  end
2568
+ local target = ____exports.Unit:of(BlzGetEventDamageTarget())
2569
+ local damagingEvent = damagingEventByTarget[target]
2570
+ damagingEventByTarget[target] = nil
2452
2571
  local data = {
2453
2572
  amount = GetEventDamage(),
2454
- attackType = BlzGetEventAttackType(),
2573
+ attackType = nativeToAttackType(BlzGetEventAttackType()),
2455
2574
  damageType = BlzGetEventDamageType(),
2456
2575
  weaponType = BlzGetEventWeaponType(),
2576
+ metadata = damagingEvent and damagingEvent.metadata,
2457
2577
  isAttack = BlzGetEventIsAttack(),
2458
- originalAmount = GetEventDamage(),
2578
+ originalAmount = damagingEvent and damagingEvent.originalAmount or GetEventDamage(),
2579
+ originalMetadata = damagingEvent and damagingEvent.originalMetadata,
2459
2580
  preventDeath = damageEventPreventDeath
2460
2581
  }
2582
+ if damagingEvent then
2583
+ for key, value in pairs(damagingEvent) do
2584
+ if isAttribute(key) then
2585
+ data[key] = value
2586
+ end
2587
+ end
2588
+ local sourceOwner = damagingEvent[1]
2589
+ if sourceOwner then
2590
+ local targetOwner = damagingEvent[2]
2591
+ if damagingEvent[3] then
2592
+ SetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE, false)
2593
+ end
2594
+ if damagingEvent[4] then
2595
+ SetPlayerAlliance(targetOwner, sourceOwner, ALLIANCE_PASSIVE, false)
2596
+ end
2597
+ end
2598
+ end
2461
2599
  local evData = setmetatable(
2462
2600
  {},
2463
2601
  {
2464
2602
  __index = data,
2465
2603
  __newindex = function(self, key, value)
2466
- damageSetters[key](value)
2604
+ local damageSetter = damageSetters[key]
2605
+ if damageSetter ~= nil then
2606
+ damageSetter(value)
2607
+ end
2467
2608
  data[key] = value
2468
2609
  end
2469
2610
  }
2470
2611
  )
2471
- local target = ____exports.Unit:of(BlzGetEventDamageTarget())
2472
2612
  invoke(event, source, target, evData)
2473
2613
  if evData[0] ~= nil and target.health - evData.amount < 0.405 then
2474
2614
  local bonusHealth = math.ceil(evData.amount)
2475
- target[105] = (target[105] or 0) + bonusHealth
2615
+ target[106] = (target[106] or 0) + bonusHealth
2476
2616
  BlzSetUnitMaxHP(
2477
2617
  target.handle,
2478
2618
  BlzGetUnitMaxHP(target.handle) + bonusHealth
@@ -2486,7 +2626,7 @@ Unit.onDamage = __TS__New(
2486
2626
  evData[0],
2487
2627
  table.unpack(evData, 1 + 1, 1 + (evData[1] or 0))
2488
2628
  )
2489
- target[105] = (target[105] or 0) - bonusHealth
2629
+ target[106] = (target[106] or 0) - bonusHealth
2490
2630
  SetWidgetLife(
2491
2631
  target.handle,
2492
2632
  GetWidgetLife(target.handle) - bonusHealth
@@ -2511,8 +2651,9 @@ Unit.itemDroppedEvent = __TS__New(
2511
2651
  EVENT_PLAYER_UNIT_DROP_ITEM,
2512
2652
  function()
2513
2653
  local unit = getTriggerUnit()
2514
- if getUnitTypeId(unit) ~= dummyUnitId then
2515
- return ____exports.Unit:of(unit), Item:of(getManipulatedItem())
2654
+ local item = getManipulatedItem()
2655
+ if getUnitTypeId(unit) ~= dummyUnitId and not (ignoreEventsItems[item] ~= nil) then
2656
+ return ____exports.Unit:of(unit), Item:of(item)
2516
2657
  end
2517
2658
  return IgnoreEvent
2518
2659
  end
@@ -2521,9 +2662,14 @@ Unit.itemPickedUpEvent = __TS__New(
2521
2662
  ____exports.UnitTriggerEvent,
2522
2663
  EVENT_PLAYER_UNIT_PICKUP_ITEM,
2523
2664
  function()
2524
- local unit = getTriggerUnit()
2525
- if getUnitTypeId(unit) ~= dummyUnitId then
2526
- return ____exports.Unit:of(unit), Item:of(getManipulatedItem())
2665
+ local unitHandle = getTriggerUnit()
2666
+ local itemHandle = getManipulatedItem()
2667
+ if getUnitTypeId(unitHandle) ~= dummyUnitId and not (ignoreEventsItems[itemHandle] ~= nil) then
2668
+ local unit = ____exports.Unit:of(unitHandle)
2669
+ local item = Item:of(itemHandle)
2670
+ if item.owner ~= unit then
2671
+ return unit, item
2672
+ end
2527
2673
  end
2528
2674
  return IgnoreEvent
2529
2675
  end
@@ -2533,8 +2679,9 @@ Unit.itemUsedEvent = __TS__New(
2533
2679
  EVENT_PLAYER_UNIT_USE_ITEM,
2534
2680
  function()
2535
2681
  local unit = getTriggerUnit()
2536
- if getUnitTypeId(unit) ~= dummyUnitId then
2537
- return ____exports.Unit:of(unit), Item:of(getManipulatedItem())
2682
+ local item = getManipulatedItem()
2683
+ if getUnitTypeId(unit) ~= dummyUnitId and not (ignoreEventsItems[item] ~= nil) then
2684
+ return ____exports.Unit:of(unit), Item:of(item)
2538
2685
  end
2539
2686
  return IgnoreEvent
2540
2687
  end
@@ -2542,7 +2689,22 @@ Unit.itemUsedEvent = __TS__New(
2542
2689
  Unit.itemStackedEvent = __TS__New(
2543
2690
  ____exports.UnitTriggerEvent,
2544
2691
  EVENT_PLAYER_UNIT_STACK_ITEM,
2545
- function() return ____exports.Unit:of(getTriggerUnit()), Item:of(getManipulatedItem()) end
2692
+ function() return ____exports.Unit:of(getTriggerUnit()), Item:of(BlzGetStackingItemTarget()), Item:of(BlzGetStackingItemSource()) end
2693
+ )
2694
+ __TS__ObjectDefineProperty(
2695
+ Unit,
2696
+ "itemChargesChangedEvent",
2697
+ {get = function(self)
2698
+ local event = __TS__New(Event)
2699
+ Item.chargesChangedEvent:addListener(function(item)
2700
+ local unit = item.owner
2701
+ if unit ~= nil then
2702
+ invoke(event, unit, item)
2703
+ end
2704
+ end)
2705
+ rawset(self, "itemChargesChangedEvent", event)
2706
+ return event
2707
+ end}
2546
2708
  )
2547
2709
  __TS__ObjectDefineProperty(
2548
2710
  Unit,
@@ -2614,6 +2776,10 @@ __TS__ObjectDefineProperty(
2614
2776
  rawset(self, "destroyEvent", destroyEvent)
2615
2777
  return destroyEvent
2616
2778
  end}
2779
+ )
2780
+ Unit.synchronize = synchronizer(
2781
+ function(unit) return unit.syncId end,
2782
+ function(syncId) return unitBySyncId[syncId] end
2617
2783
  );
2618
2784
  (function(self)
2619
2785
  local leaveAbilityIds = postcompile(function()