warscript 0.0.1-dev.f48f7bb → 0.0.1-dev.f566ce7

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 (241) 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 +71 -22
  8. package/core/types/item.d.ts +1 -0
  9. package/core/types/item.lua +1 -0
  10. package/core/types/player.d.ts +16 -0
  11. package/core/types/player.lua +60 -15
  12. package/core/types/playerCamera.d.ts +2 -0
  13. package/core/types/playerCamera.lua +123 -5
  14. package/core/types/sound.d.ts +17 -24
  15. package/core/types/sound.lua +100 -25
  16. package/core/types/tileCell.d.ts +11 -1
  17. package/core/types/tileCell.lua +97 -0
  18. package/core/types/timer.d.ts +9 -8
  19. package/core/types/timer.lua +45 -23
  20. package/core/util.lua +6 -1
  21. package/decl/native.d.ts +846 -790
  22. package/destroyable.d.ts +1 -0
  23. package/destroyable.lua +9 -0
  24. package/engine/behavior.d.ts +14 -1
  25. package/engine/behavior.lua +230 -70
  26. package/engine/behaviour/ability/apply-buff.d.ts +5 -0
  27. package/engine/behaviour/ability/apply-buff.lua +36 -4
  28. package/engine/behaviour/ability/apply-unit-behavior.lua +1 -0
  29. package/engine/behaviour/ability/damage.d.ts +12 -3
  30. package/engine/behaviour/ability/damage.lua +33 -39
  31. package/engine/behaviour/ability/emulate-impact.d.ts +1 -1
  32. package/engine/behaviour/ability/emulate-impact.lua +23 -7
  33. package/engine/behaviour/ability/remove-buffs.d.ts +9 -0
  34. package/engine/behaviour/ability/remove-buffs.lua +21 -0
  35. package/engine/behaviour/ability/restore-mana.d.ts +1 -1
  36. package/engine/behaviour/ability/restore-mana.lua +6 -6
  37. package/engine/behaviour/ability.d.ts +15 -5
  38. package/engine/behaviour/ability.lua +72 -24
  39. package/engine/behaviour/unit/stun-immunity.d.ts +12 -6
  40. package/engine/behaviour/unit/stun-immunity.lua +57 -31
  41. package/engine/behaviour/unit.d.ts +40 -2
  42. package/engine/behaviour/unit.lua +269 -6
  43. package/engine/buff.d.ts +113 -53
  44. package/engine/buff.lua +544 -288
  45. package/engine/internal/ability.d.ts +7 -1
  46. package/engine/internal/ability.lua +64 -26
  47. package/engine/internal/item/ability.lua +66 -14
  48. package/engine/internal/item/fields.d.ts +12 -0
  49. package/engine/internal/item/fields.lua +33 -0
  50. package/engine/internal/item+owner.lua +12 -6
  51. package/engine/internal/item.d.ts +16 -19
  52. package/engine/internal/item.lua +174 -94
  53. package/engine/internal/mechanics/ability-duration.lua +1 -1
  54. package/engine/internal/mechanics/cast-ability.lua +6 -3
  55. package/engine/internal/misc/damage-metadata-by-target.lua +5 -0
  56. package/engine/internal/misc/frame-coordinates.d.ts +2 -0
  57. package/engine/internal/misc/frame-coordinates.lua +21 -0
  58. package/engine/internal/misc/get-terrain-z.d.ts +2 -0
  59. package/engine/internal/misc/get-terrain-z.lua +11 -0
  60. package/engine/internal/misc/player-local-handle.d.ts +2 -0
  61. package/engine/internal/misc/player-local-handle.lua +5 -0
  62. package/engine/internal/object-data/armor-bonus.d.ts +2 -0
  63. package/engine/internal/object-data/attribute-bonus.lua +2 -2
  64. package/engine/internal/object-data/auto-attack-speed-increase.d.ts +1 -1
  65. package/engine/internal/object-data/auto-attack-speed-increase.lua +2 -0
  66. package/engine/internal/object-data/evasion-probability.d.ts +2 -0
  67. package/engine/internal/object-data/evasion-probability.lua +16 -0
  68. package/engine/internal/object-data/health-bonus.d.ts +2 -0
  69. package/engine/internal/object-data/health-bonus.lua +16 -0
  70. package/engine/internal/object-data/mana-bonus.d.ts +2 -0
  71. package/engine/internal/object-data/mana-bonus.lua +16 -0
  72. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.d.ts +2 -0
  73. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.lua +16 -0
  74. package/engine/internal/unit/ability.d.ts +35 -0
  75. package/engine/internal/unit/ability.lua +98 -9
  76. package/engine/internal/unit/add-item-to-slot-init.d.ts +2 -0
  77. package/engine/internal/unit/add-item-to-slot-init.lua +23 -0
  78. package/engine/internal/unit/add-item-to-slot.d.ts +2 -0
  79. package/engine/internal/unit/add-item-to-slot.lua +52 -0
  80. package/engine/internal/unit/allowed-targets.d.ts +1 -1
  81. package/engine/internal/unit/allowed-targets.lua +9 -1
  82. package/engine/internal/unit/attributes.d.ts +17 -0
  83. package/engine/internal/unit/attributes.lua +46 -0
  84. package/engine/internal/unit/bonus.d.ts +8 -0
  85. package/engine/internal/unit/bonus.lua +50 -3
  86. package/engine/internal/unit/fly-height.d.ts +7 -0
  87. package/engine/internal/unit/fly-height.lua +20 -0
  88. package/engine/internal/unit/interrupts.d.ts +12 -0
  89. package/engine/internal/unit/interrupts.lua +28 -0
  90. package/engine/internal/unit/item.lua +3 -48
  91. package/engine/internal/unit/main-selected.lua +12 -27
  92. package/engine/internal/unit/order.d.ts +20 -0
  93. package/engine/internal/unit/order.lua +136 -0
  94. package/engine/internal/unit/range-event.d.ts +12 -0
  95. package/engine/internal/unit/range-event.lua +90 -0
  96. package/engine/internal/unit/scale.d.ts +7 -0
  97. package/engine/internal/unit/scale.lua +20 -0
  98. package/engine/internal/unit+ability.lua +10 -1
  99. package/engine/internal/unit+bonus.lua +3 -3
  100. package/engine/internal/unit+damage.d.ts +2 -11
  101. package/engine/internal/unit+damage.lua +10 -14
  102. package/engine/internal/unit+spellSteal.lua +1 -2
  103. package/engine/internal/unit-missile-launch.lua +52 -14
  104. package/engine/internal/unit.d.ts +44 -25
  105. package/engine/internal/unit.lua +393 -260
  106. package/engine/lightning.d.ts +12 -5
  107. package/engine/lightning.lua +48 -14
  108. package/engine/local-client.d.ts +7 -0
  109. package/engine/local-client.lua +86 -1
  110. package/engine/object-data/auxiliary/animation-name.d.ts +1 -0
  111. package/engine/object-data/auxiliary/animation-name.lua +16 -0
  112. package/engine/object-data/auxiliary/armor-type.d.ts +11 -0
  113. package/engine/object-data/auxiliary/armor-type.lua +46 -0
  114. package/engine/object-data/auxiliary/attachment-preset.d.ts +7 -2
  115. package/engine/object-data/auxiliary/attachment-preset.lua +4 -3
  116. package/engine/object-data/auxiliary/attack-type.d.ts +7 -8
  117. package/engine/object-data/auxiliary/attack-type.lua +42 -0
  118. package/engine/object-data/auxiliary/health-regeneration-type.d.ts +8 -0
  119. package/engine/object-data/auxiliary/health-regeneration-type.lua +2 -0
  120. package/engine/object-data/auxiliary/movement-type.d.ts +7 -7
  121. package/engine/object-data/auxiliary/movement-type.lua +22 -0
  122. package/engine/object-data/auxiliary/sound-eax.d.ts +10 -0
  123. package/engine/object-data/auxiliary/sound-eax.lua +2 -0
  124. package/engine/object-data/auxiliary/tech-tree-dependency.d.ts +1 -1
  125. package/engine/object-data/auxiliary/unit-attribute.d.ts +6 -0
  126. package/engine/object-data/auxiliary/unit-attribute.lua +9 -0
  127. package/engine/object-data/entry/ability-type/{armor-increase.d.ts → armor-bonus.d.ts} +3 -3
  128. package/engine/object-data/entry/ability-type/{armor-increase.lua → armor-bonus.lua} +9 -9
  129. package/engine/object-data/entry/ability-type/berserk.d.ts +2 -0
  130. package/engine/object-data/entry/ability-type/berserk.lua +13 -0
  131. package/engine/object-data/entry/ability-type/blank-configurable.lua +12 -1
  132. package/engine/object-data/entry/ability-type/carrion-swarm.d.ts +14 -0
  133. package/engine/object-data/entry/ability-type/carrion-swarm.lua +65 -0
  134. package/engine/object-data/entry/ability-type/disease-cloud.lua +2 -2
  135. package/engine/object-data/entry/ability-type/engineering-upgrade.lua +2 -2
  136. package/engine/object-data/entry/ability-type/ensnare.d.ts +12 -0
  137. package/engine/object-data/entry/ability-type/ensnare.lua +52 -0
  138. package/engine/object-data/entry/ability-type/feral-spirit.lua +2 -2
  139. package/engine/object-data/entry/ability-type/health-bonus.d.ts +8 -0
  140. package/engine/object-data/entry/ability-type/health-bonus.lua +26 -0
  141. package/engine/object-data/entry/ability-type/mana-bonus.d.ts +8 -0
  142. package/engine/object-data/entry/ability-type/mana-bonus.lua +26 -0
  143. package/engine/object-data/entry/ability-type/mana-regeneration.d.ts +8 -0
  144. package/engine/object-data/entry/ability-type/mana-regeneration.lua +26 -0
  145. package/engine/object-data/entry/ability-type/permanent-invisibility.d.ts +8 -0
  146. package/engine/object-data/entry/ability-type/permanent-invisibility.lua +26 -0
  147. package/engine/object-data/entry/ability-type/phase-shift.d.ts +10 -0
  148. package/engine/object-data/entry/ability-type/phase-shift.lua +39 -0
  149. package/engine/object-data/entry/ability-type/phoenix-morph.lua +4 -4
  150. package/engine/object-data/entry/ability-type/raise-dead.d.ts +17 -0
  151. package/engine/object-data/entry/ability-type/raise-dead.lua +78 -0
  152. package/engine/object-data/entry/ability-type/reincarnation.d.ts +8 -0
  153. package/engine/object-data/entry/ability-type/reincarnation.lua +26 -0
  154. package/engine/object-data/entry/ability-type/shock-wave.d.ts +4 -0
  155. package/engine/object-data/entry/ability-type/shock-wave.lua +26 -0
  156. package/engine/object-data/entry/ability-type/slow-poison.d.ts +10 -0
  157. package/engine/object-data/entry/ability-type/slow-poison.lua +58 -0
  158. package/engine/object-data/entry/ability-type/summon-quilbeast.lua +2 -2
  159. package/engine/object-data/entry/ability-type/summon-water-elemental.lua +2 -2
  160. package/engine/object-data/entry/ability-type/web.d.ts +12 -0
  161. package/engine/object-data/entry/ability-type/web.lua +52 -0
  162. package/engine/object-data/entry/ability-type.d.ts +21 -17
  163. package/engine/object-data/entry/ability-type.lua +169 -28
  164. package/engine/object-data/entry/buff-type/applicable.lua +122 -137
  165. package/engine/object-data/entry/buff-type.d.ts +6 -12
  166. package/engine/object-data/entry/buff-type.lua +13 -29
  167. package/engine/object-data/entry/destructible-type.d.ts +28 -2
  168. package/engine/object-data/entry/destructible-type.lua +155 -0
  169. package/engine/object-data/entry/item-type.d.ts +1 -1
  170. package/engine/object-data/entry/item-type.lua +4 -4
  171. package/engine/object-data/entry/lightning-type.d.ts +1 -1
  172. package/engine/object-data/entry/sound-preset.d.ts +33 -0
  173. package/engine/object-data/entry/sound-preset.lua +140 -0
  174. package/engine/object-data/entry/unit-type.d.ts +25 -5
  175. package/engine/object-data/entry/unit-type.lua +258 -93
  176. package/engine/object-data/entry/upgrade.d.ts +1 -1
  177. package/engine/object-data/entry/upgrade.lua +4 -4
  178. package/engine/object-data/entry.d.ts +16 -14
  179. package/engine/object-data/entry.lua +60 -32
  180. package/engine/object-field/ability.d.ts +4 -4
  181. package/engine/object-field/ability.lua +9 -8
  182. package/engine/object-field/item.d.ts +22 -0
  183. package/engine/object-field/item.lua +118 -0
  184. package/engine/object-field/unit.d.ts +72 -3
  185. package/engine/object-field/unit.lua +268 -7
  186. package/engine/object-field.d.ts +26 -7
  187. package/engine/object-field.lua +360 -119
  188. package/engine/random.d.ts +10 -0
  189. package/engine/random.lua +21 -0
  190. package/engine/standard/entries/buff-type.d.ts +3 -0
  191. package/engine/standard/entries/buff-type.lua +3 -0
  192. package/engine/standard/entries/sound-preset.d.ts +10 -0
  193. package/engine/standard/entries/sound-preset.lua +10 -0
  194. package/engine/standard/fields/ability.d.ts +2 -2
  195. package/engine/standard/fields/ability.lua +2 -2
  196. package/engine/standard/fields/item.d.ts +4 -0
  197. package/engine/standard/fields/item.lua +6 -0
  198. package/engine/standard/fields/unit.d.ts +12 -0
  199. package/engine/standard/fields/unit.lua +20 -0
  200. package/engine/synchronization.d.ts +11 -0
  201. package/engine/synchronization.lua +77 -0
  202. package/engine/text-tag.d.ts +36 -2
  203. package/engine/text-tag.lua +250 -10
  204. package/engine/unit.d.ts +7 -0
  205. package/engine/unit.lua +7 -0
  206. package/lualib_bundle.lua +1 -1
  207. package/math.d.ts +2 -0
  208. package/math.lua +14 -0
  209. package/net/socket.lua +1 -1
  210. package/objutil/buff.lua +11 -10
  211. package/objutil/object.lua +1 -1
  212. package/objutil/unit.lua +8 -0
  213. package/operation.lua +1 -4
  214. package/package.json +5 -5
  215. package/patch-lua.lua +15 -0
  216. package/patch-lualib.lua +1 -1
  217. package/utility/arrays.d.ts +2 -0
  218. package/utility/arrays.lua +11 -0
  219. package/utility/callback-array.d.ts +17 -0
  220. package/utility/callback-array.lua +61 -0
  221. package/utility/functions.d.ts +8 -0
  222. package/utility/functions.lua +13 -0
  223. package/utility/linked-map.d.ts +35 -0
  224. package/utility/linked-map.lua +107 -0
  225. package/utility/linked-set.d.ts +5 -1
  226. package/utility/linked-set.lua +49 -1
  227. package/utility/lua-maps.d.ts +15 -2
  228. package/utility/lua-maps.lua +53 -2
  229. package/utility/lua-sets.d.ts +2 -0
  230. package/utility/lua-sets.lua +7 -0
  231. package/utility/records.lua +20 -1
  232. package/utility/reflection.lua +11 -7
  233. package/utility/types.d.ts +3 -0
  234. package/utility/unordered-map.d.ts +27 -0
  235. package/utility/unordered-map.lua +99 -0
  236. package/core/types/order.d.ts +0 -25
  237. package/core/types/order.lua +0 -55
  238. /package/engine/internal/{object-data/armor-increase.d.ts → misc/damage-metadata-by-target.d.ts} +0 -0
  239. /package/engine/internal/object-data/{armor-increase.lua → armor-bonus.lua} +0 -0
  240. /package/engine/object-data/entry/ability-type/{attribute-increase.d.ts → attribute-bonus.d.ts} +0 -0
  241. /package/engine/object-data/entry/ability-type/{attribute-increase.lua → attribute-bonus.lua} +0 -0
@@ -53,33 +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
87
+ local getUnitCurrentOrder = GetUnitCurrentOrder
80
88
  local createUnit = CreateUnit
81
89
  local killUnit = KillUnit
82
- local setUnitExploded = SetUnitExploded
83
90
  local removeUnit = RemoveUnit
84
91
  local getUnitTypeId = GetUnitTypeId
85
92
  local isHeroUnitId = IsHeroUnitId
@@ -95,15 +102,12 @@ local getSpellTargetItem = GetSpellTargetItem
95
102
  local getSpellTargetDestructable = GetSpellTargetDestructable
96
103
  local isUnitInRangeXY = IsUnitInRangeXY
97
104
  local isUnitInRange = IsUnitInRange
98
- local setResourceAmount = SetResourceAmount
99
- local getResourceAmount = GetResourceAmount
100
105
  local getUnitWeaponRealField = BlzGetUnitWeaponRealField
101
106
  local setUnitWeaponRealField = BlzSetUnitWeaponRealField
102
107
  local getUnitWeaponStringField = BlzGetUnitWeaponStringField
103
108
  local setUnitWeaponStringField = BlzSetUnitWeaponStringField
104
109
  local getUnitAbilityLevel = GetUnitAbilityLevel
105
110
  local unitDisableAbility = BlzUnitDisableAbility
106
- local unitInterruptAttack = BlzUnitInterruptAttack
107
111
  local isUnitInvisible = IsUnitInvisible
108
112
  local isUnitVisible = IsUnitVisible
109
113
  local getUnitX = GetUnitX
@@ -120,15 +124,9 @@ local getOrderedUnit = GetOrderedUnit
120
124
  local getIssuedOrderId = GetIssuedOrderId
121
125
  local isUnitInvulnerable = BlzIsUnitInvulnerable
122
126
  local unitAlive = UnitAlive
123
- local unitAddType = UnitAddType
124
- local unitRemoveType = UnitRemoveType
125
- local isUnitIllusion = IsUnitIllusion
126
- local isUnitType = IsUnitType
127
127
  local isUnitAlly = IsUnitAlly
128
128
  local isUnitEnemy = IsUnitEnemy
129
129
  local getOwningPlayer = GetOwningPlayer
130
- local setUnitColor = SetUnitColor
131
- local showUnitTeamGlow = BlzShowUnitTeamGlow
132
130
  ____exports.UnitClassification = {}
133
131
  local UnitClassification = ____exports.UnitClassification
134
132
  do
@@ -138,6 +136,7 @@ do
138
136
  UnitClassification.GROUND = UNIT_TYPE_GROUND
139
137
  UnitClassification.SUMMONED = UNIT_TYPE_SUMMONED
140
138
  UnitClassification.MECHANICAL = UNIT_TYPE_MECHANICAL
139
+ UnitClassification.WORKER = UNIT_TYPE_PEON
141
140
  UnitClassification.ANCIENT = UNIT_TYPE_ANCIENT
142
141
  UnitClassification.SUICIDAL = UNIT_TYPE_SAPPER
143
142
  UnitClassification.TAUREN = UNIT_TYPE_TAUREN
@@ -345,6 +344,9 @@ local function dispatchAbility(event)
345
344
  }
346
345
  )
347
346
  end
347
+ local function damagingEventPreventRetaliation(self)
348
+ self[0] = true
349
+ end
348
350
  local function damageEventPreventDeath(self, callback, ...)
349
351
  if self[0] ~= nil then
350
352
  return
@@ -356,7 +358,14 @@ local function damageEventPreventDeath(self, callback, ...)
356
358
  rawset(self, 1 + i, (select(i, ...)))
357
359
  end
358
360
  end
359
- 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
+ }
360
369
  local jlimitopByOperator = {
361
370
  [0] = LESS_THAN_OR_EQUAL,
362
371
  [1] = LESS_THAN_OR_EQUAL,
@@ -374,15 +383,27 @@ local modifiers = {
374
383
  end,
375
384
  armor = function(unit, value)
376
385
  if UnitAddAbility(unit, armorBonusAbilityId) then
377
- assert(UnitMakeAbilityPermanent(unit, true, armorBonusAbilityId))
386
+ assert(
387
+ UnitMakeAbilityPermanent(unit, true, armorBonusAbilityId),
388
+ "armor bonus ability must be made permanent",
389
+ unit
390
+ )
378
391
  end
379
- local ability = assert(BlzGetUnitAbility(unit, armorBonusAbilityId))
380
- assert(BlzSetAbilityRealLevelField(
381
- ability,
382
- armorBonusField,
383
- 0,
384
- BlzGetAbilityRealLevelField(ability, armorBonusField, 0) + value
385
- ))
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
+ )
386
407
  end
387
408
  }
388
409
  local getters = {
@@ -400,6 +421,19 @@ function UnitWeapon.prototype.____constructor(self, unit, index)
400
421
  self.unit = unit
401
422
  self.index = index
402
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
+ )
403
437
  __TS__SetDescriptor(
404
438
  UnitWeapon.prototype,
405
439
  "cooldown",
@@ -434,6 +468,19 @@ __TS__SetDescriptor(
434
468
  },
435
469
  true
436
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
+ )
437
484
  __TS__SetDescriptor(
438
485
  UnitWeapon.prototype,
439
486
  "damageBase",
@@ -610,26 +657,30 @@ local fieldSetters = {
610
657
  }
611
658
  local dummies = {}
612
659
  for ____, player in ipairs(Player.all) do
613
- local dummy = assert(createUnit(
614
- player.handle,
615
- dummyUnitId,
616
- 0,
617
- 0,
618
- 270
619
- ))
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
+ )
620
671
  ShowUnit(dummy, false)
621
672
  dummies[player] = dummy
622
673
  end
623
674
  local function delayHealthChecksCallback(unit)
624
- local counter = (unit[103] or 0) - 1
675
+ local counter = (unit[104] or 0) - 1
625
676
  if counter ~= 0 then
626
- unit[103] = counter
677
+ unit[104] = counter
627
678
  return
628
679
  end
629
- unit[103] = nil
630
- local healthBonus = unit[104]
680
+ unit[104] = nil
681
+ local healthBonus = unit[105]
631
682
  if healthBonus ~= nil then
632
- unit[104] = nil
683
+ unit[105] = nil
633
684
  local handle = unit.handle
634
685
  BlzSetUnitMaxHP(
635
686
  handle,
@@ -638,50 +689,78 @@ local function delayHealthChecksCallback(unit)
638
689
  end
639
690
  end
640
691
  local nextSyncId = 1
641
- 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
642
703
  ____exports.Unit = __TS__Class()
643
704
  local Unit = ____exports.Unit
644
705
  Unit.name = "Unit"
645
706
  __TS__ClassExtends(Unit, Handle)
646
707
  function Unit.prototype.____constructor(self, handle)
647
708
  Handle.prototype.____constructor(self, handle)
648
- local ____nextSyncId_0 = nextSyncId
649
- nextSyncId = ____nextSyncId_0 + 1
650
- self.syncId = ____nextSyncId_0
709
+ local ____nextSyncId_1 = nextSyncId
710
+ nextSyncId = ____nextSyncId_1 + 1
711
+ self.syncId = ____nextSyncId_1
651
712
  self._owner = Player:of(getOwningPlayer(handle))
652
- assert(unitAddAbility(handle, leaveDetectAbilityId) and UnitMakeAbilityPermanent(handle, true, leaveDetectAbilityId))
653
- 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
+ )
654
723
  if unitAddAbility(
655
724
  handle,
656
725
  fourCC("Amrf")
657
726
  ) then
658
- assert(unitRemoveAbility(
659
- handle,
660
- fourCC("Amrf")
661
- ))
727
+ assert(
728
+ unitRemoveAbility(
729
+ handle,
730
+ fourCC("Amrf")
731
+ ),
732
+ "fly ability must be removed after addition",
733
+ self
734
+ )
662
735
  end
663
736
  unitBySyncId[self.syncId] = self
664
737
  local ____ = self.abilities
665
738
  end
666
- function Unit.prototype.getEvent(self, event, collector)
667
- self.events = self.events or ({})
668
- local eventId = GetHandleId(event)
669
- if not self.events[eventId] then
670
- 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(
671
745
  TriggerEvent,
672
746
  function(trigger)
673
- TriggerRegisterUnitEvent(trigger, self.handle, event)
747
+ TriggerRegisterUnitEvent(trigger, self.handle, jevent)
674
748
  end,
675
749
  collector or (function() return {} end)
676
750
  )
751
+ self.events:put(eventId, event)
677
752
  end
678
- 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))
679
760
  end
680
761
  function Unit.prototype.onDestroy(self)
681
762
  local handle = self.handle
682
- if not self._owner then
683
- self._owner = Player:of(getOwningPlayer(handle))
684
- end
763
+ self:saveData()
685
764
  local abilities = self.abilities
686
765
  for ____, ability in ipairs(abilities) do
687
766
  ability:destroy()
@@ -717,7 +796,11 @@ function Unit.prototype.addAttackHandler(self, condition, action)
717
796
  self._attackHandlers = handlers
718
797
  if #handlers == 1 then
719
798
  local handle = self.handle
720
- 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
+ )
721
804
  end
722
805
  return handler
723
806
  end
@@ -746,17 +829,17 @@ function Unit.prototype.addModifier(self, property, modifier)
746
829
  end}
747
830
  end
748
831
  function Unit.prototype.hasCombatClassification(self, combatClassification)
749
- local ____combatClassification_1 = combatClassification
750
- 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
751
834
  end
752
835
  function Unit.prototype.addClassification(self, classification)
753
- return unitAddType(self.handle, classification)
836
+ return UnitAddType(self.handle, classification)
754
837
  end
755
838
  function Unit.prototype.removeClassification(self, classification)
756
- return unitRemoveType(self.handle, classification)
839
+ return UnitRemoveType(self.handle, classification)
757
840
  end
758
841
  function Unit.prototype.hasClassification(self, classification)
759
- return isUnitType(self.handle, classification)
842
+ return IsUnitType(self.handle, classification)
760
843
  end
761
844
  function Unit.prototype.isVisibleTo(self, player)
762
845
  return isUnitVisible(self.handle, player.handle)
@@ -765,13 +848,13 @@ function Unit.prototype.isInvisibleTo(self, player)
765
848
  return isUnitInvisible(self.handle, player.handle)
766
849
  end
767
850
  function Unit.prototype.isInRangeOf(self, x, y, range)
768
- local ____temp_2
851
+ local ____temp_3
769
852
  if type(x) == "number" then
770
- ____temp_2 = isUnitInRangeXY(self.handle, x, y, range)
853
+ ____temp_3 = isUnitInRangeXY(self.handle, x, y, range)
771
854
  else
772
- ____temp_2 = isUnitInRange(self.handle, x.handle, y)
855
+ ____temp_3 = isUnitInRange(self.handle, x.handle, y)
773
856
  end
774
- return ____temp_2
857
+ return ____temp_3
775
858
  end
776
859
  function Unit.prototype.isAllyOf(self, unit)
777
860
  return isUnitAlly(
@@ -789,16 +872,30 @@ function Unit.prototype.playAnimation(self, animation, rarity)
789
872
  if type(animation) == "number" then
790
873
  setUnitAnimationByIndex(self.handle, animation)
791
874
  elseif rarity then
792
- setUnitAnimationWithRarity(self.handle, animation, rarity)
875
+ SetUnitAnimationWithRarity(self.handle, animation, rarity)
793
876
  else
794
877
  setUnitAnimation(self.handle, animation)
795
878
  end
796
879
  end
880
+ function Unit.prototype.resetAnimation(self)
881
+ ResetUnitAnimation(self.handle)
882
+ end
797
883
  function Unit.prototype.queueAnimation(self, animation)
798
- 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
799
896
  end
800
897
  function Unit.prototype.delayHealthChecks(self)
801
- self[103] = (self[103] or 0) + 1
898
+ self[104] = (self[104] or 0) + 1
802
899
  Timer:run(delayHealthChecksCallback, self)
803
900
  end
804
901
  function Unit.prototype.setPosition(self, x, y)
@@ -808,21 +905,21 @@ function Unit.prototype.isSelected(self, player)
808
905
  return IsUnitSelected(self.handle, player.handle)
809
906
  end
810
907
  function Unit.prototype.explode(self)
811
- setUnitExploded(self.handle, true)
908
+ SetUnitExploded(self.handle, true)
812
909
  killUnit(self.handle)
813
910
  end
814
911
  function Unit.prototype.kill(self)
815
912
  killUnit(self.handle)
816
913
  end
817
914
  function Unit.prototype.revive(self, x, y, doEffect)
818
- local ____ReviveHero_5 = ReviveHero
819
- local ____array_4 = __TS__SparseArrayNew(self.handle, x, y)
820
- local ____doEffect_3 = doEffect
821
- if ____doEffect_3 == nil then
822
- ____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
823
920
  end
824
- __TS__SparseArrayPush(____array_4, ____doEffect_3)
825
- ____ReviveHero_5(__TS__SparseArraySpread(____array_4))
921
+ __TS__SparseArrayPush(____array_5, ____doEffect_4)
922
+ ____ReviveHero_6(__TS__SparseArraySpread(____array_5))
826
923
  end
827
924
  function Unit.prototype.healTarget(self, target, amount)
828
925
  if __TS__InstanceOf(target, ____exports.Unit) and target:hasAbility(fourCC("BIhm")) then
@@ -865,17 +962,16 @@ function Unit.prototype.itemInSlot(self, slot)
865
962
  return Item:of(unitItemInSlot(self.handle, slot))
866
963
  end
867
964
  function Unit.prototype.addAbility(self, abilityId)
868
- if unitAddAbility(self.handle, abilityId) then
869
- local ability = UnitAbility:of(
870
- checkNotNull(getUnitAbility(self.handle, abilityId)),
871
- abilityId,
872
- self
873
- )
965
+ local ability = UnitAbility:of(
966
+ doUnitAbilityAction(self.handle, abilityId, addAbility, abilityId),
967
+ abilityId,
968
+ self
969
+ )
970
+ if ability ~= nil then
874
971
  local abilities = self.abilities
875
972
  abilities[#abilities + 1] = ability
876
- return ability
877
973
  end
878
- return nil
974
+ return ability
879
975
  end
880
976
  function Unit.prototype.makeAbilityPermanent(self, abilityId, permanent)
881
977
  return UnitMakeAbilityPermanent(self.handle, permanent, abilityId)
@@ -889,31 +985,21 @@ end
889
985
  function Unit.prototype.hasAbility(self, abilityId)
890
986
  return getUnitAbilityLevel(self.handle, abilityId) > 0
891
987
  end
892
- function Unit.prototype.getAbilityById(self, abilityId)
893
- local handle = self.handle
894
- if unitAddAbility(handle, abilityId) then
895
- assert(unitRemoveAbility(handle, abilityId))
896
- return nil
897
- end
898
- return UnitAbility:of(
899
- getUnitAbility(self.handle, abilityId),
900
- abilityId,
901
- self
902
- )
988
+ function Unit.prototype.getAbility(self, abilityId)
989
+ local ability = doUnitAbilityAction(self.handle, abilityId, getUnitAbility, abilityId)
990
+ return UnitAbility:of(ability, abilityId, self)
903
991
  end
904
- function Unit.prototype.removeAbility(self, abilityId)
905
- if unitRemoveAbility(self.handle, abilityId) then
906
- local abilities = self.abilities
907
- for i = 1, #abilities do
908
- if abilities[i].typeId == abilityId then
909
- abilities[i]:destroy()
910
- tremove(abilities, i)
911
- return true
912
- 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
913
1000
  end
914
- return true
915
1001
  end
916
- return false
1002
+ return doUnitAbilityAction(self.handle, abilityTypeId, unitRemoveAbility, abilityTypeId)
917
1003
  end
918
1004
  function Unit.prototype.hideAbility(self, abilityId, flag)
919
1005
  BlzUnitHideAbility(self.handle, abilityId, flag)
@@ -927,9 +1013,6 @@ end
927
1013
  function Unit.prototype.endAbilityCooldown(self, abilityId)
928
1014
  BlzEndUnitAbilityCooldown(self.handle, abilityId)
929
1015
  end
930
- function Unit.prototype.interruptAttack(self)
931
- unitInterruptAttack(self.handle)
932
- end
933
1016
  function Unit.prototype.interruptCast(self, abilityId)
934
1017
  local handle = self.handle
935
1018
  unitDisableAbility(handle, abilityId, true, false)
@@ -1000,18 +1083,44 @@ function Unit.prototype.unpauseEx(self)
1000
1083
  end
1001
1084
  function Unit.prototype.incrementStunCounter(self)
1002
1085
  local stunCounter = self[102] or 0
1003
- if not self[101] or stunCounter >= 0 then
1086
+ if not self[101] and (self[103] or 0) <= 0 or stunCounter >= 0 then
1004
1087
  BlzPauseUnitEx(self.handle, true)
1005
1088
  end
1006
1089
  self[102] = stunCounter + 1
1007
1090
  end
1008
1091
  function Unit.prototype.decrementStunCounter(self)
1009
1092
  local stunCounter = self[102] or 0
1010
- if not self[101] or stunCounter >= 1 then
1093
+ if not self[101] and (self[103] or 0) <= 0 or stunCounter >= 1 then
1011
1094
  BlzPauseUnitEx(self.handle, false)
1012
1095
  end
1013
1096
  self[102] = stunCounter - 1
1014
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
1015
1124
  function Unit.create(self, owner, id, x, y, facing, skinId)
1016
1125
  local handle = skinId and BlzCreateUnitWithSkin(
1017
1126
  owner.handle,
@@ -1200,7 +1309,15 @@ __TS__SetDescriptor(
1200
1309
  Unit.prototype,
1201
1310
  "isIllusion",
1202
1311
  {get = function(self)
1203
- return isUnitIllusion(self.handle)
1312
+ return IsUnitIllusion(self.handle)
1313
+ end},
1314
+ true
1315
+ )
1316
+ __TS__SetDescriptor(
1317
+ Unit.prototype,
1318
+ "isStunned",
1319
+ {get = function(self)
1320
+ return getUnitCurrentOrder(self.handle) == orderId("stunned")
1204
1321
  end},
1205
1322
  true
1206
1323
  )
@@ -1279,13 +1396,13 @@ __TS__SetDescriptor(
1279
1396
  )
1280
1397
  __TS__SetDescriptor(
1281
1398
  Unit.prototype,
1282
- "strengthBase",
1399
+ "primaryAttribute",
1283
1400
  {
1284
1401
  get = function(self)
1285
- return getHeroStr(self.handle, false)
1402
+ return getUnitIntegerField(self.handle, UNIT_IF_PRIMARY_ATTRIBUTE)
1286
1403
  end,
1287
- set = function(self, strengthBase)
1288
- setHeroStr(self.handle, strengthBase, true)
1404
+ set = function(self, primaryAttribute)
1405
+ setUnitIntegerField(self.handle, UNIT_IF_PRIMARY_ATTRIBUTE, primaryAttribute)
1289
1406
  end
1290
1407
  },
1291
1408
  true
@@ -1307,19 +1424,6 @@ __TS__SetDescriptor(
1307
1424
  end},
1308
1425
  true
1309
1426
  )
1310
- __TS__SetDescriptor(
1311
- Unit.prototype,
1312
- "agilityBase",
1313
- {
1314
- get = function(self)
1315
- return getHeroAgi(self.handle, false)
1316
- end,
1317
- set = function(self, agilityBase)
1318
- setHeroAgi(self.handle, agilityBase, true)
1319
- end
1320
- },
1321
- true
1322
- )
1323
1427
  __TS__SetDescriptor(
1324
1428
  Unit.prototype,
1325
1429
  "agilityBonus",
@@ -1337,19 +1441,6 @@ __TS__SetDescriptor(
1337
1441
  end},
1338
1442
  true
1339
1443
  )
1340
- __TS__SetDescriptor(
1341
- Unit.prototype,
1342
- "intelligenceBase",
1343
- {
1344
- get = function(self)
1345
- return getHeroInt(self.handle, false)
1346
- end,
1347
- set = function(self, intelligenceBase)
1348
- setHeroInt(self.handle, intelligenceBase, true)
1349
- end
1350
- },
1351
- true
1352
- )
1353
1444
  __TS__SetDescriptor(
1354
1445
  Unit.prototype,
1355
1446
  "intelligenceBonus",
@@ -1398,17 +1489,17 @@ __TS__SetDescriptor(
1398
1489
  "isTeamGlowVisible",
1399
1490
  {
1400
1491
  get = function(self)
1401
- return not self[106]
1492
+ return not self[107]
1402
1493
  end,
1403
1494
  set = function(self, isTeamGlowVisible)
1404
- showUnitTeamGlow(self.handle, isTeamGlowVisible)
1405
- local ____temp_6
1495
+ BlzShowUnitTeamGlow(self.handle, isTeamGlowVisible)
1496
+ local ____temp_7
1406
1497
  if not isTeamGlowVisible then
1407
- ____temp_6 = true
1498
+ ____temp_7 = true
1408
1499
  else
1409
- ____temp_6 = nil
1500
+ ____temp_7 = nil
1410
1501
  end
1411
- self[106] = ____temp_6
1502
+ self[107] = ____temp_7
1412
1503
  end
1413
1504
  },
1414
1505
  true
@@ -1417,9 +1508,9 @@ __TS__SetDescriptor(
1417
1508
  Unit.prototype,
1418
1509
  "color",
1419
1510
  {set = function(self, color)
1420
- setUnitColor(self.handle, color.handle)
1421
- if self[106] then
1422
- showUnitTeamGlow(self.handle, false)
1511
+ SetUnitColor(self.handle, color.handle)
1512
+ if self[107] then
1513
+ BlzShowUnitTeamGlow(self.handle, false)
1423
1514
  end
1424
1515
  end},
1425
1516
  true
@@ -1442,14 +1533,14 @@ __TS__SetDescriptor(
1442
1533
  "maxHealth",
1443
1534
  {
1444
1535
  get = function(self)
1445
- 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)
1446
1537
  end,
1447
1538
  set = function(self, maxHealth)
1448
- if maxHealth < 1 and self[103] ~= nil then
1449
- 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)
1450
1541
  maxHealth = 1
1451
1542
  end
1452
- BlzSetUnitMaxHP(self.handle, maxHealth + (self[105] or 0))
1543
+ BlzSetUnitMaxHP(self.handle, maxHealth + (self[106] or 0))
1453
1544
  end
1454
1545
  },
1455
1546
  true
@@ -1491,10 +1582,10 @@ __TS__SetDescriptor(
1491
1582
  "health",
1492
1583
  {
1493
1584
  get = function(self)
1494
- return GetWidgetLife(self.handle) - (self[105] or 0)
1585
+ return GetWidgetLife(self.handle) - (self[106] or 0)
1495
1586
  end,
1496
1587
  set = function(self, health)
1497
- SetWidgetLife(self.handle, health + (self[105] or 0))
1588
+ SetWidgetLife(self.handle, health + (self[106] or 0))
1498
1589
  end
1499
1590
  },
1500
1591
  true
@@ -1570,25 +1661,12 @@ __TS__SetDescriptor(
1570
1661
  },
1571
1662
  true
1572
1663
  )
1573
- __TS__SetDescriptor(
1574
- Unit.prototype,
1575
- "flyHeight",
1576
- {
1577
- get = function(self)
1578
- return getUnitFlyHeight(self.handle)
1579
- end,
1580
- set = function(self, v)
1581
- SetUnitFlyHeight(self.handle, v, 100000)
1582
- end
1583
- },
1584
- true
1585
- )
1586
1664
  __TS__SetDescriptor(
1587
1665
  Unit.prototype,
1588
1666
  "x",
1589
1667
  {
1590
1668
  get = function(self)
1591
- return getUnitX(self.handle)
1669
+ return self[108] or getUnitX(self.handle)
1592
1670
  end,
1593
1671
  set = function(self, v)
1594
1672
  SetUnitX(self.handle, v)
@@ -1601,7 +1679,7 @@ __TS__SetDescriptor(
1601
1679
  "y",
1602
1680
  {
1603
1681
  get = function(self)
1604
- return getUnitY(self.handle)
1682
+ return self[109] or getUnitY(self.handle)
1605
1683
  end,
1606
1684
  set = function(self, v)
1607
1685
  SetUnitY(self.handle, v)
@@ -1687,10 +1765,10 @@ __TS__SetDescriptor(
1687
1765
  "gold",
1688
1766
  {
1689
1767
  get = function(self)
1690
- return getResourceAmount(self.handle)
1768
+ return GetResourceAmount(self.handle)
1691
1769
  end,
1692
1770
  set = function(self, gold)
1693
- setResourceAmount(self.handle, gold)
1771
+ SetResourceAmount(self.handle, gold)
1694
1772
  end
1695
1773
  },
1696
1774
  true
@@ -1706,14 +1784,18 @@ __TS__SetDescriptor(
1706
1784
  local handle = self.handle
1707
1785
  if isPaused and not IsUnitPaused(handle) then
1708
1786
  self[101] = true
1709
- for _ = self[102] or 0, -1 do
1710
- 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
1711
1791
  end
1712
1792
  PauseUnit(handle, true)
1713
1793
  elseif not isPaused and IsUnitPaused(handle) then
1714
1794
  PauseUnit(handle, false)
1715
- for _ = self[102] or 0, -1 do
1716
- 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
1717
1799
  end
1718
1800
  self[101] = nil
1719
1801
  end
@@ -1771,20 +1853,6 @@ __TS__SetDescriptor(
1771
1853
  },
1772
1854
  true
1773
1855
  )
1774
- __TS__SetDescriptor(
1775
- Unit.prototype,
1776
- "scale",
1777
- {
1778
- get = function(self)
1779
- return getUnitRealField(self.handle, UNIT_RF_SCALING_VALUE)
1780
- end,
1781
- set = function(self, v)
1782
- setUnitScale(self.handle, v, v, v)
1783
- setUnitRealField(self.handle, UNIT_RF_SCALING_VALUE, v)
1784
- end
1785
- },
1786
- true
1787
- )
1788
1856
  __TS__SetDescriptor(
1789
1857
  Unit.prototype,
1790
1858
  "timeScale",
@@ -1818,6 +1886,19 @@ __TS__SetDescriptor(
1818
1886
  end},
1819
1887
  true
1820
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
+ )
1821
1902
  __TS__SetDescriptor(
1822
1903
  Unit.prototype,
1823
1904
  "pathing",
@@ -1908,30 +1989,6 @@ __TS__SetDescriptor(
1908
1989
  end},
1909
1990
  true
1910
1991
  )
1911
- __TS__SetDescriptor(
1912
- Unit.prototype,
1913
- "onUnitInRange",
1914
- {get = function(self)
1915
- local handle = self.handle
1916
- local onUnitInRange = setmetatable(
1917
- {},
1918
- {__index = function(self, value)
1919
- local event = __TS__New(
1920
- TriggerEvent,
1921
- function(trigger)
1922
- TriggerRegisterUnitInRangeSimple(trigger, value, handle)
1923
- end,
1924
- function() return ____exports.Unit:of(handle) end
1925
- )
1926
- rawset(self, value, event)
1927
- return event
1928
- end}
1929
- )
1930
- rawset(self, "onUnitInRange", onUnitInRange)
1931
- return onUnitInRange
1932
- end},
1933
- true
1934
- )
1935
1992
  __TS__SetDescriptor(
1936
1993
  Unit.prototype,
1937
1994
  "onManaEqual",
@@ -1999,6 +2056,14 @@ __TS__SetDescriptor(
1999
2056
  end},
2000
2057
  true
2001
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
+ )
2002
2067
  __TS__SetDescriptor(
2003
2068
  Unit.prototype,
2004
2069
  "onSelect",
@@ -2059,6 +2124,11 @@ __TS__SetDescriptor(
2059
2124
  end},
2060
2125
  true
2061
2126
  )
2127
+ Unit.levelChangedEvent = __TS__New(
2128
+ ____exports.UnitTriggerEvent,
2129
+ EVENT_PLAYER_HERO_LEVEL,
2130
+ function() return ____exports.Unit:of(getTriggerUnit()) end
2131
+ )
2062
2132
  Unit.deathEvent = __TS__New(
2063
2133
  ____exports.UnitTriggerEvent,
2064
2134
  EVENT_PLAYER_UNIT_DEATH,
@@ -2134,25 +2204,25 @@ Unit.onTargetCast = dispatchId(__TS__New(
2134
2204
  InitializingEvent,
2135
2205
  function(event)
2136
2206
  local function listener(unit, id)
2137
- local ____GetSpellTargetUnit_result_9
2207
+ local ____GetSpellTargetUnit_result_10
2138
2208
  if GetSpellTargetUnit() then
2139
- ____GetSpellTargetUnit_result_9 = ____exports.Unit:of(GetSpellTargetUnit())
2209
+ ____GetSpellTargetUnit_result_10 = ____exports.Unit:of(GetSpellTargetUnit())
2140
2210
  else
2141
- local ____GetSpellTargetItem_result_8
2211
+ local ____GetSpellTargetItem_result_9
2142
2212
  if GetSpellTargetItem() then
2143
- ____GetSpellTargetItem_result_8 = Item:of(GetSpellTargetItem())
2213
+ ____GetSpellTargetItem_result_9 = Item:of(GetSpellTargetItem())
2144
2214
  else
2145
- local ____GetSpellTargetDestructable_result_7
2215
+ local ____GetSpellTargetDestructable_result_8
2146
2216
  if GetSpellTargetDestructable() then
2147
- ____GetSpellTargetDestructable_result_7 = Destructable:of(GetSpellTargetDestructable())
2217
+ ____GetSpellTargetDestructable_result_8 = Destructable:of(GetSpellTargetDestructable())
2148
2218
  else
2149
- ____GetSpellTargetDestructable_result_7 = nil
2219
+ ____GetSpellTargetDestructable_result_8 = nil
2150
2220
  end
2151
- ____GetSpellTargetItem_result_8 = ____GetSpellTargetDestructable_result_7
2221
+ ____GetSpellTargetItem_result_9 = ____GetSpellTargetDestructable_result_8
2152
2222
  end
2153
- ____GetSpellTargetUnit_result_9 = ____GetSpellTargetItem_result_8
2223
+ ____GetSpellTargetUnit_result_10 = ____GetSpellTargetItem_result_9
2154
2224
  end
2155
- local target = ____GetSpellTargetUnit_result_9
2225
+ local target = ____GetSpellTargetUnit_result_10
2156
2226
  if target then
2157
2227
  invoke(event, unit, id, target)
2158
2228
  end
@@ -2360,38 +2430,57 @@ Unit.onDamaging = (function()
2360
2430
  if source and source.typeId == dummyUnitId then
2361
2431
  source = nil
2362
2432
  end
2363
- local target = BlzGetEventDamageTarget()
2433
+ local target = ____exports.Unit:of(BlzGetEventDamageTarget())
2434
+ local metadata = damageMetadataByTarget[target]
2435
+ damageMetadataByTarget[target] = nil
2364
2436
  local data = {
2365
2437
  amount = GetEventDamage(),
2366
- attackType = BlzGetEventAttackType(),
2438
+ attackType = nativeToAttackType(BlzGetEventAttackType()),
2367
2439
  damageType = BlzGetEventDamageType(),
2368
2440
  weaponType = BlzGetEventWeaponType(),
2369
- isAttack = BlzGetEventIsAttack()
2441
+ metadata = metadata,
2442
+ isAttack = BlzGetEventIsAttack(),
2443
+ originalAmount = GetEventDamage(),
2444
+ originalMetadata = metadata,
2445
+ preventRetaliation = damagingEventPreventRetaliation
2370
2446
  }
2371
2447
  if data.isAttack and source then
2372
- 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
2373
- if weapon == -1 then
2374
- local targetsAllowed = BlzGetUnitWeaponIntegerField(source.handle, UNIT_WEAPON_IF_ATTACK_TARGETS_ALLOWED, 0)
2375
- weapon = 0
2376
- end
2377
- data.weapon = assert(source.weapons[weapon + 1])
2448
+ data.weapon = source:chooseWeapon(target)
2378
2449
  end
2379
2450
  if not data.isAttack or not source or not source._attackHandlers then
2380
2451
  invoke(
2381
2452
  event,
2382
2453
  source,
2383
- ____exports.Unit:of(target),
2454
+ target,
2384
2455
  setmetatable(
2385
2456
  {},
2386
2457
  {
2387
2458
  __index = data,
2388
2459
  __newindex = function(self, key, value)
2389
- damageSetters[key](value)
2460
+ local damageSetter = damageSetters[key]
2461
+ if damageSetter ~= nil then
2462
+ damageSetter(value)
2463
+ end
2390
2464
  data[key] = value
2391
2465
  end
2392
2466
  }
2393
2467
  )
2394
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
2395
2484
  return
2396
2485
  end
2397
2486
  BlzSetEventDamage(0)
@@ -2399,7 +2488,7 @@ Unit.onDamaging = (function()
2399
2488
  BlzSetEventDamageType(DAMAGE_TYPE_UNKNOWN)
2400
2489
  BlzSetEventWeaponType(WEAPON_TYPE_WHOKNOWS)
2401
2490
  local sourceOwner = source.owner.handle
2402
- local targetOwner = GetOwningPlayer(target)
2491
+ local targetOwner = target.owner.handle
2403
2492
  if not GetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE) then
2404
2493
  SetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE, true)
2405
2494
  Timer:run(function()
@@ -2415,23 +2504,19 @@ Unit.onDamaging = (function()
2415
2504
  for ____, ____value in ipairs(source._attackHandlers) do
2416
2505
  local condition = ____value[1]
2417
2506
  local action = ____value[2]
2418
- if condition(
2419
- source,
2420
- ____exports.Unit:of(target),
2421
- data
2422
- ) then
2507
+ if condition(source, target, data) then
2423
2508
  action(
2424
2509
  source,
2425
- ____exports.Unit:of(target),
2510
+ target,
2426
2511
  setmetatable(
2427
2512
  {fire = function()
2428
2513
  UnitDamageTarget(
2429
2514
  source.handle,
2430
- target,
2515
+ target.handle,
2431
2516
  data.amount,
2432
2517
  true,
2433
2518
  true,
2434
- data.attackType,
2519
+ attackTypeToNative(data.attackType),
2435
2520
  data.damageType,
2436
2521
  data.weaponType
2437
2522
  )
@@ -2458,30 +2543,54 @@ Unit.onDamage = __TS__New(
2458
2543
  if source and source.typeId == dummyUnitId then
2459
2544
  source = nil
2460
2545
  end
2546
+ local target = ____exports.Unit:of(BlzGetEventDamageTarget())
2547
+ local damagingEvent = damagingEventByTarget[target]
2548
+ damagingEventByTarget[target] = nil
2461
2549
  local data = {
2462
2550
  amount = GetEventDamage(),
2463
- attackType = BlzGetEventAttackType(),
2551
+ attackType = nativeToAttackType(BlzGetEventAttackType()),
2464
2552
  damageType = BlzGetEventDamageType(),
2465
2553
  weaponType = BlzGetEventWeaponType(),
2554
+ metadata = damagingEvent and damagingEvent.metadata,
2466
2555
  isAttack = BlzGetEventIsAttack(),
2467
- originalAmount = GetEventDamage(),
2556
+ originalAmount = damagingEvent and damagingEvent.originalAmount or GetEventDamage(),
2557
+ originalMetadata = damagingEvent and damagingEvent.originalMetadata,
2468
2558
  preventDeath = damageEventPreventDeath
2469
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
2470
2577
  local evData = setmetatable(
2471
2578
  {},
2472
2579
  {
2473
2580
  __index = data,
2474
2581
  __newindex = function(self, key, value)
2475
- damageSetters[key](value)
2582
+ local damageSetter = damageSetters[key]
2583
+ if damageSetter ~= nil then
2584
+ damageSetter(value)
2585
+ end
2476
2586
  data[key] = value
2477
2587
  end
2478
2588
  }
2479
2589
  )
2480
- local target = ____exports.Unit:of(BlzGetEventDamageTarget())
2481
2590
  invoke(event, source, target, evData)
2482
2591
  if evData[0] ~= nil and target.health - evData.amount < 0.405 then
2483
2592
  local bonusHealth = math.ceil(evData.amount)
2484
- target[105] = (target[105] or 0) + bonusHealth
2593
+ target[106] = (target[106] or 0) + bonusHealth
2485
2594
  BlzSetUnitMaxHP(
2486
2595
  target.handle,
2487
2596
  BlzGetUnitMaxHP(target.handle) + bonusHealth
@@ -2495,7 +2604,7 @@ Unit.onDamage = __TS__New(
2495
2604
  evData[0],
2496
2605
  table.unpack(evData, 1 + 1, 1 + (evData[1] or 0))
2497
2606
  )
2498
- target[105] = (target[105] or 0) - bonusHealth
2607
+ target[106] = (target[106] or 0) - bonusHealth
2499
2608
  SetWidgetLife(
2500
2609
  target.handle,
2501
2610
  GetWidgetLife(target.handle) - bonusHealth
@@ -2531,10 +2640,14 @@ Unit.itemPickedUpEvent = __TS__New(
2531
2640
  ____exports.UnitTriggerEvent,
2532
2641
  EVENT_PLAYER_UNIT_PICKUP_ITEM,
2533
2642
  function()
2534
- local unit = getTriggerUnit()
2535
- local item = getManipulatedItem()
2536
- if getUnitTypeId(unit) ~= dummyUnitId and not (ignoreEventsItems[item] ~= nil) then
2537
- 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
2538
2651
  end
2539
2652
  return IgnoreEvent
2540
2653
  end
@@ -2554,7 +2667,22 @@ Unit.itemUsedEvent = __TS__New(
2554
2667
  Unit.itemStackedEvent = __TS__New(
2555
2668
  ____exports.UnitTriggerEvent,
2556
2669
  EVENT_PLAYER_UNIT_STACK_ITEM,
2557
- 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}
2558
2686
  )
2559
2687
  __TS__ObjectDefineProperty(
2560
2688
  Unit,
@@ -2626,6 +2754,10 @@ __TS__ObjectDefineProperty(
2626
2754
  rawset(self, "destroyEvent", destroyEvent)
2627
2755
  return destroyEvent
2628
2756
  end}
2757
+ )
2758
+ Unit.synchronize = synchronizer(
2759
+ function(unit) return unit.syncId end,
2760
+ function(syncId) return unitBySyncId[syncId] end
2629
2761
  );
2630
2762
  (function(self)
2631
2763
  local leaveAbilityIds = postcompile(function()
@@ -2655,7 +2787,8 @@ __TS__ObjectDefineProperty(
2655
2787
  return
2656
2788
  end
2657
2789
  end
2658
- unit:destroy()
2790
+ unit:saveData()
2791
+ Timer:run(unit, "destroy")
2659
2792
  end)
2660
2793
  end
2661
2794
  end)(Unit)