warscript 0.0.1-dev.d5f6f38 → 0.0.1-dev.d63794c

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 (34) hide show
  1. package/core/types/effect.d.ts +1 -0
  2. package/core/types/effect.lua +82 -32
  3. package/core/util.d.ts +1 -1
  4. package/core/util.lua +6 -0
  5. package/engine/behaviour/ability/always-enabled.d.ts +7 -0
  6. package/engine/behaviour/ability/always-enabled.lua +31 -0
  7. package/engine/behaviour/ability/emulate-impact.d.ts +6 -0
  8. package/engine/behaviour/ability/emulate-impact.lua +29 -0
  9. package/engine/behaviour/ability/instant-impact.d.ts +2 -2
  10. package/engine/behaviour/ability/instant-impact.lua +4 -19
  11. package/engine/behaviour/ability/on-command-impact.d.ts +8 -0
  12. package/engine/behaviour/ability/on-command-impact.lua +18 -0
  13. package/engine/behaviour/ability/remove-buffs.d.ts +16 -0
  14. package/engine/behaviour/ability/remove-buffs.lua +28 -0
  15. package/engine/behaviour/ability.d.ts +9 -2
  16. package/engine/behaviour/ability.lua +47 -33
  17. package/engine/buff.lua +1 -1
  18. package/engine/internal/ability.d.ts +13 -2
  19. package/engine/internal/ability.lua +84 -4
  20. package/engine/internal/item/ability.lua +32 -0
  21. package/engine/internal/misc/ability-disable-counter.d.ts +2 -0
  22. package/engine/internal/misc/ability-disable-counter.lua +13 -0
  23. package/engine/internal/unit/ability.d.ts +10 -1
  24. package/engine/internal/unit/ability.lua +36 -0
  25. package/engine/internal/unit/item.lua +3 -8
  26. package/engine/internal/unit.d.ts +2 -1
  27. package/engine/internal/unit.lua +23 -2
  28. package/engine/internal/utility.lua +12 -0
  29. package/engine/object-field/ability.d.ts +4 -1
  30. package/engine/standard/fields/ability.d.ts +2 -0
  31. package/engine/standard/fields/ability.lua +2 -0
  32. package/package.json +1 -1
  33. package/utility/lazy.d.ts +2 -0
  34. package/utility/lazy.lua +14 -0
@@ -8,6 +8,7 @@ declare const enum EffectPropertyKey {
8
8
  ROLL = 102
9
9
  }
10
10
  export type EffectParameters = {
11
+ readonly delay?: number;
11
12
  readonly scale?: number;
12
13
  readonly color?: PlayerColor;
13
14
  readonly pitch?: number;
@@ -1,10 +1,10 @@
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
5
4
  local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
5
+ local __TS__InstanceOf = ____lualib.__TS__InstanceOf
6
6
  local ____exports = {}
7
- local dummyPlayer
7
+ local dummyPlayer, flash
8
8
  local ____handle = require("core.types.handle")
9
9
  local Handle = ____handle.Handle
10
10
  local ____playerColor = require("core.types.playerColor")
@@ -41,10 +41,10 @@ local function setSpecialEffectPitchDegrees(effect, pitch)
41
41
  -mathRad(pitch)
42
42
  )
43
43
  end
44
- local function setSpecialEffectRollDegrees(effect, pitch)
44
+ local function setSpecialEffectRollDegrees(effect, roll)
45
45
  setSpecialEffectRoll(
46
46
  effect,
47
- -mathRad(pitch)
47
+ -mathRad(roll)
48
48
  )
49
49
  end
50
50
  local animTypeByAnimationName = {
@@ -123,6 +123,13 @@ dummyPlayer = Player.neutralExtra
123
123
  local temporaryEffects = {}
124
124
  local temporaryEffectsDurations = {}
125
125
  local temporaryEffectsCount = 0
126
+ local delayedEffectsModelPath = {}
127
+ local delayedEffectsXOrWidget = {}
128
+ local delayedEffectsYOrAttachmentPoint = {}
129
+ local delayedEffectsDuration = {}
130
+ local delayedEffectsParameters = {}
131
+ local delayedEffectsDelay = {}
132
+ local delayedEffectsCount = 0
126
133
  local period = 1 / 32
127
134
  Timer.onPeriod[period]:addListener(function()
128
135
  local i = 1
@@ -131,12 +138,36 @@ Timer.onPeriod[period]:addListener(function()
131
138
  if duration <= 0 then
132
139
  destroyEffect(temporaryEffects[i])
133
140
  temporaryEffects[i] = temporaryEffects[temporaryEffectsCount]
141
+ temporaryEffectsDurations[i] = temporaryEffectsDurations[temporaryEffectsCount]
134
142
  temporaryEffectsCount = temporaryEffectsCount - 1
135
143
  else
136
144
  temporaryEffectsDurations[i] = duration - period
137
145
  i = i + 1
138
146
  end
139
147
  end
148
+ i = 1
149
+ while i <= delayedEffectsCount do
150
+ local delay = delayedEffectsDelay[i]
151
+ if delay <= 0 then
152
+ flash(
153
+ delayedEffectsModelPath[i],
154
+ delayedEffectsXOrWidget[i],
155
+ delayedEffectsYOrAttachmentPoint[i],
156
+ delayedEffectsDuration[i],
157
+ delayedEffectsParameters[i]
158
+ )
159
+ delayedEffectsModelPath[i] = delayedEffectsModelPath[delayedEffectsCount]
160
+ delayedEffectsXOrWidget[i] = delayedEffectsXOrWidget[delayedEffectsCount]
161
+ delayedEffectsYOrAttachmentPoint[i] = delayedEffectsYOrAttachmentPoint[delayedEffectsCount]
162
+ delayedEffectsDuration[i] = delayedEffectsDuration[delayedEffectsCount]
163
+ delayedEffectsParameters[i] = delayedEffectsParameters[delayedEffectsCount]
164
+ delayedEffectsDelay[i] = delayedEffectsDelay[delayedEffectsCount]
165
+ delayedEffectsCount = delayedEffectsCount - 1
166
+ else
167
+ delayedEffectsDelay[i] = delay - period
168
+ i = i + 1
169
+ end
170
+ end
140
171
  end)
141
172
  ____exports.Effect = __TS__Class()
142
173
  local Effect = ____exports.Effect
@@ -157,36 +188,23 @@ function Effect.flash(self, modelPath, xOrWidget, yOrOrAttachmentPoint, paramete
157
188
  parameters = parametersOrDuration
158
189
  parametersOrDuration = nil
159
190
  end
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
168
- if parameters ~= nil then
169
- for key, value in ____pairs(parameters) do
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
- )
181
- end
182
- end
183
- if parametersOrDuration ~= nil and parametersOrDuration > 0 then
184
- temporaryEffectsCount = temporaryEffectsCount + 1
185
- temporaryEffects[temporaryEffectsCount] = effect
186
- temporaryEffectsDurations[temporaryEffectsCount] = parametersOrDuration
191
+ if parameters and (parameters.delay or 0) > 0 then
192
+ delayedEffectsCount = delayedEffectsCount + 1
193
+ delayedEffectsModelPath[delayedEffectsCount] = modelPath
194
+ delayedEffectsXOrWidget[delayedEffectsCount] = xOrWidget
195
+ delayedEffectsYOrAttachmentPoint[delayedEffectsCount] = yOrOrAttachmentPoint
196
+ delayedEffectsDuration[delayedEffectsCount] = parametersOrDuration
197
+ delayedEffectsParameters[delayedEffectsCount] = parameters
198
+ delayedEffectsDelay[delayedEffectsCount] = parameters.delay
187
199
  return
188
200
  end
189
- destroyEffect(effect)
201
+ flash(
202
+ modelPath,
203
+ xOrWidget,
204
+ yOrOrAttachmentPoint,
205
+ parametersOrDuration,
206
+ parameters
207
+ )
190
208
  end
191
209
  function Effect.flashTarget(self, model, target, attachPoint, duration)
192
210
  local effect = addSpecialEffectTarget(model, target.handle, attachPoint)
@@ -255,4 +273,36 @@ __TS__SetDescriptor(
255
273
  },
256
274
  true
257
275
  )
276
+ flash = function(modelPath, xOrWidget, yOrOrAttachmentPoint, duration, parameters)
277
+ local coordinatesProvided = type(xOrWidget) == "number"
278
+ local isPositional = coordinatesProvided or (parameters and parameters.detached) == true
279
+ local x = not isPositional and 0 or (coordinatesProvided and xOrWidget or xOrWidget.x)
280
+ local y = not isPositional and 0 or (coordinatesProvided and yOrOrAttachmentPoint or xOrWidget.y)
281
+ local effect = isPositional and addSpecialEffect(modelPath, x, y) or addSpecialEffectTarget(modelPath, xOrWidget.handle, yOrOrAttachmentPoint or "origin")
282
+ if isPositional and not coordinatesProvided and (parameters and parameters.scale) == nil and __TS__InstanceOf(xOrWidget, Unit) then
283
+ setSpecialEffectScale(effect, xOrWidget.scale)
284
+ end
285
+ if parameters ~= nil then
286
+ for key, value in ____pairs(parameters) do
287
+ if key ~= "zOffset" and key ~= "detached" and key ~= "scaleZOffset" and key ~= "delay" then
288
+ setters[key](effect, value)
289
+ end
290
+ end
291
+ if isPositional and parameters.zOffset ~= nil then
292
+ moveLocation(location, x, y)
293
+ local z = __TS__InstanceOf(xOrWidget, Unit) and getLocationZ(location) + xOrWidget.flyHeight or getLocationZ(location)
294
+ BlzSetSpecialEffectZ(
295
+ effect,
296
+ z + parameters.zOffset * (parameters.scaleZOffset and getSpecialEffectScale(effect) or 1)
297
+ )
298
+ end
299
+ end
300
+ if duration ~= nil and duration > 0 then
301
+ temporaryEffectsCount = temporaryEffectsCount + 1
302
+ temporaryEffects[temporaryEffectsCount] = effect
303
+ temporaryEffectsDurations[temporaryEffectsCount] = duration
304
+ return
305
+ end
306
+ destroyEffect(effect)
307
+ end
258
308
  return ____exports
package/core/util.d.ts CHANGED
@@ -54,7 +54,7 @@ declare global {
54
54
  function fourCC(id: string): number;
55
55
  }
56
56
  declare namespace inner {
57
- const orderId: (id: "blink" | "stop" | "load" | "sleep" | "absorb" | "acidbomb" | "acolyteharvest" | "ambush" | "ancestralspirit" | "ancestralspirittarget" | "animatedead" | "antimagicshell" | "attack" | "attackground" | "attackonce" | "attributemodskill" | "auraunholy" | "auravampiric" | "autodispel" | "autodispeloff" | "autodispelon" | "autoentangle" | "autoentangleinstant" | "autoharvestgold" | "autoharvestlumber" | "avatar" | "avengerform" | "awaken" | "banish" | "barkskin" | "barkskinoff" | "barkskinon" | "battleroar" | "battlestations" | "bearform" | "berserk" | "blackarrow" | "blackarrowoff" | "blackarrowon" | "blight" | "blizzard" | "bloodlust" | "bloodlustoff" | "bloodluston" | "board" | "breathoffire" | "breathoffrost" | "build" | "burrow" | "cannibalize" | "carrionscarabs" | "carrionscarabsinstant" | "carrionscarabsoff" | "carrionscarabson" | "carrionswarm" | "chainlightning" | "channel" | "charm" | "chemicalrage" | "cloudoffog" | "clusterrockets" | "coldarrows" | "coldarrowstarg" | "controlmagic" | "corporealform" | "corrosivebreath" | "coupleinstant" | "coupletarget" | "creepanimatedead" | "creepdevour" | "creepheal" | "creephealoff" | "creephealon" | "creepthunderbolt" | "creepthunderclap" | "cripple" | "curse" | "curseoff" | "curseon" | "cyclone" | "darkconversion" | "darkportal" | "darkritual" | "darksummoning" | "deathanddecay" | "deathcoil" | "deathpact" | "decouple" | "defend" | "detectaoe" | "detonate" | "devour" | "devourmagic" | "disassociate" | "disenchant" | "dismount" | "dispel" | "divineshield" | "doom" | "drain" | "dreadlordinferno" | "dropitem" | "moveslot0" | "moveslot1" | "moveslot2" | "moveslot3" | "moveslot4" | "moveslot5" | "drunkenhaze" | "earthquake" | "eattree" | "elementalfury" | "ensnare" | "ensnareoff" | "ensnareon" | "entangle" | "entangleinstant" | "entanglingroots" | "etherealform" | "evileye" | "faeriefire" | "faeriefireoff" | "faeriefireon" | "fanofknives" | "farsight" | "fingerofdeath" | "firebolt" | "flamestrike" | "flamingarrows" | "flamingarrowstarg" | "flamingattack" | "flamingattacktarg" | "flare" | "forceboard" | "forceofnature" | "forkedlightning" | "freezingbreath" | "frenzy" | "frenzyoff" | "frenzyon" | "frostarmor" | "frostarmoroff" | "frostarmoron" | "frostnova" | "getitem" | "gold2lumber" | "grabtree" | "harvest" | "heal" | "healingspray" | "healingward" | "healingwave" | "healoff" | "healon" | "hex" | "holdposition" | "holybolt" | "howlofterror" | "humanbuild" | "immolation" | "impale" | "incineratearrow" | "incineratearrowoff" | "incineratearrowon" | "inferno" | "innerfire" | "innerfireoff" | "innerfireon" | "instant" | "invisibility" | "lavamonster" | "lightningshield" | "loadarcher" | "loadcorpse" | "loadcorpseinstant" | "locustswarm" | "lumber2gold" | "magicdefense" | "magicleash" | "magicundefense" | "manaburn" | "manaflareoff" | "manaflareon" | "manashieldoff" | "manashieldon" | "massteleport" | "mechanicalcritter" | "metamorphosis" | "militia" | "militiaconvert" | "militiaoff" | "militiaunconvert" | "mindrot" | "mirrorimage" | "monsoon" | "mount" | "mounthippogryph" | "move" | "moveAI" | "nagabuild" | "neutraldetectaoe" | "neutralinteract" | "neutralspell" | "nightelfbuild" | "orcbuild" | "parasite" | "parasiteoff" | "parasiteon" | "patrol" | "patrolAI" | "phaseshift" | "phaseshiftinstant" | "phaseshiftoff" | "phaseshifton" | "phoenixfire" | "phoenixmorph" | "poisonarrows" | "poisonarrowstarg" | "polymorph" | "possession" | "preservation" | "purge" | "rainofchaos" | "rainoffire" | "raisedead" | "raisedeadoff" | "raisedeadon" | "ravenform" | "recharge" | "rechargeoff" | "rechargeon" | "rejuvination" | "renew" | "renewoff" | "renewon" | "repair" | "repairoff" | "repairon" | "replenish" | "replenishlife" | "replenishlifeoff" | "replenishlifeon" | "replenishmana" | "replenishmanaoff" | "replenishmanaon" | "replenishoff" | "replenishon" | "request_hero" | "requestsacrifice" | "restoration" | "restorationoff" | "restorationon" | "resumebuild" | "resumeharvesting" | "resurrection" | "returnresources" | "revenge" | "revive" | "roar" | "robogoblin" | "root" | "sacrifice" | "sanctuary" | "scout" | "selfdestruct" | "selfdestructoff" | "selfdestructon" | "sentinel" | "follow" | "smart" | "setrally" | "shadowsight" | "shadowstrike" | "shockwave" | "silence" | "slow" | "slowoff" | "slowon" | "soulburn" | "soulpreservation" | "spellshield" | "spellshieldaoe" | "spellsteal" | "spellstealoff" | "spellstealon" | "spies" | "spiritlink" | "spiritofvengeance" | "spirittroll" | "spiritwolf" | "stampede" | "standdown" | "starfall" | "stasistrap" | "steal" | "stomp" | "stoneform" | "stunned" | "submerge" | "summonfactory" | "summongrizzly" | "summonphoenix" | "summonquillbeast" | "summonwareagle" | "tankdroppilot" | "tankloadpilot" | "tankpilot" | "taunt" | "thunderbolt" | "thunderclap" | "tornado" | "townbelloff" | "townbellon" | "tranquility" | "transmute" | "unavatar" | "unavengerform" | "unbearform" | "unburrow" | "uncoldarrows" | "uncorporealform" | "undeadbuild" | "undefend" | "undivineshield" | "unetherealform" | "unflamingarrows" | "unflamingattack" | "unholyfrenzy" | "unimmolation" | "unload" | "unloadall" | "unloadallcorpses" | "unloadallinstant" | "unpoisonarrows" | "unravenform" | "unrobogoblin" | "unroot" | "unstableconcoction" | "unstoneform" | "unsubmerge" | "unsummon" | "unwindwalk" | "vengeance" | "vengeanceinstant" | "vengeanceoff" | "vengeanceon" | "volcano" | "voodoo" | "ward" | "waterelemental" | "wateryminion" | "web" | "weboff" | "webon" | "whirlwind" | "windwalk" | "wispharvest") => number;
57
+ const orderId: (id: "blink" | "stop" | "load" | "sleep" | "absorb" | "acidbomb" | "acolyteharvest" | "ambush" | "ancestralspirit" | "ancestralspirittarget" | "animatedead" | "antimagicshell" | "attack" | "attackground" | "attackonce" | "attributemodskill" | "auraunholy" | "auravampiric" | "autodispel" | "autodispeloff" | "autodispelon" | "autoentangle" | "autoentangleinstant" | "autoharvestgold" | "autoharvestlumber" | "avatar" | "avengerform" | "awaken" | "banish" | "barkskin" | "barkskinoff" | "barkskinon" | "battleroar" | "battlestations" | "bearform" | "berserk" | "blackarrow" | "blackarrowoff" | "blackarrowon" | "blight" | "blizzard" | "bloodlust" | "bloodlustoff" | "bloodluston" | "board" | "breathoffire" | "breathoffrost" | "build" | "burrow" | "cannibalize" | "carrionscarabs" | "carrionscarabsinstant" | "carrionscarabsoff" | "carrionscarabson" | "carrionswarm" | "chainlightning" | "channel" | "charm" | "chemicalrage" | "cloudoffog" | "clusterrockets" | "coldarrows" | "coldarrowstarg" | "controlmagic" | "corporealform" | "corrosivebreath" | "coupleinstant" | "coupletarget" | "creepanimatedead" | "creepdevour" | "creepheal" | "creephealoff" | "creephealon" | "creepthunderbolt" | "creepthunderclap" | "cripple" | "curse" | "curseoff" | "curseon" | "cyclone" | "darkconversion" | "darkportal" | "darkritual" | "darksummoning" | "deathanddecay" | "deathcoil" | "deathpact" | "decouple" | "defend" | "detectaoe" | "detonate" | "devour" | "devourmagic" | "disassociate" | "disenchant" | "dismount" | "dispel" | "divineshield" | "doom" | "drain" | "dreadlordinferno" | "dropitem" | "moveslot0" | "moveslot1" | "moveslot2" | "moveslot3" | "moveslot4" | "moveslot5" | "useslot0" | "useslot1" | "useslot2" | "useslot3" | "useslot4" | "useslot5" | "drunkenhaze" | "earthquake" | "eattree" | "elementalfury" | "ensnare" | "ensnareoff" | "ensnareon" | "entangle" | "entangleinstant" | "entanglingroots" | "etherealform" | "evileye" | "faeriefire" | "faeriefireoff" | "faeriefireon" | "fanofknives" | "farsight" | "fingerofdeath" | "firebolt" | "flamestrike" | "flamingarrows" | "flamingarrowstarg" | "flamingattack" | "flamingattacktarg" | "flare" | "forceboard" | "forceofnature" | "forkedlightning" | "freezingbreath" | "frenzy" | "frenzyoff" | "frenzyon" | "frostarmor" | "frostarmoroff" | "frostarmoron" | "frostnova" | "getitem" | "gold2lumber" | "grabtree" | "harvest" | "heal" | "healingspray" | "healingward" | "healingwave" | "healoff" | "healon" | "hex" | "holdposition" | "holybolt" | "howlofterror" | "humanbuild" | "immolation" | "impale" | "incineratearrow" | "incineratearrowoff" | "incineratearrowon" | "inferno" | "innerfire" | "innerfireoff" | "innerfireon" | "instant" | "invisibility" | "lavamonster" | "lightningshield" | "loadarcher" | "loadcorpse" | "loadcorpseinstant" | "locustswarm" | "lumber2gold" | "magicdefense" | "magicleash" | "magicundefense" | "manaburn" | "manaflareoff" | "manaflareon" | "manashieldoff" | "manashieldon" | "massteleport" | "mechanicalcritter" | "metamorphosis" | "militia" | "militiaconvert" | "militiaoff" | "militiaunconvert" | "mindrot" | "mirrorimage" | "monsoon" | "mount" | "mounthippogryph" | "move" | "moveAI" | "nagabuild" | "neutraldetectaoe" | "neutralinteract" | "neutralspell" | "nightelfbuild" | "orcbuild" | "parasite" | "parasiteoff" | "parasiteon" | "patrol" | "patrolAI" | "phaseshift" | "phaseshiftinstant" | "phaseshiftoff" | "phaseshifton" | "phoenixfire" | "phoenixmorph" | "poisonarrows" | "poisonarrowstarg" | "polymorph" | "possession" | "preservation" | "purge" | "rainofchaos" | "rainoffire" | "raisedead" | "raisedeadoff" | "raisedeadon" | "ravenform" | "recharge" | "rechargeoff" | "rechargeon" | "rejuvination" | "renew" | "renewoff" | "renewon" | "repair" | "repairoff" | "repairon" | "replenish" | "replenishlife" | "replenishlifeoff" | "replenishlifeon" | "replenishmana" | "replenishmanaoff" | "replenishmanaon" | "replenishoff" | "replenishon" | "request_hero" | "requestsacrifice" | "restoration" | "restorationoff" | "restorationon" | "resumebuild" | "resumeharvesting" | "resurrection" | "returnresources" | "revenge" | "revive" | "roar" | "robogoblin" | "root" | "sacrifice" | "sanctuary" | "scout" | "selfdestruct" | "selfdestructoff" | "selfdestructon" | "sentinel" | "follow" | "smart" | "setrally" | "shadowsight" | "shadowstrike" | "shockwave" | "silence" | "slow" | "slowoff" | "slowon" | "soulburn" | "soulpreservation" | "spellshield" | "spellshieldaoe" | "spellsteal" | "spellstealoff" | "spellstealon" | "spies" | "spiritlink" | "spiritofvengeance" | "spirittroll" | "spiritwolf" | "stampede" | "standdown" | "starfall" | "stasistrap" | "steal" | "stomp" | "stoneform" | "stunned" | "submerge" | "summonfactory" | "summongrizzly" | "summonphoenix" | "summonquillbeast" | "summonwareagle" | "tankdroppilot" | "tankloadpilot" | "tankpilot" | "taunt" | "thunderbolt" | "thunderclap" | "tornado" | "townbelloff" | "townbellon" | "tranquility" | "transmute" | "unavatar" | "unavengerform" | "unbearform" | "unburrow" | "uncoldarrows" | "uncorporealform" | "undeadbuild" | "undefend" | "undivineshield" | "unetherealform" | "unflamingarrows" | "unflamingattack" | "unholyfrenzy" | "unimmolation" | "unload" | "unloadall" | "unloadallcorpses" | "unloadallinstant" | "unpoisonarrows" | "unravenform" | "unrobogoblin" | "unroot" | "unstableconcoction" | "unstoneform" | "unsubmerge" | "unsummon" | "unwindwalk" | "vengeance" | "vengeanceinstant" | "vengeanceoff" | "vengeanceon" | "volcano" | "voodoo" | "ward" | "waterelemental" | "wateryminion" | "web" | "weboff" | "webon" | "whirlwind" | "windwalk" | "wispharvest") => number;
58
58
  }
59
59
  declare global {
60
60
  function orderId(...args: Parameters<typeof inner.orderId>): ReturnType<typeof inner.orderId>;
package/core/util.lua CHANGED
@@ -202,6 +202,12 @@ do
202
202
  moveslot3 = 852005,
203
203
  moveslot4 = 852006,
204
204
  moveslot5 = 852007,
205
+ useslot0 = 852008,
206
+ useslot1 = 852009,
207
+ useslot2 = 852010,
208
+ useslot3 = 852011,
209
+ useslot4 = 852012,
210
+ useslot5 = 852013,
205
211
  drunkenhaze = 852585,
206
212
  earthquake = 852121,
207
213
  eattree = 852146,
@@ -0,0 +1,7 @@
1
+ /** @noSelfInFile */
2
+ import { AbilityBehavior } from "../ability";
3
+ import { Destructor } from "../../../destroyable";
4
+ export declare class AlwaysEnabledAbilityBehavior extends AbilityBehavior {
5
+ protected onCreate(): void;
6
+ protected onDestroy(): Destructor;
7
+ }
@@ -0,0 +1,31 @@
1
+ local ____lualib = require("lualib_bundle")
2
+ local __TS__Class = ____lualib.__TS__Class
3
+ local __TS__ClassExtends = ____lualib.__TS__ClassExtends
4
+ local __TS__InstanceOf = ____lualib.__TS__InstanceOf
5
+ local ____exports = {}
6
+ local ____ability = require("engine.behaviour.ability")
7
+ local AbilityBehavior = ____ability.AbilityBehavior
8
+ local ____ability = require("engine.internal.ability")
9
+ local UnitAbility = ____ability.UnitAbility
10
+ local ____ability_2Ddisable_2Dcounter = require("engine.internal.misc.ability-disable-counter")
11
+ local increaseAbilityDisableCounter = ____ability_2Ddisable_2Dcounter.increaseAbilityDisableCounter
12
+ ____exports.AlwaysEnabledAbilityBehavior = __TS__Class()
13
+ local AlwaysEnabledAbilityBehavior = ____exports.AlwaysEnabledAbilityBehavior
14
+ AlwaysEnabledAbilityBehavior.name = "AlwaysEnabledAbilityBehavior"
15
+ __TS__ClassExtends(AlwaysEnabledAbilityBehavior, AbilityBehavior)
16
+ function AlwaysEnabledAbilityBehavior.prototype.onCreate(self)
17
+ local ability = self.ability
18
+ if not __TS__InstanceOf(ability, UnitAbility) then
19
+ return
20
+ end
21
+ increaseAbilityDisableCounter(ability.owner.handle, ability.typeId, -10)
22
+ end
23
+ function AlwaysEnabledAbilityBehavior.prototype.onDestroy(self)
24
+ local ability = self.ability
25
+ if not __TS__InstanceOf(ability, UnitAbility) then
26
+ return AbilityBehavior.prototype.onDestroy(self)
27
+ end
28
+ increaseAbilityDisableCounter(ability.owner.handle, ability.typeId, 10)
29
+ return AbilityBehavior.prototype.onDestroy(self)
30
+ end
31
+ return ____exports
@@ -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 manaCost = self:resolveCurrentAbilityDependentValue(MANA_COST_ABILITY_INTEGER_LEVEL_FIELD)
16
+ local cooldown = self:resolveCurrentAbilityDependentValue(COOLDOWN_ABILITY_FLOAT_LEVEL_FIELD)
17
+ if self.ability.cooldownRemaining ~= 0 or caster.mana < manaCost then
18
+ return
19
+ end
20
+ caster.mana = caster.mana - manaCost
21
+ if cooldown == 0 then
22
+ self.ability:interruptCast()
23
+ else
24
+ self.ability.cooldownRemaining = cooldown
25
+ end
26
+ self:flashCasterEffect(caster)
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,29 @@ 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
22
  protected resolveCurrentAbilityDependentValue<T extends boolean | number | string>(value: AbilityDependentValue<T>): T;
23
+ protected resolveCurrentAbilityDependentValue<T extends boolean | number | string>(value?: AbilityDependentValue<T>): T | undefined;
24
+ protected flashCasterEffect(widget: Widget): void;
19
25
  protected flashAreaEffect(x: number, y: number, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
20
26
  protected flashEffect(x: number, y: number, ...parametersOrDuration: [parameters?: EffectParameters] | [duration?: number, parameters?: EffectParameters]): void;
21
27
  protected flashSpecialEffect(...args: [...pointOrWidget: [x: number, y: number] | [widget: Widget], duration?: number]): void;
22
28
  private static MissileLaunchConfig;
23
29
  private get missileLaunchConfig();
24
- protected launchMissile(source: Unit, target: Unit, ...parameters: NonNullable<Parameters["missileParameters"]>): void;
30
+ protected onCreate(): void;
25
31
  onMissileArrival(...parameters: NonNullable<Parameters["missileParameters"]>): void;
26
32
  onUnitGainAbility(_unit: Unit): void;
27
33
  onUnitLoseAbility(_unit: Unit): void;
34
+ onCommand(caster: Unit, orderTypeStringId: string): void;
28
35
  onCastingStart(caster: Unit): void;
29
36
  onCastingFinish(caster: Unit): void;
30
37
  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")
@@ -14,6 +15,8 @@ local ____effect = require("core.types.effect")
14
15
  local Effect = ____effect.Effect
15
16
  local ____ability = require("engine.standard.fields.ability")
16
17
  local AREA_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD = ____ability.AREA_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD
18
+ local CASTER_EFFECT_FIRST_ATTACHMENT_POINT_STRING_FIELD = ____ability.CASTER_EFFECT_FIRST_ATTACHMENT_POINT_STRING_FIELD
19
+ local CASTER_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD = ____ability.CASTER_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD
17
20
  local EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD = ____ability.EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD
18
21
  local MISSILE_ARC_ABILITY_FLOAT_FIELD = ____ability.MISSILE_ARC_ABILITY_FLOAT_FIELD
19
22
  local MISSILE_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD = ____ability.MISSILE_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD
@@ -24,21 +27,27 @@ local ____ability = require("engine.object-field.ability")
24
27
  local resolveCurrentAbilityDependentValue = ____ability.resolveCurrentAbilityDependentValue
25
28
  local ____timer = require("core.types.timer")
26
29
  local Timer = ____timer.Timer
27
- local ____missile = require("core.types.missile")
28
- local Missile = ____missile.Missile
29
30
  local createBehaviorFunctionsByAbilityTypeId = {}
30
- local function invokeOnMissileArrival(_missile, success, abilityBehavior, ...)
31
- if success then
32
- abilityBehavior:onMissileArrival(...)
31
+ local exclusiveOnImpactHandlerAbilityBehaviorByAbility = setmetatable({}, {__mode = "k"})
32
+ local function createZeroTimerUnitEventListener(key)
33
+ local unitEventListener = createUnitEventListener(key)
34
+ return function(unit, ability, ...)
35
+ Timer:run(unitEventListener, unit, ability, ...)
33
36
  end
34
37
  end
35
- local ____class_0 = __TS__Class()
36
- ____class_0.name = ""
37
- function ____class_0.prototype.____constructor(self, abilityBehavior)
38
+ createUnitEventListener = function(key)
39
+ return function(unit, ability, ...)
40
+ ____exports.AbilityBehavior:forAll(ability, key, unit, ...)
41
+ end
42
+ end
43
+ local registeredCommandEventIds = {}
44
+ local ____class_2 = __TS__Class()
45
+ ____class_2.name = ""
46
+ function ____class_2.prototype.____constructor(self, abilityBehavior)
38
47
  self.abilityBehavior = abilityBehavior
39
48
  end
40
49
  __TS__SetDescriptor(
41
- ____class_0.prototype,
50
+ ____class_2.prototype,
42
51
  "art",
43
52
  {get = function(self)
44
53
  return MISSILE_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD:getValue(self.abilityBehavior.ability, 0)
@@ -46,7 +55,7 @@ __TS__SetDescriptor(
46
55
  true
47
56
  )
48
57
  __TS__SetDescriptor(
49
- ____class_0.prototype,
58
+ ____class_2.prototype,
50
59
  "arc",
51
60
  {get = function(self)
52
61
  return MISSILE_ARC_ABILITY_FLOAT_FIELD:getValue(self.abilityBehavior.ability)
@@ -54,7 +63,7 @@ __TS__SetDescriptor(
54
63
  true
55
64
  )
56
65
  __TS__SetDescriptor(
57
- ____class_0.prototype,
66
+ ____class_2.prototype,
58
67
  "speed",
59
68
  {get = function(self)
60
69
  return MISSILE_SPEED_ABILITY_INTEGER_FIELD:getValue(self.abilityBehavior.ability)
@@ -65,12 +74,34 @@ ____exports.AbilityBehavior = __TS__Class()
65
74
  local AbilityBehavior = ____exports.AbilityBehavior
66
75
  AbilityBehavior.name = "AbilityBehavior"
67
76
  __TS__ClassExtends(AbilityBehavior, Behavior)
68
- function AbilityBehavior.prototype.____constructor(self, ability)
77
+ function AbilityBehavior.prototype.____constructor(self, ability, parameters)
69
78
  Behavior.prototype.____constructor(self, ability)
79
+ if parameters and parameters.isExclusiveOnImpactHandler then
80
+ exclusiveOnImpactHandlerAbilityBehaviorByAbility[ability] = self
81
+ end
82
+ self:onCreate()
83
+ end
84
+ function AbilityBehavior.prototype.registerCommandEvent(self, orderTypeStringId)
85
+ if orderTypeStringId == nil then
86
+ orderTypeStringId = self.ability.orderTypeStringId
87
+ end
88
+ local commandEventId = (tostring(self.ability.typeId) .. "#") .. orderTypeStringId
89
+ if not (registeredCommandEventIds[commandEventId] ~= nil) then
90
+ registeredCommandEventIds[commandEventId] = true
91
+ Unit.abilityCommandEvent[self.ability.typeId][orderTypeStringId]:addListener(createUnitEventListener("onCommand"))
92
+ end
70
93
  end
71
94
  function AbilityBehavior.prototype.resolveCurrentAbilityDependentValue(self, value)
72
95
  return resolveCurrentAbilityDependentValue(self.ability, value)
73
96
  end
97
+ function AbilityBehavior.prototype.flashCasterEffect(self, widget)
98
+ local attachmentPoint = CASTER_EFFECT_FIRST_ATTACHMENT_POINT_STRING_FIELD:getValue(self.ability)
99
+ Effect:flash(
100
+ CASTER_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD:getValue(self.ability, 0),
101
+ widget,
102
+ attachmentPoint ~= "" and attachmentPoint or "origin"
103
+ )
104
+ end
74
105
  function AbilityBehavior.prototype.flashAreaEffect(self, x, y, ...)
75
106
  Effect:flash(
76
107
  AREA_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD:getValue(self.ability, 0),
@@ -104,15 +135,7 @@ function AbilityBehavior.prototype.flashSpecialEffect(self, xOrWidget, yOrDurati
104
135
  )
105
136
  end
106
137
  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
- )
138
+ function AbilityBehavior.prototype.onCreate(self)
116
139
  end
117
140
  function AbilityBehavior.prototype.onMissileArrival(self, ...)
118
141
  end
@@ -120,6 +143,8 @@ function AbilityBehavior.prototype.onUnitGainAbility(self, _unit)
120
143
  end
121
144
  function AbilityBehavior.prototype.onUnitLoseAbility(self, _unit)
122
145
  end
146
+ function AbilityBehavior.prototype.onCommand(self, caster, orderTypeStringId)
147
+ end
123
148
  function AbilityBehavior.prototype.onCastingStart(self, caster)
124
149
  end
125
150
  function AbilityBehavior.prototype.onCastingFinish(self, caster)
@@ -179,7 +204,7 @@ __TS__SetDescriptor(
179
204
  end},
180
205
  true
181
206
  )
182
- AbilityBehavior.MissileLaunchConfig = ____class_0
207
+ AbilityBehavior.MissileLaunchConfig = ____class_2
183
208
  __TS__SetDescriptor(
184
209
  AbilityBehavior.prototype,
185
210
  "missileLaunchConfig",
@@ -191,17 +216,6 @@ __TS__SetDescriptor(
191
216
  true
192
217
  );
193
218
  (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
219
  Unit.abilityGainedEvent:addListener(createUnitEventListener("onUnitGainAbility"))
206
220
  Unit.abilityLostEvent:addListener(createUnitEventListener("onUnitLoseAbility"))
207
221
  Unit.abilityCastingStartEvent:addListener(createUnitEventListener("onCastingStart"))
package/engine/buff.lua CHANGED
@@ -515,7 +515,7 @@ function Buff.prototype.flashEffect(self, widgetOrXOrParametersOrDuration, yOrPa
515
515
  )
516
516
  local ____isWidgetProvided_38
517
517
  if isWidgetProvided then
518
- ____isWidgetProvided_38 = parametersOrDuration
518
+ ____isWidgetProvided_38 = yOrParametersOrDuration
519
519
  else
520
520
  ____isWidgetProvided_38 = widgetOrXOrParametersOrDuration
521
521
  end
@@ -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;
@@ -34,6 +35,9 @@ export declare abstract class Ability extends Handle<jability> {
34
35
  setField(field: jabilitystringlevelfield, level: number, value: string): boolean;
35
36
  get levelCount(): number;
36
37
  abstract get level(): number;
38
+ abstract get cooldownRemaining(): number;
39
+ abstract set cooldownRemaining(cooldownRemaining: number);
40
+ abstract interruptCast(): void;
37
41
  static get onCreate(): Event<[Ability]>;
38
42
  static get destroyEvent(): Event<[Ability]>;
39
43
  }
@@ -44,6 +48,9 @@ export declare class UnrecognizedAbility extends Ability {
44
48
  readonly owner: Unit;
45
49
  constructor(typeId: number, owner: Unit);
46
50
  get level(): number;
51
+ get cooldownRemaining(): number;
52
+ set cooldownRemaining(_: number);
53
+ interruptCast(): void;
47
54
  }
48
55
  export declare class UnitAbility extends Ability {
49
56
  readonly owner: Unit;
@@ -54,7 +61,8 @@ export declare class UnitAbility extends Ability {
54
61
  get level(): number;
55
62
  set level(v: number);
56
63
  get cooldownRemaining(): number;
57
- set cooldownRemaining(v: number);
64
+ set cooldownRemaining(cooldownRemaining: number);
65
+ interruptCast(): void;
58
66
  static get onCreate(): Event<[UnitAbility]>;
59
67
  static get onDestroy(): Event<[UnitAbility]>;
60
68
  }
@@ -78,6 +86,9 @@ export declare class ItemAbility extends Ability {
78
86
  setField(field: jabilitybooleanlevelfield, level: number, value: boolean): boolean;
79
87
  setField(field: jabilitystringlevelfield, level: number, value: string): boolean;
80
88
  get level(): number;
89
+ get cooldownRemaining(): number;
90
+ set cooldownRemaining(cooldownRemaining: number);
91
+ interruptCast(): void;
81
92
  static get onCreate(): Event<[ItemAbility]>;
82
93
  static get onDestroy(): Event<[ItemAbility]>;
83
94
  }
@@ -10,7 +10,9 @@ local ____exports = {}
10
10
  local ____handle = require("core.types.handle")
11
11
  local Handle = ____handle.Handle
12
12
  local ____ability = require("engine.internal.item.ability")
13
+ local abilityActionDummy = ____ability.abilityActionDummy
13
14
  local doAbilityAction = ____ability.doAbilityAction
15
+ local doAbilityActionForceDummy = ____ability.doAbilityActionForceDummy
14
16
  local getUnitAbilityLevel = GetUnitAbilityLevel
15
17
  local setUnitAbilityLevel = SetUnitAbilityLevel
16
18
  local setAbilityIntegerField = BlzSetAbilityIntegerField
@@ -296,10 +298,18 @@ __TS__SetDescriptor(
296
298
  )
297
299
  __TS__SetDescriptor(
298
300
  Ability.prototype,
299
- "orderId",
301
+ "orderTypeStringId",
300
302
  {get = function(self)
301
303
  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 ""))
304
+ return field ~= nil and getAbilityStringLevelField(self.handle, field, self.level) or (orders[self.parentTypeId] or "")
305
+ end},
306
+ true
307
+ )
308
+ __TS__SetDescriptor(
309
+ Ability.prototype,
310
+ "orderTypeId",
311
+ {get = function(self)
312
+ return order2orderId(self.orderTypeStringId)
303
313
  end},
304
314
  true
305
315
  )
@@ -318,6 +328,17 @@ __TS__SetDescriptor(
318
328
  end},
319
329
  true
320
330
  )
331
+ __TS__SetDescriptor(
332
+ Ability.prototype,
333
+ "cooldownRemaining",
334
+ {
335
+ get = function(self)
336
+ end,
337
+ set = function(self, cooldownRemaining)
338
+ end
339
+ },
340
+ true
341
+ )
321
342
  __TS__ObjectDefineProperty(
322
343
  Ability,
323
344
  "onCreate",
@@ -341,6 +362,8 @@ function UnrecognizedAbility.prototype.____constructor(self, typeId, owner)
341
362
  UnrecognizedAbility.____super.prototype.____constructor(self, nil, typeId)
342
363
  self.owner = owner
343
364
  end
365
+ function UnrecognizedAbility.prototype.interruptCast(self)
366
+ end
344
367
  __TS__SetDescriptor(
345
368
  UnrecognizedAbility.prototype,
346
369
  "level",
@@ -349,6 +372,18 @@ __TS__SetDescriptor(
349
372
  end},
350
373
  true
351
374
  )
375
+ __TS__SetDescriptor(
376
+ UnrecognizedAbility.prototype,
377
+ "cooldownRemaining",
378
+ {
379
+ get = function(self)
380
+ return 0
381
+ end,
382
+ set = function(self, _)
383
+ end
384
+ },
385
+ true
386
+ )
352
387
  ____exports.UnitAbility = __TS__Class()
353
388
  local UnitAbility = ____exports.UnitAbility
354
389
  UnitAbility.name = "UnitAbility"
@@ -364,6 +399,9 @@ end
364
399
  function UnitAbility.prototype.decrementHideCounter(self)
365
400
  unitHideAbility(self.u, self.typeId, false)
366
401
  end
402
+ function UnitAbility.prototype.interruptCast(self)
403
+ self.owner:interruptCast(self.typeId)
404
+ end
367
405
  __TS__SetDescriptor(
368
406
  UnitAbility.prototype,
369
407
  "level",
@@ -384,8 +422,8 @@ __TS__SetDescriptor(
384
422
  get = function(self)
385
423
  return getUnitAbilityCooldownRemaining(self.u, self.typeId)
386
424
  end,
387
- set = function(self, v)
388
- startUnitAbilityCooldown(self.u, self.typeId, v)
425
+ set = function(self, cooldownRemaining)
426
+ startUnitAbilityCooldown(self.u, self.typeId, cooldownRemaining)
389
427
  end
390
428
  },
391
429
  true
@@ -410,6 +448,14 @@ end
410
448
  local function setAbilityField(_, ability, field, levelOrValue, value)
411
449
  return ____exports.Ability.prototype.setField(ability, field, levelOrValue, value)
412
450
  end
451
+ local function getAbilityCooldown(_, abilityTypeId)
452
+ return getUnitAbilityCooldownRemaining(abilityActionDummy, abilityTypeId)
453
+ end
454
+ local function startAbilityCooldown(_, abilityTypeId, cooldown)
455
+ startUnitAbilityCooldown(abilityActionDummy, abilityTypeId, cooldown)
456
+ end
457
+ local function doNothing()
458
+ end
413
459
  ____exports.ItemAbility = __TS__Class()
414
460
  local ItemAbility = ____exports.ItemAbility
415
461
  ItemAbility.name = "ItemAbility"
@@ -437,6 +483,13 @@ function ItemAbility.prototype.setField(self, field, levelOrValue, value)
437
483
  value
438
484
  )
439
485
  end
486
+ function ItemAbility.prototype.interruptCast(self)
487
+ local item = self.owner
488
+ local ____doAbilityActionForceDummy_4 = doAbilityActionForceDummy
489
+ local ____item_handle_3 = item.handle
490
+ local ____opt_1 = item.owner
491
+ ____doAbilityActionForceDummy_4(____item_handle_3, ____opt_1 and ____opt_1.handle, doNothing)
492
+ end
440
493
  __TS__SetDescriptor(
441
494
  ItemAbility.prototype,
442
495
  "level",
@@ -445,6 +498,33 @@ __TS__SetDescriptor(
445
498
  end},
446
499
  true
447
500
  )
501
+ __TS__SetDescriptor(
502
+ ItemAbility.prototype,
503
+ "cooldownRemaining",
504
+ {
505
+ get = function(self)
506
+ local item = self.owner
507
+ local ____doAbilityActionForceDummy_8 = doAbilityActionForceDummy
508
+ local ____item_handle_7 = item.handle
509
+ local ____opt_5 = item.owner
510
+ return ____doAbilityActionForceDummy_8(____item_handle_7, ____opt_5 and ____opt_5.handle, getAbilityCooldown, self.typeId)
511
+ end,
512
+ set = function(self, cooldownRemaining)
513
+ local item = self.owner
514
+ local ____doAbilityActionForceDummy_12 = doAbilityActionForceDummy
515
+ local ____item_handle_11 = item.handle
516
+ local ____opt_9 = item.owner
517
+ ____doAbilityActionForceDummy_12(
518
+ ____item_handle_11,
519
+ ____opt_9 and ____opt_9.handle,
520
+ startAbilityCooldown,
521
+ self.typeId,
522
+ cooldownRemaining
523
+ )
524
+ end
525
+ },
526
+ true
527
+ )
448
528
  __TS__ObjectDefineProperty(
449
529
  ItemAbility,
450
530
  "onCreate",
@@ -3,6 +3,8 @@ local ____player = require("core.types.player")
3
3
  local Player = ____player.Player
4
4
  local ____dummy = require("objutil.dummy")
5
5
  local dummyUnitId = ____dummy.dummyUnitId
6
+ local ____utility = require("engine.internal.utility")
7
+ local findUnitItemSlot = ____utility.findUnitItemSlot
6
8
  local isItemOwned = IsItemOwned
7
9
  local isItemPowerup = IsItemPowerup
8
10
  local getItemX = GetItemX
@@ -10,6 +12,7 @@ local getItemY = GetItemY
10
12
  local setItemBooleanField = BlzSetItemBooleanField
11
13
  local setItemPosition = SetItemPosition
12
14
  local unitAddItem = UnitAddItem
15
+ local unitDropItemSlot = UnitDropItemSlot
13
16
  local unitRemoveItem = UnitRemoveItem
14
17
  local dummy = assert(CreateUnit(
15
18
  Player.neutralVictim.handle,
@@ -21,6 +24,9 @@ local dummy = assert(CreateUnit(
21
24
  ShowUnit(dummy, false)
22
25
  ---
23
26
  -- @internal For use by internal systems only.
27
+ ____exports.abilityActionDummy = dummy
28
+ ---
29
+ -- @internal For use by internal systems only.
24
30
  ____exports.doAbilityAction = function(handle, action, ...)
25
31
  local isOwned = isItemOwned(handle)
26
32
  local isPowerup
@@ -45,4 +51,30 @@ ____exports.doAbilityAction = function(handle, action, ...)
45
51
  end
46
52
  return result
47
53
  end
54
+ ---
55
+ -- @internal For use by internal systems only.
56
+ ____exports.doAbilityActionForceDummy = function(handle, owner, action, ...)
57
+ if owner == nil then
58
+ return ____exports.doAbilityAction(handle, action, ...)
59
+ end
60
+ local slot = findUnitItemSlot(owner, handle)
61
+ if slot == nil then
62
+ return ____exports.doAbilityAction(handle, action, ...)
63
+ end
64
+ local isPowerup
65
+ if isItemPowerup(handle) then
66
+ setItemBooleanField(handle, ITEM_BF_USE_AUTOMATICALLY_WHEN_ACQUIRED, false)
67
+ isPowerup = true
68
+ end
69
+ unitRemoveItem(owner, handle)
70
+ unitAddItem(dummy, handle)
71
+ local result = action(handle, ...)
72
+ unitRemoveItem(dummy, handle)
73
+ unitAddItem(owner, handle)
74
+ unitDropItemSlot(owner, handle, slot)
75
+ if isPowerup then
76
+ setItemBooleanField(handle, ITEM_BF_USE_AUTOMATICALLY_WHEN_ACQUIRED, true)
77
+ end
78
+ return result
79
+ end
48
80
  return ____exports
@@ -0,0 +1,2 @@
1
+ /** @noSelfInFile */
2
+ export {};
@@ -0,0 +1,13 @@
1
+ local ____exports = {}
2
+ local disableAbility = BlzUnitDisableAbility
3
+ ---
4
+ -- @internal For use by internal systems only.
5
+ ____exports.increaseAbilityDisableCounter = function(unit, abilityTypeId, times)
6
+ for _ = 1, times do
7
+ disableAbility(unit, abilityTypeId, true, false)
8
+ end
9
+ for _ = times, -1 do
10
+ disableAbility(unit, abilityTypeId, false, false)
11
+ end
12
+ end
13
+ return ____exports
@@ -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,6 +33,8 @@ local getSpellTargetUnit = GetSpellTargetUnit
26
33
  local getSpellTargetX = GetSpellTargetX
27
34
  local getSpellTargetY = GetSpellTargetY
28
35
  local getTriggerUnit = GetTriggerUnit
36
+ local triggerAddCondition = TriggerAddCondition
37
+ local triggerRegisterCommandEvent = TriggerRegisterCommandEvent
29
38
  local unitInventorySize = UnitInventorySize
30
39
  local unitItemInSlot = UnitItemInSlot
31
40
  local function retrieveAbility(unit, ability, abilityId)
@@ -352,4 +361,31 @@ rawset(
352
361
  extractAbilityTypeId
353
362
  )
354
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
+ )
355
391
  return ____exports
@@ -7,6 +7,8 @@ local ____item = require("engine.internal.item")
7
7
  local Item = ____item.Item
8
8
  local ____unit = require("engine.internal.unit")
9
9
  local Unit = ____unit.Unit
10
+ local ____utility = require("engine.internal.utility")
11
+ local findUnitItemSlot = ____utility.findUnitItemSlot
10
12
  local rawset = _G.rawset
11
13
  local ____type = _G.type
12
14
  local isItemPowerup = IsItemPowerup
@@ -31,14 +33,7 @@ function UnitItems.prototype.____constructor(self, handle)
31
33
  handleByUnitItems[self] = handle
32
34
  end
33
35
  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
36
+ return findUnitItemSlot(handleByUnitItems[self], item.handle)
42
37
  end
43
38
  function UnitItems.prototype.__newindex(self, slot, item)
44
39
  local handle = handleByUnitItems[self]
@@ -332,7 +332,8 @@ 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<[
335
+ static get itemUseOrderEvent(): Event<[unit: Unit, item: Item]>;
336
+ static get itemMoveOrderEvent(): Event<[
336
337
  unit: Unit,
337
338
  item: Item,
338
339
  slotFrom: 0 | 1 | 2 | 3 | 4 | 5,
@@ -2538,7 +2538,28 @@ Unit.itemStackedEvent = __TS__New(
2538
2538
  )
2539
2539
  __TS__ObjectDefineProperty(
2540
2540
  Unit,
2541
- "itemMovedEvent",
2541
+ "itemUseOrderEvent",
2542
+ {get = function(self)
2543
+ local event = __TS__New(Event)
2544
+ for order = orderId("useslot0"), orderId("useslot5") do
2545
+ local slot = order - orderId("useslot0")
2546
+ local function listener(unit)
2547
+ local item = unit.items[slot + 1]
2548
+ if item ~= nil then
2549
+ invoke(event, unit, item)
2550
+ end
2551
+ end
2552
+ self.onImmediateOrder[order]:addListener(listener)
2553
+ self.onTargetOrder[order]:addListener(listener)
2554
+ self.onPointOrder[order]:addListener(listener)
2555
+ end
2556
+ rawset(self, "itemUseOrderEvent", event)
2557
+ return event
2558
+ end}
2559
+ )
2560
+ __TS__ObjectDefineProperty(
2561
+ Unit,
2562
+ "itemMoveOrderEvent",
2542
2563
  {get = function(self)
2543
2564
  local event = __TS__New(Event)
2544
2565
  for order = orderId("moveslot0"), orderId("moveslot5") do
@@ -2556,7 +2577,7 @@ __TS__ObjectDefineProperty(
2556
2577
  end
2557
2578
  end)
2558
2579
  end
2559
- rawset(self, "itemMovedEvent", event)
2580
+ rawset(self, "itemMoveOrderEvent", event)
2560
2581
  return event
2561
2582
  end}
2562
2583
  )
@@ -1,6 +1,8 @@
1
1
  local ____exports = {}
2
2
  local getUnitAbility = BlzGetUnitAbility
3
3
  local unitAddAbility = UnitAddAbility
4
+ local unitInventorySize = UnitInventorySize
5
+ local unitItemInSlot = UnitItemInSlot
4
6
  local unitMakeAbilityPermanent = UnitMakeAbilityPermanent
5
7
  ---
6
8
  -- @internal For use by internal systems only.
@@ -10,4 +12,14 @@ ____exports.addInternalAbility = function(unit, abilityTypeId)
10
12
  end
11
13
  return getUnitAbility(unit, abilityTypeId)
12
14
  end
15
+ ---
16
+ -- @internal For use by internal systems only.
17
+ ____exports.findUnitItemSlot = function(unit, item)
18
+ for slot = 0, unitInventorySize(unit) - 1 do
19
+ if item == unitItemInSlot(unit, slot) then
20
+ return slot
21
+ end
22
+ end
23
+ return nil
24
+ end
13
25
  return ____exports
@@ -131,4 +131,7 @@ export declare class AbilityCombatClassificationsLevelField extends AbilityLevel
131
131
  protected setNativeFieldValue(instance: Ability, level: number, value: CombatClassifications): boolean;
132
132
  }
133
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;
134
+ export declare const resolveCurrentAbilityDependentValue: {
135
+ <ValueType extends boolean | number | string>(ability: Ability, value: AbilityDependentValue<ValueType>): ValueType;
136
+ <ValueType extends boolean | number | string>(ability: Ability, value?: AbilityDependentValue<ValueType>): ValueType | undefined;
137
+ };
@@ -687,6 +687,8 @@ export declare const DISABLE_OTHER_ABILITIES_ABILITY_BOOLEAN_LEVEL_FIELD: Abilit
687
687
  export declare const ALLOW_BOUNTY_ABILITY_BOOLEAN_LEVEL_FIELD: AbilityBooleanLevelField & symbol;
688
688
  export declare const ICON_NORMAL_ABILITY_STRING_LEVEL_FIELD: AbilityStringLevelField & symbol;
689
689
  export declare const CASTER_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD: AbilityStringArrayField & symbol;
690
+ export declare const CASTER_EFFECT_FIRST_ATTACHMENT_POINT_STRING_FIELD: AbilityStringField & symbol;
691
+ export declare const CASTER_EFFECT_SECOND_ATTACHMENT_POINT_STRING_FIELD: AbilityStringField & symbol;
690
692
  export declare const TARGET_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD: AbilityStringArrayField & symbol;
691
693
  export declare const TARGET_EFFECT_FIRST_ATTACHMENT_POINT_STRING_FIELD: AbilityStringField & symbol;
692
694
  export declare const TARGET_EFFECT_SECOND_ATTACHMENT_POINT_STRING_FIELD: AbilityStringField & symbol;
@@ -698,6 +698,8 @@ ____exports.DISABLE_OTHER_ABILITIES_ABILITY_BOOLEAN_LEVEL_FIELD = AbilityBoolean
698
698
  ____exports.ALLOW_BOUNTY_ABILITY_BOOLEAN_LEVEL_FIELD = AbilityBooleanLevelField:create(fourCC("Ntm4"))
699
699
  ____exports.ICON_NORMAL_ABILITY_STRING_LEVEL_FIELD = AbilityStringLevelField:create(fourCC("aart"))
700
700
  ____exports.CASTER_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD = AbilityStringArrayField:create(fourCC("acat"))
701
+ ____exports.CASTER_EFFECT_FIRST_ATTACHMENT_POINT_STRING_FIELD = AbilityStringField:create(fourCC("acap"))
702
+ ____exports.CASTER_EFFECT_SECOND_ATTACHMENT_POINT_STRING_FIELD = AbilityStringField:create(fourCC("aca1"))
701
703
  ____exports.TARGET_EFFECT_MODEL_PATHS_ABILITY_STRING_ARRAY_FIELD = AbilityStringArrayField:create(fourCC("atat"))
702
704
  ____exports.TARGET_EFFECT_FIRST_ATTACHMENT_POINT_STRING_FIELD = AbilityStringField:create(fourCC("ata0"))
703
705
  ____exports.TARGET_EFFECT_SECOND_ATTACHMENT_POINT_STRING_FIELD = AbilityStringField:create(fourCC("ata1"))
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.d5f6f38",
4
+ "version": "0.0.1-dev.d63794c",
5
5
  "description": "A typescript library for Warcraft III using Warpack.",
6
6
  "keywords": [
7
7
  "warcraft",
@@ -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