warscript 0.0.1-dev.29630c5 → 0.0.1-dev.2ae9956

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.
@@ -33,4 +33,9 @@ export declare class ApplyBuffTargetAreaAbilityBehavior<T extends BuffConstructo
33
33
  onPointTargetImpact(caster: Unit, x: number, y: number): void;
34
34
  onWidgetTargetImpact(caster: Unit, target: Widget): void;
35
35
  }
36
+ export declare class ApplyBuffChannelingTargetAbilityBehavior<T extends BuffConstructor = typeof Buff> extends ApplyBuffAbilityBehavior<T> {
37
+ private buff?;
38
+ onUnitTargetChannelingStart(caster: Unit, target: Unit): void;
39
+ onStop(): void;
40
+ }
36
41
  export {};
@@ -123,4 +123,36 @@ function ApplyBuffTargetAreaAbilityBehavior.prototype.onWidgetTargetImpact(self,
123
123
  self.applyBuff(unit)
124
124
  end
125
125
  end
126
+ local behaviorByBuff = {}
127
+ ____exports.ApplyBuffChannelingTargetAbilityBehavior = __TS__Class()
128
+ local ApplyBuffChannelingTargetAbilityBehavior = ____exports.ApplyBuffChannelingTargetAbilityBehavior
129
+ ApplyBuffChannelingTargetAbilityBehavior.name = "ApplyBuffChannelingTargetAbilityBehavior"
130
+ __TS__ClassExtends(ApplyBuffChannelingTargetAbilityBehavior, ____exports.ApplyBuffAbilityBehavior)
131
+ function ApplyBuffChannelingTargetAbilityBehavior.prototype.onUnitTargetChannelingStart(self, caster, target)
132
+ local previousBuff = self.buff
133
+ if previousBuff ~= nil then
134
+ behaviorByBuff[previousBuff] = nil
135
+ previousBuff:destroy()
136
+ end
137
+ local buff = self.applyBuff(target)
138
+ if buff ~= nil then
139
+ behaviorByBuff[buff] = self
140
+ end
141
+ self.buff = buff
142
+ end
143
+ function ApplyBuffChannelingTargetAbilityBehavior.prototype.onStop(self)
144
+ local buff = self.buff
145
+ if buff ~= nil then
146
+ behaviorByBuff[buff] = nil
147
+ buff:destroy()
148
+ self.buff = nil
149
+ end
150
+ end
151
+ Buff.destroyEvent:addListener(function(buff)
152
+ local behavior = behaviorByBuff[buff]
153
+ if behavior ~= nil then
154
+ behaviorByBuff[buff] = nil
155
+ behavior.ability:interruptCast()
156
+ end
157
+ end)
126
158
  return ____exports
@@ -24,8 +24,8 @@ export declare abstract class AbilityBehavior<Parameters extends {
24
24
  get ability(): Ability;
25
25
  protected resolveCurrentAbilityDependentValue<T extends boolean | number | string>(value: AbilityDependentValue<T>): T;
26
26
  protected resolveCurrentAbilityDependentValue<T extends boolean | number | string>(value?: AbilityDependentValue<T>): T | undefined;
27
- protected flashCasterEffect(widget: Widget): void;
28
- protected flashTargetEffect(widget: Widget): void;
27
+ protected flashCasterEffect(widget: Widget, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
28
+ protected flashTargetEffect(widget: Widget, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
29
29
  protected flashAreaEffect(x: number, y: number, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
30
30
  protected flashEffect(x: number, y: number, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
31
31
  protected flashSpecialEffect(...args: [...pointOrWidget: [x: number, y: number] | [widget: Widget], duration?: number]): void;
@@ -114,20 +114,22 @@ end
114
114
  function AbilityBehavior.prototype.resolveCurrentAbilityDependentValue(self, value)
115
115
  return resolveCurrentAbilityDependentValue(self.ability, value)
116
116
  end
117
- function AbilityBehavior.prototype.flashCasterEffect(self, widget)
117
+ function AbilityBehavior.prototype.flashCasterEffect(self, widget, ...)
118
118
  local attachmentPoint = CASTER_EFFECT_FIRST_ATTACHMENT_POINT_STRING_FIELD:getValue(self.ability)
119
119
  Effect:flash(
120
120
  CASTER_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD:getValue(self.ability, 0),
121
121
  widget,
122
- attachmentPoint ~= "" and attachmentPoint or "origin"
122
+ attachmentPoint ~= "" and attachmentPoint or "origin",
123
+ ...
123
124
  )
124
125
  end
125
- function AbilityBehavior.prototype.flashTargetEffect(self, widget)
126
+ function AbilityBehavior.prototype.flashTargetEffect(self, widget, ...)
126
127
  local attachmentPoint = TARGET_EFFECT_FIRST_ATTACHMENT_POINT_STRING_FIELD:getValue(self.ability)
127
128
  Effect:flash(
128
129
  TARGET_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD:getValue(self.ability, 0),
129
130
  widget,
130
- attachmentPoint ~= "" and attachmentPoint or "origin"
131
+ attachmentPoint ~= "" and attachmentPoint or "origin",
132
+ ...
131
133
  )
132
134
  end
133
135
  function AbilityBehavior.prototype.flashAreaEffect(self, x, y, ...)
@@ -155,10 +157,11 @@ function AbilityBehavior.prototype.flashSpecialEffect(self, xOrWidget, yOrDurati
155
157
  duration
156
158
  )
157
159
  else
160
+ local attachmentPoint = SPECIAL_EFFECT_ATTACHMENT_POINT_STRING_FIELD:getValue(self.ability)
158
161
  Effect:flash(
159
162
  SPECIAL_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD:getValue(self.ability, 0),
160
163
  xOrWidget,
161
- SPECIAL_EFFECT_ATTACHMENT_POINT_STRING_FIELD:getValue(self.ability),
164
+ attachmentPoint ~= "" and attachmentPoint or "origin",
162
165
  yOrDuration
163
166
  )
164
167
  end
package/engine/buff.d.ts CHANGED
@@ -12,6 +12,7 @@ import { EffectParameters } from "../core/types/effect";
12
12
  import { UnitBehavior } from "./behaviour/unit";
13
13
  import type { Widget } from "../core/types/widget";
14
14
  import { Destructor } from "../destroyable";
15
+ import { Event } from "../event";
15
16
  export type BuffConstructor<T extends Buff<any> = Buff<any>, Args extends any[] = any> = OmitConstructor<typeof Buff<any>> & (new (...args: Args) => T);
16
17
  type EnumParameterValueType<T extends number> = T | AbilityEnumLevelField<T>;
17
18
  type NumberParameterValueType = number | AbilityNumberField | AbilityNumberLevelField;
@@ -267,5 +268,6 @@ export declare class Buff<AdditionalParameters extends Prohibit<Record<string, a
267
268
  onDeath(source: Unit | undefined): void;
268
269
  onDamageDealt(target: Unit, event: DamageEvent): void;
269
270
  onDamageReceived(source: Unit | undefined, event: DamageEvent): void;
271
+ static readonly destroyEvent: Event<[Buff<object>]>;
270
272
  }
271
273
  export {};
package/engine/buff.lua CHANGED
@@ -44,6 +44,8 @@ local ____unit = require("engine.behaviour.unit")
44
44
  local UnitBehavior = ____unit.UnitBehavior
45
45
  local ____arrays = require("utility.arrays")
46
46
  local forEach = ____arrays.forEach
47
+ local ____event = require("event")
48
+ local Event = ____event.Event
47
49
  local ____ability_2Dduration = require("engine.internal.mechanics.ability-duration")
48
50
  local getAbilityDuration = ____ability_2Dduration.getAbilityDuration
49
51
  local ____item = require("engine.internal.item")
@@ -298,6 +300,7 @@ buffHealingIntervalTimerCallback = function(buff)
298
300
  source:healTarget(buff[100], healingPerInterval)
299
301
  end
300
302
  end
303
+ local buffDestroyEvent = __TS__New(Event)
301
304
  ____exports.Buff = __TS__Class()
302
305
  local Buff = ____exports.Buff
303
306
  Buff.name = "Buff"
@@ -594,6 +597,7 @@ function Buff.prototype.onDestroy(self)
594
597
  removeUnitBonus(unit, bonusType, bonusId)
595
598
  end
596
599
  end
600
+ Event.invoke(buffDestroyEvent, self)
597
601
  return UnitBehavior.prototype.onDestroy(self)
598
602
  end
599
603
  function Buff.apply(self, ...)
@@ -1236,7 +1240,8 @@ __TS__SetDescriptor(
1236
1240
  end
1237
1241
  },
1238
1242
  true
1239
- );
1243
+ )
1244
+ Buff.destroyEvent = buffDestroyEvent;
1240
1245
  (function(self)
1241
1246
  local function destroyBuffIfNeeded(buff)
1242
1247
  if getUnitAbility(buff[100].handle, buff.typeId) ~= buff.handle then
@@ -78,9 +78,9 @@ export declare class Item extends Handle<jitem> {
78
78
  hasAbility(abilityTypeId: AbilityTypeId): boolean;
79
79
  getAbility(abilityTypeId: AbilityTypeId): ItemAbility | undefined;
80
80
  get abilities(): readonly ItemAbility[];
81
- static getInRange(pos: Vec2, range: number): Item[];
81
+ static getInRange(x: number, y: number, range: number): Item[];
82
82
  static getInRect(rect: ReadonlyRect): Item[];
83
83
  static get onCreate(): Event<[Item]>;
84
- static get onDestroy(): Event<[Item]>;
84
+ static get destroyEvent(): Event<[Item]>;
85
85
  }
86
86
  export {};
@@ -15,6 +15,12 @@ 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 ____dummy_2Ditem = require("engine.internal.object-data.dummy-item")
19
+ local DUMMY_ITEM_ID = ____dummy_2Ditem.DUMMY_ITEM_ID
20
+ local ____add_2Ditem_2Dto_2Dslot = require("engine.internal.unit.add-item-to-slot")
21
+ local SLOT_FILLER_ITEM_TYPE_ID = ____add_2Ditem_2Dto_2Dslot.SLOT_FILLER_ITEM_TYPE_ID
22
+ local ____vec2 = require("math.vec2")
23
+ local distance = ____vec2.distance
18
24
  local itemAddAbility = BlzItemAddAbility
19
25
  local itemRemoveAbility = BlzItemRemoveAbility
20
26
  local getItemAbility = BlzGetItemAbility
@@ -24,6 +30,12 @@ local getAbilityId = BlzGetAbilityId
24
30
  local getWidgetLife = GetWidgetLife
25
31
  local removeItem = RemoveItem
26
32
  local getHandleId = GetHandleId
33
+ local setRect = SetRect
34
+ local enumItemsInRect = EnumItemsInRect
35
+ local getEnumItem = GetEnumItem
36
+ local getItemTypeId = GetItemTypeId
37
+ local getItemX = GetItemX
38
+ local getItemY = GetItemY
27
39
  local getItemIntegerField = BlzGetItemIntegerField
28
40
  local setItemBooleanField = BlzSetItemBooleanField
29
41
  local getItemBooleanField = BlzGetItemBooleanField
@@ -53,6 +65,32 @@ local function getItemAbilities(handle, item)
53
65
  end
54
66
  return abilities
55
67
  end
68
+ local targetCollection
69
+ local targetCollectionNextIndex
70
+ local centerX
71
+ local centerY
72
+ local enumRange
73
+ local function collectIntoTarget()
74
+ local item = getEnumItem()
75
+ local typeId = getItemTypeId(item)
76
+ if typeId ~= DUMMY_ITEM_ID and typeId ~= SLOT_FILLER_ITEM_TYPE_ID then
77
+ targetCollection[targetCollectionNextIndex] = ____exports.Item:of(getEnumItem())
78
+ targetCollectionNextIndex = targetCollectionNextIndex + 1
79
+ end
80
+ end
81
+ local function collectIntoTargetRange()
82
+ local item = getEnumItem()
83
+ local typeId = getItemTypeId(item)
84
+ if distance(
85
+ getItemX(item),
86
+ getItemY(item),
87
+ centerX,
88
+ centerY
89
+ ) <= enumRange and typeId ~= DUMMY_ITEM_ID and typeId ~= SLOT_FILLER_ITEM_TYPE_ID then
90
+ targetCollection[targetCollectionNextIndex] = ____exports.Item:of(getEnumItem())
91
+ targetCollectionNextIndex = targetCollectionNextIndex + 1
92
+ end
93
+ end
56
94
  ____exports.Item = __TS__Class()
57
95
  local Item = ____exports.Item
58
96
  Item.name = "Item"
@@ -111,34 +149,27 @@ function Item.prototype.getAbility(self, abilityTypeId)
111
149
  local ability = self[101][abilityTypeId] ~= nil and doAbilityAction(self.handle, getItemAbility, abilityTypeId)
112
150
  return ability and ItemAbility:of(ability, abilityTypeId, self) or nil
113
151
  end
114
- function Item.getInRange(self, pos, range)
115
- local collection = {}
116
- SetRect(
152
+ function Item.getInRange(self, x, y, range)
153
+ targetCollection = {}
154
+ targetCollectionNextIndex = 1
155
+ centerX = x
156
+ centerY = y
157
+ enumRange = range
158
+ setRect(
117
159
  enumRect,
118
- pos.x - range,
119
- pos.y - range,
120
- pos.x + range,
121
- pos.y + range
160
+ x - range,
161
+ y - range,
162
+ x + range,
163
+ y + range
122
164
  )
123
- EnumItemsInRect(
124
- enumRect,
125
- nil,
126
- function()
127
- collection[#collection + 1] = self:of(GetEnumItem())
128
- end
129
- )
130
- return collection
165
+ enumItemsInRect(enumRect, nil, collectIntoTargetRange)
166
+ return targetCollection
131
167
  end
132
168
  function Item.getInRect(self, rect)
133
- local collection = {}
134
- EnumItemsInRect(
135
- rect.handle,
136
- nil,
137
- function()
138
- collection[#collection + 1] = self:of(GetEnumItem())
139
- end
140
- )
141
- return collection
169
+ targetCollection = {}
170
+ targetCollectionNextIndex = 1
171
+ enumItemsInRect(rect.handle, nil, collectIntoTarget)
172
+ return targetCollection
142
173
  end
143
174
  __TS__SetDescriptor(
144
175
  Item.prototype,
@@ -551,7 +582,7 @@ __TS__ObjectDefineProperty(
551
582
  )
552
583
  __TS__ObjectDefineProperty(
553
584
  Item,
554
- "onDestroy",
585
+ "destroyEvent",
555
586
  {get = function(self)
556
587
  return self.onDestroyEvent
557
588
  end}
@@ -9,7 +9,9 @@ local setItemVisible = SetItemVisible
9
9
  local unitAddItem = UnitAddItem
10
10
  local unitItemInSlot = UnitItemInSlot
11
11
  local unitRemoveItem = UnitRemoveItem
12
- local FILLER_ITEM_TYPE_ID = compiletime(function()
12
+ ---
13
+ -- @internal For use by internal systems only.
14
+ ____exports.SLOT_FILLER_ITEM_TYPE_ID = compiletime(function()
13
15
  local itemType = BlankItemType:create()
14
16
  itemType.name = "[Warscript/Dummy] Slot Filler"
15
17
  return itemType.id
@@ -19,7 +21,7 @@ end)
19
21
  ____exports.fillerItems = array(
20
22
  6,
21
23
  function()
22
- local item = CreateItem(FILLER_ITEM_TYPE_ID, 0, 0)
24
+ local item = CreateItem(____exports.SLOT_FILLER_ITEM_TYPE_ID, 0, 0)
23
25
  setItemVisible(item, false)
24
26
  ignoreEventsItems[item] = true
25
27
  return item
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.29630c5",
4
+ "version": "0.0.1-dev.2ae9956",
5
5
  "description": "A typescript library for Warcraft III using Warpack.",
6
6
  "keywords": [
7
7
  "warcraft",