warscript 0.0.1-dev.3aa82da → 0.0.1-dev.3b2adda
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/order.d.ts +1 -0
- package/core/types/order.lua +11 -1
- 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/behaviour/unit.d.ts +10 -0
- package/engine/behaviour/unit.lua +85 -0
- package/engine/internal/ability.d.ts +2 -0
- package/engine/internal/ability.lua +7 -0
- package/engine/internal/item/ability.lua +12 -10
- package/engine/internal/item.d.ts +3 -1
- package/engine/internal/item.lua +46 -3
- 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/allowed-targets.d.ts +1 -1
- package/engine/internal/unit/allowed-targets.lua +9 -1
- 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-missile-launch.lua +1 -1
- package/engine/internal/unit.d.ts +19 -3
- package/engine/internal/unit.lua +148 -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.lua +1 -3
- 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
|
|
@@ -6,13 +6,23 @@ import "../internal/unit+ability";
|
|
|
6
6
|
import "../internal/unit-missile-launch";
|
|
7
7
|
import { Item } from "../internal/item";
|
|
8
8
|
import type { AbilityBehavior } from "./ability";
|
|
9
|
+
import { Event } from "../../event";
|
|
10
|
+
import { Destructor } from "../../destroyable";
|
|
11
|
+
import type { Widget } from "../../core/types/widget";
|
|
9
12
|
export type UnitBehaviorConstructor<Args extends any[]> = new (unit: Unit, ...args: Args) => UnitBehavior;
|
|
10
13
|
export declare abstract class UnitBehavior<PeriodicActionParameters extends any[] = any[]> extends Behavior<Unit, PeriodicActionParameters> {
|
|
11
14
|
constructor(unit: Unit);
|
|
15
|
+
protected onDestroy(): Destructor;
|
|
12
16
|
readonly sourceAbilityBehavior?: AbilityBehavior;
|
|
13
17
|
get unit(): Unit;
|
|
18
|
+
registerInRangeUnitEvent<T extends string, Args extends any[]>(this: UnitBehavior<PeriodicActionParameters> & Record<T, (this: this, unit: Unit, ...args: Args) => unknown>, event: Event<[Unit, ...Args]>, range: number, listener: T): void;
|
|
19
|
+
onImmediateOrder(orderId: number): void;
|
|
20
|
+
onTargetOrder(orderId: number, target: Widget): void;
|
|
21
|
+
onPointOrder(orderId: number, x: number, y: number): void;
|
|
14
22
|
onAutoAttackStart(target: Unit): void;
|
|
15
23
|
onAutoAttackFinish(target: Unit): void;
|
|
24
|
+
onTargetingAutoAttackStart(source: Unit): void;
|
|
25
|
+
onTargetingAutoAttackFinish(source: Unit): void;
|
|
16
26
|
onDamageDealing(target: Unit, event: DamagingEvent): void;
|
|
17
27
|
onDamageDealt(target: Unit, event: DamageEvent): void;
|
|
18
28
|
onDamageReceiving(source: Unit | undefined, event: DamagingEvent): void;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
local ____lualib = require("lualib_bundle")
|
|
2
2
|
local __TS__Class = ____lualib.__TS__Class
|
|
3
3
|
local __TS__ClassExtends = ____lualib.__TS__ClassExtends
|
|
4
|
+
local __TS__New = ____lualib.__TS__New
|
|
4
5
|
local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
|
|
5
6
|
local ____exports = {}
|
|
6
7
|
local ____behavior = require("engine.behavior")
|
|
@@ -9,6 +10,17 @@ local ____unit = require("engine.internal.unit")
|
|
|
9
10
|
local Unit = ____unit.Unit
|
|
10
11
|
require("engine.internal.unit+ability")
|
|
11
12
|
require("engine.internal.unit-missile-launch")
|
|
13
|
+
local ____linked_2Dset = require("utility.linked-set")
|
|
14
|
+
local LinkedSet = ____linked_2Dset.LinkedSet
|
|
15
|
+
local ____lua_2Dmaps = require("utility.lua-maps")
|
|
16
|
+
local getOrPut = ____lua_2Dmaps.getOrPut
|
|
17
|
+
local mutableLuaMap = ____lua_2Dmaps.mutableLuaMap
|
|
18
|
+
local ____lua_2Dsets = require("utility.lua-sets")
|
|
19
|
+
local mutableLuaSet = ____lua_2Dsets.mutableLuaSet
|
|
20
|
+
local behaviorsByEvent = {}
|
|
21
|
+
local rangeByBehaviorByEvent = {}
|
|
22
|
+
local listenerByBehaviorByEvent = {}
|
|
23
|
+
local eventsByBehavior = {}
|
|
12
24
|
____exports.UnitBehavior = __TS__Class()
|
|
13
25
|
local UnitBehavior = ____exports.UnitBehavior
|
|
14
26
|
UnitBehavior.name = "UnitBehavior"
|
|
@@ -16,10 +28,66 @@ __TS__ClassExtends(UnitBehavior, Behavior)
|
|
|
16
28
|
function UnitBehavior.prototype.____constructor(self, unit)
|
|
17
29
|
Behavior.prototype.____constructor(self, unit)
|
|
18
30
|
end
|
|
31
|
+
function UnitBehavior.prototype.onDestroy(self)
|
|
32
|
+
local events = eventsByBehavior[self]
|
|
33
|
+
if events ~= nil then
|
|
34
|
+
for event in pairs(events) do
|
|
35
|
+
local ____opt_0 = behaviorsByEvent[event]
|
|
36
|
+
if ____opt_0 ~= nil then
|
|
37
|
+
____opt_0:remove(self)
|
|
38
|
+
end
|
|
39
|
+
local ____opt_2 = rangeByBehaviorByEvent[event]
|
|
40
|
+
if ____opt_2 ~= nil then
|
|
41
|
+
____opt_2[self] = nil
|
|
42
|
+
end
|
|
43
|
+
local ____opt_4 = listenerByBehaviorByEvent[event]
|
|
44
|
+
if ____opt_4 ~= nil then
|
|
45
|
+
____opt_4[self] = nil
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
eventsByBehavior[self] = nil
|
|
49
|
+
end
|
|
50
|
+
return Behavior.prototype.onDestroy(self)
|
|
51
|
+
end
|
|
52
|
+
function UnitBehavior.prototype.registerInRangeUnitEvent(self, event, range, listener)
|
|
53
|
+
local rangeByBehavior = getOrPut(rangeByBehaviorByEvent, event, mutableLuaMap)
|
|
54
|
+
rangeByBehavior[self] = range
|
|
55
|
+
local listenerByBehavior = getOrPut(listenerByBehaviorByEvent, event, mutableLuaMap)
|
|
56
|
+
listenerByBehavior[self] = listener
|
|
57
|
+
getOrPut(eventsByBehavior, self, mutableLuaSet)[event] = true
|
|
58
|
+
local behaviors = behaviorsByEvent[event]
|
|
59
|
+
if behaviors == nil then
|
|
60
|
+
event:addListener(function(unit, ...)
|
|
61
|
+
local behaviors = behaviorsByEvent[event]
|
|
62
|
+
if behaviors ~= nil then
|
|
63
|
+
for behavior in pairs(behaviors) do
|
|
64
|
+
local range = rangeByBehavior[behavior]
|
|
65
|
+
if range ~= nil and unit:getCollisionDistanceTo(behavior.unit) <= range then
|
|
66
|
+
local ____self_6 = behavior
|
|
67
|
+
____self_6[listenerByBehavior[behavior]](____self_6, unit, ...)
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end)
|
|
72
|
+
behaviors = __TS__New(LinkedSet)
|
|
73
|
+
behaviorsByEvent[event] = behaviors
|
|
74
|
+
end
|
|
75
|
+
behaviors:add(self)
|
|
76
|
+
end
|
|
77
|
+
function UnitBehavior.prototype.onImmediateOrder(self, orderId)
|
|
78
|
+
end
|
|
79
|
+
function UnitBehavior.prototype.onTargetOrder(self, orderId, target)
|
|
80
|
+
end
|
|
81
|
+
function UnitBehavior.prototype.onPointOrder(self, orderId, x, y)
|
|
82
|
+
end
|
|
19
83
|
function UnitBehavior.prototype.onAutoAttackStart(self, target)
|
|
20
84
|
end
|
|
21
85
|
function UnitBehavior.prototype.onAutoAttackFinish(self, target)
|
|
22
86
|
end
|
|
87
|
+
function UnitBehavior.prototype.onTargetingAutoAttackStart(self, source)
|
|
88
|
+
end
|
|
89
|
+
function UnitBehavior.prototype.onTargetingAutoAttackFinish(self, source)
|
|
90
|
+
end
|
|
23
91
|
function UnitBehavior.prototype.onDamageDealing(self, target, event)
|
|
24
92
|
end
|
|
25
93
|
function UnitBehavior.prototype.onDamageDealt(self, target, event)
|
|
@@ -53,11 +121,28 @@ __TS__SetDescriptor(
|
|
|
53
121
|
true
|
|
54
122
|
);
|
|
55
123
|
(function(self)
|
|
124
|
+
Unit.onImmediateOrder:addListener(function(source, orderId)
|
|
125
|
+
____exports.UnitBehavior:forAll(source, "onImmediateOrder", orderId)
|
|
126
|
+
end)
|
|
127
|
+
Unit.onTargetOrder:addListener(function(source, orderId, target)
|
|
128
|
+
____exports.UnitBehavior:forAll(source, "onTargetOrder", orderId, target)
|
|
129
|
+
end)
|
|
130
|
+
Unit.onPointOrder:addListener(function(source, orderId, x, y)
|
|
131
|
+
____exports.UnitBehavior:forAll(
|
|
132
|
+
source,
|
|
133
|
+
"onPointOrder",
|
|
134
|
+
orderId,
|
|
135
|
+
x,
|
|
136
|
+
y
|
|
137
|
+
)
|
|
138
|
+
end)
|
|
56
139
|
Unit.autoAttackStartEvent:addListener(function(source, target)
|
|
57
140
|
____exports.UnitBehavior:forAll(source, "onAutoAttackStart", target)
|
|
141
|
+
____exports.UnitBehavior:forAll(target, "onTargetingAutoAttackStart", source)
|
|
58
142
|
end)
|
|
59
143
|
Unit.autoAttackFinishEvent:addListener(function(source, target)
|
|
60
144
|
____exports.UnitBehavior:forAll(source, "onAutoAttackFinish", target)
|
|
145
|
+
____exports.UnitBehavior:forAll(target, "onTargetingAutoAttackFinish", source)
|
|
61
146
|
end)
|
|
62
147
|
Unit.onDamaging:addListener(function(source, target, event)
|
|
63
148
|
if source ~= nil then
|
|
@@ -58,6 +58,8 @@ export declare class UnitAbility extends Ability {
|
|
|
58
58
|
constructor(handle: jability, typeId: number, owner: Unit);
|
|
59
59
|
incrementHideCounter(): void;
|
|
60
60
|
decrementHideCounter(): void;
|
|
61
|
+
incrementDisableCounter(): void;
|
|
62
|
+
decrementDisableCounter(): void;
|
|
61
63
|
get level(): number;
|
|
62
64
|
set level(v: number);
|
|
63
65
|
get cooldownRemaining(): number;
|
|
@@ -38,6 +38,7 @@ local getHandleId = GetHandleId
|
|
|
38
38
|
local getItemBooleanField = BlzGetItemBooleanField
|
|
39
39
|
local setItemBooleanField = BlzSetItemBooleanField
|
|
40
40
|
local unitHideAbility = BlzUnitHideAbility
|
|
41
|
+
local unitDisableAbility = BlzUnitDisableAbility
|
|
41
42
|
local match = string.match
|
|
42
43
|
local ____type = _G.type
|
|
43
44
|
local ____tostring = _G.tostring
|
|
@@ -402,6 +403,12 @@ end
|
|
|
402
403
|
function UnitAbility.prototype.decrementHideCounter(self)
|
|
403
404
|
unitHideAbility(self.u, self.typeId, false)
|
|
404
405
|
end
|
|
406
|
+
function UnitAbility.prototype.incrementDisableCounter(self)
|
|
407
|
+
unitDisableAbility(self.u, self.typeId, true, false)
|
|
408
|
+
end
|
|
409
|
+
function UnitAbility.prototype.decrementDisableCounter(self)
|
|
410
|
+
unitDisableAbility(self.u, self.typeId, false, false)
|
|
411
|
+
end
|
|
405
412
|
function UnitAbility.prototype.interruptCast(self)
|
|
406
413
|
self.owner:interruptCast(self.typeId)
|
|
407
414
|
end
|
|
@@ -55,22 +55,24 @@ local COOLDOWN_STARTER_ITEM_TYPE_ID = compiletime(function()
|
|
|
55
55
|
itemType.activelyUsed = true
|
|
56
56
|
return itemType.id
|
|
57
57
|
end)
|
|
58
|
-
|
|
58
|
+
---
|
|
59
|
+
-- @internal For use by internal systems only.
|
|
60
|
+
____exports.itemAbilityDummy = assert(CreateUnit(
|
|
59
61
|
Player.neutralVictim.handle,
|
|
60
62
|
dummyUnitId,
|
|
61
63
|
0,
|
|
62
64
|
0,
|
|
63
65
|
270
|
|
64
66
|
))
|
|
65
|
-
local cooldownStarterItem = UnitAddItemById(
|
|
67
|
+
local cooldownStarterItem = UnitAddItemById(____exports.itemAbilityDummy, COOLDOWN_STARTER_ITEM_TYPE_ID)
|
|
66
68
|
local cooldownStarterAbility = BlzGetItemAbility(cooldownStarterItem, COOLDOWN_STARTER_ABILITY_TYPE_ID)
|
|
67
|
-
ShowUnit(
|
|
69
|
+
ShowUnit(____exports.itemAbilityDummy, false)
|
|
68
70
|
local function startItemCooldownInternal(handle, cooldown)
|
|
69
71
|
local cooldownGroup = getItemIntegerField(handle, ITEM_IF_COOLDOWN_GROUP)
|
|
70
72
|
setItemIntegerField(handle, ITEM_IF_COOLDOWN_GROUP, COOLDOWN_STARTER_ABILITY_TYPE_ID)
|
|
71
73
|
setAbilityRealLevelField(cooldownStarterAbility, ABILITY_RLF_COOLDOWN, 0, cooldown)
|
|
72
|
-
unitResetCooldown(
|
|
73
|
-
unitUseItem(
|
|
74
|
+
unitResetCooldown(____exports.itemAbilityDummy)
|
|
75
|
+
unitUseItem(____exports.itemAbilityDummy, cooldownStarterItem)
|
|
74
76
|
Timer:run(restoreCooldownGroup, handle, cooldownGroup)
|
|
75
77
|
end
|
|
76
78
|
restoreCooldownGroup = function(handle, cooldownGroup)
|
|
@@ -85,7 +87,7 @@ ____exports.startItemCooldown = function(handle, owner, cooldown)
|
|
|
85
87
|
end
|
|
86
88
|
---
|
|
87
89
|
-- @internal For use by internal systems only.
|
|
88
|
-
____exports.abilityActionDummy =
|
|
90
|
+
____exports.abilityActionDummy = ____exports.itemAbilityDummy
|
|
89
91
|
---
|
|
90
92
|
-- @internal For use by internal systems only.
|
|
91
93
|
____exports.doAbilityAction = function(handle, action, ...)
|
|
@@ -104,11 +106,11 @@ ____exports.doAbilityAction = function(handle, action, ...)
|
|
|
104
106
|
end
|
|
105
107
|
x = getItemX(handle)
|
|
106
108
|
y = getItemY(handle)
|
|
107
|
-
unitAddItem(
|
|
109
|
+
unitAddItem(____exports.itemAbilityDummy, handle)
|
|
108
110
|
end
|
|
109
111
|
local result = action(handle, ...)
|
|
110
112
|
if not isOwned then
|
|
111
|
-
unitRemoveItem(
|
|
113
|
+
unitRemoveItem(____exports.itemAbilityDummy, handle)
|
|
112
114
|
setItemPosition(handle, x, y)
|
|
113
115
|
if isPowerup then
|
|
114
116
|
setItemBooleanField(handle, ITEM_BF_USE_AUTOMATICALLY_WHEN_ACQUIRED, true)
|
|
@@ -139,9 +141,9 @@ ____exports.doAbilityActionForceDummy = function(handle, owner, action, ...)
|
|
|
139
141
|
isPowerup = true
|
|
140
142
|
end
|
|
141
143
|
unitRemoveItem(owner, handle)
|
|
142
|
-
unitAddItem(
|
|
144
|
+
unitAddItem(____exports.itemAbilityDummy, handle)
|
|
143
145
|
local result = action(handle, ...)
|
|
144
|
-
unitRemoveItem(
|
|
146
|
+
unitRemoveItem(____exports.itemAbilityDummy, handle)
|
|
145
147
|
unitAddItemToSlot(owner, handle, slot)
|
|
146
148
|
if isPowerup then
|
|
147
149
|
setItemBooleanField(handle, ITEM_BF_USE_AUTOMATICALLY_WHEN_ACQUIRED, true)
|
|
@@ -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);
|
|
@@ -73,6 +74,7 @@ export declare class Item extends Handle<jitem> {
|
|
|
73
74
|
set position(v: Vec2);
|
|
74
75
|
set charges(v: number);
|
|
75
76
|
get charges(): number;
|
|
77
|
+
consumeCharge(): boolean;
|
|
76
78
|
addAbility(abilityTypeId: AbilityTypeId): ItemAbility | undefined;
|
|
77
79
|
removeAbility(abilityTypeId: AbilityTypeId): boolean;
|
|
78
80
|
hasAbility(abilityTypeId: AbilityTypeId): boolean;
|
package/engine/internal/item.lua
CHANGED
|
@@ -15,6 +15,8 @@ local ____ability = require("engine.internal.ability")
|
|
|
15
15
|
local ItemAbility = ____ability.ItemAbility
|
|
16
16
|
local ____ability = require("engine.internal.item.ability")
|
|
17
17
|
local doAbilityAction = ____ability.doAbilityAction
|
|
18
|
+
local doAbilityActionForceDummy = ____ability.doAbilityActionForceDummy
|
|
19
|
+
local itemAbilityDummy = ____ability.itemAbilityDummy
|
|
18
20
|
local ____dummy_2Ditem = require("engine.internal.object-data.dummy-item")
|
|
19
21
|
local DUMMY_ITEM_ID = ____dummy_2Ditem.DUMMY_ITEM_ID
|
|
20
22
|
local ____add_2Ditem_2Dto_2Dslot = require("engine.internal.unit.add-item-to-slot")
|
|
@@ -36,6 +38,8 @@ local getEnumItem = GetEnumItem
|
|
|
36
38
|
local getItemTypeId = GetItemTypeId
|
|
37
39
|
local getItemX = GetItemX
|
|
38
40
|
local getItemY = GetItemY
|
|
41
|
+
local getItemCharges = GetItemCharges
|
|
42
|
+
local setItemCharges = SetItemCharges
|
|
39
43
|
local getItemIntegerField = BlzGetItemIntegerField
|
|
40
44
|
local setItemBooleanField = BlzSetItemBooleanField
|
|
41
45
|
local getItemBooleanField = BlzGetItemBooleanField
|
|
@@ -116,6 +120,45 @@ end
|
|
|
116
120
|
function Item.create(self, id, x, y, skinId)
|
|
117
121
|
return self:of(BlzCreateItemWithSkin(id, x, y, skinId or id))
|
|
118
122
|
end
|
|
123
|
+
function Item.prototype.consumeCharge(self)
|
|
124
|
+
local handle = self.handle
|
|
125
|
+
local charges = getItemCharges(handle)
|
|
126
|
+
if charges >= 2 then
|
|
127
|
+
setItemCharges(handle, charges - 1)
|
|
128
|
+
return true
|
|
129
|
+
end
|
|
130
|
+
if charges == 1 then
|
|
131
|
+
if getItemBooleanField(handle, ITEM_BF_PERISHABLE) then
|
|
132
|
+
self:destroy()
|
|
133
|
+
return true
|
|
134
|
+
end
|
|
135
|
+
local ____doAbilityActionForceDummy_2 = doAbilityActionForceDummy
|
|
136
|
+
local ____opt_0 = self.owner
|
|
137
|
+
____doAbilityActionForceDummy_2(
|
|
138
|
+
handle,
|
|
139
|
+
____opt_0 and ____opt_0.handle,
|
|
140
|
+
function()
|
|
141
|
+
do
|
|
142
|
+
local i = 0
|
|
143
|
+
local ability = getItemAbilityByIndex(handle, i)
|
|
144
|
+
while ability ~= nil do
|
|
145
|
+
UnitRemoveAbility(
|
|
146
|
+
itemAbilityDummy,
|
|
147
|
+
getAbilityId(ability)
|
|
148
|
+
)
|
|
149
|
+
do
|
|
150
|
+
i = i + 1
|
|
151
|
+
ability = getItemAbilityByIndex(handle, i)
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
UnitUseItem(itemAbilityDummy, handle)
|
|
156
|
+
end
|
|
157
|
+
)
|
|
158
|
+
return true
|
|
159
|
+
end
|
|
160
|
+
return false
|
|
161
|
+
end
|
|
119
162
|
function Item.prototype.addAbility(self, abilityTypeId)
|
|
120
163
|
local nativeAbility = doAbilityAction(self.handle, ____exports.addAndGetAbility, abilityTypeId)
|
|
121
164
|
if nativeAbility ~= nil then
|
|
@@ -301,7 +344,7 @@ __TS__SetDescriptor(
|
|
|
301
344
|
"perishable",
|
|
302
345
|
{
|
|
303
346
|
get = function(self)
|
|
304
|
-
return
|
|
347
|
+
return getItemBooleanField(self.handle, ITEM_BF_PERISHABLE)
|
|
305
348
|
end,
|
|
306
349
|
set = function(self, v)
|
|
307
350
|
BlzSetItemBooleanField(self.handle, ITEM_BF_PERISHABLE, v)
|
|
@@ -557,10 +600,10 @@ __TS__SetDescriptor(
|
|
|
557
600
|
"charges",
|
|
558
601
|
{
|
|
559
602
|
get = function(self)
|
|
560
|
-
return
|
|
603
|
+
return getItemCharges(self.handle)
|
|
561
604
|
end,
|
|
562
605
|
set = function(self, v)
|
|
563
|
-
|
|
606
|
+
setItemCharges(self.handle, v)
|
|
564
607
|
end
|
|
565
608
|
},
|
|
566
609
|
true
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { CombatClassifications } from "../../object-data/auxiliary/combat-classification";
|
|
3
3
|
declare module "../unit" {
|
|
4
4
|
interface Unit {
|
|
5
|
-
isAllowedTarget(this: Unit, source: Unit, allowedTargetCombatClassifications
|
|
5
|
+
isAllowedTarget(this: Unit, source: Unit, allowedTargetCombatClassifications?: CombatClassifications): boolean;
|
|
6
6
|
}
|
|
7
7
|
}
|
|
8
8
|
declare module "../unit" {
|
|
@@ -5,7 +5,15 @@ local initializeFilterTargetState = ____combat_2Dclassification.initializeFilter
|
|
|
5
5
|
local ____unit = require("engine.internal.unit")
|
|
6
6
|
local Unit = ____unit.Unit
|
|
7
7
|
Unit.prototype.isAllowedTarget = function(self, source, allowedTargetCombatClassifications)
|
|
8
|
-
|
|
8
|
+
if allowedTargetCombatClassifications ~= nil then
|
|
9
|
+
initializeFilterTargetState(source, allowedTargetCombatClassifications)
|
|
10
|
+
return filterTarget(self)
|
|
11
|
+
end
|
|
12
|
+
initializeFilterTargetState(source, source.firstWeapon.allowedTargetCombatClassifications)
|
|
13
|
+
if filterTarget(self) then
|
|
14
|
+
return true
|
|
15
|
+
end
|
|
16
|
+
initializeFilterTargetState(source, source.secondWeapon.allowedTargetCombatClassifications)
|
|
9
17
|
return filterTarget(self)
|
|
10
18
|
end
|
|
11
19
|
Unit.getAllowedTargetsInRange = function(source, allowedTargetCombatClassifications, x, y, range)
|
|
@@ -1,15 +1,6 @@
|
|
|
1
1
|
/** @noSelfInFile */
|
|
2
2
|
import { Widget } from "../../core/types/widget";
|
|
3
|
-
|
|
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,
|
|
@@ -44,7 +44,7 @@ local function timerCallback(source, target)
|
|
|
44
44
|
Event.invoke(autoAttackFinishEvent, source, target)
|
|
45
45
|
end
|
|
46
46
|
Unit.autoAttackStartEvent:addListener(function(source, target)
|
|
47
|
-
local attackPoint = source.
|
|
47
|
+
local attackPoint = (source:chooseWeapon(target) or source.firstWeapon).impactDelay
|
|
48
48
|
local timer = Timer:simple(attackPoint, timerCallback, source, target)
|
|
49
49
|
eventTimerByUnit[source] = timer
|
|
50
50
|
end)
|