warscript 0.0.1-dev.0a43a35 → 0.0.1-dev.0b2f1d6

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 (64) hide show
  1. package/binaryreader.d.ts +1 -0
  2. package/binaryreader.lua +3 -0
  3. package/core/types/frame.d.ts +8 -0
  4. package/core/types/frame.lua +93 -1
  5. package/core/util.d.ts +1 -1
  6. package/core/util.lua +6 -0
  7. package/engine/behavior.d.ts +2 -2
  8. package/engine/behavior.lua +6 -6
  9. package/engine/behaviour/ability/apply-buff.d.ts +3 -5
  10. package/engine/behaviour/ability/damage.d.ts +33 -11
  11. package/engine/behaviour/ability/damage.lua +89 -31
  12. package/engine/behaviour/ability/heal.d.ts +33 -6
  13. package/engine/behaviour/ability/heal.lua +89 -10
  14. package/engine/behaviour/ability/restore-mana.d.ts +15 -0
  15. package/engine/behaviour/ability/restore-mana.lua +29 -0
  16. package/engine/behaviour/unit.d.ts +5 -0
  17. package/engine/behaviour/unit.lua +20 -0
  18. package/engine/buff.d.ts +60 -18
  19. package/engine/buff.lua +239 -62
  20. package/engine/game-map.d.ts +7 -0
  21. package/engine/game-map.lua +32 -0
  22. package/engine/internal/ability.d.ts +3 -11
  23. package/engine/internal/ability.lua +9 -78
  24. package/engine/internal/item+owner.lua +2 -2
  25. package/engine/internal/unit/ability.lua +0 -14
  26. package/engine/internal/unit/bonus.d.ts +4 -2
  27. package/engine/internal/unit/bonus.lua +6 -1
  28. package/engine/internal/unit/item.d.ts +24 -0
  29. package/engine/internal/unit/item.lua +84 -0
  30. package/engine/internal/unit/main-selected.d.ts +13 -0
  31. package/engine/internal/unit/main-selected.lua +51 -0
  32. package/engine/internal/unit+ability.lua +2 -2
  33. package/engine/internal/unit+transport.lua +4 -10
  34. package/engine/internal/unit-missile-launch.lua +24 -5
  35. package/engine/internal/unit.d.ts +24 -10
  36. package/engine/internal/unit.lua +113 -79
  37. package/engine/local-client.d.ts +7 -2
  38. package/engine/local-client.lua +82 -0
  39. package/engine/object-data/entry/item-type.d.ts +12 -0
  40. package/engine/object-data/entry/item-type.lua +78 -0
  41. package/engine/object-field/ability.d.ts +17 -0
  42. package/engine/object-field/ability.lua +51 -1
  43. package/engine/unit.d.ts +2 -0
  44. package/engine/unit.lua +2 -0
  45. package/index.d.ts +1 -0
  46. package/index.lua +1 -0
  47. package/lualib_bundle.lua +7 -2
  48. package/net/socket.d.ts +7 -1
  49. package/net/socket.lua +45 -4
  50. package/network.d.ts +1 -0
  51. package/network.lua +3 -2
  52. package/objutil/buff.lua +1 -1
  53. package/package.json +2 -2
  54. package/patch-lua.d.ts +0 -0
  55. package/patch-lua.lua +10 -0
  56. package/property.d.ts +55 -0
  57. package/property.lua +374 -0
  58. package/utility/arrays.d.ts +4 -1
  59. package/utility/arrays.lua +10 -3
  60. package/utility/linked-set.d.ts +11 -2
  61. package/utility/linked-set.lua +5 -2
  62. package/utility/types.d.ts +1 -0
  63. package/core/mapbounds.d.ts +0 -8
  64. package/core/mapbounds.lua +0 -12
@@ -290,7 +290,6 @@ local function dispatch(event, idGetter, argsGetter)
290
290
  return event[id]
291
291
  end
292
292
  if not initialized then
293
- local invoke = Event.invoke
294
293
  event:addListener(function(...)
295
294
  local id = idGetter(...)
296
295
  local dispatched = rawget(self, id)
@@ -328,7 +327,6 @@ local function dispatchAbility(event)
328
327
  return event[id]
329
328
  end
330
329
  if not initialized then
331
- local invoke = Event.invoke
332
330
  event:addListener(function(unit, ability, ...)
333
331
  local dispatched = rawget(self, ability.typeId)
334
332
  if dispatched ~= nil then
@@ -564,17 +562,6 @@ local function retrieveAbility(unit, ability, abilityId)
564
562
  ____exports.Unit:of(unit)
565
563
  )
566
564
  end
567
- if not unitAddAbility(unit, abilityId) then
568
- if getUnitAbility(unit, abilityId) == ability then
569
- return UnitAbility:of(
570
- ability,
571
- abilityId,
572
- ____exports.Unit:of(unit)
573
- )
574
- end
575
- else
576
- unitRemoveAbility(unit, abilityId)
577
- end
578
565
  for i = 0, unitInventorySize(unit) - 1 do
579
566
  local item = unitItemInSlot(unit, i)
580
567
  if getItemAbility(item, abilityId) == ability then
@@ -632,15 +619,15 @@ for ____, player in ipairs(Player.all) do
632
619
  dummies[player] = dummy
633
620
  end
634
621
  local function delayHealthChecksCallback(unit)
635
- local counter = (unit[102] or 0) - 1
622
+ local counter = (unit[103] or 0) - 1
636
623
  if counter ~= 0 then
637
- unit[102] = counter
624
+ unit[103] = counter
638
625
  return
639
626
  end
640
- unit[102] = nil
641
- local healthBonus = unit[103]
627
+ unit[103] = nil
628
+ local healthBonus = unit[104]
642
629
  if healthBonus ~= nil then
643
- unit[103] = nil
630
+ unit[104] = nil
644
631
  local handle = unit.handle
645
632
  BlzSetUnitMaxHP(
646
633
  handle,
@@ -648,12 +635,17 @@ local function delayHealthChecksCallback(unit)
648
635
  )
649
636
  end
650
637
  end
638
+ local nextSyncId = 1
639
+ local unitBySyncId = setmetatable({}, {__mode = "k"})
651
640
  ____exports.Unit = __TS__Class()
652
641
  local Unit = ____exports.Unit
653
642
  Unit.name = "Unit"
654
643
  __TS__ClassExtends(Unit, Handle)
655
644
  function Unit.prototype.____constructor(self, handle)
656
645
  Handle.prototype.____constructor(self, handle)
646
+ local ____nextSyncId_0 = nextSyncId
647
+ nextSyncId = ____nextSyncId_0 + 1
648
+ self.syncId = ____nextSyncId_0
657
649
  self._owner = Player:of(getOwningPlayer(handle))
658
650
  assert(unitAddAbility(handle, leaveDetectAbilityId) and UnitMakeAbilityPermanent(handle, true, leaveDetectAbilityId))
659
651
  assert(unitAddAbility(handle, morphDetectAbilityId))
@@ -666,6 +658,7 @@ function Unit.prototype.____constructor(self, handle)
666
658
  fourCC("Amrf")
667
659
  ))
668
660
  end
661
+ unitBySyncId[self.syncId] = self
669
662
  local ____ = self.abilities
670
663
  end
671
664
  function Unit.prototype.getEvent(self, event, collector)
@@ -706,6 +699,10 @@ function Unit.prototype.onDestroy(self)
706
699
  if eventsToDestroy ~= nil then
707
700
  forEach(eventsToDestroy, "destroy")
708
701
  end
702
+ if getUnitAbilityLevel(handle, leaveDetectAbilityId) > 0 then
703
+ unitRemoveAbility(handle, leaveDetectAbilityId)
704
+ removeUnit(handle)
705
+ end
709
706
  return Handle.prototype.onDestroy(self)
710
707
  end
711
708
  function Unit.prototype.addAttackHandler(self, condition, action)
@@ -747,8 +744,8 @@ function Unit.prototype.addModifier(self, property, modifier)
747
744
  end}
748
745
  end
749
746
  function Unit.prototype.hasCombatClassification(self, combatClassification)
750
- local ____combatClassification_0 = combatClassification
751
- return getUnitIntegerField(self.handle, UNIT_IF_TARGETED_AS) & ____combatClassification_0 == ____combatClassification_0
747
+ local ____combatClassification_1 = combatClassification
748
+ return getUnitIntegerField(self.handle, UNIT_IF_TARGETED_AS) & ____combatClassification_1 == ____combatClassification_1
752
749
  end
753
750
  function Unit.prototype.addClassification(self, classification)
754
751
  return unitAddType(self.handle, classification)
@@ -766,13 +763,13 @@ function Unit.prototype.isInvisibleTo(self, player)
766
763
  return isUnitInvisible(self.handle, player.handle)
767
764
  end
768
765
  function Unit.prototype.isInRangeOf(self, x, y, range)
769
- local ____temp_1
766
+ local ____temp_2
770
767
  if type(x) == "number" then
771
- ____temp_1 = isUnitInRangeXY(self.handle, x, y, range)
768
+ ____temp_2 = isUnitInRangeXY(self.handle, x, y, range)
772
769
  else
773
- ____temp_1 = isUnitInRange(self.handle, x.handle, y)
770
+ ____temp_2 = isUnitInRange(self.handle, x.handle, y)
774
771
  end
775
- return ____temp_1
772
+ return ____temp_2
776
773
  end
777
774
  function Unit.prototype.isAllyOf(self, unit)
778
775
  return isUnitAlly(
@@ -799,7 +796,7 @@ function Unit.prototype.queueAnimation(self, animation)
799
796
  queueUnitAnimation(self.handle, animation)
800
797
  end
801
798
  function Unit.prototype.delayHealthChecks(self)
802
- self[102] = (self[102] or 0) + 1
799
+ self[103] = (self[103] or 0) + 1
803
800
  Timer:run(delayHealthChecksCallback, self)
804
801
  end
805
802
  function Unit.prototype.setPosition(self, x, y)
@@ -816,14 +813,14 @@ function Unit.prototype.kill(self)
816
813
  killUnit(self.handle)
817
814
  end
818
815
  function Unit.prototype.revive(self, x, y, doEffect)
819
- local ____ReviveHero_4 = ReviveHero
820
- local ____array_3 = __TS__SparseArrayNew(self.handle, x, y)
821
- local ____doEffect_2 = doEffect
822
- if ____doEffect_2 == nil then
823
- ____doEffect_2 = false
816
+ local ____ReviveHero_5 = ReviveHero
817
+ local ____array_4 = __TS__SparseArrayNew(self.handle, x, y)
818
+ local ____doEffect_3 = doEffect
819
+ if ____doEffect_3 == nil then
820
+ ____doEffect_3 = false
824
821
  end
825
- __TS__SparseArrayPush(____array_3, ____doEffect_2)
826
- ____ReviveHero_4(__TS__SparseArraySpread(____array_3))
822
+ __TS__SparseArrayPush(____array_4, ____doEffect_3)
823
+ ____ReviveHero_5(__TS__SparseArraySpread(____array_4))
827
824
  end
828
825
  function Unit.prototype.healTarget(self, target, amount)
829
826
  if __TS__InstanceOf(target, ____exports.Unit) and target:hasAbility(fourCC("BIhm")) then
@@ -863,7 +860,7 @@ function Unit.prototype.dropItemSlot(self, item, slot)
863
860
  return UnitDropItemSlot(self.handle, item.handle, slot)
864
861
  end
865
862
  function Unit.prototype.itemInSlot(self, slot)
866
- return Item:of(UnitItemInSlot(self.handle, slot))
863
+ return Item:of(unitItemInSlot(self.handle, slot))
867
864
  end
868
865
  function Unit.prototype.addAbility(self, abilityId)
869
866
  if unitAddAbility(self.handle, abilityId) then
@@ -993,18 +990,18 @@ function Unit.prototype.unpauseEx(self)
993
990
  self:decrementStunCounter()
994
991
  end
995
992
  function Unit.prototype.incrementStunCounter(self)
996
- local stunCounter = self[101] or 0
997
- if not self[100] or stunCounter >= 0 then
993
+ local stunCounter = self[102] or 0
994
+ if not self[101] or stunCounter >= 0 then
998
995
  BlzPauseUnitEx(self.handle, true)
999
996
  end
1000
- self[101] = stunCounter + 1
997
+ self[102] = stunCounter + 1
1001
998
  end
1002
999
  function Unit.prototype.decrementStunCounter(self)
1003
- local stunCounter = self[101] or 0
1004
- if not self[100] or stunCounter >= 1 then
1000
+ local stunCounter = self[102] or 0
1001
+ if not self[101] or stunCounter >= 1 then
1005
1002
  BlzPauseUnitEx(self.handle, false)
1006
1003
  end
1007
- self[101] = stunCounter - 1
1004
+ self[102] = stunCounter - 1
1008
1005
  end
1009
1006
  function Unit.create(self, owner, id, x, y, facing, skinId)
1010
1007
  local handle = skinId and BlzCreateUnitWithSkin(
@@ -1106,8 +1103,11 @@ function Unit.getInSector(self, pos, range, offsetAngle, centralAngle)
1106
1103
  )
1107
1104
  return targetCollection
1108
1105
  end
1109
- function Unit.getSelectionOf(self, player)
1110
- targetCollection = {}
1106
+ function Unit.getSelectionOf(self, player, target)
1107
+ if target == nil then
1108
+ target = {}
1109
+ end
1110
+ targetCollection = target
1111
1111
  targetCollectionNextIndex = 1
1112
1112
  GroupEnumUnitsSelected(dummyGroup, player.handle, collectIntoTarget)
1113
1113
  return targetCollection
@@ -1129,6 +1129,9 @@ end
1129
1129
  function Unit.prototype.__tostring(self)
1130
1130
  return (((self.constructor.name .. "$") .. util.id2s(self.typeId)) .. "@") .. tostring(getHandleId(self.handle))
1131
1131
  end
1132
+ function Unit.getBySyncId(self, syncId)
1133
+ return unitBySyncId[syncId]
1134
+ end
1132
1135
  __TS__SetDescriptor(
1133
1136
  Unit.prototype,
1134
1137
  "_deltas",
@@ -1386,17 +1389,17 @@ __TS__SetDescriptor(
1386
1389
  "isTeamGlowVisible",
1387
1390
  {
1388
1391
  get = function(self)
1389
- return not self[105]
1392
+ return not self[106]
1390
1393
  end,
1391
1394
  set = function(self, isTeamGlowVisible)
1392
1395
  showUnitTeamGlow(self.handle, isTeamGlowVisible)
1393
- local ____temp_5
1396
+ local ____temp_6
1394
1397
  if not isTeamGlowVisible then
1395
- ____temp_5 = true
1398
+ ____temp_6 = true
1396
1399
  else
1397
- ____temp_5 = nil
1400
+ ____temp_6 = nil
1398
1401
  end
1399
- self[105] = ____temp_5
1402
+ self[106] = ____temp_6
1400
1403
  end
1401
1404
  },
1402
1405
  true
@@ -1406,7 +1409,7 @@ __TS__SetDescriptor(
1406
1409
  "color",
1407
1410
  {set = function(self, color)
1408
1411
  setUnitColor(self.handle, color.handle)
1409
- if self[105] then
1412
+ if self[106] then
1410
1413
  showUnitTeamGlow(self.handle, false)
1411
1414
  end
1412
1415
  end},
@@ -1430,14 +1433,14 @@ __TS__SetDescriptor(
1430
1433
  "maxHealth",
1431
1434
  {
1432
1435
  get = function(self)
1433
- return BlzGetUnitMaxHP(self.handle) - (self[103] or 0) - (self[104] or 0)
1436
+ return BlzGetUnitMaxHP(self.handle) - (self[104] or 0) - (self[105] or 0)
1434
1437
  end,
1435
1438
  set = function(self, maxHealth)
1436
- if maxHealth < 1 and self[102] ~= nil then
1437
- self[103] = (self[103] or 0) + (1 - maxHealth)
1439
+ if maxHealth < 1 and self[103] ~= nil then
1440
+ self[104] = (self[104] or 0) + (1 - maxHealth)
1438
1441
  maxHealth = 1
1439
1442
  end
1440
- BlzSetUnitMaxHP(self.handle, maxHealth + (self[104] or 0))
1443
+ BlzSetUnitMaxHP(self.handle, maxHealth + (self[105] or 0))
1441
1444
  end
1442
1445
  },
1443
1446
  true
@@ -1479,10 +1482,10 @@ __TS__SetDescriptor(
1479
1482
  "health",
1480
1483
  {
1481
1484
  get = function(self)
1482
- return GetWidgetLife(self.handle) - (self[104] or 0)
1485
+ return GetWidgetLife(self.handle) - (self[105] or 0)
1483
1486
  end,
1484
1487
  set = function(self, health)
1485
- SetWidgetLife(self.handle, health + (self[104] or 0))
1488
+ SetWidgetLife(self.handle, health + (self[105] or 0))
1486
1489
  end
1487
1490
  },
1488
1491
  true
@@ -1693,17 +1696,17 @@ __TS__SetDescriptor(
1693
1696
  set = function(self, isPaused)
1694
1697
  local handle = self.handle
1695
1698
  if isPaused and not IsUnitPaused(handle) then
1696
- self[100] = true
1697
- for _ = self[101] or 0, -1 do
1699
+ self[101] = true
1700
+ for _ = self[102] or 0, -1 do
1698
1701
  BlzPauseUnitEx(handle, true)
1699
1702
  end
1700
1703
  PauseUnit(handle, true)
1701
1704
  elseif not isPaused and IsUnitPaused(handle) then
1702
1705
  PauseUnit(handle, false)
1703
- for _ = self[101] or 0, -1 do
1706
+ for _ = self[102] or 0, -1 do
1704
1707
  BlzPauseUnitEx(handle, false)
1705
1708
  end
1706
- self[100] = nil
1709
+ self[101] = nil
1707
1710
  end
1708
1711
  end
1709
1712
  },
@@ -2060,7 +2063,6 @@ Unit.onDecay = __TS__New(
2060
2063
  Unit.onResurrect = __TS__New(
2061
2064
  InitializingEvent,
2062
2065
  function(event)
2063
- local invoke = Event.invoke
2064
2066
  local dead = setmetatable({}, {__mode = "k"})
2065
2067
  ____exports.Unit.deathEvent:addListener(function(unit)
2066
2068
  dead[unit] = true
@@ -2076,10 +2078,15 @@ Unit.onResurrect = __TS__New(
2076
2078
  Unit.morphEvent = __TS__New(
2077
2079
  InitializingEvent,
2078
2080
  function(event)
2081
+ local function ifNotLeft(unit)
2082
+ local handle = unit.handle
2083
+ if getUnitAbilityLevel(handle, leaveDetectAbilityId) ~= 0 and unitAddAbility(handle, morphDetectAbilityId) then
2084
+ invoke(event, unit)
2085
+ end
2086
+ end
2079
2087
  ____exports.Unit.onImmediateOrder[orderId("undefend")]:addListener(function(unit)
2080
2088
  if getUnitAbilityLevel(unit.handle, morphDetectAbilityId) == 0 then
2081
- assert(unitAddAbility(unit.handle, morphDetectAbilityId))
2082
- Timer:run(Event.invoke, event, unit)
2089
+ Timer:run(ifNotLeft, unit)
2083
2090
  end
2084
2091
  end)
2085
2092
  end
@@ -2117,27 +2124,26 @@ Unit.onSpellEffect = dispatchId(__TS__New(
2117
2124
  Unit.onTargetCast = dispatchId(__TS__New(
2118
2125
  InitializingEvent,
2119
2126
  function(event)
2120
- local invoke = Event.invoke
2121
2127
  local function listener(unit, id)
2122
- local ____GetSpellTargetUnit_result_8
2128
+ local ____GetSpellTargetUnit_result_9
2123
2129
  if GetSpellTargetUnit() then
2124
- ____GetSpellTargetUnit_result_8 = ____exports.Unit:of(GetSpellTargetUnit())
2130
+ ____GetSpellTargetUnit_result_9 = ____exports.Unit:of(GetSpellTargetUnit())
2125
2131
  else
2126
- local ____GetSpellTargetItem_result_7
2132
+ local ____GetSpellTargetItem_result_8
2127
2133
  if GetSpellTargetItem() then
2128
- ____GetSpellTargetItem_result_7 = Item:of(GetSpellTargetItem())
2134
+ ____GetSpellTargetItem_result_8 = Item:of(GetSpellTargetItem())
2129
2135
  else
2130
- local ____GetSpellTargetDestructable_result_6
2136
+ local ____GetSpellTargetDestructable_result_7
2131
2137
  if GetSpellTargetDestructable() then
2132
- ____GetSpellTargetDestructable_result_6 = Destructable:of(GetSpellTargetDestructable())
2138
+ ____GetSpellTargetDestructable_result_7 = Destructable:of(GetSpellTargetDestructable())
2133
2139
  else
2134
- ____GetSpellTargetDestructable_result_6 = nil
2140
+ ____GetSpellTargetDestructable_result_7 = nil
2135
2141
  end
2136
- ____GetSpellTargetItem_result_7 = ____GetSpellTargetDestructable_result_6
2142
+ ____GetSpellTargetItem_result_8 = ____GetSpellTargetDestructable_result_7
2137
2143
  end
2138
- ____GetSpellTargetUnit_result_8 = ____GetSpellTargetItem_result_7
2144
+ ____GetSpellTargetUnit_result_9 = ____GetSpellTargetItem_result_8
2139
2145
  end
2140
- local target = ____GetSpellTargetUnit_result_8
2146
+ local target = ____GetSpellTargetUnit_result_9
2141
2147
  if target then
2142
2148
  invoke(event, unit, id, target)
2143
2149
  end
@@ -2334,7 +2340,6 @@ Unit.autoAttackStartEvent = __TS__New(
2334
2340
  )
2335
2341
  Unit.onDamaging = (function()
2336
2342
  local event = __TS__New(Event)
2337
- local invoke = Event.invoke
2338
2343
  local trigger = CreateTrigger()
2339
2344
  TriggerRegisterAnyUnitEventBJ(trigger, EVENT_PLAYER_UNIT_DAMAGING)
2340
2345
  TriggerAddCondition(
@@ -2433,7 +2438,6 @@ end)()
2433
2438
  Unit.onDamage = __TS__New(
2434
2439
  InitializingEvent,
2435
2440
  function(event)
2436
- local invoke = Event.invoke
2437
2441
  local trigger = CreateTrigger()
2438
2442
  TriggerRegisterAnyUnitEventBJ(trigger, EVENT_PLAYER_UNIT_DAMAGED)
2439
2443
  TriggerAddCondition(
@@ -2449,6 +2453,7 @@ Unit.onDamage = __TS__New(
2449
2453
  damageType = BlzGetEventDamageType(),
2450
2454
  weaponType = BlzGetEventWeaponType(),
2451
2455
  isAttack = BlzGetEventIsAttack(),
2456
+ originalAmount = GetEventDamage(),
2452
2457
  preventDeath = damageEventPreventDeath
2453
2458
  }
2454
2459
  local evData = setmetatable(
@@ -2465,7 +2470,7 @@ Unit.onDamage = __TS__New(
2465
2470
  invoke(event, source, target, evData)
2466
2471
  if evData[0] ~= nil and target.health - evData.amount < 0.405 then
2467
2472
  local bonusHealth = math.ceil(evData.amount)
2468
- target[104] = (target[104] or 0) + bonusHealth
2473
+ target[105] = (target[105] or 0) + bonusHealth
2469
2474
  BlzSetUnitMaxHP(
2470
2475
  target.handle,
2471
2476
  BlzGetUnitMaxHP(target.handle) + bonusHealth
@@ -2479,7 +2484,7 @@ Unit.onDamage = __TS__New(
2479
2484
  evData[0],
2480
2485
  table.unpack(evData, 1 + 1, 1 + (evData[1] or 0))
2481
2486
  )
2482
- target[104] = (target[104] or 0) - bonusHealth
2487
+ target[105] = (target[105] or 0) - bonusHealth
2483
2488
  SetWidgetLife(
2484
2489
  target.handle,
2485
2490
  GetWidgetLife(target.handle) - bonusHealth
@@ -2499,7 +2504,7 @@ Unit.onDamage = __TS__New(
2499
2504
  DestroyTrigger(trigger)
2500
2505
  end
2501
2506
  )
2502
- Unit.onItemDrop = __TS__New(
2507
+ Unit.itemDroppedEvent = __TS__New(
2503
2508
  ____exports.UnitTriggerEvent,
2504
2509
  EVENT_PLAYER_UNIT_DROP_ITEM,
2505
2510
  function()
@@ -2510,7 +2515,7 @@ Unit.onItemDrop = __TS__New(
2510
2515
  return IgnoreEvent
2511
2516
  end
2512
2517
  )
2513
- Unit.onItemPickup = __TS__New(
2518
+ Unit.itemPickedUpEvent = __TS__New(
2514
2519
  ____exports.UnitTriggerEvent,
2515
2520
  EVENT_PLAYER_UNIT_PICKUP_ITEM,
2516
2521
  function()
@@ -2521,10 +2526,39 @@ Unit.onItemPickup = __TS__New(
2521
2526
  return IgnoreEvent
2522
2527
  end
2523
2528
  )
2524
- Unit.onItemUse = __TS__New(
2529
+ Unit.itemUsedEvent = __TS__New(
2525
2530
  ____exports.UnitTriggerEvent,
2526
2531
  EVENT_PLAYER_UNIT_USE_ITEM,
2527
- function() return ____exports.Unit:of(GetTriggerUnit()), Item:of(GetManipulatedItem()) end
2532
+ function() return ____exports.Unit:of(getTriggerUnit()), Item:of(getManipulatedItem()) end
2533
+ )
2534
+ Unit.itemStackedEvent = __TS__New(
2535
+ ____exports.UnitTriggerEvent,
2536
+ EVENT_PLAYER_UNIT_STACK_ITEM,
2537
+ function() return ____exports.Unit:of(getTriggerUnit()), Item:of(getManipulatedItem()) end
2538
+ )
2539
+ __TS__ObjectDefineProperty(
2540
+ Unit,
2541
+ "itemMovedEvent",
2542
+ {get = function(self)
2543
+ local event = __TS__New(Event)
2544
+ for order = orderId("moveslot0"), orderId("moveslot5") do
2545
+ local slotTo = order - orderId("moveslot0")
2546
+ self.onTargetOrder[order]:addListener(function(unit, item)
2547
+ local slotFrom = unit.items:findSlot(item)
2548
+ if slotFrom ~= nil then
2549
+ invoke(
2550
+ event,
2551
+ unit,
2552
+ item,
2553
+ slotFrom,
2554
+ slotTo
2555
+ )
2556
+ end
2557
+ end)
2558
+ end
2559
+ rawset(self, "itemMovedEvent", event)
2560
+ return event
2561
+ end}
2528
2562
  )
2529
2563
  __TS__ObjectDefineProperty(
2530
2564
  Unit,
@@ -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)
@@ -45,4 +45,16 @@ 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 goldCost(): number;
49
+ set goldCost(goldCost: number);
50
+ get lumberCost(): number;
51
+ set lumberCost(lumberCost: number);
52
+ get activelyUsed(): boolean;
53
+ set activelyUsed(activelyUsed: boolean);
54
+ get perishable(): boolean;
55
+ set perishable(perishable: boolean);
56
+ get initialStackSize(): number;
57
+ set initialStackSize(initialStackSize: number);
58
+ get maximumStackSize(): number;
59
+ set maximumStackSize(maximumStackSize: number);
48
60
  }
@@ -256,4 +256,82 @@ __TS__SetDescriptor(
256
256
  },
257
257
  true
258
258
  )
259
+ __TS__SetDescriptor(
260
+ ItemType.prototype,
261
+ "goldCost",
262
+ {
263
+ get = function(self)
264
+ return self:getNumberField("igol")
265
+ end,
266
+ set = function(self, goldCost)
267
+ self:setNumberField("igol", goldCost)
268
+ end
269
+ },
270
+ true
271
+ )
272
+ __TS__SetDescriptor(
273
+ ItemType.prototype,
274
+ "lumberCost",
275
+ {
276
+ get = function(self)
277
+ return self:getNumberField("ilum")
278
+ end,
279
+ set = function(self, lumberCost)
280
+ self:setNumberField("ilum", lumberCost)
281
+ end
282
+ },
283
+ true
284
+ )
285
+ __TS__SetDescriptor(
286
+ ItemType.prototype,
287
+ "activelyUsed",
288
+ {
289
+ get = function(self)
290
+ return self:getBooleanField("iusa")
291
+ end,
292
+ set = function(self, activelyUsed)
293
+ self:setBooleanField("iusa", activelyUsed)
294
+ end
295
+ },
296
+ true
297
+ )
298
+ __TS__SetDescriptor(
299
+ ItemType.prototype,
300
+ "perishable",
301
+ {
302
+ get = function(self)
303
+ return self:getBooleanField("iper")
304
+ end,
305
+ set = function(self, perishable)
306
+ self:setBooleanField("iper", perishable)
307
+ end
308
+ },
309
+ true
310
+ )
311
+ __TS__SetDescriptor(
312
+ ItemType.prototype,
313
+ "initialStackSize",
314
+ {
315
+ get = function(self)
316
+ return self:getNumberField("iuse")
317
+ end,
318
+ set = function(self, initialStackSize)
319
+ self:setNumberField("iuse", initialStackSize)
320
+ end
321
+ },
322
+ true
323
+ )
324
+ __TS__SetDescriptor(
325
+ ItemType.prototype,
326
+ "maximumStackSize",
327
+ {
328
+ get = function(self)
329
+ return self:getNumberField("ista")
330
+ end,
331
+ set = function(self, maximumStackSize)
332
+ self:setNumberField("ista", maximumStackSize)
333
+ end
334
+ },
335
+ true
336
+ )
259
337
  return ____exports