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.
- package/attributes.d.ts +5 -0
- package/attributes.lua +8 -1
- package/core/types/effect.d.ts +1 -3
- package/core/types/effect.lua +26 -29
- package/core/types/sound.lua +5 -0
- package/core/types/timer.d.ts +6 -7
- package/core/types/timer.lua +18 -21
- 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 +12 -2
- package/engine/internal/unit.lua +89 -37
- package/engine/object-data/auxiliary/attachment-preset.d.ts +7 -2
- package/engine/object-data/auxiliary/attachment-preset.lua +4 -3
- 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/berserk.d.ts +2 -0
- package/engine/object-data/entry/ability-type/berserk.lua +13 -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.d.ts +11 -11
- package/engine/object-data/entry/ability-type.lua +27 -6
- package/engine/object-data/entry/buff-type/applicable.lua +5 -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;
|
|
@@ -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:
|
|
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;
|
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
|
|
@@ -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 = {
|
|
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 = "
|
|
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
|
-
|
|
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
|
-
|
|
809
|
+
ResetUnitAnimation(self.handle)
|
|
803
810
|
end
|
|
804
811
|
function Unit.prototype.queueAnimation(self, animation)
|
|
805
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1455
|
+
SetUnitColor(self.handle, color.handle)
|
|
1436
1456
|
if self[106] then
|
|
1437
|
-
|
|
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
|
|
1725
|
+
return GetResourceAmount(self.handle)
|
|
1706
1726
|
end,
|
|
1707
1727
|
set = function(self, gold)
|
|
1708
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2436
|
+
target,
|
|
2399
2437
|
setmetatable(
|
|
2400
2438
|
{},
|
|
2401
2439
|
{
|
|
2402
2440
|
__index = data,
|
|
2403
2441
|
__newindex = function(self, key, value)
|
|
2404
|
-
damageSetters[key]
|
|
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 =
|
|
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
|
-
|
|
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]
|
|
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
|
|
11
|
-
|
|
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[]]>;
|