warscript 0.0.1-dev.b026cc2 → 0.0.1-dev.b37c533

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 (78) hide show
  1. package/core/types/effect.d.ts +13 -3
  2. package/core/types/effect.lua +116 -17
  3. package/core/types/frame.d.ts +6 -0
  4. package/core/types/frame.lua +89 -1
  5. package/core/util.d.ts +1 -1
  6. package/core/util.lua +12 -0
  7. package/engine/behavior.d.ts +2 -2
  8. package/engine/behavior.lua +6 -6
  9. package/engine/behaviour/ability/always-enabled.d.ts +7 -0
  10. package/engine/behaviour/ability/always-enabled.lua +31 -0
  11. package/engine/behaviour/ability/apply-buff.d.ts +3 -5
  12. package/engine/behaviour/ability/emulate-impact.d.ts +6 -0
  13. package/engine/behaviour/ability/emulate-impact.lua +28 -0
  14. package/engine/behaviour/ability/instant-impact.d.ts +2 -2
  15. package/engine/behaviour/ability/instant-impact.lua +4 -19
  16. package/engine/behaviour/ability/on-command-impact.d.ts +8 -0
  17. package/engine/behaviour/ability/on-command-impact.lua +25 -0
  18. package/engine/behaviour/ability/remove-buffs.d.ts +16 -0
  19. package/engine/behaviour/ability/remove-buffs.lua +28 -0
  20. package/engine/behaviour/ability.d.ts +14 -3
  21. package/engine/behaviour/ability.lua +79 -33
  22. package/engine/behaviour/unit.d.ts +5 -0
  23. package/engine/behaviour/unit.lua +20 -0
  24. package/engine/buff.d.ts +38 -12
  25. package/engine/buff.lua +171 -79
  26. package/engine/internal/ability.d.ts +16 -13
  27. package/engine/internal/ability.lua +82 -76
  28. package/engine/internal/item/ability.lua +106 -0
  29. package/engine/internal/item+owner.lua +2 -2
  30. package/engine/internal/misc/ability-disable-counter.d.ts +2 -0
  31. package/engine/internal/misc/ability-disable-counter.lua +13 -0
  32. package/engine/internal/unit/ability.d.ts +10 -1
  33. package/engine/internal/unit/ability.lua +36 -14
  34. package/engine/internal/unit/bonus.d.ts +4 -2
  35. package/engine/internal/unit/bonus.lua +6 -1
  36. package/engine/internal/unit/ignore-events-items.d.ts +2 -0
  37. package/engine/internal/unit/ignore-events-items.lua +5 -0
  38. package/engine/internal/unit/item.d.ts +24 -0
  39. package/engine/internal/unit/item.lua +128 -0
  40. package/engine/internal/unit/main-selected.d.ts +13 -0
  41. package/engine/internal/unit/main-selected.lua +51 -0
  42. package/engine/internal/unit+ability.lua +2 -2
  43. package/engine/internal/unit-missile-launch.lua +24 -5
  44. package/engine/internal/unit.d.ts +25 -10
  45. package/engine/internal/unit.lua +153 -81
  46. package/engine/internal/utility.lua +12 -0
  47. package/engine/local-client.d.ts +7 -2
  48. package/engine/local-client.lua +82 -0
  49. package/engine/object-data/auxiliary/sound-preset-name.d.ts +5 -1
  50. package/engine/object-data/entry/ability-type.lua +8 -12
  51. package/engine/object-data/entry/item-type.d.ts +14 -0
  52. package/engine/object-data/entry/item-type.lua +91 -0
  53. package/engine/object-data/utility/object-data-entry-id-generator.lua +7 -0
  54. package/engine/object-field/ability.d.ts +26 -3
  55. package/engine/object-field/ability.lua +54 -1
  56. package/engine/object-field.d.ts +2 -2
  57. package/engine/object-field.lua +4 -0
  58. package/engine/standard/fields/ability.d.ts +2 -0
  59. package/engine/standard/fields/ability.lua +2 -0
  60. package/engine/unit.d.ts +2 -0
  61. package/engine/unit.lua +2 -0
  62. package/index.d.ts +1 -0
  63. package/index.lua +1 -0
  64. package/net/socket.d.ts +7 -1
  65. package/net/socket.lua +45 -4
  66. package/network.d.ts +1 -0
  67. package/network.lua +3 -2
  68. package/objutil/buff.lua +1 -1
  69. package/package.json +1 -1
  70. package/patch-lua.d.ts +0 -0
  71. package/patch-lua.lua +10 -0
  72. package/utility/arrays.d.ts +8 -1
  73. package/utility/arrays.lua +34 -3
  74. package/utility/lazy.d.ts +2 -0
  75. package/utility/lazy.lua +14 -0
  76. package/utility/linked-set.d.ts +11 -2
  77. package/utility/linked-set.lua +5 -2
  78. package/utility/types.d.ts +1 -0
@@ -51,6 +51,8 @@ local ____arrays = require("utility.arrays")
51
51
  local forEach = ____arrays.forEach
52
52
  local ____math = require("math")
53
53
  local min = ____math.min
54
+ local ____ignore_2Devents_2Ditems = require("engine.internal.unit.ignore-events-items")
55
+ local ignoreEventsItems = ____ignore_2Devents_2Ditems.ignoreEventsItems
54
56
  local match = string.match
55
57
  local ____tostring = _G.tostring
56
58
  local setUnitAnimation = SetUnitAnimation
@@ -562,17 +564,6 @@ local function retrieveAbility(unit, ability, abilityId)
562
564
  ____exports.Unit:of(unit)
563
565
  )
564
566
  end
565
- if not unitAddAbility(unit, abilityId) then
566
- if getUnitAbility(unit, abilityId) == ability then
567
- return UnitAbility:of(
568
- ability,
569
- abilityId,
570
- ____exports.Unit:of(unit)
571
- )
572
- end
573
- else
574
- unitRemoveAbility(unit, abilityId)
575
- end
576
567
  for i = 0, unitInventorySize(unit) - 1 do
577
568
  local item = unitItemInSlot(unit, i)
578
569
  if getItemAbility(item, abilityId) == ability then
@@ -630,15 +621,15 @@ for ____, player in ipairs(Player.all) do
630
621
  dummies[player] = dummy
631
622
  end
632
623
  local function delayHealthChecksCallback(unit)
633
- local counter = (unit[102] or 0) - 1
624
+ local counter = (unit[103] or 0) - 1
634
625
  if counter ~= 0 then
635
- unit[102] = counter
626
+ unit[103] = counter
636
627
  return
637
628
  end
638
- unit[102] = nil
639
- local healthBonus = unit[103]
629
+ unit[103] = nil
630
+ local healthBonus = unit[104]
640
631
  if healthBonus ~= nil then
641
- unit[103] = nil
632
+ unit[104] = nil
642
633
  local handle = unit.handle
643
634
  BlzSetUnitMaxHP(
644
635
  handle,
@@ -646,12 +637,17 @@ local function delayHealthChecksCallback(unit)
646
637
  )
647
638
  end
648
639
  end
640
+ local nextSyncId = 1
641
+ local unitBySyncId = setmetatable({}, {__mode = "k"})
649
642
  ____exports.Unit = __TS__Class()
650
643
  local Unit = ____exports.Unit
651
644
  Unit.name = "Unit"
652
645
  __TS__ClassExtends(Unit, Handle)
653
646
  function Unit.prototype.____constructor(self, handle)
654
647
  Handle.prototype.____constructor(self, handle)
648
+ local ____nextSyncId_0 = nextSyncId
649
+ nextSyncId = ____nextSyncId_0 + 1
650
+ self.syncId = ____nextSyncId_0
655
651
  self._owner = Player:of(getOwningPlayer(handle))
656
652
  assert(unitAddAbility(handle, leaveDetectAbilityId) and UnitMakeAbilityPermanent(handle, true, leaveDetectAbilityId))
657
653
  assert(unitAddAbility(handle, morphDetectAbilityId))
@@ -664,6 +660,7 @@ function Unit.prototype.____constructor(self, handle)
664
660
  fourCC("Amrf")
665
661
  ))
666
662
  end
663
+ unitBySyncId[self.syncId] = self
667
664
  local ____ = self.abilities
668
665
  end
669
666
  function Unit.prototype.getEvent(self, event, collector)
@@ -749,8 +746,8 @@ function Unit.prototype.addModifier(self, property, modifier)
749
746
  end}
750
747
  end
751
748
  function Unit.prototype.hasCombatClassification(self, combatClassification)
752
- local ____combatClassification_0 = combatClassification
753
- return getUnitIntegerField(self.handle, UNIT_IF_TARGETED_AS) & ____combatClassification_0 == ____combatClassification_0
749
+ local ____combatClassification_1 = combatClassification
750
+ return getUnitIntegerField(self.handle, UNIT_IF_TARGETED_AS) & ____combatClassification_1 == ____combatClassification_1
754
751
  end
755
752
  function Unit.prototype.addClassification(self, classification)
756
753
  return unitAddType(self.handle, classification)
@@ -768,13 +765,13 @@ function Unit.prototype.isInvisibleTo(self, player)
768
765
  return isUnitInvisible(self.handle, player.handle)
769
766
  end
770
767
  function Unit.prototype.isInRangeOf(self, x, y, range)
771
- local ____temp_1
768
+ local ____temp_2
772
769
  if type(x) == "number" then
773
- ____temp_1 = isUnitInRangeXY(self.handle, x, y, range)
770
+ ____temp_2 = isUnitInRangeXY(self.handle, x, y, range)
774
771
  else
775
- ____temp_1 = isUnitInRange(self.handle, x.handle, y)
772
+ ____temp_2 = isUnitInRange(self.handle, x.handle, y)
776
773
  end
777
- return ____temp_1
774
+ return ____temp_2
778
775
  end
779
776
  function Unit.prototype.isAllyOf(self, unit)
780
777
  return isUnitAlly(
@@ -801,7 +798,7 @@ function Unit.prototype.queueAnimation(self, animation)
801
798
  queueUnitAnimation(self.handle, animation)
802
799
  end
803
800
  function Unit.prototype.delayHealthChecks(self)
804
- self[102] = (self[102] or 0) + 1
801
+ self[103] = (self[103] or 0) + 1
805
802
  Timer:run(delayHealthChecksCallback, self)
806
803
  end
807
804
  function Unit.prototype.setPosition(self, x, y)
@@ -818,14 +815,14 @@ function Unit.prototype.kill(self)
818
815
  killUnit(self.handle)
819
816
  end
820
817
  function Unit.prototype.revive(self, x, y, doEffect)
821
- local ____ReviveHero_4 = ReviveHero
822
- local ____array_3 = __TS__SparseArrayNew(self.handle, x, y)
823
- local ____doEffect_2 = doEffect
824
- if ____doEffect_2 == nil then
825
- ____doEffect_2 = false
818
+ local ____ReviveHero_5 = ReviveHero
819
+ local ____array_4 = __TS__SparseArrayNew(self.handle, x, y)
820
+ local ____doEffect_3 = doEffect
821
+ if ____doEffect_3 == nil then
822
+ ____doEffect_3 = false
826
823
  end
827
- __TS__SparseArrayPush(____array_3, ____doEffect_2)
828
- ____ReviveHero_4(__TS__SparseArraySpread(____array_3))
824
+ __TS__SparseArrayPush(____array_4, ____doEffect_3)
825
+ ____ReviveHero_5(__TS__SparseArraySpread(____array_4))
829
826
  end
830
827
  function Unit.prototype.healTarget(self, target, amount)
831
828
  if __TS__InstanceOf(target, ____exports.Unit) and target:hasAbility(fourCC("BIhm")) then
@@ -865,7 +862,7 @@ function Unit.prototype.dropItemSlot(self, item, slot)
865
862
  return UnitDropItemSlot(self.handle, item.handle, slot)
866
863
  end
867
864
  function Unit.prototype.itemInSlot(self, slot)
868
- return Item:of(UnitItemInSlot(self.handle, slot))
865
+ return Item:of(unitItemInSlot(self.handle, slot))
869
866
  end
870
867
  function Unit.prototype.addAbility(self, abilityId)
871
868
  if unitAddAbility(self.handle, abilityId) then
@@ -934,8 +931,15 @@ function Unit.prototype.interruptAttack(self)
934
931
  unitInterruptAttack(self.handle)
935
932
  end
936
933
  function Unit.prototype.interruptCast(self, abilityId)
937
- unitDisableAbility(self.handle, abilityId, true, false)
938
- unitDisableAbility(self.handle, abilityId, false, false)
934
+ local handle = self.handle
935
+ unitDisableAbility(handle, abilityId, true, false)
936
+ Timer:run(
937
+ unitDisableAbility,
938
+ handle,
939
+ abilityId,
940
+ false,
941
+ false
942
+ )
939
943
  end
940
944
  function Unit.prototype.getDistanceTo(self, target)
941
945
  local handle = self.handle
@@ -995,18 +999,18 @@ function Unit.prototype.unpauseEx(self)
995
999
  self:decrementStunCounter()
996
1000
  end
997
1001
  function Unit.prototype.incrementStunCounter(self)
998
- local stunCounter = self[101] or 0
999
- if not self[100] or stunCounter >= 0 then
1002
+ local stunCounter = self[102] or 0
1003
+ if not self[101] or stunCounter >= 0 then
1000
1004
  BlzPauseUnitEx(self.handle, true)
1001
1005
  end
1002
- self[101] = stunCounter + 1
1006
+ self[102] = stunCounter + 1
1003
1007
  end
1004
1008
  function Unit.prototype.decrementStunCounter(self)
1005
- local stunCounter = self[101] or 0
1006
- if not self[100] or stunCounter >= 1 then
1009
+ local stunCounter = self[102] or 0
1010
+ if not self[101] or stunCounter >= 1 then
1007
1011
  BlzPauseUnitEx(self.handle, false)
1008
1012
  end
1009
- self[101] = stunCounter - 1
1013
+ self[102] = stunCounter - 1
1010
1014
  end
1011
1015
  function Unit.create(self, owner, id, x, y, facing, skinId)
1012
1016
  local handle = skinId and BlzCreateUnitWithSkin(
@@ -1108,8 +1112,11 @@ function Unit.getInSector(self, pos, range, offsetAngle, centralAngle)
1108
1112
  )
1109
1113
  return targetCollection
1110
1114
  end
1111
- function Unit.getSelectionOf(self, player)
1112
- targetCollection = {}
1115
+ function Unit.getSelectionOf(self, player, target)
1116
+ if target == nil then
1117
+ target = {}
1118
+ end
1119
+ targetCollection = target
1113
1120
  targetCollectionNextIndex = 1
1114
1121
  GroupEnumUnitsSelected(dummyGroup, player.handle, collectIntoTarget)
1115
1122
  return targetCollection
@@ -1131,6 +1138,9 @@ end
1131
1138
  function Unit.prototype.__tostring(self)
1132
1139
  return (((self.constructor.name .. "$") .. util.id2s(self.typeId)) .. "@") .. tostring(getHandleId(self.handle))
1133
1140
  end
1141
+ function Unit.getBySyncId(self, syncId)
1142
+ return unitBySyncId[syncId]
1143
+ end
1134
1144
  __TS__SetDescriptor(
1135
1145
  Unit.prototype,
1136
1146
  "_deltas",
@@ -1388,17 +1398,17 @@ __TS__SetDescriptor(
1388
1398
  "isTeamGlowVisible",
1389
1399
  {
1390
1400
  get = function(self)
1391
- return not self[105]
1401
+ return not self[106]
1392
1402
  end,
1393
1403
  set = function(self, isTeamGlowVisible)
1394
1404
  showUnitTeamGlow(self.handle, isTeamGlowVisible)
1395
- local ____temp_5
1405
+ local ____temp_6
1396
1406
  if not isTeamGlowVisible then
1397
- ____temp_5 = true
1407
+ ____temp_6 = true
1398
1408
  else
1399
- ____temp_5 = nil
1409
+ ____temp_6 = nil
1400
1410
  end
1401
- self[105] = ____temp_5
1411
+ self[106] = ____temp_6
1402
1412
  end
1403
1413
  },
1404
1414
  true
@@ -1408,7 +1418,7 @@ __TS__SetDescriptor(
1408
1418
  "color",
1409
1419
  {set = function(self, color)
1410
1420
  setUnitColor(self.handle, color.handle)
1411
- if self[105] then
1421
+ if self[106] then
1412
1422
  showUnitTeamGlow(self.handle, false)
1413
1423
  end
1414
1424
  end},
@@ -1432,14 +1442,14 @@ __TS__SetDescriptor(
1432
1442
  "maxHealth",
1433
1443
  {
1434
1444
  get = function(self)
1435
- return BlzGetUnitMaxHP(self.handle) - (self[103] or 0) - (self[104] or 0)
1445
+ return BlzGetUnitMaxHP(self.handle) - (self[104] or 0) - (self[105] or 0)
1436
1446
  end,
1437
1447
  set = function(self, maxHealth)
1438
- if maxHealth < 1 and self[102] ~= nil then
1439
- self[103] = (self[103] or 0) + (1 - maxHealth)
1448
+ if maxHealth < 1 and self[103] ~= nil then
1449
+ self[104] = (self[104] or 0) + (1 - maxHealth)
1440
1450
  maxHealth = 1
1441
1451
  end
1442
- BlzSetUnitMaxHP(self.handle, maxHealth + (self[104] or 0))
1452
+ BlzSetUnitMaxHP(self.handle, maxHealth + (self[105] or 0))
1443
1453
  end
1444
1454
  },
1445
1455
  true
@@ -1481,10 +1491,10 @@ __TS__SetDescriptor(
1481
1491
  "health",
1482
1492
  {
1483
1493
  get = function(self)
1484
- return GetWidgetLife(self.handle) - (self[104] or 0)
1494
+ return GetWidgetLife(self.handle) - (self[105] or 0)
1485
1495
  end,
1486
1496
  set = function(self, health)
1487
- SetWidgetLife(self.handle, health + (self[104] or 0))
1497
+ SetWidgetLife(self.handle, health + (self[105] or 0))
1488
1498
  end
1489
1499
  },
1490
1500
  true
@@ -1695,17 +1705,17 @@ __TS__SetDescriptor(
1695
1705
  set = function(self, isPaused)
1696
1706
  local handle = self.handle
1697
1707
  if isPaused and not IsUnitPaused(handle) then
1698
- self[100] = true
1699
- for _ = self[101] or 0, -1 do
1708
+ self[101] = true
1709
+ for _ = self[102] or 0, -1 do
1700
1710
  BlzPauseUnitEx(handle, true)
1701
1711
  end
1702
1712
  PauseUnit(handle, true)
1703
1713
  elseif not isPaused and IsUnitPaused(handle) then
1704
1714
  PauseUnit(handle, false)
1705
- for _ = self[101] or 0, -1 do
1715
+ for _ = self[102] or 0, -1 do
1706
1716
  BlzPauseUnitEx(handle, false)
1707
1717
  end
1708
- self[100] = nil
1718
+ self[101] = nil
1709
1719
  end
1710
1720
  end
1711
1721
  },
@@ -2124,25 +2134,25 @@ Unit.onTargetCast = dispatchId(__TS__New(
2124
2134
  InitializingEvent,
2125
2135
  function(event)
2126
2136
  local function listener(unit, id)
2127
- local ____GetSpellTargetUnit_result_8
2137
+ local ____GetSpellTargetUnit_result_9
2128
2138
  if GetSpellTargetUnit() then
2129
- ____GetSpellTargetUnit_result_8 = ____exports.Unit:of(GetSpellTargetUnit())
2139
+ ____GetSpellTargetUnit_result_9 = ____exports.Unit:of(GetSpellTargetUnit())
2130
2140
  else
2131
- local ____GetSpellTargetItem_result_7
2141
+ local ____GetSpellTargetItem_result_8
2132
2142
  if GetSpellTargetItem() then
2133
- ____GetSpellTargetItem_result_7 = Item:of(GetSpellTargetItem())
2143
+ ____GetSpellTargetItem_result_8 = Item:of(GetSpellTargetItem())
2134
2144
  else
2135
- local ____GetSpellTargetDestructable_result_6
2145
+ local ____GetSpellTargetDestructable_result_7
2136
2146
  if GetSpellTargetDestructable() then
2137
- ____GetSpellTargetDestructable_result_6 = Destructable:of(GetSpellTargetDestructable())
2147
+ ____GetSpellTargetDestructable_result_7 = Destructable:of(GetSpellTargetDestructable())
2138
2148
  else
2139
- ____GetSpellTargetDestructable_result_6 = nil
2149
+ ____GetSpellTargetDestructable_result_7 = nil
2140
2150
  end
2141
- ____GetSpellTargetItem_result_7 = ____GetSpellTargetDestructable_result_6
2151
+ ____GetSpellTargetItem_result_8 = ____GetSpellTargetDestructable_result_7
2142
2152
  end
2143
- ____GetSpellTargetUnit_result_8 = ____GetSpellTargetItem_result_7
2153
+ ____GetSpellTargetUnit_result_9 = ____GetSpellTargetItem_result_8
2144
2154
  end
2145
- local target = ____GetSpellTargetUnit_result_8
2155
+ local target = ____GetSpellTargetUnit_result_9
2146
2156
  if target then
2147
2157
  invoke(event, unit, id, target)
2148
2158
  end
@@ -2314,10 +2324,12 @@ Unit.onImmediateOrder = dispatchId(__TS__New(
2314
2324
  ____exports.UnitTriggerEvent,
2315
2325
  EVENT_PLAYER_UNIT_ISSUED_ORDER,
2316
2326
  function()
2317
- local unit = ____exports.Unit:of(getOrderedUnit())
2318
- local issuedOrderId = getIssuedOrderId()
2319
- if unit ~= nil and unit.state == 1 then
2320
- return unit, issuedOrderId
2327
+ local handle = getOrderedUnit()
2328
+ if handle ~= nil and getUnitTypeId(handle) ~= dummyUnitId then
2329
+ local unit = ____exports.Unit:of(handle)
2330
+ if unit.state == 1 then
2331
+ return unit, getIssuedOrderId()
2332
+ end
2321
2333
  end
2322
2334
  return IgnoreEvent
2323
2335
  end
@@ -2452,6 +2464,7 @@ Unit.onDamage = __TS__New(
2452
2464
  damageType = BlzGetEventDamageType(),
2453
2465
  weaponType = BlzGetEventWeaponType(),
2454
2466
  isAttack = BlzGetEventIsAttack(),
2467
+ originalAmount = GetEventDamage(),
2455
2468
  preventDeath = damageEventPreventDeath
2456
2469
  }
2457
2470
  local evData = setmetatable(
@@ -2468,7 +2481,7 @@ Unit.onDamage = __TS__New(
2468
2481
  invoke(event, source, target, evData)
2469
2482
  if evData[0] ~= nil and target.health - evData.amount < 0.405 then
2470
2483
  local bonusHealth = math.ceil(evData.amount)
2471
- target[104] = (target[104] or 0) + bonusHealth
2484
+ target[105] = (target[105] or 0) + bonusHealth
2472
2485
  BlzSetUnitMaxHP(
2473
2486
  target.handle,
2474
2487
  BlzGetUnitMaxHP(target.handle) + bonusHealth
@@ -2482,7 +2495,7 @@ Unit.onDamage = __TS__New(
2482
2495
  evData[0],
2483
2496
  table.unpack(evData, 1 + 1, 1 + (evData[1] or 0))
2484
2497
  )
2485
- target[104] = (target[104] or 0) - bonusHealth
2498
+ target[105] = (target[105] or 0) - bonusHealth
2486
2499
  SetWidgetLife(
2487
2500
  target.handle,
2488
2501
  GetWidgetLife(target.handle) - bonusHealth
@@ -2502,32 +2515,91 @@ Unit.onDamage = __TS__New(
2502
2515
  DestroyTrigger(trigger)
2503
2516
  end
2504
2517
  )
2505
- Unit.onItemDrop = __TS__New(
2518
+ Unit.itemDroppedEvent = __TS__New(
2506
2519
  ____exports.UnitTriggerEvent,
2507
2520
  EVENT_PLAYER_UNIT_DROP_ITEM,
2508
2521
  function()
2509
2522
  local unit = getTriggerUnit()
2510
- if getUnitTypeId(unit) ~= dummyUnitId then
2511
- return ____exports.Unit:of(unit), Item:of(getManipulatedItem())
2523
+ local item = getManipulatedItem()
2524
+ if getUnitTypeId(unit) ~= dummyUnitId and not (ignoreEventsItems[item] ~= nil) then
2525
+ return ____exports.Unit:of(unit), Item:of(item)
2512
2526
  end
2513
2527
  return IgnoreEvent
2514
2528
  end
2515
2529
  )
2516
- Unit.onItemPickup = __TS__New(
2530
+ Unit.itemPickedUpEvent = __TS__New(
2517
2531
  ____exports.UnitTriggerEvent,
2518
2532
  EVENT_PLAYER_UNIT_PICKUP_ITEM,
2519
2533
  function()
2520
2534
  local unit = getTriggerUnit()
2521
- if getUnitTypeId(unit) ~= dummyUnitId then
2522
- return ____exports.Unit:of(unit), Item:of(getManipulatedItem())
2535
+ local item = getManipulatedItem()
2536
+ if getUnitTypeId(unit) ~= dummyUnitId and not (ignoreEventsItems[item] ~= nil) then
2537
+ return ____exports.Unit:of(unit), Item:of(item)
2523
2538
  end
2524
2539
  return IgnoreEvent
2525
2540
  end
2526
2541
  )
2527
- Unit.onItemUse = __TS__New(
2542
+ Unit.itemUsedEvent = __TS__New(
2528
2543
  ____exports.UnitTriggerEvent,
2529
2544
  EVENT_PLAYER_UNIT_USE_ITEM,
2530
- function() return ____exports.Unit:of(GetTriggerUnit()), Item:of(GetManipulatedItem()) end
2545
+ function()
2546
+ local unit = getTriggerUnit()
2547
+ local item = getManipulatedItem()
2548
+ if getUnitTypeId(unit) ~= dummyUnitId and not (ignoreEventsItems[item] ~= nil) then
2549
+ return ____exports.Unit:of(unit), Item:of(item)
2550
+ end
2551
+ return IgnoreEvent
2552
+ end
2553
+ )
2554
+ Unit.itemStackedEvent = __TS__New(
2555
+ ____exports.UnitTriggerEvent,
2556
+ EVENT_PLAYER_UNIT_STACK_ITEM,
2557
+ function() return ____exports.Unit:of(getTriggerUnit()), Item:of(getManipulatedItem()) end
2558
+ )
2559
+ __TS__ObjectDefineProperty(
2560
+ Unit,
2561
+ "itemUseOrderEvent",
2562
+ {get = function(self)
2563
+ local event = __TS__New(Event)
2564
+ for order = orderId("useslot0"), orderId("useslot5") do
2565
+ local slot = order - orderId("useslot0")
2566
+ local function listener(unit)
2567
+ local item = unit.items[slot + 1]
2568
+ if item ~= nil then
2569
+ invoke(event, unit, item)
2570
+ end
2571
+ end
2572
+ self.onImmediateOrder[order]:addListener(listener)
2573
+ self.onTargetOrder[order]:addListener(listener)
2574
+ self.onPointOrder[order]:addListener(listener)
2575
+ end
2576
+ rawset(self, "itemUseOrderEvent", event)
2577
+ return event
2578
+ end}
2579
+ )
2580
+ __TS__ObjectDefineProperty(
2581
+ Unit,
2582
+ "itemMoveOrderEvent",
2583
+ {get = function(self)
2584
+ local event = __TS__New(Event)
2585
+ for order = orderId("moveslot0"), orderId("moveslot5") do
2586
+ local slotTo = order - orderId("moveslot0")
2587
+ self.onTargetOrder[order]:addListener(function(unit, item)
2588
+ local slotFrom = unit.items:findSlot(item)
2589
+ if slotFrom ~= nil then
2590
+ invoke(
2591
+ event,
2592
+ unit,
2593
+ item,
2594
+ slotFrom,
2595
+ slotTo
2596
+ )
2597
+ end
2598
+ end)
2599
+ end
2600
+ rawset(self, "itemMoveOrderEvent", event)
2601
+ return event
2602
+ end}
2531
2603
  )
2532
2604
  __TS__ObjectDefineProperty(
2533
2605
  Unit,
@@ -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
@@ -1,7 +1,7 @@
1
1
  /** @noSelfInFile */
2
2
  import { Unit } from "../core/types/unit";
3
3
  import { Async } from "../core/types/async";
4
- import { TriggerEvent } from "../event";
4
+ import { Event, TriggerEvent } from "../event";
5
5
  import { GraphicsMode } from "./index";
6
6
  export declare class LocalClient {
7
7
  private constructor();
@@ -11,6 +11,11 @@ export declare class LocalClient {
11
11
  static get isHD(): boolean;
12
12
  static get graphicsMode(): GraphicsMode;
13
13
  static get isActive(): boolean;
14
- static get mouseFocusUnit(): Async<Unit>;
14
+ static get mouseFocusUnit(): Async<Unit> | undefined;
15
+ static get mainSelectedUnit(): Async<Unit> | undefined;
16
+ static get mainSelectedUnitChangeEvent(): Event<[
17
+ previousMainSelectedUnit: Unit | undefined,
18
+ newMainSelectedUnit: Unit | undefined
19
+ ]>;
15
20
  static readonly onDisconnect: TriggerEvent<[]>;
16
21
  }
@@ -1,4 +1,5 @@
1
1
  local ____lualib = require("lualib_bundle")
2
+ local __TS__ArrayMap = ____lualib.__TS__ArrayMap
2
3
  local __TS__Class = ____lualib.__TS__Class
3
4
  local __TS__ObjectDefineProperty = ____lualib.__TS__ObjectDefineProperty
4
5
  local __TS__New = ____lualib.__TS__New
@@ -6,13 +7,25 @@ local ____exports = {}
6
7
  local ____unit = require("core.types.unit")
7
8
  local Unit = ____unit.Unit
8
9
  local ____event = require("event")
10
+ local Event = ____event.Event
9
11
  local TriggerEvent = ____event.TriggerEvent
12
+ local ____frame = require("core.types.frame")
13
+ local Frame = ____frame.Frame
14
+ local ____player = require("core.types.player")
15
+ local Player = ____player.Player
16
+ local ____timer = require("core.types.timer")
17
+ local Timer = ____timer.Timer
10
18
  local loadTOCFile = BlzLoadTOCFile
11
19
  local getLocalClientWidth = BlzGetLocalClientWidth
12
20
  local getLocalClientHeight = BlzGetLocalClientHeight
13
21
  local isLocalClientActive = BlzIsLocalClientActive
22
+ local isHeroUnitId = IsHeroUnitId
23
+ local getHandleId = GetHandleId
14
24
  local getMouseFocusUnit = BlzGetMouseFocusUnit
25
+ local getUnitRealField = BlzGetUnitRealField
26
+ local getUnitTypeId = GetUnitTypeId
15
27
  local getLocale = BlzGetLocale
28
+ local tableSort = table.sort
16
29
  local tocPath = "_warscript\\IsHD.toc"
17
30
  compiletime(function()
18
31
  if currentMap then
@@ -21,6 +34,29 @@ compiletime(function()
21
34
  currentMap:addFileString("_HD.w3mod\\" .. tocPath, fdfPath .. "\r\n")
22
35
  end
23
36
  end)
37
+ local selectionButtons
38
+ Timer:run(function()
39
+ selectionButtons = __TS__ArrayMap(
40
+ Frame:byName("SimpleInfoPanelUnitDetail").parent:getChild(5):getChild(0).children,
41
+ function(____, frame) return frame:getChild(1) end
42
+ )
43
+ end)
44
+ local localSelectedUnits = {}
45
+ local indexByLocalSelectedUnit = {}
46
+ local function compareUnitsSelectionPriority(a, b)
47
+ local aHandle = a.handle
48
+ local bHandle = b.handle
49
+ local priorityDelta = getUnitRealField(bHandle, UNIT_RF_PRIORITY) - getUnitRealField(aHandle, UNIT_RF_PRIORITY)
50
+ if priorityDelta ~= 0 then
51
+ return priorityDelta < 0
52
+ end
53
+ local aTypeId = getUnitTypeId(aHandle)
54
+ local bTypeId = getUnitTypeId(bHandle)
55
+ local orderDelta = (isHeroUnitId(aTypeId) and getHandleId(aHandle) or aTypeId) - (isHeroUnitId(bTypeId) and getHandleId(bHandle) or bTypeId)
56
+ return (orderDelta ~= 0 and orderDelta or indexByLocalSelectedUnit[a] - indexByLocalSelectedUnit[b]) < 0
57
+ end
58
+ local mainSelectedUnitChangeEvent
59
+ local previousMainSelectedUnit
24
60
  ____exports.LocalClient = __TS__Class()
25
61
  local LocalClient = ____exports.LocalClient
26
62
  LocalClient.name = "LocalClient"
@@ -69,6 +105,52 @@ __TS__ObjectDefineProperty(
69
105
  return Unit:of(getMouseFocusUnit())
70
106
  end}
71
107
  )
108
+ __TS__ObjectDefineProperty(
109
+ LocalClient,
110
+ "mainSelectedUnit",
111
+ {get = function(self)
112
+ Unit:getSelectionOf(Player["local"], localSelectedUnits)
113
+ for i = 1, #localSelectedUnits do
114
+ indexByLocalSelectedUnit[localSelectedUnits[i]] = i
115
+ end
116
+ tableSort(localSelectedUnits, compareUnitsSelectionPriority)
117
+ local mainSelectedUnitIndex
118
+ if selectionButtons and #localSelectedUnits > 1 then
119
+ local maxButtonWidth = 0
120
+ for i = 0, #selectionButtons - 1 do
121
+ local width = selectionButtons[i + 1].width
122
+ if width > maxButtonWidth then
123
+ maxButtonWidth = width
124
+ mainSelectedUnitIndex = i
125
+ end
126
+ end
127
+ end
128
+ local mainSelectedUnit = localSelectedUnits[(mainSelectedUnitIndex or 0) + 1]
129
+ for i = 1, #localSelectedUnits do
130
+ indexByLocalSelectedUnit[localSelectedUnits[i]] = nil
131
+ localSelectedUnits[i] = nil
132
+ end
133
+ if mainSelectedUnitChangeEvent ~= nil and mainSelectedUnit ~= previousMainSelectedUnit then
134
+ local previousPreviousMainSelectedUnit = previousMainSelectedUnit
135
+ previousMainSelectedUnit = mainSelectedUnit
136
+ Event.invoke(mainSelectedUnitChangeEvent, previousPreviousMainSelectedUnit, previousMainSelectedUnit)
137
+ end
138
+ return mainSelectedUnit
139
+ end}
140
+ )
141
+ __TS__ObjectDefineProperty(
142
+ LocalClient,
143
+ "mainSelectedUnitChangeEvent",
144
+ {get = function(self)
145
+ if mainSelectedUnitChangeEvent == nil then
146
+ mainSelectedUnitChangeEvent = __TS__New(Event)
147
+ Timer.onPeriod[1 / 64]:addListener(function()
148
+ local _ = ____exports.LocalClient.mainSelectedUnit
149
+ end)
150
+ end
151
+ return mainSelectedUnitChangeEvent
152
+ end}
153
+ )
72
154
  LocalClient.onDisconnect = __TS__New(
73
155
  TriggerEvent,
74
156
  function(trigger)
@@ -4,5 +4,9 @@ export declare const enum SoundPresetName {
4
4
  ABOMINATION_PISSED = "AbominationPissed",
5
5
  ABOMINATION_READY = "AbominationReady",
6
6
  ABOMINATION_WAR_CRY = "AbominationWarcry",
7
- AXE_MEDIUM_CHOP_WOOD = "AxeMediumChopWood"
7
+ AXE_MEDIUM_CHOP_WOOD = "AxeMediumChopWood",
8
+ IMPALE = "Impale",
9
+ IMPALE_HIT = "ImpaleHit",
10
+ IMPALE_LAND = "ImpaleLand",
11
+ IMPALE_CAST = "ImpaleCast"
8
12
  }