warscript 0.0.1-dev.88cffdd → 0.0.1-dev.8a25bb1
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.
- package/attributes.d.ts +5 -0
- package/attributes.lua +8 -1
- package/core/types/sound.lua +5 -0
- package/decl/native.d.ts +840 -786
- package/engine/behaviour/ability/damage.d.ts +6 -3
- package/engine/behaviour/ability/damage.lua +24 -36
- package/engine/behaviour/ability/emulate-impact.lua +7 -0
- package/engine/internal/item.d.ts +2 -1
- package/engine/internal/misc/damage-metadata-by-target.d.ts +2 -0
- package/engine/internal/misc/damage-metadata-by-target.lua +5 -0
- package/engine/internal/unit+damage.d.ts +2 -11
- package/engine/internal/unit+damage.lua +10 -14
- package/engine/internal/unit+spellSteal.lua +1 -2
- package/engine/internal/unit.d.ts +14 -2
- package/engine/internal/unit.lua +98 -37
- package/engine/object-data/auxiliary/attack-type.d.ts +7 -8
- package/engine/object-data/auxiliary/attack-type.lua +42 -0
- package/engine/object-data/auxiliary/movement-type.d.ts +7 -7
- package/engine/object-data/auxiliary/movement-type.lua +22 -0
- package/engine/object-data/auxiliary/unit-attribute.d.ts +6 -0
- package/engine/object-data/auxiliary/unit-attribute.lua +9 -0
- package/engine/object-data/entry/ability-type/permanent-invisibility.d.ts +8 -0
- package/engine/object-data/entry/ability-type/permanent-invisibility.lua +26 -0
- package/engine/object-data/entry/ability-type/slow-poison.d.ts +10 -0
- package/engine/object-data/entry/ability-type/slow-poison.lua +58 -0
- package/engine/object-data/entry/ability-type.lua +7 -0
- package/engine/object-data/entry/buff-type/applicable.lua +4 -0
- package/engine/object-data/entry/buff-type.d.ts +5 -11
- package/engine/object-data/entry/buff-type.lua +11 -27
- package/engine/object-data/entry/unit-type.d.ts +2 -2
- package/engine/object-data/entry/unit-type.lua +94 -84
- package/engine/object-field/ability.d.ts +1 -1
- package/engine/object-field/unit.d.ts +46 -3
- package/engine/object-field/unit.lua +173 -7
- package/engine/object-field.d.ts +9 -1
- package/engine/object-field.lua +158 -76
- package/engine/standard/entries/buff-type.d.ts +3 -0
- package/engine/standard/entries/buff-type.lua +3 -0
- package/objutil/buff.lua +1 -2
- package/package.json +2 -2
- package/utility/arrays.d.ts +1 -0
- package/utility/arrays.lua +3 -0
- package/utility/functions.d.ts +1 -0
- package/utility/functions.lua +1 -0
- package/utility/linked-set.d.ts +1 -0
- package/utility/linked-set.lua +3 -0
- package/utility/lua-maps.d.ts +3 -0
- package/utility/lua-maps.lua +16 -0
- package/utility/lua-sets.d.ts +1 -0
- 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 {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
66
|
+
DamageTargetAbilityBehavior.____super.prototype.____constructor(self, ability, damage, parameters)
|
|
62
67
|
end
|
|
63
68
|
function DamageTargetAbilityBehavior.prototype.onWidgetTargetImpact(self, caster, target)
|
|
64
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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():
|
|
21
|
+
get typeId(): ItemTypeId;
|
|
21
22
|
set skinId(v: number);
|
|
22
23
|
get skinId(): number;
|
|
23
24
|
set name(v: string);
|
|
@@ -1,15 +1,6 @@
|
|
|
1
1
|
/** @noSelfInFile */
|
|
2
2
|
import { Widget } from "../../core/types/widget";
|
|
3
|
-
|
|
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 =
|
|
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 ==
|
|
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;
|
|
@@ -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,13 +41,15 @@ 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:
|
|
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;
|
|
46
53
|
}
|
|
47
54
|
export type DamageEvent = DamagingEvent & {
|
|
48
55
|
preventDeath<P extends any[]>(this: DamageEvent, callback: (this: void, ...parameters: P) => any, ...parameters: P): void;
|
|
@@ -161,6 +168,8 @@ export declare class Unit extends Handle<junit> {
|
|
|
161
168
|
set level(v: number);
|
|
162
169
|
get xp(): number;
|
|
163
170
|
set xp(v: number);
|
|
171
|
+
get primaryAttribute(): UnitAttribute;
|
|
172
|
+
set primaryAttribute(primaryAttribute: UnitAttribute);
|
|
164
173
|
get strengthBase(): number;
|
|
165
174
|
set strengthBase(strengthBase: number);
|
|
166
175
|
get strengthBonus(): number;
|
|
@@ -235,6 +244,8 @@ export declare class Unit extends Handle<junit> {
|
|
|
235
244
|
set timeScale(v: number);
|
|
236
245
|
get collisionSize(): number;
|
|
237
246
|
get pathingCollisionRange(): number;
|
|
247
|
+
get movementType(): MovementType;
|
|
248
|
+
set movementType(movementType: MovementType);
|
|
238
249
|
set pathing(v: boolean);
|
|
239
250
|
isSelected(player: Player): boolean;
|
|
240
251
|
explode(): void;
|
|
@@ -285,6 +296,7 @@ export declare class Unit extends Handle<junit> {
|
|
|
285
296
|
get onUnitInRange(): Record<number, Event<[Unit]>>;
|
|
286
297
|
get onManaEqual(): Record<number, Event<[Unit, number]>>;
|
|
287
298
|
get manaEvent(): Record<Operator, Record<number, Event<[Unit]>>>;
|
|
299
|
+
get targetAcquiredEvent(): Event;
|
|
288
300
|
get onSelect(): Event;
|
|
289
301
|
get onDeselect(): Event;
|
|
290
302
|
get onImmediateOrder(): Event<[number]>;
|
package/engine/internal/unit.lua
CHANGED
|
@@ -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
|
|
@@ -358,7 +358,14 @@ local function damageEventPreventDeath(self, callback, ...)
|
|
|
358
358
|
rawset(self, 1 + i, (select(i, ...)))
|
|
359
359
|
end
|
|
360
360
|
end
|
|
361
|
-
local damageSetters = {
|
|
361
|
+
local damageSetters = {
|
|
362
|
+
amount = BlzSetEventDamage,
|
|
363
|
+
attackType = function(attackType)
|
|
364
|
+
return BlzSetEventAttackType(attackTypeToNative(attackType))
|
|
365
|
+
end,
|
|
366
|
+
damageType = BlzSetEventDamageType,
|
|
367
|
+
weaponType = BlzSetEventWeaponType
|
|
368
|
+
}
|
|
362
369
|
local jlimitopByOperator = {
|
|
363
370
|
[0] = LESS_THAN_OR_EQUAL,
|
|
364
371
|
[1] = LESS_THAN_OR_EQUAL,
|
|
@@ -640,7 +647,8 @@ local function delayHealthChecksCallback(unit)
|
|
|
640
647
|
end
|
|
641
648
|
end
|
|
642
649
|
local nextSyncId = 1
|
|
643
|
-
local unitBySyncId = setmetatable({}, {__mode = "
|
|
650
|
+
local unitBySyncId = setmetatable({}, {__mode = "v"})
|
|
651
|
+
local damagingEventByTarget = setmetatable({}, {__mode = "k"})
|
|
644
652
|
____exports.Unit = __TS__Class()
|
|
645
653
|
local Unit = ____exports.Unit
|
|
646
654
|
Unit.name = "Unit"
|
|
@@ -793,16 +801,16 @@ function Unit.prototype.playAnimation(self, animation, rarity)
|
|
|
793
801
|
if type(animation) == "number" then
|
|
794
802
|
setUnitAnimationByIndex(self.handle, animation)
|
|
795
803
|
elseif rarity then
|
|
796
|
-
|
|
804
|
+
SetUnitAnimationWithRarity(self.handle, animation, rarity)
|
|
797
805
|
else
|
|
798
806
|
setUnitAnimation(self.handle, animation)
|
|
799
807
|
end
|
|
800
808
|
end
|
|
801
809
|
function Unit.prototype.resetAnimation(self)
|
|
802
|
-
|
|
810
|
+
ResetUnitAnimation(self.handle)
|
|
803
811
|
end
|
|
804
812
|
function Unit.prototype.queueAnimation(self, animation)
|
|
805
|
-
|
|
813
|
+
QueueUnitAnimation(self.handle, animation)
|
|
806
814
|
end
|
|
807
815
|
function Unit.prototype.delayHealthChecks(self)
|
|
808
816
|
self[103] = (self[103] or 0) + 1
|
|
@@ -815,7 +823,7 @@ function Unit.prototype.isSelected(self, player)
|
|
|
815
823
|
return IsUnitSelected(self.handle, player.handle)
|
|
816
824
|
end
|
|
817
825
|
function Unit.prototype.explode(self)
|
|
818
|
-
|
|
826
|
+
SetUnitExploded(self.handle, true)
|
|
819
827
|
killUnit(self.handle)
|
|
820
828
|
end
|
|
821
829
|
function Unit.prototype.kill(self)
|
|
@@ -1292,6 +1300,19 @@ __TS__SetDescriptor(
|
|
|
1292
1300
|
},
|
|
1293
1301
|
true
|
|
1294
1302
|
)
|
|
1303
|
+
__TS__SetDescriptor(
|
|
1304
|
+
Unit.prototype,
|
|
1305
|
+
"primaryAttribute",
|
|
1306
|
+
{
|
|
1307
|
+
get = function(self)
|
|
1308
|
+
return getUnitIntegerField(self.handle, UNIT_IF_PRIMARY_ATTRIBUTE)
|
|
1309
|
+
end,
|
|
1310
|
+
set = function(self, primaryAttribute)
|
|
1311
|
+
setUnitIntegerField(self.handle, UNIT_IF_PRIMARY_ATTRIBUTE, primaryAttribute)
|
|
1312
|
+
end
|
|
1313
|
+
},
|
|
1314
|
+
true
|
|
1315
|
+
)
|
|
1295
1316
|
__TS__SetDescriptor(
|
|
1296
1317
|
Unit.prototype,
|
|
1297
1318
|
"strengthBase",
|
|
@@ -1416,7 +1437,7 @@ __TS__SetDescriptor(
|
|
|
1416
1437
|
return not self[106]
|
|
1417
1438
|
end,
|
|
1418
1439
|
set = function(self, isTeamGlowVisible)
|
|
1419
|
-
|
|
1440
|
+
BlzShowUnitTeamGlow(self.handle, isTeamGlowVisible)
|
|
1420
1441
|
local ____temp_6
|
|
1421
1442
|
if not isTeamGlowVisible then
|
|
1422
1443
|
____temp_6 = true
|
|
@@ -1432,9 +1453,9 @@ __TS__SetDescriptor(
|
|
|
1432
1453
|
Unit.prototype,
|
|
1433
1454
|
"color",
|
|
1434
1455
|
{set = function(self, color)
|
|
1435
|
-
|
|
1456
|
+
SetUnitColor(self.handle, color.handle)
|
|
1436
1457
|
if self[106] then
|
|
1437
|
-
|
|
1458
|
+
BlzShowUnitTeamGlow(self.handle, false)
|
|
1438
1459
|
end
|
|
1439
1460
|
end},
|
|
1440
1461
|
true
|
|
@@ -1702,10 +1723,10 @@ __TS__SetDescriptor(
|
|
|
1702
1723
|
"gold",
|
|
1703
1724
|
{
|
|
1704
1725
|
get = function(self)
|
|
1705
|
-
return
|
|
1726
|
+
return GetResourceAmount(self.handle)
|
|
1706
1727
|
end,
|
|
1707
1728
|
set = function(self, gold)
|
|
1708
|
-
|
|
1729
|
+
SetResourceAmount(self.handle, gold)
|
|
1709
1730
|
end
|
|
1710
1731
|
},
|
|
1711
1732
|
true
|
|
@@ -1833,6 +1854,19 @@ __TS__SetDescriptor(
|
|
|
1833
1854
|
end},
|
|
1834
1855
|
true
|
|
1835
1856
|
)
|
|
1857
|
+
__TS__SetDescriptor(
|
|
1858
|
+
Unit.prototype,
|
|
1859
|
+
"movementType",
|
|
1860
|
+
{
|
|
1861
|
+
get = function(self)
|
|
1862
|
+
return getUnitIntegerField(self.handle, UNIT_IF_MOVE_TYPE)
|
|
1863
|
+
end,
|
|
1864
|
+
set = function(self, movementType)
|
|
1865
|
+
setUnitIntegerField(self.handle, UNIT_IF_MOVE_TYPE, movementType)
|
|
1866
|
+
end
|
|
1867
|
+
},
|
|
1868
|
+
true
|
|
1869
|
+
)
|
|
1836
1870
|
__TS__SetDescriptor(
|
|
1837
1871
|
Unit.prototype,
|
|
1838
1872
|
"pathing",
|
|
@@ -2014,6 +2048,14 @@ __TS__SetDescriptor(
|
|
|
2014
2048
|
end},
|
|
2015
2049
|
true
|
|
2016
2050
|
)
|
|
2051
|
+
__TS__SetDescriptor(
|
|
2052
|
+
Unit.prototype,
|
|
2053
|
+
"targetAcquiredEvent",
|
|
2054
|
+
{get = function(self)
|
|
2055
|
+
return self:getEvent(EVENT_UNIT_ACQUIRED_TARGET)
|
|
2056
|
+
end},
|
|
2057
|
+
true
|
|
2058
|
+
)
|
|
2017
2059
|
__TS__SetDescriptor(
|
|
2018
2060
|
Unit.prototype,
|
|
2019
2061
|
"onSelect",
|
|
@@ -2375,13 +2417,18 @@ Unit.onDamaging = (function()
|
|
|
2375
2417
|
if source and source.typeId == dummyUnitId then
|
|
2376
2418
|
source = nil
|
|
2377
2419
|
end
|
|
2378
|
-
local target = BlzGetEventDamageTarget()
|
|
2420
|
+
local target = ____exports.Unit:of(BlzGetEventDamageTarget())
|
|
2421
|
+
local metadata = damageMetadataByTarget[target]
|
|
2422
|
+
damageMetadataByTarget[target] = nil
|
|
2379
2423
|
local data = {
|
|
2380
2424
|
amount = GetEventDamage(),
|
|
2381
|
-
attackType = BlzGetEventAttackType(),
|
|
2425
|
+
attackType = nativeToAttackType(BlzGetEventAttackType()),
|
|
2382
2426
|
damageType = BlzGetEventDamageType(),
|
|
2383
2427
|
weaponType = BlzGetEventWeaponType(),
|
|
2384
|
-
|
|
2428
|
+
metadata = metadata,
|
|
2429
|
+
isAttack = BlzGetEventIsAttack(),
|
|
2430
|
+
originalAmount = GetEventDamage(),
|
|
2431
|
+
originalMetadata = metadata
|
|
2385
2432
|
}
|
|
2386
2433
|
if data.isAttack and source then
|
|
2387
2434
|
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 +2442,22 @@ Unit.onDamaging = (function()
|
|
|
2395
2442
|
invoke(
|
|
2396
2443
|
event,
|
|
2397
2444
|
source,
|
|
2398
|
-
|
|
2445
|
+
target,
|
|
2399
2446
|
setmetatable(
|
|
2400
2447
|
{},
|
|
2401
2448
|
{
|
|
2402
2449
|
__index = data,
|
|
2403
2450
|
__newindex = function(self, key, value)
|
|
2404
|
-
damageSetters[key]
|
|
2451
|
+
local damageSetter = damageSetters[key]
|
|
2452
|
+
if damageSetter ~= nil then
|
|
2453
|
+
damageSetter(value)
|
|
2454
|
+
end
|
|
2405
2455
|
data[key] = value
|
|
2406
2456
|
end
|
|
2407
2457
|
}
|
|
2408
2458
|
)
|
|
2409
2459
|
)
|
|
2460
|
+
damagingEventByTarget[target] = data
|
|
2410
2461
|
return
|
|
2411
2462
|
end
|
|
2412
2463
|
BlzSetEventDamage(0)
|
|
@@ -2414,7 +2465,7 @@ Unit.onDamaging = (function()
|
|
|
2414
2465
|
BlzSetEventDamageType(DAMAGE_TYPE_UNKNOWN)
|
|
2415
2466
|
BlzSetEventWeaponType(WEAPON_TYPE_WHOKNOWS)
|
|
2416
2467
|
local sourceOwner = source.owner.handle
|
|
2417
|
-
local targetOwner =
|
|
2468
|
+
local targetOwner = target.owner.handle
|
|
2418
2469
|
if not GetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE) then
|
|
2419
2470
|
SetPlayerAlliance(sourceOwner, targetOwner, ALLIANCE_PASSIVE, true)
|
|
2420
2471
|
Timer:run(function()
|
|
@@ -2430,23 +2481,19 @@ Unit.onDamaging = (function()
|
|
|
2430
2481
|
for ____, ____value in ipairs(source._attackHandlers) do
|
|
2431
2482
|
local condition = ____value[1]
|
|
2432
2483
|
local action = ____value[2]
|
|
2433
|
-
if condition(
|
|
2434
|
-
source,
|
|
2435
|
-
____exports.Unit:of(target),
|
|
2436
|
-
data
|
|
2437
|
-
) then
|
|
2484
|
+
if condition(source, target, data) then
|
|
2438
2485
|
action(
|
|
2439
2486
|
source,
|
|
2440
|
-
|
|
2487
|
+
target,
|
|
2441
2488
|
setmetatable(
|
|
2442
2489
|
{fire = function()
|
|
2443
2490
|
UnitDamageTarget(
|
|
2444
2491
|
source.handle,
|
|
2445
|
-
target,
|
|
2492
|
+
target.handle,
|
|
2446
2493
|
data.amount,
|
|
2447
2494
|
true,
|
|
2448
2495
|
true,
|
|
2449
|
-
data.attackType,
|
|
2496
|
+
attackTypeToNative(data.attackType),
|
|
2450
2497
|
data.damageType,
|
|
2451
2498
|
data.weaponType
|
|
2452
2499
|
)
|
|
@@ -2473,26 +2520,40 @@ Unit.onDamage = __TS__New(
|
|
|
2473
2520
|
if source and source.typeId == dummyUnitId then
|
|
2474
2521
|
source = nil
|
|
2475
2522
|
end
|
|
2523
|
+
local target = ____exports.Unit:of(BlzGetEventDamageTarget())
|
|
2524
|
+
local damagingEvent = damagingEventByTarget[target]
|
|
2525
|
+
damagingEventByTarget[target] = nil
|
|
2476
2526
|
local data = {
|
|
2477
2527
|
amount = GetEventDamage(),
|
|
2478
|
-
attackType = BlzGetEventAttackType(),
|
|
2528
|
+
attackType = nativeToAttackType(BlzGetEventAttackType()),
|
|
2479
2529
|
damageType = BlzGetEventDamageType(),
|
|
2480
2530
|
weaponType = BlzGetEventWeaponType(),
|
|
2531
|
+
metadata = damagingEvent and damagingEvent.metadata,
|
|
2481
2532
|
isAttack = BlzGetEventIsAttack(),
|
|
2482
|
-
originalAmount = GetEventDamage(),
|
|
2533
|
+
originalAmount = damagingEvent and damagingEvent.originalAmount or GetEventDamage(),
|
|
2534
|
+
originalMetadata = damagingEvent and damagingEvent.originalMetadata,
|
|
2483
2535
|
preventDeath = damageEventPreventDeath
|
|
2484
2536
|
}
|
|
2537
|
+
if damagingEvent then
|
|
2538
|
+
for key, value in pairs(damagingEvent) do
|
|
2539
|
+
if isAttribute(key) then
|
|
2540
|
+
data[key] = value
|
|
2541
|
+
end
|
|
2542
|
+
end
|
|
2543
|
+
end
|
|
2485
2544
|
local evData = setmetatable(
|
|
2486
2545
|
{},
|
|
2487
2546
|
{
|
|
2488
2547
|
__index = data,
|
|
2489
2548
|
__newindex = function(self, key, value)
|
|
2490
|
-
damageSetters[key]
|
|
2549
|
+
local damageSetter = damageSetters[key]
|
|
2550
|
+
if damageSetter ~= nil then
|
|
2551
|
+
damageSetter(value)
|
|
2552
|
+
end
|
|
2491
2553
|
data[key] = value
|
|
2492
2554
|
end
|
|
2493
2555
|
}
|
|
2494
2556
|
)
|
|
2495
|
-
local target = ____exports.Unit:of(BlzGetEventDamageTarget())
|
|
2496
2557
|
invoke(event, source, target, evData)
|
|
2497
2558
|
if evData[0] ~= nil and target.health - evData.amount < 0.405 then
|
|
2498
2559
|
local bonusHealth = math.ceil(evData.amount)
|