warscript 0.0.1-dev.671d3cf → 0.0.1-dev.69da8a0

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 (43) hide show
  1. package/core/types/frame.d.ts +1 -0
  2. package/core/types/frame.lua +12 -0
  3. package/core/util.d.ts +1 -1
  4. package/core/util.lua +6 -0
  5. package/engine/behavior.d.ts +2 -2
  6. package/engine/behavior.lua +6 -6
  7. package/engine/behaviour/ability/apply-buff.d.ts +3 -5
  8. package/engine/behaviour/unit.d.ts +5 -0
  9. package/engine/behaviour/unit.lua +20 -0
  10. package/engine/buff.d.ts +32 -11
  11. package/engine/buff.lua +142 -61
  12. package/engine/internal/ability.d.ts +1 -11
  13. package/engine/internal/ability.lua +2 -78
  14. package/engine/internal/item+owner.lua +2 -2
  15. package/engine/internal/unit/bonus.d.ts +4 -2
  16. package/engine/internal/unit/bonus.lua +6 -1
  17. package/engine/internal/unit/item.d.ts +23 -0
  18. package/engine/internal/unit/item.lua +74 -0
  19. package/engine/internal/unit+ability.lua +2 -2
  20. package/engine/internal/unit-missile-launch.lua +24 -5
  21. package/engine/internal/unit.d.ts +6 -4
  22. package/engine/internal/unit.lua +16 -7
  23. package/engine/local-client.d.ts +7 -2
  24. package/engine/local-client.lua +77 -0
  25. package/engine/object-data/entry/item-type.d.ts +12 -0
  26. package/engine/object-data/entry/item-type.lua +78 -0
  27. package/engine/object-field/ability.d.ts +17 -0
  28. package/engine/object-field/ability.lua +51 -1
  29. package/engine/unit.d.ts +1 -0
  30. package/engine/unit.lua +1 -0
  31. package/index.d.ts +1 -0
  32. package/index.lua +1 -0
  33. package/net/socket.d.ts +7 -1
  34. package/net/socket.lua +45 -4
  35. package/network.d.ts +1 -0
  36. package/network.lua +3 -2
  37. package/objutil/buff.lua +1 -1
  38. package/package.json +1 -1
  39. package/patch-lua.d.ts +0 -0
  40. package/patch-lua.lua +10 -0
  41. package/utility/linked-set.d.ts +11 -2
  42. package/utility/linked-set.lua +5 -2
  43. package/utility/types.d.ts +1 -0
@@ -7,14 +7,33 @@ local ____event = require("event")
7
7
  local Event = ____event.Event
8
8
  local ____timer = require("core.types.timer")
9
9
  local Timer = ____timer.Timer
10
+ local ____lua_2Dsets = require("utility.lua-sets")
11
+ local luaSetOf = ____lua_2Dsets.luaSetOf
10
12
  local autoAttackFinishEvent = __TS__New(Event)
11
13
  rawset(Unit, "autoAttackFinishEvent", autoAttackFinishEvent)
12
14
  local eventTimerByUnit = {}
13
- local function reset(source)
14
- local eventTimer = eventTimerByUnit[source]
15
- if eventTimer then
16
- eventTimer:destroy()
17
- eventTimerByUnit[source] = nil
15
+ local instantOrderIds = luaSetOf(
16
+ orderId("avatar"),
17
+ orderId("berserk"),
18
+ orderId("divineshield"),
19
+ orderId("immolation"),
20
+ orderId("moveslot0"),
21
+ orderId("moveslot1"),
22
+ orderId("moveslot2"),
23
+ orderId("moveslot3"),
24
+ orderId("moveslot4"),
25
+ orderId("moveslot5"),
26
+ orderId("unavatar"),
27
+ orderId("undivineshield"),
28
+ orderId("unimmolation")
29
+ )
30
+ local function reset(source, orderId)
31
+ if not (instantOrderIds[orderId] ~= nil) then
32
+ local eventTimer = eventTimerByUnit[source]
33
+ if eventTimer then
34
+ eventTimer:destroy()
35
+ eventTimerByUnit[source] = nil
36
+ end
18
37
  end
19
38
  end
20
39
  Unit.onImmediateOrder:addListener(reset)
@@ -42,6 +42,7 @@ export interface DamagingEvent {
42
42
  damageType: jdamagetype;
43
43
  weaponType: jweapontype;
44
44
  readonly isAttack: boolean;
45
+ readonly originalAmount: number;
45
46
  }
46
47
  export type DamageEvent = DamagingEvent & {
47
48
  preventDeath<P extends any[]>(this: DamageEvent, callback: (this: void, ...parameters: P) => any, ...parameters: P): void;
@@ -287,7 +288,7 @@ export declare class Unit extends Handle<junit> {
287
288
  static getInRange(x: number, y: number, range: number, predicate?: (unit: Unit) => boolean): Unit[];
288
289
  static getInCollisionRange(x: number, y: number, range: number, predicate?: (unit: Unit) => boolean): Unit[];
289
290
  static getInSector(pos: Vec2, range: number, offsetAngle: number, centralAngle: number): Unit[];
290
- static getSelectionOf(player: Player): Unit[];
291
+ static getSelectionOf(player: Player, target?: Unit[]): Unit[];
291
292
  static readonly deathEvent: UnitTriggerEvent<[Unit]>;
292
293
  static readonly onDecay: UnitTriggerEvent<[]>;
293
294
  static readonly onResurrect: InitializingEvent<[Unit], void>;
@@ -322,9 +323,10 @@ export declare class Unit extends Handle<junit> {
322
323
  static readonly autoAttackStartEvent: UnitTriggerEvent<[Unit]>;
323
324
  static readonly onDamaging: Event<[source: Unit | undefined, target: Unit, event: DamagingEvent]>;
324
325
  static readonly onDamage: InitializingEvent<[source: Unit | undefined, target: Unit, event: DamageEvent], jtrigger>;
325
- static onItemDrop: UnitTriggerEvent<[Item]>;
326
- static onItemPickup: UnitTriggerEvent<[Item]>;
327
- static onItemUse: UnitTriggerEvent<[Item]>;
326
+ static itemDroppedEvent: UnitTriggerEvent<[Item]>;
327
+ static itemPickedUpEvent: UnitTriggerEvent<[Item]>;
328
+ static itemUsedEvent: UnitTriggerEvent<[Item]>;
329
+ static itemStackedEvent: UnitTriggerEvent<[Item]>;
328
330
  static get onCreate(): EventDispatcher<[Unit], [Unit]>;
329
331
  static get destroyEvent(): EventDispatcher<[Unit], [Unit]>;
330
332
  getField(field: junitintegerfield | junitrealfield): number;
@@ -865,7 +865,7 @@ function Unit.prototype.dropItemSlot(self, item, slot)
865
865
  return UnitDropItemSlot(self.handle, item.handle, slot)
866
866
  end
867
867
  function Unit.prototype.itemInSlot(self, slot)
868
- return Item:of(UnitItemInSlot(self.handle, slot))
868
+ return Item:of(unitItemInSlot(self.handle, slot))
869
869
  end
870
870
  function Unit.prototype.addAbility(self, abilityId)
871
871
  if unitAddAbility(self.handle, abilityId) then
@@ -1108,8 +1108,11 @@ function Unit.getInSector(self, pos, range, offsetAngle, centralAngle)
1108
1108
  )
1109
1109
  return targetCollection
1110
1110
  end
1111
- function Unit.getSelectionOf(self, player)
1112
- targetCollection = {}
1111
+ function Unit.getSelectionOf(self, player, target)
1112
+ if target == nil then
1113
+ target = {}
1114
+ end
1115
+ targetCollection = target
1113
1116
  targetCollectionNextIndex = 1
1114
1117
  GroupEnumUnitsSelected(dummyGroup, player.handle, collectIntoTarget)
1115
1118
  return targetCollection
@@ -2452,6 +2455,7 @@ Unit.onDamage = __TS__New(
2452
2455
  damageType = BlzGetEventDamageType(),
2453
2456
  weaponType = BlzGetEventWeaponType(),
2454
2457
  isAttack = BlzGetEventIsAttack(),
2458
+ originalAmount = GetEventDamage(),
2455
2459
  preventDeath = damageEventPreventDeath
2456
2460
  }
2457
2461
  local evData = setmetatable(
@@ -2502,7 +2506,7 @@ Unit.onDamage = __TS__New(
2502
2506
  DestroyTrigger(trigger)
2503
2507
  end
2504
2508
  )
2505
- Unit.onItemDrop = __TS__New(
2509
+ Unit.itemDroppedEvent = __TS__New(
2506
2510
  ____exports.UnitTriggerEvent,
2507
2511
  EVENT_PLAYER_UNIT_DROP_ITEM,
2508
2512
  function()
@@ -2513,7 +2517,7 @@ Unit.onItemDrop = __TS__New(
2513
2517
  return IgnoreEvent
2514
2518
  end
2515
2519
  )
2516
- Unit.onItemPickup = __TS__New(
2520
+ Unit.itemPickedUpEvent = __TS__New(
2517
2521
  ____exports.UnitTriggerEvent,
2518
2522
  EVENT_PLAYER_UNIT_PICKUP_ITEM,
2519
2523
  function()
@@ -2524,10 +2528,15 @@ Unit.onItemPickup = __TS__New(
2524
2528
  return IgnoreEvent
2525
2529
  end
2526
2530
  )
2527
- Unit.onItemUse = __TS__New(
2531
+ Unit.itemUsedEvent = __TS__New(
2528
2532
  ____exports.UnitTriggerEvent,
2529
2533
  EVENT_PLAYER_UNIT_USE_ITEM,
2530
- function() return ____exports.Unit:of(GetTriggerUnit()), Item:of(GetManipulatedItem()) end
2534
+ function() return ____exports.Unit:of(getTriggerUnit()), Item:of(getManipulatedItem()) end
2535
+ )
2536
+ Unit.itemStackedEvent = __TS__New(
2537
+ ____exports.UnitTriggerEvent,
2538
+ EVENT_PLAYER_UNIT_STACK_ITEM,
2539
+ function() return ____exports.Unit:of(getTriggerUnit()), Item:of(getManipulatedItem()) end
2531
2540
  )
2532
2541
  __TS__ObjectDefineProperty(
2533
2542
  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
  }
@@ -6,13 +6,25 @@ local ____exports = {}
6
6
  local ____unit = require("core.types.unit")
7
7
  local Unit = ____unit.Unit
8
8
  local ____event = require("event")
9
+ local Event = ____event.Event
9
10
  local TriggerEvent = ____event.TriggerEvent
11
+ local ____frame = require("core.types.frame")
12
+ local Frame = ____frame.Frame
13
+ local ____player = require("core.types.player")
14
+ local Player = ____player.Player
15
+ local ____timer = require("core.types.timer")
16
+ local Timer = ____timer.Timer
10
17
  local loadTOCFile = BlzLoadTOCFile
11
18
  local getLocalClientWidth = BlzGetLocalClientWidth
12
19
  local getLocalClientHeight = BlzGetLocalClientHeight
13
20
  local isLocalClientActive = BlzIsLocalClientActive
21
+ local isHeroUnitId = IsHeroUnitId
22
+ local getHandleId = GetHandleId
14
23
  local getMouseFocusUnit = BlzGetMouseFocusUnit
24
+ local getUnitRealField = BlzGetUnitRealField
25
+ local getUnitTypeId = GetUnitTypeId
15
26
  local getLocale = BlzGetLocale
27
+ local tableSort = table.sort
16
28
  local tocPath = "_warscript\\IsHD.toc"
17
29
  compiletime(function()
18
30
  if currentMap then
@@ -21,6 +33,28 @@ compiletime(function()
21
33
  currentMap:addFileString("_HD.w3mod\\" .. tocPath, fdfPath .. "\r\n")
22
34
  end
23
35
  end)
36
+ local selectionContainerFrame
37
+ local selectionContainerFrameChildren
38
+ Timer:run(function()
39
+ selectionContainerFrame = Frame:byName("SimpleInfoPanelUnitDetail").parent:getChild(5):getChild(0)
40
+ selectionContainerFrameChildren = selectionContainerFrame.children
41
+ end)
42
+ local localSelectedUnits = {}
43
+ local indexByLocalSelectedUnit = {}
44
+ local function compareUnitsSelectionPriority(a, b)
45
+ local aHandle = a.handle
46
+ local bHandle = b.handle
47
+ local priorityDelta = getUnitRealField(bHandle, UNIT_RF_PRIORITY) - getUnitRealField(aHandle, UNIT_RF_PRIORITY)
48
+ if priorityDelta ~= 0 then
49
+ return priorityDelta < 0
50
+ end
51
+ local aTypeId = getUnitTypeId(aHandle)
52
+ local bTypeId = getUnitTypeId(bHandle)
53
+ local orderDelta = (isHeroUnitId(aTypeId) and getHandleId(aHandle) or aTypeId) - (isHeroUnitId(bTypeId) and getHandleId(bHandle) or bTypeId)
54
+ return (orderDelta ~= 0 and orderDelta or indexByLocalSelectedUnit[a] - indexByLocalSelectedUnit[b]) < 0
55
+ end
56
+ local mainSelectedUnitChangeEvent
57
+ local previousMainSelectedUnit
24
58
  ____exports.LocalClient = __TS__Class()
25
59
  local LocalClient = ____exports.LocalClient
26
60
  LocalClient.name = "LocalClient"
@@ -69,6 +103,49 @@ __TS__ObjectDefineProperty(
69
103
  return Unit:of(getMouseFocusUnit())
70
104
  end}
71
105
  )
106
+ __TS__ObjectDefineProperty(
107
+ LocalClient,
108
+ "mainSelectedUnit",
109
+ {get = function(self)
110
+ Unit:getSelectionOf(Player["local"], localSelectedUnits)
111
+ for i = 1, #localSelectedUnits do
112
+ indexByLocalSelectedUnit[localSelectedUnits[i]] = i
113
+ end
114
+ tableSort(localSelectedUnits, compareUnitsSelectionPriority)
115
+ local mainSelectedUnitIndex
116
+ if selectionContainerFrame and selectionContainerFrameChildren and selectionContainerFrame.visible then
117
+ for i = 0, #selectionContainerFrameChildren - 1 do
118
+ if selectionContainerFrameChildren[i + 1].visible then
119
+ mainSelectedUnitIndex = i
120
+ break
121
+ end
122
+ end
123
+ end
124
+ local mainSelectedUnit = localSelectedUnits[(mainSelectedUnitIndex or 0) + 1]
125
+ for i = 1, #localSelectedUnits do
126
+ indexByLocalSelectedUnit[localSelectedUnits[i]] = nil
127
+ localSelectedUnits[i] = nil
128
+ end
129
+ if mainSelectedUnitChangeEvent ~= nil and mainSelectedUnit ~= previousMainSelectedUnit then
130
+ Event.invoke(mainSelectedUnitChangeEvent, previousMainSelectedUnit, mainSelectedUnit)
131
+ previousMainSelectedUnit = mainSelectedUnit
132
+ end
133
+ return mainSelectedUnit
134
+ end}
135
+ )
136
+ __TS__ObjectDefineProperty(
137
+ LocalClient,
138
+ "mainSelectedUnitChangeEvent",
139
+ {get = function(self)
140
+ if mainSelectedUnitChangeEvent == nil then
141
+ mainSelectedUnitChangeEvent = __TS__New(Event)
142
+ Timer.onPeriod[1 / 64]:addListener(function()
143
+ local _ = ____exports.LocalClient.mainSelectedUnit
144
+ end)
145
+ end
146
+ return mainSelectedUnitChangeEvent
147
+ end}
148
+ )
72
149
  LocalClient.onDisconnect = __TS__New(
73
150
  TriggerEvent,
74
151
  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
@@ -6,6 +6,9 @@ import { ObjectDataEntryId } from "../object-data/entry";
6
6
  import { LightningTypeId } from "../object-data/entry/lightning-type";
7
7
  import { CombatClassifications } from "../object-data/auxiliary/combat-classification";
8
8
  import { UnitTypeId } from "../object-data/entry/unit-type";
9
+ import { BuffResistanceType } from "../object-data/auxiliary/buff-resistance-type";
10
+ import { BuffPolarity } from "../object-data/auxiliary/buff-polarity";
11
+ import { ReadonlyNonEmptyLinkedSet } from "../../utility/linked-set";
9
12
  export declare abstract class AbilityField<ValueType extends number | string | boolean = number | string | boolean, NativeFieldType extends jabilityfield = jabilityfield> extends ObjectField<AbilityType, Ability, ValueType, NativeFieldType> {
10
13
  protected get instanceClass(): typeof Ability;
11
14
  protected getObjectDataEntryId(instance: Ability): AbilityTypeId;
@@ -107,6 +110,20 @@ export declare class AbilityAbilityTypeIdLevelField extends AbilityObjectDataEnt
107
110
  }
108
111
  export declare class AbilityUnitTypeIdLevelField extends AbilityObjectDataEntryIdLevelField<UnitTypeId> {
109
112
  }
113
+ export declare abstract class AbilityEnumLevelField<T extends number> extends AbilityLevelField<T, T, jabilityintegerlevelfield> {
114
+ protected abstract values: ReadonlyNonEmptyLinkedSet<T>;
115
+ protected get defaultValue(): T;
116
+ protected getNativeFieldById(id: number): jabilityintegerlevelfield;
117
+ protected getNativeFieldValue(instance: Ability, level: number): T;
118
+ protected setNativeFieldValue(instance: Ability, level: number, value: T): boolean;
119
+ static get valueChangeEvent(): ObjectLevelFieldValueChangeEvent<AbilityBooleanLevelField>;
120
+ }
121
+ export declare class AbilityBuffPolarityLevelField extends AbilityEnumLevelField<BuffPolarity> {
122
+ protected values: ReadonlyNonEmptyLinkedSet<BuffPolarity>;
123
+ }
124
+ export declare class AbilityBuffResistanceTypeLevelField extends AbilityEnumLevelField<BuffResistanceType> {
125
+ protected values: ReadonlyNonEmptyLinkedSet<BuffResistanceType>;
126
+ }
110
127
  export declare class AbilityCombatClassificationsLevelField extends AbilityLevelField<CombatClassifications, CombatClassifications, jabilityintegerlevelfield> {
111
128
  protected get defaultValue(): CombatClassifications;
112
129
  protected getNativeFieldById(id: number): jabilityintegerlevelfield;
@@ -13,6 +13,8 @@ local ObjectField = ____object_2Dfield.ObjectField
13
13
  local ObjectLevelField = ____object_2Dfield.ObjectLevelField
14
14
  local ____ability_2Dtype = require("engine.object-data.entry.ability-type")
15
15
  local AbilityType = ____ability_2Dtype.AbilityType
16
+ local ____linked_2Dset = require("utility.linked-set")
17
+ local nonEmptyLinkedSetOf = ____linked_2Dset.nonEmptyLinkedSetOf
16
18
  local convertAbilityBooleanField = _G.ConvertAbilityBooleanField
17
19
  local convertAbilityIntegerField = _G.ConvertAbilityIntegerField
18
20
  local convertAbilityRealField = _G.ConvertAbilityRealField
@@ -259,7 +261,7 @@ local AbilityLevelField = ____exports.AbilityLevelField
259
261
  AbilityLevelField.name = "AbilityLevelField"
260
262
  __TS__ClassExtends(AbilityLevelField, ObjectLevelField)
261
263
  function AbilityLevelField.prototype.getLevelCount(self, entry)
262
- return __TS__InstanceOf(entry, Ability) and #entry.levels or entry.levelCount
264
+ return entry.levelCount
263
265
  end
264
266
  function AbilityLevelField.prototype.getObjectDataEntryId(self, instance)
265
267
  return instance.typeId
@@ -431,6 +433,54 @@ ____exports.AbilityUnitTypeIdLevelField = __TS__Class()
431
433
  local AbilityUnitTypeIdLevelField = ____exports.AbilityUnitTypeIdLevelField
432
434
  AbilityUnitTypeIdLevelField.name = "AbilityUnitTypeIdLevelField"
433
435
  __TS__ClassExtends(AbilityUnitTypeIdLevelField, ____exports.AbilityObjectDataEntryIdLevelField)
436
+ ____exports.AbilityEnumLevelField = __TS__Class()
437
+ local AbilityEnumLevelField = ____exports.AbilityEnumLevelField
438
+ AbilityEnumLevelField.name = "AbilityEnumLevelField"
439
+ __TS__ClassExtends(AbilityEnumLevelField, ____exports.AbilityLevelField)
440
+ function AbilityEnumLevelField.prototype.getNativeFieldById(self, id)
441
+ return convertAbilityIntegerLevelField(id)
442
+ end
443
+ function AbilityEnumLevelField.prototype.getNativeFieldValue(self, instance, level)
444
+ local value = instance:getField(self.nativeField, level)
445
+ if self.values:contains(value) then
446
+ return value
447
+ end
448
+ return self.values:first()
449
+ end
450
+ function AbilityEnumLevelField.prototype.setNativeFieldValue(self, instance, level, value)
451
+ return instance:setField(self.nativeField, level, value)
452
+ end
453
+ __TS__SetDescriptor(
454
+ AbilityEnumLevelField.prototype,
455
+ "defaultValue",
456
+ {get = function(self)
457
+ return self.values:first()
458
+ end},
459
+ true
460
+ )
461
+ __TS__ObjectDefineProperty(
462
+ AbilityEnumLevelField,
463
+ "valueChangeEvent",
464
+ {get = function(self)
465
+ return self:getOrCreateValueChangeEvent()
466
+ end}
467
+ )
468
+ ____exports.AbilityBuffPolarityLevelField = __TS__Class()
469
+ local AbilityBuffPolarityLevelField = ____exports.AbilityBuffPolarityLevelField
470
+ AbilityBuffPolarityLevelField.name = "AbilityBuffPolarityLevelField"
471
+ __TS__ClassExtends(AbilityBuffPolarityLevelField, ____exports.AbilityEnumLevelField)
472
+ function AbilityBuffPolarityLevelField.prototype.____constructor(self, ...)
473
+ AbilityBuffPolarityLevelField.____super.prototype.____constructor(self, ...)
474
+ self.values = nonEmptyLinkedSetOf(0, 1, 2)
475
+ end
476
+ ____exports.AbilityBuffResistanceTypeLevelField = __TS__Class()
477
+ local AbilityBuffResistanceTypeLevelField = ____exports.AbilityBuffResistanceTypeLevelField
478
+ AbilityBuffResistanceTypeLevelField.name = "AbilityBuffResistanceTypeLevelField"
479
+ __TS__ClassExtends(AbilityBuffResistanceTypeLevelField, ____exports.AbilityEnumLevelField)
480
+ function AbilityBuffResistanceTypeLevelField.prototype.____constructor(self, ...)
481
+ AbilityBuffResistanceTypeLevelField.____super.prototype.____constructor(self, ...)
482
+ self.values = nonEmptyLinkedSetOf(1, 2, 3)
483
+ end
434
484
  local allowedTargetCombatClassificationsByLevelByAbilityTypeId = postcompile(function()
435
485
  local allowedTargetCombatClassificationsByLevelByAbilityTypeId = {}
436
486
  for ____, abilityType in ipairs(AbilityType:getAll()) do
package/engine/unit.d.ts CHANGED
@@ -4,6 +4,7 @@ import "./internal/unit/ability";
4
4
  import "./internal/unit/allowed-targets";
5
5
  import "./internal/unit/buff";
6
6
  import "./internal/unit/expiration-timer";
7
+ import "./internal/unit/item";
7
8
  import "./internal/unit+ability";
8
9
  import "./internal/unit+damage";
9
10
  import "./internal/unit+rally";
package/engine/unit.lua CHANGED
@@ -4,6 +4,7 @@ require("engine.internal.unit.ability")
4
4
  require("engine.internal.unit.allowed-targets")
5
5
  require("engine.internal.unit.buff")
6
6
  require("engine.internal.unit.expiration-timer")
7
+ require("engine.internal.unit.item")
7
8
  require("engine.internal.unit+ability")
8
9
  require("engine.internal.unit+damage")
9
10
  require("engine.internal.unit+rally")
package/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  /** @noSelfInFile */
2
2
  import "./types";
3
+ import "./patch-lua";
3
4
  import "./patch-lualib";
4
5
  import "./patch-natives";
5
6
  import "./global/math";
package/index.lua CHANGED
@@ -1,5 +1,6 @@
1
1
  local ____exports = {}
2
2
  require("types")
3
+ require("patch-lua")
3
4
  require("patch-lualib")
4
5
  require("patch-natives")
5
6
  require("global.math")
package/net/socket.d.ts CHANGED
@@ -1,9 +1,15 @@
1
1
  /** @noSelfInFile */
2
2
  import { Event } from "../event";
3
3
  import { Player } from "../core/types/player";
4
+ declare const enum SocketPropertyKey {
5
+ ID = 0,
6
+ CHUNK_ID = 1
7
+ }
4
8
  export declare class Socket {
5
- private readonly id;
9
+ private readonly [SocketPropertyKey.ID];
10
+ private readonly [SocketPropertyKey.CHUNK_ID];
6
11
  readonly onMessage: Event<[Player, string]>;
7
12
  constructor();
8
13
  send(data: string): void;
9
14
  }
15
+ export {};
package/net/socket.lua CHANGED
@@ -7,6 +7,11 @@ local Event = ____event.Event
7
7
  local ____network = require("network")
8
8
  local send = ____network.send
9
9
  local onReceive = ____network.onReceive
10
+ local MAX_PAYLOAD_LENGTH = ____network.MAX_PAYLOAD_LENGTH
11
+ local ____math = require("math")
12
+ local ceil = ____math.ceil
13
+ local stringSub = string.sub
14
+ local tableConcat = table.concat
10
15
  local nextId = 0
11
16
  ____exports.Socket = __TS__Class()
12
17
  local Socket = ____exports.Socket
@@ -14,13 +19,49 @@ Socket.name = "Socket"
14
19
  function Socket.prototype.____constructor(self)
15
20
  local ____tostring_0 = tostring
16
21
  nextId = nextId + 1
17
- self.id = ____tostring_0(nextId)
22
+ self[0] = ____tostring_0(nextId)
23
+ local ____tostring_1 = tostring
24
+ nextId = nextId + 1
25
+ self[1] = ____tostring_1(nextId)
18
26
  self.onMessage = __TS__New(Event)
19
- onReceive[self.id]:addListener(function(sender, data)
20
- Event.invoke(self.onMessage, sender, data)
27
+ local chunksByPlayer = {}
28
+ onReceive[self[0]]:addListener(function(sender, data)
29
+ local chunks = chunksByPlayer[sender]
30
+ if chunks ~= nil then
31
+ chunks[#chunks + 1] = data
32
+ Event.invoke(
33
+ self.onMessage,
34
+ sender,
35
+ tableConcat(chunks)
36
+ )
37
+ chunksByPlayer[sender] = nil
38
+ else
39
+ Event.invoke(self.onMessage, sender, data)
40
+ end
41
+ end)
42
+ onReceive[self[1]]:addListener(function(sender, data)
43
+ local chunks = chunksByPlayer[sender]
44
+ if chunks == nil then
45
+ chunks = {}
46
+ chunksByPlayer[sender] = chunks
47
+ end
48
+ chunks[#chunks + 1] = data
21
49
  end)
22
50
  end
23
51
  function Socket.prototype.send(self, data)
24
- send(self.id, data)
52
+ local chunks = ceil(#data / MAX_PAYLOAD_LENGTH) - 1
53
+ local offset = 1
54
+ for _ = 0, chunks - 1 do
55
+ local nextOffset = offset + MAX_PAYLOAD_LENGTH
56
+ send(
57
+ self[1],
58
+ stringSub(data, offset, nextOffset - 1)
59
+ )
60
+ offset = nextOffset
61
+ end
62
+ send(
63
+ self[0],
64
+ stringSub(data, offset)
65
+ )
25
66
  end
26
67
  return ____exports
package/network.d.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  import { Event } from "./event";
3
3
  import { Player } from "./core/types/player";
4
4
  import { Operation, OperationContinue, OperationMonitor } from "./operation";
5
+ export declare const MAX_PAYLOAD_LENGTH = 255;
5
6
  export declare const onReceive: {
6
7
  [prefix: string]: Event<[Player, string]>;
7
8
  } & {
package/network.lua CHANGED
@@ -25,6 +25,7 @@ local concat = table.concat
25
25
  local pack = string.pack
26
26
  local sub = string.sub
27
27
  local ____unpack = string.unpack
28
+ ____exports.MAX_PAYLOAD_LENGTH = 255
28
29
  ____exports.onReceive = setmetatable(
29
30
  {},
30
31
  {__index = function(self, prefix)
@@ -42,11 +43,11 @@ ____exports.onReceive = setmetatable(
42
43
  end}
43
44
  )
44
45
  function ____exports.send(id, payload)
45
- if #payload > 255 then
46
+ if #payload > ____exports.MAX_PAYLOAD_LENGTH then
46
47
  error(
47
48
  __TS__New(
48
49
  IllegalArgumentException,
49
- "payload length must be <= 256, but was " .. tostring(#payload)
50
+ (("payload length must be <= " .. tostring(____exports.MAX_PAYLOAD_LENGTH)) .. ", but was ") .. tostring(#payload)
50
51
  ),
51
52
  0
52
53
  )
package/objutil/buff.lua CHANGED
@@ -762,7 +762,7 @@ Unit.onDamaging:addListener(function(source, target, event)
762
762
  end)
763
763
  end
764
764
  end)
765
- Unit.onItemPickup:addListener(function(unit, item)
765
+ Unit.itemPickedUpEvent:addListener(function(unit, item)
766
766
  if item.powerup and item:hasAbility(fourCC("APdi")) then
767
767
  end
768
768
  end)
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package",
3
3
  "name": "warscript",
4
- "version": "0.0.1-dev.671d3cf",
4
+ "version": "0.0.1-dev.69da8a0",
5
5
  "description": "A typescript library for Warcraft III using Warpack.",
6
6
  "keywords": [
7
7
  "warcraft",
package/patch-lua.d.ts ADDED
File without changes
package/patch-lua.lua ADDED
@@ -0,0 +1,10 @@
1
+ local getmetatable = _G.getmetatable
2
+ local ipairs = _G.ipairs
3
+
4
+ _G.ipairs = function(t)
5
+ local metatable = getmetatable(t)
6
+ if metatable and metatable.__ipairs then
7
+ return metatable.__ipairs(t)
8
+ end
9
+ return ipairs(t)
10
+ end