warscript 0.0.1-dev.ed60fea → 0.0.1-dev.edf7fad

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 (233) 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/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 +100 -25
  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 +12 -3
  28. package/engine/behaviour/ability/damage.lua +33 -39
  29. package/engine/behaviour/ability/emulate-impact.d.ts +1 -1
  30. package/engine/behaviour/ability/emulate-impact.lua +18 -3
  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 +15 -5
  36. package/engine/behaviour/ability.lua +72 -24
  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 +113 -53
  42. package/engine/buff.lua +544 -288
  43. package/engine/internal/ability.d.ts +7 -1
  44. package/engine/internal/ability.lua +49 -11
  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.lua +5 -0
  52. package/engine/internal/misc/frame-coordinates.d.ts +2 -0
  53. package/engine/internal/misc/frame-coordinates.lua +21 -0
  54. package/engine/internal/misc/get-terrain-z.d.ts +2 -0
  55. package/engine/internal/misc/get-terrain-z.lua +11 -0
  56. package/engine/internal/misc/player-local-handle.d.ts +2 -0
  57. package/engine/internal/misc/player-local-handle.lua +5 -0
  58. package/engine/internal/object-data/armor-bonus.d.ts +2 -0
  59. package/engine/internal/object-data/attribute-bonus.lua +2 -2
  60. package/engine/internal/object-data/auto-attack-speed-increase.d.ts +1 -1
  61. package/engine/internal/object-data/auto-attack-speed-increase.lua +2 -0
  62. package/engine/internal/object-data/evasion-probability.d.ts +2 -0
  63. package/engine/internal/object-data/evasion-probability.lua +16 -0
  64. package/engine/internal/object-data/health-bonus.d.ts +2 -0
  65. package/engine/internal/object-data/health-bonus.lua +16 -0
  66. package/engine/internal/object-data/mana-bonus.d.ts +2 -0
  67. package/engine/internal/object-data/mana-bonus.lua +16 -0
  68. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.d.ts +2 -0
  69. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.lua +16 -0
  70. package/engine/internal/unit/ability.d.ts +35 -0
  71. package/engine/internal/unit/ability.lua +98 -9
  72. package/engine/internal/unit/add-item-to-slot-init.d.ts +2 -0
  73. package/engine/internal/unit/add-item-to-slot-init.lua +23 -0
  74. package/engine/internal/unit/add-item-to-slot.d.ts +2 -0
  75. package/engine/internal/unit/add-item-to-slot.lua +52 -0
  76. package/engine/internal/unit/allowed-targets.d.ts +1 -1
  77. package/engine/internal/unit/allowed-targets.lua +9 -1
  78. package/engine/internal/unit/attributes.d.ts +17 -0
  79. package/engine/internal/unit/attributes.lua +46 -0
  80. package/engine/internal/unit/bonus.d.ts +8 -0
  81. package/engine/internal/unit/bonus.lua +50 -3
  82. package/engine/internal/unit/fly-height.d.ts +7 -0
  83. package/engine/internal/unit/fly-height.lua +20 -0
  84. package/engine/internal/unit/ignore-events-items.d.ts +2 -0
  85. package/engine/internal/unit/ignore-events-items.lua +5 -0
  86. package/engine/internal/unit/interrupts.d.ts +12 -0
  87. package/engine/internal/unit/interrupts.lua +28 -0
  88. package/engine/internal/unit/item.lua +3 -4
  89. package/engine/internal/unit/main-selected.lua +12 -27
  90. package/engine/internal/unit/order.d.ts +20 -0
  91. package/engine/internal/unit/order.lua +136 -0
  92. package/engine/internal/unit/range-event.d.ts +12 -0
  93. package/engine/internal/unit/range-event.lua +90 -0
  94. package/engine/internal/unit/scale.d.ts +7 -0
  95. package/engine/internal/unit/scale.lua +20 -0
  96. package/engine/internal/unit+ability.lua +10 -1
  97. package/engine/internal/unit+bonus.lua +3 -3
  98. package/engine/internal/unit+damage.d.ts +2 -11
  99. package/engine/internal/unit+damage.lua +10 -14
  100. package/engine/internal/unit+spellSteal.lua +1 -2
  101. package/engine/internal/unit-missile-launch.lua +52 -14
  102. package/engine/internal/unit.d.ts +44 -25
  103. package/engine/internal/unit.lua +401 -263
  104. package/engine/lightning.d.ts +12 -5
  105. package/engine/lightning.lua +48 -14
  106. package/engine/local-client.d.ts +7 -0
  107. package/engine/local-client.lua +79 -1
  108. package/engine/object-data/auxiliary/animation-name.d.ts +1 -0
  109. package/engine/object-data/auxiliary/animation-name.lua +16 -0
  110. package/engine/object-data/auxiliary/armor-type.d.ts +11 -0
  111. package/engine/object-data/auxiliary/armor-type.lua +46 -0
  112. package/engine/object-data/auxiliary/attachment-preset.d.ts +7 -2
  113. package/engine/object-data/auxiliary/attachment-preset.lua +4 -3
  114. package/engine/object-data/auxiliary/attack-type.d.ts +7 -8
  115. package/engine/object-data/auxiliary/attack-type.lua +42 -0
  116. package/engine/object-data/auxiliary/health-regeneration-type.d.ts +8 -0
  117. package/engine/object-data/auxiliary/health-regeneration-type.lua +2 -0
  118. package/engine/object-data/auxiliary/movement-type.d.ts +7 -7
  119. package/engine/object-data/auxiliary/movement-type.lua +22 -0
  120. package/engine/object-data/auxiliary/sound-eax.d.ts +10 -0
  121. package/engine/object-data/auxiliary/sound-eax.lua +2 -0
  122. package/engine/object-data/auxiliary/tech-tree-dependency.d.ts +1 -1
  123. package/engine/object-data/auxiliary/unit-attribute.d.ts +6 -0
  124. package/engine/object-data/auxiliary/unit-attribute.lua +9 -0
  125. package/engine/object-data/entry/ability-type/{armor-increase.d.ts → armor-bonus.d.ts} +3 -3
  126. package/engine/object-data/entry/ability-type/{armor-increase.lua → armor-bonus.lua} +9 -9
  127. package/engine/object-data/entry/ability-type/berserk.d.ts +2 -0
  128. package/engine/object-data/entry/ability-type/berserk.lua +13 -0
  129. package/engine/object-data/entry/ability-type/blank-configurable.lua +12 -1
  130. package/engine/object-data/entry/ability-type/carrion-swarm.d.ts +14 -0
  131. package/engine/object-data/entry/ability-type/carrion-swarm.lua +65 -0
  132. package/engine/object-data/entry/ability-type/disease-cloud.lua +2 -2
  133. package/engine/object-data/entry/ability-type/engineering-upgrade.lua +2 -2
  134. package/engine/object-data/entry/ability-type/ensnare.d.ts +12 -0
  135. package/engine/object-data/entry/ability-type/ensnare.lua +52 -0
  136. package/engine/object-data/entry/ability-type/feral-spirit.lua +2 -2
  137. package/engine/object-data/entry/ability-type/health-bonus.d.ts +8 -0
  138. package/engine/object-data/entry/ability-type/health-bonus.lua +26 -0
  139. package/engine/object-data/entry/ability-type/mana-bonus.d.ts +8 -0
  140. package/engine/object-data/entry/ability-type/mana-bonus.lua +26 -0
  141. package/engine/object-data/entry/ability-type/mana-regeneration.d.ts +8 -0
  142. package/engine/object-data/entry/ability-type/mana-regeneration.lua +26 -0
  143. package/engine/object-data/entry/ability-type/permanent-invisibility.d.ts +8 -0
  144. package/engine/object-data/entry/ability-type/permanent-invisibility.lua +26 -0
  145. package/engine/object-data/entry/ability-type/phase-shift.d.ts +10 -0
  146. package/engine/object-data/entry/ability-type/phase-shift.lua +39 -0
  147. package/engine/object-data/entry/ability-type/phoenix-morph.lua +4 -4
  148. package/engine/object-data/entry/ability-type/raise-dead.d.ts +17 -0
  149. package/engine/object-data/entry/ability-type/raise-dead.lua +78 -0
  150. package/engine/object-data/entry/ability-type/reincarnation.d.ts +8 -0
  151. package/engine/object-data/entry/ability-type/reincarnation.lua +26 -0
  152. package/engine/object-data/entry/ability-type/shock-wave.d.ts +4 -0
  153. package/engine/object-data/entry/ability-type/shock-wave.lua +26 -0
  154. package/engine/object-data/entry/ability-type/slow-poison.d.ts +10 -0
  155. package/engine/object-data/entry/ability-type/slow-poison.lua +58 -0
  156. package/engine/object-data/entry/ability-type/summon-quilbeast.lua +2 -2
  157. package/engine/object-data/entry/ability-type/summon-water-elemental.lua +2 -2
  158. package/engine/object-data/entry/ability-type/web.d.ts +12 -0
  159. package/engine/object-data/entry/ability-type/web.lua +52 -0
  160. package/engine/object-data/entry/ability-type.d.ts +21 -17
  161. package/engine/object-data/entry/ability-type.lua +169 -28
  162. package/engine/object-data/entry/buff-type/applicable.lua +122 -137
  163. package/engine/object-data/entry/buff-type.d.ts +6 -12
  164. package/engine/object-data/entry/buff-type.lua +13 -29
  165. package/engine/object-data/entry/destructible-type.d.ts +28 -2
  166. package/engine/object-data/entry/destructible-type.lua +155 -0
  167. package/engine/object-data/entry/item-type.d.ts +1 -1
  168. package/engine/object-data/entry/item-type.lua +4 -4
  169. package/engine/object-data/entry/lightning-type.d.ts +1 -1
  170. package/engine/object-data/entry/sound-preset.d.ts +33 -0
  171. package/engine/object-data/entry/sound-preset.lua +140 -0
  172. package/engine/object-data/entry/unit-type.d.ts +25 -5
  173. package/engine/object-data/entry/unit-type.lua +258 -93
  174. package/engine/object-data/entry/upgrade.d.ts +1 -1
  175. package/engine/object-data/entry/upgrade.lua +4 -4
  176. package/engine/object-data/entry.d.ts +16 -14
  177. package/engine/object-data/entry.lua +60 -32
  178. package/engine/object-field/ability.d.ts +4 -4
  179. package/engine/object-field/ability.lua +9 -8
  180. package/engine/object-field/unit.d.ts +72 -3
  181. package/engine/object-field/unit.lua +268 -7
  182. package/engine/object-field.d.ts +26 -7
  183. package/engine/object-field.lua +360 -119
  184. package/engine/random.d.ts +10 -0
  185. package/engine/random.lua +21 -0
  186. package/engine/standard/entries/buff-type.d.ts +3 -0
  187. package/engine/standard/entries/buff-type.lua +3 -0
  188. package/engine/standard/entries/sound-preset.d.ts +10 -0
  189. package/engine/standard/entries/sound-preset.lua +10 -0
  190. package/engine/standard/fields/ability.d.ts +2 -2
  191. package/engine/standard/fields/ability.lua +2 -2
  192. package/engine/standard/fields/unit.d.ts +12 -0
  193. package/engine/standard/fields/unit.lua +20 -0
  194. package/engine/synchronization.d.ts +11 -0
  195. package/engine/synchronization.lua +77 -0
  196. package/engine/text-tag.d.ts +36 -2
  197. package/engine/text-tag.lua +250 -10
  198. package/engine/unit.d.ts +7 -0
  199. package/engine/unit.lua +7 -0
  200. package/lualib_bundle.lua +1 -1
  201. package/math.d.ts +2 -0
  202. package/math.lua +14 -0
  203. package/net/socket.lua +1 -1
  204. package/objutil/buff.lua +11 -10
  205. package/objutil/object.lua +1 -1
  206. package/objutil/unit.lua +8 -0
  207. package/operation.lua +1 -4
  208. package/package.json +5 -5
  209. package/patch-lua.lua +15 -0
  210. package/patch-lualib.lua +1 -1
  211. package/utility/arrays.d.ts +2 -0
  212. package/utility/arrays.lua +11 -0
  213. package/utility/callback-array.d.ts +17 -0
  214. package/utility/callback-array.lua +61 -0
  215. package/utility/functions.d.ts +8 -0
  216. package/utility/functions.lua +13 -0
  217. package/utility/linked-map.d.ts +34 -0
  218. package/utility/linked-map.lua +101 -0
  219. package/utility/linked-set.d.ts +4 -1
  220. package/utility/linked-set.lua +43 -1
  221. package/utility/lua-maps.d.ts +15 -2
  222. package/utility/lua-maps.lua +53 -2
  223. package/utility/lua-sets.d.ts +2 -0
  224. package/utility/lua-sets.lua +7 -0
  225. package/utility/records.lua +20 -1
  226. package/utility/reflection.lua +11 -7
  227. package/utility/types.d.ts +3 -0
  228. package/core/types/order.d.ts +0 -25
  229. package/core/types/order.lua +0 -55
  230. /package/engine/internal/{object-data/armor-increase.d.ts → misc/damage-metadata-by-target.d.ts} +0 -0
  231. /package/engine/internal/object-data/{armor-increase.lua → armor-bonus.lua} +0 -0
  232. /package/engine/object-data/entry/ability-type/{attribute-increase.d.ts → attribute-bonus.d.ts} +0 -0
  233. /package/engine/object-data/entry/ability-type/{attribute-increase.lua → attribute-bonus.lua} +0 -0
@@ -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,50 +689,78 @@ 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
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))
677
760
  end
678
761
  function Unit.prototype.onDestroy(self)
679
762
  local handle = self.handle
680
- if not self._owner then
681
- self._owner = Player:of(getOwningPlayer(handle))
682
- end
763
+ self:saveData()
683
764
  local abilities = self.abilities
684
765
  for ____, ability in ipairs(abilities) do
685
766
  ability:destroy()
@@ -715,7 +796,11 @@ function Unit.prototype.addAttackHandler(self, condition, action)
715
796
  self._attackHandlers = handlers
716
797
  if #handlers == 1 then
717
798
  local handle = self.handle
718
- 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
+ )
719
804
  end
720
805
  return handler
721
806
  end
@@ -744,17 +829,17 @@ function Unit.prototype.addModifier(self, property, modifier)
744
829
  end}
745
830
  end
746
831
  function Unit.prototype.hasCombatClassification(self, combatClassification)
747
- local ____combatClassification_1 = combatClassification
748
- 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
749
834
  end
750
835
  function Unit.prototype.addClassification(self, classification)
751
- return unitAddType(self.handle, classification)
836
+ return UnitAddType(self.handle, classification)
752
837
  end
753
838
  function Unit.prototype.removeClassification(self, classification)
754
- return unitRemoveType(self.handle, classification)
839
+ return UnitRemoveType(self.handle, classification)
755
840
  end
756
841
  function Unit.prototype.hasClassification(self, classification)
757
- return isUnitType(self.handle, classification)
842
+ return IsUnitType(self.handle, classification)
758
843
  end
759
844
  function Unit.prototype.isVisibleTo(self, player)
760
845
  return isUnitVisible(self.handle, player.handle)
@@ -763,13 +848,13 @@ function Unit.prototype.isInvisibleTo(self, player)
763
848
  return isUnitInvisible(self.handle, player.handle)
764
849
  end
765
850
  function Unit.prototype.isInRangeOf(self, x, y, range)
766
- local ____temp_2
851
+ local ____temp_3
767
852
  if type(x) == "number" then
768
- ____temp_2 = isUnitInRangeXY(self.handle, x, y, range)
853
+ ____temp_3 = isUnitInRangeXY(self.handle, x, y, range)
769
854
  else
770
- ____temp_2 = isUnitInRange(self.handle, x.handle, y)
855
+ ____temp_3 = isUnitInRange(self.handle, x.handle, y)
771
856
  end
772
- return ____temp_2
857
+ return ____temp_3
773
858
  end
774
859
  function Unit.prototype.isAllyOf(self, unit)
775
860
  return isUnitAlly(
@@ -787,16 +872,30 @@ function Unit.prototype.playAnimation(self, animation, rarity)
787
872
  if type(animation) == "number" then
788
873
  setUnitAnimationByIndex(self.handle, animation)
789
874
  elseif rarity then
790
- setUnitAnimationWithRarity(self.handle, animation, rarity)
875
+ SetUnitAnimationWithRarity(self.handle, animation, rarity)
791
876
  else
792
877
  setUnitAnimation(self.handle, animation)
793
878
  end
794
879
  end
880
+ function Unit.prototype.resetAnimation(self)
881
+ ResetUnitAnimation(self.handle)
882
+ end
795
883
  function Unit.prototype.queueAnimation(self, animation)
796
- 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
797
896
  end
798
897
  function Unit.prototype.delayHealthChecks(self)
799
- self[103] = (self[103] or 0) + 1
898
+ self[104] = (self[104] or 0) + 1
800
899
  Timer:run(delayHealthChecksCallback, self)
801
900
  end
802
901
  function Unit.prototype.setPosition(self, x, y)
@@ -806,21 +905,21 @@ function Unit.prototype.isSelected(self, player)
806
905
  return IsUnitSelected(self.handle, player.handle)
807
906
  end
808
907
  function Unit.prototype.explode(self)
809
- setUnitExploded(self.handle, true)
908
+ SetUnitExploded(self.handle, true)
810
909
  killUnit(self.handle)
811
910
  end
812
911
  function Unit.prototype.kill(self)
813
912
  killUnit(self.handle)
814
913
  end
815
914
  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
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
821
920
  end
822
- __TS__SparseArrayPush(____array_4, ____doEffect_3)
823
- ____ReviveHero_5(__TS__SparseArraySpread(____array_4))
921
+ __TS__SparseArrayPush(____array_5, ____doEffect_4)
922
+ ____ReviveHero_6(__TS__SparseArraySpread(____array_5))
824
923
  end
825
924
  function Unit.prototype.healTarget(self, target, amount)
826
925
  if __TS__InstanceOf(target, ____exports.Unit) and target:hasAbility(fourCC("BIhm")) then
@@ -863,17 +962,16 @@ function Unit.prototype.itemInSlot(self, slot)
863
962
  return Item:of(unitItemInSlot(self.handle, slot))
864
963
  end
865
964
  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
- )
965
+ local ability = UnitAbility:of(
966
+ doUnitAbilityAction(self.handle, abilityId, addAbility, abilityId),
967
+ abilityId,
968
+ self
969
+ )
970
+ if ability ~= nil then
872
971
  local abilities = self.abilities
873
972
  abilities[#abilities + 1] = ability
874
- return ability
875
973
  end
876
- return nil
974
+ return ability
877
975
  end
878
976
  function Unit.prototype.makeAbilityPermanent(self, abilityId, permanent)
879
977
  return UnitMakeAbilityPermanent(self.handle, permanent, abilityId)
@@ -887,31 +985,21 @@ end
887
985
  function Unit.prototype.hasAbility(self, abilityId)
888
986
  return getUnitAbilityLevel(self.handle, abilityId) > 0
889
987
  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
- )
988
+ function Unit.prototype.getAbility(self, abilityId)
989
+ local ability = doUnitAbilityAction(self.handle, abilityId, getUnitAbility, abilityId)
990
+ return UnitAbility:of(ability, abilityId, self)
901
991
  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
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
911
1000
  end
912
- return true
913
1001
  end
914
- return false
1002
+ return doUnitAbilityAction(self.handle, abilityTypeId, unitRemoveAbility, abilityTypeId)
915
1003
  end
916
1004
  function Unit.prototype.hideAbility(self, abilityId, flag)
917
1005
  BlzUnitHideAbility(self.handle, abilityId, flag)
@@ -925,9 +1013,6 @@ end
925
1013
  function Unit.prototype.endAbilityCooldown(self, abilityId)
926
1014
  BlzEndUnitAbilityCooldown(self.handle, abilityId)
927
1015
  end
928
- function Unit.prototype.interruptAttack(self)
929
- unitInterruptAttack(self.handle)
930
- end
931
1016
  function Unit.prototype.interruptCast(self, abilityId)
932
1017
  local handle = self.handle
933
1018
  unitDisableAbility(handle, abilityId, true, false)
@@ -998,18 +1083,44 @@ function Unit.prototype.unpauseEx(self)
998
1083
  end
999
1084
  function Unit.prototype.incrementStunCounter(self)
1000
1085
  local stunCounter = self[102] or 0
1001
- if not self[101] or stunCounter >= 0 then
1086
+ if not self[101] and (self[103] or 0) <= 0 or stunCounter >= 0 then
1002
1087
  BlzPauseUnitEx(self.handle, true)
1003
1088
  end
1004
1089
  self[102] = stunCounter + 1
1005
1090
  end
1006
1091
  function Unit.prototype.decrementStunCounter(self)
1007
1092
  local stunCounter = self[102] or 0
1008
- if not self[101] or stunCounter >= 1 then
1093
+ if not self[101] and (self[103] or 0) <= 0 or stunCounter >= 1 then
1009
1094
  BlzPauseUnitEx(self.handle, false)
1010
1095
  end
1011
1096
  self[102] = stunCounter - 1
1012
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
1013
1124
  function Unit.create(self, owner, id, x, y, facing, skinId)
1014
1125
  local handle = skinId and BlzCreateUnitWithSkin(
1015
1126
  owner.handle,
@@ -1198,7 +1309,15 @@ __TS__SetDescriptor(
1198
1309
  Unit.prototype,
1199
1310
  "isIllusion",
1200
1311
  {get = function(self)
1201
- 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")
1202
1321
  end},
1203
1322
  true
1204
1323
  )
@@ -1277,13 +1396,13 @@ __TS__SetDescriptor(
1277
1396
  )
1278
1397
  __TS__SetDescriptor(
1279
1398
  Unit.prototype,
1280
- "strengthBase",
1399
+ "primaryAttribute",
1281
1400
  {
1282
1401
  get = function(self)
1283
- return getHeroStr(self.handle, false)
1402
+ return getUnitIntegerField(self.handle, UNIT_IF_PRIMARY_ATTRIBUTE)
1284
1403
  end,
1285
- set = function(self, strengthBase)
1286
- setHeroStr(self.handle, strengthBase, true)
1404
+ set = function(self, primaryAttribute)
1405
+ setUnitIntegerField(self.handle, UNIT_IF_PRIMARY_ATTRIBUTE, primaryAttribute)
1287
1406
  end
1288
1407
  },
1289
1408
  true
@@ -1305,19 +1424,6 @@ __TS__SetDescriptor(
1305
1424
  end},
1306
1425
  true
1307
1426
  )
1308
- __TS__SetDescriptor(
1309
- Unit.prototype,
1310
- "agilityBase",
1311
- {
1312
- get = function(self)
1313
- return getHeroAgi(self.handle, false)
1314
- end,
1315
- set = function(self, agilityBase)
1316
- setHeroAgi(self.handle, agilityBase, true)
1317
- end
1318
- },
1319
- true
1320
- )
1321
1427
  __TS__SetDescriptor(
1322
1428
  Unit.prototype,
1323
1429
  "agilityBonus",
@@ -1335,19 +1441,6 @@ __TS__SetDescriptor(
1335
1441
  end},
1336
1442
  true
1337
1443
  )
1338
- __TS__SetDescriptor(
1339
- Unit.prototype,
1340
- "intelligenceBase",
1341
- {
1342
- get = function(self)
1343
- return getHeroInt(self.handle, false)
1344
- end,
1345
- set = function(self, intelligenceBase)
1346
- setHeroInt(self.handle, intelligenceBase, true)
1347
- end
1348
- },
1349
- true
1350
- )
1351
1444
  __TS__SetDescriptor(
1352
1445
  Unit.prototype,
1353
1446
  "intelligenceBonus",
@@ -1396,17 +1489,17 @@ __TS__SetDescriptor(
1396
1489
  "isTeamGlowVisible",
1397
1490
  {
1398
1491
  get = function(self)
1399
- return not self[106]
1492
+ return not self[107]
1400
1493
  end,
1401
1494
  set = function(self, isTeamGlowVisible)
1402
- showUnitTeamGlow(self.handle, isTeamGlowVisible)
1403
- local ____temp_6
1495
+ BlzShowUnitTeamGlow(self.handle, isTeamGlowVisible)
1496
+ local ____temp_7
1404
1497
  if not isTeamGlowVisible then
1405
- ____temp_6 = true
1498
+ ____temp_7 = true
1406
1499
  else
1407
- ____temp_6 = nil
1500
+ ____temp_7 = nil
1408
1501
  end
1409
- self[106] = ____temp_6
1502
+ self[107] = ____temp_7
1410
1503
  end
1411
1504
  },
1412
1505
  true
@@ -1415,9 +1508,9 @@ __TS__SetDescriptor(
1415
1508
  Unit.prototype,
1416
1509
  "color",
1417
1510
  {set = function(self, color)
1418
- setUnitColor(self.handle, color.handle)
1419
- if self[106] then
1420
- showUnitTeamGlow(self.handle, false)
1511
+ SetUnitColor(self.handle, color.handle)
1512
+ if self[107] then
1513
+ BlzShowUnitTeamGlow(self.handle, false)
1421
1514
  end
1422
1515
  end},
1423
1516
  true
@@ -1440,14 +1533,14 @@ __TS__SetDescriptor(
1440
1533
  "maxHealth",
1441
1534
  {
1442
1535
  get = function(self)
1443
- 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)
1444
1537
  end,
1445
1538
  set = function(self, maxHealth)
1446
- if maxHealth < 1 and self[103] ~= nil then
1447
- 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)
1448
1541
  maxHealth = 1
1449
1542
  end
1450
- BlzSetUnitMaxHP(self.handle, maxHealth + (self[105] or 0))
1543
+ BlzSetUnitMaxHP(self.handle, maxHealth + (self[106] or 0))
1451
1544
  end
1452
1545
  },
1453
1546
  true
@@ -1489,10 +1582,10 @@ __TS__SetDescriptor(
1489
1582
  "health",
1490
1583
  {
1491
1584
  get = function(self)
1492
- return GetWidgetLife(self.handle) - (self[105] or 0)
1585
+ return GetWidgetLife(self.handle) - (self[106] or 0)
1493
1586
  end,
1494
1587
  set = function(self, health)
1495
- SetWidgetLife(self.handle, health + (self[105] or 0))
1588
+ SetWidgetLife(self.handle, health + (self[106] or 0))
1496
1589
  end
1497
1590
  },
1498
1591
  true
@@ -1568,25 +1661,12 @@ __TS__SetDescriptor(
1568
1661
  },
1569
1662
  true
1570
1663
  )
1571
- __TS__SetDescriptor(
1572
- Unit.prototype,
1573
- "flyHeight",
1574
- {
1575
- get = function(self)
1576
- return getUnitFlyHeight(self.handle)
1577
- end,
1578
- set = function(self, v)
1579
- SetUnitFlyHeight(self.handle, v, 100000)
1580
- end
1581
- },
1582
- true
1583
- )
1584
1664
  __TS__SetDescriptor(
1585
1665
  Unit.prototype,
1586
1666
  "x",
1587
1667
  {
1588
1668
  get = function(self)
1589
- return getUnitX(self.handle)
1669
+ return self[108] or getUnitX(self.handle)
1590
1670
  end,
1591
1671
  set = function(self, v)
1592
1672
  SetUnitX(self.handle, v)
@@ -1599,7 +1679,7 @@ __TS__SetDescriptor(
1599
1679
  "y",
1600
1680
  {
1601
1681
  get = function(self)
1602
- return getUnitY(self.handle)
1682
+ return self[109] or getUnitY(self.handle)
1603
1683
  end,
1604
1684
  set = function(self, v)
1605
1685
  SetUnitY(self.handle, v)
@@ -1685,10 +1765,10 @@ __TS__SetDescriptor(
1685
1765
  "gold",
1686
1766
  {
1687
1767
  get = function(self)
1688
- return getResourceAmount(self.handle)
1768
+ return GetResourceAmount(self.handle)
1689
1769
  end,
1690
1770
  set = function(self, gold)
1691
- setResourceAmount(self.handle, gold)
1771
+ SetResourceAmount(self.handle, gold)
1692
1772
  end
1693
1773
  },
1694
1774
  true
@@ -1704,14 +1784,18 @@ __TS__SetDescriptor(
1704
1784
  local handle = self.handle
1705
1785
  if isPaused and not IsUnitPaused(handle) then
1706
1786
  self[101] = true
1707
- for _ = self[102] or 0, -1 do
1708
- 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
1709
1791
  end
1710
1792
  PauseUnit(handle, true)
1711
1793
  elseif not isPaused and IsUnitPaused(handle) then
1712
1794
  PauseUnit(handle, false)
1713
- for _ = self[102] or 0, -1 do
1714
- 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
1715
1799
  end
1716
1800
  self[101] = nil
1717
1801
  end
@@ -1769,20 +1853,6 @@ __TS__SetDescriptor(
1769
1853
  },
1770
1854
  true
1771
1855
  )
1772
- __TS__SetDescriptor(
1773
- Unit.prototype,
1774
- "scale",
1775
- {
1776
- get = function(self)
1777
- return getUnitRealField(self.handle, UNIT_RF_SCALING_VALUE)
1778
- end,
1779
- set = function(self, v)
1780
- setUnitScale(self.handle, v, v, v)
1781
- setUnitRealField(self.handle, UNIT_RF_SCALING_VALUE, v)
1782
- end
1783
- },
1784
- true
1785
- )
1786
1856
  __TS__SetDescriptor(
1787
1857
  Unit.prototype,
1788
1858
  "timeScale",
@@ -1816,6 +1886,19 @@ __TS__SetDescriptor(
1816
1886
  end},
1817
1887
  true
1818
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
+ )
1819
1902
  __TS__SetDescriptor(
1820
1903
  Unit.prototype,
1821
1904
  "pathing",
@@ -1906,30 +1989,6 @@ __TS__SetDescriptor(
1906
1989
  end},
1907
1990
  true
1908
1991
  )
1909
- __TS__SetDescriptor(
1910
- Unit.prototype,
1911
- "onUnitInRange",
1912
- {get = function(self)
1913
- local handle = self.handle
1914
- local onUnitInRange = setmetatable(
1915
- {},
1916
- {__index = function(self, value)
1917
- local event = __TS__New(
1918
- TriggerEvent,
1919
- function(trigger)
1920
- TriggerRegisterUnitInRangeSimple(trigger, value, handle)
1921
- end,
1922
- function() return ____exports.Unit:of(handle) end
1923
- )
1924
- rawset(self, value, event)
1925
- return event
1926
- end}
1927
- )
1928
- rawset(self, "onUnitInRange", onUnitInRange)
1929
- return onUnitInRange
1930
- end},
1931
- true
1932
- )
1933
1992
  __TS__SetDescriptor(
1934
1993
  Unit.prototype,
1935
1994
  "onManaEqual",
@@ -1997,6 +2056,14 @@ __TS__SetDescriptor(
1997
2056
  end},
1998
2057
  true
1999
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
+ )
2000
2067
  __TS__SetDescriptor(
2001
2068
  Unit.prototype,
2002
2069
  "onSelect",
@@ -2057,6 +2124,11 @@ __TS__SetDescriptor(
2057
2124
  end},
2058
2125
  true
2059
2126
  )
2127
+ Unit.levelChangedEvent = __TS__New(
2128
+ ____exports.UnitTriggerEvent,
2129
+ EVENT_PLAYER_HERO_LEVEL,
2130
+ function() return ____exports.Unit:of(getTriggerUnit()) end
2131
+ )
2060
2132
  Unit.deathEvent = __TS__New(
2061
2133
  ____exports.UnitTriggerEvent,
2062
2134
  EVENT_PLAYER_UNIT_DEATH,
@@ -2132,25 +2204,25 @@ Unit.onTargetCast = dispatchId(__TS__New(
2132
2204
  InitializingEvent,
2133
2205
  function(event)
2134
2206
  local function listener(unit, id)
2135
- local ____GetSpellTargetUnit_result_9
2207
+ local ____GetSpellTargetUnit_result_10
2136
2208
  if GetSpellTargetUnit() then
2137
- ____GetSpellTargetUnit_result_9 = ____exports.Unit:of(GetSpellTargetUnit())
2209
+ ____GetSpellTargetUnit_result_10 = ____exports.Unit:of(GetSpellTargetUnit())
2138
2210
  else
2139
- local ____GetSpellTargetItem_result_8
2211
+ local ____GetSpellTargetItem_result_9
2140
2212
  if GetSpellTargetItem() then
2141
- ____GetSpellTargetItem_result_8 = Item:of(GetSpellTargetItem())
2213
+ ____GetSpellTargetItem_result_9 = Item:of(GetSpellTargetItem())
2142
2214
  else
2143
- local ____GetSpellTargetDestructable_result_7
2215
+ local ____GetSpellTargetDestructable_result_8
2144
2216
  if GetSpellTargetDestructable() then
2145
- ____GetSpellTargetDestructable_result_7 = Destructable:of(GetSpellTargetDestructable())
2217
+ ____GetSpellTargetDestructable_result_8 = Destructable:of(GetSpellTargetDestructable())
2146
2218
  else
2147
- ____GetSpellTargetDestructable_result_7 = nil
2219
+ ____GetSpellTargetDestructable_result_8 = nil
2148
2220
  end
2149
- ____GetSpellTargetItem_result_8 = ____GetSpellTargetDestructable_result_7
2221
+ ____GetSpellTargetItem_result_9 = ____GetSpellTargetDestructable_result_8
2150
2222
  end
2151
- ____GetSpellTargetUnit_result_9 = ____GetSpellTargetItem_result_8
2223
+ ____GetSpellTargetUnit_result_10 = ____GetSpellTargetItem_result_9
2152
2224
  end
2153
- local target = ____GetSpellTargetUnit_result_9
2225
+ local target = ____GetSpellTargetUnit_result_10
2154
2226
  if target then
2155
2227
  invoke(event, unit, id, target)
2156
2228
  end
@@ -2358,38 +2430,57 @@ Unit.onDamaging = (function()
2358
2430
  if source and source.typeId == dummyUnitId then
2359
2431
  source = nil
2360
2432
  end
2361
- local target = BlzGetEventDamageTarget()
2433
+ local target = ____exports.Unit:of(BlzGetEventDamageTarget())
2434
+ local metadata = damageMetadataByTarget[target]
2435
+ damageMetadataByTarget[target] = nil
2362
2436
  local data = {
2363
2437
  amount = GetEventDamage(),
2364
- attackType = BlzGetEventAttackType(),
2438
+ attackType = nativeToAttackType(BlzGetEventAttackType()),
2365
2439
  damageType = BlzGetEventDamageType(),
2366
2440
  weaponType = BlzGetEventWeaponType(),
2367
- isAttack = BlzGetEventIsAttack()
2441
+ metadata = metadata,
2442
+ isAttack = BlzGetEventIsAttack(),
2443
+ originalAmount = GetEventDamage(),
2444
+ originalMetadata = metadata,
2445
+ preventRetaliation = damagingEventPreventRetaliation
2368
2446
  }
2369
2447
  if data.isAttack and source then
2370
- 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
2371
- if weapon == -1 then
2372
- local targetsAllowed = BlzGetUnitWeaponIntegerField(source.handle, UNIT_WEAPON_IF_ATTACK_TARGETS_ALLOWED, 0)
2373
- weapon = 0
2374
- end
2375
- data.weapon = assert(source.weapons[weapon + 1])
2448
+ data.weapon = source:chooseWeapon(target)
2376
2449
  end
2377
2450
  if not data.isAttack or not source or not source._attackHandlers then
2378
2451
  invoke(
2379
2452
  event,
2380
2453
  source,
2381
- ____exports.Unit:of(target),
2454
+ target,
2382
2455
  setmetatable(
2383
2456
  {},
2384
2457
  {
2385
2458
  __index = data,
2386
2459
  __newindex = function(self, key, value)
2387
- damageSetters[key](value)
2460
+ local damageSetter = damageSetters[key]
2461
+ if damageSetter ~= nil then
2462
+ damageSetter(value)
2463
+ end
2388
2464
  data[key] = value
2389
2465
  end
2390
2466
  }
2391
2467
  )
2392
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
2393
2484
  return
2394
2485
  end
2395
2486
  BlzSetEventDamage(0)
@@ -2397,7 +2488,7 @@ Unit.onDamaging = (function()
2397
2488
  BlzSetEventDamageType(DAMAGE_TYPE_UNKNOWN)
2398
2489
  BlzSetEventWeaponType(WEAPON_TYPE_WHOKNOWS)
2399
2490
  local sourceOwner = source.owner.handle
2400
- local targetOwner = GetOwningPlayer(target)
2491
+ local targetOwner = target.owner.handle
2401
2492
  if not GetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE) then
2402
2493
  SetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE, true)
2403
2494
  Timer:run(function()
@@ -2413,23 +2504,19 @@ Unit.onDamaging = (function()
2413
2504
  for ____, ____value in ipairs(source._attackHandlers) do
2414
2505
  local condition = ____value[1]
2415
2506
  local action = ____value[2]
2416
- if condition(
2417
- source,
2418
- ____exports.Unit:of(target),
2419
- data
2420
- ) then
2507
+ if condition(source, target, data) then
2421
2508
  action(
2422
2509
  source,
2423
- ____exports.Unit:of(target),
2510
+ target,
2424
2511
  setmetatable(
2425
2512
  {fire = function()
2426
2513
  UnitDamageTarget(
2427
2514
  source.handle,
2428
- target,
2515
+ target.handle,
2429
2516
  data.amount,
2430
2517
  true,
2431
2518
  true,
2432
- data.attackType,
2519
+ attackTypeToNative(data.attackType),
2433
2520
  data.damageType,
2434
2521
  data.weaponType
2435
2522
  )
@@ -2456,30 +2543,54 @@ Unit.onDamage = __TS__New(
2456
2543
  if source and source.typeId == dummyUnitId then
2457
2544
  source = nil
2458
2545
  end
2546
+ local target = ____exports.Unit:of(BlzGetEventDamageTarget())
2547
+ local damagingEvent = damagingEventByTarget[target]
2548
+ damagingEventByTarget[target] = nil
2459
2549
  local data = {
2460
2550
  amount = GetEventDamage(),
2461
- attackType = BlzGetEventAttackType(),
2551
+ attackType = nativeToAttackType(BlzGetEventAttackType()),
2462
2552
  damageType = BlzGetEventDamageType(),
2463
2553
  weaponType = BlzGetEventWeaponType(),
2554
+ metadata = damagingEvent and damagingEvent.metadata,
2464
2555
  isAttack = BlzGetEventIsAttack(),
2465
- originalAmount = GetEventDamage(),
2556
+ originalAmount = damagingEvent and damagingEvent.originalAmount or GetEventDamage(),
2557
+ originalMetadata = damagingEvent and damagingEvent.originalMetadata,
2466
2558
  preventDeath = damageEventPreventDeath
2467
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
2468
2577
  local evData = setmetatable(
2469
2578
  {},
2470
2579
  {
2471
2580
  __index = data,
2472
2581
  __newindex = function(self, key, value)
2473
- damageSetters[key](value)
2582
+ local damageSetter = damageSetters[key]
2583
+ if damageSetter ~= nil then
2584
+ damageSetter(value)
2585
+ end
2474
2586
  data[key] = value
2475
2587
  end
2476
2588
  }
2477
2589
  )
2478
- local target = ____exports.Unit:of(BlzGetEventDamageTarget())
2479
2590
  invoke(event, source, target, evData)
2480
2591
  if evData[0] ~= nil and target.health - evData.amount < 0.405 then
2481
2592
  local bonusHealth = math.ceil(evData.amount)
2482
- target[105] = (target[105] or 0) + bonusHealth
2593
+ target[106] = (target[106] or 0) + bonusHealth
2483
2594
  BlzSetUnitMaxHP(
2484
2595
  target.handle,
2485
2596
  BlzGetUnitMaxHP(target.handle) + bonusHealth
@@ -2493,7 +2604,7 @@ Unit.onDamage = __TS__New(
2493
2604
  evData[0],
2494
2605
  table.unpack(evData, 1 + 1, 1 + (evData[1] or 0))
2495
2606
  )
2496
- target[105] = (target[105] or 0) - bonusHealth
2607
+ target[106] = (target[106] or 0) - bonusHealth
2497
2608
  SetWidgetLife(
2498
2609
  target.handle,
2499
2610
  GetWidgetLife(target.handle) - bonusHealth
@@ -2518,8 +2629,9 @@ Unit.itemDroppedEvent = __TS__New(
2518
2629
  EVENT_PLAYER_UNIT_DROP_ITEM,
2519
2630
  function()
2520
2631
  local unit = getTriggerUnit()
2521
- if getUnitTypeId(unit) ~= dummyUnitId then
2522
- return ____exports.Unit:of(unit), Item:of(getManipulatedItem())
2632
+ local item = getManipulatedItem()
2633
+ if getUnitTypeId(unit) ~= dummyUnitId and not (ignoreEventsItems[item] ~= nil) then
2634
+ return ____exports.Unit:of(unit), Item:of(item)
2523
2635
  end
2524
2636
  return IgnoreEvent
2525
2637
  end
@@ -2528,9 +2640,14 @@ Unit.itemPickedUpEvent = __TS__New(
2528
2640
  ____exports.UnitTriggerEvent,
2529
2641
  EVENT_PLAYER_UNIT_PICKUP_ITEM,
2530
2642
  function()
2531
- local unit = getTriggerUnit()
2532
- if getUnitTypeId(unit) ~= dummyUnitId then
2533
- return ____exports.Unit:of(unit), Item:of(getManipulatedItem())
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
2534
2651
  end
2535
2652
  return IgnoreEvent
2536
2653
  end
@@ -2540,8 +2657,9 @@ Unit.itemUsedEvent = __TS__New(
2540
2657
  EVENT_PLAYER_UNIT_USE_ITEM,
2541
2658
  function()
2542
2659
  local unit = getTriggerUnit()
2543
- if getUnitTypeId(unit) ~= dummyUnitId then
2544
- return ____exports.Unit:of(unit), Item:of(getManipulatedItem())
2660
+ local item = getManipulatedItem()
2661
+ if getUnitTypeId(unit) ~= dummyUnitId and not (ignoreEventsItems[item] ~= nil) then
2662
+ return ____exports.Unit:of(unit), Item:of(item)
2545
2663
  end
2546
2664
  return IgnoreEvent
2547
2665
  end
@@ -2549,7 +2667,22 @@ Unit.itemUsedEvent = __TS__New(
2549
2667
  Unit.itemStackedEvent = __TS__New(
2550
2668
  ____exports.UnitTriggerEvent,
2551
2669
  EVENT_PLAYER_UNIT_STACK_ITEM,
2552
- 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}
2553
2686
  )
2554
2687
  __TS__ObjectDefineProperty(
2555
2688
  Unit,
@@ -2621,6 +2754,10 @@ __TS__ObjectDefineProperty(
2621
2754
  rawset(self, "destroyEvent", destroyEvent)
2622
2755
  return destroyEvent
2623
2756
  end}
2757
+ )
2758
+ Unit.synchronize = synchronizer(
2759
+ function(unit) return unit.syncId end,
2760
+ function(syncId) return unitBySyncId[syncId] end
2624
2761
  );
2625
2762
  (function(self)
2626
2763
  local leaveAbilityIds = postcompile(function()
@@ -2650,7 +2787,8 @@ __TS__ObjectDefineProperty(
2650
2787
  return
2651
2788
  end
2652
2789
  end
2653
- unit:destroy()
2790
+ unit:saveData()
2791
+ Timer:run(unit, "destroy")
2654
2792
  end)
2655
2793
  end
2656
2794
  end)(Unit)