warscript 0.0.1-dev.ee2345e → 0.0.1-dev.ee6e396

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 (279) hide show
  1. package/attributes.d.ts +6 -1
  2. package/attributes.lua +17 -1
  3. package/binaryreader.d.ts +1 -0
  4. package/binaryreader.lua +3 -0
  5. package/config.d.ts +5 -0
  6. package/config.lua +10 -0
  7. package/core/types/effect.d.ts +14 -6
  8. package/core/types/effect.lua +131 -35
  9. package/core/types/frame.d.ts +8 -1
  10. package/core/types/frame.lua +117 -22
  11. package/core/types/group.d.ts +0 -1
  12. package/core/types/image.d.ts +0 -1
  13. package/core/types/missile.d.ts +2 -2
  14. package/core/types/missile.lua +8 -2
  15. package/core/types/player.d.ts +16 -0
  16. package/core/types/player.lua +60 -15
  17. package/core/types/playerCamera.d.ts +2 -0
  18. package/core/types/playerCamera.lua +123 -5
  19. package/core/types/sound.d.ts +17 -24
  20. package/core/types/sound.lua +99 -24
  21. package/core/types/tileCell.d.ts +11 -1
  22. package/core/types/tileCell.lua +97 -0
  23. package/core/types/timer.d.ts +9 -8
  24. package/core/types/timer.lua +45 -23
  25. package/core/types/unit.lua +8 -0
  26. package/core/util.d.ts +1 -1
  27. package/core/util.lua +18 -1
  28. package/decl/index.d.ts +1 -0
  29. package/decl/native.d.ts +846 -790
  30. package/destroyable.d.ts +1 -0
  31. package/destroyable.lua +9 -0
  32. package/engine/ability.d.ts +1 -1
  33. package/engine/behavior.d.ts +24 -11
  34. package/engine/behavior.lua +233 -73
  35. package/engine/behaviour/ability/always-enabled.d.ts +7 -0
  36. package/engine/behaviour/ability/always-enabled.lua +31 -0
  37. package/engine/behaviour/ability/apply-buff.d.ts +8 -5
  38. package/engine/behaviour/ability/apply-buff.lua +36 -4
  39. package/engine/behaviour/ability/apply-unit-behavior.d.ts +6 -1
  40. package/engine/behaviour/ability/apply-unit-behavior.lua +1 -0
  41. package/engine/behaviour/ability/damage.d.ts +39 -11
  42. package/engine/behaviour/ability/damage.lua +83 -37
  43. package/engine/behaviour/ability/emulate-impact.d.ts +6 -0
  44. package/engine/behaviour/ability/emulate-impact.lua +43 -0
  45. package/engine/behaviour/ability/heal.d.ts +33 -6
  46. package/engine/behaviour/ability/heal.lua +89 -10
  47. package/engine/behaviour/ability/instant-impact.d.ts +2 -2
  48. package/engine/behaviour/ability/instant-impact.lua +4 -15
  49. package/engine/behaviour/ability/on-command-impact.d.ts +8 -0
  50. package/engine/behaviour/ability/on-command-impact.lua +25 -0
  51. package/engine/behaviour/ability/remove-buffs.d.ts +25 -0
  52. package/engine/behaviour/ability/remove-buffs.lua +49 -0
  53. package/engine/behaviour/ability/restore-mana.d.ts +15 -0
  54. package/engine/behaviour/ability/restore-mana.lua +29 -0
  55. package/engine/behaviour/ability.d.ts +33 -5
  56. package/engine/behaviour/ability.lua +183 -27
  57. package/engine/behaviour/unit/stun-immunity.d.ts +12 -7
  58. package/engine/behaviour/unit/stun-immunity.lua +57 -31
  59. package/engine/behaviour/unit.d.ts +48 -4
  60. package/engine/behaviour/unit.lua +292 -2
  61. package/engine/buff.d.ts +121 -46
  62. package/engine/buff.lua +567 -248
  63. package/engine/game-map.d.ts +7 -0
  64. package/engine/game-map.lua +32 -0
  65. package/engine/internal/ability.d.ts +23 -14
  66. package/engine/internal/ability.lua +129 -85
  67. package/engine/internal/item/ability.lua +162 -4
  68. package/engine/internal/item+owner.lua +12 -6
  69. package/engine/internal/item.d.ts +20 -19
  70. package/engine/internal/item.lua +191 -74
  71. package/engine/internal/mechanics/ability-duration.lua +1 -1
  72. package/engine/internal/mechanics/cast-ability.lua +6 -3
  73. package/engine/internal/misc/ability-disable-counter.d.ts +2 -0
  74. package/engine/internal/misc/ability-disable-counter.lua +13 -0
  75. package/engine/internal/misc/damage-metadata-by-target.d.ts +2 -0
  76. package/engine/internal/misc/damage-metadata-by-target.lua +5 -0
  77. package/engine/internal/misc/frame-coordinates.d.ts +2 -0
  78. package/engine/internal/misc/frame-coordinates.lua +21 -0
  79. package/engine/internal/misc/get-terrain-z.d.ts +2 -0
  80. package/engine/internal/misc/get-terrain-z.lua +11 -0
  81. package/engine/internal/misc/player-local-handle.d.ts +2 -0
  82. package/engine/internal/misc/player-local-handle.lua +5 -0
  83. package/engine/internal/object-data/auto-attack-speed-increase.d.ts +1 -1
  84. package/engine/internal/object-data/auto-attack-speed-increase.lua +2 -0
  85. package/engine/internal/object-data/evasion-probability.d.ts +2 -0
  86. package/engine/internal/object-data/evasion-probability.lua +16 -0
  87. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.d.ts +2 -0
  88. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.lua +16 -0
  89. package/engine/internal/unit/ability.d.ts +45 -1
  90. package/engine/internal/unit/ability.lua +128 -17
  91. package/engine/internal/unit/add-item-to-slot-init.d.ts +2 -0
  92. package/engine/internal/unit/add-item-to-slot-init.lua +23 -0
  93. package/engine/internal/unit/add-item-to-slot.d.ts +2 -0
  94. package/engine/internal/unit/add-item-to-slot.lua +52 -0
  95. package/engine/internal/unit/allowed-targets.d.ts +1 -1
  96. package/engine/internal/unit/allowed-targets.lua +9 -1
  97. package/engine/internal/unit/attributes.d.ts +17 -0
  98. package/engine/internal/unit/attributes.lua +46 -0
  99. package/engine/internal/unit/bonus.d.ts +13 -8
  100. package/engine/internal/unit/bonus.lua +33 -1
  101. package/engine/internal/unit/fly-height.d.ts +7 -0
  102. package/engine/internal/unit/fly-height.lua +20 -0
  103. package/engine/internal/unit/ignore-events-items.d.ts +2 -0
  104. package/engine/internal/unit/ignore-events-items.lua +5 -0
  105. package/engine/internal/unit/interrupts.d.ts +12 -0
  106. package/engine/internal/unit/interrupts.lua +28 -0
  107. package/engine/internal/unit/item.d.ts +24 -0
  108. package/engine/internal/unit/item.lua +78 -0
  109. package/engine/internal/unit/main-selected.d.ts +13 -0
  110. package/engine/internal/unit/main-selected.lua +36 -0
  111. package/engine/internal/unit/order.d.ts +20 -0
  112. package/engine/internal/unit/order.lua +136 -0
  113. package/engine/internal/unit/range-event.d.ts +12 -0
  114. package/engine/internal/unit/range-event.lua +90 -0
  115. package/engine/internal/unit/scale.d.ts +7 -0
  116. package/engine/internal/unit/scale.lua +20 -0
  117. package/engine/internal/unit+ability.lua +12 -3
  118. package/engine/internal/unit+damage.d.ts +2 -11
  119. package/engine/internal/unit+damage.lua +10 -14
  120. package/engine/internal/unit+spellSteal.lua +1 -2
  121. package/engine/internal/unit+transport.lua +4 -10
  122. package/engine/internal/unit-missile-launch.lua +70 -13
  123. package/engine/internal/unit.d.ts +97 -36
  124. package/engine/internal/unit.lua +701 -336
  125. package/engine/internal/utility.lua +12 -0
  126. package/engine/lightning.d.ts +12 -5
  127. package/engine/lightning.lua +48 -14
  128. package/engine/local-client.d.ts +9 -2
  129. package/engine/local-client.lua +112 -0
  130. package/engine/object-data/auxiliary/animation-name.d.ts +1 -0
  131. package/engine/object-data/auxiliary/animation-name.lua +16 -0
  132. package/engine/object-data/auxiliary/armor-type.d.ts +11 -0
  133. package/engine/object-data/auxiliary/armor-type.lua +46 -0
  134. package/engine/object-data/auxiliary/attachment-preset.d.ts +7 -3
  135. package/engine/object-data/auxiliary/attachment-preset.lua +4 -3
  136. package/engine/object-data/auxiliary/attack-type.d.ts +7 -8
  137. package/engine/object-data/auxiliary/attack-type.lua +42 -0
  138. package/engine/object-data/auxiliary/combat-classification.d.ts +0 -2
  139. package/engine/object-data/auxiliary/health-regeneration-type.d.ts +8 -0
  140. package/engine/object-data/auxiliary/health-regeneration-type.lua +2 -0
  141. package/engine/object-data/auxiliary/movement-type.d.ts +7 -7
  142. package/engine/object-data/auxiliary/movement-type.lua +22 -0
  143. package/engine/object-data/auxiliary/sound-eax.d.ts +10 -0
  144. package/engine/object-data/auxiliary/sound-eax.lua +2 -0
  145. package/engine/object-data/auxiliary/sound-preset-name.d.ts +5 -1
  146. package/engine/object-data/auxiliary/tech-tree-dependency.d.ts +1 -1
  147. package/engine/object-data/auxiliary/unit-attribute.d.ts +6 -0
  148. package/engine/object-data/auxiliary/unit-attribute.lua +9 -0
  149. package/engine/object-data/entry/ability-type/berserk.d.ts +2 -0
  150. package/engine/object-data/entry/ability-type/berserk.lua +13 -0
  151. package/engine/object-data/entry/ability-type/blank-configurable.d.ts +0 -1
  152. package/engine/object-data/entry/ability-type/blank-configurable.lua +12 -1
  153. package/engine/object-data/entry/ability-type/blank-passive.d.ts +0 -1
  154. package/engine/object-data/entry/ability-type/carrion-swarm.d.ts +14 -0
  155. package/engine/object-data/entry/ability-type/carrion-swarm.lua +65 -0
  156. package/engine/object-data/entry/ability-type/channel.d.ts +0 -1
  157. package/engine/object-data/entry/ability-type/disease-cloud.lua +2 -2
  158. package/engine/object-data/entry/ability-type/engineering-upgrade.lua +2 -2
  159. package/engine/object-data/entry/ability-type/ensnare.d.ts +12 -0
  160. package/engine/object-data/entry/ability-type/ensnare.lua +52 -0
  161. package/engine/object-data/entry/ability-type/feral-spirit.lua +2 -2
  162. package/engine/object-data/entry/ability-type/mana-regeneration.d.ts +8 -0
  163. package/engine/object-data/entry/ability-type/mana-regeneration.lua +26 -0
  164. package/engine/object-data/entry/ability-type/mine.d.ts +10 -0
  165. package/engine/object-data/entry/ability-type/mine.lua +39 -0
  166. package/engine/object-data/entry/ability-type/permanent-invisibility.d.ts +8 -0
  167. package/engine/object-data/entry/ability-type/permanent-invisibility.lua +26 -0
  168. package/engine/object-data/entry/ability-type/phase-shift.d.ts +10 -0
  169. package/engine/object-data/entry/ability-type/phase-shift.lua +39 -0
  170. package/engine/object-data/entry/ability-type/phoenix-morph.lua +4 -4
  171. package/engine/object-data/entry/ability-type/raise-dead.d.ts +17 -0
  172. package/engine/object-data/entry/ability-type/raise-dead.lua +78 -0
  173. package/engine/object-data/entry/ability-type/shock-wave.d.ts +4 -0
  174. package/engine/object-data/entry/ability-type/shock-wave.lua +26 -0
  175. package/engine/object-data/entry/ability-type/slow-poison.d.ts +10 -0
  176. package/engine/object-data/entry/ability-type/slow-poison.lua +58 -0
  177. package/engine/object-data/entry/ability-type/spirit-touch.d.ts +2 -2
  178. package/engine/object-data/entry/ability-type/spirit-touch.lua +6 -6
  179. package/engine/object-data/entry/ability-type/summon-quilbeast.lua +2 -2
  180. package/engine/object-data/entry/ability-type/summon-water-elemental.lua +2 -2
  181. package/engine/object-data/entry/ability-type/web.d.ts +12 -0
  182. package/engine/object-data/entry/ability-type/web.lua +52 -0
  183. package/engine/object-data/entry/ability-type.d.ts +19 -18
  184. package/engine/object-data/entry/ability-type.lua +93 -36
  185. package/engine/object-data/entry/buff-type/applicable.d.ts +0 -1
  186. package/engine/object-data/entry/buff-type/applicable.lua +18 -37
  187. package/engine/object-data/entry/buff-type/blank.d.ts +0 -1
  188. package/engine/object-data/entry/buff-type.d.ts +6 -13
  189. package/engine/object-data/entry/buff-type.lua +13 -29
  190. package/engine/object-data/entry/destructible-type.d.ts +28 -3
  191. package/engine/object-data/entry/destructible-type.lua +155 -0
  192. package/engine/object-data/entry/item-type/blank.d.ts +0 -1
  193. package/engine/object-data/entry/item-type.d.ts +15 -2
  194. package/engine/object-data/entry/item-type.lua +93 -2
  195. package/engine/object-data/entry/lightning-type.d.ts +1 -2
  196. package/engine/object-data/entry/sound-preset.d.ts +33 -0
  197. package/engine/object-data/entry/sound-preset.lua +140 -0
  198. package/engine/object-data/entry/unit-type.d.ts +62 -7
  199. package/engine/object-data/entry/unit-type.lua +524 -75
  200. package/engine/object-data/entry/upgrade/blank.d.ts +0 -1
  201. package/engine/object-data/entry/upgrade.d.ts +1 -2
  202. package/engine/object-data/entry/upgrade.lua +4 -4
  203. package/engine/object-data/entry.d.ts +18 -17
  204. package/engine/object-data/entry.lua +60 -32
  205. package/engine/object-data/utility/object-data-entry-id-generator.lua +7 -0
  206. package/engine/object-field/ability.d.ts +28 -5
  207. package/engine/object-field/ability.lua +59 -5
  208. package/engine/object-field/unit.d.ts +72 -3
  209. package/engine/object-field/unit.lua +268 -7
  210. package/engine/object-field.d.ts +25 -7
  211. package/engine/object-field.lua +359 -116
  212. package/engine/random.d.ts +10 -0
  213. package/engine/random.lua +22 -0
  214. package/engine/standard/entries/buff-type.d.ts +3 -0
  215. package/engine/standard/entries/buff-type.lua +3 -0
  216. package/engine/standard/entries/sound-preset.d.ts +10 -0
  217. package/engine/standard/entries/sound-preset.lua +10 -0
  218. package/engine/standard/entries/unit-type.d.ts +39 -1
  219. package/engine/standard/entries/unit-type.lua +39 -1
  220. package/engine/standard/fields/ability.d.ts +5 -3
  221. package/engine/standard/fields/ability.lua +5 -3
  222. package/engine/standard/fields/unit.d.ts +12 -0
  223. package/engine/standard/fields/unit.lua +20 -0
  224. package/engine/synchronization.d.ts +11 -0
  225. package/engine/synchronization.lua +77 -0
  226. package/engine/text-tag.d.ts +36 -2
  227. package/engine/text-tag.lua +250 -10
  228. package/engine/unit.d.ts +9 -0
  229. package/engine/unit.lua +18 -2
  230. package/event.d.ts +2 -3
  231. package/event.lua +9 -5
  232. package/index.d.ts +1 -0
  233. package/index.lua +1 -0
  234. package/lualib_bundle.lua +146 -42
  235. package/math/vec2.d.ts +2 -9
  236. package/math.d.ts +0 -2
  237. package/net/socket.d.ts +7 -1
  238. package/net/socket.lua +45 -4
  239. package/network.d.ts +1 -0
  240. package/network.lua +3 -2
  241. package/objutil/ability.d.ts +0 -1
  242. package/objutil/buff.d.ts +0 -1
  243. package/objutil/buff.lua +12 -11
  244. package/objutil/object.d.ts +0 -1
  245. package/objutil/unit.d.ts +0 -1
  246. package/objutil/unit.lua +8 -0
  247. package/package.json +13 -14
  248. package/patch-lua.d.ts +0 -0
  249. package/patch-lua.lua +25 -0
  250. package/patch-lualib.lua +1 -1
  251. package/property.d.ts +55 -0
  252. package/property.lua +374 -0
  253. package/string.d.ts +30 -0
  254. package/string.lua +14 -0
  255. package/util/stream.d.ts +0 -1
  256. package/utility/arrays.d.ts +13 -5
  257. package/utility/arrays.lua +45 -3
  258. package/utility/bit-set.d.ts +0 -2
  259. package/utility/callback-array.d.ts +17 -0
  260. package/utility/callback-array.lua +61 -0
  261. package/utility/functions.d.ts +8 -0
  262. package/utility/functions.lua +13 -0
  263. package/utility/lazy.d.ts +2 -0
  264. package/utility/lazy.lua +14 -0
  265. package/utility/linked-map.d.ts +34 -0
  266. package/utility/linked-map.lua +101 -0
  267. package/utility/linked-set.d.ts +15 -4
  268. package/utility/linked-set.lua +48 -3
  269. package/utility/lua-maps.d.ts +16 -4
  270. package/utility/lua-maps.lua +53 -2
  271. package/utility/lua-sets.d.ts +3 -2
  272. package/utility/lua-sets.lua +7 -0
  273. package/utility/records.lua +20 -1
  274. package/utility/reflection.lua +11 -7
  275. package/utility/types.d.ts +4 -0
  276. package/core/mapbounds.d.ts +0 -8
  277. package/core/mapbounds.lua +0 -12
  278. package/core/types/order.d.ts +0 -25
  279. package/core/types/order.lua +0 -55
@@ -5,9 +5,12 @@ local __TS__ArrayMap = ____lualib.__TS__ArrayMap
5
5
  local __TS__New = ____lualib.__TS__New
6
6
  local __TS__Class = ____lualib.__TS__Class
7
7
  local __TS__ClassExtends = ____lualib.__TS__ClassExtends
8
+ local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
8
9
  local __TS__ArraySetLength = ____lualib.__TS__ArraySetLength
10
+ local __TS__SparseArrayNew = ____lualib.__TS__SparseArrayNew
11
+ local __TS__SparseArrayPush = ____lualib.__TS__SparseArrayPush
12
+ local __TS__SparseArraySpread = ____lualib.__TS__SparseArraySpread
9
13
  local __TS__InstanceOf = ____lualib.__TS__InstanceOf
10
- local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
11
14
  local __TS__ObjectDefineProperty = ____lualib.__TS__ObjectDefineProperty
12
15
  local Set = ____lualib.Set
13
16
  local __TS__Spread = ____lualib.__TS__Spread
@@ -48,33 +51,42 @@ local ____arrays = require("utility.arrays")
48
51
  local forEach = ____arrays.forEach
49
52
  local ____math = require("math")
50
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
51
69
  local match = string.match
52
70
  local ____tostring = _G.tostring
53
71
  local setUnitAnimation = SetUnitAnimation
54
- local setUnitAnimationWithRarity = SetUnitAnimationWithRarity
55
72
  local setUnitAnimationByIndex = SetUnitAnimationByIndex
56
- local queueUnitAnimation = QueueUnitAnimation
57
73
  local getUnitIntegerField = BlzGetUnitIntegerField
58
74
  local getUnitRealField = BlzGetUnitRealField
59
75
  local getHeroStr = GetHeroStr
60
76
  local getHeroAgi = GetHeroAgi
61
77
  local getHeroInt = GetHeroInt
62
- local setHeroStr = SetHeroStr
63
- local setHeroAgi = SetHeroAgi
64
- local setHeroInt = SetHeroInt
65
78
  local getUnitBooleanField = BlzGetUnitBooleanField
66
79
  local getUnitStringField = BlzGetUnitStringField
67
80
  local setUnitIntegerField = BlzSetUnitIntegerField
68
81
  local setUnitRealField = BlzSetUnitRealField
69
82
  local setUnitBooleanField = BlzSetUnitBooleanField
70
83
  local setUnitStringField = BlzSetUnitStringField
71
- local setUnitScale = SetUnitScale
72
84
  local setUnitPosition = SetUnitPosition
73
85
  local setUnitTimeScale = SetUnitTimeScale
74
86
  local getHandleId = GetHandleId
87
+ local getUnitCurrentOrder = GetUnitCurrentOrder
75
88
  local createUnit = CreateUnit
76
89
  local killUnit = KillUnit
77
- local setUnitExploded = SetUnitExploded
78
90
  local removeUnit = RemoveUnit
79
91
  local getUnitTypeId = GetUnitTypeId
80
92
  local isHeroUnitId = IsHeroUnitId
@@ -90,11 +102,12 @@ local getSpellTargetItem = GetSpellTargetItem
90
102
  local getSpellTargetDestructable = GetSpellTargetDestructable
91
103
  local isUnitInRangeXY = IsUnitInRangeXY
92
104
  local isUnitInRange = IsUnitInRange
93
- local setResourceAmount = SetResourceAmount
94
- local getResourceAmount = GetResourceAmount
105
+ local getUnitWeaponRealField = BlzGetUnitWeaponRealField
106
+ local setUnitWeaponRealField = BlzSetUnitWeaponRealField
107
+ local getUnitWeaponStringField = BlzGetUnitWeaponStringField
108
+ local setUnitWeaponStringField = BlzSetUnitWeaponStringField
95
109
  local getUnitAbilityLevel = GetUnitAbilityLevel
96
110
  local unitDisableAbility = BlzUnitDisableAbility
97
- local unitInterruptAttack = BlzUnitInterruptAttack
98
111
  local isUnitInvisible = IsUnitInvisible
99
112
  local isUnitVisible = IsUnitVisible
100
113
  local getUnitX = GetUnitX
@@ -111,15 +124,9 @@ local getOrderedUnit = GetOrderedUnit
111
124
  local getIssuedOrderId = GetIssuedOrderId
112
125
  local isUnitInvulnerable = BlzIsUnitInvulnerable
113
126
  local unitAlive = UnitAlive
114
- local unitAddType = UnitAddType
115
- local unitRemoveType = UnitRemoveType
116
- local isUnitIllusion = IsUnitIllusion
117
- local isUnitType = IsUnitType
118
127
  local isUnitAlly = IsUnitAlly
119
128
  local isUnitEnemy = IsUnitEnemy
120
129
  local getOwningPlayer = GetOwningPlayer
121
- local setUnitColor = SetUnitColor
122
- local showUnitTeamGlow = BlzShowUnitTeamGlow
123
130
  ____exports.UnitClassification = {}
124
131
  local UnitClassification = ____exports.UnitClassification
125
132
  do
@@ -129,6 +136,7 @@ do
129
136
  UnitClassification.GROUND = UNIT_TYPE_GROUND
130
137
  UnitClassification.SUMMONED = UNIT_TYPE_SUMMONED
131
138
  UnitClassification.MECHANICAL = UNIT_TYPE_MECHANICAL
139
+ UnitClassification.WORKER = UNIT_TYPE_PEON
132
140
  UnitClassification.ANCIENT = UNIT_TYPE_ANCIENT
133
141
  UnitClassification.SUICIDAL = UNIT_TYPE_SAPPER
134
142
  UnitClassification.TAUREN = UNIT_TYPE_TAUREN
@@ -275,16 +283,14 @@ function UnitTriggerEvent.prototype.____constructor(self, eventType, c)
275
283
  end
276
284
  local function dispatch(event, idGetter, argsGetter)
277
285
  local initialized = false
278
- local x = {}
279
286
  return setmetatable(
280
- x,
287
+ {},
281
288
  {
282
289
  __index = function(self, id)
283
290
  if type(id) ~= "number" then
284
291
  return event[id]
285
292
  end
286
293
  if not initialized then
287
- local invoke = Event.invoke
288
294
  event:addListener(function(...)
289
295
  local id = idGetter(...)
290
296
  local dispatched = rawget(self, id)
@@ -322,7 +328,6 @@ local function dispatchAbility(event)
322
328
  return event[id]
323
329
  end
324
330
  if not initialized then
325
- local invoke = Event.invoke
326
331
  event:addListener(function(unit, ability, ...)
327
332
  local dispatched = rawget(self, ability.typeId)
328
333
  if dispatched ~= nil then
@@ -339,6 +344,9 @@ local function dispatchAbility(event)
339
344
  }
340
345
  )
341
346
  end
347
+ local function damagingEventPreventRetaliation(self)
348
+ self[0] = true
349
+ end
342
350
  local function damageEventPreventDeath(self, callback, ...)
343
351
  if self[0] ~= nil then
344
352
  return
@@ -350,7 +358,14 @@ local function damageEventPreventDeath(self, callback, ...)
350
358
  rawset(self, 1 + i, (select(i, ...)))
351
359
  end
352
360
  end
353
- 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
+ }
354
369
  local jlimitopByOperator = {
355
370
  [0] = LESS_THAN_OR_EQUAL,
356
371
  [1] = LESS_THAN_OR_EQUAL,
@@ -368,15 +383,27 @@ local modifiers = {
368
383
  end,
369
384
  armor = function(unit, value)
370
385
  if UnitAddAbility(unit, armorBonusAbilityId) then
371
- assert(UnitMakeAbilityPermanent(unit, true, armorBonusAbilityId))
386
+ assert(
387
+ UnitMakeAbilityPermanent(unit, true, armorBonusAbilityId),
388
+ "armor bonus ability must be made permanent",
389
+ unit
390
+ )
372
391
  end
373
- local ability = assert(BlzGetUnitAbility(unit, armorBonusAbilityId))
374
- assert(BlzSetAbilityRealLevelField(
375
- ability,
376
- armorBonusField,
377
- 0,
378
- BlzGetAbilityRealLevelField(ability, armorBonusField, 0) + value
379
- ))
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
+ )
380
407
  end
381
408
  }
382
409
  local getters = {
@@ -387,51 +414,184 @@ local getters = {
387
414
  return BlzGetUnitArmor(unit)
388
415
  end
389
416
  }
390
- local weaponGetters = {
391
- index = function(self, handle, index)
392
- return index
393
- end,
394
- cooldown = function(self, handle, index)
395
- return BlzGetUnitWeaponRealField(handle, UNIT_WEAPON_RF_ATTACK_BASE_COOLDOWN, index)
396
- end,
397
- projectileArc = function(self, handle, index)
398
- return BlzGetUnitWeaponRealField(handle, UNIT_WEAPON_RF_ATTACK_PROJECTILE_ARC, index)
399
- end,
400
- projectileArt = function(self, handle, index)
401
- return BlzGetUnitWeaponStringField(handle, UNIT_WEAPON_SF_ATTACK_PROJECTILE_ART, index)
402
- end,
403
- projectileSpeed = function(self, handle, index)
404
- return BlzGetUnitWeaponRealField(handle, UNIT_WEAPON_RF_ATTACK_PROJECTILE_SPEED, index)
405
- end,
406
- attackPoint = function(self, handle, index)
407
- return BlzGetUnitWeaponRealField(handle, UNIT_WEAPON_RF_ATTACK_DAMAGE_POINT, index)
408
- end
409
- }
410
- local weaponSetters = {
411
- cooldown = function(self, handle, index, value)
412
- assert(BlzSetUnitWeaponRealField(handle, UNIT_WEAPON_RF_ATTACK_BASE_COOLDOWN, index, value))
413
- end,
414
- projectileArc = function(self, handle, index, value)
415
- assert(BlzSetUnitWeaponRealField(handle, UNIT_WEAPON_RF_ATTACK_PROJECTILE_ARC, index, value))
416
- end,
417
- projectileArt = function(self, handle, index, value)
418
- assert(BlzSetUnitWeaponStringField(handle, UNIT_WEAPON_SF_ATTACK_PROJECTILE_ART, index, value))
419
- end,
420
- projectileSpeed = function(self, handle, index, value)
421
- assert(BlzSetUnitWeaponRealField(handle, UNIT_WEAPON_RF_ATTACK_PROJECTILE_SPEED, index, value))
422
- end,
423
- attackPoint = function(self, handle, index, value)
424
- assert(BlzSetUnitWeaponRealField(handle, UNIT_WEAPON_RF_ATTACK_DAMAGE_POINT, index, value))
425
- end
426
- }
427
- local weaponMetatable = {
428
- __index = function(self, key)
429
- return weaponGetters[key](weaponGetters, self.h, self.i)
430
- end,
431
- __newindex = function(self, key, value)
432
- weaponSetters[key](weaponSetters, self.h, self.i, value)
433
- end
434
- }
417
+ ____exports.UnitWeapon = __TS__Class()
418
+ local UnitWeapon = ____exports.UnitWeapon
419
+ UnitWeapon.name = "UnitWeapon"
420
+ function UnitWeapon.prototype.____constructor(self, unit, index)
421
+ self.unit = unit
422
+ self.index = index
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
+ )
437
+ __TS__SetDescriptor(
438
+ UnitWeapon.prototype,
439
+ "cooldown",
440
+ {
441
+ get = function(self)
442
+ return getUnitWeaponRealField(self.unit.handle, UNIT_WEAPON_RF_ATTACK_BASE_COOLDOWN, self.index)
443
+ end,
444
+ set = function(self, cooldown)
445
+ setUnitWeaponRealField(self.unit.handle, UNIT_WEAPON_RF_ATTACK_BASE_COOLDOWN, self.index, cooldown)
446
+ end
447
+ },
448
+ true
449
+ )
450
+ __TS__SetDescriptor(
451
+ UnitWeapon.prototype,
452
+ "damage",
453
+ {
454
+ get = function(self)
455
+ local minimumDamage = self.damageBase + self.damageDiceCount
456
+ local maximumDamage = self.damageBase + self.damageDiceCount * self.damageDiceSideCount
457
+ return {minimumDamage, maximumDamage}
458
+ end,
459
+ set = function(self, ____bindingPattern0)
460
+ local maximumDamage
461
+ local minimumDamage
462
+ minimumDamage = ____bindingPattern0[1]
463
+ maximumDamage = ____bindingPattern0[2]
464
+ self.damageBase = minimumDamage - 1
465
+ self.damageDiceCount = 1
466
+ self.damageDiceSideCount = maximumDamage - minimumDamage + 1
467
+ end
468
+ },
469
+ true
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
+ )
484
+ __TS__SetDescriptor(
485
+ UnitWeapon.prototype,
486
+ "damageBase",
487
+ {
488
+ get = function(self)
489
+ return BlzGetUnitBaseDamage(self.unit.handle, self.index)
490
+ end,
491
+ set = function(self, damageBase)
492
+ BlzSetUnitBaseDamage(self.unit.handle, self.index, damageBase)
493
+ end
494
+ },
495
+ true
496
+ )
497
+ __TS__SetDescriptor(
498
+ UnitWeapon.prototype,
499
+ "damageDiceCount",
500
+ {
501
+ get = function(self)
502
+ return BlzGetUnitDiceNumber(self.unit.handle, self.index)
503
+ end,
504
+ set = function(self, damageDiceCount)
505
+ BlzSetUnitDiceNumber(self.unit.handle, self.index, damageDiceCount)
506
+ end
507
+ },
508
+ true
509
+ )
510
+ __TS__SetDescriptor(
511
+ UnitWeapon.prototype,
512
+ "damageDiceSideCount",
513
+ {
514
+ get = function(self)
515
+ return BlzGetUnitDiceSides(self.unit.handle, self.index)
516
+ end,
517
+ set = function(self, damageDiceSideCount)
518
+ BlzSetUnitDiceSides(self.unit.handle, self.index, damageDiceSideCount)
519
+ end
520
+ },
521
+ true
522
+ )
523
+ __TS__SetDescriptor(
524
+ UnitWeapon.prototype,
525
+ "range",
526
+ {
527
+ get = function(self)
528
+ return getUnitWeaponRealField(self.unit.handle, UNIT_WEAPON_RF_ATTACK_RANGE, self.index)
529
+ end,
530
+ set = function(self, range)
531
+ local handle = self.unit.handle
532
+ local index = self.index
533
+ setUnitWeaponRealField(
534
+ handle,
535
+ UNIT_WEAPON_RF_ATTACK_RANGE,
536
+ index + 1,
537
+ getUnitWeaponRealField(handle, UNIT_WEAPON_RF_ATTACK_RANGE, index + 1) + (range - getUnitWeaponRealField(handle, UNIT_WEAPON_RF_ATTACK_RANGE, index))
538
+ )
539
+ end
540
+ },
541
+ true
542
+ )
543
+ __TS__SetDescriptor(
544
+ UnitWeapon.prototype,
545
+ "impactDelay",
546
+ {
547
+ get = function(self)
548
+ return getUnitWeaponRealField(self.unit.handle, UNIT_WEAPON_RF_ATTACK_DAMAGE_POINT, self.index)
549
+ end,
550
+ set = function(self, impactDelay)
551
+ setUnitWeaponRealField(self.unit.handle, UNIT_WEAPON_RF_ATTACK_DAMAGE_POINT, self.index, impactDelay)
552
+ end
553
+ },
554
+ true
555
+ )
556
+ __TS__SetDescriptor(
557
+ UnitWeapon.prototype,
558
+ "missileArc",
559
+ {
560
+ get = function(self)
561
+ return getUnitWeaponRealField(self.unit.handle, UNIT_WEAPON_RF_ATTACK_PROJECTILE_ARC, self.index)
562
+ end,
563
+ set = function(self, missileArc)
564
+ setUnitWeaponRealField(self.unit.handle, UNIT_WEAPON_RF_ATTACK_PROJECTILE_ARC, self.index, missileArc)
565
+ end
566
+ },
567
+ true
568
+ )
569
+ __TS__SetDescriptor(
570
+ UnitWeapon.prototype,
571
+ "missileModelPath",
572
+ {
573
+ get = function(self)
574
+ return getUnitWeaponStringField(self.unit.handle, UNIT_WEAPON_SF_ATTACK_PROJECTILE_ART, self.index)
575
+ end,
576
+ set = function(self, missileModelPath)
577
+ setUnitWeaponStringField(self.unit.handle, UNIT_WEAPON_SF_ATTACK_PROJECTILE_ART, self.index, missileModelPath)
578
+ end
579
+ },
580
+ true
581
+ )
582
+ __TS__SetDescriptor(
583
+ UnitWeapon.prototype,
584
+ "missileSpeed",
585
+ {
586
+ get = function(self)
587
+ return getUnitWeaponRealField(self.unit.handle, UNIT_WEAPON_RF_ATTACK_PROJECTILE_SPEED, self.index)
588
+ end,
589
+ set = function(self, missileSpeed)
590
+ setUnitWeaponRealField(self.unit.handle, UNIT_WEAPON_RF_ATTACK_PROJECTILE_SPEED, self.index, missileSpeed)
591
+ end
592
+ },
593
+ true
594
+ )
435
595
  local unitInventorySize = UnitInventorySize
436
596
  local unitItemInSlot = UnitItemInSlot
437
597
  local getItemAbility = BlzGetItemAbility
@@ -442,8 +602,6 @@ local getAbilityName = GetAbilityName
442
602
  local unitAddAbility = UnitAddAbility
443
603
  local getUnitGoldCost = GetUnitGoldCost
444
604
  local getUnitLumberCost = GetUnitWoodCost
445
- local unitMakeAbilityPermanent = UnitMakeAbilityPermanent
446
- local unitAddItem = UnitAddItem
447
605
  local unitRemoveAbility = UnitRemoveAbility
448
606
  local function retrieveAbility(unit, ability, abilityId)
449
607
  if ability == nil then
@@ -453,17 +611,6 @@ local function retrieveAbility(unit, ability, abilityId)
453
611
  ____exports.Unit:of(unit)
454
612
  )
455
613
  end
456
- if not unitAddAbility(unit, abilityId) then
457
- if getUnitAbility(unit, abilityId) == ability then
458
- return UnitAbility:of(
459
- ability,
460
- abilityId,
461
- ____exports.Unit:of(unit)
462
- )
463
- end
464
- else
465
- unitRemoveAbility(unit, abilityId)
466
- end
467
614
  for i = 0, unitInventorySize(unit) - 1 do
468
615
  local item = unitItemInSlot(unit, i)
469
616
  if getItemAbility(item, abilityId) == ability then
@@ -510,55 +657,110 @@ local fieldSetters = {
510
657
  }
511
658
  local dummies = {}
512
659
  for ____, player in ipairs(Player.all) do
513
- local dummy = assert(createUnit(
514
- player.handle,
515
- dummyUnitId,
516
- 0,
517
- 0,
518
- 270
519
- ))
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
+ )
520
671
  ShowUnit(dummy, false)
521
672
  dummies[player] = dummy
522
673
  end
674
+ local function delayHealthChecksCallback(unit)
675
+ local counter = (unit[104] or 0) - 1
676
+ if counter ~= 0 then
677
+ unit[104] = counter
678
+ return
679
+ end
680
+ unit[104] = nil
681
+ local healthBonus = unit[105]
682
+ if healthBonus ~= nil then
683
+ unit[105] = nil
684
+ local handle = unit.handle
685
+ BlzSetUnitMaxHP(
686
+ handle,
687
+ BlzGetUnitMaxHP(handle) - healthBonus
688
+ )
689
+ end
690
+ end
691
+ local nextSyncId = 1
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
523
703
  ____exports.Unit = __TS__Class()
524
704
  local Unit = ____exports.Unit
525
705
  Unit.name = "Unit"
526
706
  __TS__ClassExtends(Unit, Handle)
527
707
  function Unit.prototype.____constructor(self, handle)
528
708
  Handle.prototype.____constructor(self, handle)
709
+ local ____nextSyncId_1 = nextSyncId
710
+ nextSyncId = ____nextSyncId_1 + 1
711
+ self.syncId = ____nextSyncId_1
529
712
  self._owner = Player:of(getOwningPlayer(handle))
530
- assert(unitAddAbility(handle, leaveDetectAbilityId) and UnitMakeAbilityPermanent(handle, true, leaveDetectAbilityId))
531
- 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
+ )
532
723
  if unitAddAbility(
533
724
  handle,
534
725
  fourCC("Amrf")
535
726
  ) then
536
- assert(unitRemoveAbility(
537
- handle,
538
- fourCC("Amrf")
539
- ))
727
+ assert(
728
+ unitRemoveAbility(
729
+ handle,
730
+ fourCC("Amrf")
731
+ ),
732
+ "fly ability must be removed after addition",
733
+ self
734
+ )
540
735
  end
736
+ unitBySyncId[self.syncId] = self
541
737
  local ____ = self.abilities
542
738
  end
543
- function Unit.prototype.getEvent(self, event, collector)
544
- self.events = self.events or ({})
545
- local eventId = GetHandleId(event)
546
- if not self.events[eventId] then
547
- 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(
548
745
  TriggerEvent,
549
746
  function(trigger)
550
- TriggerRegisterUnitEvent(trigger, self.handle, event)
747
+ TriggerRegisterUnitEvent(trigger, self.handle, jevent)
551
748
  end,
552
749
  collector or (function() return {} end)
553
750
  )
751
+ self.events:put(eventId, event)
554
752
  end
555
- 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))
556
760
  end
557
761
  function Unit.prototype.onDestroy(self)
558
762
  local handle = self.handle
559
- if not self._owner then
560
- self._owner = Player:of(getOwningPlayer(handle))
561
- end
763
+ self:saveData()
562
764
  local abilities = self.abilities
563
765
  for ____, ability in ipairs(abilities) do
564
766
  ability:destroy()
@@ -594,7 +796,11 @@ function Unit.prototype.addAttackHandler(self, condition, action)
594
796
  self._attackHandlers = handlers
595
797
  if #handlers == 1 then
596
798
  local handle = self.handle
597
- 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
+ )
598
804
  end
599
805
  return handler
600
806
  end
@@ -623,17 +829,17 @@ function Unit.prototype.addModifier(self, property, modifier)
623
829
  end}
624
830
  end
625
831
  function Unit.prototype.hasCombatClassification(self, combatClassification)
626
- local ____combatClassification_0 = combatClassification
627
- return getUnitIntegerField(self.handle, UNIT_IF_TARGETED_AS) & ____combatClassification_0 == ____combatClassification_0
832
+ local ____combatClassification_2 = combatClassification
833
+ return getUnitIntegerField(self.handle, UNIT_IF_TARGETED_AS) & ____combatClassification_2 == ____combatClassification_2
628
834
  end
629
835
  function Unit.prototype.addClassification(self, classification)
630
- return unitAddType(self.handle, classification)
836
+ return UnitAddType(self.handle, classification)
631
837
  end
632
838
  function Unit.prototype.removeClassification(self, classification)
633
- return unitRemoveType(self.handle, classification)
839
+ return UnitRemoveType(self.handle, classification)
634
840
  end
635
841
  function Unit.prototype.hasClassification(self, classification)
636
- return isUnitType(self.handle, classification)
842
+ return IsUnitType(self.handle, classification)
637
843
  end
638
844
  function Unit.prototype.isVisibleTo(self, player)
639
845
  return isUnitVisible(self.handle, player.handle)
@@ -642,13 +848,13 @@ function Unit.prototype.isInvisibleTo(self, player)
642
848
  return isUnitInvisible(self.handle, player.handle)
643
849
  end
644
850
  function Unit.prototype.isInRangeOf(self, x, y, range)
645
- local ____temp_1
851
+ local ____temp_3
646
852
  if type(x) == "number" then
647
- ____temp_1 = isUnitInRangeXY(self.handle, x, y, range)
853
+ ____temp_3 = isUnitInRangeXY(self.handle, x, y, range)
648
854
  else
649
- ____temp_1 = isUnitInRange(self.handle, x.handle, y)
855
+ ____temp_3 = isUnitInRange(self.handle, x.handle, y)
650
856
  end
651
- return ____temp_1
857
+ return ____temp_3
652
858
  end
653
859
  function Unit.prototype.isAllyOf(self, unit)
654
860
  return isUnitAlly(
@@ -666,13 +872,31 @@ function Unit.prototype.playAnimation(self, animation, rarity)
666
872
  if type(animation) == "number" then
667
873
  setUnitAnimationByIndex(self.handle, animation)
668
874
  elseif rarity then
669
- setUnitAnimationWithRarity(self.handle, animation, rarity)
875
+ SetUnitAnimationWithRarity(self.handle, animation, rarity)
670
876
  else
671
877
  setUnitAnimation(self.handle, animation)
672
878
  end
673
879
  end
880
+ function Unit.prototype.resetAnimation(self)
881
+ ResetUnitAnimation(self.handle)
882
+ end
674
883
  function Unit.prototype.queueAnimation(self, animation)
675
- 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
896
+ end
897
+ function Unit.prototype.delayHealthChecks(self)
898
+ self[104] = (self[104] or 0) + 1
899
+ Timer:run(delayHealthChecksCallback, self)
676
900
  end
677
901
  function Unit.prototype.setPosition(self, x, y)
678
902
  setUnitPosition(self.handle, x, y)
@@ -681,14 +905,21 @@ function Unit.prototype.isSelected(self, player)
681
905
  return IsUnitSelected(self.handle, player.handle)
682
906
  end
683
907
  function Unit.prototype.explode(self)
684
- setUnitExploded(self.handle, true)
908
+ SetUnitExploded(self.handle, true)
685
909
  killUnit(self.handle)
686
910
  end
687
911
  function Unit.prototype.kill(self)
688
912
  killUnit(self.handle)
689
913
  end
690
- function Unit.prototype.revive(self, pos, doEffect)
691
- ReviveHero(self.handle, pos.x, pos.y, doEffect)
914
+ function Unit.prototype.revive(self, x, y, doEffect)
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
920
+ end
921
+ __TS__SparseArrayPush(____array_5, ____doEffect_4)
922
+ ____ReviveHero_6(__TS__SparseArraySpread(____array_5))
692
923
  end
693
924
  function Unit.prototype.healTarget(self, target, amount)
694
925
  if __TS__InstanceOf(target, ____exports.Unit) and target:hasAbility(fourCC("BIhm")) then
@@ -728,20 +959,19 @@ function Unit.prototype.dropItemSlot(self, item, slot)
728
959
  return UnitDropItemSlot(self.handle, item.handle, slot)
729
960
  end
730
961
  function Unit.prototype.itemInSlot(self, slot)
731
- return Item:of(UnitItemInSlot(self.handle, slot))
962
+ return Item:of(unitItemInSlot(self.handle, slot))
732
963
  end
733
964
  function Unit.prototype.addAbility(self, abilityId)
734
- if unitAddAbility(self.handle, abilityId) then
735
- local ability = UnitAbility:of(
736
- checkNotNull(getUnitAbility(self.handle, abilityId)),
737
- abilityId,
738
- self
739
- )
965
+ local ability = UnitAbility:of(
966
+ doUnitAbilityAction(self.handle, abilityId, addAbility, abilityId),
967
+ abilityId,
968
+ self
969
+ )
970
+ if ability ~= nil then
740
971
  local abilities = self.abilities
741
972
  abilities[#abilities + 1] = ability
742
- return ability
743
973
  end
744
- return nil
974
+ return ability
745
975
  end
746
976
  function Unit.prototype.makeAbilityPermanent(self, abilityId, permanent)
747
977
  return UnitMakeAbilityPermanent(self.handle, permanent, abilityId)
@@ -755,47 +985,44 @@ end
755
985
  function Unit.prototype.hasAbility(self, abilityId)
756
986
  return getUnitAbilityLevel(self.handle, abilityId) > 0
757
987
  end
758
- function Unit.prototype.getAbilityById(self, abilityId)
759
- local handle = self.handle
760
- if unitAddAbility(handle, abilityId) then
761
- assert(unitRemoveAbility(handle, abilityId))
762
- return nil
763
- end
764
- return UnitAbility:of(
765
- getUnitAbility(self.handle, abilityId),
766
- abilityId,
767
- self
768
- )
988
+ function Unit.prototype.getAbility(self, abilityId)
989
+ local ability = doUnitAbilityAction(self.handle, abilityId, getUnitAbility, abilityId)
990
+ return UnitAbility:of(ability, abilityId, self)
769
991
  end
770
- function Unit.prototype.removeAbility(self, abilityId)
771
- if unitRemoveAbility(self.handle, abilityId) then
772
- local abilities = self.abilities
773
- for i = 1, #abilities do
774
- if abilities[i].typeId == abilityId then
775
- abilities[i]:destroy()
776
- tremove(abilities, i)
777
- return true
778
- 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
779
1000
  end
780
- return true
781
1001
  end
782
- return false
1002
+ return doUnitAbilityAction(self.handle, abilityTypeId, unitRemoveAbility, abilityTypeId)
783
1003
  end
784
1004
  function Unit.prototype.hideAbility(self, abilityId, flag)
785
1005
  BlzUnitHideAbility(self.handle, abilityId, flag)
786
1006
  end
1007
+ function Unit.prototype.getAbilityRemainingCooldown(self, abilityId)
1008
+ return BlzGetUnitAbilityCooldownRemaining(self.handle, abilityId)
1009
+ end
787
1010
  function Unit.prototype.startAbilityCooldown(self, abilityId, cooldown)
788
1011
  BlzStartUnitAbilityCooldown(self.handle, abilityId, cooldown)
789
1012
  end
790
1013
  function Unit.prototype.endAbilityCooldown(self, abilityId)
791
1014
  BlzEndUnitAbilityCooldown(self.handle, abilityId)
792
1015
  end
793
- function Unit.prototype.interruptAttack(self)
794
- unitInterruptAttack(self.handle)
795
- end
796
1016
  function Unit.prototype.interruptCast(self, abilityId)
797
- unitDisableAbility(self.handle, abilityId, true, false)
798
- unitDisableAbility(self.handle, abilityId, false, false)
1017
+ local handle = self.handle
1018
+ unitDisableAbility(handle, abilityId, true, false)
1019
+ Timer:run(
1020
+ unitDisableAbility,
1021
+ handle,
1022
+ abilityId,
1023
+ false,
1024
+ false
1025
+ )
799
1026
  end
800
1027
  function Unit.prototype.getDistanceTo(self, target)
801
1028
  local handle = self.handle
@@ -855,18 +1082,44 @@ function Unit.prototype.unpauseEx(self)
855
1082
  self:decrementStunCounter()
856
1083
  end
857
1084
  function Unit.prototype.incrementStunCounter(self)
858
- local stunCounter = self[101] or 0
859
- if not self[100] or stunCounter >= 0 then
1085
+ local stunCounter = self[102] or 0
1086
+ if not self[101] and (self[103] or 0) <= 0 or stunCounter >= 0 then
860
1087
  BlzPauseUnitEx(self.handle, true)
861
1088
  end
862
- self[101] = stunCounter + 1
1089
+ self[102] = stunCounter + 1
863
1090
  end
864
1091
  function Unit.prototype.decrementStunCounter(self)
865
- local stunCounter = self[101] or 0
866
- if not self[100] or stunCounter >= 1 then
1092
+ local stunCounter = self[102] or 0
1093
+ if not self[101] and (self[103] or 0) <= 0 or stunCounter >= 1 then
867
1094
  BlzPauseUnitEx(self.handle, false)
868
1095
  end
869
- self[101] = stunCounter - 1
1096
+ self[102] = stunCounter - 1
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
870
1123
  end
871
1124
  function Unit.create(self, owner, id, x, y, facing, skinId)
872
1125
  local handle = skinId and BlzCreateUnitWithSkin(
@@ -968,8 +1221,11 @@ function Unit.getInSector(self, pos, range, offsetAngle, centralAngle)
968
1221
  )
969
1222
  return targetCollection
970
1223
  end
971
- function Unit.getSelectionOf(self, player)
972
- targetCollection = {}
1224
+ function Unit.getSelectionOf(self, player, target)
1225
+ if target == nil then
1226
+ target = {}
1227
+ end
1228
+ targetCollection = target
973
1229
  targetCollectionNextIndex = 1
974
1230
  GroupEnumUnitsSelected(dummyGroup, player.handle, collectIntoTarget)
975
1231
  return targetCollection
@@ -991,6 +1247,9 @@ end
991
1247
  function Unit.prototype.__tostring(self)
992
1248
  return (((self.constructor.name .. "$") .. util.id2s(self.typeId)) .. "@") .. tostring(getHandleId(self.handle))
993
1249
  end
1250
+ function Unit.getBySyncId(self, syncId)
1251
+ return unitBySyncId[syncId]
1252
+ end
994
1253
  __TS__SetDescriptor(
995
1254
  Unit.prototype,
996
1255
  "_deltas",
@@ -1050,7 +1309,15 @@ __TS__SetDescriptor(
1050
1309
  Unit.prototype,
1051
1310
  "isIllusion",
1052
1311
  {get = function(self)
1053
- 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")
1054
1321
  end},
1055
1322
  true
1056
1323
  )
@@ -1071,12 +1338,27 @@ __TS__SetDescriptor(
1071
1338
  Unit.prototype,
1072
1339
  "weapons",
1073
1340
  {get = function(self)
1074
- local weapons = {
1075
- setmetatable({h = self.handle, i = 0}, weaponMetatable),
1076
- setmetatable({h = self.handle, i = 1}, weaponMetatable)
1077
- }
1078
- rawset(self, "weapons", weapons)
1079
- return weapons
1341
+ return {self.firstWeapon, self.secondWeapon}
1342
+ end},
1343
+ true
1344
+ )
1345
+ __TS__SetDescriptor(
1346
+ Unit.prototype,
1347
+ "firstWeapon",
1348
+ {get = function(self)
1349
+ local weapon = __TS__New(____exports.UnitWeapon, self, 0)
1350
+ rawset(self, "firstWeapon", weapon)
1351
+ return weapon
1352
+ end},
1353
+ true
1354
+ )
1355
+ __TS__SetDescriptor(
1356
+ Unit.prototype,
1357
+ "secondWeapon",
1358
+ {get = function(self)
1359
+ local weapon = __TS__New(____exports.UnitWeapon, self, 1)
1360
+ rawset(self, "secondWeapon", weapon)
1361
+ return weapon
1080
1362
  end},
1081
1363
  true
1082
1364
  )
@@ -1114,13 +1396,13 @@ __TS__SetDescriptor(
1114
1396
  )
1115
1397
  __TS__SetDescriptor(
1116
1398
  Unit.prototype,
1117
- "strengthBase",
1399
+ "primaryAttribute",
1118
1400
  {
1119
1401
  get = function(self)
1120
- return getHeroStr(self.handle, false)
1402
+ return getUnitIntegerField(self.handle, UNIT_IF_PRIMARY_ATTRIBUTE)
1121
1403
  end,
1122
- set = function(self, strengthBase)
1123
- setHeroStr(self.handle, strengthBase, true)
1404
+ set = function(self, primaryAttribute)
1405
+ setUnitIntegerField(self.handle, UNIT_IF_PRIMARY_ATTRIBUTE, primaryAttribute)
1124
1406
  end
1125
1407
  },
1126
1408
  true
@@ -1142,19 +1424,6 @@ __TS__SetDescriptor(
1142
1424
  end},
1143
1425
  true
1144
1426
  )
1145
- __TS__SetDescriptor(
1146
- Unit.prototype,
1147
- "agilityBase",
1148
- {
1149
- get = function(self)
1150
- return getHeroAgi(self.handle, false)
1151
- end,
1152
- set = function(self, agilityBase)
1153
- setHeroAgi(self.handle, agilityBase, true)
1154
- end
1155
- },
1156
- true
1157
- )
1158
1427
  __TS__SetDescriptor(
1159
1428
  Unit.prototype,
1160
1429
  "agilityBonus",
@@ -1172,19 +1441,6 @@ __TS__SetDescriptor(
1172
1441
  end},
1173
1442
  true
1174
1443
  )
1175
- __TS__SetDescriptor(
1176
- Unit.prototype,
1177
- "intelligenceBase",
1178
- {
1179
- get = function(self)
1180
- return getHeroInt(self.handle, false)
1181
- end,
1182
- set = function(self, intelligenceBase)
1183
- setHeroInt(self.handle, intelligenceBase, true)
1184
- end
1185
- },
1186
- true
1187
- )
1188
1444
  __TS__SetDescriptor(
1189
1445
  Unit.prototype,
1190
1446
  "intelligenceBonus",
@@ -1233,17 +1489,17 @@ __TS__SetDescriptor(
1233
1489
  "isTeamGlowVisible",
1234
1490
  {
1235
1491
  get = function(self)
1236
- return not self[103]
1492
+ return not self[107]
1237
1493
  end,
1238
1494
  set = function(self, isTeamGlowVisible)
1239
- showUnitTeamGlow(self.handle, isTeamGlowVisible)
1240
- local ____temp_2
1495
+ BlzShowUnitTeamGlow(self.handle, isTeamGlowVisible)
1496
+ local ____temp_7
1241
1497
  if not isTeamGlowVisible then
1242
- ____temp_2 = true
1498
+ ____temp_7 = true
1243
1499
  else
1244
- ____temp_2 = nil
1500
+ ____temp_7 = nil
1245
1501
  end
1246
- self[103] = ____temp_2
1502
+ self[107] = ____temp_7
1247
1503
  end
1248
1504
  },
1249
1505
  true
@@ -1252,9 +1508,9 @@ __TS__SetDescriptor(
1252
1508
  Unit.prototype,
1253
1509
  "color",
1254
1510
  {set = function(self, color)
1255
- setUnitColor(self.handle, color.handle)
1256
- if self[103] then
1257
- showUnitTeamGlow(self.handle, false)
1511
+ SetUnitColor(self.handle, color.handle)
1512
+ if self[107] then
1513
+ BlzShowUnitTeamGlow(self.handle, false)
1258
1514
  end
1259
1515
  end},
1260
1516
  true
@@ -1277,10 +1533,14 @@ __TS__SetDescriptor(
1277
1533
  "maxHealth",
1278
1534
  {
1279
1535
  get = function(self)
1280
- return BlzGetUnitMaxHP(self.handle) - (self[102] or 0)
1536
+ return BlzGetUnitMaxHP(self.handle) - (self[105] or 0) - (self[106] or 0)
1281
1537
  end,
1282
1538
  set = function(self, maxHealth)
1283
- BlzSetUnitMaxHP(self.handle, maxHealth + (self[102] or 0))
1539
+ if maxHealth < 1 and self[104] ~= nil then
1540
+ self[105] = (self[105] or 0) + (1 - maxHealth)
1541
+ maxHealth = 1
1542
+ end
1543
+ BlzSetUnitMaxHP(self.handle, maxHealth + (self[106] or 0))
1284
1544
  end
1285
1545
  },
1286
1546
  true
@@ -1322,10 +1582,10 @@ __TS__SetDescriptor(
1322
1582
  "health",
1323
1583
  {
1324
1584
  get = function(self)
1325
- return GetWidgetLife(self.handle) - (self[102] or 0)
1585
+ return GetWidgetLife(self.handle) - (self[106] or 0)
1326
1586
  end,
1327
1587
  set = function(self, health)
1328
- SetWidgetLife(self.handle, health + (self[102] or 0))
1588
+ SetWidgetLife(self.handle, health + (self[106] or 0))
1329
1589
  end
1330
1590
  },
1331
1591
  true
@@ -1401,25 +1661,12 @@ __TS__SetDescriptor(
1401
1661
  },
1402
1662
  true
1403
1663
  )
1404
- __TS__SetDescriptor(
1405
- Unit.prototype,
1406
- "flyHeight",
1407
- {
1408
- get = function(self)
1409
- return getUnitFlyHeight(self.handle)
1410
- end,
1411
- set = function(self, v)
1412
- SetUnitFlyHeight(self.handle, v, 100000)
1413
- end
1414
- },
1415
- true
1416
- )
1417
1664
  __TS__SetDescriptor(
1418
1665
  Unit.prototype,
1419
1666
  "x",
1420
1667
  {
1421
1668
  get = function(self)
1422
- return getUnitX(self.handle)
1669
+ return self[108] or getUnitX(self.handle)
1423
1670
  end,
1424
1671
  set = function(self, v)
1425
1672
  SetUnitX(self.handle, v)
@@ -1432,7 +1679,7 @@ __TS__SetDescriptor(
1432
1679
  "y",
1433
1680
  {
1434
1681
  get = function(self)
1435
- return getUnitY(self.handle)
1682
+ return self[109] or getUnitY(self.handle)
1436
1683
  end,
1437
1684
  set = function(self, v)
1438
1685
  SetUnitY(self.handle, v)
@@ -1518,10 +1765,10 @@ __TS__SetDescriptor(
1518
1765
  "gold",
1519
1766
  {
1520
1767
  get = function(self)
1521
- return getResourceAmount(self.handle)
1768
+ return GetResourceAmount(self.handle)
1522
1769
  end,
1523
1770
  set = function(self, gold)
1524
- setResourceAmount(self.handle, gold)
1771
+ SetResourceAmount(self.handle, gold)
1525
1772
  end
1526
1773
  },
1527
1774
  true
@@ -1536,17 +1783,21 @@ __TS__SetDescriptor(
1536
1783
  set = function(self, isPaused)
1537
1784
  local handle = self.handle
1538
1785
  if isPaused and not IsUnitPaused(handle) then
1539
- self[100] = true
1540
- for _ = self[101] or 0, -1 do
1541
- BlzPauseUnitEx(handle, true)
1786
+ self[101] = true
1787
+ if (self[103] or 0) <= 0 then
1788
+ for _ = self[102] or 0, -1 do
1789
+ BlzPauseUnitEx(handle, true)
1790
+ end
1542
1791
  end
1543
1792
  PauseUnit(handle, true)
1544
1793
  elseif not isPaused and IsUnitPaused(handle) then
1545
1794
  PauseUnit(handle, false)
1546
- for _ = self[101] or 0, -1 do
1547
- 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
1548
1799
  end
1549
- self[100] = nil
1800
+ self[101] = nil
1550
1801
  end
1551
1802
  end
1552
1803
  },
@@ -1602,20 +1853,6 @@ __TS__SetDescriptor(
1602
1853
  },
1603
1854
  true
1604
1855
  )
1605
- __TS__SetDescriptor(
1606
- Unit.prototype,
1607
- "scale",
1608
- {
1609
- get = function(self)
1610
- return getUnitRealField(self.handle, UNIT_RF_SCALING_VALUE)
1611
- end,
1612
- set = function(self, v)
1613
- setUnitScale(self.handle, v, v, v)
1614
- setUnitRealField(self.handle, UNIT_RF_SCALING_VALUE, v)
1615
- end
1616
- },
1617
- true
1618
- )
1619
1856
  __TS__SetDescriptor(
1620
1857
  Unit.prototype,
1621
1858
  "timeScale",
@@ -1649,6 +1886,19 @@ __TS__SetDescriptor(
1649
1886
  end},
1650
1887
  true
1651
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
+ )
1652
1902
  __TS__SetDescriptor(
1653
1903
  Unit.prototype,
1654
1904
  "pathing",
@@ -1739,30 +1989,6 @@ __TS__SetDescriptor(
1739
1989
  end},
1740
1990
  true
1741
1991
  )
1742
- __TS__SetDescriptor(
1743
- Unit.prototype,
1744
- "onUnitInRange",
1745
- {get = function(self)
1746
- local handle = self.handle
1747
- local onUnitInRange = setmetatable(
1748
- {},
1749
- {__index = function(self, value)
1750
- local event = __TS__New(
1751
- TriggerEvent,
1752
- function(trigger)
1753
- TriggerRegisterUnitInRangeSimple(trigger, value, handle)
1754
- end,
1755
- function() return ____exports.Unit:of(handle) end
1756
- )
1757
- rawset(self, value, event)
1758
- return event
1759
- end}
1760
- )
1761
- rawset(self, "onUnitInRange", onUnitInRange)
1762
- return onUnitInRange
1763
- end},
1764
- true
1765
- )
1766
1992
  __TS__SetDescriptor(
1767
1993
  Unit.prototype,
1768
1994
  "onManaEqual",
@@ -1830,6 +2056,14 @@ __TS__SetDescriptor(
1830
2056
  end},
1831
2057
  true
1832
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
+ )
1833
2067
  __TS__SetDescriptor(
1834
2068
  Unit.prototype,
1835
2069
  "onSelect",
@@ -1890,6 +2124,11 @@ __TS__SetDescriptor(
1890
2124
  end},
1891
2125
  true
1892
2126
  )
2127
+ Unit.levelChangedEvent = __TS__New(
2128
+ ____exports.UnitTriggerEvent,
2129
+ EVENT_PLAYER_HERO_LEVEL,
2130
+ function() return ____exports.Unit:of(getTriggerUnit()) end
2131
+ )
1893
2132
  Unit.deathEvent = __TS__New(
1894
2133
  ____exports.UnitTriggerEvent,
1895
2134
  EVENT_PLAYER_UNIT_DEATH,
@@ -1903,7 +2142,6 @@ Unit.onDecay = __TS__New(
1903
2142
  Unit.onResurrect = __TS__New(
1904
2143
  InitializingEvent,
1905
2144
  function(event)
1906
- local invoke = Event.invoke
1907
2145
  local dead = setmetatable({}, {__mode = "k"})
1908
2146
  ____exports.Unit.deathEvent:addListener(function(unit)
1909
2147
  dead[unit] = true
@@ -1919,10 +2157,15 @@ Unit.onResurrect = __TS__New(
1919
2157
  Unit.morphEvent = __TS__New(
1920
2158
  InitializingEvent,
1921
2159
  function(event)
2160
+ local function ifNotLeft(unit)
2161
+ local handle = unit.handle
2162
+ if getUnitAbilityLevel(handle, leaveDetectAbilityId) ~= 0 and unitAddAbility(handle, morphDetectAbilityId) then
2163
+ invoke(event, unit)
2164
+ end
2165
+ end
1922
2166
  ____exports.Unit.onImmediateOrder[orderId("undefend")]:addListener(function(unit)
1923
2167
  if getUnitAbilityLevel(unit.handle, morphDetectAbilityId) == 0 then
1924
- assert(unitAddAbility(unit.handle, morphDetectAbilityId))
1925
- Timer:run(Event.invoke, event, unit)
2168
+ Timer:run(ifNotLeft, unit)
1926
2169
  end
1927
2170
  end)
1928
2171
  end
@@ -1960,27 +2203,26 @@ Unit.onSpellEffect = dispatchId(__TS__New(
1960
2203
  Unit.onTargetCast = dispatchId(__TS__New(
1961
2204
  InitializingEvent,
1962
2205
  function(event)
1963
- local invoke = Event.invoke
1964
2206
  local function listener(unit, id)
1965
- local ____GetSpellTargetUnit_result_5
2207
+ local ____GetSpellTargetUnit_result_10
1966
2208
  if GetSpellTargetUnit() then
1967
- ____GetSpellTargetUnit_result_5 = ____exports.Unit:of(GetSpellTargetUnit())
2209
+ ____GetSpellTargetUnit_result_10 = ____exports.Unit:of(GetSpellTargetUnit())
1968
2210
  else
1969
- local ____GetSpellTargetItem_result_4
2211
+ local ____GetSpellTargetItem_result_9
1970
2212
  if GetSpellTargetItem() then
1971
- ____GetSpellTargetItem_result_4 = Item:of(GetSpellTargetItem())
2213
+ ____GetSpellTargetItem_result_9 = Item:of(GetSpellTargetItem())
1972
2214
  else
1973
- local ____GetSpellTargetDestructable_result_3
2215
+ local ____GetSpellTargetDestructable_result_8
1974
2216
  if GetSpellTargetDestructable() then
1975
- ____GetSpellTargetDestructable_result_3 = Destructable:of(GetSpellTargetDestructable())
2217
+ ____GetSpellTargetDestructable_result_8 = Destructable:of(GetSpellTargetDestructable())
1976
2218
  else
1977
- ____GetSpellTargetDestructable_result_3 = nil
2219
+ ____GetSpellTargetDestructable_result_8 = nil
1978
2220
  end
1979
- ____GetSpellTargetItem_result_4 = ____GetSpellTargetDestructable_result_3
2221
+ ____GetSpellTargetItem_result_9 = ____GetSpellTargetDestructable_result_8
1980
2222
  end
1981
- ____GetSpellTargetUnit_result_5 = ____GetSpellTargetItem_result_4
2223
+ ____GetSpellTargetUnit_result_10 = ____GetSpellTargetItem_result_9
1982
2224
  end
1983
- local target = ____GetSpellTargetUnit_result_5
2225
+ local target = ____GetSpellTargetUnit_result_10
1984
2226
  if target then
1985
2227
  invoke(event, unit, id, target)
1986
2228
  end
@@ -2152,10 +2394,12 @@ Unit.onImmediateOrder = dispatchId(__TS__New(
2152
2394
  ____exports.UnitTriggerEvent,
2153
2395
  EVENT_PLAYER_UNIT_ISSUED_ORDER,
2154
2396
  function()
2155
- local unit = ____exports.Unit:of(getOrderedUnit())
2156
- local issuedOrderId = getIssuedOrderId()
2157
- if unit ~= nil and unit.state == 1 then
2158
- return unit, issuedOrderId
2397
+ local handle = getOrderedUnit()
2398
+ if handle ~= nil and getUnitTypeId(handle) ~= dummyUnitId then
2399
+ local unit = ____exports.Unit:of(handle)
2400
+ if unit.state == 1 then
2401
+ return unit, getIssuedOrderId()
2402
+ end
2159
2403
  end
2160
2404
  return IgnoreEvent
2161
2405
  end
@@ -2177,7 +2421,6 @@ Unit.autoAttackStartEvent = __TS__New(
2177
2421
  )
2178
2422
  Unit.onDamaging = (function()
2179
2423
  local event = __TS__New(Event)
2180
- local invoke = Event.invoke
2181
2424
  local trigger = CreateTrigger()
2182
2425
  TriggerRegisterAnyUnitEventBJ(trigger, EVENT_PLAYER_UNIT_DAMAGING)
2183
2426
  TriggerAddCondition(
@@ -2187,38 +2430,57 @@ Unit.onDamaging = (function()
2187
2430
  if source and source.typeId == dummyUnitId then
2188
2431
  source = nil
2189
2432
  end
2190
- local target = BlzGetEventDamageTarget()
2433
+ local target = ____exports.Unit:of(BlzGetEventDamageTarget())
2434
+ local metadata = damageMetadataByTarget[target]
2435
+ damageMetadataByTarget[target] = nil
2191
2436
  local data = {
2192
2437
  amount = GetEventDamage(),
2193
- attackType = BlzGetEventAttackType(),
2438
+ attackType = nativeToAttackType(BlzGetEventAttackType()),
2194
2439
  damageType = BlzGetEventDamageType(),
2195
2440
  weaponType = BlzGetEventWeaponType(),
2196
- isAttack = BlzGetEventIsAttack()
2441
+ metadata = metadata,
2442
+ isAttack = BlzGetEventIsAttack(),
2443
+ originalAmount = GetEventDamage(),
2444
+ originalMetadata = metadata,
2445
+ preventRetaliation = damagingEventPreventRetaliation
2197
2446
  }
2198
2447
  if data.isAttack and source then
2199
- 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
2200
- if weapon == -1 then
2201
- local targetsAllowed = BlzGetUnitWeaponIntegerField(source.handle, UNIT_WEAPON_IF_ATTACK_TARGETS_ALLOWED, 0)
2202
- weapon = 0
2203
- end
2204
- data.weapon = assert(source.weapons[weapon + 1])
2448
+ data.weapon = source:chooseWeapon(target)
2205
2449
  end
2206
2450
  if not data.isAttack or not source or not source._attackHandlers then
2207
2451
  invoke(
2208
2452
  event,
2209
2453
  source,
2210
- ____exports.Unit:of(target),
2454
+ target,
2211
2455
  setmetatable(
2212
2456
  {},
2213
2457
  {
2214
2458
  __index = data,
2215
2459
  __newindex = function(self, key, value)
2216
- damageSetters[key](value)
2460
+ local damageSetter = damageSetters[key]
2461
+ if damageSetter ~= nil then
2462
+ damageSetter(value)
2463
+ end
2217
2464
  data[key] = value
2218
2465
  end
2219
2466
  }
2220
2467
  )
2221
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
2222
2484
  return
2223
2485
  end
2224
2486
  BlzSetEventDamage(0)
@@ -2226,7 +2488,7 @@ Unit.onDamaging = (function()
2226
2488
  BlzSetEventDamageType(DAMAGE_TYPE_UNKNOWN)
2227
2489
  BlzSetEventWeaponType(WEAPON_TYPE_WHOKNOWS)
2228
2490
  local sourceOwner = source.owner.handle
2229
- local targetOwner = GetOwningPlayer(target)
2491
+ local targetOwner = target.owner.handle
2230
2492
  if not GetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE) then
2231
2493
  SetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE, true)
2232
2494
  Timer:run(function()
@@ -2242,23 +2504,19 @@ Unit.onDamaging = (function()
2242
2504
  for ____, ____value in ipairs(source._attackHandlers) do
2243
2505
  local condition = ____value[1]
2244
2506
  local action = ____value[2]
2245
- if condition(
2246
- source,
2247
- ____exports.Unit:of(target),
2248
- data
2249
- ) then
2507
+ if condition(source, target, data) then
2250
2508
  action(
2251
2509
  source,
2252
- ____exports.Unit:of(target),
2510
+ target,
2253
2511
  setmetatable(
2254
2512
  {fire = function()
2255
2513
  UnitDamageTarget(
2256
2514
  source.handle,
2257
- target,
2515
+ target.handle,
2258
2516
  data.amount,
2259
2517
  true,
2260
2518
  true,
2261
- data.attackType,
2519
+ attackTypeToNative(data.attackType),
2262
2520
  data.damageType,
2263
2521
  data.weaponType
2264
2522
  )
@@ -2276,7 +2534,6 @@ end)()
2276
2534
  Unit.onDamage = __TS__New(
2277
2535
  InitializingEvent,
2278
2536
  function(event)
2279
- local invoke = Event.invoke
2280
2537
  local trigger = CreateTrigger()
2281
2538
  TriggerRegisterAnyUnitEventBJ(trigger, EVENT_PLAYER_UNIT_DAMAGED)
2282
2539
  TriggerAddCondition(
@@ -2286,29 +2543,54 @@ Unit.onDamage = __TS__New(
2286
2543
  if source and source.typeId == dummyUnitId then
2287
2544
  source = nil
2288
2545
  end
2546
+ local target = ____exports.Unit:of(BlzGetEventDamageTarget())
2547
+ local damagingEvent = damagingEventByTarget[target]
2548
+ damagingEventByTarget[target] = nil
2289
2549
  local data = {
2290
2550
  amount = GetEventDamage(),
2291
- attackType = BlzGetEventAttackType(),
2551
+ attackType = nativeToAttackType(BlzGetEventAttackType()),
2292
2552
  damageType = BlzGetEventDamageType(),
2293
2553
  weaponType = BlzGetEventWeaponType(),
2554
+ metadata = damagingEvent and damagingEvent.metadata,
2294
2555
  isAttack = BlzGetEventIsAttack(),
2556
+ originalAmount = damagingEvent and damagingEvent.originalAmount or GetEventDamage(),
2557
+ originalMetadata = damagingEvent and damagingEvent.originalMetadata,
2295
2558
  preventDeath = damageEventPreventDeath
2296
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
2297
2577
  local evData = setmetatable(
2298
2578
  {},
2299
2579
  {
2300
2580
  __index = data,
2301
2581
  __newindex = function(self, key, value)
2302
- damageSetters[key](value)
2582
+ local damageSetter = damageSetters[key]
2583
+ if damageSetter ~= nil then
2584
+ damageSetter(value)
2585
+ end
2303
2586
  data[key] = value
2304
2587
  end
2305
2588
  }
2306
2589
  )
2307
- local target = ____exports.Unit:of(BlzGetEventDamageTarget())
2308
2590
  invoke(event, source, target, evData)
2309
2591
  if evData[0] ~= nil and target.health - evData.amount < 0.405 then
2310
2592
  local bonusHealth = math.ceil(evData.amount)
2311
- target[102] = (target[102] or 0) + bonusHealth
2593
+ target[106] = (target[106] or 0) + bonusHealth
2312
2594
  BlzSetUnitMaxHP(
2313
2595
  target.handle,
2314
2596
  BlzGetUnitMaxHP(target.handle) + bonusHealth
@@ -2322,7 +2604,7 @@ Unit.onDamage = __TS__New(
2322
2604
  evData[0],
2323
2605
  table.unpack(evData, 1 + 1, 1 + (evData[1] or 0))
2324
2606
  )
2325
- target[102] = (target[102] or 0) - bonusHealth
2607
+ target[106] = (target[106] or 0) - bonusHealth
2326
2608
  SetWidgetLife(
2327
2609
  target.handle,
2328
2610
  GetWidgetLife(target.handle) - bonusHealth
@@ -2342,32 +2624,110 @@ Unit.onDamage = __TS__New(
2342
2624
  DestroyTrigger(trigger)
2343
2625
  end
2344
2626
  )
2345
- Unit.onItemDrop = __TS__New(
2627
+ Unit.itemDroppedEvent = __TS__New(
2346
2628
  ____exports.UnitTriggerEvent,
2347
2629
  EVENT_PLAYER_UNIT_DROP_ITEM,
2348
2630
  function()
2349
2631
  local unit = getTriggerUnit()
2350
- if getUnitTypeId(unit) ~= dummyUnitId then
2351
- 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)
2352
2635
  end
2353
2636
  return IgnoreEvent
2354
2637
  end
2355
2638
  )
2356
- Unit.onItemPickup = __TS__New(
2639
+ Unit.itemPickedUpEvent = __TS__New(
2357
2640
  ____exports.UnitTriggerEvent,
2358
2641
  EVENT_PLAYER_UNIT_PICKUP_ITEM,
2359
2642
  function()
2360
- local unit = getTriggerUnit()
2361
- if getUnitTypeId(unit) ~= dummyUnitId then
2362
- 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
2363
2651
  end
2364
2652
  return IgnoreEvent
2365
2653
  end
2366
2654
  )
2367
- Unit.onItemUse = __TS__New(
2655
+ Unit.itemUsedEvent = __TS__New(
2368
2656
  ____exports.UnitTriggerEvent,
2369
2657
  EVENT_PLAYER_UNIT_USE_ITEM,
2370
- function() return ____exports.Unit:of(GetTriggerUnit()), Item:of(GetManipulatedItem()) end
2658
+ function()
2659
+ local unit = getTriggerUnit()
2660
+ local item = getManipulatedItem()
2661
+ if getUnitTypeId(unit) ~= dummyUnitId and not (ignoreEventsItems[item] ~= nil) then
2662
+ return ____exports.Unit:of(unit), Item:of(item)
2663
+ end
2664
+ return IgnoreEvent
2665
+ end
2666
+ )
2667
+ Unit.itemStackedEvent = __TS__New(
2668
+ ____exports.UnitTriggerEvent,
2669
+ EVENT_PLAYER_UNIT_STACK_ITEM,
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}
2686
+ )
2687
+ __TS__ObjectDefineProperty(
2688
+ Unit,
2689
+ "itemUseOrderEvent",
2690
+ {get = function(self)
2691
+ local event = __TS__New(Event)
2692
+ for order = orderId("useslot0"), orderId("useslot5") do
2693
+ local slot = order - orderId("useslot0")
2694
+ local function listener(unit)
2695
+ local item = unit.items[slot + 1]
2696
+ if item ~= nil then
2697
+ invoke(event, unit, item)
2698
+ end
2699
+ end
2700
+ self.onImmediateOrder[order]:addListener(listener)
2701
+ self.onTargetOrder[order]:addListener(listener)
2702
+ self.onPointOrder[order]:addListener(listener)
2703
+ end
2704
+ rawset(self, "itemUseOrderEvent", event)
2705
+ return event
2706
+ end}
2707
+ )
2708
+ __TS__ObjectDefineProperty(
2709
+ Unit,
2710
+ "itemMoveOrderEvent",
2711
+ {get = function(self)
2712
+ local event = __TS__New(Event)
2713
+ for order = orderId("moveslot0"), orderId("moveslot5") do
2714
+ local slotTo = order - orderId("moveslot0")
2715
+ self.onTargetOrder[order]:addListener(function(unit, item)
2716
+ local slotFrom = unit.items:findSlot(item)
2717
+ if slotFrom ~= nil then
2718
+ invoke(
2719
+ event,
2720
+ unit,
2721
+ item,
2722
+ slotFrom,
2723
+ slotTo
2724
+ )
2725
+ end
2726
+ end)
2727
+ end
2728
+ rawset(self, "itemMoveOrderEvent", event)
2729
+ return event
2730
+ end}
2371
2731
  )
2372
2732
  __TS__ObjectDefineProperty(
2373
2733
  Unit,
@@ -2394,6 +2754,10 @@ __TS__ObjectDefineProperty(
2394
2754
  rawset(self, "destroyEvent", destroyEvent)
2395
2755
  return destroyEvent
2396
2756
  end}
2757
+ )
2758
+ Unit.synchronize = synchronizer(
2759
+ function(unit) return unit.syncId end,
2760
+ function(syncId) return unitBySyncId[syncId] end
2397
2761
  );
2398
2762
  (function(self)
2399
2763
  local leaveAbilityIds = postcompile(function()
@@ -2423,7 +2787,8 @@ __TS__ObjectDefineProperty(
2423
2787
  return
2424
2788
  end
2425
2789
  end
2426
- unit:destroy()
2790
+ unit:saveData()
2791
+ Timer:run(unit, "destroy")
2427
2792
  end)
2428
2793
  end
2429
2794
  end)(Unit)