warscript 0.0.1-dev.a319619 → 0.0.1-dev.a3deff8

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 (58) hide show
  1. package/attributes.d.ts +1 -0
  2. package/attributes.lua +9 -0
  3. package/core/types/frame.lua +14 -9
  4. package/core/types/player.d.ts +15 -0
  5. package/core/types/player.lua +53 -13
  6. package/core/types/playerCamera.lua +44 -0
  7. package/core/types/tileCell.d.ts +9 -0
  8. package/core/types/tileCell.lua +92 -0
  9. package/core/types/timer.d.ts +3 -2
  10. package/core/types/timer.lua +22 -2
  11. package/decl/native.d.ts +2 -2
  12. package/engine/behavior.d.ts +3 -0
  13. package/engine/behavior.lua +53 -0
  14. package/engine/behaviour/ability/remove-buffs.d.ts +9 -0
  15. package/engine/behaviour/ability/remove-buffs.lua +21 -0
  16. package/engine/behaviour/unit/stun-immunity.d.ts +2 -0
  17. package/engine/behaviour/unit/stun-immunity.lua +11 -2
  18. package/engine/behaviour/unit.d.ts +8 -2
  19. package/engine/behaviour/unit.lua +29 -2
  20. package/engine/buff.d.ts +9 -4
  21. package/engine/buff.lua +112 -82
  22. package/engine/internal/ability.d.ts +3 -1
  23. package/engine/internal/ability.lua +26 -9
  24. package/engine/internal/item+owner.lua +12 -6
  25. package/engine/internal/item.d.ts +13 -15
  26. package/engine/internal/item.lua +63 -49
  27. package/engine/internal/unit/ability.d.ts +14 -14
  28. package/engine/internal/unit/ability.lua +72 -45
  29. package/engine/internal/unit/main-selected.lua +12 -27
  30. package/engine/internal/unit+ability.lua +9 -8
  31. package/engine/internal/unit-missile-launch.lua +44 -20
  32. package/engine/internal/unit.d.ts +16 -9
  33. package/engine/internal/unit.lua +102 -54
  34. package/engine/local-client.d.ts +2 -0
  35. package/engine/local-client.lua +30 -0
  36. package/engine/object-data/entry/ability-type.lua +4 -1
  37. package/engine/object-field/ability.d.ts +3 -3
  38. package/engine/object-field/ability.lua +7 -6
  39. package/engine/object-field.d.ts +9 -3
  40. package/engine/object-field.lua +184 -93
  41. package/engine/random.d.ts +9 -0
  42. package/engine/random.lua +13 -0
  43. package/engine/synchronization.d.ts +11 -0
  44. package/engine/synchronization.lua +77 -0
  45. package/engine/text-tag.lua +3 -2
  46. package/net/socket.lua +1 -1
  47. package/objutil/buff.lua +1 -1
  48. package/package.json +2 -2
  49. package/patch-lualib.lua +1 -1
  50. package/utility/arrays.d.ts +1 -0
  51. package/utility/arrays.lua +8 -0
  52. package/utility/callback-array.d.ts +17 -0
  53. package/utility/callback-array.lua +61 -0
  54. package/utility/linked-set.d.ts +1 -0
  55. package/utility/linked-set.lua +19 -1
  56. package/utility/lua-maps.d.ts +11 -2
  57. package/utility/lua-maps.lua +33 -2
  58. package/utility/types.d.ts +3 -0
package/attributes.d.ts CHANGED
@@ -13,5 +13,6 @@ export declare namespace Attribute {
13
13
  export declare class AttributesHolder {
14
14
  readonly get: (<T>(attribute: Attribute<T>) => T | undefined) & LuaExtension<"TableGetMethod">;
15
15
  readonly set: (<T>(attribute: Attribute<T>, value: T | undefined) => void) & LuaExtension<"TableSetMethod">;
16
+ getOrPut<T>(attribute: Attribute<T>, defaultValue: () => T): T;
16
17
  }
17
18
  export {};
package/attributes.lua CHANGED
@@ -20,4 +20,13 @@ local AttributesHolder = ____exports.AttributesHolder
20
20
  AttributesHolder.name = "AttributesHolder"
21
21
  function AttributesHolder.prototype.____constructor(self)
22
22
  end
23
+ function AttributesHolder.prototype.getOrPut(self, attribute, defaultValue)
24
+ local value = self[attribute]
25
+ if value ~= nil then
26
+ return value
27
+ end
28
+ value = defaultValue()
29
+ self[attribute] = value
30
+ return value
31
+ end
23
32
  return ____exports
@@ -19,13 +19,16 @@ local ____frame_2Dcoordinates = require("engine.internal.misc.frame-coordinates"
19
19
  local FRAME_MAX_Y = ____frame_2Dcoordinates.FRAME_MAX_Y
20
20
  local FRAME_MIN_Y = ____frame_2Dcoordinates.FRAME_MIN_Y
21
21
  local getFrameMinXMaxX = ____frame_2Dcoordinates.getFrameMinXMaxX
22
+ local ____playerCamera = require("core.types.playerCamera")
23
+ local frameCoordinatesToWorld = ____playerCamera.frameCoordinatesToWorld
24
+ local worldCoordinatesToFrame = ____playerCamera.worldCoordinatesToFrame
25
+ local ____get_2Dterrain_2Dz = require("engine.internal.misc.get-terrain-z")
26
+ local getTerrainZ = ____get_2Dterrain_2Dz.getTerrainZ
22
27
  local frameClick = BlzFrameClick
23
28
  local frameGetEnable = BlzFrameGetEnable
24
29
  local frameIsVisible = BlzFrameIsVisible
25
30
  local frameSetEnable = BlzFrameSetEnable
26
31
  local frameSetScale = BlzFrameSetScale
27
- local getCameraTargetPositionX = GetCameraTargetPositionX
28
- local getCameraTargetPositionY = GetCameraTargetPositionY
29
32
  local ____rawget = _G.rawget
30
33
  local rawset = _G.rawset
31
34
  local invoke = Event.invoke
@@ -936,16 +939,19 @@ __TS__ObjectDefineProperty(
936
939
  local event = __TS__New(Event)
937
940
  local syncX = 0
938
941
  local syncY = 0
939
- local syncCamX = getCameraTargetPositionX()
940
- local syncCamY = getCameraTargetPositionY()
942
+ local syncFrameX = 0
943
+ local syncFrameY = 0
941
944
  local lastX = syncX
942
945
  local lastY = syncY
943
946
  self.onMouseMove:addListener(function(player, x, y)
944
947
  if player.isLocal then
945
948
  syncX = x
946
949
  syncY = y
947
- syncCamX = getCameraTargetPositionX()
948
- syncCamY = getCameraTargetPositionY()
950
+ syncFrameX, syncFrameY = worldCoordinatesToFrame(
951
+ x,
952
+ y,
953
+ getTerrainZ(x, y)
954
+ )
949
955
  lastX = x
950
956
  lastY = y
951
957
  invoke(event, x, y)
@@ -955,9 +961,8 @@ __TS__ObjectDefineProperty(
955
961
  if syncX == 0 and syncY == 0 then
956
962
  return
957
963
  end
958
- local x = syncX + (getCameraTargetPositionX() - syncCamX)
959
- local y = syncY + (getCameraTargetPositionY() - syncCamY)
960
- if x ~= lastX or y ~= lastY then
964
+ local x, y, ____, isDefinite = frameCoordinatesToWorld(syncFrameX, syncFrameY)
965
+ if isDefinite and (x ~= lastX or y ~= lastY) then
961
966
  lastX = x
962
967
  lastY = y
963
968
  invoke(event, x, y)
@@ -7,6 +7,18 @@ import { UpgradeId } from "../../engine/object-data/entry/upgrade";
7
7
  interface Unit {
8
8
  handle: junit;
9
9
  }
10
+ export declare const enum PlayerAllianceType {
11
+ PASSIVE = 0,
12
+ RESCUABLE = 1,
13
+ HELP_REQUEST = 2,
14
+ HELP_RESPONSE = 3,
15
+ SHARED_XP = 4,
16
+ SHARED_SPELLS = 5,
17
+ SHARED_VISION = 6,
18
+ SHARED_VISION_FORCED = 7,
19
+ SHARED_CONTROL = 8,
20
+ SHARED_ADVANCED_CONTROL = 9
21
+ }
10
22
  export declare class Player extends Handle<jplayer> {
11
23
  static readonly all: Player[];
12
24
  static readonly local: Player;
@@ -42,6 +54,8 @@ export declare class Player extends Handle<jplayer> {
42
54
  forceUICancel(): void;
43
55
  isAllyOf(other: Player): boolean;
44
56
  isEnemyOf(other: Player): boolean;
57
+ setAlliance(other: Player, type: PlayerAllianceType, value: boolean): void;
58
+ getAlliance(other: Player, type: PlayerAllianceType): boolean;
45
59
  setAbilityAvailable(abilityId: number, available: boolean): void;
46
60
  getMaximumUpgradeLevel(upgradeId: UpgradeId): number;
47
61
  setMaximumUpgradeLevel(upgradeId: UpgradeId, maximumLevel: number): void;
@@ -50,6 +64,7 @@ export declare class Player extends Handle<jplayer> {
50
64
  setUpgradeLevel(upgradeId: UpgradeId, level: number): void;
51
65
  private static getEvent;
52
66
  private static getMouseEvent;
67
+ static get allianceChangedEvent(): Readonly<Record<PlayerAllianceType, Event<[Player]>>>;
53
68
  static get onLeave(): Event<[Player]>;
54
69
  static get onMouseDown(): Event<[Player, jmousebuttontype]>;
55
70
  static get onMouseUp(): Event<[Player, jmousebuttontype]>;
@@ -23,14 +23,32 @@ local ____math = require("math")
23
23
  local MAXIMUM_INTEGER = ____math.MAXIMUM_INTEGER
24
24
  local ____player_2Dlocal_2Dhandle = require("engine.internal.misc.player-local-handle")
25
25
  local PLAYER_LOCAL_HANDLE = ____player_2Dlocal_2Dhandle.PLAYER_LOCAL_HANDLE
26
+ local ____lazy = require("utility.lazy")
27
+ local lazyRecord = ____lazy.lazyRecord
28
+ local getPlayerAlliance = GetPlayerAlliance
26
29
  local getPlayerColor = GetPlayerColor
27
30
  local getPlayerName = GetPlayerName
28
31
  local getPlayerTechCount = GetPlayerTechCount
29
32
  local getPlayerTechMaxAllowed = GetPlayerTechMaxAllowed
33
+ local getTriggerPlayer = GetTriggerPlayer
34
+ local setPlayerAlliance = SetPlayerAlliance
30
35
  local setPlayerTechMaxAllowed = SetPlayerTechMaxAllowed
31
36
  local setPlayerTechResearched = SetPlayerTechResearched
32
37
  local setPlayerAbilityAvailable = SetPlayerAbilityAvailable
38
+ local triggerRegisterPlayerAllianceChange = TriggerRegisterPlayerAllianceChange
33
39
  local playerNative = _G.Player
40
+ local nativeByPlayerAllianceType = {
41
+ [0] = ALLIANCE_PASSIVE,
42
+ [1] = ALLIANCE_RESCUABLE,
43
+ [2] = ALLIANCE_HELP_REQUEST,
44
+ [3] = ALLIANCE_HELP_RESPONSE,
45
+ [4] = ALLIANCE_SHARED_XP,
46
+ [5] = ALLIANCE_SHARED_SPELLS,
47
+ [6] = ALLIANCE_SHARED_VISION,
48
+ [7] = ALLIANCE_SHARED_VISION_FORCED,
49
+ [8] = ALLIANCE_SHARED_CONTROL,
50
+ [9] = ALLIANCE_SHARED_ADVANCED_CONTROL
51
+ }
34
52
  ____exports.Player = __TS__Class()
35
53
  local Player = ____exports.Player
36
54
  Player.name = "Player"
@@ -85,6 +103,12 @@ end
85
103
  function Player.prototype.isEnemyOf(self, other)
86
104
  return IsPlayerEnemy(self.handle, other.handle)
87
105
  end
106
+ function Player.prototype.setAlliance(self, other, ____type, value)
107
+ setPlayerAlliance(self.handle, other.handle, nativeByPlayerAllianceType[____type], value)
108
+ end
109
+ function Player.prototype.getAlliance(self, other, ____type)
110
+ return getPlayerAlliance(self.handle, other.handle, nativeByPlayerAllianceType[____type])
111
+ end
88
112
  function Player.prototype.setAbilityAvailable(self, abilityId, available)
89
113
  setPlayerAbilityAvailable(self.handle, abilityId, available)
90
114
  end
@@ -124,14 +148,11 @@ function Player.getMouseEvent(self, event, collector)
124
148
  self.events[eventId] = __TS__New(
125
149
  TriggerEvent,
126
150
  function(trigger)
127
- Timer:simple(
128
- 0,
129
- function()
130
- for ____, player in ipairs(____exports.Player.all) do
131
- TriggerRegisterPlayerEvent(trigger, player.handle, event)
132
- end
151
+ Timer:run(function()
152
+ for ____, player in ipairs(____exports.Player.all) do
153
+ TriggerRegisterPlayerEvent(trigger, player.handle, event)
133
154
  end
134
- )
155
+ end)
135
156
  end,
136
157
  collector or (function() return {} end)
137
158
  )
@@ -180,7 +201,7 @@ function Player.getKeyEvent(self, isDown)
180
201
  TriggerAddCondition(
181
202
  trigger,
182
203
  Condition(function()
183
- local player = ____exports.Player:of(GetTriggerPlayer())
204
+ local player = ____exports.Player:of(getTriggerPlayer())
184
205
  local key = BlzGetTriggerPlayerKey()
185
206
  local metaKey = BlzGetTriggerPlayerMetaKey()
186
207
  Event.invoke(event, player, key, metaKey)
@@ -369,13 +390,32 @@ __TS__SetDescriptor(
369
390
  end},
370
391
  true
371
392
  )
393
+ __TS__ObjectDefineProperty(
394
+ Player,
395
+ "allianceChangedEvent",
396
+ {get = function(self)
397
+ local event = lazyRecord(function(____type)
398
+ return __TS__New(
399
+ TriggerEvent,
400
+ function(trigger)
401
+ for ____, player in ipairs(____exports.Player.all) do
402
+ triggerRegisterPlayerAllianceChange(trigger, player.handle, nativeByPlayerAllianceType[____type])
403
+ end
404
+ end,
405
+ function() return ____exports.Player:of(getTriggerPlayer()) end
406
+ )
407
+ end)
408
+ rawset(self, "allianceChangedEvent", event)
409
+ return event
410
+ end}
411
+ )
372
412
  __TS__ObjectDefineProperty(
373
413
  Player,
374
414
  "onLeave",
375
415
  {get = function(self)
376
416
  return ____exports.Player:getEvent(
377
417
  EVENT_PLAYER_LEAVE,
378
- function() return ____exports.Player:of(GetTriggerPlayer()) end
418
+ function() return ____exports.Player:of(getTriggerPlayer()) end
379
419
  )
380
420
  end}
381
421
  )
@@ -385,7 +425,7 @@ __TS__ObjectDefineProperty(
385
425
  {get = function(self)
386
426
  return ____exports.Player:getMouseEvent(
387
427
  EVENT_PLAYER_MOUSE_DOWN,
388
- function() return ____exports.Player:of(GetTriggerPlayer()), BlzGetTriggerPlayerMouseButton() end
428
+ function() return ____exports.Player:of(getTriggerPlayer()), BlzGetTriggerPlayerMouseButton() end
389
429
  )
390
430
  end}
391
431
  )
@@ -395,7 +435,7 @@ __TS__ObjectDefineProperty(
395
435
  {get = function(self)
396
436
  return ____exports.Player:getMouseEvent(
397
437
  EVENT_PLAYER_MOUSE_UP,
398
- function() return ____exports.Player:of(GetTriggerPlayer()), BlzGetTriggerPlayerMouseButton() end
438
+ function() return ____exports.Player:of(getTriggerPlayer()), BlzGetTriggerPlayerMouseButton() end
399
439
  )
400
440
  end}
401
441
  )
@@ -405,7 +445,7 @@ __TS__ObjectDefineProperty(
405
445
  {get = function(self)
406
446
  return ____exports.Player:getMouseEvent(
407
447
  EVENT_PLAYER_MOUSE_MOVE,
408
- function() return ____exports.Player:of(GetTriggerPlayer()), vec2(
448
+ function() return ____exports.Player:of(getTriggerPlayer()), vec2(
409
449
  BlzGetTriggerPlayerMouseX(),
410
450
  BlzGetTriggerPlayerMouseY()
411
451
  ) end
@@ -441,7 +481,7 @@ __TS__ObjectDefineProperty(
441
481
  TriggerRegisterPlayerChatEvent(trigger, player.handle, "", false)
442
482
  end
443
483
  end,
444
- function() return ____exports.Player:of(GetTriggerPlayer()), GetEventPlayerChatString() end
484
+ function() return ____exports.Player:of(getTriggerPlayer()), GetEventPlayerChatString() end
445
485
  )
446
486
  rawset(self, "onChat", event)
447
487
  return event
@@ -13,6 +13,8 @@ local ____frame_2Dcoordinates = require("engine.internal.misc.frame-coordinates"
13
13
  local FRAME_MAX_Y = ____frame_2Dcoordinates.FRAME_MAX_Y
14
14
  local FRAME_MIN_Y = ____frame_2Dcoordinates.FRAME_MIN_Y
15
15
  local getFrameMinXMaxX = ____frame_2Dcoordinates.getFrameMinXMaxX
16
+ local ____get_2Dterrain_2Dz = require("engine.internal.misc.get-terrain-z")
17
+ local getTerrainZ = ____get_2Dterrain_2Dz.getTerrainZ
16
18
  local getHandleId = GetHandleId
17
19
  local setCameraField = SetCameraField
18
20
  local getCameraField = GetCameraField
@@ -26,6 +28,7 @@ local resetToGameCamera = ResetToGameCamera
26
28
  local cos = math.cos
27
29
  local deg = math.deg
28
30
  local sin = math.sin
31
+ local sqrt = math.sqrt
29
32
  local memoized = {}
30
33
  ____exports.PlayerCamera = __TS__Class()
31
34
  local PlayerCamera = ____exports.PlayerCamera
@@ -233,4 +236,45 @@ ____exports.worldCoordinatesToFrame = function(x, y, z)
233
236
  local frameY = 0.42625 - yCenterScreenShift + (cameraAngleOfAttackSinRotationCos * dx + cameraAngleOfAttackSinRotationSin * dy - cameraAngleOfAttackCos * dz) / xPrime
234
237
  return frameX, frameY, xPrime < 0 and frameX >= frameMinX and frameX <= frameMaxX and frameY >= FRAME_MIN_Y and frameY <= FRAME_MAX_Y
235
238
  end
239
+ ---
240
+ -- @internal For use by internal systems only.
241
+ ____exports.frameCoordinatesToWorld = function(x, y)
242
+ if not isCameraViewPrecalculated then
243
+ precalculateCameraView()
244
+ end
245
+ local a = (x - 0.4) * scaleFactor
246
+ local b = (0.42625 - yCenterScreenShift - y) * scaleFactor
247
+ local nx = 1 / sqrt(1 + a * a + b * b)
248
+ local ny = sqrt(1 - (1 + b * b) * nx * nx)
249
+ local nz = sqrt(1 - nx * nx - ny * ny)
250
+ if a > 0 then
251
+ ny = -ny
252
+ end
253
+ if b < 0 then
254
+ nz = -nz
255
+ end
256
+ local nxPrime = cameraAngleOfAttackCosRotationCos * nx - cameraRotationSin * ny + cameraAngleOfAttackSinRotationCos * nz
257
+ local nyPrime = cameraAngleOfAttackCosRotationSin * nx + cameraRotationCos * ny + cameraAngleOfAttackSinRotationSin * nz
258
+ local nzPrime = -cameraAngleOfAttackSin * nx + cameraAngleOfAttackCos * nz
259
+ local zGuess = getTerrainZ(cameraEyeX, cameraEyeY)
260
+ local xGuess = cameraEyeX + nxPrime * (cameraEyeZ - zGuess) / nzPrime
261
+ local yGuess = cameraEyeY + nyPrime * (cameraEyeZ - zGuess) / nzPrime
262
+ local zWorld = getTerrainZ(xGuess, yGuess)
263
+ local deltaZ = zWorld - zGuess
264
+ zGuess = zWorld
265
+ local zWorldOld = zWorld
266
+ local deltaZOld = deltaZ
267
+ local i = 0
268
+ while (deltaZ > 1 or deltaZ < -1) and i < 50 do
269
+ xGuess = cameraEyeX + nxPrime * (cameraEyeZ - zGuess) / nzPrime
270
+ yGuess = cameraEyeY + nyPrime * (cameraEyeZ - zGuess) / nzPrime
271
+ zWorld = getTerrainZ(xGuess, yGuess)
272
+ deltaZ = zWorld - zGuess
273
+ zGuess = (deltaZOld * zWorld - deltaZ * zWorldOld) / (deltaZOld - deltaZ)
274
+ zWorldOld = zWorld
275
+ deltaZOld = deltaZ
276
+ i = i + 1
277
+ end
278
+ return xGuess, yGuess, zWorld, i < 50
279
+ end
236
280
  return ____exports
@@ -5,6 +5,15 @@ export declare class TileCell implements Readonly<Vec2> {
5
5
  readonly y: number;
6
6
  readonly z: undefined;
7
7
  protected constructor(id: number, x: number, y: number, z: undefined);
8
+ get up(): TileCell;
9
+ get down(): TileCell;
10
+ get left(): TileCell;
11
+ get right(): TileCell;
12
+ get terrainTypeId(): number;
13
+ set terrainTypeId(terrainTypeId: number);
14
+ get terrainVariance(): number;
15
+ set terrainVariance(terrainVariance: number);
16
+ randomizeTerrainVariance(): void;
8
17
  isInRangeOf(x: number, y: number, range: number): boolean;
9
18
  isInRangeOf(tileCell: TileCell, range: number): boolean;
10
19
  static getInRect(minX: number, minY: number, maxX: number, maxY: number): TileCell[];
@@ -1,7 +1,11 @@
1
1
  local ____lualib = require("lualib_bundle")
2
2
  local __TS__Class = ____lualib.__TS__Class
3
3
  local __TS__New = ____lualib.__TS__New
4
+ local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
4
5
  local ____exports = {}
6
+ local getTerrainType = GetTerrainType
7
+ local setTerrainType = SetTerrainType
8
+ local getTerrainVariance = GetTerrainVariance
5
9
  local abs = math.abs
6
10
  local ____type = math.type
7
11
  local ult = math.ult
@@ -16,6 +20,18 @@ function TileCell.prototype.____constructor(self, id, x, y, z)
16
20
  self.z = z
17
21
  tileCellById[id] = self
18
22
  end
23
+ function TileCell.prototype.randomizeTerrainVariance(self)
24
+ local x = self.x
25
+ local y = self.y
26
+ setTerrainType(
27
+ x,
28
+ y,
29
+ getTerrainType(x, y),
30
+ -1,
31
+ 1,
32
+ 1
33
+ )
34
+ end
19
35
  function TileCell.prototype.isInRangeOf(self, x, y, range)
20
36
  if range == nil then
21
37
  range = y
@@ -97,4 +113,80 @@ function TileCell.of(x, y)
97
113
  nil
98
114
  )
99
115
  end
116
+ __TS__SetDescriptor(
117
+ TileCell.prototype,
118
+ "up",
119
+ {get = function(self)
120
+ return ____exports.TileCell.of(self.x, self.y + 128)
121
+ end},
122
+ true
123
+ )
124
+ __TS__SetDescriptor(
125
+ TileCell.prototype,
126
+ "down",
127
+ {get = function(self)
128
+ return ____exports.TileCell.of(self.x, self.y - 128)
129
+ end},
130
+ true
131
+ )
132
+ __TS__SetDescriptor(
133
+ TileCell.prototype,
134
+ "left",
135
+ {get = function(self)
136
+ return ____exports.TileCell.of(self.x - 128, self.y)
137
+ end},
138
+ true
139
+ )
140
+ __TS__SetDescriptor(
141
+ TileCell.prototype,
142
+ "right",
143
+ {get = function(self)
144
+ return ____exports.TileCell.of(self.x + 128, self.y)
145
+ end},
146
+ true
147
+ )
148
+ __TS__SetDescriptor(
149
+ TileCell.prototype,
150
+ "terrainTypeId",
151
+ {
152
+ get = function(self)
153
+ return getTerrainType(self.x, self.y)
154
+ end,
155
+ set = function(self, terrainTypeId)
156
+ local x = self.x
157
+ local y = self.y
158
+ setTerrainType(
159
+ x,
160
+ y,
161
+ terrainTypeId,
162
+ getTerrainVariance(x, y),
163
+ 1,
164
+ 1
165
+ )
166
+ end
167
+ },
168
+ true
169
+ )
170
+ __TS__SetDescriptor(
171
+ TileCell.prototype,
172
+ "terrainVariance",
173
+ {
174
+ get = function(self)
175
+ return getTerrainVariance(self.x, self.y)
176
+ end,
177
+ set = function(self, terrainVariance)
178
+ local x = self.x
179
+ local y = self.y
180
+ setTerrainType(
181
+ x,
182
+ y,
183
+ getTerrainType(x, y),
184
+ terrainVariance,
185
+ 1,
186
+ 1
187
+ )
188
+ end
189
+ },
190
+ true
191
+ )
100
192
  return ____exports
@@ -1,6 +1,7 @@
1
1
  /** @noSelfInFile */
2
2
  import { Event } from "../../event";
3
3
  import { AbstractDestroyable, Destructor } from "../../destroyable";
4
+ import { CallbackId } from "../../utility/callback-array";
4
5
  declare const enum TimerPropertyKey {
5
6
  HANDLE = 0,
6
7
  DESTROY_ON_EXPIRATION = 1,
@@ -22,8 +23,8 @@ export declare class Timer extends AbstractDestroyable {
22
23
  pause(): void;
23
24
  resume(): void;
24
25
  static create(): Timer;
25
- static run<T, K extends KeysOfType<T, (this: T, ...args: any) => any>>(object: T, key: K, ...parameters: T[K] extends (this: T, ...args: any) => any ? Parameters<T[K]> : never): void;
26
- static run<Args extends any[]>(callback: (this: void, ...args: Args) => void, ...args: Args): void;
26
+ static run<T, K extends KeysOfType<T, (this: T, ...args: any) => any>>(object: T, key: K, ...parameters: T[K] extends (this: T, ...args: any) => any ? Parameters<T[K]> : never): CallbackId;
27
+ static run<Args extends any[]>(callback: (this: void, ...args: Args) => void, ...args: Args): CallbackId;
27
28
  static simple<Args extends any[]>(timeout: number, callback: (...args: Args) => void, ...args: Args): Timer;
28
29
  static periodic<Args extends any[]>(period: number, callback: (this: void, timer: Timer, ...args: Args) => void, ...args: Args): Timer;
29
30
  static counted(period: number, count: number, callback: (this: void, timer: Timer) => void): Timer;
@@ -12,6 +12,11 @@ local ____objectPool = require("util.objectPool")
12
12
  local ObjectPool = ____objectPool.ObjectPool
13
13
  local ____destroyable = require("destroyable")
14
14
  local AbstractDestroyable = ____destroyable.AbstractDestroyable
15
+ local ____callback_2Darray = require("utility.callback-array")
16
+ local addCallback = ____callback_2Darray.addCallback
17
+ local callbackArray = ____callback_2Darray.callbackArray
18
+ local consumeCallback = ____callback_2Darray.consumeCallback
19
+ local consumeCallbacks = ____callback_2Darray.consumeCallbacks
15
20
  local createTimer = CreateTimer
16
21
  local timerStart = TimerStart
17
22
  local pauseTimer = PauseTimer
@@ -49,6 +54,17 @@ local function timerSafeCall()
49
54
  end
50
55
  end
51
56
  end
57
+ local zeroTimerScheduled = false
58
+ local zeroTimerCallbacks = callbackArray()
59
+ ---
60
+ -- @internal For use by internal systems only.
61
+ ____exports.consumeZeroTimerCallback = function(id)
62
+ consumeCallback(zeroTimerCallbacks, id)
63
+ end
64
+ local function invokeZeroTimerCallbacks()
65
+ zeroTimerScheduled = false
66
+ consumeCallbacks(zeroTimerCallbacks)
67
+ end
52
68
  ____exports.Timer = __TS__Class()
53
69
  local Timer = ____exports.Timer
54
70
  Timer.name = "Timer"
@@ -83,10 +99,14 @@ function Timer.create(self)
83
99
  return __TS__New(____exports.Timer)
84
100
  end
85
101
  function Timer.run(self, objectOrCallback, keyOrFirstArg, ...)
102
+ if not zeroTimerScheduled then
103
+ zeroTimerScheduled = true
104
+ ____exports.Timer:simple(0, invokeZeroTimerCallbacks)
105
+ end
86
106
  if ____type(objectOrCallback) == "function" then
87
- ____exports.Timer:simple(0, objectOrCallback, keyOrFirstArg, ...)
107
+ return addCallback(zeroTimerCallbacks, objectOrCallback, keyOrFirstArg, ...)
88
108
  else
89
- ____exports.Timer:simple(0, objectOrCallback[keyOrFirstArg], objectOrCallback, ...)
109
+ return addCallback(zeroTimerCallbacks, objectOrCallback[keyOrFirstArg], objectOrCallback, ...)
90
110
  end
91
111
  end
92
112
  function Timer.simple(self, timeout, callback, ...)
package/decl/native.d.ts CHANGED
@@ -5259,8 +5259,8 @@ declare function BlzRemoveAbilityStringLevelArrayField(
5259
5259
  level: number,
5260
5260
  value: string,
5261
5261
  ): boolean
5262
- declare function BlzGetItemAbilityByIndex(whichItem: jitem, index: number): jability | null
5263
- declare function BlzGetItemAbility(whichItem: jitem, abilCode: number): jability | null
5262
+ declare function BlzGetItemAbilityByIndex(whichItem: jitem, index: number): jability | undefined
5263
+ declare function BlzGetItemAbility(whichItem: jitem, abilCode: number): jability | undefined
5264
5264
  declare function BlzItemAddAbility(whichItem: jitem, abilCode: number): boolean
5265
5265
  declare function BlzGetItemBooleanField(whichItem: jitem, whichField: jitembooleanfield): boolean
5266
5266
  declare function BlzGetItemIntegerField(whichItem: jitem, whichField: jitemintegerfield): number
@@ -1,5 +1,6 @@
1
1
  /** @noSelfInFile */
2
2
  import { AbstractDestroyable, Destructor } from "../destroyable";
3
+ import { Event } from "../event";
3
4
  export type BehaviorConstructor<T extends Behavior<AnyNotNil>, Parameters extends any[] = any[]> = OmitConstructor<typeof Behavior<any>> & (abstract new (...parameters: Parameters) => T);
4
5
  declare const enum BehaviorPropertyKey {
5
6
  PREVIOUS_BEHAVIOR = 0,
@@ -13,6 +14,8 @@ export declare abstract class Behavior<T extends AnyNotNil, PeriodicActionParame
13
14
  private [BehaviorPropertyKey.TIMER]?;
14
15
  protected constructor(object: T);
15
16
  protected onDestroy(): Destructor;
17
+ protected registerEvent<K extends string, Args extends any[]>(this: Behavior<any, PeriodicActionParameters> & Record<K, (this: this, ...args: Args) => unknown>, event: Event<[...Args]>, listener: K): void;
18
+ protected deregisterEvent(event: Event<any>): boolean;
16
19
  protected onPeriod(...parameters: PeriodicActionParameters): void;
17
20
  protected startPeriodicAction(interval: number, ...parameters: PeriodicActionParameters): void;
18
21
  protected stopPeriodicAction(): void;
@@ -2,6 +2,7 @@ local ____lualib = require("lualib_bundle")
2
2
  local __TS__InstanceOf = ____lualib.__TS__InstanceOf
3
3
  local __TS__Class = ____lualib.__TS__Class
4
4
  local __TS__ClassExtends = ____lualib.__TS__ClassExtends
5
+ local __TS__New = ____lualib.__TS__New
5
6
  local ____exports = {}
6
7
  local ____destroyable = require("destroyable")
7
8
  local AbstractDestroyable = ____destroyable.AbstractDestroyable
@@ -9,6 +10,13 @@ local ____timer = require("core.types.timer")
9
10
  local Timer = ____timer.Timer
10
11
  local ____functions = require("utility.functions")
11
12
  local increment = ____functions.increment
13
+ local ____linked_2Dset = require("utility.linked-set")
14
+ local LinkedSet = ____linked_2Dset.LinkedSet
15
+ local ____lua_2Dmaps = require("utility.lua-maps")
16
+ local getOrPut = ____lua_2Dmaps.getOrPut
17
+ local mutableLuaMap = ____lua_2Dmaps.mutableLuaMap
18
+ local ____lua_2Dsets = require("utility.lua-sets")
19
+ local mutableLuaSet = ____lua_2Dsets.mutableLuaSet
12
20
  local safeCall = warpack.safeCall
13
21
  local firstBehaviorByObject = {}
14
22
  local lastBehaviorByObject = {}
@@ -47,6 +55,9 @@ local function reduceBehaviors(behaviorConstructor, object, operation, initial,
47
55
  end
48
56
  return accumulator
49
57
  end
58
+ local behaviorsByEvent = {}
59
+ local listenerByBehaviorByEvent = {}
60
+ local eventsByBehavior = {}
50
61
  ____exports.Behavior = __TS__Class()
51
62
  local Behavior = ____exports.Behavior
52
63
  Behavior.name = "Behavior"
@@ -69,6 +80,20 @@ function Behavior.prototype.onDestroy(self)
69
80
  if ____opt_0 ~= nil then
70
81
  ____opt_0:destroy()
71
82
  end
83
+ local events = eventsByBehavior[self]
84
+ if events ~= nil then
85
+ for event in pairs(events) do
86
+ local ____opt_2 = behaviorsByEvent[event]
87
+ if ____opt_2 ~= nil then
88
+ ____opt_2:remove(self)
89
+ end
90
+ local ____opt_4 = listenerByBehaviorByEvent[event]
91
+ if ____opt_4 ~= nil then
92
+ ____opt_4[self] = nil
93
+ end
94
+ end
95
+ eventsByBehavior[self] = nil
96
+ end
72
97
  local previousBehavior = self[0]
73
98
  local nextBehavior = self[1]
74
99
  if previousBehavior ~= nil then
@@ -83,6 +108,34 @@ function Behavior.prototype.onDestroy(self)
83
108
  end
84
109
  return AbstractDestroyable.prototype.onDestroy(self)
85
110
  end
111
+ function Behavior.prototype.registerEvent(self, event, listener)
112
+ local listenerByBehavior = getOrPut(listenerByBehaviorByEvent, event, mutableLuaMap)
113
+ listenerByBehavior[self] = listener
114
+ getOrPut(eventsByBehavior, self, mutableLuaSet)[event] = true
115
+ local behaviors = behaviorsByEvent[event]
116
+ if behaviors == nil then
117
+ event:addListener(function(...)
118
+ local behaviors = behaviorsByEvent[event]
119
+ if behaviors ~= nil then
120
+ for behavior in pairs(behaviors) do
121
+ safeCall(behavior[listenerByBehavior[behavior]], behavior, ...)
122
+ end
123
+ end
124
+ end)
125
+ behaviors = __TS__New(LinkedSet)
126
+ behaviorsByEvent[event] = behaviors
127
+ end
128
+ behaviors:add(self)
129
+ end
130
+ function Behavior.prototype.deregisterEvent(self, event)
131
+ local behaviors = behaviorsByEvent[event]
132
+ if behaviors ~= nil and behaviors:remove(self) then
133
+ eventsByBehavior[self][event] = nil
134
+ listenerByBehaviorByEvent[event][self] = nil
135
+ return true
136
+ end
137
+ return false
138
+ end
86
139
  function Behavior.prototype.onPeriod(self, ...)
87
140
  end
88
141
  function Behavior.prototype.startPeriodicAction(self, interval, ...)
@@ -14,3 +14,12 @@ export declare class RemoveBuffsSelfAbilityBehavior extends AbilityBehavior {
14
14
  constructor(ability: Ability, polarity?: AbilityDependentValue<BuffPolarity> | undefined, resistanceType?: AbilityDependentValue<BuffResistanceType> | undefined, includeExpirationTimers?: AbilityDependentValue<boolean> | undefined, includeAuras?: AbilityDependentValue<boolean> | undefined, autoDispel?: AbilityDependentValue<boolean> | undefined);
15
15
  onImpact(caster: Unit): void;
16
16
  }
17
+ export declare class RemoveBuffsTargetAbilityBehavior extends AbilityBehavior {
18
+ private readonly polarity?;
19
+ private readonly resistanceType?;
20
+ private readonly includeExpirationTimers?;
21
+ private readonly includeAuras?;
22
+ private readonly autoDispel?;
23
+ constructor(ability: Ability, polarity?: AbilityDependentValue<BuffPolarity> | undefined, resistanceType?: AbilityDependentValue<BuffResistanceType> | undefined, includeExpirationTimers?: AbilityDependentValue<boolean> | undefined, includeAuras?: AbilityDependentValue<boolean> | undefined, autoDispel?: AbilityDependentValue<boolean> | undefined);
24
+ onUnitTargetImpact(_: Unit, target: Unit): void;
25
+ }
@@ -25,4 +25,25 @@ function RemoveBuffsSelfAbilityBehavior.prototype.onImpact(self, caster)
25
25
  self:resolveCurrentAbilityDependentValue(self.autoDispel)
26
26
  )
27
27
  end
28
+ ____exports.RemoveBuffsTargetAbilityBehavior = __TS__Class()
29
+ local RemoveBuffsTargetAbilityBehavior = ____exports.RemoveBuffsTargetAbilityBehavior
30
+ RemoveBuffsTargetAbilityBehavior.name = "RemoveBuffsTargetAbilityBehavior"
31
+ __TS__ClassExtends(RemoveBuffsTargetAbilityBehavior, AbilityBehavior)
32
+ function RemoveBuffsTargetAbilityBehavior.prototype.____constructor(self, ability, polarity, resistanceType, includeExpirationTimers, includeAuras, autoDispel)
33
+ AbilityBehavior.prototype.____constructor(self, ability)
34
+ self.polarity = polarity
35
+ self.resistanceType = resistanceType
36
+ self.includeExpirationTimers = includeExpirationTimers
37
+ self.includeAuras = includeAuras
38
+ self.autoDispel = autoDispel
39
+ end
40
+ function RemoveBuffsTargetAbilityBehavior.prototype.onUnitTargetImpact(self, _, target)
41
+ target:removeBuffs(
42
+ self:resolveCurrentAbilityDependentValue(self.polarity),
43
+ self:resolveCurrentAbilityDependentValue(self.resistanceType),
44
+ self:resolveCurrentAbilityDependentValue(self.includeExpirationTimers),
45
+ self:resolveCurrentAbilityDependentValue(self.includeAuras),
46
+ self:resolveCurrentAbilityDependentValue(self.autoDispel)
47
+ )
48
+ end
28
49
  return ____exports