warscript 0.0.1-dev.1b0add9 → 0.0.1-dev.1e33483

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 (35) 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 +25 -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/internal/ability.d.ts +13 -2
  18. package/engine/internal/ability.lua +76 -4
  19. package/engine/internal/item/ability.lua +68 -0
  20. package/engine/internal/misc/ability-disable-counter.d.ts +2 -0
  21. package/engine/internal/misc/ability-disable-counter.lua +13 -0
  22. package/engine/internal/unit/ability.d.ts +10 -1
  23. package/engine/internal/unit/ability.lua +36 -0
  24. package/engine/internal/unit/item.lua +3 -8
  25. package/engine/internal/unit.d.ts +2 -1
  26. package/engine/internal/unit.lua +23 -2
  27. package/engine/internal/utility.lua +12 -0
  28. package/engine/object-data/entry/item-type.d.ts +2 -0
  29. package/engine/object-data/entry/item-type.lua +13 -0
  30. package/engine/object-field/ability.d.ts +4 -1
  31. package/engine/standard/fields/ability.d.ts +2 -0
  32. package/engine/standard/fields/ability.lua +2 -0
  33. package/package.json +1 -1
  34. package/utility/lazy.d.ts +2 -0
  35. 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,25 @@
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 ____unit = require("engine.internal.unit")
6
+ local Unit = ____unit.Unit
7
+ local ____emulate_2Dimpact = require("engine.behaviour.ability.emulate-impact")
8
+ local EmulateImpactAbilityBehavior = ____emulate_2Dimpact.EmulateImpactAbilityBehavior
9
+ ____exports.OnCommandImpactAbilityBehavior = __TS__Class()
10
+ local OnCommandImpactAbilityBehavior = ____exports.OnCommandImpactAbilityBehavior
11
+ OnCommandImpactAbilityBehavior.name = "OnCommandImpactAbilityBehavior"
12
+ __TS__ClassExtends(OnCommandImpactAbilityBehavior, EmulateImpactAbilityBehavior)
13
+ function OnCommandImpactAbilityBehavior.prototype.____constructor(self, ability)
14
+ EmulateImpactAbilityBehavior.prototype.____constructor(self, ability)
15
+ self:registerCommandEvent()
16
+ end
17
+ function OnCommandImpactAbilityBehavior.prototype.onCommand(self, caster)
18
+ self:emulateImpact(caster)
19
+ end
20
+ Unit.itemUseOrderEvent:addListener(function(unit, item)
21
+ for ____, ability in ipairs(item.abilities) do
22
+ ____exports.OnCommandImpactAbilityBehavior:forAll(ability, "onCommand", unit)
23
+ end
24
+ end)
25
+ 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"))
@@ -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,10 @@ 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
16
+ local startItemCooldown = ____ability.startItemCooldown
14
17
  local getUnitAbilityLevel = GetUnitAbilityLevel
15
18
  local setUnitAbilityLevel = SetUnitAbilityLevel
16
19
  local setAbilityIntegerField = BlzSetAbilityIntegerField
@@ -296,10 +299,18 @@ __TS__SetDescriptor(
296
299
  )
297
300
  __TS__SetDescriptor(
298
301
  Ability.prototype,
299
- "orderId",
302
+ "orderTypeStringId",
300
303
  {get = function(self)
301
304
  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 ""))
305
+ return field ~= nil and getAbilityStringLevelField(self.handle, field, self.level) or (orders[self.parentTypeId] or "")
306
+ end},
307
+ true
308
+ )
309
+ __TS__SetDescriptor(
310
+ Ability.prototype,
311
+ "orderTypeId",
312
+ {get = function(self)
313
+ return order2orderId(self.orderTypeStringId)
303
314
  end},
304
315
  true
305
316
  )
@@ -318,6 +329,17 @@ __TS__SetDescriptor(
318
329
  end},
319
330
  true
320
331
  )
332
+ __TS__SetDescriptor(
333
+ Ability.prototype,
334
+ "cooldownRemaining",
335
+ {
336
+ get = function(self)
337
+ end,
338
+ set = function(self, cooldownRemaining)
339
+ end
340
+ },
341
+ true
342
+ )
321
343
  __TS__ObjectDefineProperty(
322
344
  Ability,
323
345
  "onCreate",
@@ -341,6 +363,8 @@ function UnrecognizedAbility.prototype.____constructor(self, typeId, owner)
341
363
  UnrecognizedAbility.____super.prototype.____constructor(self, nil, typeId)
342
364
  self.owner = owner
343
365
  end
366
+ function UnrecognizedAbility.prototype.interruptCast(self)
367
+ end
344
368
  __TS__SetDescriptor(
345
369
  UnrecognizedAbility.prototype,
346
370
  "level",
@@ -349,6 +373,18 @@ __TS__SetDescriptor(
349
373
  end},
350
374
  true
351
375
  )
376
+ __TS__SetDescriptor(
377
+ UnrecognizedAbility.prototype,
378
+ "cooldownRemaining",
379
+ {
380
+ get = function(self)
381
+ return 0
382
+ end,
383
+ set = function(self, _)
384
+ end
385
+ },
386
+ true
387
+ )
352
388
  ____exports.UnitAbility = __TS__Class()
353
389
  local UnitAbility = ____exports.UnitAbility
354
390
  UnitAbility.name = "UnitAbility"
@@ -364,6 +400,9 @@ end
364
400
  function UnitAbility.prototype.decrementHideCounter(self)
365
401
  unitHideAbility(self.u, self.typeId, false)
366
402
  end
403
+ function UnitAbility.prototype.interruptCast(self)
404
+ self.owner:interruptCast(self.typeId)
405
+ end
367
406
  __TS__SetDescriptor(
368
407
  UnitAbility.prototype,
369
408
  "level",
@@ -384,8 +423,8 @@ __TS__SetDescriptor(
384
423
  get = function(self)
385
424
  return getUnitAbilityCooldownRemaining(self.u, self.typeId)
386
425
  end,
387
- set = function(self, v)
388
- startUnitAbilityCooldown(self.u, self.typeId, v)
426
+ set = function(self, cooldownRemaining)
427
+ startUnitAbilityCooldown(self.u, self.typeId, cooldownRemaining)
389
428
  end
390
429
  },
391
430
  true
@@ -410,6 +449,11 @@ end
410
449
  local function setAbilityField(_, ability, field, levelOrValue, value)
411
450
  return ____exports.Ability.prototype.setField(ability, field, levelOrValue, value)
412
451
  end
452
+ local function getAbilityCooldown(_, abilityTypeId)
453
+ return getUnitAbilityCooldownRemaining(abilityActionDummy, abilityTypeId)
454
+ end
455
+ local function doNothing()
456
+ end
413
457
  ____exports.ItemAbility = __TS__Class()
414
458
  local ItemAbility = ____exports.ItemAbility
415
459
  ItemAbility.name = "ItemAbility"
@@ -437,6 +481,13 @@ function ItemAbility.prototype.setField(self, field, levelOrValue, value)
437
481
  value
438
482
  )
439
483
  end
484
+ function ItemAbility.prototype.interruptCast(self)
485
+ local item = self.owner
486
+ local ____doAbilityActionForceDummy_4 = doAbilityActionForceDummy
487
+ local ____item_handle_3 = item.handle
488
+ local ____opt_1 = item.owner
489
+ ____doAbilityActionForceDummy_4(____item_handle_3, ____opt_1 and ____opt_1.handle, doNothing)
490
+ end
440
491
  __TS__SetDescriptor(
441
492
  ItemAbility.prototype,
442
493
  "level",
@@ -445,6 +496,27 @@ __TS__SetDescriptor(
445
496
  end},
446
497
  true
447
498
  )
499
+ __TS__SetDescriptor(
500
+ ItemAbility.prototype,
501
+ "cooldownRemaining",
502
+ {
503
+ get = function(self)
504
+ local item = self.owner
505
+ local ____doAbilityActionForceDummy_8 = doAbilityActionForceDummy
506
+ local ____item_handle_7 = item.handle
507
+ local ____opt_5 = item.owner
508
+ return ____doAbilityActionForceDummy_8(____item_handle_7, ____opt_5 and ____opt_5.handle, getAbilityCooldown, self.typeId)
509
+ end,
510
+ set = function(self, cooldownRemaining)
511
+ local item = self.owner
512
+ local ____startItemCooldown_12 = startItemCooldown
513
+ local ____item_handle_11 = item.handle
514
+ local ____opt_9 = item.owner
515
+ ____startItemCooldown_12(____item_handle_11, ____opt_9 and ____opt_9.handle, cooldownRemaining)
516
+ end
517
+ },
518
+ true
519
+ )
448
520
  __TS__ObjectDefineProperty(
449
521
  ItemAbility,
450
522
  "onCreate",
@@ -3,14 +3,38 @@ 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
8
+ local ____berserk = require("engine.object-data.entry.ability-type.berserk")
9
+ local BerserkAbilityType = ____berserk.BerserkAbilityType
10
+ local ____blank = require("engine.object-data.entry.item-type.blank")
11
+ local BlankItemType = ____blank.BlankItemType
6
12
  local isItemOwned = IsItemOwned
7
13
  local isItemPowerup = IsItemPowerup
8
14
  local getItemX = GetItemX
9
15
  local getItemY = GetItemY
16
+ local setAbilityRealLevelField = BlzSetAbilityRealLevelField
17
+ local setItemIntegerField = BlzSetItemIntegerField
18
+ local getItemIntegerField = BlzGetItemIntegerField
10
19
  local setItemBooleanField = BlzSetItemBooleanField
11
20
  local setItemPosition = SetItemPosition
12
21
  local unitAddItem = UnitAddItem
22
+ local unitDropItemSlot = UnitDropItemSlot
13
23
  local unitRemoveItem = UnitRemoveItem
24
+ local unitUseItem = UnitUseItem
25
+ local unitResetCooldown = UnitResetCooldown
26
+ local COOLDOWN_STARTER_ABILITY_TYPE_ID = compiletime(function()
27
+ local abilityType = BerserkAbilityType:create()
28
+ abilityType.manaCost = 0
29
+ return abilityType.id
30
+ end)
31
+ local COOLDOWN_STARTER_ITEM_TYPE_ID = compiletime(function()
32
+ local itemType = BlankItemType:create()
33
+ itemType.abilityTypeIds = {COOLDOWN_STARTER_ABILITY_TYPE_ID}
34
+ itemType.cooldownGroupId = COOLDOWN_STARTER_ABILITY_TYPE_ID
35
+ itemType.activelyUsed = true
36
+ return itemType.id
37
+ end)
14
38
  local dummy = assert(CreateUnit(
15
39
  Player.neutralVictim.handle,
16
40
  dummyUnitId,
@@ -18,7 +42,25 @@ local dummy = assert(CreateUnit(
18
42
  0,
19
43
  270
20
44
  ))
45
+ local cooldownStarterItem = UnitAddItemById(dummy, COOLDOWN_STARTER_ITEM_TYPE_ID)
46
+ local cooldownStarterAbility = BlzGetItemAbility(cooldownStarterItem, COOLDOWN_STARTER_ABILITY_TYPE_ID)
21
47
  ShowUnit(dummy, false)
48
+ local function startItemCooldownInternal(handle, cooldown)
49
+ local cooldownGroup = getItemIntegerField(handle, ITEM_IF_COOLDOWN_GROUP)
50
+ setItemIntegerField(handle, ITEM_IF_COOLDOWN_GROUP, COOLDOWN_STARTER_ABILITY_TYPE_ID)
51
+ setAbilityRealLevelField(cooldownStarterAbility, ABILITY_RLF_COOLDOWN, 0, cooldown)
52
+ unitResetCooldown(dummy)
53
+ unitUseItem(dummy, cooldownStarterItem)
54
+ setItemIntegerField(handle, ITEM_IF_COOLDOWN_GROUP, cooldownGroup)
55
+ end
56
+ ---
57
+ -- @internal For use by internal systems only.
58
+ ____exports.startItemCooldown = function(handle, owner, cooldown)
59
+ ____exports.doAbilityActionForceDummy(handle, owner, startItemCooldownInternal, cooldown)
60
+ end
61
+ ---
62
+ -- @internal For use by internal systems only.
63
+ ____exports.abilityActionDummy = dummy
22
64
  ---
23
65
  -- @internal For use by internal systems only.
24
66
  ____exports.doAbilityAction = function(handle, action, ...)
@@ -45,4 +87,30 @@ ____exports.doAbilityAction = function(handle, action, ...)
45
87
  end
46
88
  return result
47
89
  end
90
+ ---
91
+ -- @internal For use by internal systems only.
92
+ ____exports.doAbilityActionForceDummy = function(handle, owner, action, ...)
93
+ if owner == nil then
94
+ return ____exports.doAbilityAction(handle, action, ...)
95
+ end
96
+ local slot = findUnitItemSlot(owner, handle)
97
+ if slot == nil then
98
+ return ____exports.doAbilityAction(handle, action, ...)
99
+ end
100
+ local isPowerup
101
+ if isItemPowerup(handle) then
102
+ setItemBooleanField(handle, ITEM_BF_USE_AUTOMATICALLY_WHEN_ACQUIRED, false)
103
+ isPowerup = true
104
+ end
105
+ unitRemoveItem(owner, handle)
106
+ unitAddItem(dummy, handle)
107
+ local result = action(handle, ...)
108
+ unitRemoveItem(dummy, handle)
109
+ unitAddItem(owner, handle)
110
+ unitDropItemSlot(owner, handle, slot)
111
+ if isPowerup then
112
+ setItemBooleanField(handle, ITEM_BF_USE_AUTOMATICALLY_WHEN_ACQUIRED, true)
113
+ end
114
+ return result
115
+ end
48
116
  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
@@ -45,6 +45,8 @@ export declare class ItemType extends ObjectDataEntry<ItemTypeId> {
45
45
  set tooltipText(tooltipText: string);
46
46
  get tooltipExtendedText(): string;
47
47
  set tooltipExtendedText(tooltipText: string);
48
+ get cooldownGroupId(): number;
49
+ set cooldownGroupId(cooldownGroupId: number);
48
50
  get goldCost(): number;
49
51
  set goldCost(goldCost: number);
50
52
  get lumberCost(): number;
@@ -256,6 +256,19 @@ __TS__SetDescriptor(
256
256
  },
257
257
  true
258
258
  )
259
+ __TS__SetDescriptor(
260
+ ItemType.prototype,
261
+ "cooldownGroupId",
262
+ {
263
+ get = function(self)
264
+ return self:getObjectDataEntryIdField("icid")
265
+ end,
266
+ set = function(self, cooldownGroupId)
267
+ self:setObjectDataEntryIdField("icid", cooldownGroupId)
268
+ end
269
+ },
270
+ true
271
+ )
259
272
  __TS__SetDescriptor(
260
273
  ItemType.prototype,
261
274
  "goldCost",
@@ -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.1b0add9",
4
+ "version": "0.0.1-dev.1e33483",
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