warscript 0.0.1-dev.46e7a52 → 0.0.1-dev.4724d95

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 (124) hide show
  1. package/core/types/frame.d.ts +1 -0
  2. package/core/types/frame.lua +112 -37
  3. package/core/types/handle.lua +6 -9
  4. package/core/types/item.d.ts +1 -0
  5. package/core/types/item.lua +1 -0
  6. package/core/types/player.d.ts +2 -1
  7. package/core/types/player.lua +16 -12
  8. package/core/types/sound.lua +1 -1
  9. package/core/types/tileCell.d.ts +2 -1
  10. package/core/types/tileCell.lua +5 -0
  11. package/destroyable.d.ts +1 -0
  12. package/destroyable.lua +9 -0
  13. package/engine/behavior.d.ts +10 -2
  14. package/engine/behavior.lua +157 -76
  15. package/engine/behaviour/ability/apply-buff.lua +4 -4
  16. package/engine/behaviour/ability/damage.d.ts +3 -0
  17. package/engine/behaviour/ability/damage.lua +8 -2
  18. package/engine/behaviour/ability/emulate-impact.lua +5 -4
  19. package/engine/behaviour/ability.d.ts +11 -6
  20. package/engine/behaviour/ability.lua +31 -1
  21. package/engine/behaviour/unit/stun-immunity.d.ts +7 -5
  22. package/engine/behaviour/unit/stun-immunity.lua +6 -5
  23. package/engine/behaviour/unit.d.ts +7 -3
  24. package/engine/behaviour/unit.lua +101 -24
  25. package/engine/buff.d.ts +65 -18
  26. package/engine/buff.lua +351 -147
  27. package/engine/internal/ability.lua +15 -15
  28. package/engine/internal/item/fields.d.ts +12 -0
  29. package/engine/internal/item/fields.lua +33 -0
  30. package/engine/internal/item.d.ts +4 -5
  31. package/engine/internal/item.lua +37 -40
  32. package/engine/internal/mechanics/cast-ability.lua +6 -3
  33. package/engine/internal/object-data/attribute-bonus.lua +2 -2
  34. package/engine/internal/object-data/health-bonus.d.ts +2 -0
  35. package/engine/internal/object-data/health-bonus.lua +16 -0
  36. package/engine/internal/object-data/mana-bonus.d.ts +2 -0
  37. package/engine/internal/object-data/mana-bonus.lua +16 -0
  38. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.d.ts +2 -0
  39. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.lua +16 -0
  40. package/engine/internal/unit/ability.lua +12 -2
  41. package/engine/internal/unit/attributes.d.ts +17 -0
  42. package/engine/internal/unit/attributes.lua +46 -0
  43. package/engine/internal/unit/bonus.d.ts +6 -0
  44. package/engine/internal/unit/bonus.lua +33 -3
  45. package/engine/internal/unit/fly-height.d.ts +7 -0
  46. package/engine/internal/unit/fly-height.lua +20 -0
  47. package/engine/internal/unit/interrupts.d.ts +12 -0
  48. package/engine/internal/unit/interrupts.lua +28 -0
  49. package/engine/internal/unit/pseudo-passive-abilities.d.ts +2 -0
  50. package/engine/internal/unit/pseudo-passive-abilities.lua +8 -0
  51. package/engine/internal/unit/range-event.d.ts +12 -0
  52. package/engine/internal/unit/range-event.lua +90 -0
  53. package/engine/internal/unit/scale.d.ts +7 -0
  54. package/engine/internal/unit/scale.lua +20 -0
  55. package/engine/internal/unit+bonus.lua +3 -3
  56. package/engine/internal/unit-missile-launch.lua +12 -5
  57. package/engine/internal/unit.d.ts +2 -13
  58. package/engine/internal/unit.lua +79 -148
  59. package/engine/local-client.d.ts +6 -1
  60. package/engine/local-client.lua +60 -5
  61. package/engine/object-data/auxiliary/health-regeneration-type.d.ts +8 -0
  62. package/engine/object-data/auxiliary/health-regeneration-type.lua +2 -0
  63. package/engine/object-data/auxiliary/unit-attribute.lua +1 -1
  64. package/engine/object-data/entry/ability-type/{armor-increase.d.ts → armor-bonus.d.ts} +3 -3
  65. package/engine/object-data/entry/ability-type/{armor-increase.lua → armor-bonus.lua} +9 -9
  66. package/engine/object-data/entry/ability-type/blank-configurable.d.ts +3 -0
  67. package/engine/object-data/entry/ability-type/blank-configurable.lua +29 -0
  68. package/engine/object-data/entry/ability-type/health-bonus.d.ts +8 -0
  69. package/engine/object-data/entry/ability-type/health-bonus.lua +26 -0
  70. package/engine/object-data/entry/ability-type/mana-bonus.d.ts +8 -0
  71. package/engine/object-data/entry/ability-type/mana-bonus.lua +26 -0
  72. package/engine/object-data/entry/ability-type/mana-regeneration.d.ts +8 -0
  73. package/engine/object-data/entry/ability-type/mana-regeneration.lua +26 -0
  74. package/engine/object-data/entry/ability-type/reincarnation.d.ts +8 -0
  75. package/engine/object-data/entry/ability-type/reincarnation.lua +26 -0
  76. package/engine/object-data/entry/ability-type.d.ts +2 -0
  77. package/engine/object-data/entry/ability-type.lua +84 -4
  78. package/engine/object-data/entry/buff-type/applicable.lua +113 -109
  79. package/engine/object-data/entry/destructible-type.d.ts +27 -1
  80. package/engine/object-data/entry/destructible-type.lua +155 -0
  81. package/engine/object-data/entry/unit-type.d.ts +4 -0
  82. package/engine/object-data/entry/unit-type.lua +76 -32
  83. package/engine/object-field/ability.lua +2 -2
  84. package/engine/object-field/item.d.ts +22 -0
  85. package/engine/object-field/item.lua +118 -0
  86. package/engine/object-field/unit.d.ts +20 -5
  87. package/engine/object-field/unit.lua +61 -0
  88. package/engine/object-field.d.ts +10 -2
  89. package/engine/object-field.lua +268 -123
  90. package/engine/random.d.ts +1 -0
  91. package/engine/random.lua +8 -0
  92. package/engine/standard/fields/ability.d.ts +2 -2
  93. package/engine/standard/fields/ability.lua +2 -2
  94. package/engine/standard/fields/item.d.ts +4 -0
  95. package/engine/standard/fields/item.lua +6 -0
  96. package/engine/standard/fields/unit.d.ts +11 -3
  97. package/engine/standard/fields/unit.lua +15 -2
  98. package/engine/text-tag.lua +2 -1
  99. package/engine/unit.d.ts +5 -0
  100. package/engine/unit.lua +5 -0
  101. package/event.d.ts +1 -1
  102. package/lualib_bundle.lua +1 -1
  103. package/math.d.ts +2 -0
  104. package/math.lua +14 -0
  105. package/network.lua +25 -1
  106. package/objutil/buff.lua +9 -7
  107. package/objutil/object.lua +1 -1
  108. package/operation.d.ts +8 -1
  109. package/operation.lua +38 -18
  110. package/package.json +5 -5
  111. package/patch-lua.lua +15 -0
  112. package/utility/linked-map.d.ts +35 -0
  113. package/utility/linked-map.lua +107 -0
  114. package/utility/linked-set.d.ts +3 -1
  115. package/utility/linked-set.lua +27 -0
  116. package/utility/random.d.ts +102 -0
  117. package/utility/random.lua +273 -0
  118. package/utility/records.lua +20 -1
  119. package/utility/unordered-map.d.ts +27 -0
  120. package/utility/unordered-map.lua +99 -0
  121. /package/engine/internal/object-data/{armor-increase.d.ts → armor-bonus.d.ts} +0 -0
  122. /package/engine/internal/object-data/{armor-increase.lua → armor-bonus.lua} +0 -0
  123. /package/engine/object-data/entry/ability-type/{attribute-increase.d.ts → attribute-bonus.d.ts} +0 -0
  124. /package/engine/object-data/entry/ability-type/{attribute-increase.lua → attribute-bonus.lua} +0 -0
@@ -0,0 +1,12 @@
1
+ /** @noSelfInFile */
2
+ import { Event } from "../../../event";
3
+ declare module "../unit" {
4
+ interface Unit {
5
+ readonly unitInRangeEvent: Record<number, Event<[unit: Unit, range: number, unitInRange: Unit]>>;
6
+ }
7
+ }
8
+ declare module "../unit" {
9
+ interface Unit {
10
+ readonly unitOutOfRangeEvent: Record<number, Event<[unit: Unit, range: number, unitOutOfRange: Unit]>>;
11
+ }
12
+ }
@@ -0,0 +1,90 @@
1
+ local ____lualib = require("lualib_bundle")
2
+ local __TS__New = ____lualib.__TS__New
3
+ local __TS__ObjectDefineProperty = ____lualib.__TS__ObjectDefineProperty
4
+ local ____exports = {}
5
+ local ____event = require("event")
6
+ local Event = ____event.Event
7
+ local InitializingEvent = ____event.InitializingEvent
8
+ local TriggerEvent = ____event.TriggerEvent
9
+ local ____unit = require("engine.internal.unit")
10
+ local Unit = ____unit.Unit
11
+ local ____timer = require("core.types.timer")
12
+ local Timer = ____timer.Timer
13
+ local ____attributes = require("attributes")
14
+ local attribute = ____attributes.attribute
15
+ local ____linked_2Dmap = require("utility.linked-map")
16
+ local mutableLinkedMap = ____linked_2Dmap.mutableLinkedMap
17
+ local ____linked_2Dset = require("utility.linked-set")
18
+ local LinkedSet = ____linked_2Dset.LinkedSet
19
+ local mutableLinkedSet = ____linked_2Dset.mutableLinkedSet
20
+ local getTriggerUnit = GetTriggerUnit
21
+ local triggerRegisterUnitInRange = TriggerRegisterUnitInRange
22
+ local eventInvoke = Event.invoke
23
+ __TS__ObjectDefineProperty(
24
+ Unit.prototype,
25
+ "unitInRangeEvent",
26
+ {get = function(self)
27
+ local unit = self
28
+ local handle = self.handle
29
+ local unitInRangeEvent = setmetatable(
30
+ {},
31
+ {__index = function(self, value)
32
+ local event = __TS__New(
33
+ TriggerEvent,
34
+ function(trigger)
35
+ triggerRegisterUnitInRange(trigger, handle, value, nil)
36
+ end,
37
+ function() return unit, value, Unit:of(getTriggerUnit()) end
38
+ )
39
+ rawset(self, value, event)
40
+ return event
41
+ end}
42
+ )
43
+ rawset(self, "unitInRangeEvent", unitInRangeEvent)
44
+ return unitInRangeEvent
45
+ end}
46
+ )
47
+ local units = __TS__New(LinkedSet)
48
+ local unitsInRangeByRangeAttribute = attribute()
49
+ local function registerUnitOfRangeEvent(unit, range, unitInRange)
50
+ units:add(unit)
51
+ unit:getOrPut(unitsInRangeByRangeAttribute, mutableLinkedMap):getOrPut(range, mutableLinkedSet):add(unitInRange)
52
+ end
53
+ __TS__ObjectDefineProperty(
54
+ Unit.prototype,
55
+ "unitOutOfRangeEvent",
56
+ {get = function(self)
57
+ local unit = self
58
+ local unitOutOfRangeEvent = setmetatable(
59
+ {},
60
+ {__index = function(self, value)
61
+ local event = __TS__New(
62
+ InitializingEvent,
63
+ function()
64
+ unit.unitInRangeEvent[value]:addListener(999999, registerUnitOfRangeEvent)
65
+ end
66
+ )
67
+ rawset(self, value, event)
68
+ return event
69
+ end}
70
+ )
71
+ rawset(self, "unitOutOfRangeEvent", unitOutOfRangeEvent)
72
+ return unitOutOfRangeEvent
73
+ end}
74
+ )
75
+ Timer.onPeriod[1]:addListener(function()
76
+ for unit in pairs(units) do
77
+ local unitsInRangeByRange = unit[unitsInRangeByRangeAttribute]
78
+ if unitsInRangeByRange ~= nil then
79
+ for range, unitsInRange in pairs(unitsInRangeByRange) do
80
+ for unitInRange in pairs(unitsInRange) do
81
+ if unit:getDistanceTo(unitInRange) > range then
82
+ unitsInRange:remove(unitInRange)
83
+ eventInvoke(unit.unitOutOfRangeEvent[range], unit, range, unitInRange)
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end)
90
+ return ____exports
@@ -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_FIELD = ____unit.SCALING_VALUE_UNIT_FIELD
8
+ __TS__ObjectDefineProperty(
9
+ Unit.prototype,
10
+ "scale",
11
+ {
12
+ get = function(self)
13
+ return SCALING_VALUE_UNIT_FIELD:getValue(self)
14
+ end,
15
+ set = function(self, value)
16
+ SCALING_VALUE_UNIT_FIELD:setValue(self, value)
17
+ end
18
+ }
19
+ )
20
+ return ____exports
@@ -3,9 +3,9 @@ local __TS__ObjectDefineProperty = ____lualib.__TS__ObjectDefineProperty
3
3
  local ____exports = {}
4
4
  local ____unit = require("engine.internal.unit")
5
5
  local Unit = ____unit.Unit
6
- local ____armor_2Dincrease = require("engine.internal.object-data.armor-increase")
7
- local ARMOR_BONUS_DUMMY_ABILITY_FIELD = ____armor_2Dincrease.ARMOR_BONUS_DUMMY_ABILITY_FIELD
8
- local ARMOR_BONUS_DUMMY_ABILITY_TYPE_ID = ____armor_2Dincrease.ARMOR_BONUS_DUMMY_ABILITY_TYPE_ID
6
+ local ____armor_2Dbonus = require("engine.internal.object-data.armor-bonus")
7
+ local ARMOR_BONUS_DUMMY_ABILITY_FIELD = ____armor_2Dbonus.ARMOR_BONUS_DUMMY_ABILITY_FIELD
8
+ local ARMOR_BONUS_DUMMY_ABILITY_TYPE_ID = ____armor_2Dbonus.ARMOR_BONUS_DUMMY_ABILITY_TYPE_ID
9
9
  local getUnitAbility = BlzGetUnitAbility
10
10
  local setAbilityRealLevelField = BlzSetAbilityRealLevelField
11
11
  local unitAddAbility = UnitAddAbility
@@ -36,11 +36,18 @@ local instantOrderIds = luaSetOf(
36
36
  orderId("undivineshield"),
37
37
  orderId("unimmolation")
38
38
  )
39
- local function reset(source, orderId)
40
- if not (instantOrderIds[orderId] ~= nil) and units:remove(source) then
41
- source[targetAttribute] = nil
42
- source[impactDelayAttribute] = nil
43
- source[passedTimeAttribute] = nil
39
+ ---
40
+ -- @internal For use by internal systems only.
41
+ ____exports.resetAutoAttackTimer = function(unit)
42
+ if units:remove(unit) then
43
+ unit[targetAttribute] = nil
44
+ unit[impactDelayAttribute] = nil
45
+ unit[passedTimeAttribute] = nil
46
+ end
47
+ end
48
+ local function reset(unit, orderId)
49
+ if not (instantOrderIds[orderId] ~= nil) then
50
+ ____exports.resetAutoAttackTimer(unit)
44
51
  end
45
52
  end
46
53
  Unit.onImmediateOrder:addListener(reset)
@@ -139,6 +139,7 @@ export declare class Unit extends Handle<junit> {
139
139
  private _fields?;
140
140
  private getEvent;
141
141
  constructor(handle: junit);
142
+ private saveData;
142
143
  protected onDestroy(): HandleDestructor;
143
144
  addAttackHandler(condition: AttackHandlerCondition, action: AttackHandlerAction): AttackHandler;
144
145
  removeAttackHandler(handler: AttackHandler): boolean;
@@ -177,16 +178,10 @@ export declare class Unit extends Handle<junit> {
177
178
  set xp(v: number);
178
179
  get primaryAttribute(): UnitAttribute;
179
180
  set primaryAttribute(primaryAttribute: UnitAttribute);
180
- get strengthBase(): number;
181
- set strengthBase(strengthBase: number);
182
181
  get strengthBonus(): number;
183
182
  get strength(): number;
184
- get agilityBase(): number;
185
- set agilityBase(agilityBase: number);
186
183
  get agilityBonus(): number;
187
184
  get agility(): number;
188
- get intelligenceBase(): number;
189
- set intelligenceBase(intelligenceBase: number);
190
185
  get intelligenceBonus(): number;
191
186
  get intelligence(): number;
192
187
  get name(): string;
@@ -220,8 +215,6 @@ export declare class Unit extends Handle<junit> {
220
215
  set facing(v: number);
221
216
  get speed(): number;
222
217
  set speed(v: number);
223
- get flyHeight(): number;
224
- set flyHeight(v: number);
225
218
  get x(): number;
226
219
  set x(v: number);
227
220
  get y(): number;
@@ -245,8 +238,6 @@ export declare class Unit extends Handle<junit> {
245
238
  get isInvulnerable(): boolean;
246
239
  get vertexColor(): Color;
247
240
  set vertexColor(v: Color);
248
- get scale(): number;
249
- set scale(v: number);
250
241
  get timeScale(): number;
251
242
  set timeScale(v: number);
252
243
  get collisionSize(): number;
@@ -281,8 +272,6 @@ export declare class Unit extends Handle<junit> {
281
272
  getAbilityRemainingCooldown(abilityId: number): number;
282
273
  startAbilityCooldown(abilityId: number, cooldown: number): void;
283
274
  endAbilityCooldown(abilityId: number): void;
284
- interruptMovement(): void;
285
- interruptAttack(): void;
286
275
  interruptCast(abilityId: number): void;
287
276
  getDistanceTo(target: Unit | Vec2): number;
288
277
  getCollisionDistanceTo(...target: [Unit] | [targetX: number, targetY: number]): number;
@@ -303,7 +292,6 @@ export declare class Unit extends Handle<junit> {
303
292
  set waygateDestination(v: Vec2);
304
293
  get waygateDestination(): Vec2;
305
294
  get abilities(): ReadonlyArray<UnitAbility>;
306
- get onUnitInRange(): Record<number, Event<[Unit]>>;
307
295
  get onManaEqual(): Record<number, Event<[Unit, number]>>;
308
296
  get manaEvent(): Record<Operator, Record<number, Event<[Unit]>>>;
309
297
  get targetAcquiredEvent(): Event;
@@ -322,6 +310,7 @@ export declare class Unit extends Handle<junit> {
322
310
  static getInCollisionRange(x: number, y: number, range: number, predicate?: (unit: Unit) => boolean): Unit[];
323
311
  static getInSector(pos: Vec2, range: number, offsetAngle: number, centralAngle: number): Unit[];
324
312
  static getSelectionOf(player: Player, target?: Unit[]): Unit[];
313
+ static readonly levelChangedEvent: UnitTriggerEvent<[]>;
325
314
  static readonly deathEvent: UnitTriggerEvent<[Unit]>;
326
315
  static readonly onDecay: UnitTriggerEvent<[]>;
327
316
  static readonly onResurrect: InitializingEvent<[Unit], void>;
@@ -64,6 +64,8 @@ local ____ability = require("engine.internal.item.ability")
64
64
  local doUnitAbilityAction = ____ability.doUnitAbilityAction
65
65
  local ____synchronization = require("engine.synchronization")
66
66
  local synchronizer = ____synchronization.synchronizer
67
+ local ____linked_2Dmap = require("utility.linked-map")
68
+ local LinkedMap = ____linked_2Dmap.LinkedMap
67
69
  local match = string.match
68
70
  local ____tostring = _G.tostring
69
71
  local setUnitAnimation = SetUnitAnimation
@@ -73,16 +75,12 @@ local getUnitRealField = BlzGetUnitRealField
73
75
  local getHeroStr = GetHeroStr
74
76
  local getHeroAgi = GetHeroAgi
75
77
  local getHeroInt = GetHeroInt
76
- local setHeroStr = SetHeroStr
77
- local setHeroAgi = SetHeroAgi
78
- local setHeroInt = SetHeroInt
79
78
  local getUnitBooleanField = BlzGetUnitBooleanField
80
79
  local getUnitStringField = BlzGetUnitStringField
81
80
  local setUnitIntegerField = BlzSetUnitIntegerField
82
81
  local setUnitRealField = BlzSetUnitRealField
83
82
  local setUnitBooleanField = BlzSetUnitBooleanField
84
83
  local setUnitStringField = BlzSetUnitStringField
85
- local setUnitScale = SetUnitScale
86
84
  local setUnitPosition = SetUnitPosition
87
85
  local setUnitTimeScale = SetUnitTimeScale
88
86
  local getHandleId = GetHandleId
@@ -110,7 +108,6 @@ local getUnitWeaponStringField = BlzGetUnitWeaponStringField
110
108
  local setUnitWeaponStringField = BlzSetUnitWeaponStringField
111
109
  local getUnitAbilityLevel = GetUnitAbilityLevel
112
110
  local unitDisableAbility = BlzUnitDisableAbility
113
- local unitInterruptAttack = BlzUnitInterruptAttack
114
111
  local isUnitInvisible = IsUnitInvisible
115
112
  local isUnitVisible = IsUnitVisible
116
113
  local getUnitX = GetUnitX
@@ -386,15 +383,27 @@ local modifiers = {
386
383
  end,
387
384
  armor = function(unit, value)
388
385
  if UnitAddAbility(unit, armorBonusAbilityId) then
389
- assert(UnitMakeAbilityPermanent(unit, true, armorBonusAbilityId))
386
+ assert(
387
+ UnitMakeAbilityPermanent(unit, true, armorBonusAbilityId),
388
+ "armor bonus ability must be made permanent",
389
+ unit
390
+ )
390
391
  end
391
- local ability = assert(BlzGetUnitAbility(unit, armorBonusAbilityId))
392
- assert(BlzSetAbilityRealLevelField(
393
- ability,
394
- armorBonusField,
395
- 0,
396
- BlzGetAbilityRealLevelField(ability, armorBonusField, 0) + value
397
- ))
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
+ )
398
407
  end
399
408
  }
400
409
  local getters = {
@@ -648,13 +657,17 @@ local fieldSetters = {
648
657
  }
649
658
  local dummies = {}
650
659
  for ____, player in ipairs(Player.all) do
651
- local dummy = assert(createUnit(
652
- player.handle,
653
- dummyUnitId,
654
- 0,
655
- 0,
656
- 270
657
- ))
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
+ )
658
671
  ShowUnit(dummy, false)
659
672
  dummies[player] = dummy
660
673
  end
@@ -697,41 +710,57 @@ function Unit.prototype.____constructor(self, handle)
697
710
  nextSyncId = ____nextSyncId_1 + 1
698
711
  self.syncId = ____nextSyncId_1
699
712
  self._owner = Player:of(getOwningPlayer(handle))
700
- assert(unitAddAbility(handle, leaveDetectAbilityId) and UnitMakeAbilityPermanent(handle, true, leaveDetectAbilityId))
701
- 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
+ )
702
723
  if unitAddAbility(
703
724
  handle,
704
725
  fourCC("Amrf")
705
726
  ) then
706
- assert(unitRemoveAbility(
707
- handle,
708
- fourCC("Amrf")
709
- ))
727
+ assert(
728
+ unitRemoveAbility(
729
+ handle,
730
+ fourCC("Amrf")
731
+ ),
732
+ "fly ability must be removed after addition",
733
+ self
734
+ )
710
735
  end
711
736
  unitBySyncId[self.syncId] = self
712
737
  local ____ = self.abilities
713
738
  end
714
- function Unit.prototype.getEvent(self, event, collector)
715
- self.events = self.events or ({})
716
- local eventId = GetHandleId(event)
717
- if not self.events[eventId] then
718
- 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(
719
745
  TriggerEvent,
720
746
  function(trigger)
721
- TriggerRegisterUnitEvent(trigger, self.handle, event)
747
+ TriggerRegisterUnitEvent(trigger, self.handle, jevent)
722
748
  end,
723
749
  collector or (function() return {} end)
724
750
  )
751
+ self.events:put(eventId, event)
725
752
  end
726
- 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))
727
760
  end
728
761
  function Unit.prototype.onDestroy(self)
729
762
  local handle = self.handle
730
- self[108] = getUnitX(handle)
731
- self[109] = getUnitY(handle)
732
- if not self._owner then
733
- self._owner = Player:of(getOwningPlayer(handle))
734
- end
763
+ self:saveData()
735
764
  local abilities = self.abilities
736
765
  for ____, ability in ipairs(abilities) do
737
766
  ability:destroy()
@@ -767,7 +796,11 @@ function Unit.prototype.addAttackHandler(self, condition, action)
767
796
  self._attackHandlers = handlers
768
797
  if #handlers == 1 then
769
798
  local handle = self.handle
770
- 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
+ )
771
804
  end
772
805
  return handler
773
806
  end
@@ -980,24 +1013,6 @@ end
980
1013
  function Unit.prototype.endAbilityCooldown(self, abilityId)
981
1014
  BlzEndUnitAbilityCooldown(self.handle, abilityId)
982
1015
  end
983
- function Unit.prototype.interruptMovement(self)
984
- local handle = self.handle
985
- unitDisableAbility(
986
- handle,
987
- fourCC("Amov"),
988
- true,
989
- false
990
- )
991
- unitDisableAbility(
992
- handle,
993
- fourCC("Amov"),
994
- false,
995
- false
996
- )
997
- end
998
- function Unit.prototype.interruptAttack(self)
999
- unitInterruptAttack(self.handle)
1000
- end
1001
1016
  function Unit.prototype.interruptCast(self, abilityId)
1002
1017
  local handle = self.handle
1003
1018
  unitDisableAbility(handle, abilityId, true, false)
@@ -1392,19 +1407,6 @@ __TS__SetDescriptor(
1392
1407
  },
1393
1408
  true
1394
1409
  )
1395
- __TS__SetDescriptor(
1396
- Unit.prototype,
1397
- "strengthBase",
1398
- {
1399
- get = function(self)
1400
- return getHeroStr(self.handle, false)
1401
- end,
1402
- set = function(self, strengthBase)
1403
- setHeroStr(self.handle, strengthBase, true)
1404
- end
1405
- },
1406
- true
1407
- )
1408
1410
  __TS__SetDescriptor(
1409
1411
  Unit.prototype,
1410
1412
  "strengthBonus",
@@ -1422,19 +1424,6 @@ __TS__SetDescriptor(
1422
1424
  end},
1423
1425
  true
1424
1426
  )
1425
- __TS__SetDescriptor(
1426
- Unit.prototype,
1427
- "agilityBase",
1428
- {
1429
- get = function(self)
1430
- return getHeroAgi(self.handle, false)
1431
- end,
1432
- set = function(self, agilityBase)
1433
- setHeroAgi(self.handle, agilityBase, true)
1434
- end
1435
- },
1436
- true
1437
- )
1438
1427
  __TS__SetDescriptor(
1439
1428
  Unit.prototype,
1440
1429
  "agilityBonus",
@@ -1452,19 +1441,6 @@ __TS__SetDescriptor(
1452
1441
  end},
1453
1442
  true
1454
1443
  )
1455
- __TS__SetDescriptor(
1456
- Unit.prototype,
1457
- "intelligenceBase",
1458
- {
1459
- get = function(self)
1460
- return getHeroInt(self.handle, false)
1461
- end,
1462
- set = function(self, intelligenceBase)
1463
- setHeroInt(self.handle, intelligenceBase, true)
1464
- end
1465
- },
1466
- true
1467
- )
1468
1444
  __TS__SetDescriptor(
1469
1445
  Unit.prototype,
1470
1446
  "intelligenceBonus",
@@ -1685,19 +1661,6 @@ __TS__SetDescriptor(
1685
1661
  },
1686
1662
  true
1687
1663
  )
1688
- __TS__SetDescriptor(
1689
- Unit.prototype,
1690
- "flyHeight",
1691
- {
1692
- get = function(self)
1693
- return getUnitFlyHeight(self.handle)
1694
- end,
1695
- set = function(self, v)
1696
- SetUnitFlyHeight(self.handle, v, 100000)
1697
- end
1698
- },
1699
- true
1700
- )
1701
1664
  __TS__SetDescriptor(
1702
1665
  Unit.prototype,
1703
1666
  "x",
@@ -1890,20 +1853,6 @@ __TS__SetDescriptor(
1890
1853
  },
1891
1854
  true
1892
1855
  )
1893
- __TS__SetDescriptor(
1894
- Unit.prototype,
1895
- "scale",
1896
- {
1897
- get = function(self)
1898
- return getUnitRealField(self.handle, UNIT_RF_SCALING_VALUE)
1899
- end,
1900
- set = function(self, v)
1901
- setUnitScale(self.handle, v, v, v)
1902
- setUnitRealField(self.handle, UNIT_RF_SCALING_VALUE, v)
1903
- end
1904
- },
1905
- true
1906
- )
1907
1856
  __TS__SetDescriptor(
1908
1857
  Unit.prototype,
1909
1858
  "timeScale",
@@ -2040,30 +1989,6 @@ __TS__SetDescriptor(
2040
1989
  end},
2041
1990
  true
2042
1991
  )
2043
- __TS__SetDescriptor(
2044
- Unit.prototype,
2045
- "onUnitInRange",
2046
- {get = function(self)
2047
- local handle = self.handle
2048
- local onUnitInRange = setmetatable(
2049
- {},
2050
- {__index = function(self, value)
2051
- local event = __TS__New(
2052
- TriggerEvent,
2053
- function(trigger)
2054
- TriggerRegisterUnitInRangeSimple(trigger, value, handle)
2055
- end,
2056
- function() return ____exports.Unit:of(handle) end
2057
- )
2058
- rawset(self, value, event)
2059
- return event
2060
- end}
2061
- )
2062
- rawset(self, "onUnitInRange", onUnitInRange)
2063
- return onUnitInRange
2064
- end},
2065
- true
2066
- )
2067
1992
  __TS__SetDescriptor(
2068
1993
  Unit.prototype,
2069
1994
  "onManaEqual",
@@ -2199,6 +2124,11 @@ __TS__SetDescriptor(
2199
2124
  end},
2200
2125
  true
2201
2126
  )
2127
+ Unit.levelChangedEvent = __TS__New(
2128
+ ____exports.UnitTriggerEvent,
2129
+ EVENT_PLAYER_HERO_LEVEL,
2130
+ function() return ____exports.Unit:of(getTriggerUnit()) end
2131
+ )
2202
2132
  Unit.deathEvent = __TS__New(
2203
2133
  ____exports.UnitTriggerEvent,
2204
2134
  EVENT_PLAYER_UNIT_DEATH,
@@ -2857,7 +2787,8 @@ Unit.synchronize = synchronizer(
2857
2787
  return
2858
2788
  end
2859
2789
  end
2860
- unit:destroy()
2790
+ unit:saveData()
2791
+ Timer:run(unit, "destroy")
2861
2792
  end)
2862
2793
  end
2863
2794
  end)(Unit)
@@ -12,12 +12,17 @@ export declare class LocalClient {
12
12
  static get isHD(): boolean;
13
13
  static get graphicsMode(): GraphicsMode;
14
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;
15
+ static get isMinimized(): boolean;
16
+ static pingMinimap(x: number, y: number, duration: number, ...parameters: [] | [red: number, green: number, blue: number, flashy?: boolean] | [color: Color, flashy?: boolean]): void;
16
17
  static get mouseFocusUnit(): Async<Unit> | undefined;
17
18
  static get mainSelectedUnit(): Async<Unit> | undefined;
18
19
  static get mainSelectedUnitChangeEvent(): Event<[
19
20
  previousMainSelectedUnit: Unit | undefined,
20
21
  newMainSelectedUnit: Unit | undefined
21
22
  ]>;
23
+ static get isInTargetingMode(): boolean;
24
+ static readonly targetingModeEnterEvent: Event<[]>;
25
+ static readonly targetingModeLeaveEvent: Event<[]>;
26
+ static readonly targetingModeStateChangeEvent: Event<[]>;
22
27
  static readonly onDisconnect: TriggerEvent<[]>;
23
28
  }