warscript 0.0.1-dev.c362181 → 0.0.1-dev.c49e173

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 (81) hide show
  1. package/attributes.d.ts +5 -0
  2. package/attributes.lua +8 -1
  3. package/core/types/effect.d.ts +1 -3
  4. package/core/types/effect.lua +26 -29
  5. package/core/types/order.d.ts +1 -0
  6. package/core/types/order.lua +11 -1
  7. package/core/types/sound.lua +5 -0
  8. package/core/types/timer.d.ts +6 -7
  9. package/core/types/timer.lua +18 -21
  10. package/decl/native.d.ts +840 -786
  11. package/engine/behaviour/ability/damage.d.ts +6 -3
  12. package/engine/behaviour/ability/damage.lua +24 -36
  13. package/engine/behaviour/ability/emulate-impact.lua +7 -0
  14. package/engine/behaviour/ability.d.ts +4 -1
  15. package/engine/behaviour/ability.lua +6 -4
  16. package/engine/behaviour/unit.d.ts +11 -0
  17. package/engine/behaviour/unit.lua +90 -0
  18. package/engine/internal/ability.d.ts +2 -0
  19. package/engine/internal/ability.lua +7 -0
  20. package/engine/internal/item/ability.lua +12 -10
  21. package/engine/internal/item.d.ts +4 -2
  22. package/engine/internal/item.lua +69 -3
  23. package/engine/internal/mechanics/ability-duration.lua +1 -1
  24. package/engine/internal/misc/damage-metadata-by-target.d.ts +2 -0
  25. package/engine/internal/misc/damage-metadata-by-target.lua +5 -0
  26. package/engine/internal/unit/allowed-targets.d.ts +1 -1
  27. package/engine/internal/unit/allowed-targets.lua +9 -1
  28. package/engine/internal/unit+damage.d.ts +2 -11
  29. package/engine/internal/unit+damage.lua +10 -14
  30. package/engine/internal/unit+spellSteal.lua +1 -2
  31. package/engine/internal/unit-missile-launch.lua +1 -1
  32. package/engine/internal/unit.d.ts +20 -3
  33. package/engine/internal/unit.lua +163 -37
  34. package/engine/object-data/auxiliary/attachment-preset.d.ts +7 -2
  35. package/engine/object-data/auxiliary/attachment-preset.lua +4 -3
  36. package/engine/object-data/auxiliary/attack-type.d.ts +7 -8
  37. package/engine/object-data/auxiliary/attack-type.lua +42 -0
  38. package/engine/object-data/auxiliary/movement-type.d.ts +7 -7
  39. package/engine/object-data/auxiliary/movement-type.lua +22 -0
  40. package/engine/object-data/auxiliary/unit-attribute.d.ts +6 -0
  41. package/engine/object-data/auxiliary/unit-attribute.lua +9 -0
  42. package/engine/object-data/entry/ability-type/berserk.d.ts +2 -0
  43. package/engine/object-data/entry/ability-type/berserk.lua +13 -0
  44. package/engine/object-data/entry/ability-type/carrion-swarm.d.ts +14 -0
  45. package/engine/object-data/entry/ability-type/carrion-swarm.lua +65 -0
  46. package/engine/object-data/entry/ability-type/permanent-invisibility.d.ts +8 -0
  47. package/engine/object-data/entry/ability-type/permanent-invisibility.lua +26 -0
  48. package/engine/object-data/entry/ability-type/phase-shift.d.ts +10 -0
  49. package/engine/object-data/entry/ability-type/phase-shift.lua +39 -0
  50. package/engine/object-data/entry/ability-type/shock-wave.d.ts +4 -0
  51. package/engine/object-data/entry/ability-type/shock-wave.lua +26 -0
  52. package/engine/object-data/entry/ability-type/slow-poison.d.ts +10 -0
  53. package/engine/object-data/entry/ability-type/slow-poison.lua +58 -0
  54. package/engine/object-data/entry/ability-type/web.d.ts +12 -0
  55. package/engine/object-data/entry/ability-type/web.lua +52 -0
  56. package/engine/object-data/entry/ability-type.d.ts +11 -11
  57. package/engine/object-data/entry/ability-type.lua +27 -6
  58. package/engine/object-data/entry/buff-type/applicable.lua +5 -0
  59. package/engine/object-data/entry/buff-type.d.ts +5 -11
  60. package/engine/object-data/entry/buff-type.lua +11 -27
  61. package/engine/object-data/entry/unit-type.d.ts +2 -2
  62. package/engine/object-data/entry/unit-type.lua +94 -84
  63. package/engine/object-field/ability.d.ts +1 -1
  64. package/engine/object-field/unit.d.ts +46 -3
  65. package/engine/object-field/unit.lua +173 -7
  66. package/engine/object-field.d.ts +9 -1
  67. package/engine/object-field.lua +158 -76
  68. package/engine/standard/entries/buff-type.d.ts +3 -0
  69. package/engine/standard/entries/buff-type.lua +3 -0
  70. package/objutil/buff.lua +1 -2
  71. package/package.json +2 -2
  72. package/utility/arrays.d.ts +1 -0
  73. package/utility/arrays.lua +3 -0
  74. package/utility/functions.d.ts +1 -0
  75. package/utility/functions.lua +1 -0
  76. package/utility/linked-set.d.ts +1 -0
  77. package/utility/linked-set.lua +3 -0
  78. package/utility/lua-maps.d.ts +3 -0
  79. package/utility/lua-maps.lua +16 -0
  80. package/utility/lua-sets.d.ts +1 -0
  81. package/utility/lua-sets.lua +3 -0
@@ -2,7 +2,7 @@
2
2
  import { CombatClassifications } from "../../object-data/auxiliary/combat-classification";
3
3
  declare module "../unit" {
4
4
  interface Unit {
5
- isAllowedTarget(this: Unit, source: Unit, allowedTargetCombatClassifications: CombatClassifications): boolean;
5
+ isAllowedTarget(this: Unit, source: Unit, allowedTargetCombatClassifications?: CombatClassifications): boolean;
6
6
  }
7
7
  }
8
8
  declare module "../unit" {
@@ -5,7 +5,15 @@ local initializeFilterTargetState = ____combat_2Dclassification.initializeFilter
5
5
  local ____unit = require("engine.internal.unit")
6
6
  local Unit = ____unit.Unit
7
7
  Unit.prototype.isAllowedTarget = function(self, source, allowedTargetCombatClassifications)
8
- initializeFilterTargetState(source, allowedTargetCombatClassifications)
8
+ if allowedTargetCombatClassifications ~= nil then
9
+ initializeFilterTargetState(source, allowedTargetCombatClassifications)
10
+ return filterTarget(self)
11
+ end
12
+ initializeFilterTargetState(source, source.firstWeapon.allowedTargetCombatClassifications)
13
+ if filterTarget(self) then
14
+ return true
15
+ end
16
+ initializeFilterTargetState(source, source.secondWeapon.allowedTargetCombatClassifications)
9
17
  return filterTarget(self)
10
18
  end
11
19
  Unit.getAllowedTargetsInRange = function(source, allowedTargetCombatClassifications, x, y, range)
@@ -1,15 +1,6 @@
1
1
  /** @noSelfInFile */
2
2
  import { Widget } from "../../core/types/widget";
3
- export type AttackType = jattacktype;
4
- export declare namespace AttackType {
5
- const SPELL: jattacktype;
6
- const NORMAL: jattacktype;
7
- const PIERCE: jattacktype;
8
- const SIEGE: jattacktype;
9
- const MAGIC: jattacktype;
10
- const CHAOS: jattacktype;
11
- const HERO: jattacktype;
12
- }
3
+ import { AttackType } from "../object-data/auxiliary/attack-type";
13
4
  export type DamageType = jdamagetype;
14
5
  export declare namespace DamageType {
15
6
  const UNKNOWN: jdamagetype;
@@ -64,6 +55,6 @@ export declare namespace WeaponType {
64
55
  }
65
56
  declare module "./unit" {
66
57
  interface Unit {
67
- damageTarget(target: Widget, amount: number, attack?: boolean, ranged?: boolean, attackType?: AttackType, damageType?: DamageType, weaponType?: WeaponType): boolean;
58
+ damageTarget(target: Widget, amount: number, attack?: boolean, ranged?: boolean, attackType?: AttackType, damageType?: DamageType, weaponType?: WeaponType, metadata?: unknown): boolean;
68
59
  }
69
60
  }
@@ -7,21 +7,14 @@ local ____player = require("core.types.player")
7
7
  local Player = ____player.Player
8
8
  local ____dummy = require("objutil.dummy")
9
9
  local dummyUnitId = ____dummy.dummyUnitId
10
+ local ____attack_2Dtype = require("engine.object-data.auxiliary.attack-type")
11
+ local attackTypeToNative = ____attack_2Dtype.attackTypeToNative
12
+ local ____damage_2Dmetadata_2Dby_2Dtarget = require("engine.internal.misc.damage-metadata-by-target")
13
+ local damageMetadataByTarget = ____damage_2Dmetadata_2Dby_2Dtarget.damageMetadataByTarget
10
14
  local createUnit = CreateUnit
11
15
  local getOwningPlayer = GetOwningPlayer
12
16
  local showUnit = ShowUnit
13
17
  local unitDamageTarget = UnitDamageTarget
14
- ____exports.AttackType = {}
15
- local AttackType = ____exports.AttackType
16
- do
17
- AttackType.SPELL = ATTACK_TYPE_NORMAL
18
- AttackType.NORMAL = ATTACK_TYPE_MELEE
19
- AttackType.PIERCE = ATTACK_TYPE_PIERCE
20
- AttackType.SIEGE = ATTACK_TYPE_SIEGE
21
- AttackType.MAGIC = ATTACK_TYPE_MAGIC
22
- AttackType.CHAOS = ATTACK_TYPE_CHAOS
23
- AttackType.HERO = ATTACK_TYPE_HERO
24
- end
25
18
  ____exports.DamageType = {}
26
19
  local DamageType = ____exports.DamageType
27
20
  do
@@ -88,7 +81,7 @@ for ____, player in ipairs(Player.all) do
88
81
  showUnit(dummy, false)
89
82
  dummies[player] = dummy
90
83
  end
91
- Unit.prototype.damageTarget = function(self, target, amount, attack, ranged, attackType, damageType, weaponType)
84
+ Unit.prototype.damageTarget = function(self, target, amount, attack, ranged, attackType, damageType, weaponType, metadata)
92
85
  if attack == nil then
93
86
  attack = false
94
87
  end
@@ -96,7 +89,7 @@ Unit.prototype.damageTarget = function(self, target, amount, attack, ranged, att
96
89
  ranged = false
97
90
  end
98
91
  if attackType == nil then
99
- attackType = ____exports.AttackType.SPELL
92
+ attackType = 0
100
93
  end
101
94
  if damageType == nil then
102
95
  damageType = ____exports.DamageType.MAGIC
@@ -109,13 +102,16 @@ Unit.prototype.damageTarget = function(self, target, amount, attack, ranged, att
109
102
  if not getOwningPlayer(handle) then
110
103
  handle = dummies[__TS__InstanceOf(target, Unit) and target.owner or (self._owner or Player.neutralAggressive)]
111
104
  end
105
+ if __TS__InstanceOf(target, Unit) then
106
+ damageMetadataByTarget[target] = metadata
107
+ end
112
108
  return unitDamageTarget(
113
109
  handle,
114
110
  targetHandle,
115
111
  amount,
116
112
  attack,
117
113
  ranged,
118
- attackType,
114
+ attackTypeToNative(attackType),
119
115
  damageType,
120
116
  weaponType
121
117
  )
@@ -6,7 +6,6 @@ local ____exports = {}
6
6
  local ____unit = require("engine.internal.unit")
7
7
  local Unit = ____unit.Unit
8
8
  local ____unit_2Bdamage = require("engine.internal.unit+damage")
9
- local AttackType = ____unit_2Bdamage.AttackType
10
9
  local DamageType = ____unit_2Bdamage.DamageType
11
10
  local ____event = require("event")
12
11
  local Event = ____event.Event
@@ -33,7 +32,7 @@ local spellStealEventStack = {}
33
32
  Unit.onDamaging:addListener(function(source, target, event)
34
33
  if event.amount == 0 and source ~= nil then
35
34
  local count = countByUnit[source] or 0
36
- if count > 0 and event.attackType == AttackType.SPELL then
35
+ if count > 0 and event.attackType == 0 then
37
36
  if event.damageType == DamageType.UNKNOWN then
38
37
  spellStealEventStack[#spellStealEventStack + 1] = {
39
38
  sourceBuffIds = source.buffIds,
@@ -44,7 +44,7 @@ local function timerCallback(source, target)
44
44
  Event.invoke(autoAttackFinishEvent, source, target)
45
45
  end
46
46
  Unit.autoAttackStartEvent:addListener(function(source, target)
47
- local attackPoint = source.weapons[1].impactDelay
47
+ local attackPoint = (source:chooseWeapon(target) or source.firstWeapon).impactDelay
48
48
  local timer = Timer:simple(attackPoint, timerCallback, source, target)
49
49
  eventTimerByUnit[source] = timer
50
50
  end)
@@ -11,6 +11,10 @@ import { Ability, UnitAbility } from "./ability";
11
11
  import { Widget } from "../../core/types/widget";
12
12
  import type { UnitTypeId } from "../object-data/entry/unit-type";
13
13
  import { CombatClassification, CombatClassifications } from "../object-data/auxiliary/combat-classification";
14
+ import { MovementType } from "../object-data/auxiliary/movement-type";
15
+ import { UnitAttribute } from "../object-data/auxiliary/unit-attribute";
16
+ import { AttackType } from "../object-data/auxiliary/attack-type";
17
+ import { AttributesHolder } from "../../attributes";
14
18
  export type UnitClassification = junittype;
15
19
  export declare namespace UnitClassification {
16
20
  const STRUCTURE: junittype;
@@ -19,6 +23,7 @@ export declare namespace UnitClassification {
19
23
  const GROUND: junittype;
20
24
  const SUMMONED: junittype;
21
25
  const MECHANICAL: junittype;
26
+ const WORKER: junittype;
22
27
  const ANCIENT: junittype;
23
28
  const SUICIDAL: junittype;
24
29
  const TAUREN: junittype;
@@ -36,15 +41,18 @@ type AbilityDispatcherTable<T extends any[] = []> = {
36
41
  readonly [id: number]: Event<[Unit, Ability, ...T]>;
37
42
  };
38
43
  type AbilityEventDispatcher<T extends any[] = []> = Event<[Unit, Ability, ...T]> & AbilityDispatcherTable<T>;
39
- export interface DamagingEvent {
44
+ export interface DamagingEvent extends AttributesHolder {
40
45
  amount: number;
41
- attackType: jattacktype;
46
+ attackType: AttackType;
42
47
  damageType: jdamagetype;
43
48
  weaponType: jweapontype;
49
+ metadata: unknown;
44
50
  readonly isAttack: boolean;
45
51
  readonly originalAmount: number;
52
+ readonly originalMetadata: unknown;
53
+ preventRetaliation(this: DamagingEvent): void;
46
54
  }
47
- export type DamageEvent = DamagingEvent & {
55
+ export type DamageEvent = Omit<DamagingEvent, "preventRetaliation"> & {
48
56
  preventDeath<P extends any[]>(this: DamageEvent, callback: (this: void, ...parameters: P) => any, ...parameters: P): void;
49
57
  };
50
58
  export type AttackDamageEvent = DamagingEvent & {
@@ -76,6 +84,8 @@ export declare class UnitWeapon {
76
84
  set cooldown(cooldown: number);
77
85
  get damage(): [minimumDamage: number, maximumDamage: number];
78
86
  set damage([minimumDamage, maximumDamage]: [number, number]);
87
+ get allowedTargetCombatClassifications(): CombatClassifications;
88
+ set allowedTargetCombatClassifications(allowedTargetCombatClassifications: CombatClassifications);
79
89
  get damageBase(): number;
80
90
  set damageBase(damageBase: number);
81
91
  get damageDiceCount(): number;
@@ -157,10 +167,13 @@ export declare class Unit extends Handle<junit> {
157
167
  get weapons(): [UnitWeapon, UnitWeapon];
158
168
  get firstWeapon(): UnitWeapon;
159
169
  get secondWeapon(): UnitWeapon;
170
+ chooseWeapon(target: Unit): UnitWeapon | undefined;
160
171
  get level(): number;
161
172
  set level(v: number);
162
173
  get xp(): number;
163
174
  set xp(v: number);
175
+ get primaryAttribute(): UnitAttribute;
176
+ set primaryAttribute(primaryAttribute: UnitAttribute);
164
177
  get strengthBase(): number;
165
178
  set strengthBase(strengthBase: number);
166
179
  get strengthBonus(): number;
@@ -235,6 +248,8 @@ export declare class Unit extends Handle<junit> {
235
248
  set timeScale(v: number);
236
249
  get collisionSize(): number;
237
250
  get pathingCollisionRange(): number;
251
+ get movementType(): MovementType;
252
+ set movementType(movementType: MovementType);
238
253
  set pathing(v: boolean);
239
254
  isSelected(player: Player): boolean;
240
255
  explode(): void;
@@ -285,6 +300,7 @@ export declare class Unit extends Handle<junit> {
285
300
  get onUnitInRange(): Record<number, Event<[Unit]>>;
286
301
  get onManaEqual(): Record<number, Event<[Unit, number]>>;
287
302
  get manaEvent(): Record<Operator, Record<number, Event<[Unit]>>>;
303
+ get targetAcquiredEvent(): Event;
288
304
  get onSelect(): Event;
289
305
  get onDeselect(): Event;
290
306
  get onImmediateOrder(): Event<[number]>;
@@ -338,6 +354,7 @@ export declare class Unit extends Handle<junit> {
338
354
  static itemPickedUpEvent: UnitTriggerEvent<[Item]>;
339
355
  static itemUsedEvent: UnitTriggerEvent<[Item]>;
340
356
  static itemStackedEvent: UnitTriggerEvent<[Item]>;
357
+ static get itemChargesChangedEvent(): Event<[unit: Unit, item: Item]>;
341
358
  static get itemUseOrderEvent(): Event<[unit: Unit, item: Item]>;
342
359
  static get itemMoveOrderEvent(): Event<[
343
360
  unit: Unit,
@@ -53,13 +53,17 @@ local ____math = require("math")
53
53
  local min = ____math.min
54
54
  local ____ignore_2Devents_2Ditems = require("engine.internal.unit.ignore-events-items")
55
55
  local ignoreEventsItems = ____ignore_2Devents_2Ditems.ignoreEventsItems
56
+ local ____attack_2Dtype = require("engine.object-data.auxiliary.attack-type")
57
+ local attackTypeToNative = ____attack_2Dtype.attackTypeToNative
58
+ local nativeToAttackType = ____attack_2Dtype.nativeToAttackType
59
+ local ____damage_2Dmetadata_2Dby_2Dtarget = require("engine.internal.misc.damage-metadata-by-target")
60
+ local damageMetadataByTarget = ____damage_2Dmetadata_2Dby_2Dtarget.damageMetadataByTarget
61
+ local ____attributes = require("attributes")
62
+ local isAttribute = ____attributes.isAttribute
56
63
  local match = string.match
57
64
  local ____tostring = _G.tostring
58
65
  local setUnitAnimation = SetUnitAnimation
59
- local setUnitAnimationWithRarity = SetUnitAnimationWithRarity
60
66
  local setUnitAnimationByIndex = SetUnitAnimationByIndex
61
- local resetUnitAnimation = ResetUnitAnimation
62
- local queueUnitAnimation = QueueUnitAnimation
63
67
  local getUnitIntegerField = BlzGetUnitIntegerField
64
68
  local getUnitRealField = BlzGetUnitRealField
65
69
  local getHeroStr = GetHeroStr
@@ -81,7 +85,6 @@ local getHandleId = GetHandleId
81
85
  local getUnitCurrentOrder = GetUnitCurrentOrder
82
86
  local createUnit = CreateUnit
83
87
  local killUnit = KillUnit
84
- local setUnitExploded = SetUnitExploded
85
88
  local removeUnit = RemoveUnit
86
89
  local getUnitTypeId = GetUnitTypeId
87
90
  local isHeroUnitId = IsHeroUnitId
@@ -97,8 +100,6 @@ local getSpellTargetItem = GetSpellTargetItem
97
100
  local getSpellTargetDestructable = GetSpellTargetDestructable
98
101
  local isUnitInRangeXY = IsUnitInRangeXY
99
102
  local isUnitInRange = IsUnitInRange
100
- local setResourceAmount = SetResourceAmount
101
- local getResourceAmount = GetResourceAmount
102
103
  local getUnitWeaponRealField = BlzGetUnitWeaponRealField
103
104
  local setUnitWeaponRealField = BlzSetUnitWeaponRealField
104
105
  local getUnitWeaponStringField = BlzGetUnitWeaponStringField
@@ -129,8 +130,6 @@ local isUnitType = IsUnitType
129
130
  local isUnitAlly = IsUnitAlly
130
131
  local isUnitEnemy = IsUnitEnemy
131
132
  local getOwningPlayer = GetOwningPlayer
132
- local setUnitColor = SetUnitColor
133
- local showUnitTeamGlow = BlzShowUnitTeamGlow
134
133
  ____exports.UnitClassification = {}
135
134
  local UnitClassification = ____exports.UnitClassification
136
135
  do
@@ -140,6 +139,7 @@ do
140
139
  UnitClassification.GROUND = UNIT_TYPE_GROUND
141
140
  UnitClassification.SUMMONED = UNIT_TYPE_SUMMONED
142
141
  UnitClassification.MECHANICAL = UNIT_TYPE_MECHANICAL
142
+ UnitClassification.WORKER = UNIT_TYPE_PEON
143
143
  UnitClassification.ANCIENT = UNIT_TYPE_ANCIENT
144
144
  UnitClassification.SUICIDAL = UNIT_TYPE_SAPPER
145
145
  UnitClassification.TAUREN = UNIT_TYPE_TAUREN
@@ -347,6 +347,9 @@ local function dispatchAbility(event)
347
347
  }
348
348
  )
349
349
  end
350
+ local function damagingEventPreventRetaliation(self)
351
+ self[0] = true
352
+ end
350
353
  local function damageEventPreventDeath(self, callback, ...)
351
354
  if self[0] ~= nil then
352
355
  return
@@ -358,7 +361,14 @@ local function damageEventPreventDeath(self, callback, ...)
358
361
  rawset(self, 1 + i, (select(i, ...)))
359
362
  end
360
363
  end
361
- local damageSetters = {amount = BlzSetEventDamage, attackType = BlzSetEventAttackType, damageType = BlzSetEventDamageType, weaponType = BlzSetEventWeaponType}
364
+ local damageSetters = {
365
+ amount = BlzSetEventDamage,
366
+ attackType = function(attackType)
367
+ return BlzSetEventAttackType(attackTypeToNative(attackType))
368
+ end,
369
+ damageType = BlzSetEventDamageType,
370
+ weaponType = BlzSetEventWeaponType
371
+ }
362
372
  local jlimitopByOperator = {
363
373
  [0] = LESS_THAN_OR_EQUAL,
364
374
  [1] = LESS_THAN_OR_EQUAL,
@@ -436,6 +446,19 @@ __TS__SetDescriptor(
436
446
  },
437
447
  true
438
448
  )
449
+ __TS__SetDescriptor(
450
+ UnitWeapon.prototype,
451
+ "allowedTargetCombatClassifications",
452
+ {
453
+ get = function(self)
454
+ return BlzGetUnitWeaponIntegerField(self.unit.handle, UNIT_WEAPON_IF_ATTACK_TARGETS_ALLOWED, self.index)
455
+ end,
456
+ set = function(self, allowedTargetCombatClassifications)
457
+ BlzSetUnitWeaponIntegerField(self.unit.handle, UNIT_WEAPON_IF_ATTACK_TARGETS_ALLOWED, self.index, allowedTargetCombatClassifications)
458
+ end
459
+ },
460
+ true
461
+ )
439
462
  __TS__SetDescriptor(
440
463
  UnitWeapon.prototype,
441
464
  "damageBase",
@@ -640,7 +663,8 @@ local function delayHealthChecksCallback(unit)
640
663
  end
641
664
  end
642
665
  local nextSyncId = 1
643
- local unitBySyncId = setmetatable({}, {__mode = "k"})
666
+ local unitBySyncId = setmetatable({}, {__mode = "v"})
667
+ local damagingEventByTarget = setmetatable({}, {__mode = "k"})
644
668
  ____exports.Unit = __TS__Class()
645
669
  local Unit = ____exports.Unit
646
670
  Unit.name = "Unit"
@@ -793,16 +817,25 @@ function Unit.prototype.playAnimation(self, animation, rarity)
793
817
  if type(animation) == "number" then
794
818
  setUnitAnimationByIndex(self.handle, animation)
795
819
  elseif rarity then
796
- setUnitAnimationWithRarity(self.handle, animation, rarity)
820
+ SetUnitAnimationWithRarity(self.handle, animation, rarity)
797
821
  else
798
822
  setUnitAnimation(self.handle, animation)
799
823
  end
800
824
  end
801
825
  function Unit.prototype.resetAnimation(self)
802
- resetUnitAnimation(self.handle)
826
+ ResetUnitAnimation(self.handle)
803
827
  end
804
828
  function Unit.prototype.queueAnimation(self, animation)
805
- queueUnitAnimation(self.handle, animation)
829
+ QueueUnitAnimation(self.handle, animation)
830
+ end
831
+ function Unit.prototype.chooseWeapon(self, target)
832
+ if target:isAllowedTarget(self, self.firstWeapon.allowedTargetCombatClassifications) then
833
+ return self.firstWeapon
834
+ end
835
+ if target:isAllowedTarget(target, self.secondWeapon.allowedTargetCombatClassifications) then
836
+ return self.secondWeapon
837
+ end
838
+ return nil
806
839
  end
807
840
  function Unit.prototype.delayHealthChecks(self)
808
841
  self[103] = (self[103] or 0) + 1
@@ -815,7 +848,7 @@ function Unit.prototype.isSelected(self, player)
815
848
  return IsUnitSelected(self.handle, player.handle)
816
849
  end
817
850
  function Unit.prototype.explode(self)
818
- setUnitExploded(self.handle, true)
851
+ SetUnitExploded(self.handle, true)
819
852
  killUnit(self.handle)
820
853
  end
821
854
  function Unit.prototype.kill(self)
@@ -1292,6 +1325,19 @@ __TS__SetDescriptor(
1292
1325
  },
1293
1326
  true
1294
1327
  )
1328
+ __TS__SetDescriptor(
1329
+ Unit.prototype,
1330
+ "primaryAttribute",
1331
+ {
1332
+ get = function(self)
1333
+ return getUnitIntegerField(self.handle, UNIT_IF_PRIMARY_ATTRIBUTE)
1334
+ end,
1335
+ set = function(self, primaryAttribute)
1336
+ setUnitIntegerField(self.handle, UNIT_IF_PRIMARY_ATTRIBUTE, primaryAttribute)
1337
+ end
1338
+ },
1339
+ true
1340
+ )
1295
1341
  __TS__SetDescriptor(
1296
1342
  Unit.prototype,
1297
1343
  "strengthBase",
@@ -1416,7 +1462,7 @@ __TS__SetDescriptor(
1416
1462
  return not self[106]
1417
1463
  end,
1418
1464
  set = function(self, isTeamGlowVisible)
1419
- showUnitTeamGlow(self.handle, isTeamGlowVisible)
1465
+ BlzShowUnitTeamGlow(self.handle, isTeamGlowVisible)
1420
1466
  local ____temp_6
1421
1467
  if not isTeamGlowVisible then
1422
1468
  ____temp_6 = true
@@ -1432,9 +1478,9 @@ __TS__SetDescriptor(
1432
1478
  Unit.prototype,
1433
1479
  "color",
1434
1480
  {set = function(self, color)
1435
- setUnitColor(self.handle, color.handle)
1481
+ SetUnitColor(self.handle, color.handle)
1436
1482
  if self[106] then
1437
- showUnitTeamGlow(self.handle, false)
1483
+ BlzShowUnitTeamGlow(self.handle, false)
1438
1484
  end
1439
1485
  end},
1440
1486
  true
@@ -1702,10 +1748,10 @@ __TS__SetDescriptor(
1702
1748
  "gold",
1703
1749
  {
1704
1750
  get = function(self)
1705
- return getResourceAmount(self.handle)
1751
+ return GetResourceAmount(self.handle)
1706
1752
  end,
1707
1753
  set = function(self, gold)
1708
- setResourceAmount(self.handle, gold)
1754
+ SetResourceAmount(self.handle, gold)
1709
1755
  end
1710
1756
  },
1711
1757
  true
@@ -1833,6 +1879,19 @@ __TS__SetDescriptor(
1833
1879
  end},
1834
1880
  true
1835
1881
  )
1882
+ __TS__SetDescriptor(
1883
+ Unit.prototype,
1884
+ "movementType",
1885
+ {
1886
+ get = function(self)
1887
+ return getUnitIntegerField(self.handle, UNIT_IF_MOVE_TYPE)
1888
+ end,
1889
+ set = function(self, movementType)
1890
+ setUnitIntegerField(self.handle, UNIT_IF_MOVE_TYPE, movementType)
1891
+ end
1892
+ },
1893
+ true
1894
+ )
1836
1895
  __TS__SetDescriptor(
1837
1896
  Unit.prototype,
1838
1897
  "pathing",
@@ -2014,6 +2073,14 @@ __TS__SetDescriptor(
2014
2073
  end},
2015
2074
  true
2016
2075
  )
2076
+ __TS__SetDescriptor(
2077
+ Unit.prototype,
2078
+ "targetAcquiredEvent",
2079
+ {get = function(self)
2080
+ return self:getEvent(EVENT_UNIT_ACQUIRED_TARGET)
2081
+ end},
2082
+ true
2083
+ )
2017
2084
  __TS__SetDescriptor(
2018
2085
  Unit.prototype,
2019
2086
  "onSelect",
@@ -2375,13 +2442,19 @@ Unit.onDamaging = (function()
2375
2442
  if source and source.typeId == dummyUnitId then
2376
2443
  source = nil
2377
2444
  end
2378
- local target = BlzGetEventDamageTarget()
2445
+ local target = ____exports.Unit:of(BlzGetEventDamageTarget())
2446
+ local metadata = damageMetadataByTarget[target]
2447
+ damageMetadataByTarget[target] = nil
2379
2448
  local data = {
2380
2449
  amount = GetEventDamage(),
2381
- attackType = BlzGetEventAttackType(),
2450
+ attackType = nativeToAttackType(BlzGetEventAttackType()),
2382
2451
  damageType = BlzGetEventDamageType(),
2383
2452
  weaponType = BlzGetEventWeaponType(),
2384
- isAttack = BlzGetEventIsAttack()
2453
+ metadata = metadata,
2454
+ isAttack = BlzGetEventIsAttack(),
2455
+ originalAmount = GetEventDamage(),
2456
+ originalMetadata = metadata,
2457
+ preventRetaliation = damagingEventPreventRetaliation
2385
2458
  }
2386
2459
  if data.isAttack and source then
2387
2460
  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
@@ -2395,18 +2468,36 @@ Unit.onDamaging = (function()
2395
2468
  invoke(
2396
2469
  event,
2397
2470
  source,
2398
- ____exports.Unit:of(target),
2471
+ target,
2399
2472
  setmetatable(
2400
2473
  {},
2401
2474
  {
2402
2475
  __index = data,
2403
2476
  __newindex = function(self, key, value)
2404
- damageSetters[key](value)
2477
+ local damageSetter = damageSetters[key]
2478
+ if damageSetter ~= nil then
2479
+ damageSetter(value)
2480
+ end
2405
2481
  data[key] = value
2406
2482
  end
2407
2483
  }
2408
2484
  )
2409
2485
  )
2486
+ if data[0] and source then
2487
+ local sourceOwner = source.owner.handle
2488
+ data[1] = sourceOwner
2489
+ local targetOwner = target.owner.handle
2490
+ data[2] = targetOwner
2491
+ if not GetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE) then
2492
+ SetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE, true)
2493
+ data[3] = true
2494
+ end
2495
+ if not GetPlayerAlliance(targetOwner, sourceOwner, ALLIANCE_PASSIVE) then
2496
+ SetPlayerAlliance(targetOwner, sourceOwner, ALLIANCE_PASSIVE, true)
2497
+ data[4] = true
2498
+ end
2499
+ end
2500
+ damagingEventByTarget[target] = data
2410
2501
  return
2411
2502
  end
2412
2503
  BlzSetEventDamage(0)
@@ -2414,7 +2505,7 @@ Unit.onDamaging = (function()
2414
2505
  BlzSetEventDamageType(DAMAGE_TYPE_UNKNOWN)
2415
2506
  BlzSetEventWeaponType(WEAPON_TYPE_WHOKNOWS)
2416
2507
  local sourceOwner = source.owner.handle
2417
- local targetOwner = GetOwningPlayer(target)
2508
+ local targetOwner = target.owner.handle
2418
2509
  if not GetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE) then
2419
2510
  SetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE, true)
2420
2511
  Timer:run(function()
@@ -2430,23 +2521,19 @@ Unit.onDamaging = (function()
2430
2521
  for ____, ____value in ipairs(source._attackHandlers) do
2431
2522
  local condition = ____value[1]
2432
2523
  local action = ____value[2]
2433
- if condition(
2434
- source,
2435
- ____exports.Unit:of(target),
2436
- data
2437
- ) then
2524
+ if condition(source, target, data) then
2438
2525
  action(
2439
2526
  source,
2440
- ____exports.Unit:of(target),
2527
+ target,
2441
2528
  setmetatable(
2442
2529
  {fire = function()
2443
2530
  UnitDamageTarget(
2444
2531
  source.handle,
2445
- target,
2532
+ target.handle,
2446
2533
  data.amount,
2447
2534
  true,
2448
2535
  true,
2449
- data.attackType,
2536
+ attackTypeToNative(data.attackType),
2450
2537
  data.damageType,
2451
2538
  data.weaponType
2452
2539
  )
@@ -2473,26 +2560,50 @@ Unit.onDamage = __TS__New(
2473
2560
  if source and source.typeId == dummyUnitId then
2474
2561
  source = nil
2475
2562
  end
2563
+ local target = ____exports.Unit:of(BlzGetEventDamageTarget())
2564
+ local damagingEvent = damagingEventByTarget[target]
2565
+ damagingEventByTarget[target] = nil
2476
2566
  local data = {
2477
2567
  amount = GetEventDamage(),
2478
- attackType = BlzGetEventAttackType(),
2568
+ attackType = nativeToAttackType(BlzGetEventAttackType()),
2479
2569
  damageType = BlzGetEventDamageType(),
2480
2570
  weaponType = BlzGetEventWeaponType(),
2571
+ metadata = damagingEvent and damagingEvent.metadata,
2481
2572
  isAttack = BlzGetEventIsAttack(),
2482
- originalAmount = GetEventDamage(),
2573
+ originalAmount = damagingEvent and damagingEvent.originalAmount or GetEventDamage(),
2574
+ originalMetadata = damagingEvent and damagingEvent.originalMetadata,
2483
2575
  preventDeath = damageEventPreventDeath
2484
2576
  }
2577
+ if damagingEvent then
2578
+ for key, value in pairs(damagingEvent) do
2579
+ if isAttribute(key) then
2580
+ data[key] = value
2581
+ end
2582
+ end
2583
+ local sourceOwner = damagingEvent[1]
2584
+ if sourceOwner then
2585
+ local targetOwner = damagingEvent[2]
2586
+ if damagingEvent[3] then
2587
+ SetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE, false)
2588
+ end
2589
+ if damagingEvent[4] then
2590
+ SetPlayerAlliance(targetOwner, sourceOwner, ALLIANCE_PASSIVE, false)
2591
+ end
2592
+ end
2593
+ end
2485
2594
  local evData = setmetatable(
2486
2595
  {},
2487
2596
  {
2488
2597
  __index = data,
2489
2598
  __newindex = function(self, key, value)
2490
- damageSetters[key](value)
2599
+ local damageSetter = damageSetters[key]
2600
+ if damageSetter ~= nil then
2601
+ damageSetter(value)
2602
+ end
2491
2603
  data[key] = value
2492
2604
  end
2493
2605
  }
2494
2606
  )
2495
- local target = ____exports.Unit:of(BlzGetEventDamageTarget())
2496
2607
  invoke(event, source, target, evData)
2497
2608
  if evData[0] ~= nil and target.health - evData.amount < 0.405 then
2498
2609
  local bonusHealth = math.ceil(evData.amount)
@@ -2571,6 +2682,21 @@ Unit.itemStackedEvent = __TS__New(
2571
2682
  EVENT_PLAYER_UNIT_STACK_ITEM,
2572
2683
  function() return ____exports.Unit:of(getTriggerUnit()), Item:of(getManipulatedItem()) end
2573
2684
  )
2685
+ __TS__ObjectDefineProperty(
2686
+ Unit,
2687
+ "itemChargesChangedEvent",
2688
+ {get = function(self)
2689
+ local event = __TS__New(Event)
2690
+ Item.chargesChangedEvent:addListener(function(item)
2691
+ local unit = item.owner
2692
+ if unit ~= nil then
2693
+ invoke(event, unit, item)
2694
+ end
2695
+ end)
2696
+ rawset(self, "itemChargesChangedEvent", event)
2697
+ return event
2698
+ end}
2699
+ )
2574
2700
  __TS__ObjectDefineProperty(
2575
2701
  Unit,
2576
2702
  "itemUseOrderEvent",
@@ -2,13 +2,18 @@
2
2
  import { ModelNodeName } from "./model-node-name";
3
3
  import { ModelNodeQualifier } from "./model-node-qualifier";
4
4
  import { Optional } from "../../../utility/types";
5
+ import { EffectParameters } from "../../../core/types/effect";
5
6
  export type AttachmentPreset = {
6
7
  modelPath: string;
7
8
  nodeName: ModelNodeName;
8
9
  nodeQualifiers: ModelNodeQualifier[];
9
10
  };
10
- export type AttachmentPresetInput = Optional<AttachmentPreset, "nodeQualifiers"> | string;
11
- export declare const toAttachmentPreset: (attachmentPresetInput: AttachmentPresetInput) => AttachmentPreset;
11
+ export type EffectPresetWithParameters = AttachmentPreset & {
12
+ parameters?: EffectParameters;
13
+ };
14
+ export type AttachmentPresetInput<T extends AttachmentPreset = AttachmentPreset> = Optional<T, "nodeName" | "nodeQualifiers"> | string;
15
+ export type EffectPresetWithParametersInput = AttachmentPresetInput<EffectPresetWithParameters>;
16
+ export declare const toEffectPreset: (effectPresetInput: EffectPresetWithParametersInput) => EffectPresetWithParameters;
12
17
  export declare const extractAttachmentPresetInputModelPath: (attachmentPresetInput: AttachmentPresetInput | undefined) => string;
13
18
  export declare const extractAttachmentPresetInputNodeFQN: (attachmentPresetInput: AttachmentPresetInput | undefined) => string;
14
19
  export declare const splitAttachmentNodeFQN: (attachmentNodeFQN: string) => LuaMultiReturn<[attachmentNodeName: ModelNodeName, attachmentNodeQualifiers: ModelNodeQualifier[]]>;