warscript 0.0.1-dev.ee2345e → 0.0.1-dev.f48f7bb

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 (143) hide show
  1. package/attributes.d.ts +0 -1
  2. package/binaryreader.d.ts +1 -0
  3. package/binaryreader.lua +3 -0
  4. package/core/types/effect.d.ts +13 -3
  5. package/core/types/effect.lua +116 -17
  6. package/core/types/frame.d.ts +8 -1
  7. package/core/types/frame.lua +93 -1
  8. package/core/types/group.d.ts +0 -1
  9. package/core/types/image.d.ts +0 -1
  10. package/core/types/missile.d.ts +2 -2
  11. package/core/types/missile.lua +8 -2
  12. package/core/types/unit.lua +8 -0
  13. package/core/util.d.ts +1 -1
  14. package/core/util.lua +12 -0
  15. package/decl/index.d.ts +1 -0
  16. package/engine/ability.d.ts +1 -1
  17. package/engine/behavior.d.ts +10 -10
  18. package/engine/behavior.lua +6 -6
  19. package/engine/behaviour/ability/always-enabled.d.ts +7 -0
  20. package/engine/behaviour/ability/always-enabled.lua +31 -0
  21. package/engine/behaviour/ability/apply-buff.d.ts +3 -5
  22. package/engine/behaviour/ability/apply-unit-behavior.d.ts +6 -1
  23. package/engine/behaviour/ability/damage.d.ts +33 -11
  24. package/engine/behaviour/ability/damage.lua +89 -31
  25. package/engine/behaviour/ability/emulate-impact.d.ts +6 -0
  26. package/engine/behaviour/ability/emulate-impact.lua +28 -0
  27. package/engine/behaviour/ability/heal.d.ts +33 -6
  28. package/engine/behaviour/ability/heal.lua +89 -10
  29. package/engine/behaviour/ability/instant-impact.d.ts +2 -2
  30. package/engine/behaviour/ability/instant-impact.lua +4 -15
  31. package/engine/behaviour/ability/on-command-impact.d.ts +8 -0
  32. package/engine/behaviour/ability/on-command-impact.lua +25 -0
  33. package/engine/behaviour/ability/remove-buffs.d.ts +16 -0
  34. package/engine/behaviour/ability/remove-buffs.lua +28 -0
  35. package/engine/behaviour/ability/restore-mana.d.ts +15 -0
  36. package/engine/behaviour/ability/restore-mana.lua +29 -0
  37. package/engine/behaviour/ability.d.ts +21 -3
  38. package/engine/behaviour/ability.lua +120 -12
  39. package/engine/behaviour/unit/stun-immunity.d.ts +0 -1
  40. package/engine/behaviour/unit.d.ts +8 -2
  41. package/engine/behaviour/unit.lua +27 -0
  42. package/engine/buff.d.ts +68 -21
  43. package/engine/buff.lua +276 -90
  44. package/engine/game-map.d.ts +7 -0
  45. package/engine/game-map.lua +32 -0
  46. package/engine/internal/ability.d.ts +16 -13
  47. package/engine/internal/ability.lua +82 -76
  48. package/engine/internal/item/ability.lua +106 -0
  49. package/engine/internal/item+owner.lua +2 -2
  50. package/engine/internal/misc/ability-disable-counter.d.ts +2 -0
  51. package/engine/internal/misc/ability-disable-counter.lua +13 -0
  52. package/engine/internal/unit/ability.d.ts +10 -1
  53. package/engine/internal/unit/ability.lua +36 -14
  54. package/engine/internal/unit/bonus.d.ts +9 -8
  55. package/engine/internal/unit/bonus.lua +6 -1
  56. package/engine/internal/unit/ignore-events-items.d.ts +2 -0
  57. package/engine/internal/unit/ignore-events-items.lua +5 -0
  58. package/engine/internal/unit/item.d.ts +24 -0
  59. package/engine/internal/unit/item.lua +123 -0
  60. package/engine/internal/unit/main-selected.d.ts +13 -0
  61. package/engine/internal/unit/main-selected.lua +51 -0
  62. package/engine/internal/unit+ability.lua +2 -2
  63. package/engine/internal/unit+transport.lua +4 -10
  64. package/engine/internal/unit-missile-launch.lua +25 -6
  65. package/engine/internal/unit.d.ts +58 -16
  66. package/engine/internal/unit.lua +364 -132
  67. package/engine/internal/utility.lua +12 -0
  68. package/engine/local-client.d.ts +7 -2
  69. package/engine/local-client.lua +82 -0
  70. package/engine/object-data/auxiliary/attachment-preset.d.ts +0 -1
  71. package/engine/object-data/auxiliary/combat-classification.d.ts +0 -2
  72. package/engine/object-data/auxiliary/sound-preset-name.d.ts +5 -1
  73. package/engine/object-data/entry/ability-type/blank-configurable.d.ts +0 -1
  74. package/engine/object-data/entry/ability-type/blank-passive.d.ts +0 -1
  75. package/engine/object-data/entry/ability-type/channel.d.ts +0 -1
  76. package/engine/object-data/entry/ability-type/mine.d.ts +10 -0
  77. package/engine/object-data/entry/ability-type/mine.lua +39 -0
  78. package/engine/object-data/entry/ability-type/spirit-touch.d.ts +2 -2
  79. package/engine/object-data/entry/ability-type/spirit-touch.lua +6 -6
  80. package/engine/object-data/entry/ability-type.d.ts +0 -1
  81. package/engine/object-data/entry/ability-type.lua +8 -12
  82. package/engine/object-data/entry/buff-type/applicable.d.ts +0 -1
  83. package/engine/object-data/entry/buff-type/blank.d.ts +0 -1
  84. package/engine/object-data/entry/buff-type.d.ts +0 -1
  85. package/engine/object-data/entry/destructible-type.d.ts +0 -1
  86. package/engine/object-data/entry/item-type/blank.d.ts +0 -1
  87. package/engine/object-data/entry/item-type.d.ts +14 -1
  88. package/engine/object-data/entry/item-type.lua +91 -0
  89. package/engine/object-data/entry/lightning-type.d.ts +0 -1
  90. package/engine/object-data/entry/unit-type.d.ts +37 -2
  91. package/engine/object-data/entry/unit-type.lua +333 -49
  92. package/engine/object-data/entry/upgrade/blank.d.ts +0 -1
  93. package/engine/object-data/entry/upgrade.d.ts +0 -1
  94. package/engine/object-data/entry.d.ts +2 -3
  95. package/engine/object-data/utility/object-data-entry-id-generator.lua +7 -0
  96. package/engine/object-field/ability.d.ts +26 -3
  97. package/engine/object-field/ability.lua +54 -1
  98. package/engine/object-field.d.ts +2 -3
  99. package/engine/object-field.lua +4 -0
  100. package/engine/random.d.ts +1 -0
  101. package/engine/random.lua +9 -0
  102. package/engine/standard/entries/unit-type.d.ts +39 -1
  103. package/engine/standard/entries/unit-type.lua +39 -1
  104. package/engine/standard/fields/ability.d.ts +3 -1
  105. package/engine/standard/fields/ability.lua +3 -1
  106. package/engine/unit.d.ts +2 -0
  107. package/engine/unit.lua +11 -2
  108. package/event.d.ts +2 -3
  109. package/event.lua +9 -5
  110. package/index.d.ts +1 -0
  111. package/index.lua +1 -0
  112. package/lualib_bundle.lua +146 -42
  113. package/math/vec2.d.ts +2 -9
  114. package/math.d.ts +0 -2
  115. package/net/socket.d.ts +7 -1
  116. package/net/socket.lua +45 -4
  117. package/network.d.ts +1 -0
  118. package/network.lua +3 -2
  119. package/objutil/ability.d.ts +0 -1
  120. package/objutil/buff.d.ts +0 -1
  121. package/objutil/buff.lua +1 -1
  122. package/objutil/object.d.ts +0 -1
  123. package/objutil/unit.d.ts +0 -1
  124. package/package.json +13 -14
  125. package/patch-lua.d.ts +0 -0
  126. package/patch-lua.lua +10 -0
  127. package/property.d.ts +55 -0
  128. package/property.lua +374 -0
  129. package/string.d.ts +30 -0
  130. package/string.lua +14 -0
  131. package/util/stream.d.ts +0 -1
  132. package/utility/arrays.d.ts +11 -5
  133. package/utility/arrays.lua +34 -3
  134. package/utility/bit-set.d.ts +0 -2
  135. package/utility/lazy.d.ts +2 -0
  136. package/utility/lazy.lua +14 -0
  137. package/utility/linked-set.d.ts +11 -3
  138. package/utility/linked-set.lua +5 -2
  139. package/utility/lua-maps.d.ts +1 -2
  140. package/utility/lua-sets.d.ts +1 -2
  141. package/utility/types.d.ts +1 -0
  142. package/core/mapbounds.d.ts +0 -8
  143. package/core/mapbounds.lua +0 -12
@@ -2,7 +2,6 @@ local ____lualib = require("lualib_bundle")
2
2
  local __TS__ArrayMap = ____lualib.__TS__ArrayMap
3
3
  local __TS__ArrayFilter = ____lualib.__TS__ArrayFilter
4
4
  local __TS__Class = ____lualib.__TS__Class
5
- local __TS__New = ____lualib.__TS__New
6
5
  local __TS__ClassExtends = ____lualib.__TS__ClassExtends
7
6
  local __TS__InstanceOf = ____lualib.__TS__InstanceOf
8
7
  local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
@@ -11,7 +10,10 @@ local ____exports = {}
11
10
  local ____handle = require("core.types.handle")
12
11
  local Handle = ____handle.Handle
13
12
  local ____ability = require("engine.internal.item.ability")
13
+ local abilityActionDummy = ____ability.abilityActionDummy
14
14
  local doAbilityAction = ____ability.doAbilityAction
15
+ local doAbilityActionForceDummy = ____ability.doAbilityActionForceDummy
16
+ local startItemCooldown = ____ability.startItemCooldown
15
17
  local getUnitAbilityLevel = GetUnitAbilityLevel
16
18
  local setUnitAbilityLevel = SetUnitAbilityLevel
17
19
  local setAbilityIntegerField = BlzSetAbilityIntegerField
@@ -33,7 +35,9 @@ local getAbilityStringLevelField = BlzGetAbilityStringLevelField
33
35
  local getUnitAbilityCooldownRemaining = BlzGetUnitAbilityCooldownRemaining
34
36
  local startUnitAbilityCooldown = BlzStartUnitAbilityCooldown
35
37
  local getHandleId = GetHandleId
36
- local getItemAbility = BlzGetItemAbility
38
+ local getItemBooleanField = BlzGetItemBooleanField
39
+ local setItemBooleanField = BlzSetItemBooleanField
40
+ local unitHideAbility = BlzUnitHideAbility
37
41
  local match = string.match
38
42
  local ____type = _G.type
39
43
  local ____tostring = _G.tostring
@@ -151,55 +155,6 @@ local orders = postcompile(function()
151
155
  end
152
156
  return orders
153
157
  end)
154
- local RealFields = __TS__Class()
155
- RealFields.name = "RealFields"
156
- function RealFields.prototype.____constructor(self, handle)
157
- self.handle = handle
158
- end
159
- function RealFields.prototype.set(self, field, value)
160
- return BlzSetAbilityRealField(self.handle, field, value)
161
- end
162
- function RealFields.prototype.get(self, field)
163
- return BlzGetAbilityRealField(self.handle, field)
164
- end
165
- function RealFields.prototype.has(self, field)
166
- local handle = self.handle
167
- return BlzSetAbilityRealField(
168
- handle,
169
- field,
170
- BlzGetAbilityRealField(handle, field)
171
- )
172
- end
173
- local RealLevelFields = __TS__Class()
174
- RealLevelFields.name = "RealLevelFields"
175
- function RealLevelFields.prototype.____constructor(self, handle, level)
176
- self.handle = handle
177
- self.level = level
178
- end
179
- function RealLevelFields.prototype.set(self, field, value)
180
- return BlzSetAbilityRealLevelField(self.handle, field, self.level, value)
181
- end
182
- function RealLevelFields.prototype.get(self, field)
183
- return BlzGetAbilityRealLevelField(self.handle, field, self.level)
184
- end
185
- function RealLevelFields.prototype.has(self, field)
186
- local handle = self.handle
187
- return BlzSetAbilityRealLevelField(
188
- handle,
189
- field,
190
- 0,
191
- BlzGetAbilityRealLevelField(handle, field, 0)
192
- )
193
- end
194
- local realLevelMetatable = {__index = self}
195
- local levelDescriptors = {realFields = function(self, handle, level)
196
- return __TS__New(RealLevelFields, handle, level)
197
- end}
198
- local levelMetatable = {__index = function(self, key)
199
- local fields = levelDescriptors[key](levelDescriptors, self.handle, self.level)
200
- rawset(self, key, fields)
201
- return fields
202
- end}
203
158
  local fieldGetters = {
204
159
  abilityintegerfield = function(ability, field)
205
160
  return getAbilityIntegerField(ability.handle, field)
@@ -346,43 +301,26 @@ __TS__SetDescriptor(
346
301
  )
347
302
  __TS__SetDescriptor(
348
303
  Ability.prototype,
349
- "orderId",
304
+ "orderTypeStringId",
350
305
  {get = function(self)
351
306
  local field = orderIdFieldByParentTypeId[self.parentTypeId]
352
- return order2orderId(field ~= nil and getAbilityStringLevelField(self.handle, ABILITY_SLF_BASE_ORDER_ID_NCL6, self.level) or (orders[self.parentTypeId] or ""))
307
+ return field ~= nil and getAbilityStringLevelField(self.handle, field, self.level) or (orders[self.parentTypeId] or "")
353
308
  end},
354
309
  true
355
310
  )
356
311
  __TS__SetDescriptor(
357
312
  Ability.prototype,
358
- "realFields",
313
+ "orderTypeId",
359
314
  {get = function(self)
360
- local realFields = __TS__New(RealFields, self.handle)
361
- rawset(self, "realFields", realFields)
362
- return realFields
315
+ return order2orderId(self.orderTypeStringId)
363
316
  end},
364
317
  true
365
318
  )
366
319
  __TS__SetDescriptor(
367
320
  Ability.prototype,
368
- "levels",
321
+ "levelCount",
369
322
  {get = function(self)
370
- local handle = self.handle
371
- local levels = setmetatable(
372
- {},
373
- {
374
- __len = function(self)
375
- return BlzGetAbilityIntegerField(handle, ABILITY_IF_LEVELS)
376
- end,
377
- __index = function(self, i)
378
- local level = setmetatable({handle = handle, level = i - 1}, levelMetatable)
379
- self[i] = level
380
- return level
381
- end
382
- }
383
- )
384
- rawset(self, "levels", levels)
385
- return levels
323
+ return self:getField(ABILITY_IF_LEVELS)
386
324
  end},
387
325
  true
388
326
  )
@@ -393,6 +331,17 @@ __TS__SetDescriptor(
393
331
  end},
394
332
  true
395
333
  )
334
+ __TS__SetDescriptor(
335
+ Ability.prototype,
336
+ "cooldownRemaining",
337
+ {
338
+ get = function(self)
339
+ end,
340
+ set = function(self, cooldownRemaining)
341
+ end
342
+ },
343
+ true
344
+ )
396
345
  __TS__ObjectDefineProperty(
397
346
  Ability,
398
347
  "onCreate",
@@ -416,6 +365,8 @@ function UnrecognizedAbility.prototype.____constructor(self, typeId, owner)
416
365
  UnrecognizedAbility.____super.prototype.____constructor(self, nil, typeId)
417
366
  self.owner = owner
418
367
  end
368
+ function UnrecognizedAbility.prototype.interruptCast(self)
369
+ end
419
370
  __TS__SetDescriptor(
420
371
  UnrecognizedAbility.prototype,
421
372
  "level",
@@ -424,6 +375,18 @@ __TS__SetDescriptor(
424
375
  end},
425
376
  true
426
377
  )
378
+ __TS__SetDescriptor(
379
+ UnrecognizedAbility.prototype,
380
+ "cooldownRemaining",
381
+ {
382
+ get = function(self)
383
+ return 0
384
+ end,
385
+ set = function(self, _)
386
+ end
387
+ },
388
+ true
389
+ )
427
390
  ____exports.UnitAbility = __TS__Class()
428
391
  local UnitAbility = ____exports.UnitAbility
429
392
  UnitAbility.name = "UnitAbility"
@@ -433,6 +396,15 @@ function UnitAbility.prototype.____constructor(self, handle, typeId, owner)
433
396
  self.owner = owner
434
397
  self.u = owner.handle
435
398
  end
399
+ function UnitAbility.prototype.incrementHideCounter(self)
400
+ unitHideAbility(self.u, self.typeId, true)
401
+ end
402
+ function UnitAbility.prototype.decrementHideCounter(self)
403
+ unitHideAbility(self.u, self.typeId, false)
404
+ end
405
+ function UnitAbility.prototype.interruptCast(self)
406
+ self.owner:interruptCast(self.typeId)
407
+ end
436
408
  __TS__SetDescriptor(
437
409
  UnitAbility.prototype,
438
410
  "level",
@@ -453,8 +425,8 @@ __TS__SetDescriptor(
453
425
  get = function(self)
454
426
  return getUnitAbilityCooldownRemaining(self.u, self.typeId)
455
427
  end,
456
- set = function(self, v)
457
- startUnitAbilityCooldown(self.u, self.typeId, v)
428
+ set = function(self, cooldownRemaining)
429
+ startUnitAbilityCooldown(self.u, self.typeId, cooldownRemaining)
458
430
  end
459
431
  },
460
432
  true
@@ -479,6 +451,11 @@ end
479
451
  local function setAbilityField(_, ability, field, levelOrValue, value)
480
452
  return ____exports.Ability.prototype.setField(ability, field, levelOrValue, value)
481
453
  end
454
+ local function getAbilityCooldown(_, abilityTypeId)
455
+ return getUnitAbilityCooldownRemaining(abilityActionDummy, abilityTypeId)
456
+ end
457
+ local function doNothing()
458
+ end
482
459
  ____exports.ItemAbility = __TS__Class()
483
460
  local ItemAbility = ____exports.ItemAbility
484
461
  ItemAbility.name = "ItemAbility"
@@ -506,6 +483,14 @@ function ItemAbility.prototype.setField(self, field, levelOrValue, value)
506
483
  value
507
484
  )
508
485
  end
486
+ function ItemAbility.prototype.interruptCast(self)
487
+ local handle = self.owner.handle
488
+ local activelyUsed = getItemBooleanField(handle, ITEM_BF_ACTIVELY_USED)
489
+ if activelyUsed then
490
+ setItemBooleanField(handle, ITEM_BF_ACTIVELY_USED, false)
491
+ setItemBooleanField(handle, ITEM_BF_ACTIVELY_USED, true)
492
+ end
493
+ end
509
494
  __TS__SetDescriptor(
510
495
  ItemAbility.prototype,
511
496
  "level",
@@ -514,6 +499,27 @@ __TS__SetDescriptor(
514
499
  end},
515
500
  true
516
501
  )
502
+ __TS__SetDescriptor(
503
+ ItemAbility.prototype,
504
+ "cooldownRemaining",
505
+ {
506
+ get = function(self)
507
+ local item = self.owner
508
+ local ____doAbilityActionForceDummy_4 = doAbilityActionForceDummy
509
+ local ____item_handle_3 = item.handle
510
+ local ____opt_1 = item.owner
511
+ return ____doAbilityActionForceDummy_4(____item_handle_3, ____opt_1 and ____opt_1.handle, getAbilityCooldown, self.typeId)
512
+ end,
513
+ set = function(self, cooldownRemaining)
514
+ local item = self.owner
515
+ local ____startItemCooldown_8 = startItemCooldown
516
+ local ____item_handle_7 = item.handle
517
+ local ____opt_5 = item.owner
518
+ ____startItemCooldown_8(____item_handle_7, ____opt_5 and ____opt_5.handle, cooldownRemaining)
519
+ end
520
+ },
521
+ true
522
+ )
517
523
  __TS__ObjectDefineProperty(
518
524
  ItemAbility,
519
525
  "onCreate",
@@ -1,16 +1,59 @@
1
1
  local ____exports = {}
2
+ local restoreCooldownGroup
2
3
  local ____player = require("core.types.player")
3
4
  local Player = ____player.Player
4
5
  local ____dummy = require("objutil.dummy")
5
6
  local dummyUnitId = ____dummy.dummyUnitId
7
+ local ____utility = require("engine.internal.utility")
8
+ local findUnitItemSlot = ____utility.findUnitItemSlot
9
+ local ____blank = require("engine.object-data.entry.item-type.blank")
10
+ local BlankItemType = ____blank.BlankItemType
11
+ local ____object_2Ddata_2Dentry_2Did_2Dgenerator = require("engine.object-data.utility.object-data-entry-id-generator")
12
+ local abilityTypeIdGenerator = ____object_2Ddata_2Dentry_2Did_2Dgenerator.abilityTypeIdGenerator
13
+ local ____math = require("math")
14
+ local MINIMUM_POSITIVE_NORMALIZED_FLOAT = ____math.MINIMUM_POSITIVE_NORMALIZED_FLOAT
15
+ local ____timer = require("core.types.timer")
16
+ local Timer = ____timer.Timer
17
+ local ____ignore_2Devents_2Ditems = require("engine.internal.unit.ignore-events-items")
18
+ local ignoreEventsItems = ____ignore_2Devents_2Ditems.ignoreEventsItems
6
19
  local isItemOwned = IsItemOwned
7
20
  local isItemPowerup = IsItemPowerup
8
21
  local getItemX = GetItemX
9
22
  local getItemY = GetItemY
23
+ local setAbilityRealLevelField = BlzSetAbilityRealLevelField
24
+ local setItemIntegerField = BlzSetItemIntegerField
25
+ local getItemIntegerField = BlzGetItemIntegerField
10
26
  local setItemBooleanField = BlzSetItemBooleanField
11
27
  local setItemPosition = SetItemPosition
12
28
  local unitAddItem = UnitAddItem
29
+ local unitDropItemSlot = UnitDropItemSlot
13
30
  local unitRemoveItem = UnitRemoveItem
31
+ local unitUseItem = UnitUseItem
32
+ local unitResetCooldown = UnitResetCooldown
33
+ local COOLDOWN_STARTER_ABILITY_TYPE_ID = compiletime(function()
34
+ if not currentMap then
35
+ return 0
36
+ end
37
+ local abilityType = currentMap.objects.ability:newObject(
38
+ util.id2s(abilityTypeIdGenerator:next()),
39
+ "Absk"
40
+ )
41
+ abilityType["bsk1+0"] = 0
42
+ abilityType["bsk2+0"] = 0
43
+ abilityType["bsk3+0"] = 0
44
+ abilityType["amcs+0"] = 0
45
+ abilityType["adur+0"] = MINIMUM_POSITIVE_NORMALIZED_FLOAT
46
+ abilityType["ahdu+0"] = MINIMUM_POSITIVE_NORMALIZED_FLOAT
47
+ return util.s2id(abilityType.id)
48
+ end)
49
+ local COOLDOWN_STARTER_ITEM_TYPE_ID = compiletime(function()
50
+ local itemType = BlankItemType:create()
51
+ itemType.name = "[Warscript/Dummy] Item Cooldown Starter"
52
+ itemType.abilityTypeIds = {COOLDOWN_STARTER_ABILITY_TYPE_ID}
53
+ itemType.cooldownGroupId = COOLDOWN_STARTER_ABILITY_TYPE_ID
54
+ itemType.activelyUsed = true
55
+ return itemType.id
56
+ end)
14
57
  local dummy = assert(CreateUnit(
15
58
  Player.neutralVictim.handle,
16
59
  dummyUnitId,
@@ -18,10 +61,37 @@ local dummy = assert(CreateUnit(
18
61
  0,
19
62
  270
20
63
  ))
64
+ local cooldownStarterItem = UnitAddItemById(dummy, COOLDOWN_STARTER_ITEM_TYPE_ID)
65
+ local cooldownStarterAbility = BlzGetItemAbility(cooldownStarterItem, COOLDOWN_STARTER_ABILITY_TYPE_ID)
21
66
  ShowUnit(dummy, false)
67
+ local function startItemCooldownInternal(handle, cooldown)
68
+ local cooldownGroup = getItemIntegerField(handle, ITEM_IF_COOLDOWN_GROUP)
69
+ setItemIntegerField(handle, ITEM_IF_COOLDOWN_GROUP, COOLDOWN_STARTER_ABILITY_TYPE_ID)
70
+ setAbilityRealLevelField(cooldownStarterAbility, ABILITY_RLF_COOLDOWN, 0, cooldown)
71
+ unitResetCooldown(dummy)
72
+ unitUseItem(dummy, cooldownStarterItem)
73
+ Timer:run(restoreCooldownGroup, handle, cooldownGroup)
74
+ end
75
+ restoreCooldownGroup = function(handle, cooldownGroup)
76
+ if getItemIntegerField(handle, ITEM_IF_COOLDOWN_GROUP) == COOLDOWN_STARTER_ABILITY_TYPE_ID then
77
+ setItemIntegerField(handle, ITEM_IF_COOLDOWN_GROUP, cooldownGroup)
78
+ end
79
+ end
80
+ ---
81
+ -- @internal For use by internal systems only.
82
+ ____exports.startItemCooldown = function(handle, owner, cooldown)
83
+ ____exports.doAbilityActionForceDummy(handle, owner, startItemCooldownInternal, cooldown)
84
+ end
85
+ ---
86
+ -- @internal For use by internal systems only.
87
+ ____exports.abilityActionDummy = dummy
22
88
  ---
23
89
  -- @internal For use by internal systems only.
24
90
  ____exports.doAbilityAction = function(handle, action, ...)
91
+ local isAlreadyIgnoredInEvents = ignoreEventsItems[handle] ~= nil
92
+ if not isAlreadyIgnoredInEvents then
93
+ ignoreEventsItems[handle] = true
94
+ end
25
95
  local isOwned = isItemOwned(handle)
26
96
  local isPowerup
27
97
  local x
@@ -43,6 +113,42 @@ ____exports.doAbilityAction = function(handle, action, ...)
43
113
  setItemBooleanField(handle, ITEM_BF_USE_AUTOMATICALLY_WHEN_ACQUIRED, true)
44
114
  end
45
115
  end
116
+ if not isAlreadyIgnoredInEvents then
117
+ ignoreEventsItems[handle] = nil
118
+ end
119
+ return result
120
+ end
121
+ ---
122
+ -- @internal For use by internal systems only.
123
+ ____exports.doAbilityActionForceDummy = function(handle, owner, action, ...)
124
+ if owner == nil then
125
+ return ____exports.doAbilityAction(handle, action, ...)
126
+ end
127
+ local slot = findUnitItemSlot(owner, handle)
128
+ if slot == nil then
129
+ return ____exports.doAbilityAction(handle, action, ...)
130
+ end
131
+ local isAlreadyIgnoredInEvents = ignoreEventsItems[handle] ~= nil
132
+ if not isAlreadyIgnoredInEvents then
133
+ ignoreEventsItems[handle] = true
134
+ end
135
+ local isPowerup
136
+ if isItemPowerup(handle) then
137
+ setItemBooleanField(handle, ITEM_BF_USE_AUTOMATICALLY_WHEN_ACQUIRED, false)
138
+ isPowerup = true
139
+ end
140
+ unitRemoveItem(owner, handle)
141
+ unitAddItem(dummy, handle)
142
+ local result = action(handle, ...)
143
+ unitRemoveItem(dummy, handle)
144
+ unitAddItem(owner, handle)
145
+ unitDropItemSlot(owner, handle, slot)
146
+ if isPowerup then
147
+ setItemBooleanField(handle, ITEM_BF_USE_AUTOMATICALLY_WHEN_ACQUIRED, true)
148
+ end
149
+ if not isAlreadyIgnoredInEvents then
150
+ ignoreEventsItems[handle] = nil
151
+ end
46
152
  return result
47
153
  end
48
154
  return ____exports
@@ -6,10 +6,10 @@ local Item = ____item.Item
6
6
  local ____unit = require("engine.internal.unit")
7
7
  local Unit = ____unit.Unit
8
8
  local ownerByItem = setmetatable({}, {__mode = "kv"})
9
- Unit.onItemPickup:addListener(function(unit, item)
9
+ Unit.itemPickedUpEvent:addListener(function(unit, item)
10
10
  ownerByItem[item] = unit
11
11
  end)
12
- Unit.onItemDrop:addListener(function(unit, item)
12
+ Unit.itemDroppedEvent:addListener(function(unit, item)
13
13
  ownerByItem[item] = nil
14
14
  end)
15
15
  __TS__ObjectDefineProperty(
@@ -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,11 +33,10 @@ local getSpellTargetUnit = GetSpellTargetUnit
26
33
  local getSpellTargetX = GetSpellTargetX
27
34
  local getSpellTargetY = GetSpellTargetY
28
35
  local getTriggerUnit = GetTriggerUnit
29
- local getUnitAbility = BlzGetUnitAbility
30
- local unitAddAbility = UnitAddAbility
36
+ local triggerAddCondition = TriggerAddCondition
37
+ local triggerRegisterCommandEvent = TriggerRegisterCommandEvent
31
38
  local unitInventorySize = UnitInventorySize
32
39
  local unitItemInSlot = UnitItemInSlot
33
- local unitRemoveAbility = UnitRemoveAbility
34
40
  local function retrieveAbility(unit, ability, abilityId)
35
41
  if ability == nil then
36
42
  return __TS__New(
@@ -39,17 +45,6 @@ local function retrieveAbility(unit, ability, abilityId)
39
45
  Unit:of(unit)
40
46
  )
41
47
  end
42
- if not unitAddAbility(unit, abilityId) then
43
- if getUnitAbility(unit, abilityId) == ability then
44
- return UnitAbility:of(
45
- ability,
46
- abilityId,
47
- Unit:of(unit)
48
- )
49
- end
50
- else
51
- unitRemoveAbility(unit, abilityId)
52
- end
53
48
  for i = 0, unitInventorySize(unit) - 1 do
54
49
  local item = unitItemInSlot(unit, i)
55
50
  if getItemAbility(item, abilityId) == ability then
@@ -366,4 +361,31 @@ rawset(
366
361
  extractAbilityTypeId
367
362
  )
368
363
  )
364
+ rawset(
365
+ Unit,
366
+ "abilityCommandEvent",
367
+ lazyRecord(function(abilityTypeId)
368
+ return lazyRecord(function(orderTypeStringId)
369
+ return __TS__New(
370
+ InitializingEvent,
371
+ function(event)
372
+ local trigger = createTrigger()
373
+ triggerRegisterCommandEvent(trigger, abilityTypeId, orderTypeStringId)
374
+ triggerAddCondition(
375
+ trigger,
376
+ condition(function()
377
+ local unit = Unit:of(getTriggerUnit())
378
+ if unit ~= nil then
379
+ local ability = unit:getAbilityById(abilityTypeId)
380
+ if ability ~= nil then
381
+ eventInvoke(event, unit, ability, orderTypeStringId)
382
+ end
383
+ end
384
+ end)
385
+ )
386
+ end
387
+ )
388
+ end)
389
+ end)
390
+ )
369
391
  return ____exports
@@ -1,4 +1,3 @@
1
- /// <reference types="@typescript-to-lua/language-extensions" />
2
1
  /** @noSelfInFile */
3
2
  import { Unit } from "../unit";
4
3
  import { AbilityTypeId } from "../../object-data/entry/ability-type";
@@ -9,7 +8,8 @@ export type UnitBonusId<Brand extends string = any> = number & {
9
8
  export type UnitArmorBonusId = UnitBonusId<"armor">;
10
9
  export type UnitAttackSpeedFactorBonusId = UnitBonusId<"attackSpeedFactor">;
11
10
  export type UnitMovementSpeedFactorBonusId = UnitBonusId<"movementSpeedFactor">;
12
- export type UnitDamageBonusId = UnitBonusId<"damage">;
11
+ export type UnitAutoAttackDamageBonusId = UnitBonusId<"autoAttackDamage">;
12
+ export type UnitDamageFactorBonusId = UnitBonusId<"damageFactor">;
13
13
  export type UnitReceivedDamageFactorBonusId = UnitBonusId<"receivedDamageFactor">;
14
14
  export type UnitBonusType<Id extends UnitBonusId = UnitBonusId> = ({
15
15
  abilityTypeId: AbilityTypeId;
@@ -31,11 +31,12 @@ export declare namespace UnitBonusType {
31
31
  const ARMOR: UnitBonusType<UnitArmorBonusId>;
32
32
  const ATTACK_SPEED_FACTOR: UnitBonusType<UnitAttackSpeedFactorBonusId>;
33
33
  const MOVEMENT_SPEED_FACTOR: UnitBonusType<UnitAttackSpeedFactorBonusId>;
34
- const DAMAGE: UnitBonusType<UnitDamageBonusId>;
34
+ const AUTO_ATTACK_DAMAGE: UnitBonusType<UnitAutoAttackDamageBonusId>;
35
+ const DAMAGE_FACTOR: UnitBonusType<UnitReceivedDamageFactorBonusId>;
35
36
  const RECEIVED_DAMAGE_FACTOR: UnitBonusType<UnitReceivedDamageFactorBonusId>;
36
37
  }
37
- export declare const addUnitBonus: <Id extends UnitBonusId<any>>(unit: Unit, bonusType: UnitBonusType<Id>, value: number) => Id;
38
- export declare const removeUnitBonus: <Id extends UnitBonusId<any>>(unit: Unit, bonusType: UnitBonusType<Id>, id: Id) => boolean;
39
- export declare const updateUnitBonus: <Id extends UnitBonusId<any>>(unit: Unit, bonusType: UnitBonusType<Id>, id: Id, value: number) => boolean;
40
- export declare const addOrUpdateOrRemoveUnitBonus: <Id extends UnitBonusId<any>>(unit: Unit, bonusType: UnitBonusType<Id>, id: Id | undefined, value: number) => Id | undefined;
41
- export declare const getUnitBonus: <Id extends UnitBonusId<any>>(unit: Unit, bonusType: UnitBonusType<Id>, id: Id) => number;
38
+ export declare const addUnitBonus: <Id extends UnitBonusId>(unit: Unit, bonusType: UnitBonusType<Id>, value: number) => Id;
39
+ export declare const removeUnitBonus: <Id extends UnitBonusId>(unit: Unit, bonusType: UnitBonusType<Id>, id: Id) => boolean;
40
+ export declare const updateUnitBonus: <Id extends UnitBonusId>(unit: Unit, bonusType: UnitBonusType<Id>, id: Id, value: number) => boolean;
41
+ export declare const addOrUpdateOrRemoveUnitBonus: <Id extends UnitBonusId>(unit: Unit, bonusType: UnitBonusType<Id>, id: Id | undefined, value: number) => Id | undefined;
42
+ export declare const getUnitBonus: <Id extends UnitBonusId>(unit: Unit, bonusType: UnitBonusType<Id>, id: Id) => number;
@@ -21,6 +21,7 @@ local AUTO_ATTACK_DAMAGE_INCREASE_DUMMY_ABILITY_TYPE_ID = ____auto_2Dattack_2Dda
21
21
  local ____movement_2Dspeed_2Dincrease_2Dfactor = require("engine.internal.object-data.movement-speed-increase-factor")
22
22
  local MOVEMENT_SPEED_INCREASE_FACTOR_ABILITY_FIELD = ____movement_2Dspeed_2Dincrease_2Dfactor.MOVEMENT_SPEED_INCREASE_FACTOR_ABILITY_FIELD
23
23
  local MOVEMENT_SPEED_INCREASE_FACTOR_DUMMY_ABILITY_TYPE_ID = ____movement_2Dspeed_2Dincrease_2Dfactor.MOVEMENT_SPEED_INCREASE_FACTOR_DUMMY_ABILITY_TYPE_ID
24
+ local damageFactorByUnit = {}
24
25
  local receivedDamageFactorByUnit = {}
25
26
  ____exports.UnitBonusType = {}
26
27
  local UnitBonusType = ____exports.UnitBonusType
@@ -46,13 +47,14 @@ do
46
47
  reduce = sum,
47
48
  initialValue = 0
48
49
  }
49
- UnitBonusType.DAMAGE = {
50
+ UnitBonusType.AUTO_ATTACK_DAMAGE = {
50
51
  abilityTypeId = AUTO_ATTACK_DAMAGE_INCREASE_DUMMY_ABILITY_TYPE_ID,
51
52
  field = AUTO_ATTACK_DAMAGE_INCREASE_ABILITY_FIELD,
52
53
  integer = false,
53
54
  reduce = sum,
54
55
  initialValue = 0
55
56
  }
57
+ UnitBonusType.DAMAGE_FACTOR = {reduce = product, valueByUnit = damageFactorByUnit, initialValue = 1}
56
58
  UnitBonusType.RECEIVED_DAMAGE_FACTOR = {reduce = product, valueByUnit = receivedDamageFactorByUnit, initialValue = 1}
57
59
  end
58
60
  local bonusesByUnitByBonusType = {}
@@ -180,6 +182,9 @@ end
180
182
  Unit.onDamage:addListener(
181
183
  4,
182
184
  function(source, target, event)
185
+ if source ~= nil and damageFactorByUnit[source] ~= nil then
186
+ event.amount = event.amount * damageFactorByUnit[source]
187
+ end
183
188
  if receivedDamageFactorByUnit[target] ~= nil then
184
189
  event.amount = event.amount * receivedDamageFactorByUnit[target]
185
190
  end
@@ -0,0 +1,2 @@
1
+ /** @noSelfInFile */
2
+ export {};
@@ -0,0 +1,5 @@
1
+ local ____exports = {}
2
+ ---
3
+ -- @internal For use by internal systems only.
4
+ ____exports.ignoreEventsItems = {}
5
+ return ____exports
@@ -0,0 +1,24 @@
1
+ /** @noSelfInFile */
2
+ import { Item } from "../item";
3
+ export interface UnitItems extends ReadonlyArray<Item | undefined> {
4
+ readonly length: 0 | 1 | 2 | 3 | 4 | 5 | 6;
5
+ [0]: Item | undefined;
6
+ [1]: Item | undefined;
7
+ [2]: Item | undefined;
8
+ [3]: Item | undefined;
9
+ [4]: Item | undefined;
10
+ [5]: Item | undefined;
11
+ }
12
+ export declare class UnitItems {
13
+ constructor(handle: junit);
14
+ findSlot(item: Item): 0 | 1 | 2 | 3 | 4 | 5 | undefined;
15
+ protected __newindex(slot: number, item: Item | undefined): void;
16
+ protected __index(key: string | number): unknown;
17
+ protected __len(): number;
18
+ protected __ipairs(): LuaIterator<LuaMultiReturn<[number, Item | undefined]>, junit>;
19
+ }
20
+ declare module "../unit" {
21
+ interface Unit {
22
+ readonly items: UnitItems;
23
+ }
24
+ }