warscript 0.0.1-dev.e561d29 → 0.0.1-dev.e698bed

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 (87) 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/tileCell.d.ts +11 -1
  9. package/core/types/tileCell.lua +97 -0
  10. package/core/types/timer.d.ts +3 -2
  11. package/core/types/timer.lua +22 -2
  12. package/decl/native.d.ts +2 -2
  13. package/engine/behavior.d.ts +10 -1
  14. package/engine/behavior.lua +141 -65
  15. package/engine/behaviour/ability/apply-buff.lua +12 -4
  16. package/engine/behaviour/ability/remove-buffs.d.ts +9 -0
  17. package/engine/behaviour/ability/remove-buffs.lua +21 -0
  18. package/engine/behaviour/ability/restore-mana.d.ts +1 -1
  19. package/engine/behaviour/ability/restore-mana.lua +6 -6
  20. package/engine/behaviour/unit/stun-immunity.d.ts +8 -4
  21. package/engine/behaviour/unit/stun-immunity.lua +12 -3
  22. package/engine/behaviour/unit.d.ts +15 -5
  23. package/engine/behaviour/unit.lua +116 -22
  24. package/engine/buff.d.ts +10 -4
  25. package/engine/buff.lua +119 -84
  26. package/engine/internal/ability.d.ts +3 -1
  27. package/engine/internal/ability.lua +26 -9
  28. package/engine/internal/item+owner.lua +12 -6
  29. package/engine/internal/item.d.ts +13 -15
  30. package/engine/internal/item.lua +63 -49
  31. package/engine/internal/misc/frame-coordinates.d.ts +2 -0
  32. package/engine/internal/misc/frame-coordinates.lua +21 -0
  33. package/engine/internal/misc/get-terrain-z.d.ts +2 -0
  34. package/engine/internal/misc/get-terrain-z.lua +11 -0
  35. package/engine/internal/misc/player-local-handle.d.ts +2 -0
  36. package/engine/internal/misc/player-local-handle.lua +5 -0
  37. package/engine/internal/unit/ability.d.ts +14 -14
  38. package/engine/internal/unit/ability.lua +72 -45
  39. package/engine/internal/unit/fly-height.d.ts +7 -0
  40. package/engine/internal/unit/fly-height.lua +20 -0
  41. package/engine/internal/unit/main-selected.lua +12 -27
  42. package/engine/internal/unit/scale.d.ts +7 -0
  43. package/engine/internal/unit/scale.lua +20 -0
  44. package/engine/internal/unit+ability.lua +10 -1
  45. package/engine/internal/unit-missile-launch.lua +44 -20
  46. package/engine/internal/unit.d.ts +16 -13
  47. package/engine/internal/unit.lua +102 -81
  48. package/engine/local-client.d.ts +2 -0
  49. package/engine/local-client.lua +30 -0
  50. package/engine/object-data/entry/ability-type.lua +4 -1
  51. package/engine/object-data/entry/unit-type.d.ts +4 -0
  52. package/engine/object-data/entry/unit-type.lua +76 -32
  53. package/engine/object-field/ability.d.ts +3 -3
  54. package/engine/object-field/ability.lua +7 -6
  55. package/engine/object-field/unit.d.ts +13 -1
  56. package/engine/object-field/unit.lua +57 -0
  57. package/engine/object-field.d.ts +9 -3
  58. package/engine/object-field.lua +204 -115
  59. package/engine/random.d.ts +9 -0
  60. package/engine/random.lua +13 -0
  61. package/engine/standard/fields/ability.d.ts +2 -2
  62. package/engine/standard/fields/ability.lua +2 -2
  63. package/engine/standard/fields/unit.d.ts +3 -1
  64. package/engine/standard/fields/unit.lua +4 -0
  65. package/engine/synchronization.d.ts +11 -0
  66. package/engine/synchronization.lua +77 -0
  67. package/engine/text-tag.d.ts +1 -1
  68. package/engine/text-tag.lua +92 -17
  69. package/engine/unit.d.ts +2 -0
  70. package/engine/unit.lua +2 -0
  71. package/net/socket.lua +1 -1
  72. package/objutil/buff.lua +1 -1
  73. package/package.json +2 -2
  74. package/patch-lualib.lua +1 -1
  75. package/utility/arrays.d.ts +1 -0
  76. package/utility/arrays.lua +8 -0
  77. package/utility/callback-array.d.ts +17 -0
  78. package/utility/callback-array.lua +61 -0
  79. package/utility/functions.d.ts +2 -0
  80. package/utility/functions.lua +7 -0
  81. package/utility/linked-set.d.ts +1 -0
  82. package/utility/linked-set.lua +19 -1
  83. package/utility/lua-maps.d.ts +11 -2
  84. package/utility/lua-maps.lua +33 -2
  85. package/utility/lua-sets.d.ts +1 -0
  86. package/utility/lua-sets.lua +4 -0
  87. package/utility/types.d.ts +3 -0
@@ -1,46 +1,31 @@
1
1
  local ____lualib = require("lualib_bundle")
2
2
  local __TS__New = ____lualib.__TS__New
3
3
  local ____exports = {}
4
- local ____player = require("core.types.player")
5
- local Player = ____player.Player
6
- local ____math = require("math")
7
- local MAXIMUM_INTEGER = ____math.MAXIMUM_INTEGER
8
- local MINIMUM_INTEGER = ____math.MINIMUM_INTEGER
9
4
  local ____local_2Dclient = require("engine.local-client")
10
5
  local LocalClient = ____local_2Dclient.LocalClient
11
6
  local ____unit = require("engine.internal.unit")
12
7
  local Unit = ____unit.Unit
13
8
  local ____event = require("event")
14
9
  local Event = ____event.Event
10
+ local ____synchronization = require("engine.synchronization")
11
+ local ObjectBus = ____synchronization.ObjectBus
15
12
  local mainSelectedUnitChangeEvent = __TS__New(Event)
16
13
  rawset(Unit, "mainSelectedUnitChangeEvent", mainSelectedUnitChangeEvent)
17
14
  local mainSelectedUnitByPlayer = {}
18
- local syncSlider = BlzCreateFrameByType(
19
- "SLIDER",
20
- "UnitSyncId",
21
- BlzGetOriginFrame(ORIGIN_FRAME_WORLD_FRAME, 0),
22
- "",
23
- 0
15
+ local unitBus = __TS__New(
16
+ ObjectBus,
17
+ function(unit) return unit.syncId end,
18
+ function(syncId) return Unit:getBySyncId(syncId) end
24
19
  )
25
- BlzFrameSetMinMaxValue(syncSlider, MINIMUM_INTEGER, MAXIMUM_INTEGER)
26
20
  LocalClient.mainSelectedUnitChangeEvent:addListener(function()
27
- local ____opt_0 = LocalClient.mainSelectedUnit
28
- local syncId = ____opt_0 and ____opt_0.syncId
29
- BlzFrameSetValue(syncSlider, syncId or 0)
21
+ unitBus:send(LocalClient.mainSelectedUnit)
30
22
  end)
31
- local trg = CreateTrigger()
32
- BlzTriggerRegisterFrameEvent(trg, syncSlider, FRAMEEVENT_SLIDER_VALUE_CHANGED)
33
- TriggerAddAction(
34
- trg,
35
- function()
36
- local player = Player:of(GetTriggerPlayer())
37
- local mainSelectedUnit = Unit:getBySyncId(BlzGetTriggerFrameValue())
38
- if mainSelectedUnit ~= mainSelectedUnitByPlayer[player] then
39
- mainSelectedUnitByPlayer[player] = mainSelectedUnit
40
- Event.invoke(mainSelectedUnitChangeEvent, player)
41
- end
23
+ unitBus.event:addListener(function(player, unit)
24
+ if unit ~= mainSelectedUnitByPlayer[player] then
25
+ mainSelectedUnitByPlayer[player] = unit
26
+ Event.invoke(mainSelectedUnitChangeEvent, player)
42
27
  end
43
- )
28
+ end)
44
29
  rawset(
45
30
  Unit,
46
31
  "getMainSelectedOf",
@@ -0,0 +1,7 @@
1
+ /** @noSelfInFile */
2
+ declare module "../unit" {
3
+ interface Unit {
4
+ scale: number;
5
+ }
6
+ }
7
+ export {};
@@ -0,0 +1,20 @@
1
+ local ____lualib = require("lualib_bundle")
2
+ local __TS__ObjectDefineProperty = ____lualib.__TS__ObjectDefineProperty
3
+ local ____exports = {}
4
+ local ____unit = require("engine.internal.unit")
5
+ local Unit = ____unit.Unit
6
+ local ____unit = require("engine.standard.fields.unit")
7
+ local SCALING_VALUE_UNIT_FLOAT_FIELD = ____unit.SCALING_VALUE_UNIT_FLOAT_FIELD
8
+ __TS__ObjectDefineProperty(
9
+ Unit.prototype,
10
+ "scale",
11
+ {
12
+ get = function(self)
13
+ return SCALING_VALUE_UNIT_FLOAT_FIELD:getValue(self)
14
+ end,
15
+ set = function(self, value)
16
+ SCALING_VALUE_UNIT_FLOAT_FIELD:setValue(self, value)
17
+ end
18
+ }
19
+ )
20
+ return ____exports
@@ -7,8 +7,8 @@ local UnitAbility = ____ability.UnitAbility
7
7
  local ____unit = require("engine.internal.unit")
8
8
  local Unit = ____unit.Unit
9
9
  local ____event = require("event")
10
- local Event = ____event.Event
11
10
  local createDispatchingEvent = ____event.createDispatchingEvent
11
+ local Event = ____event.Event
12
12
  local abilityGainedEvent = createDispatchingEvent(
13
13
  __TS__New(Event),
14
14
  function(unit, ability) return ability.typeId end
@@ -40,6 +40,15 @@ ItemAbility.onCreate:addListener(
40
40
  end
41
41
  end
42
42
  )
43
+ ItemAbility.destroyEvent:addListener(
44
+ 4,
45
+ function(ability)
46
+ local unit = ability.owner.owner
47
+ if unit ~= nil then
48
+ Event.invoke(abilityLostEvent, unit, ability)
49
+ end
50
+ end
51
+ )
43
52
  Unit.itemPickedUpEvent:addListener(
44
53
  0,
45
54
  function(unit, item)
@@ -9,11 +9,18 @@ local ____timer = require("core.types.timer")
9
9
  local Timer = ____timer.Timer
10
10
  local ____lua_2Dsets = require("utility.lua-sets")
11
11
  local luaSetOf = ____lua_2Dsets.luaSetOf
12
+ local ____attributes = require("attributes")
13
+ local attribute = ____attributes.attribute
14
+ local ____linked_2Dset = require("utility.linked-set")
15
+ local LinkedSet = ____linked_2Dset.LinkedSet
12
16
  local ____math = require("math")
13
- local min = ____math.min
17
+ local ceil = ____math.ceil
14
18
  local autoAttackFinishEvent = __TS__New(Event)
15
19
  rawset(Unit, "autoAttackFinishEvent", autoAttackFinishEvent)
16
- local eventTimerByUnit = {}
20
+ local units = __TS__New(LinkedSet)
21
+ local targetAttribute = attribute()
22
+ local impactDelayAttribute = attribute()
23
+ local passedTimeAttribute = attribute()
17
24
  local instantOrderIds = luaSetOf(
18
25
  orderId("avatar"),
19
26
  orderId("berserk"),
@@ -30,29 +37,46 @@ local instantOrderIds = luaSetOf(
30
37
  orderId("unimmolation")
31
38
  )
32
39
  local function reset(source, orderId)
33
- if not (instantOrderIds[orderId] ~= nil) then
34
- local eventTimer = eventTimerByUnit[source]
35
- if eventTimer then
36
- eventTimer:destroy()
37
- eventTimerByUnit[source] = nil
38
- end
40
+ if not (instantOrderIds[orderId] ~= nil) and units:remove(source) then
41
+ source[targetAttribute] = nil
42
+ source[impactDelayAttribute] = nil
43
+ source[passedTimeAttribute] = nil
39
44
  end
40
45
  end
41
46
  Unit.onImmediateOrder:addListener(reset)
42
47
  Unit.onPointOrder:addListener(reset)
43
48
  Unit.onTargetOrder:addListener(reset)
44
- local function timerCallback(source, target)
45
- eventTimerByUnit[source] = nil
46
- Event.invoke(autoAttackFinishEvent, source, target)
49
+ local timerPeriod = 1 / 64
50
+ local function invokeEvent(unit)
51
+ units:remove(unit)
52
+ local target = unit[targetAttribute]
53
+ unit[targetAttribute] = nil
54
+ unit[impactDelayAttribute] = nil
55
+ unit[passedTimeAttribute] = nil
56
+ Event.invoke(autoAttackFinishEvent, unit, target)
57
+ end
58
+ local function checkUnit(unit)
59
+ local passedTime = unit[passedTimeAttribute] + timerPeriod
60
+ local impactDelay = unit[impactDelayAttribute]
61
+ if passedTime >= impactDelay and ceil(passedTime / 0.02) >= ceil(impactDelay / 0.02) then
62
+ invokeEvent(unit)
63
+ else
64
+ unit[passedTimeAttribute] = passedTime
65
+ end
47
66
  end
48
- Unit.autoAttackStartEvent:addListener(function(source, target)
49
- local attackPoint = (source:chooseWeapon(target) or source.firstWeapon).impactDelay
50
- local timer = Timer:simple(
51
- attackPoint + min(0.001, attackPoint / 2),
52
- timerCallback,
53
- source,
54
- target
55
- )
56
- eventTimerByUnit[source] = timer
67
+ Timer.onPeriod[timerPeriod]:addListener(function()
68
+ units:forEach(checkUnit)
57
69
  end)
70
+ Unit.autoAttackStartEvent:addListener(
71
+ 999999,
72
+ function(source, target)
73
+ if source[targetAttribute] ~= nil then
74
+ invokeEvent(source)
75
+ end
76
+ source[targetAttribute] = target
77
+ source[impactDelayAttribute] = (source:chooseWeapon(target) or source.firstWeapon).impactDelay
78
+ source[passedTimeAttribute] = -timerPeriod
79
+ units:add(source)
80
+ end
81
+ )
58
82
  return ____exports
@@ -80,6 +80,8 @@ export declare class UnitWeapon {
80
80
  readonly unit: Unit;
81
81
  readonly index: 0 | 1;
82
82
  constructor(unit: Unit, index: 0 | 1);
83
+ get isEnabled(): boolean;
84
+ set isEnabled(isEnabled: boolean);
83
85
  get cooldown(): number;
84
86
  set cooldown(cooldown: number);
85
87
  get damage(): [minimumDamage: number, maximumDamage: number];
@@ -107,12 +109,13 @@ declare const enum UnitPropertyKey {
107
109
  SYNC_ID = 100,
108
110
  IS_PAUSED = 101,
109
111
  STUN_COUNTER = 102,
110
- DELAY_HEALTH_CHECKS_COUNTER = 103,
111
- DELAY_HEALTH_CHECKS_HEALTH_BONUS = 104,
112
- PREVENT_DEATH_HEALTH_BONUS = 105,
113
- IS_TEAM_GLOW_HIDDEN = 106,
114
- LAST_X = 107,
115
- LAST_Y = 108
112
+ FORCE_STUN_COUNTER = 103,
113
+ DELAY_HEALTH_CHECKS_COUNTER = 104,
114
+ DELAY_HEALTH_CHECKS_HEALTH_BONUS = 105,
115
+ PREVENT_DEATH_HEALTH_BONUS = 106,
116
+ IS_TEAM_GLOW_HIDDEN = 107,
117
+ LAST_X = 108,
118
+ LAST_Y = 109
116
119
  }
117
120
  export type UnitSyncId = number & {
118
121
  readonly __unitSyncId: unique symbol;
@@ -121,6 +124,7 @@ export declare class Unit extends Handle<junit> {
121
124
  readonly syncId: UnitSyncId;
122
125
  private [UnitPropertyKey.IS_PAUSED]?;
123
126
  private [UnitPropertyKey.STUN_COUNTER]?;
127
+ private [UnitPropertyKey.FORCE_STUN_COUNTER]?;
124
128
  private [UnitPropertyKey.DELAY_HEALTH_CHECKS_COUNTER]?;
125
129
  private [UnitPropertyKey.DELAY_HEALTH_CHECKS_HEALTH_BONUS]?;
126
130
  private [UnitPropertyKey.PREVENT_DEATH_HEALTH_BONUS]?;
@@ -216,8 +220,6 @@ export declare class Unit extends Handle<junit> {
216
220
  set facing(v: number);
217
221
  get speed(): number;
218
222
  set speed(v: number);
219
- get flyHeight(): number;
220
- set flyHeight(v: number);
221
223
  get x(): number;
222
224
  set x(v: number);
223
225
  get y(): number;
@@ -241,8 +243,6 @@ export declare class Unit extends Handle<junit> {
241
243
  get isInvulnerable(): boolean;
242
244
  get vertexColor(): Color;
243
245
  set vertexColor(v: Color);
244
- get scale(): number;
245
- set scale(v: number);
246
246
  get timeScale(): number;
247
247
  set timeScale(v: number);
248
248
  get collisionSize(): number;
@@ -271,8 +271,8 @@ export declare class Unit extends Handle<junit> {
271
271
  setAbilityLevel(abilityId: number, level: number): number;
272
272
  getAbilityLevel(abilityId: number): number;
273
273
  hasAbility(abilityId: number): boolean;
274
- getAbilityById(abilityId: number): UnitAbility | undefined;
275
- removeAbility(abilityId: number): boolean;
274
+ getAbility(abilityId: number): UnitAbility | undefined;
275
+ removeAbility(abilityTypeId: number): boolean;
276
276
  hideAbility(abilityId: number, flag: boolean): void;
277
277
  getAbilityRemainingCooldown(abilityId: number): number;
278
278
  startAbilityCooldown(abilityId: number, cooldown: number): void;
@@ -292,6 +292,8 @@ export declare class Unit extends Handle<junit> {
292
292
  unpauseEx(): void;
293
293
  incrementStunCounter(): void;
294
294
  decrementStunCounter(): void;
295
+ incrementForceStunCounter(): void;
296
+ decrementForceStunCounter(): void;
295
297
  set waygateActive(v: boolean);
296
298
  get waygateActive(): boolean;
297
299
  set waygateDestination(v: Vec2);
@@ -353,7 +355,7 @@ export declare class Unit extends Handle<junit> {
353
355
  static itemDroppedEvent: UnitTriggerEvent<[Item]>;
354
356
  static itemPickedUpEvent: UnitTriggerEvent<[Item]>;
355
357
  static itemUsedEvent: UnitTriggerEvent<[Item]>;
356
- static itemStackedEvent: UnitTriggerEvent<[Item]>;
358
+ static itemStackedEvent: UnitTriggerEvent<[target: Item, source: Item]>;
357
359
  static get itemChargesChangedEvent(): Event<[unit: Unit, item: Item]>;
358
360
  static get itemUseOrderEvent(): Event<[unit: Unit, item: Item]>;
359
361
  static get itemMoveOrderEvent(): Event<[
@@ -373,5 +375,6 @@ export declare class Unit extends Handle<junit> {
373
375
  setField(field: junitstringfield, value: string): boolean;
374
376
  toString(): string;
375
377
  static getBySyncId(syncId: UnitSyncId): Unit | undefined;
378
+ static synchronize: (player: Player, object: Unit | undefined) => Promise<Unit | undefined>;
376
379
  }
377
380
  export {};
@@ -62,6 +62,8 @@ 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
65
67
  local match = string.match
66
68
  local ____tostring = _G.tostring
67
69
  local setUnitAnimation = SetUnitAnimation
@@ -410,6 +412,19 @@ function UnitWeapon.prototype.____constructor(self, unit, index)
410
412
  self.unit = unit
411
413
  self.index = index
412
414
  end
415
+ __TS__SetDescriptor(
416
+ UnitWeapon.prototype,
417
+ "isEnabled",
418
+ {
419
+ get = function(self)
420
+ return BlzGetUnitWeaponBooleanField(self.unit.handle, UNIT_WEAPON_BF_ATTACKS_ENABLED, self.index)
421
+ end,
422
+ set = function(self, isEnabled)
423
+ BlzSetUnitWeaponBooleanField(self.unit.handle, UNIT_WEAPON_BF_ATTACKS_ENABLED, self.index, isEnabled)
424
+ end
425
+ },
426
+ true
427
+ )
413
428
  __TS__SetDescriptor(
414
429
  UnitWeapon.prototype,
415
430
  "cooldown",
@@ -644,15 +659,15 @@ for ____, player in ipairs(Player.all) do
644
659
  dummies[player] = dummy
645
660
  end
646
661
  local function delayHealthChecksCallback(unit)
647
- local counter = (unit[103] or 0) - 1
662
+ local counter = (unit[104] or 0) - 1
648
663
  if counter ~= 0 then
649
- unit[103] = counter
664
+ unit[104] = counter
650
665
  return
651
666
  end
652
- unit[103] = nil
653
- local healthBonus = unit[104]
667
+ unit[104] = nil
668
+ local healthBonus = unit[105]
654
669
  if healthBonus ~= nil then
655
- unit[104] = nil
670
+ unit[105] = nil
656
671
  local handle = unit.handle
657
672
  BlzSetUnitMaxHP(
658
673
  handle,
@@ -712,8 +727,8 @@ function Unit.prototype.getEvent(self, event, collector)
712
727
  end
713
728
  function Unit.prototype.onDestroy(self)
714
729
  local handle = self.handle
715
- self[107] = getUnitX(handle)
716
- self[108] = getUnitY(handle)
730
+ self[108] = getUnitX(handle)
731
+ self[109] = getUnitY(handle)
717
732
  if not self._owner then
718
733
  self._owner = Player:of(getOwningPlayer(handle))
719
734
  end
@@ -836,16 +851,18 @@ function Unit.prototype.queueAnimation(self, animation)
836
851
  QueueUnitAnimation(self.handle, animation)
837
852
  end
838
853
  function Unit.prototype.chooseWeapon(self, target)
839
- if target:isAllowedTarget(self, self.firstWeapon.allowedTargetCombatClassifications) then
840
- return self.firstWeapon
854
+ local firstWeapon = self.firstWeapon
855
+ if firstWeapon.isEnabled and target:isAllowedTarget(self, firstWeapon.allowedTargetCombatClassifications) then
856
+ return firstWeapon
841
857
  end
842
- if target:isAllowedTarget(target, self.secondWeapon.allowedTargetCombatClassifications) then
843
- return self.secondWeapon
858
+ local secondWeapon = self.secondWeapon
859
+ if secondWeapon.isEnabled and target:isAllowedTarget(target, secondWeapon.allowedTargetCombatClassifications) then
860
+ return secondWeapon
844
861
  end
845
862
  return nil
846
863
  end
847
864
  function Unit.prototype.delayHealthChecks(self)
848
- self[103] = (self[103] or 0) + 1
865
+ self[104] = (self[104] or 0) + 1
849
866
  Timer:run(delayHealthChecksCallback, self)
850
867
  end
851
868
  function Unit.prototype.setPosition(self, x, y)
@@ -935,23 +952,21 @@ end
935
952
  function Unit.prototype.hasAbility(self, abilityId)
936
953
  return getUnitAbilityLevel(self.handle, abilityId) > 0
937
954
  end
938
- function Unit.prototype.getAbilityById(self, abilityId)
955
+ function Unit.prototype.getAbility(self, abilityId)
939
956
  local ability = doUnitAbilityAction(self.handle, abilityId, getUnitAbility, abilityId)
940
957
  return UnitAbility:of(ability, abilityId, self)
941
958
  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
959
+ function Unit.prototype.removeAbility(self, abilityTypeId)
960
+ local abilities = self.abilities
961
+ for i = 1, #abilities do
962
+ if abilities[i].typeId == abilityTypeId then
963
+ local ability = abilities[i]
964
+ tremove(abilities, i)
965
+ ability:destroy()
966
+ return true
951
967
  end
952
- return true
953
968
  end
954
- return false
969
+ return doUnitAbilityAction(self.handle, abilityTypeId, unitRemoveAbility, abilityTypeId)
955
970
  end
956
971
  function Unit.prototype.hideAbility(self, abilityId, flag)
957
972
  BlzUnitHideAbility(self.handle, abilityId, flag)
@@ -1053,18 +1068,44 @@ function Unit.prototype.unpauseEx(self)
1053
1068
  end
1054
1069
  function Unit.prototype.incrementStunCounter(self)
1055
1070
  local stunCounter = self[102] or 0
1056
- if not self[101] or stunCounter >= 0 then
1071
+ if not self[101] and (self[103] or 0) <= 0 or stunCounter >= 0 then
1057
1072
  BlzPauseUnitEx(self.handle, true)
1058
1073
  end
1059
1074
  self[102] = stunCounter + 1
1060
1075
  end
1061
1076
  function Unit.prototype.decrementStunCounter(self)
1062
1077
  local stunCounter = self[102] or 0
1063
- if not self[101] or stunCounter >= 1 then
1078
+ if not self[101] and (self[103] or 0) <= 0 or stunCounter >= 1 then
1064
1079
  BlzPauseUnitEx(self.handle, false)
1065
1080
  end
1066
1081
  self[102] = stunCounter - 1
1067
1082
  end
1083
+ function Unit.prototype.incrementForceStunCounter(self)
1084
+ local forceStunCounter = self[103] or 0
1085
+ if forceStunCounter == 0 then
1086
+ local handle = self.handle
1087
+ if not self[101] then
1088
+ for _ = self[102] or 0, -1 do
1089
+ BlzPauseUnitEx(handle, true)
1090
+ end
1091
+ end
1092
+ BlzPauseUnitEx(handle, true)
1093
+ end
1094
+ self[103] = forceStunCounter + 1
1095
+ end
1096
+ function Unit.prototype.decrementForceStunCounter(self)
1097
+ local forceStunCounter = self[103] or 0
1098
+ if forceStunCounter == 1 then
1099
+ local handle = self.handle
1100
+ if not self[101] then
1101
+ for _ = self[102] or 0, -1 do
1102
+ BlzPauseUnitEx(handle, false)
1103
+ end
1104
+ end
1105
+ BlzPauseUnitEx(handle, false)
1106
+ end
1107
+ self[103] = forceStunCounter - 1
1108
+ end
1068
1109
  function Unit.create(self, owner, id, x, y, facing, skinId)
1069
1110
  local handle = skinId and BlzCreateUnitWithSkin(
1070
1111
  owner.handle,
@@ -1472,7 +1513,7 @@ __TS__SetDescriptor(
1472
1513
  "isTeamGlowVisible",
1473
1514
  {
1474
1515
  get = function(self)
1475
- return not self[106]
1516
+ return not self[107]
1476
1517
  end,
1477
1518
  set = function(self, isTeamGlowVisible)
1478
1519
  BlzShowUnitTeamGlow(self.handle, isTeamGlowVisible)
@@ -1482,7 +1523,7 @@ __TS__SetDescriptor(
1482
1523
  else
1483
1524
  ____temp_7 = nil
1484
1525
  end
1485
- self[106] = ____temp_7
1526
+ self[107] = ____temp_7
1486
1527
  end
1487
1528
  },
1488
1529
  true
@@ -1492,7 +1533,7 @@ __TS__SetDescriptor(
1492
1533
  "color",
1493
1534
  {set = function(self, color)
1494
1535
  SetUnitColor(self.handle, color.handle)
1495
- if self[106] then
1536
+ if self[107] then
1496
1537
  BlzShowUnitTeamGlow(self.handle, false)
1497
1538
  end
1498
1539
  end},
@@ -1516,14 +1557,14 @@ __TS__SetDescriptor(
1516
1557
  "maxHealth",
1517
1558
  {
1518
1559
  get = function(self)
1519
- return BlzGetUnitMaxHP(self.handle) - (self[104] or 0) - (self[105] or 0)
1560
+ return BlzGetUnitMaxHP(self.handle) - (self[105] or 0) - (self[106] or 0)
1520
1561
  end,
1521
1562
  set = function(self, maxHealth)
1522
- if maxHealth < 1 and self[103] ~= nil then
1523
- self[104] = (self[104] or 0) + (1 - maxHealth)
1563
+ if maxHealth < 1 and self[104] ~= nil then
1564
+ self[105] = (self[105] or 0) + (1 - maxHealth)
1524
1565
  maxHealth = 1
1525
1566
  end
1526
- BlzSetUnitMaxHP(self.handle, maxHealth + (self[105] or 0))
1567
+ BlzSetUnitMaxHP(self.handle, maxHealth + (self[106] or 0))
1527
1568
  end
1528
1569
  },
1529
1570
  true
@@ -1565,10 +1606,10 @@ __TS__SetDescriptor(
1565
1606
  "health",
1566
1607
  {
1567
1608
  get = function(self)
1568
- return GetWidgetLife(self.handle) - (self[105] or 0)
1609
+ return GetWidgetLife(self.handle) - (self[106] or 0)
1569
1610
  end,
1570
1611
  set = function(self, health)
1571
- SetWidgetLife(self.handle, health + (self[105] or 0))
1612
+ SetWidgetLife(self.handle, health + (self[106] or 0))
1572
1613
  end
1573
1614
  },
1574
1615
  true
@@ -1644,25 +1685,12 @@ __TS__SetDescriptor(
1644
1685
  },
1645
1686
  true
1646
1687
  )
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
1688
  __TS__SetDescriptor(
1661
1689
  Unit.prototype,
1662
1690
  "x",
1663
1691
  {
1664
1692
  get = function(self)
1665
- return self[107] or getUnitX(self.handle)
1693
+ return self[108] or getUnitX(self.handle)
1666
1694
  end,
1667
1695
  set = function(self, v)
1668
1696
  SetUnitX(self.handle, v)
@@ -1675,7 +1703,7 @@ __TS__SetDescriptor(
1675
1703
  "y",
1676
1704
  {
1677
1705
  get = function(self)
1678
- return self[108] or getUnitY(self.handle)
1706
+ return self[109] or getUnitY(self.handle)
1679
1707
  end,
1680
1708
  set = function(self, v)
1681
1709
  SetUnitY(self.handle, v)
@@ -1780,14 +1808,18 @@ __TS__SetDescriptor(
1780
1808
  local handle = self.handle
1781
1809
  if isPaused and not IsUnitPaused(handle) then
1782
1810
  self[101] = true
1783
- for _ = self[102] or 0, -1 do
1784
- BlzPauseUnitEx(handle, true)
1811
+ if (self[103] or 0) <= 0 then
1812
+ for _ = self[102] or 0, -1 do
1813
+ BlzPauseUnitEx(handle, true)
1814
+ end
1785
1815
  end
1786
1816
  PauseUnit(handle, true)
1787
1817
  elseif not isPaused and IsUnitPaused(handle) then
1788
1818
  PauseUnit(handle, false)
1789
- for _ = self[102] or 0, -1 do
1790
- BlzPauseUnitEx(handle, false)
1819
+ if (self[103] or 0) <= 0 then
1820
+ for _ = self[102] or 0, -1 do
1821
+ BlzPauseUnitEx(handle, false)
1822
+ end
1791
1823
  end
1792
1824
  self[101] = nil
1793
1825
  end
@@ -1845,20 +1877,6 @@ __TS__SetDescriptor(
1845
1877
  },
1846
1878
  true
1847
1879
  )
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
1880
  __TS__SetDescriptor(
1863
1881
  Unit.prototype,
1864
1882
  "timeScale",
@@ -2470,12 +2488,7 @@ Unit.onDamaging = (function()
2470
2488
  preventRetaliation = damagingEventPreventRetaliation
2471
2489
  }
2472
2490
  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])
2491
+ data.weapon = source:chooseWeapon(target)
2479
2492
  end
2480
2493
  if not data.isAttack or not source or not source._attackHandlers then
2481
2494
  invoke(
@@ -2620,7 +2633,7 @@ Unit.onDamage = __TS__New(
2620
2633
  invoke(event, source, target, evData)
2621
2634
  if evData[0] ~= nil and target.health - evData.amount < 0.405 then
2622
2635
  local bonusHealth = math.ceil(evData.amount)
2623
- target[105] = (target[105] or 0) + bonusHealth
2636
+ target[106] = (target[106] or 0) + bonusHealth
2624
2637
  BlzSetUnitMaxHP(
2625
2638
  target.handle,
2626
2639
  BlzGetUnitMaxHP(target.handle) + bonusHealth
@@ -2634,7 +2647,7 @@ Unit.onDamage = __TS__New(
2634
2647
  evData[0],
2635
2648
  table.unpack(evData, 1 + 1, 1 + (evData[1] or 0))
2636
2649
  )
2637
- target[105] = (target[105] or 0) - bonusHealth
2650
+ target[106] = (target[106] or 0) - bonusHealth
2638
2651
  SetWidgetLife(
2639
2652
  target.handle,
2640
2653
  GetWidgetLife(target.handle) - bonusHealth
@@ -2670,10 +2683,14 @@ Unit.itemPickedUpEvent = __TS__New(
2670
2683
  ____exports.UnitTriggerEvent,
2671
2684
  EVENT_PLAYER_UNIT_PICKUP_ITEM,
2672
2685
  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)
2686
+ local unitHandle = getTriggerUnit()
2687
+ local itemHandle = getManipulatedItem()
2688
+ if getUnitTypeId(unitHandle) ~= dummyUnitId and not (ignoreEventsItems[itemHandle] ~= nil) then
2689
+ local unit = ____exports.Unit:of(unitHandle)
2690
+ local item = Item:of(itemHandle)
2691
+ if item.owner ~= unit then
2692
+ return unit, item
2693
+ end
2677
2694
  end
2678
2695
  return IgnoreEvent
2679
2696
  end
@@ -2693,7 +2710,7 @@ Unit.itemUsedEvent = __TS__New(
2693
2710
  Unit.itemStackedEvent = __TS__New(
2694
2711
  ____exports.UnitTriggerEvent,
2695
2712
  EVENT_PLAYER_UNIT_STACK_ITEM,
2696
- function() return ____exports.Unit:of(getTriggerUnit()), Item:of(getManipulatedItem()) end
2713
+ function() return ____exports.Unit:of(getTriggerUnit()), Item:of(BlzGetStackingItemTarget()), Item:of(BlzGetStackingItemSource()) end
2697
2714
  )
2698
2715
  __TS__ObjectDefineProperty(
2699
2716
  Unit,
@@ -2780,6 +2797,10 @@ __TS__ObjectDefineProperty(
2780
2797
  rawset(self, "destroyEvent", destroyEvent)
2781
2798
  return destroyEvent
2782
2799
  end}
2800
+ )
2801
+ Unit.synchronize = synchronizer(
2802
+ function(unit) return unit.syncId end,
2803
+ function(syncId) return unitBySyncId[syncId] end
2783
2804
  );
2784
2805
  (function(self)
2785
2806
  local leaveAbilityIds = postcompile(function()
@@ -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, extraEffects?: boolean] | [color: Color, extraEffects?: boolean]): void;
14
16
  static get mouseFocusUnit(): Async<Unit> | undefined;
15
17
  static get mainSelectedUnit(): Async<Unit> | undefined;
16
18
  static get mainSelectedUnitChangeEvent(): Event<[