warscript 0.0.1-dev.d1328b7 → 0.0.1-dev.d18f377

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/core/types/effect.d.ts +12 -3
  2. package/core/types/effect.lua +56 -7
  3. package/core/types/frame.d.ts +3 -0
  4. package/core/types/frame.lua +59 -0
  5. package/engine/behaviour/ability/emulate-impact.d.ts +6 -0
  6. package/engine/behaviour/ability/emulate-impact.lua +29 -0
  7. package/engine/behaviour/ability/instant-impact.d.ts +2 -2
  8. package/engine/behaviour/ability/instant-impact.lua +4 -19
  9. package/engine/behaviour/ability/on-command-impact.d.ts +8 -0
  10. package/engine/behaviour/ability/on-command-impact.lua +18 -0
  11. package/engine/behaviour/ability/remove-buffs.d.ts +16 -0
  12. package/engine/behaviour/ability/remove-buffs.lua +28 -0
  13. package/engine/behaviour/ability.d.ts +7 -3
  14. package/engine/behaviour/ability.lua +35 -34
  15. package/engine/buff.d.ts +6 -1
  16. package/engine/buff.lua +29 -18
  17. package/engine/internal/ability.d.ts +2 -1
  18. package/engine/internal/ability.lua +10 -2
  19. package/engine/internal/unit/ability.d.ts +10 -1
  20. package/engine/internal/unit/ability.lua +36 -14
  21. package/engine/internal/unit/item.d.ts +1 -0
  22. package/engine/internal/unit/item.lua +10 -0
  23. package/engine/internal/unit/main-selected.d.ts +6 -0
  24. package/engine/internal/unit/main-selected.lua +12 -1
  25. package/engine/internal/unit.d.ts +6 -0
  26. package/engine/internal/unit.lua +24 -11
  27. package/engine/object-data/auxiliary/sound-preset-name.d.ts +5 -1
  28. package/engine/object-field/ability.d.ts +2 -2
  29. package/package.json +1 -1
  30. package/utility/arrays.d.ts +8 -1
  31. package/utility/arrays.lua +34 -3
  32. package/utility/lazy.d.ts +2 -0
  33. package/utility/lazy.lua +14 -0
@@ -4,15 +4,22 @@ import { Widget } from "./widget";
4
4
  import { PlayerColor } from "./playerColor";
5
5
  declare const enum EffectPropertyKey {
6
6
  COLOR = 100,
7
- PITCH = 101
7
+ PITCH = 101,
8
+ ROLL = 102
8
9
  }
9
10
  export type EffectParameters = {
10
11
  readonly scale?: number;
11
12
  readonly color?: PlayerColor;
13
+ readonly pitch?: number;
14
+ readonly roll?: number;
15
+ readonly detached?: boolean;
16
+ readonly zOffset?: number;
17
+ readonly scaleZOffset?: boolean;
12
18
  };
13
19
  export declare class Effect extends Handle<jeffect> {
14
20
  private [EffectPropertyKey.COLOR]?;
15
21
  private [EffectPropertyKey.PITCH]?;
22
+ private [EffectPropertyKey.ROLL]?;
16
23
  protected onDestroy(): HandleDestructor;
17
24
  get color(): PlayerColor;
18
25
  set color(color: PlayerColor);
@@ -20,11 +27,13 @@ export declare class Effect extends Handle<jeffect> {
20
27
  set scale(scale: number);
21
28
  get pitch(): number;
22
29
  set pitch(pitch: number);
30
+ get roll(): number;
31
+ set roll(roll: number);
23
32
  static create<T extends Effect>(this: typeof Effect & (new (handle: jeffect) => T), model: string, pos: Vec2): T;
24
33
  static createTarget<T extends Effect>(this: typeof Effect & (new (handle: jeffect) => T), model: string, target: Widget, attachPoint: string): T;
25
34
  static flash(modelPath: string, ...args: [
26
- ...pointOrWidget: [x: number, y: number] | [widget: Widget, attachmentPoint: string],
27
- ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]
35
+ ...pointOrWidget: [x: number, y: number] | [widget: Widget, attachmentPoint?: string],
36
+ ...parametersOrDuration: [parametersOrDuration?: EffectParameters | number] | [duration?: number, parameters?: EffectParameters]
28
37
  ]): void;
29
38
  static flashTarget(model: string, target: Widget, attachPoint: string, duration?: number): void;
30
39
  }
@@ -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__InstanceOf = ____lualib.__TS__InstanceOf
4
5
  local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
5
6
  local ____exports = {}
6
7
  local dummyPlayer
@@ -12,6 +13,8 @@ local ____player = require("core.types.player")
12
13
  local Player = ____player.Player
13
14
  local ____timer = require("core.types.timer")
14
15
  local Timer = ____timer.Timer
16
+ local ____unit = require("engine.internal.unit")
17
+ local Unit = ____unit.Unit
15
18
  local ____pairs = _G.pairs
16
19
  local select = _G.select
17
20
  local mathRad = math.rad
@@ -22,10 +25,28 @@ local getSpecialEffectScale = BlzGetSpecialEffectScale
22
25
  local playSpecialEffect = BlzPlaySpecialEffect
23
26
  local setSpecialEffectScale = BlzSetSpecialEffectScale
24
27
  local setSpecialEffectPitch = BlzSetSpecialEffectPitch
28
+ local setSpecialEffectRoll = BlzSetSpecialEffectRoll
25
29
  local setSpecialEffectColorByPlayer = BlzSetSpecialEffectColorByPlayer
26
30
  local specialEffectAddSubAnimation = BlzSpecialEffectAddSubAnimation
27
31
  local specialEffectClearSubAnimations = BlzSpecialEffectClearSubAnimations
28
32
  local specialEffectRemoveSubAnimation = BlzSpecialEffectRemoveSubAnimation
33
+ local setSpecialEffectZ = BlzSetSpecialEffectZ
34
+ local getLocationZ = GetLocationZ
35
+ local getUnitZ = BlzGetUnitZ
36
+ local moveLocation = MoveLocation
37
+ local location = Location(0, 0)
38
+ local function setSpecialEffectPitchDegrees(effect, pitch)
39
+ setSpecialEffectPitch(
40
+ effect,
41
+ -mathRad(pitch)
42
+ )
43
+ end
44
+ local function setSpecialEffectRollDegrees(effect, roll)
45
+ setSpecialEffectRoll(
46
+ effect,
47
+ -mathRad(roll)
48
+ )
49
+ end
29
50
  local animTypeByAnimationName = {
30
51
  attack = ANIM_TYPE_ATTACK,
31
52
  birth = ANIM_TYPE_BIRTH,
@@ -97,7 +118,7 @@ local function setSpecialEffectColor(effect, color)
97
118
  setSpecialEffectColorByPlayer(effect, dummyPlayer.handle)
98
119
  dummyPlayer.color = dummyColor
99
120
  end
100
- local setters = {scale = setSpecialEffectScale, color = setSpecialEffectColor}
121
+ local setters = {scale = setSpecialEffectScale, color = setSpecialEffectColor, pitch = setSpecialEffectPitchDegrees, roll = setSpecialEffectRollDegrees}
101
122
  dummyPlayer = Player.neutralExtra
102
123
  local temporaryEffects = {}
103
124
  local temporaryEffectsDurations = {}
@@ -136,10 +157,27 @@ function Effect.flash(self, modelPath, xOrWidget, yOrOrAttachmentPoint, paramete
136
157
  parameters = parametersOrDuration
137
158
  parametersOrDuration = nil
138
159
  end
139
- local effect = type(xOrWidget) == "number" and addSpecialEffect(modelPath, xOrWidget, yOrOrAttachmentPoint) or addSpecialEffectTarget(modelPath, xOrWidget.handle, yOrOrAttachmentPoint)
160
+ local coordinatesProvided = type(xOrWidget) == "number"
161
+ local isPositional = coordinatesProvided or (parameters and parameters.detached) == true
162
+ local x = not isPositional and 0 or (coordinatesProvided and xOrWidget or xOrWidget.x)
163
+ local y = not isPositional and 0 or (coordinatesProvided and yOrOrAttachmentPoint or xOrWidget.y)
164
+ local effect = isPositional and addSpecialEffect(modelPath, x, y) or addSpecialEffectTarget(modelPath, xOrWidget.handle, yOrOrAttachmentPoint or "origin")
165
+ if isPositional and not coordinatesProvided and (parameters and parameters.scale) == nil and __TS__InstanceOf(xOrWidget, Unit) then
166
+ setSpecialEffectScale(effect, xOrWidget.scale)
167
+ end
140
168
  if parameters ~= nil then
141
169
  for key, value in ____pairs(parameters) do
142
- setters[key](effect, value)
170
+ if key ~= "zOffset" and key ~= "detached" and key ~= "scaleZOffset" then
171
+ setters[key](effect, value)
172
+ end
173
+ end
174
+ if isPositional and parameters.zOffset ~= nil then
175
+ moveLocation(location, x, y)
176
+ local z = __TS__InstanceOf(xOrWidget, Unit) and getLocationZ(location) + xOrWidget.flyHeight or getLocationZ(location)
177
+ BlzSetSpecialEffectZ(
178
+ effect,
179
+ z + parameters.zOffset * (parameters.scaleZOffset and getSpecialEffectScale(effect) or 1)
180
+ )
143
181
  end
144
182
  end
145
183
  if parametersOrDuration ~= nil and parametersOrDuration > 0 then
@@ -197,13 +235,24 @@ __TS__SetDescriptor(
197
235
  return self[101] or 0
198
236
  end,
199
237
  set = function(self, pitch)
200
- setSpecialEffectPitch(
201
- self.handle,
202
- -mathRad(pitch)
203
- )
238
+ setSpecialEffectPitchDegrees(self.handle, pitch)
204
239
  self[101] = pitch
205
240
  end
206
241
  },
207
242
  true
208
243
  )
244
+ __TS__SetDescriptor(
245
+ Effect.prototype,
246
+ "roll",
247
+ {
248
+ get = function(self)
249
+ return self[102] or 0
250
+ end,
251
+ set = function(self, roll)
252
+ setSpecialEffectRollDegrees(self.handle, roll)
253
+ self[102] = roll
254
+ end
255
+ },
256
+ true
257
+ )
209
258
  return ____exports
@@ -31,6 +31,7 @@ export declare class Frame extends Handle<jframehandle> {
31
31
  static readonly WORLD: Frame;
32
32
  static readonly CHAT: Frame;
33
33
  static readonly TIME_OF_DAY_CLOCK: Frame;
34
+ private static readonly SIMPLE_FRAME_TEST_CHILD;
34
35
  static get uiScale(): number;
35
36
  static get leftBorder(): Frame;
36
37
  static get rightBorder(): Frame;
@@ -79,6 +80,8 @@ export declare class Frame extends Handle<jframehandle> {
79
80
  get onMouseLeave(): FrameEvent;
80
81
  get onMouseUp(): FrameEvent;
81
82
  get onMouseWheel(): FrameEvent<[number]>;
83
+ get mouseEnterLocalEvent(): Event;
84
+ get mouseLeaveLocalEvent(): Event;
82
85
  get popupMenuItemChangeEvent(): FrameEvent<[
83
86
  popupMenu: Frame,
84
87
  previousValue: number,
@@ -122,6 +122,7 @@ do
122
122
  FramePoint.BOTTOM = FRAMEPOINT_BOTTOM
123
123
  FramePoint.BOTTOM_RIGHT = FRAMEPOINT_BOTTOMRIGHT
124
124
  end
125
+ local tooltipByFrame = setmetatable({}, {__mode = "k"})
125
126
  ____exports.Frame = __TS__Class()
126
127
  local Frame = ____exports.Frame
127
128
  Frame.name = "Frame"
@@ -242,6 +243,7 @@ function Frame.prototype.setTextColor(self, color)
242
243
  end
243
244
  function Frame.prototype.setTooltip(self, tooltip)
244
245
  BlzFrameSetTooltip(self.handle, tooltip.handle)
246
+ tooltipByFrame[self] = tooltip
245
247
  end
246
248
  function Frame.prototype.setMinMaxValue(self, minValue, maxValue)
247
249
  BlzFrameSetMinMaxValue(self.handle, minValue, maxValue)
@@ -310,6 +312,7 @@ Frame.CONSOLE_BOTTOM_BAR = ____exports.Frame:byName("ConsoleBottomBar")
310
312
  Frame.WORLD = ____exports.Frame:byOrigin(ORIGIN_FRAME_WORLD_FRAME)
311
313
  Frame.CHAT = ____exports.Frame:byOrigin(ORIGIN_FRAME_CHAT_MSG)
312
314
  Frame.TIME_OF_DAY_CLOCK = ____exports.Frame.GAME_UI:getChild(5):getChild(0)
315
+ Frame.SIMPLE_FRAME_TEST_CHILD = ____exports.Frame:createByType("SIMPLEFRAME", "SimpleFrameTestParent", ____exports.Frame.CONSOLE_UI)
313
316
  __TS__ObjectDefineProperty(
314
317
  Frame,
315
318
  "uiScale",
@@ -618,6 +621,62 @@ __TS__SetDescriptor(
618
621
  end},
619
622
  true
620
623
  )
624
+ __TS__SetDescriptor(
625
+ Frame.prototype,
626
+ "mouseEnterLocalEvent",
627
+ {get = function(self)
628
+ local event = __TS__New(Event)
629
+ if not (tooltipByFrame[self] ~= nil) then
630
+ ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent = self
631
+ local tooltip = ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent == self and ____exports.Frame:createByType("SIMPLEFRAME", "", ____exports.Frame.CONSOLE_UI) or ____exports.Frame:createByType("FRAME", "", ____exports.Frame.GAME_UI)
632
+ ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent = ____exports.Frame.CONSOLE_UI
633
+ self:setTooltip(tooltip)
634
+ end
635
+ local isMouseInside = false
636
+ Timer.onPeriod[1 / 64]:addListener(function()
637
+ local tooltip = tooltipByFrame[self]
638
+ if tooltip and tooltip.visible then
639
+ if not isMouseInside then
640
+ isMouseInside = true
641
+ Event.invoke(event)
642
+ end
643
+ else
644
+ isMouseInside = false
645
+ end
646
+ end)
647
+ rawset(self, "mouseEnterLocalEvent", event)
648
+ return event
649
+ end},
650
+ true
651
+ )
652
+ __TS__SetDescriptor(
653
+ Frame.prototype,
654
+ "mouseLeaveLocalEvent",
655
+ {get = function(self)
656
+ local event = __TS__New(Event)
657
+ if not (tooltipByFrame[self] ~= nil) then
658
+ ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent = self
659
+ local tooltip = ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent == self and ____exports.Frame:createByType("SIMPLEFRAME", "", ____exports.Frame.CONSOLE_UI) or ____exports.Frame:createByType("FRAME", "", ____exports.Frame.GAME_UI)
660
+ ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent = ____exports.Frame.CONSOLE_UI
661
+ self:setTooltip(tooltip)
662
+ end
663
+ local isMouseInside = false
664
+ Timer.onPeriod[1 / 64]:addListener(function()
665
+ local tooltip = tooltipByFrame[self]
666
+ if tooltip and tooltip.visible then
667
+ isMouseInside = true
668
+ else
669
+ if isMouseInside then
670
+ isMouseInside = false
671
+ Event.invoke(event)
672
+ end
673
+ end
674
+ end)
675
+ rawset(self, "mouseLeaveLocalEvent", event)
676
+ return event
677
+ end},
678
+ true
679
+ )
621
680
  __TS__SetDescriptor(
622
681
  Frame.prototype,
623
682
  "popupMenuItemChangeEvent",
@@ -0,0 +1,6 @@
1
+ /** @noSelfInFile */
2
+ import { AbilityBehavior } from "../ability";
3
+ import { Unit } from "../../internal/unit";
4
+ export declare abstract class EmulateImpactAbilityBehavior extends AbilityBehavior {
5
+ protected emulateImpact(caster: Unit): void;
6
+ }
@@ -0,0 +1,29 @@
1
+ local ____lualib = require("lualib_bundle")
2
+ local __TS__Class = ____lualib.__TS__Class
3
+ local __TS__ClassExtends = ____lualib.__TS__ClassExtends
4
+ local ____exports = {}
5
+ local ____ability = require("engine.behaviour.ability")
6
+ local AbilityBehavior = ____ability.AbilityBehavior
7
+ local ____ability = require("engine.standard.fields.ability")
8
+ local COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD = ____ability.COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD
9
+ local MANA_COST_ABILITY_INTEGER_LEVEL_FIELD = ____ability.MANA_COST_ABILITY_INTEGER_LEVEL_FIELD
10
+ ____exports.EmulateImpactAbilityBehavior = __TS__Class()
11
+ local EmulateImpactAbilityBehavior = ____exports.EmulateImpactAbilityBehavior
12
+ EmulateImpactAbilityBehavior.name = "EmulateImpactAbilityBehavior"
13
+ __TS__ClassExtends(EmulateImpactAbilityBehavior, AbilityBehavior)
14
+ function EmulateImpactAbilityBehavior.prototype.emulateImpact(self, caster)
15
+ local abilityTypeId = self.ability.typeId
16
+ local manaCost = self:resolveCurrentAbilityDependentValue(MANA_COST_ABILITY_INTEGER_LEVEL_FIELD)
17
+ local cooldown = self:resolveCurrentAbilityDependentValue(COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD)
18
+ if caster:getAbilityRemainingCooldown(abilityTypeId) ~= 0 or caster.mana < manaCost then
19
+ return
20
+ end
21
+ caster.mana = caster.mana - manaCost
22
+ if cooldown == 0 then
23
+ caster:interruptCast(self.ability.typeId)
24
+ else
25
+ caster:startAbilityCooldown(self.ability.typeId, cooldown)
26
+ end
27
+ AbilityBehavior:forAll(self.ability, "onImpact", caster)
28
+ end
29
+ return ____exports
@@ -1,6 +1,6 @@
1
1
  /** @noSelfInFile */
2
- import { AbilityBehavior } from "../ability";
3
2
  import { Unit } from "../../internal/unit";
4
- export declare class InstantImpactAbilityBehavior extends AbilityBehavior {
3
+ import { EmulateImpactAbilityBehavior } from "./emulate-impact";
4
+ export declare class InstantImpactAbilityBehavior extends EmulateImpactAbilityBehavior {
5
5
  onCastingStart(caster: Unit): void;
6
6
  }
@@ -2,28 +2,13 @@ local ____lualib = require("lualib_bundle")
2
2
  local __TS__Class = ____lualib.__TS__Class
3
3
  local __TS__ClassExtends = ____lualib.__TS__ClassExtends
4
4
  local ____exports = {}
5
- local ____ability = require("engine.behaviour.ability")
6
- local AbilityBehavior = ____ability.AbilityBehavior
7
- local ____ability = require("engine.standard.fields.ability")
8
- local COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD = ____ability.COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD
9
- local MANA_COST_ABILITY_INTEGER_LEVEL_FIELD = ____ability.MANA_COST_ABILITY_INTEGER_LEVEL_FIELD
5
+ local ____emulate_2Dimpact = require("engine.behaviour.ability.emulate-impact")
6
+ local EmulateImpactAbilityBehavior = ____emulate_2Dimpact.EmulateImpactAbilityBehavior
10
7
  ____exports.InstantImpactAbilityBehavior = __TS__Class()
11
8
  local InstantImpactAbilityBehavior = ____exports.InstantImpactAbilityBehavior
12
9
  InstantImpactAbilityBehavior.name = "InstantImpactAbilityBehavior"
13
- __TS__ClassExtends(InstantImpactAbilityBehavior, AbilityBehavior)
10
+ __TS__ClassExtends(InstantImpactAbilityBehavior, EmulateImpactAbilityBehavior)
14
11
  function InstantImpactAbilityBehavior.prototype.onCastingStart(self, caster)
15
- local abilityTypeId = self.ability.typeId
16
- local manaCost = self:resolveCurrentAbilityDependentValue(MANA_COST_ABILITY_INTEGER_LEVEL_FIELD)
17
- local cooldown = self:resolveCurrentAbilityDependentValue(COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD)
18
- if caster:getAbilityRemainingCooldown(abilityTypeId) ~= 0 or caster.mana < manaCost then
19
- return
20
- end
21
- caster.mana = caster.mana - manaCost
22
- if cooldown == 0 then
23
- caster:interruptCast(self.ability.typeId)
24
- else
25
- caster:startAbilityCooldown(self.ability.typeId, cooldown)
26
- end
27
- AbilityBehavior:forAll(self.ability, "onImpact", caster)
12
+ self:emulateImpact(caster)
28
13
  end
29
14
  return ____exports
@@ -0,0 +1,8 @@
1
+ /** @noSelfInFile */
2
+ import { Unit } from "../../internal/unit";
3
+ import { EmulateImpactAbilityBehavior } from "./emulate-impact";
4
+ import { Ability } from "../../internal/ability";
5
+ export declare class OnCommandImpactAbilityBehavior extends EmulateImpactAbilityBehavior {
6
+ constructor(ability: Ability);
7
+ onCommand(caster: Unit): void;
8
+ }
@@ -0,0 +1,18 @@
1
+ local ____lualib = require("lualib_bundle")
2
+ local __TS__Class = ____lualib.__TS__Class
3
+ local __TS__ClassExtends = ____lualib.__TS__ClassExtends
4
+ local ____exports = {}
5
+ local ____emulate_2Dimpact = require("engine.behaviour.ability.emulate-impact")
6
+ local EmulateImpactAbilityBehavior = ____emulate_2Dimpact.EmulateImpactAbilityBehavior
7
+ ____exports.OnCommandImpactAbilityBehavior = __TS__Class()
8
+ local OnCommandImpactAbilityBehavior = ____exports.OnCommandImpactAbilityBehavior
9
+ OnCommandImpactAbilityBehavior.name = "OnCommandImpactAbilityBehavior"
10
+ __TS__ClassExtends(OnCommandImpactAbilityBehavior, EmulateImpactAbilityBehavior)
11
+ function OnCommandImpactAbilityBehavior.prototype.____constructor(self, ability)
12
+ EmulateImpactAbilityBehavior.prototype.____constructor(self, ability)
13
+ self:registerCommandEvent()
14
+ end
15
+ function OnCommandImpactAbilityBehavior.prototype.onCommand(self, caster)
16
+ self:emulateImpact(caster)
17
+ end
18
+ return ____exports
@@ -0,0 +1,16 @@
1
+ /** @noSelfInFile */
2
+ import { AbilityBehavior } from "../ability";
3
+ import { Unit } from "../../internal/unit";
4
+ import { Ability } from "../../internal/ability";
5
+ import { AbilityDependentValue } from "../../object-field/ability";
6
+ import { BuffPolarity } from "../../object-data/auxiliary/buff-polarity";
7
+ import { BuffResistanceType } from "../../object-data/auxiliary/buff-resistance-type";
8
+ export declare class RemoveBuffsSelfAbilityBehavior extends AbilityBehavior {
9
+ private readonly polarity?;
10
+ private readonly resistanceType?;
11
+ private readonly includeExpirationTimers?;
12
+ private readonly includeAuras?;
13
+ private readonly autoDispel?;
14
+ constructor(ability: Ability, polarity?: AbilityDependentValue<BuffPolarity> | undefined, resistanceType?: AbilityDependentValue<BuffResistanceType> | undefined, includeExpirationTimers?: AbilityDependentValue<boolean> | undefined, includeAuras?: AbilityDependentValue<boolean> | undefined, autoDispel?: AbilityDependentValue<boolean> | undefined);
15
+ onImpact(caster: Unit): void;
16
+ }
@@ -0,0 +1,28 @@
1
+ local ____lualib = require("lualib_bundle")
2
+ local __TS__Class = ____lualib.__TS__Class
3
+ local __TS__ClassExtends = ____lualib.__TS__ClassExtends
4
+ local ____exports = {}
5
+ local ____ability = require("engine.behaviour.ability")
6
+ local AbilityBehavior = ____ability.AbilityBehavior
7
+ ____exports.RemoveBuffsSelfAbilityBehavior = __TS__Class()
8
+ local RemoveBuffsSelfAbilityBehavior = ____exports.RemoveBuffsSelfAbilityBehavior
9
+ RemoveBuffsSelfAbilityBehavior.name = "RemoveBuffsSelfAbilityBehavior"
10
+ __TS__ClassExtends(RemoveBuffsSelfAbilityBehavior, AbilityBehavior)
11
+ function RemoveBuffsSelfAbilityBehavior.prototype.____constructor(self, ability, polarity, resistanceType, includeExpirationTimers, includeAuras, autoDispel)
12
+ AbilityBehavior.prototype.____constructor(self, ability)
13
+ self.polarity = polarity
14
+ self.resistanceType = resistanceType
15
+ self.includeExpirationTimers = includeExpirationTimers
16
+ self.includeAuras = includeAuras
17
+ self.autoDispel = autoDispel
18
+ end
19
+ function RemoveBuffsSelfAbilityBehavior.prototype.onImpact(self, caster)
20
+ caster:removeBuffs(
21
+ self:resolveCurrentAbilityDependentValue(self.polarity),
22
+ self:resolveCurrentAbilityDependentValue(self.resistanceType),
23
+ self:resolveCurrentAbilityDependentValue(self.includeExpirationTimers),
24
+ self:resolveCurrentAbilityDependentValue(self.includeAuras),
25
+ self:resolveCurrentAbilityDependentValue(self.autoDispel)
26
+ )
27
+ end
28
+ return ____exports
@@ -9,22 +9,26 @@ import { Destructable } from "../../core/types/destructable";
9
9
  import { EffectParameters } from "../../core/types/effect";
10
10
  import { AbilityDependentValue } from "../object-field/ability";
11
11
  export type AbilityBehaviorConstructor<Args extends any[]> = new (ability: Ability, ...args: Args) => AbilityBehavior;
12
+ export type AbilityBehaviorParameters = {
13
+ isExclusiveOnImpactHandler?: boolean;
14
+ };
12
15
  export declare abstract class AbilityBehavior<Parameters extends {
13
16
  periodicActionParameters?: any[];
14
17
  missileParameters?: any[];
15
18
  } = {}> extends Behavior<Ability, NonNullable<Parameters["periodicActionParameters"]>> {
16
- constructor(ability: Ability);
19
+ constructor(ability: Ability, parameters?: AbilityBehaviorParameters);
20
+ protected registerCommandEvent(orderTypeStringId?: string): void;
17
21
  get ability(): Ability;
18
- protected resolveCurrentAbilityDependentValue<T extends boolean | number | string>(value: AbilityDependentValue<T>): T;
22
+ protected resolveCurrentAbilityDependentValue<T extends boolean | number | string | undefined>(value: AbilityDependentValue<T>): T;
19
23
  protected flashAreaEffect(x: number, y: number, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
20
24
  protected flashEffect(x: number, y: number, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
21
25
  protected flashSpecialEffect(...args: [...pointOrWidget: [x: number, y: number] | [widget: Widget], duration?: number]): void;
22
26
  private static MissileLaunchConfig;
23
27
  private get missileLaunchConfig();
24
- protected launchMissile(source: Unit, target: Unit, ...parameters: NonNullable<Parameters["missileParameters"]>): void;
25
28
  onMissileArrival(...parameters: NonNullable<Parameters["missileParameters"]>): void;
26
29
  onUnitGainAbility(_unit: Unit): void;
27
30
  onUnitLoseAbility(_unit: Unit): void;
31
+ onCommand(caster: Unit, orderTypeStringId: string): void;
28
32
  onCastingStart(caster: Unit): void;
29
33
  onCastingFinish(caster: Unit): void;
30
34
  onChannelingStart(caster: Unit): void;
@@ -4,6 +4,7 @@ local __TS__ClassExtends = ____lualib.__TS__ClassExtends
4
4
  local __TS__New = ____lualib.__TS__New
5
5
  local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
6
6
  local ____exports = {}
7
+ local createUnitEventListener
7
8
  local ____behavior = require("engine.behavior")
8
9
  local Behavior = ____behavior.Behavior
9
10
  local ____unit = require("engine.unit")
@@ -24,21 +25,27 @@ local ____ability = require("engine.object-field.ability")
24
25
  local resolveCurrentAbilityDependentValue = ____ability.resolveCurrentAbilityDependentValue
25
26
  local ____timer = require("core.types.timer")
26
27
  local Timer = ____timer.Timer
27
- local ____missile = require("core.types.missile")
28
- local Missile = ____missile.Missile
29
28
  local createBehaviorFunctionsByAbilityTypeId = {}
30
- local function invokeOnMissileArrival(_missile, success, abilityBehavior, ...)
31
- if success then
32
- abilityBehavior:onMissileArrival(...)
29
+ local exclusiveOnImpactHandlerAbilityBehaviorByAbility = setmetatable({}, {__mode = "k"})
30
+ local function createZeroTimerUnitEventListener(key)
31
+ local unitEventListener = createUnitEventListener(key)
32
+ return function(unit, ability, ...)
33
+ Timer:run(unitEventListener, unit, ability, ...)
33
34
  end
34
35
  end
35
- local ____class_0 = __TS__Class()
36
- ____class_0.name = ""
37
- function ____class_0.prototype.____constructor(self, abilityBehavior)
36
+ createUnitEventListener = function(key)
37
+ return function(unit, ability, ...)
38
+ ____exports.AbilityBehavior:forAll(ability, key, unit, ...)
39
+ end
40
+ end
41
+ local registeredCommandEventIds = {}
42
+ local ____class_2 = __TS__Class()
43
+ ____class_2.name = ""
44
+ function ____class_2.prototype.____constructor(self, abilityBehavior)
38
45
  self.abilityBehavior = abilityBehavior
39
46
  end
40
47
  __TS__SetDescriptor(
41
- ____class_0.prototype,
48
+ ____class_2.prototype,
42
49
  "art",
43
50
  {get = function(self)
44
51
  return MISSILE_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD:getValue(self.abilityBehavior.ability, 0)
@@ -46,7 +53,7 @@ __TS__SetDescriptor(
46
53
  true
47
54
  )
48
55
  __TS__SetDescriptor(
49
- ____class_0.prototype,
56
+ ____class_2.prototype,
50
57
  "arc",
51
58
  {get = function(self)
52
59
  return MISSILE_ARC_ABILITY_FLOAT_FIELD:getValue(self.abilityBehavior.ability)
@@ -54,7 +61,7 @@ __TS__SetDescriptor(
54
61
  true
55
62
  )
56
63
  __TS__SetDescriptor(
57
- ____class_0.prototype,
64
+ ____class_2.prototype,
58
65
  "speed",
59
66
  {get = function(self)
60
67
  return MISSILE_SPEED_ABILITY_INTEGER_FIELD:getValue(self.abilityBehavior.ability)
@@ -65,8 +72,21 @@ ____exports.AbilityBehavior = __TS__Class()
65
72
  local AbilityBehavior = ____exports.AbilityBehavior
66
73
  AbilityBehavior.name = "AbilityBehavior"
67
74
  __TS__ClassExtends(AbilityBehavior, Behavior)
68
- function AbilityBehavior.prototype.____constructor(self, ability)
75
+ function AbilityBehavior.prototype.____constructor(self, ability, parameters)
69
76
  Behavior.prototype.____constructor(self, ability)
77
+ if parameters and parameters.isExclusiveOnImpactHandler then
78
+ exclusiveOnImpactHandlerAbilityBehaviorByAbility[ability] = self
79
+ end
80
+ end
81
+ function AbilityBehavior.prototype.registerCommandEvent(self, orderTypeStringId)
82
+ if orderTypeStringId == nil then
83
+ orderTypeStringId = self.ability.orderTypeStringId
84
+ end
85
+ local commandEventId = (tostring(self.ability.typeId) .. "#") .. orderTypeStringId
86
+ if not (registeredCommandEventIds[commandEventId] ~= nil) then
87
+ registeredCommandEventIds[commandEventId] = true
88
+ Unit.abilityCommandEvent[self.ability.typeId][orderTypeStringId]:addListener(createUnitEventListener("onCommand"))
89
+ end
70
90
  end
71
91
  function AbilityBehavior.prototype.resolveCurrentAbilityDependentValue(self, value)
72
92
  return resolveCurrentAbilityDependentValue(self.ability, value)
@@ -104,22 +124,14 @@ function AbilityBehavior.prototype.flashSpecialEffect(self, xOrWidget, yOrDurati
104
124
  )
105
125
  end
106
126
  end
107
- function AbilityBehavior.prototype.launchMissile(self, source, target, ...)
108
- Missile:launch(
109
- self.missileLaunchConfig,
110
- source,
111
- target,
112
- invokeOnMissileArrival,
113
- self,
114
- ...
115
- )
116
- end
117
127
  function AbilityBehavior.prototype.onMissileArrival(self, ...)
118
128
  end
119
129
  function AbilityBehavior.prototype.onUnitGainAbility(self, _unit)
120
130
  end
121
131
  function AbilityBehavior.prototype.onUnitLoseAbility(self, _unit)
122
132
  end
133
+ function AbilityBehavior.prototype.onCommand(self, caster, orderTypeStringId)
134
+ end
123
135
  function AbilityBehavior.prototype.onCastingStart(self, caster)
124
136
  end
125
137
  function AbilityBehavior.prototype.onCastingFinish(self, caster)
@@ -179,7 +191,7 @@ __TS__SetDescriptor(
179
191
  end},
180
192
  true
181
193
  )
182
- AbilityBehavior.MissileLaunchConfig = ____class_0
194
+ AbilityBehavior.MissileLaunchConfig = ____class_2
183
195
  __TS__SetDescriptor(
184
196
  AbilityBehavior.prototype,
185
197
  "missileLaunchConfig",
@@ -191,17 +203,6 @@ __TS__SetDescriptor(
191
203
  true
192
204
  );
193
205
  (function(self)
194
- local function createUnitEventListener(key)
195
- return function(unit, ability, ...)
196
- ____exports.AbilityBehavior:forAll(ability, key, unit, ...)
197
- end
198
- end
199
- local function createZeroTimerUnitEventListener(key)
200
- local unitEventListener = createUnitEventListener(key)
201
- return function(unit, ability, ...)
202
- Timer:run(unitEventListener, unit, ability, ...)
203
- end
204
- end
205
206
  Unit.abilityGainedEvent:addListener(createUnitEventListener("onUnitGainAbility"))
206
207
  Unit.abilityLostEvent:addListener(createUnitEventListener("onUnitLoseAbility"))
207
208
  Unit.abilityCastingStartEvent:addListener(createUnitEventListener("onCastingStart"))
package/engine/buff.d.ts CHANGED
@@ -8,6 +8,7 @@ import { BuffResistanceType } from "./object-data/auxiliary/buff-resistance-type
8
8
  import { AbilityBooleanField, AbilityBooleanLevelField, AbilityCombatClassificationsLevelField, AbilityDependentValue, AbilityEnumLevelField, AbilityIntegerField, AbilityIntegerLevelField, AbilityNumberField, AbilityNumberLevelField } from "./object-field/ability";
9
9
  import { CombatClassifications } from "./object-data/auxiliary/combat-classification";
10
10
  import { IsExactlyAny, Prohibit, ReadonlyNonEmptyArray } from "../utility/types";
11
+ import { EffectParameters } from "../core/types/effect";
11
12
  import { UnitBehavior } from "./behaviour/unit";
12
13
  import type { Widget } from "../core/types/widget";
13
14
  import { Destructor } from "../destroyable";
@@ -250,8 +251,12 @@ export declare class Buff<AdditionalParameters extends Prohibit<Record<string, a
250
251
  get duration(): number;
251
252
  get remainingDuration(): number;
252
253
  set remainingDuration(remainingDuration: number);
253
- flashEffect(...parameters: [...widget: [] | [Widget], ...duration: [] | [number]]): void;
254
+ flashEffect(...parameters: [
255
+ ...widgetOrXY: [] | [Widget] | [x: number, x: number],
256
+ ...parametersOrDuration: [] | [EffectParameters] | [number]
257
+ ]): void;
254
258
  flashSpecialEffect(...parameters: [...widget: [] | [Widget], ...duration: [] | [number]]): void;
259
+ protected onCreate(): void;
255
260
  protected onDestroy(): Destructor;
256
261
  static apply<T extends Buff<any>, Args extends any[]>(this: BuffConstructor<T, Args>, ...args: Args): T | undefined;
257
262
  static getByTypeId<T extends Buff<any>, Args extends any[]>(this: BuffConstructor<T, Args>, unit: Unit, typeId: ApplicableBuffTypeId): T | undefined;
package/engine/buff.lua CHANGED
@@ -46,6 +46,10 @@ local ____arrays = require("utility.arrays")
46
46
  local forEach = ____arrays.forEach
47
47
  local ____ability_2Dduration = require("engine.internal.mechanics.ability-duration")
48
48
  local getAbilityDuration = ____ability_2Dduration.getAbilityDuration
49
+ local ____item = require("engine.internal.item")
50
+ local Item = ____item.Item
51
+ local ____destructable = require("core.types.destructable")
52
+ local Destructable = ____destructable.Destructable
49
53
  local getUnitAbility = BlzGetUnitAbility
50
54
  local stringValueByBuffTypeIdByFieldId = postcompile(function()
51
55
  local stringValueByBuffTypeIdByFieldId = {}
@@ -482,6 +486,7 @@ function Buff.prototype.____constructor(self, _unit, typeIdOrTypeIds, polarityOr
482
486
  timer:start(duration, false, expireBuff, self)
483
487
  self._timer = timer
484
488
  end
489
+ self:onCreate()
485
490
  end
486
491
  function Buff.prototype.getUnitBonus(self, bonusType)
487
492
  local ____opt_36 = self._bonusIdByBonusType
@@ -496,26 +501,30 @@ function Buff.prototype.addOrUpdateOrRemoveUnitBonus(self, bonusType, value)
496
501
  end
497
502
  bonusIdByBonusType[bonusType] = addOrUpdateOrRemoveUnitBonus(self._unit, bonusType, bonusIdByBonusType[bonusType], value)
498
503
  end
499
- function Buff.prototype.flashEffect(self, widgetOrDuration, duration)
500
- local isWidgetProvided = type(widgetOrDuration) == "table"
501
- local ____Effect_40 = Effect
502
- local ____Effect_flash_41 = Effect.flash
503
- local ____array_39 = __TS__SparseArrayNew(
504
- self[104],
505
- isWidgetProvided and widgetOrDuration or self._unit,
506
- stringValueByBuffTypeIdByFieldId[fourCC("feft")][self.typeId] or "origin"
507
- )
508
- local ____isWidgetProvided_38
509
- if isWidgetProvided then
510
- ____isWidgetProvided_38 = duration
504
+ function Buff.prototype.flashEffect(self, widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
505
+ if type(widgetOrXOrParametersOrDuration) == "number" and type(yOrParametersOrDuration) == "number" then
506
+ Effect:flash(self[104], widgetOrXOrParametersOrDuration, yOrParametersOrDuration, parametersOrDuration)
511
507
  else
512
- ____isWidgetProvided_38 = widgetOrDuration
508
+ local isWidgetProvided = __TS__InstanceOf(widgetOrXOrParametersOrDuration, Unit) or __TS__InstanceOf(widgetOrXOrParametersOrDuration, Item) or __TS__InstanceOf(widgetOrXOrParametersOrDuration, Destructable)
509
+ local ____Effect_40 = Effect
510
+ local ____Effect_flash_41 = Effect.flash
511
+ local ____array_39 = __TS__SparseArrayNew(
512
+ self[104],
513
+ isWidgetProvided and widgetOrXOrParametersOrDuration or self._unit,
514
+ stringValueByBuffTypeIdByFieldId[fourCC("feft")][self.typeId] or "origin"
515
+ )
516
+ local ____isWidgetProvided_38
517
+ if isWidgetProvided then
518
+ ____isWidgetProvided_38 = yOrParametersOrDuration
519
+ else
520
+ ____isWidgetProvided_38 = widgetOrXOrParametersOrDuration
521
+ end
522
+ __TS__SparseArrayPush(____array_39, ____isWidgetProvided_38)
523
+ ____Effect_flash_41(
524
+ ____Effect_40,
525
+ __TS__SparseArraySpread(____array_39)
526
+ )
513
527
  end
514
- __TS__SparseArrayPush(____array_39, ____isWidgetProvided_38)
515
- ____Effect_flash_41(
516
- ____Effect_40,
517
- __TS__SparseArraySpread(____array_39)
518
- )
519
528
  end
520
529
  function Buff.prototype.flashSpecialEffect(self, widgetOrDuration, duration)
521
530
  local isWidgetProvided = type(widgetOrDuration) == "table"
@@ -538,6 +547,8 @@ function Buff.prototype.flashSpecialEffect(self, widgetOrDuration, duration)
538
547
  __TS__SparseArraySpread(____array_43)
539
548
  )
540
549
  end
550
+ function Buff.prototype.onCreate(self)
551
+ end
541
552
  function Buff.prototype.onDestroy(self)
542
553
  local unit = self._unit
543
554
  if getUnitAbility(unit.handle, self.typeId) == self.handle then
@@ -12,7 +12,8 @@ export declare abstract class Ability extends Handle<jability> {
12
12
  protected constructor(handle: jability, typeId: number);
13
13
  toString(): string;
14
14
  get parentTypeId(): number;
15
- get orderId(): number;
15
+ get orderTypeStringId(): string;
16
+ get orderTypeId(): number;
16
17
  abstract readonly owner: Unit | Item;
17
18
  getSnapshot(): AbilitySnapshot;
18
19
  hasField(field: jabilityfield | number): boolean;
@@ -296,10 +296,18 @@ __TS__SetDescriptor(
296
296
  )
297
297
  __TS__SetDescriptor(
298
298
  Ability.prototype,
299
- "orderId",
299
+ "orderTypeStringId",
300
300
  {get = function(self)
301
301
  local field = orderIdFieldByParentTypeId[self.parentTypeId]
302
- return order2orderId(field ~= nil and getAbilityStringLevelField(self.handle, ABILITY_SLF_BASE_ORDER_ID_NCL6, self.level) or (orders[self.parentTypeId] or ""))
302
+ return field ~= nil and getAbilityStringLevelField(self.handle, field, self.level) or (orders[self.parentTypeId] or "")
303
+ end},
304
+ true
305
+ )
306
+ __TS__SetDescriptor(
307
+ Ability.prototype,
308
+ "orderTypeId",
309
+ {get = function(self)
310
+ return order2orderId(self.orderTypeStringId)
303
311
  end},
304
312
  true
305
313
  )
@@ -3,7 +3,7 @@ import { Ability } from "../ability";
3
3
  import { Destructable } from "../../../core/types/destructable";
4
4
  import { Item } from "../item";
5
5
  import { Widget } from "../../../core/types/widget";
6
- import { DispatchingEvent } from "../../../event";
6
+ import { DispatchingEvent, Event } from "../../../event";
7
7
  declare module "../unit" {
8
8
  namespace Unit {
9
9
  const abilityCastingStartEvent: DispatchingEvent<[Unit, Ability]>;
@@ -141,3 +141,12 @@ declare module "../unit" {
141
141
  const abilityStopEvent: DispatchingEvent<[Unit, Ability]>;
142
142
  }
143
143
  }
144
+ declare module "../unit" {
145
+ namespace Unit {
146
+ const abilityCommandEvent: {
147
+ readonly [abilityTypeId: number]: {
148
+ readonly [orderTypeStringId: string]: Event<[Unit, Ability, string]>;
149
+ };
150
+ };
151
+ }
152
+ }
@@ -15,8 +15,15 @@ local UnitTriggerEvent = ____unit.UnitTriggerEvent
15
15
  local ____event = require("event")
16
16
  local createDispatchingEvent = ____event.createDispatchingEvent
17
17
  local DependentInitializingEvent = ____event.DependentInitializingEvent
18
+ local Event = ____event.Event
19
+ local InitializingEvent = ____event.InitializingEvent
18
20
  local ____preconditions = require("utility.preconditions")
19
21
  local checkNotNull = ____preconditions.checkNotNull
22
+ local ____lazy = require("utility.lazy")
23
+ local lazyRecord = ____lazy.lazyRecord
24
+ local eventInvoke = Event.invoke
25
+ local condition = Condition
26
+ local createTrigger = CreateTrigger
20
27
  local getItemAbility = BlzGetItemAbility
21
28
  local getSpellAbility = GetSpellAbility
22
29
  local getSpellAbilityId = GetSpellAbilityId
@@ -26,11 +33,10 @@ local getSpellTargetUnit = GetSpellTargetUnit
26
33
  local getSpellTargetX = GetSpellTargetX
27
34
  local getSpellTargetY = GetSpellTargetY
28
35
  local getTriggerUnit = GetTriggerUnit
29
- local getUnitAbility = BlzGetUnitAbility
30
- local unitAddAbility = UnitAddAbility
36
+ local triggerAddCondition = TriggerAddCondition
37
+ local triggerRegisterCommandEvent = TriggerRegisterCommandEvent
31
38
  local unitInventorySize = UnitInventorySize
32
39
  local unitItemInSlot = UnitItemInSlot
33
- local unitRemoveAbility = UnitRemoveAbility
34
40
  local function retrieveAbility(unit, ability, abilityId)
35
41
  if ability == nil then
36
42
  return __TS__New(
@@ -39,17 +45,6 @@ local function retrieveAbility(unit, ability, abilityId)
39
45
  Unit:of(unit)
40
46
  )
41
47
  end
42
- if not unitAddAbility(unit, abilityId) then
43
- if getUnitAbility(unit, abilityId) == ability then
44
- return UnitAbility:of(
45
- ability,
46
- abilityId,
47
- Unit:of(unit)
48
- )
49
- end
50
- else
51
- unitRemoveAbility(unit, abilityId)
52
- end
53
48
  for i = 0, unitInventorySize(unit) - 1 do
54
49
  local item = unitItemInSlot(unit, i)
55
50
  if getItemAbility(item, abilityId) == ability then
@@ -366,4 +361,31 @@ rawset(
366
361
  extractAbilityTypeId
367
362
  )
368
363
  )
364
+ rawset(
365
+ Unit,
366
+ "abilityCommandEvent",
367
+ lazyRecord(function(abilityTypeId)
368
+ return lazyRecord(function(orderTypeStringId)
369
+ return __TS__New(
370
+ InitializingEvent,
371
+ function(event)
372
+ local trigger = createTrigger()
373
+ triggerRegisterCommandEvent(trigger, abilityTypeId, orderTypeStringId)
374
+ triggerAddCondition(
375
+ trigger,
376
+ condition(function()
377
+ local unit = Unit:of(getTriggerUnit())
378
+ if unit ~= nil then
379
+ local ability = unit:getAbilityById(abilityTypeId)
380
+ if ability ~= nil then
381
+ eventInvoke(event, unit, ability, orderTypeStringId)
382
+ end
383
+ end
384
+ end)
385
+ )
386
+ end
387
+ )
388
+ end)
389
+ end)
390
+ )
369
391
  return ____exports
@@ -11,6 +11,7 @@ export interface UnitItems extends ReadonlyArray<Item | undefined> {
11
11
  }
12
12
  export declare class UnitItems {
13
13
  constructor(handle: junit);
14
+ findSlot(item: Item): 0 | 1 | 2 | 3 | 4 | 5 | undefined;
14
15
  protected __newindex(slot: number, item: Item | undefined): void;
15
16
  protected __index(key: string | number): unknown;
16
17
  protected __len(): number;
@@ -30,6 +30,16 @@ UnitItems.name = "UnitItems"
30
30
  function UnitItems.prototype.____constructor(self, handle)
31
31
  handleByUnitItems[self] = handle
32
32
  end
33
+ function UnitItems.prototype.findSlot(self, item)
34
+ local handle = handleByUnitItems[self]
35
+ local itemHandle = item.handle
36
+ for slot = 0, unitInventorySize(handle) - 1 do
37
+ if itemHandle == unitItemInSlot(handle, slot) then
38
+ return slot
39
+ end
40
+ end
41
+ return nil
42
+ end
33
43
  function UnitItems.prototype.__newindex(self, slot, item)
34
44
  local handle = handleByUnitItems[self]
35
45
  if slot < 1 or slot > unitInventorySize(handle) then
@@ -1,5 +1,11 @@
1
1
  /** @noSelfInFile */
2
2
  import { Player } from "../../../core/types/player";
3
+ import { Event } from "../../../event";
4
+ declare module "../unit" {
5
+ namespace Unit {
6
+ const mainSelectedUnitChangeEvent: Event<[Player]>;
7
+ }
8
+ }
3
9
  declare module "../unit" {
4
10
  namespace Unit {
5
11
  const getMainSelectedOf: (player: Player) => Unit | undefined;
@@ -1,3 +1,5 @@
1
+ local ____lualib = require("lualib_bundle")
2
+ local __TS__New = ____lualib.__TS__New
1
3
  local ____exports = {}
2
4
  local ____player = require("core.types.player")
3
5
  local Player = ____player.Player
@@ -8,6 +10,10 @@ local ____local_2Dclient = require("engine.local-client")
8
10
  local LocalClient = ____local_2Dclient.LocalClient
9
11
  local ____unit = require("engine.internal.unit")
10
12
  local Unit = ____unit.Unit
13
+ local ____event = require("event")
14
+ local Event = ____event.Event
15
+ local mainSelectedUnitChangeEvent = __TS__New(Event)
16
+ rawset(Unit, "mainSelectedUnitChangeEvent", mainSelectedUnitChangeEvent)
11
17
  local mainSelectedUnitByPlayer = {}
12
18
  local syncSlider = BlzCreateFrameByType(
13
19
  "SLIDER",
@@ -27,7 +33,12 @@ BlzTriggerRegisterFrameEvent(trg, syncSlider, FRAMEEVENT_SLIDER_VALUE_CHANGED)
27
33
  TriggerAddAction(
28
34
  trg,
29
35
  function()
30
- mainSelectedUnitByPlayer[Player:of(GetTriggerPlayer())] = Unit:getBySyncId(BlzGetTriggerFrameValue())
36
+ local player = Player:of(GetTriggerPlayer())
37
+ local mainSelectedUnit = Unit:getBySyncId(BlzGetTriggerFrameValue())
38
+ if mainSelectedUnit ~= mainSelectedUnitByPlayer[player] then
39
+ mainSelectedUnitByPlayer[player] = mainSelectedUnit
40
+ Event.invoke(mainSelectedUnitChangeEvent, player)
41
+ end
31
42
  end
32
43
  )
33
44
  rawset(
@@ -332,6 +332,12 @@ export declare class Unit extends Handle<junit> {
332
332
  static itemPickedUpEvent: UnitTriggerEvent<[Item]>;
333
333
  static itemUsedEvent: UnitTriggerEvent<[Item]>;
334
334
  static itemStackedEvent: UnitTriggerEvent<[Item]>;
335
+ static get itemMovedEvent(): Event<[
336
+ unit: Unit,
337
+ item: Item,
338
+ slotFrom: 0 | 1 | 2 | 3 | 4 | 5,
339
+ slotTo: 0 | 1 | 2 | 3 | 4 | 5
340
+ ]>;
335
341
  static get onCreate(): EventDispatcher<[Unit], [Unit]>;
336
342
  static get destroyEvent(): EventDispatcher<[Unit], [Unit]>;
337
343
  getField(field: junitintegerfield | junitrealfield): number;
@@ -562,17 +562,6 @@ local function retrieveAbility(unit, ability, abilityId)
562
562
  ____exports.Unit:of(unit)
563
563
  )
564
564
  end
565
- if not unitAddAbility(unit, abilityId) then
566
- if getUnitAbility(unit, abilityId) == ability then
567
- return UnitAbility:of(
568
- ability,
569
- abilityId,
570
- ____exports.Unit:of(unit)
571
- )
572
- end
573
- else
574
- unitRemoveAbility(unit, abilityId)
575
- end
576
565
  for i = 0, unitInventorySize(unit) - 1 do
577
566
  local item = unitItemInSlot(unit, i)
578
567
  if getItemAbility(item, abilityId) == ability then
@@ -2547,6 +2536,30 @@ Unit.itemStackedEvent = __TS__New(
2547
2536
  EVENT_PLAYER_UNIT_STACK_ITEM,
2548
2537
  function() return ____exports.Unit:of(getTriggerUnit()), Item:of(getManipulatedItem()) end
2549
2538
  )
2539
+ __TS__ObjectDefineProperty(
2540
+ Unit,
2541
+ "itemMovedEvent",
2542
+ {get = function(self)
2543
+ local event = __TS__New(Event)
2544
+ for order = orderId("moveslot0"), orderId("moveslot5") do
2545
+ local slotTo = order - orderId("moveslot0")
2546
+ self.onTargetOrder[order]:addListener(function(unit, item)
2547
+ local slotFrom = unit.items:findSlot(item)
2548
+ if slotFrom ~= nil then
2549
+ invoke(
2550
+ event,
2551
+ unit,
2552
+ item,
2553
+ slotFrom,
2554
+ slotTo
2555
+ )
2556
+ end
2557
+ end)
2558
+ end
2559
+ rawset(self, "itemMovedEvent", event)
2560
+ return event
2561
+ end}
2562
+ )
2550
2563
  __TS__ObjectDefineProperty(
2551
2564
  Unit,
2552
2565
  "onCreate",
@@ -4,5 +4,9 @@ export declare const enum SoundPresetName {
4
4
  ABOMINATION_PISSED = "AbominationPissed",
5
5
  ABOMINATION_READY = "AbominationReady",
6
6
  ABOMINATION_WAR_CRY = "AbominationWarcry",
7
- AXE_MEDIUM_CHOP_WOOD = "AxeMediumChopWood"
7
+ AXE_MEDIUM_CHOP_WOOD = "AxeMediumChopWood",
8
+ IMPALE = "Impale",
9
+ IMPALE_HIT = "ImpaleHit",
10
+ IMPALE_LAND = "ImpaleLand",
11
+ IMPALE_CAST = "ImpaleCast"
8
12
  }
@@ -130,5 +130,5 @@ export declare class AbilityCombatClassificationsLevelField extends AbilityLevel
130
130
  protected getNativeFieldValue(instance: Ability, level: number): CombatClassifications;
131
131
  protected setNativeFieldValue(instance: Ability, level: number, value: CombatClassifications): boolean;
132
132
  }
133
- export type AbilityDependentValue<ValueType extends boolean | number | string> = ValueType | AbilityField<ValueType> | AbilityLevelField<ValueType> | ((ability: Ability) => ValueType);
134
- export declare const resolveCurrentAbilityDependentValue: <ValueType extends boolean | number | string>(ability: Ability, value: AbilityDependentValue<ValueType>) => ValueType;
133
+ export type AbilityDependentValue<ValueType extends boolean | number | string | undefined> = ValueType | AbilityField<NonNullable<ValueType>> | AbilityLevelField<NonNullable<ValueType>> | ((ability: Ability) => ValueType);
134
+ export declare const resolveCurrentAbilityDependentValue: <ValueType extends boolean | number | string | undefined>(ability: Ability, value: AbilityDependentValue<ValueType>) => ValueType;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package",
3
3
  "name": "warscript",
4
- "version": "0.0.1-dev.d1328b7",
4
+ "version": "0.0.1-dev.d18f377",
5
5
  "description": "A typescript library for Warcraft III using Warpack.",
6
6
  "keywords": [
7
7
  "warcraft",
@@ -32,7 +32,10 @@ export declare const flatMapToLuaSet: {
32
32
  };
33
33
  export declare const mapIndexed: <T, R>(array: readonly T[], transform: (index: number, value: T) => R) => R[];
34
34
  export declare const associate: <T, K extends AnyNotNil, V>(array: readonly T[], keySelector: (value: T) => K, valueSelector: (value: T) => V) => LuaMap<K, V>;
35
- export declare const associateBy: <K extends AnyNotNil, V>(array: readonly V[], keySelector: (value: V) => K) => LuaMap<K, V>;
35
+ export declare const associateBy: {
36
+ <K extends AnyNotNil, V>(array: readonly V[], keySelector: (value: V) => K): LuaMap<K, V>;
37
+ <K extends KeysOfType<V, AnyNotNil>, V>(array: readonly V[], keySelector: K): LuaMap<V[K] extends AnyNotNil ? V[K] : never, V>;
38
+ };
36
39
  export declare const associateByIndexed: <K extends AnyNotNil, V>(array: readonly V[], keySelector: (index: number, value: V) => K) => LuaMap<K, V>;
37
40
  export declare const associateWith: <K extends AnyNotNil, V>(array: readonly K[], valueSelector: (value: K) => V) => LuaMap<K, V>;
38
41
  export declare const associateWithIndexed: <K extends AnyNotNil, V>(array: readonly K[], valueSelector: (index: number, value: K) => V) => LuaMap<K, V>;
@@ -41,6 +44,10 @@ export declare const average: (array: readonly number[]) => number;
41
44
  export declare const sum: (array: readonly number[]) => number;
42
45
  export declare const product: (array: readonly number[]) => number;
43
46
  export declare const max: (array: readonly number[]) => number;
47
+ export declare const maxBy: {
48
+ <T, Args extends any[]>(array: readonly T[], selector: (value: T, ...args: Args) => number, ...args: Args): T | undefined;
49
+ <T, K extends KeysOfType<T, number>>(array: readonly T[], key: K): T | undefined;
50
+ };
44
51
  export declare const intersperse: <T>(array: readonly T[], delimiter: T) => T[];
45
52
  export declare const zip: <T, R, V>(array: readonly T[], otherArray: readonly R[], transform: (value: T, otherValue: R) => V) => V[];
46
53
  export declare const chunked: <T>(array: readonly T[], size: number) => T[][];
@@ -178,9 +178,16 @@ ____exports.associate = function(array, keySelector, valueSelector)
178
178
  end
179
179
  ____exports.associateBy = function(array, keySelector)
180
180
  local result = {}
181
- for i = 1, #array do
182
- local value = array[i]
183
- result[keySelector(value)] = value
181
+ if type(keySelector) == "function" then
182
+ for i = 1, #array do
183
+ local value = array[i]
184
+ result[keySelector(value)] = value
185
+ end
186
+ else
187
+ for i = 1, #array do
188
+ local value = array[i]
189
+ result[value[keySelector]] = value
190
+ end
184
191
  end
185
192
  return result
186
193
  end
@@ -251,6 +258,30 @@ ____exports.max = function(array)
251
258
  end
252
259
  return mathMax(table.unpack(array))
253
260
  end
261
+ ____exports.maxBy = function(array, selector, ...)
262
+ local result = nil
263
+ local maxValue = -math.huge
264
+ if type(selector) == "function" then
265
+ for i = 1, #array do
266
+ local element = array[i]
267
+ local value = selector(element, ...)
268
+ if value > maxValue then
269
+ result = element
270
+ maxValue = value
271
+ end
272
+ end
273
+ else
274
+ for i = 1, #array do
275
+ local element = array[i]
276
+ local value = element[selector]
277
+ if value > maxValue then
278
+ result = element
279
+ maxValue = value
280
+ end
281
+ end
282
+ end
283
+ return result
284
+ end
254
285
  ____exports.intersperse = function(array, delimiter)
255
286
  local result = {}
256
287
  local length = #array
@@ -0,0 +1,2 @@
1
+ /** @noSelfInFile */
2
+ export declare const lazyRecord: <K extends keyof any, V>(initializer: (key: K) => V) => Readonly<Record<K, V>>;
@@ -0,0 +1,14 @@
1
+ local ____exports = {}
2
+ local rawset = _G.rawset
3
+ local setmetatable = _G.setmetatable
4
+ ____exports.lazyRecord = function(initializer)
5
+ return setmetatable(
6
+ {},
7
+ {__index = function(self, key)
8
+ local value = initializer(key)
9
+ rawset(self, key, value)
10
+ return value
11
+ end}
12
+ )
13
+ end
14
+ return ____exports