warscript 0.0.1-dev.ea10f2b → 0.0.1-dev.eb24bc1

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 (57) 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/sound.lua +5 -0
  6. package/core/types/timer.d.ts +6 -7
  7. package/core/types/timer.lua +18 -21
  8. package/decl/native.d.ts +840 -786
  9. package/engine/behaviour/ability/damage.d.ts +6 -3
  10. package/engine/behaviour/ability/damage.lua +24 -36
  11. package/engine/behaviour/ability/emulate-impact.lua +7 -0
  12. package/engine/internal/item.d.ts +2 -1
  13. package/engine/internal/misc/damage-metadata-by-target.d.ts +2 -0
  14. package/engine/internal/misc/damage-metadata-by-target.lua +5 -0
  15. package/engine/internal/unit+damage.d.ts +2 -11
  16. package/engine/internal/unit+damage.lua +10 -14
  17. package/engine/internal/unit+spellSteal.lua +1 -2
  18. package/engine/internal/unit.d.ts +12 -2
  19. package/engine/internal/unit.lua +89 -37
  20. package/engine/object-data/auxiliary/attachment-preset.d.ts +7 -2
  21. package/engine/object-data/auxiliary/attachment-preset.lua +4 -3
  22. package/engine/object-data/auxiliary/attack-type.d.ts +7 -8
  23. package/engine/object-data/auxiliary/attack-type.lua +42 -0
  24. package/engine/object-data/auxiliary/movement-type.d.ts +7 -7
  25. package/engine/object-data/auxiliary/movement-type.lua +22 -0
  26. package/engine/object-data/auxiliary/unit-attribute.d.ts +6 -0
  27. package/engine/object-data/auxiliary/unit-attribute.lua +9 -0
  28. package/engine/object-data/entry/ability-type/berserk.d.ts +2 -0
  29. package/engine/object-data/entry/ability-type/berserk.lua +13 -0
  30. package/engine/object-data/entry/ability-type/slow-poison.d.ts +10 -0
  31. package/engine/object-data/entry/ability-type/slow-poison.lua +58 -0
  32. package/engine/object-data/entry/ability-type.d.ts +11 -11
  33. package/engine/object-data/entry/ability-type.lua +27 -6
  34. package/engine/object-data/entry/buff-type/applicable.lua +5 -0
  35. package/engine/object-data/entry/buff-type.d.ts +5 -11
  36. package/engine/object-data/entry/buff-type.lua +11 -27
  37. package/engine/object-data/entry/unit-type.d.ts +2 -2
  38. package/engine/object-data/entry/unit-type.lua +94 -84
  39. package/engine/object-field/ability.d.ts +1 -1
  40. package/engine/object-field/unit.d.ts +46 -3
  41. package/engine/object-field/unit.lua +173 -7
  42. package/engine/object-field.d.ts +9 -1
  43. package/engine/object-field.lua +158 -76
  44. package/engine/standard/entries/buff-type.d.ts +3 -0
  45. package/engine/standard/entries/buff-type.lua +3 -0
  46. package/objutil/buff.lua +1 -2
  47. package/package.json +2 -2
  48. package/utility/arrays.d.ts +1 -0
  49. package/utility/arrays.lua +3 -0
  50. package/utility/functions.d.ts +1 -0
  51. package/utility/functions.lua +1 -0
  52. package/utility/linked-set.d.ts +1 -0
  53. package/utility/linked-set.lua +3 -0
  54. package/utility/lua-maps.d.ts +3 -0
  55. package/utility/lua-maps.lua +16 -0
  56. package/utility/lua-sets.d.ts +1 -0
  57. package/utility/lua-sets.lua +3 -0
@@ -4,26 +4,29 @@ import { Ability } from "../../internal/ability";
4
4
  import { Unit } from "../../internal/unit";
5
5
  import { AbilityDependentValue } from "../../object-field/ability";
6
6
  import { Widget } from "../../../core/types/widget";
7
- import { AttackType, DamageType, WeaponType } from "../../internal/unit+damage";
7
+ import { DamageType, WeaponType } from "../../internal/unit+damage";
8
8
  import { CombatClassifications } from "../../object-data/auxiliary/combat-classification";
9
+ import { AttackType } from "../../object-data/auxiliary/attack-type";
9
10
  export type DamageAbilityBehaviorParameters = {
10
11
  damagePerStrength?: AbilityDependentValue<number>;
11
12
  damagePerAgility?: AbilityDependentValue<number>;
12
13
  damagePerIntelligence?: AbilityDependentValue<number>;
13
- attackType?: AttackType;
14
+ attackType?: AbilityDependentValue<AttackType>;
14
15
  damageType?: DamageType;
15
16
  weaponType?: WeaponType;
17
+ metadata?: AbilityDependentValue<string | number | boolean>;
16
18
  };
17
19
  export type DamageAreaAbilityBehaviorParameters = DamageAbilityBehaviorParameters & {
18
20
  maximumDamage?: AbilityDependentValue<number>;
19
21
  areaOfEffect?: AbilityDependentValue<number>;
20
22
  allowedTargetCombatClassifications?: AbilityDependentValue<CombatClassifications>;
21
23
  };
22
- declare abstract class DamageAbilityBehavior<T extends DamageAbilityBehaviorParameters = DamageAbilityBehaviorParameters> extends AbilityBehavior {
24
+ export declare abstract class DamageAbilityBehavior<T extends DamageAbilityBehaviorParameters = DamageAbilityBehaviorParameters> extends AbilityBehavior {
23
25
  protected readonly damage: AbilityDependentValue<number>;
24
26
  protected readonly parameters?: T | undefined;
25
27
  protected constructor(ability: Ability, damage: AbilityDependentValue<number>, parameters?: T | undefined);
26
28
  protected calculateDamage(caster: Unit): number;
29
+ protected damageTarget(caster: Unit, target: Widget, damage?: number): void;
27
30
  }
28
31
  export declare class DamageSelfAbilityBehavior extends DamageAbilityBehavior {
29
32
  constructor(ability: Ability, damage: AbilityDependentValue<number>, parameters?: DamageAbilityBehaviorParameters);
@@ -9,7 +9,8 @@ local Unit = ____unit.Unit
9
9
  local ____ability = require("engine.standard.fields.ability")
10
10
  local ALLOWED_TARGETS_ABILITY_COMBAT_CLASSIFICATIONS_LEVEL_FIELD = ____ability.ALLOWED_TARGETS_ABILITY_COMBAT_CLASSIFICATIONS_LEVEL_FIELD
11
11
  local AREA_OF_EFFECT_ABILITY_FLOAT_LEVEL_FIELD = ____ability.AREA_OF_EFFECT_ABILITY_FLOAT_LEVEL_FIELD
12
- local DamageAbilityBehavior = __TS__Class()
12
+ ____exports.DamageAbilityBehavior = __TS__Class()
13
+ local DamageAbilityBehavior = ____exports.DamageAbilityBehavior
13
14
  DamageAbilityBehavior.name = "DamageAbilityBehavior"
14
15
  __TS__ClassExtends(DamageAbilityBehavior, AbilityBehavior)
15
16
  function DamageAbilityBehavior.prototype.____constructor(self, ability, damage, parameters)
@@ -34,49 +35,44 @@ function DamageAbilityBehavior.prototype.calculateDamage(self, caster)
34
35
  end
35
36
  return damage
36
37
  end
37
- ____exports.DamageSelfAbilityBehavior = __TS__Class()
38
- local DamageSelfAbilityBehavior = ____exports.DamageSelfAbilityBehavior
39
- DamageSelfAbilityBehavior.name = "DamageSelfAbilityBehavior"
40
- __TS__ClassExtends(DamageSelfAbilityBehavior, DamageAbilityBehavior)
41
- function DamageSelfAbilityBehavior.prototype.____constructor(self, ability, damage, parameters)
42
- DamageAbilityBehavior.prototype.____constructor(self, ability, damage, parameters)
43
- end
44
- function DamageSelfAbilityBehavior.prototype.onImpact(self, caster)
38
+ function DamageAbilityBehavior.prototype.damageTarget(self, caster, target, damage)
45
39
  local parameters = self.parameters
46
40
  caster:damageTarget(
47
- caster,
48
- self:calculateDamage(caster),
41
+ target,
42
+ damage or self:calculateDamage(caster),
49
43
  nil,
50
44
  nil,
51
- parameters and parameters.attackType,
45
+ self:resolveCurrentAbilityDependentValue(parameters and parameters.attackType),
52
46
  parameters and parameters.damageType,
53
- parameters and parameters.weaponType
47
+ parameters and parameters.weaponType,
48
+ self:resolveCurrentAbilityDependentValue(parameters and parameters.metadata)
54
49
  )
55
50
  end
51
+ ____exports.DamageSelfAbilityBehavior = __TS__Class()
52
+ local DamageSelfAbilityBehavior = ____exports.DamageSelfAbilityBehavior
53
+ DamageSelfAbilityBehavior.name = "DamageSelfAbilityBehavior"
54
+ __TS__ClassExtends(DamageSelfAbilityBehavior, ____exports.DamageAbilityBehavior)
55
+ function DamageSelfAbilityBehavior.prototype.____constructor(self, ability, damage, parameters)
56
+ DamageSelfAbilityBehavior.____super.prototype.____constructor(self, ability, damage, parameters)
57
+ end
58
+ function DamageSelfAbilityBehavior.prototype.onImpact(self, caster)
59
+ self:damageTarget(caster, caster)
60
+ end
56
61
  ____exports.DamageTargetAbilityBehavior = __TS__Class()
57
62
  local DamageTargetAbilityBehavior = ____exports.DamageTargetAbilityBehavior
58
63
  DamageTargetAbilityBehavior.name = "DamageTargetAbilityBehavior"
59
- __TS__ClassExtends(DamageTargetAbilityBehavior, DamageAbilityBehavior)
64
+ __TS__ClassExtends(DamageTargetAbilityBehavior, ____exports.DamageAbilityBehavior)
60
65
  function DamageTargetAbilityBehavior.prototype.____constructor(self, ability, damage, parameters)
61
- DamageAbilityBehavior.prototype.____constructor(self, ability, damage, parameters)
66
+ DamageTargetAbilityBehavior.____super.prototype.____constructor(self, ability, damage, parameters)
62
67
  end
63
68
  function DamageTargetAbilityBehavior.prototype.onWidgetTargetImpact(self, caster, target)
64
- local parameters = self.parameters
65
- caster:damageTarget(
66
- target,
67
- self:calculateDamage(caster),
68
- nil,
69
- nil,
70
- parameters and parameters.attackType,
71
- parameters and parameters.damageType,
72
- parameters and parameters.weaponType
73
- )
69
+ self:damageTarget(caster, target)
74
70
  end
75
71
  local DamageAreaAbilityBehavior = __TS__Class()
76
72
  DamageAreaAbilityBehavior.name = "DamageAreaAbilityBehavior"
77
- __TS__ClassExtends(DamageAreaAbilityBehavior, DamageAbilityBehavior)
73
+ __TS__ClassExtends(DamageAreaAbilityBehavior, ____exports.DamageAbilityBehavior)
78
74
  function DamageAreaAbilityBehavior.prototype.____constructor(self, ability, damage, parameters)
79
- DamageAbilityBehavior.prototype.____constructor(self, ability, damage, parameters)
75
+ DamageAreaAbilityBehavior.____super.prototype.____constructor(self, ability, damage, parameters)
80
76
  end
81
77
  function DamageAreaAbilityBehavior.prototype.damageArea(self, caster, x, y)
82
78
  local parameters = self.parameters
@@ -93,15 +89,7 @@ function DamageAreaAbilityBehavior.prototype.damageArea(self, caster, x, y)
93
89
  damage = maximumDamage / #targets
94
90
  end
95
91
  for ____, target in ipairs(targets) do
96
- caster:damageTarget(
97
- target,
98
- damage,
99
- nil,
100
- nil,
101
- parameters and parameters.attackType,
102
- parameters and parameters.damageType,
103
- parameters and parameters.weaponType
104
- )
92
+ self:damageTarget(caster, target, damage)
105
93
  end
106
94
  end
107
95
  ____exports.DamageSelfAreaAbilityBehavior = __TS__Class()
@@ -10,6 +10,9 @@ local MANA_COST_ABILITY_INTEGER_LEVEL_FIELD = ____ability.MANA_COST_ABILITY_INTE
10
10
  local ____math = require("math")
11
11
  local max = ____math.max
12
12
  local MINIMUM_POSITIVE_NORMALIZED_FLOAT = ____math.MINIMUM_POSITIVE_NORMALIZED_FLOAT
13
+ local ____sound = require("core.types.sound")
14
+ local Sound3D = ____sound.Sound3D
15
+ local SoundSettings = ____sound.SoundSettings
13
16
  ____exports.EmulateImpactAbilityBehavior = __TS__Class()
14
17
  local EmulateImpactAbilityBehavior = ____exports.EmulateImpactAbilityBehavior
15
18
  EmulateImpactAbilityBehavior.name = "EmulateImpactAbilityBehavior"
@@ -23,6 +26,10 @@ function EmulateImpactAbilityBehavior.prototype.emulateImpact(self, caster)
23
26
  caster.mana = caster.mana - manaCost
24
27
  self.ability.cooldownRemaining = max(cooldown, MINIMUM_POSITIVE_NORMALIZED_FLOAT)
25
28
  self:flashCasterEffect(caster)
29
+ local soundPresetId = self.ability:getField(ABILITY_SF_EFFECT_SOUND)
30
+ if soundPresetId ~= "" then
31
+ Sound3D:playFromLabel(soundPresetId, SoundSettings.Ability, caster)
32
+ end
26
33
  AbilityBehavior:forAll(self.ability, "onImpact", caster)
27
34
  end
28
35
  return ____exports
@@ -5,6 +5,7 @@ import { Event } from "../../event";
5
5
  import { ReadonlyRect } from "../../core/types/rect";
6
6
  import { ItemAbility } from "./ability";
7
7
  import { AbilityTypeId } from "../object-data/entry/ability-type";
8
+ import type { ItemTypeId } from "../object-data/entry/item-type";
8
9
  type DefenseType = 0 | 1 | 2 | 3 | 4 | 5;
9
10
  export declare const addAndGetAbility: (handle: jitem, abilityTypeId: AbilityTypeId) => jability | null;
10
11
  declare const enum ItemPropertyKey {
@@ -17,7 +18,7 @@ export declare class Item extends Handle<jitem> {
17
18
  constructor(handle: jitem);
18
19
  protected onDestroy(): HandleDestructor;
19
20
  static create<T extends Item>(this: typeof Item & (new (handle: jitem) => T), id: number, x: number, y: number, skinId?: number): T;
20
- get typeId(): number;
21
+ get typeId(): ItemTypeId;
21
22
  set skinId(v: number);
22
23
  get skinId(): number;
23
24
  set name(v: string);
@@ -0,0 +1,2 @@
1
+ /** @noSelfInFile */
2
+ export {};
@@ -0,0 +1,5 @@
1
+ local ____exports = {}
2
+ ---
3
+ -- @internal For use by internal systems only.
4
+ ____exports.damageMetadataByTarget = setmetatable({}, {__mode = "k"})
5
+ return ____exports
@@ -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,
@@ -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;
@@ -36,13 +40,15 @@ type AbilityDispatcherTable<T extends any[] = []> = {
36
40
  readonly [id: number]: Event<[Unit, Ability, ...T]>;
37
41
  };
38
42
  type AbilityEventDispatcher<T extends any[] = []> = Event<[Unit, Ability, ...T]> & AbilityDispatcherTable<T>;
39
- export interface DamagingEvent {
43
+ export interface DamagingEvent extends AttributesHolder {
40
44
  amount: number;
41
- attackType: jattacktype;
45
+ attackType: AttackType;
42
46
  damageType: jdamagetype;
43
47
  weaponType: jweapontype;
48
+ metadata: unknown;
44
49
  readonly isAttack: boolean;
45
50
  readonly originalAmount: number;
51
+ readonly originalMetadata: unknown;
46
52
  }
47
53
  export type DamageEvent = DamagingEvent & {
48
54
  preventDeath<P extends any[]>(this: DamageEvent, callback: (this: void, ...parameters: P) => any, ...parameters: P): void;
@@ -161,6 +167,8 @@ export declare class Unit extends Handle<junit> {
161
167
  set level(v: number);
162
168
  get xp(): number;
163
169
  set xp(v: number);
170
+ get primaryAttribute(): UnitAttribute;
171
+ set primaryAttribute(primaryAttribute: UnitAttribute);
164
172
  get strengthBase(): number;
165
173
  set strengthBase(strengthBase: number);
166
174
  get strengthBonus(): number;
@@ -235,6 +243,8 @@ export declare class Unit extends Handle<junit> {
235
243
  set timeScale(v: number);
236
244
  get collisionSize(): number;
237
245
  get pathingCollisionRange(): number;
246
+ get movementType(): MovementType;
247
+ set movementType(movementType: MovementType);
238
248
  set pathing(v: boolean);
239
249
  isSelected(player: Player): boolean;
240
250
  explode(): void;
@@ -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
@@ -358,7 +357,14 @@ local function damageEventPreventDeath(self, callback, ...)
358
357
  rawset(self, 1 + i, (select(i, ...)))
359
358
  end
360
359
  end
361
- local damageSetters = {amount = BlzSetEventDamage, attackType = BlzSetEventAttackType, damageType = BlzSetEventDamageType, weaponType = BlzSetEventWeaponType}
360
+ local damageSetters = {
361
+ amount = BlzSetEventDamage,
362
+ attackType = function(attackType)
363
+ return BlzSetEventAttackType(attackTypeToNative(attackType))
364
+ end,
365
+ damageType = BlzSetEventDamageType,
366
+ weaponType = BlzSetEventWeaponType
367
+ }
362
368
  local jlimitopByOperator = {
363
369
  [0] = LESS_THAN_OR_EQUAL,
364
370
  [1] = LESS_THAN_OR_EQUAL,
@@ -640,7 +646,8 @@ local function delayHealthChecksCallback(unit)
640
646
  end
641
647
  end
642
648
  local nextSyncId = 1
643
- local unitBySyncId = setmetatable({}, {__mode = "k"})
649
+ local unitBySyncId = setmetatable({}, {__mode = "v"})
650
+ local damagingEventByTarget = setmetatable({}, {__mode = "k"})
644
651
  ____exports.Unit = __TS__Class()
645
652
  local Unit = ____exports.Unit
646
653
  Unit.name = "Unit"
@@ -793,16 +800,16 @@ function Unit.prototype.playAnimation(self, animation, rarity)
793
800
  if type(animation) == "number" then
794
801
  setUnitAnimationByIndex(self.handle, animation)
795
802
  elseif rarity then
796
- setUnitAnimationWithRarity(self.handle, animation, rarity)
803
+ SetUnitAnimationWithRarity(self.handle, animation, rarity)
797
804
  else
798
805
  setUnitAnimation(self.handle, animation)
799
806
  end
800
807
  end
801
808
  function Unit.prototype.resetAnimation(self)
802
- resetUnitAnimation(self.handle)
809
+ ResetUnitAnimation(self.handle)
803
810
  end
804
811
  function Unit.prototype.queueAnimation(self, animation)
805
- queueUnitAnimation(self.handle, animation)
812
+ QueueUnitAnimation(self.handle, animation)
806
813
  end
807
814
  function Unit.prototype.delayHealthChecks(self)
808
815
  self[103] = (self[103] or 0) + 1
@@ -815,7 +822,7 @@ function Unit.prototype.isSelected(self, player)
815
822
  return IsUnitSelected(self.handle, player.handle)
816
823
  end
817
824
  function Unit.prototype.explode(self)
818
- setUnitExploded(self.handle, true)
825
+ SetUnitExploded(self.handle, true)
819
826
  killUnit(self.handle)
820
827
  end
821
828
  function Unit.prototype.kill(self)
@@ -1292,6 +1299,19 @@ __TS__SetDescriptor(
1292
1299
  },
1293
1300
  true
1294
1301
  )
1302
+ __TS__SetDescriptor(
1303
+ Unit.prototype,
1304
+ "primaryAttribute",
1305
+ {
1306
+ get = function(self)
1307
+ return getUnitIntegerField(self.handle, UNIT_IF_PRIMARY_ATTRIBUTE)
1308
+ end,
1309
+ set = function(self, primaryAttribute)
1310
+ setUnitIntegerField(self.handle, UNIT_IF_PRIMARY_ATTRIBUTE, primaryAttribute)
1311
+ end
1312
+ },
1313
+ true
1314
+ )
1295
1315
  __TS__SetDescriptor(
1296
1316
  Unit.prototype,
1297
1317
  "strengthBase",
@@ -1416,7 +1436,7 @@ __TS__SetDescriptor(
1416
1436
  return not self[106]
1417
1437
  end,
1418
1438
  set = function(self, isTeamGlowVisible)
1419
- showUnitTeamGlow(self.handle, isTeamGlowVisible)
1439
+ BlzShowUnitTeamGlow(self.handle, isTeamGlowVisible)
1420
1440
  local ____temp_6
1421
1441
  if not isTeamGlowVisible then
1422
1442
  ____temp_6 = true
@@ -1432,9 +1452,9 @@ __TS__SetDescriptor(
1432
1452
  Unit.prototype,
1433
1453
  "color",
1434
1454
  {set = function(self, color)
1435
- setUnitColor(self.handle, color.handle)
1455
+ SetUnitColor(self.handle, color.handle)
1436
1456
  if self[106] then
1437
- showUnitTeamGlow(self.handle, false)
1457
+ BlzShowUnitTeamGlow(self.handle, false)
1438
1458
  end
1439
1459
  end},
1440
1460
  true
@@ -1702,10 +1722,10 @@ __TS__SetDescriptor(
1702
1722
  "gold",
1703
1723
  {
1704
1724
  get = function(self)
1705
- return getResourceAmount(self.handle)
1725
+ return GetResourceAmount(self.handle)
1706
1726
  end,
1707
1727
  set = function(self, gold)
1708
- setResourceAmount(self.handle, gold)
1728
+ SetResourceAmount(self.handle, gold)
1709
1729
  end
1710
1730
  },
1711
1731
  true
@@ -1833,6 +1853,19 @@ __TS__SetDescriptor(
1833
1853
  end},
1834
1854
  true
1835
1855
  )
1856
+ __TS__SetDescriptor(
1857
+ Unit.prototype,
1858
+ "movementType",
1859
+ {
1860
+ get = function(self)
1861
+ return getUnitIntegerField(self.handle, UNIT_IF_MOVE_TYPE)
1862
+ end,
1863
+ set = function(self, movementType)
1864
+ setUnitIntegerField(self.handle, UNIT_IF_MOVE_TYPE, movementType)
1865
+ end
1866
+ },
1867
+ true
1868
+ )
1836
1869
  __TS__SetDescriptor(
1837
1870
  Unit.prototype,
1838
1871
  "pathing",
@@ -2375,13 +2408,18 @@ Unit.onDamaging = (function()
2375
2408
  if source and source.typeId == dummyUnitId then
2376
2409
  source = nil
2377
2410
  end
2378
- local target = BlzGetEventDamageTarget()
2411
+ local target = ____exports.Unit:of(BlzGetEventDamageTarget())
2412
+ local metadata = damageMetadataByTarget[target]
2413
+ damageMetadataByTarget[target] = nil
2379
2414
  local data = {
2380
2415
  amount = GetEventDamage(),
2381
- attackType = BlzGetEventAttackType(),
2416
+ attackType = nativeToAttackType(BlzGetEventAttackType()),
2382
2417
  damageType = BlzGetEventDamageType(),
2383
2418
  weaponType = BlzGetEventWeaponType(),
2384
- isAttack = BlzGetEventIsAttack()
2419
+ metadata = metadata,
2420
+ isAttack = BlzGetEventIsAttack(),
2421
+ originalAmount = GetEventDamage(),
2422
+ originalMetadata = metadata
2385
2423
  }
2386
2424
  if data.isAttack and source then
2387
2425
  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 +2433,22 @@ Unit.onDamaging = (function()
2395
2433
  invoke(
2396
2434
  event,
2397
2435
  source,
2398
- ____exports.Unit:of(target),
2436
+ target,
2399
2437
  setmetatable(
2400
2438
  {},
2401
2439
  {
2402
2440
  __index = data,
2403
2441
  __newindex = function(self, key, value)
2404
- damageSetters[key](value)
2442
+ local damageSetter = damageSetters[key]
2443
+ if damageSetter ~= nil then
2444
+ damageSetter(value)
2445
+ end
2405
2446
  data[key] = value
2406
2447
  end
2407
2448
  }
2408
2449
  )
2409
2450
  )
2451
+ damagingEventByTarget[target] = data
2410
2452
  return
2411
2453
  end
2412
2454
  BlzSetEventDamage(0)
@@ -2414,7 +2456,7 @@ Unit.onDamaging = (function()
2414
2456
  BlzSetEventDamageType(DAMAGE_TYPE_UNKNOWN)
2415
2457
  BlzSetEventWeaponType(WEAPON_TYPE_WHOKNOWS)
2416
2458
  local sourceOwner = source.owner.handle
2417
- local targetOwner = GetOwningPlayer(target)
2459
+ local targetOwner = target.owner.handle
2418
2460
  if not GetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE) then
2419
2461
  SetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE, true)
2420
2462
  Timer:run(function()
@@ -2430,23 +2472,19 @@ Unit.onDamaging = (function()
2430
2472
  for ____, ____value in ipairs(source._attackHandlers) do
2431
2473
  local condition = ____value[1]
2432
2474
  local action = ____value[2]
2433
- if condition(
2434
- source,
2435
- ____exports.Unit:of(target),
2436
- data
2437
- ) then
2475
+ if condition(source, target, data) then
2438
2476
  action(
2439
2477
  source,
2440
- ____exports.Unit:of(target),
2478
+ target,
2441
2479
  setmetatable(
2442
2480
  {fire = function()
2443
2481
  UnitDamageTarget(
2444
2482
  source.handle,
2445
- target,
2483
+ target.handle,
2446
2484
  data.amount,
2447
2485
  true,
2448
2486
  true,
2449
- data.attackType,
2487
+ attackTypeToNative(data.attackType),
2450
2488
  data.damageType,
2451
2489
  data.weaponType
2452
2490
  )
@@ -2473,26 +2511,40 @@ Unit.onDamage = __TS__New(
2473
2511
  if source and source.typeId == dummyUnitId then
2474
2512
  source = nil
2475
2513
  end
2514
+ local target = ____exports.Unit:of(BlzGetEventDamageTarget())
2515
+ local damagingEvent = damagingEventByTarget[target]
2516
+ damagingEventByTarget[target] = nil
2476
2517
  local data = {
2477
2518
  amount = GetEventDamage(),
2478
- attackType = BlzGetEventAttackType(),
2519
+ attackType = nativeToAttackType(BlzGetEventAttackType()),
2479
2520
  damageType = BlzGetEventDamageType(),
2480
2521
  weaponType = BlzGetEventWeaponType(),
2522
+ metadata = damagingEvent and damagingEvent.metadata,
2481
2523
  isAttack = BlzGetEventIsAttack(),
2482
- originalAmount = GetEventDamage(),
2524
+ originalAmount = damagingEvent and damagingEvent.originalAmount or GetEventDamage(),
2525
+ originalMetadata = damagingEvent and damagingEvent.originalMetadata,
2483
2526
  preventDeath = damageEventPreventDeath
2484
2527
  }
2528
+ if damagingEvent then
2529
+ for key, value in pairs(damagingEvent) do
2530
+ if isAttribute(key) then
2531
+ data[key] = value
2532
+ end
2533
+ end
2534
+ end
2485
2535
  local evData = setmetatable(
2486
2536
  {},
2487
2537
  {
2488
2538
  __index = data,
2489
2539
  __newindex = function(self, key, value)
2490
- damageSetters[key](value)
2540
+ local damageSetter = damageSetters[key]
2541
+ if damageSetter ~= nil then
2542
+ damageSetter(value)
2543
+ end
2491
2544
  data[key] = value
2492
2545
  end
2493
2546
  }
2494
2547
  )
2495
- local target = ____exports.Unit:of(BlzGetEventDamageTarget())
2496
2548
  invoke(event, source, target, evData)
2497
2549
  if evData[0] ~= nil and target.health - evData.amount < 0.405 then
2498
2550
  local bonusHealth = math.ceil(evData.amount)
@@ -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[]]>;