warscript 0.0.1-dev.f0a9ffe → 0.0.1-dev.f0daa48

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 (132) hide show
  1. package/attributes.d.ts +1 -0
  2. package/attributes.lua +9 -0
  3. package/core/types/frame.lua +24 -21
  4. package/core/types/player.d.ts +16 -0
  5. package/core/types/player.lua +60 -15
  6. package/core/types/playerCamera.d.ts +2 -0
  7. package/core/types/playerCamera.lua +123 -5
  8. package/core/types/sound.lua +1 -1
  9. package/core/types/tileCell.d.ts +11 -1
  10. package/core/types/tileCell.lua +97 -0
  11. package/core/types/timer.d.ts +3 -2
  12. package/core/types/timer.lua +22 -2
  13. package/decl/native.d.ts +2 -2
  14. package/destroyable.d.ts +1 -0
  15. package/destroyable.lua +9 -0
  16. package/engine/behavior.d.ts +12 -1
  17. package/engine/behavior.lua +199 -65
  18. package/engine/behaviour/ability/apply-buff.lua +4 -4
  19. package/engine/behaviour/ability/remove-buffs.d.ts +9 -0
  20. package/engine/behaviour/ability/remove-buffs.lua +21 -0
  21. package/engine/behaviour/ability.d.ts +11 -6
  22. package/engine/behaviour/ability.lua +31 -1
  23. package/engine/behaviour/unit/stun-immunity.d.ts +9 -5
  24. package/engine/behaviour/unit/stun-immunity.lua +17 -7
  25. package/engine/behaviour/unit.d.ts +15 -5
  26. package/engine/behaviour/unit.lua +126 -22
  27. package/engine/buff.d.ts +64 -21
  28. package/engine/buff.lua +360 -178
  29. package/engine/internal/ability.d.ts +3 -1
  30. package/engine/internal/ability.lua +26 -9
  31. package/engine/internal/item+owner.lua +12 -6
  32. package/engine/internal/item.d.ts +13 -15
  33. package/engine/internal/item.lua +63 -49
  34. package/engine/internal/mechanics/cast-ability.lua +6 -3
  35. package/engine/internal/misc/frame-coordinates.lua +21 -0
  36. package/engine/internal/misc/get-terrain-z.d.ts +2 -0
  37. package/engine/internal/misc/get-terrain-z.lua +11 -0
  38. package/engine/internal/misc/player-local-handle.d.ts +2 -0
  39. package/engine/internal/misc/player-local-handle.lua +5 -0
  40. package/engine/internal/object-data/armor-bonus.d.ts +2 -0
  41. package/engine/internal/object-data/attribute-bonus.lua +2 -2
  42. package/engine/internal/object-data/health-bonus.d.ts +2 -0
  43. package/engine/internal/object-data/health-bonus.lua +16 -0
  44. package/engine/internal/object-data/mana-bonus.d.ts +2 -0
  45. package/engine/internal/object-data/mana-bonus.lua +16 -0
  46. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.d.ts +2 -0
  47. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.lua +16 -0
  48. package/engine/internal/unit/ability.d.ts +14 -14
  49. package/engine/internal/unit/ability.lua +72 -45
  50. package/engine/internal/unit/attributes.d.ts +17 -0
  51. package/engine/internal/unit/attributes.lua +46 -0
  52. package/engine/internal/unit/bonus.d.ts +6 -0
  53. package/engine/internal/unit/bonus.lua +33 -3
  54. package/engine/internal/unit/fly-height.d.ts +7 -0
  55. package/engine/internal/unit/fly-height.lua +20 -0
  56. package/engine/internal/unit/interrupts.d.ts +12 -0
  57. package/engine/internal/unit/interrupts.lua +28 -0
  58. package/engine/internal/unit/item.lua +1 -1
  59. package/engine/internal/unit/main-selected.lua +12 -27
  60. package/engine/internal/unit/range-event.d.ts +12 -0
  61. package/engine/internal/unit/range-event.lua +90 -0
  62. package/engine/internal/unit/scale.d.ts +7 -0
  63. package/engine/internal/unit/scale.lua +20 -0
  64. package/engine/internal/unit+ability.lua +10 -1
  65. package/engine/internal/unit+bonus.lua +3 -3
  66. package/engine/internal/unit-missile-launch.lua +51 -20
  67. package/engine/internal/unit.d.ts +18 -22
  68. package/engine/internal/unit.lua +179 -200
  69. package/engine/local-client.d.ts +2 -0
  70. package/engine/local-client.lua +30 -0
  71. package/engine/object-data/auxiliary/health-regeneration-type.d.ts +8 -0
  72. package/engine/object-data/auxiliary/health-regeneration-type.lua +2 -0
  73. package/engine/object-data/auxiliary/unit-attribute.lua +1 -1
  74. package/engine/object-data/entry/ability-type/{armor-increase.d.ts → armor-bonus.d.ts} +3 -3
  75. package/engine/object-data/entry/ability-type/{armor-increase.lua → armor-bonus.lua} +9 -9
  76. package/engine/object-data/entry/ability-type/health-bonus.d.ts +8 -0
  77. package/engine/object-data/entry/ability-type/health-bonus.lua +26 -0
  78. package/engine/object-data/entry/ability-type/mana-bonus.d.ts +8 -0
  79. package/engine/object-data/entry/ability-type/mana-bonus.lua +26 -0
  80. package/engine/object-data/entry/ability-type/mana-regeneration.d.ts +8 -0
  81. package/engine/object-data/entry/ability-type/mana-regeneration.lua +26 -0
  82. package/engine/object-data/entry/ability-type/reincarnation.d.ts +8 -0
  83. package/engine/object-data/entry/ability-type/reincarnation.lua +26 -0
  84. package/engine/object-data/entry/ability-type.d.ts +2 -0
  85. package/engine/object-data/entry/ability-type.lua +88 -5
  86. package/engine/object-data/entry/buff-type/applicable.lua +113 -109
  87. package/engine/object-data/entry/destructible-type.d.ts +27 -1
  88. package/engine/object-data/entry/destructible-type.lua +155 -0
  89. package/engine/object-data/entry/unit-type.d.ts +4 -0
  90. package/engine/object-data/entry/unit-type.lua +76 -32
  91. package/engine/object-field/ability.d.ts +3 -3
  92. package/engine/object-field/ability.lua +9 -8
  93. package/engine/object-field/unit.d.ts +20 -5
  94. package/engine/object-field/unit.lua +61 -0
  95. package/engine/object-field.d.ts +12 -4
  96. package/engine/object-field.lua +273 -126
  97. package/engine/random.d.ts +10 -0
  98. package/engine/random.lua +21 -0
  99. package/engine/standard/fields/ability.d.ts +2 -2
  100. package/engine/standard/fields/ability.lua +2 -2
  101. package/engine/standard/fields/unit.d.ts +11 -3
  102. package/engine/standard/fields/unit.lua +15 -2
  103. package/engine/synchronization.d.ts +11 -0
  104. package/engine/synchronization.lua +77 -0
  105. package/engine/text-tag.d.ts +1 -1
  106. package/engine/text-tag.lua +92 -17
  107. package/engine/unit.d.ts +5 -0
  108. package/engine/unit.lua +5 -0
  109. package/lualib_bundle.lua +118 -47
  110. package/net/socket.lua +1 -1
  111. package/objutil/buff.lua +10 -8
  112. package/objutil/object.lua +1 -1
  113. package/operation.lua +23 -17
  114. package/package.json +5 -5
  115. package/patch-lua.lua +15 -0
  116. package/patch-lualib.lua +1 -1
  117. package/utility/arrays.d.ts +1 -0
  118. package/utility/arrays.lua +8 -0
  119. package/utility/callback-array.d.ts +17 -0
  120. package/utility/callback-array.lua +61 -0
  121. package/utility/linked-map.d.ts +34 -0
  122. package/utility/linked-map.lua +101 -0
  123. package/utility/linked-set.d.ts +3 -1
  124. package/utility/linked-set.lua +40 -1
  125. package/utility/lua-maps.d.ts +11 -2
  126. package/utility/lua-maps.lua +33 -2
  127. package/utility/records.lua +20 -1
  128. package/utility/types.d.ts +3 -0
  129. /package/engine/internal/{object-data/armor-increase.d.ts → misc/frame-coordinates.d.ts} +0 -0
  130. /package/engine/internal/object-data/{armor-increase.lua → armor-bonus.lua} +0 -0
  131. /package/engine/object-data/entry/ability-type/{attribute-increase.d.ts → attribute-bonus.d.ts} +0 -0
  132. /package/engine/object-data/entry/ability-type/{attribute-increase.lua → attribute-bonus.lua} +0 -0
@@ -62,6 +62,10 @@ local ____attributes = require("attributes")
62
62
  local isAttribute = ____attributes.isAttribute
63
63
  local ____ability = require("engine.internal.item.ability")
64
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
65
69
  local match = string.match
66
70
  local ____tostring = _G.tostring
67
71
  local setUnitAnimation = SetUnitAnimation
@@ -71,16 +75,12 @@ local getUnitRealField = BlzGetUnitRealField
71
75
  local getHeroStr = GetHeroStr
72
76
  local getHeroAgi = GetHeroAgi
73
77
  local getHeroInt = GetHeroInt
74
- local setHeroStr = SetHeroStr
75
- local setHeroAgi = SetHeroAgi
76
- local setHeroInt = SetHeroInt
77
78
  local getUnitBooleanField = BlzGetUnitBooleanField
78
79
  local getUnitStringField = BlzGetUnitStringField
79
80
  local setUnitIntegerField = BlzSetUnitIntegerField
80
81
  local setUnitRealField = BlzSetUnitRealField
81
82
  local setUnitBooleanField = BlzSetUnitBooleanField
82
83
  local setUnitStringField = BlzSetUnitStringField
83
- local setUnitScale = SetUnitScale
84
84
  local setUnitPosition = SetUnitPosition
85
85
  local setUnitTimeScale = SetUnitTimeScale
86
86
  local getHandleId = GetHandleId
@@ -108,7 +108,6 @@ local getUnitWeaponStringField = BlzGetUnitWeaponStringField
108
108
  local setUnitWeaponStringField = BlzSetUnitWeaponStringField
109
109
  local getUnitAbilityLevel = GetUnitAbilityLevel
110
110
  local unitDisableAbility = BlzUnitDisableAbility
111
- local unitInterruptAttack = BlzUnitInterruptAttack
112
111
  local isUnitInvisible = IsUnitInvisible
113
112
  local isUnitVisible = IsUnitVisible
114
113
  local getUnitX = GetUnitX
@@ -384,15 +383,27 @@ local modifiers = {
384
383
  end,
385
384
  armor = function(unit, value)
386
385
  if UnitAddAbility(unit, armorBonusAbilityId) then
387
- assert(UnitMakeAbilityPermanent(unit, true, armorBonusAbilityId))
386
+ assert(
387
+ UnitMakeAbilityPermanent(unit, true, armorBonusAbilityId),
388
+ "armor bonus ability must be made permanent",
389
+ unit
390
+ )
388
391
  end
389
- local ability = assert(BlzGetUnitAbility(unit, armorBonusAbilityId))
390
- assert(BlzSetAbilityRealLevelField(
391
- ability,
392
- armorBonusField,
393
- 0,
394
- BlzGetAbilityRealLevelField(ability, armorBonusField, 0) + value
395
- ))
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
+ )
396
407
  end
397
408
  }
398
409
  local getters = {
@@ -410,6 +421,19 @@ function UnitWeapon.prototype.____constructor(self, unit, index)
410
421
  self.unit = unit
411
422
  self.index = index
412
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
+ )
413
437
  __TS__SetDescriptor(
414
438
  UnitWeapon.prototype,
415
439
  "cooldown",
@@ -633,26 +657,30 @@ local fieldSetters = {
633
657
  }
634
658
  local dummies = {}
635
659
  for ____, player in ipairs(Player.all) do
636
- local dummy = assert(createUnit(
637
- player.handle,
638
- dummyUnitId,
639
- 0,
640
- 0,
641
- 270
642
- ))
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
+ )
643
671
  ShowUnit(dummy, false)
644
672
  dummies[player] = dummy
645
673
  end
646
674
  local function delayHealthChecksCallback(unit)
647
- local counter = (unit[103] or 0) - 1
675
+ local counter = (unit[104] or 0) - 1
648
676
  if counter ~= 0 then
649
- unit[103] = counter
677
+ unit[104] = counter
650
678
  return
651
679
  end
652
- unit[103] = nil
653
- local healthBonus = unit[104]
680
+ unit[104] = nil
681
+ local healthBonus = unit[105]
654
682
  if healthBonus ~= nil then
655
- unit[104] = nil
683
+ unit[105] = nil
656
684
  local handle = unit.handle
657
685
  BlzSetUnitMaxHP(
658
686
  handle,
@@ -682,41 +710,57 @@ function Unit.prototype.____constructor(self, handle)
682
710
  nextSyncId = ____nextSyncId_1 + 1
683
711
  self.syncId = ____nextSyncId_1
684
712
  self._owner = Player:of(getOwningPlayer(handle))
685
- assert(unitAddAbility(handle, leaveDetectAbilityId) and UnitMakeAbilityPermanent(handle, true, leaveDetectAbilityId))
686
- 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
+ )
687
723
  if unitAddAbility(
688
724
  handle,
689
725
  fourCC("Amrf")
690
726
  ) then
691
- assert(unitRemoveAbility(
692
- handle,
693
- fourCC("Amrf")
694
- ))
727
+ assert(
728
+ unitRemoveAbility(
729
+ handle,
730
+ fourCC("Amrf")
731
+ ),
732
+ "fly ability must be removed after addition",
733
+ self
734
+ )
695
735
  end
696
736
  unitBySyncId[self.syncId] = self
697
737
  local ____ = self.abilities
698
738
  end
699
- function Unit.prototype.getEvent(self, event, collector)
700
- self.events = self.events or ({})
701
- local eventId = GetHandleId(event)
702
- if not self.events[eventId] then
703
- 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(
704
745
  TriggerEvent,
705
746
  function(trigger)
706
- TriggerRegisterUnitEvent(trigger, self.handle, event)
747
+ TriggerRegisterUnitEvent(trigger, self.handle, jevent)
707
748
  end,
708
749
  collector or (function() return {} end)
709
750
  )
751
+ self.events:put(eventId, event)
710
752
  end
711
- 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))
712
760
  end
713
761
  function Unit.prototype.onDestroy(self)
714
762
  local handle = self.handle
715
- self[107] = getUnitX(handle)
716
- self[108] = getUnitY(handle)
717
- if not self._owner then
718
- self._owner = Player:of(getOwningPlayer(handle))
719
- end
763
+ self:saveData()
720
764
  local abilities = self.abilities
721
765
  for ____, ability in ipairs(abilities) do
722
766
  ability:destroy()
@@ -752,7 +796,11 @@ function Unit.prototype.addAttackHandler(self, condition, action)
752
796
  self._attackHandlers = handlers
753
797
  if #handlers == 1 then
754
798
  local handle = self.handle
755
- 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
+ )
756
804
  end
757
805
  return handler
758
806
  end
@@ -836,16 +884,18 @@ function Unit.prototype.queueAnimation(self, animation)
836
884
  QueueUnitAnimation(self.handle, animation)
837
885
  end
838
886
  function Unit.prototype.chooseWeapon(self, target)
839
- if target:isAllowedTarget(self, self.firstWeapon.allowedTargetCombatClassifications) then
840
- return self.firstWeapon
887
+ local firstWeapon = self.firstWeapon
888
+ if firstWeapon.isEnabled and target:isAllowedTarget(self, firstWeapon.allowedTargetCombatClassifications) then
889
+ return firstWeapon
841
890
  end
842
- if target:isAllowedTarget(target, self.secondWeapon.allowedTargetCombatClassifications) then
843
- return self.secondWeapon
891
+ local secondWeapon = self.secondWeapon
892
+ if secondWeapon.isEnabled and target:isAllowedTarget(target, secondWeapon.allowedTargetCombatClassifications) then
893
+ return secondWeapon
844
894
  end
845
895
  return nil
846
896
  end
847
897
  function Unit.prototype.delayHealthChecks(self)
848
- self[103] = (self[103] or 0) + 1
898
+ self[104] = (self[104] or 0) + 1
849
899
  Timer:run(delayHealthChecksCallback, self)
850
900
  end
851
901
  function Unit.prototype.setPosition(self, x, y)
@@ -935,23 +985,21 @@ end
935
985
  function Unit.prototype.hasAbility(self, abilityId)
936
986
  return getUnitAbilityLevel(self.handle, abilityId) > 0
937
987
  end
938
- function Unit.prototype.getAbilityById(self, abilityId)
988
+ function Unit.prototype.getAbility(self, abilityId)
939
989
  local ability = doUnitAbilityAction(self.handle, abilityId, getUnitAbility, abilityId)
940
990
  return UnitAbility:of(ability, abilityId, self)
941
991
  end
942
- function Unit.prototype.removeAbility(self, abilityId)
943
- if doUnitAbilityAction(self.handle, abilityId, unitRemoveAbility, abilityId) then
944
- local abilities = self.abilities
945
- for i = 1, #abilities do
946
- if abilities[i].typeId == abilityId then
947
- abilities[i]:destroy()
948
- tremove(abilities, i)
949
- return true
950
- 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
951
1000
  end
952
- return true
953
1001
  end
954
- return false
1002
+ return doUnitAbilityAction(self.handle, abilityTypeId, unitRemoveAbility, abilityTypeId)
955
1003
  end
956
1004
  function Unit.prototype.hideAbility(self, abilityId, flag)
957
1005
  BlzUnitHideAbility(self.handle, abilityId, flag)
@@ -965,24 +1013,6 @@ end
965
1013
  function Unit.prototype.endAbilityCooldown(self, abilityId)
966
1014
  BlzEndUnitAbilityCooldown(self.handle, abilityId)
967
1015
  end
968
- function Unit.prototype.interruptMovement(self)
969
- local handle = self.handle
970
- unitDisableAbility(
971
- handle,
972
- fourCC("Amov"),
973
- true,
974
- false
975
- )
976
- unitDisableAbility(
977
- handle,
978
- fourCC("Amov"),
979
- false,
980
- false
981
- )
982
- end
983
- function Unit.prototype.interruptAttack(self)
984
- unitInterruptAttack(self.handle)
985
- end
986
1016
  function Unit.prototype.interruptCast(self, abilityId)
987
1017
  local handle = self.handle
988
1018
  unitDisableAbility(handle, abilityId, true, false)
@@ -1053,18 +1083,44 @@ function Unit.prototype.unpauseEx(self)
1053
1083
  end
1054
1084
  function Unit.prototype.incrementStunCounter(self)
1055
1085
  local stunCounter = self[102] or 0
1056
- if not self[101] or stunCounter >= 0 then
1086
+ if not self[101] and (self[103] or 0) <= 0 or stunCounter >= 0 then
1057
1087
  BlzPauseUnitEx(self.handle, true)
1058
1088
  end
1059
1089
  self[102] = stunCounter + 1
1060
1090
  end
1061
1091
  function Unit.prototype.decrementStunCounter(self)
1062
1092
  local stunCounter = self[102] or 0
1063
- if not self[101] or stunCounter >= 1 then
1093
+ if not self[101] and (self[103] or 0) <= 0 or stunCounter >= 1 then
1064
1094
  BlzPauseUnitEx(self.handle, false)
1065
1095
  end
1066
1096
  self[102] = stunCounter - 1
1067
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
1068
1124
  function Unit.create(self, owner, id, x, y, facing, skinId)
1069
1125
  local handle = skinId and BlzCreateUnitWithSkin(
1070
1126
  owner.handle,
@@ -1351,19 +1407,6 @@ __TS__SetDescriptor(
1351
1407
  },
1352
1408
  true
1353
1409
  )
1354
- __TS__SetDescriptor(
1355
- Unit.prototype,
1356
- "strengthBase",
1357
- {
1358
- get = function(self)
1359
- return getHeroStr(self.handle, false)
1360
- end,
1361
- set = function(self, strengthBase)
1362
- setHeroStr(self.handle, strengthBase, true)
1363
- end
1364
- },
1365
- true
1366
- )
1367
1410
  __TS__SetDescriptor(
1368
1411
  Unit.prototype,
1369
1412
  "strengthBonus",
@@ -1381,19 +1424,6 @@ __TS__SetDescriptor(
1381
1424
  end},
1382
1425
  true
1383
1426
  )
1384
- __TS__SetDescriptor(
1385
- Unit.prototype,
1386
- "agilityBase",
1387
- {
1388
- get = function(self)
1389
- return getHeroAgi(self.handle, false)
1390
- end,
1391
- set = function(self, agilityBase)
1392
- setHeroAgi(self.handle, agilityBase, true)
1393
- end
1394
- },
1395
- true
1396
- )
1397
1427
  __TS__SetDescriptor(
1398
1428
  Unit.prototype,
1399
1429
  "agilityBonus",
@@ -1411,19 +1441,6 @@ __TS__SetDescriptor(
1411
1441
  end},
1412
1442
  true
1413
1443
  )
1414
- __TS__SetDescriptor(
1415
- Unit.prototype,
1416
- "intelligenceBase",
1417
- {
1418
- get = function(self)
1419
- return getHeroInt(self.handle, false)
1420
- end,
1421
- set = function(self, intelligenceBase)
1422
- setHeroInt(self.handle, intelligenceBase, true)
1423
- end
1424
- },
1425
- true
1426
- )
1427
1444
  __TS__SetDescriptor(
1428
1445
  Unit.prototype,
1429
1446
  "intelligenceBonus",
@@ -1472,7 +1489,7 @@ __TS__SetDescriptor(
1472
1489
  "isTeamGlowVisible",
1473
1490
  {
1474
1491
  get = function(self)
1475
- return not self[106]
1492
+ return not self[107]
1476
1493
  end,
1477
1494
  set = function(self, isTeamGlowVisible)
1478
1495
  BlzShowUnitTeamGlow(self.handle, isTeamGlowVisible)
@@ -1482,7 +1499,7 @@ __TS__SetDescriptor(
1482
1499
  else
1483
1500
  ____temp_7 = nil
1484
1501
  end
1485
- self[106] = ____temp_7
1502
+ self[107] = ____temp_7
1486
1503
  end
1487
1504
  },
1488
1505
  true
@@ -1492,7 +1509,7 @@ __TS__SetDescriptor(
1492
1509
  "color",
1493
1510
  {set = function(self, color)
1494
1511
  SetUnitColor(self.handle, color.handle)
1495
- if self[106] then
1512
+ if self[107] then
1496
1513
  BlzShowUnitTeamGlow(self.handle, false)
1497
1514
  end
1498
1515
  end},
@@ -1516,14 +1533,14 @@ __TS__SetDescriptor(
1516
1533
  "maxHealth",
1517
1534
  {
1518
1535
  get = function(self)
1519
- 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)
1520
1537
  end,
1521
1538
  set = function(self, maxHealth)
1522
- if maxHealth < 1 and self[103] ~= nil then
1523
- 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)
1524
1541
  maxHealth = 1
1525
1542
  end
1526
- BlzSetUnitMaxHP(self.handle, maxHealth + (self[105] or 0))
1543
+ BlzSetUnitMaxHP(self.handle, maxHealth + (self[106] or 0))
1527
1544
  end
1528
1545
  },
1529
1546
  true
@@ -1565,10 +1582,10 @@ __TS__SetDescriptor(
1565
1582
  "health",
1566
1583
  {
1567
1584
  get = function(self)
1568
- return GetWidgetLife(self.handle) - (self[105] or 0)
1585
+ return GetWidgetLife(self.handle) - (self[106] or 0)
1569
1586
  end,
1570
1587
  set = function(self, health)
1571
- SetWidgetLife(self.handle, health + (self[105] or 0))
1588
+ SetWidgetLife(self.handle, health + (self[106] or 0))
1572
1589
  end
1573
1590
  },
1574
1591
  true
@@ -1644,25 +1661,12 @@ __TS__SetDescriptor(
1644
1661
  },
1645
1662
  true
1646
1663
  )
1647
- __TS__SetDescriptor(
1648
- Unit.prototype,
1649
- "flyHeight",
1650
- {
1651
- get = function(self)
1652
- return getUnitFlyHeight(self.handle)
1653
- end,
1654
- set = function(self, v)
1655
- SetUnitFlyHeight(self.handle, v, 100000)
1656
- end
1657
- },
1658
- true
1659
- )
1660
1664
  __TS__SetDescriptor(
1661
1665
  Unit.prototype,
1662
1666
  "x",
1663
1667
  {
1664
1668
  get = function(self)
1665
- return self[107] or getUnitX(self.handle)
1669
+ return self[108] or getUnitX(self.handle)
1666
1670
  end,
1667
1671
  set = function(self, v)
1668
1672
  SetUnitX(self.handle, v)
@@ -1675,7 +1679,7 @@ __TS__SetDescriptor(
1675
1679
  "y",
1676
1680
  {
1677
1681
  get = function(self)
1678
- return self[108] or getUnitY(self.handle)
1682
+ return self[109] or getUnitY(self.handle)
1679
1683
  end,
1680
1684
  set = function(self, v)
1681
1685
  SetUnitY(self.handle, v)
@@ -1780,14 +1784,18 @@ __TS__SetDescriptor(
1780
1784
  local handle = self.handle
1781
1785
  if isPaused and not IsUnitPaused(handle) then
1782
1786
  self[101] = true
1783
- for _ = self[102] or 0, -1 do
1784
- 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
1785
1791
  end
1786
1792
  PauseUnit(handle, true)
1787
1793
  elseif not isPaused and IsUnitPaused(handle) then
1788
1794
  PauseUnit(handle, false)
1789
- for _ = self[102] or 0, -1 do
1790
- 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
1791
1799
  end
1792
1800
  self[101] = nil
1793
1801
  end
@@ -1845,20 +1853,6 @@ __TS__SetDescriptor(
1845
1853
  },
1846
1854
  true
1847
1855
  )
1848
- __TS__SetDescriptor(
1849
- Unit.prototype,
1850
- "scale",
1851
- {
1852
- get = function(self)
1853
- return getUnitRealField(self.handle, UNIT_RF_SCALING_VALUE)
1854
- end,
1855
- set = function(self, v)
1856
- setUnitScale(self.handle, v, v, v)
1857
- setUnitRealField(self.handle, UNIT_RF_SCALING_VALUE, v)
1858
- end
1859
- },
1860
- true
1861
- )
1862
1856
  __TS__SetDescriptor(
1863
1857
  Unit.prototype,
1864
1858
  "timeScale",
@@ -1995,30 +1989,6 @@ __TS__SetDescriptor(
1995
1989
  end},
1996
1990
  true
1997
1991
  )
1998
- __TS__SetDescriptor(
1999
- Unit.prototype,
2000
- "onUnitInRange",
2001
- {get = function(self)
2002
- local handle = self.handle
2003
- local onUnitInRange = setmetatable(
2004
- {},
2005
- {__index = function(self, value)
2006
- local event = __TS__New(
2007
- TriggerEvent,
2008
- function(trigger)
2009
- TriggerRegisterUnitInRangeSimple(trigger, value, handle)
2010
- end,
2011
- function() return ____exports.Unit:of(handle) end
2012
- )
2013
- rawset(self, value, event)
2014
- return event
2015
- end}
2016
- )
2017
- rawset(self, "onUnitInRange", onUnitInRange)
2018
- return onUnitInRange
2019
- end},
2020
- true
2021
- )
2022
1992
  __TS__SetDescriptor(
2023
1993
  Unit.prototype,
2024
1994
  "onManaEqual",
@@ -2154,6 +2124,11 @@ __TS__SetDescriptor(
2154
2124
  end},
2155
2125
  true
2156
2126
  )
2127
+ Unit.levelChangedEvent = __TS__New(
2128
+ ____exports.UnitTriggerEvent,
2129
+ EVENT_PLAYER_HERO_LEVEL,
2130
+ function() return ____exports.Unit:of(getTriggerUnit()) end
2131
+ )
2157
2132
  Unit.deathEvent = __TS__New(
2158
2133
  ____exports.UnitTriggerEvent,
2159
2134
  EVENT_PLAYER_UNIT_DEATH,
@@ -2470,12 +2445,7 @@ Unit.onDamaging = (function()
2470
2445
  preventRetaliation = damagingEventPreventRetaliation
2471
2446
  }
2472
2447
  if data.isAttack and source then
2473
- 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
2474
- if weapon == -1 then
2475
- local targetsAllowed = BlzGetUnitWeaponIntegerField(source.handle, UNIT_WEAPON_IF_ATTACK_TARGETS_ALLOWED, 0)
2476
- weapon = 0
2477
- end
2478
- data.weapon = assert(source.weapons[weapon + 1])
2448
+ data.weapon = source:chooseWeapon(target)
2479
2449
  end
2480
2450
  if not data.isAttack or not source or not source._attackHandlers then
2481
2451
  invoke(
@@ -2620,7 +2590,7 @@ Unit.onDamage = __TS__New(
2620
2590
  invoke(event, source, target, evData)
2621
2591
  if evData[0] ~= nil and target.health - evData.amount < 0.405 then
2622
2592
  local bonusHealth = math.ceil(evData.amount)
2623
- target[105] = (target[105] or 0) + bonusHealth
2593
+ target[106] = (target[106] or 0) + bonusHealth
2624
2594
  BlzSetUnitMaxHP(
2625
2595
  target.handle,
2626
2596
  BlzGetUnitMaxHP(target.handle) + bonusHealth
@@ -2634,7 +2604,7 @@ Unit.onDamage = __TS__New(
2634
2604
  evData[0],
2635
2605
  table.unpack(evData, 1 + 1, 1 + (evData[1] or 0))
2636
2606
  )
2637
- target[105] = (target[105] or 0) - bonusHealth
2607
+ target[106] = (target[106] or 0) - bonusHealth
2638
2608
  SetWidgetLife(
2639
2609
  target.handle,
2640
2610
  GetWidgetLife(target.handle) - bonusHealth
@@ -2670,10 +2640,14 @@ Unit.itemPickedUpEvent = __TS__New(
2670
2640
  ____exports.UnitTriggerEvent,
2671
2641
  EVENT_PLAYER_UNIT_PICKUP_ITEM,
2672
2642
  function()
2673
- local unit = getTriggerUnit()
2674
- local item = getManipulatedItem()
2675
- if getUnitTypeId(unit) ~= dummyUnitId and not (ignoreEventsItems[item] ~= nil) then
2676
- return ____exports.Unit:of(unit), Item:of(item)
2643
+ local unitHandle = getTriggerUnit()
2644
+ local itemHandle = getManipulatedItem()
2645
+ if getUnitTypeId(unitHandle) ~= dummyUnitId and not (ignoreEventsItems[itemHandle] ~= nil) then
2646
+ local unit = ____exports.Unit:of(unitHandle)
2647
+ local item = Item:of(itemHandle)
2648
+ if item.owner ~= unit then
2649
+ return unit, item
2650
+ end
2677
2651
  end
2678
2652
  return IgnoreEvent
2679
2653
  end
@@ -2693,7 +2667,7 @@ Unit.itemUsedEvent = __TS__New(
2693
2667
  Unit.itemStackedEvent = __TS__New(
2694
2668
  ____exports.UnitTriggerEvent,
2695
2669
  EVENT_PLAYER_UNIT_STACK_ITEM,
2696
- function() return ____exports.Unit:of(getTriggerUnit()), Item:of(getManipulatedItem()) end
2670
+ function() return ____exports.Unit:of(getTriggerUnit()), Item:of(BlzGetStackingItemTarget()), Item:of(BlzGetStackingItemSource()) end
2697
2671
  )
2698
2672
  __TS__ObjectDefineProperty(
2699
2673
  Unit,
@@ -2780,6 +2754,10 @@ __TS__ObjectDefineProperty(
2780
2754
  rawset(self, "destroyEvent", destroyEvent)
2781
2755
  return destroyEvent
2782
2756
  end}
2757
+ )
2758
+ Unit.synchronize = synchronizer(
2759
+ function(unit) return unit.syncId end,
2760
+ function(syncId) return unitBySyncId[syncId] end
2783
2761
  );
2784
2762
  (function(self)
2785
2763
  local leaveAbilityIds = postcompile(function()
@@ -2809,7 +2787,8 @@ __TS__ObjectDefineProperty(
2809
2787
  return
2810
2788
  end
2811
2789
  end
2812
- unit:destroy()
2790
+ unit:saveData()
2791
+ Timer:run(unit, "destroy")
2813
2792
  end)
2814
2793
  end
2815
2794
  end)(Unit)
@@ -3,6 +3,7 @@ import { Unit } from "../core/types/unit";
3
3
  import { Async } from "../core/types/async";
4
4
  import { Event, TriggerEvent } from "../event";
5
5
  import { GraphicsMode } from "./index";
6
+ import { Color } from "../core/types/color";
6
7
  export declare class LocalClient {
7
8
  private constructor();
8
9
  static readonly locale: string;
@@ -11,6 +12,7 @@ export declare class LocalClient {
11
12
  static get isHD(): boolean;
12
13
  static get graphicsMode(): GraphicsMode;
13
14
  static get isActive(): boolean;
15
+ static pingMinimap(x: number, y: number, duration: number, ...parameters: [] | [red: number, green: number, blue: number, flashy?: boolean] | [color: Color, flashy?: boolean]): void;
14
16
  static get mouseFocusUnit(): Async<Unit> | undefined;
15
17
  static get mainSelectedUnit(): Async<Unit> | undefined;
16
18
  static get mainSelectedUnitChangeEvent(): Event<[