warscript 0.0.1-dev.9cbb1ff → 0.0.1-dev.9e6f20e

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 (184) hide show
  1. package/attributes.d.ts +6 -0
  2. package/attributes.lua +17 -1
  3. package/core/types/frame.d.ts +1 -0
  4. package/core/types/frame.lua +136 -58
  5. package/core/types/handle.lua +6 -9
  6. package/core/types/item.d.ts +1 -0
  7. package/core/types/item.lua +1 -0
  8. package/core/types/player.d.ts +17 -1
  9. package/core/types/player.lua +70 -24
  10. package/core/types/playerCamera.d.ts +2 -0
  11. package/core/types/playerCamera.lua +123 -5
  12. package/core/types/sound.lua +1 -1
  13. package/core/types/tileCell.d.ts +11 -1
  14. package/core/types/tileCell.lua +97 -0
  15. package/core/types/timer.d.ts +3 -1
  16. package/core/types/timer.lua +27 -2
  17. package/decl/native.d.ts +846 -790
  18. package/destroyable.d.ts +1 -0
  19. package/destroyable.lua +9 -0
  20. package/engine/behavior.d.ts +14 -1
  21. package/engine/behavior.lua +230 -70
  22. package/engine/behaviour/ability/apply-buff.lua +5 -5
  23. package/engine/behaviour/ability/damage.d.ts +9 -3
  24. package/engine/behaviour/ability/damage.lua +31 -37
  25. package/engine/behaviour/ability/emulate-impact.d.ts +1 -1
  26. package/engine/behaviour/ability/emulate-impact.lua +16 -7
  27. package/engine/behaviour/ability/remove-buffs.d.ts +9 -0
  28. package/engine/behaviour/ability/remove-buffs.lua +21 -0
  29. package/engine/behaviour/ability/restore-mana.d.ts +1 -1
  30. package/engine/behaviour/ability/restore-mana.lua +6 -6
  31. package/engine/behaviour/ability.d.ts +11 -6
  32. package/engine/behaviour/ability.lua +38 -17
  33. package/engine/behaviour/unit/stun-immunity.d.ts +12 -6
  34. package/engine/behaviour/unit/stun-immunity.lua +57 -31
  35. package/engine/behaviour/unit.d.ts +39 -3
  36. package/engine/behaviour/unit.lua +269 -6
  37. package/engine/buff.d.ts +67 -22
  38. package/engine/buff.lua +371 -182
  39. package/engine/internal/ability.d.ts +7 -1
  40. package/engine/internal/ability.lua +64 -24
  41. package/engine/internal/item/ability.lua +63 -11
  42. package/engine/internal/item/fields.d.ts +12 -0
  43. package/engine/internal/item/fields.lua +33 -0
  44. package/engine/internal/item+owner.lua +12 -6
  45. package/engine/internal/item.d.ts +16 -16
  46. package/engine/internal/item.lua +152 -69
  47. package/engine/internal/mechanics/cast-ability.lua +6 -3
  48. package/engine/internal/misc/damage-metadata-by-target.lua +5 -0
  49. package/engine/internal/misc/frame-coordinates.d.ts +2 -0
  50. package/engine/internal/misc/frame-coordinates.lua +21 -0
  51. package/engine/internal/misc/get-terrain-z.d.ts +2 -0
  52. package/engine/internal/misc/get-terrain-z.lua +11 -0
  53. package/engine/internal/misc/player-local-handle.d.ts +2 -0
  54. package/engine/internal/misc/player-local-handle.lua +5 -0
  55. package/engine/internal/object-data/armor-bonus.d.ts +2 -0
  56. package/engine/internal/object-data/attribute-bonus.lua +2 -2
  57. package/engine/internal/object-data/health-bonus.d.ts +2 -0
  58. package/engine/internal/object-data/health-bonus.lua +16 -0
  59. package/engine/internal/object-data/mana-bonus.d.ts +2 -0
  60. package/engine/internal/object-data/mana-bonus.lua +16 -0
  61. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.d.ts +2 -0
  62. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.lua +16 -0
  63. package/engine/internal/unit/ability.d.ts +35 -0
  64. package/engine/internal/unit/ability.lua +113 -12
  65. package/engine/internal/unit/allowed-targets.d.ts +1 -1
  66. package/engine/internal/unit/allowed-targets.lua +9 -1
  67. package/engine/internal/unit/attributes.d.ts +17 -0
  68. package/engine/internal/unit/attributes.lua +46 -0
  69. package/engine/internal/unit/bonus.d.ts +6 -0
  70. package/engine/internal/unit/bonus.lua +33 -3
  71. package/engine/internal/unit/buff.d.ts +2 -2
  72. package/engine/internal/unit/buff.lua +32 -17
  73. package/engine/internal/unit/fly-height.d.ts +7 -0
  74. package/engine/internal/unit/fly-height.lua +20 -0
  75. package/engine/internal/unit/interrupts.d.ts +12 -0
  76. package/engine/internal/unit/interrupts.lua +28 -0
  77. package/engine/internal/unit/main-selected.lua +12 -27
  78. package/engine/internal/unit/order.d.ts +20 -0
  79. package/engine/internal/unit/order.lua +136 -0
  80. package/engine/internal/unit/pseudo-passive-abilities.d.ts +2 -0
  81. package/engine/internal/unit/pseudo-passive-abilities.lua +11 -0
  82. package/engine/internal/unit/range-event.d.ts +12 -0
  83. package/engine/internal/unit/range-event.lua +90 -0
  84. package/engine/internal/unit/scale.d.ts +7 -0
  85. package/engine/internal/unit/scale.lua +20 -0
  86. package/engine/internal/unit+ability.lua +10 -1
  87. package/engine/internal/unit+bonus.lua +3 -3
  88. package/engine/internal/unit+damage.d.ts +2 -11
  89. package/engine/internal/unit+damage.lua +10 -14
  90. package/engine/internal/unit+spellSteal.lua +1 -2
  91. package/engine/internal/unit-missile-launch.lua +52 -14
  92. package/engine/internal/unit.d.ts +34 -27
  93. package/engine/internal/unit.lua +365 -273
  94. package/engine/local-client.d.ts +7 -0
  95. package/engine/local-client.lua +86 -1
  96. package/engine/object-data/auxiliary/armor-type.d.ts +11 -0
  97. package/engine/object-data/auxiliary/armor-type.lua +46 -0
  98. package/engine/object-data/auxiliary/attack-type.d.ts +7 -8
  99. package/engine/object-data/auxiliary/attack-type.lua +42 -0
  100. package/engine/object-data/auxiliary/health-regeneration-type.d.ts +8 -0
  101. package/engine/object-data/auxiliary/health-regeneration-type.lua +2 -0
  102. package/engine/object-data/auxiliary/unit-attribute.lua +1 -1
  103. package/engine/object-data/entry/ability-type/{armor-increase.d.ts → armor-bonus.d.ts} +3 -3
  104. package/engine/object-data/entry/ability-type/{armor-increase.lua → armor-bonus.lua} +9 -9
  105. package/engine/object-data/entry/ability-type/blank-configurable.d.ts +3 -0
  106. package/engine/object-data/entry/ability-type/blank-configurable.lua +30 -0
  107. package/engine/object-data/entry/ability-type/health-bonus.d.ts +8 -0
  108. package/engine/object-data/entry/ability-type/health-bonus.lua +26 -0
  109. package/engine/object-data/entry/ability-type/mana-bonus.d.ts +8 -0
  110. package/engine/object-data/entry/ability-type/mana-bonus.lua +26 -0
  111. package/engine/object-data/entry/ability-type/mana-regeneration.d.ts +8 -0
  112. package/engine/object-data/entry/ability-type/mana-regeneration.lua +26 -0
  113. package/engine/object-data/entry/ability-type/permanent-invisibility.d.ts +8 -0
  114. package/engine/object-data/entry/ability-type/permanent-invisibility.lua +26 -0
  115. package/engine/object-data/entry/ability-type/reincarnation.d.ts +8 -0
  116. package/engine/object-data/entry/ability-type/reincarnation.lua +26 -0
  117. package/engine/object-data/entry/ability-type.d.ts +2 -0
  118. package/engine/object-data/entry/ability-type.lua +89 -8
  119. package/engine/object-data/entry/buff-type/applicable.lua +113 -109
  120. package/engine/object-data/entry/destructible-type.d.ts +27 -1
  121. package/engine/object-data/entry/destructible-type.lua +155 -0
  122. package/engine/object-data/entry/unit-type.d.ts +17 -4
  123. package/engine/object-data/entry/unit-type.lua +189 -83
  124. package/engine/object-field/ability.d.ts +4 -4
  125. package/engine/object-field/ability.lua +9 -8
  126. package/engine/object-field/item.d.ts +22 -0
  127. package/engine/object-field/item.lua +118 -0
  128. package/engine/object-field/unit.d.ts +72 -3
  129. package/engine/object-field/unit.lua +268 -7
  130. package/engine/object-field.d.ts +18 -7
  131. package/engine/object-field.lua +294 -135
  132. package/engine/random.d.ts +10 -0
  133. package/engine/random.lua +21 -0
  134. package/engine/standard/fields/ability.d.ts +2 -2
  135. package/engine/standard/fields/ability.lua +2 -2
  136. package/engine/standard/fields/item.d.ts +4 -0
  137. package/engine/standard/fields/item.lua +6 -0
  138. package/engine/standard/fields/unit.d.ts +12 -0
  139. package/engine/standard/fields/unit.lua +20 -0
  140. package/engine/synchronization.d.ts +11 -0
  141. package/engine/synchronization.lua +77 -0
  142. package/engine/text-tag.d.ts +36 -2
  143. package/engine/text-tag.lua +250 -10
  144. package/engine/unit.d.ts +6 -0
  145. package/engine/unit.lua +6 -0
  146. package/event.d.ts +1 -1
  147. package/lualib_bundle.lua +1 -1
  148. package/math.d.ts +2 -0
  149. package/math.lua +14 -0
  150. package/net/socket.lua +1 -1
  151. package/network.lua +25 -1
  152. package/objutil/buff.lua +11 -10
  153. package/objutil/object.lua +1 -1
  154. package/operation.d.ts +8 -1
  155. package/operation.lua +38 -18
  156. package/package.json +5 -5
  157. package/patch-lua.lua +15 -0
  158. package/patch-lualib.lua +1 -1
  159. package/utility/arrays.d.ts +2 -0
  160. package/utility/arrays.lua +11 -0
  161. package/utility/callback-array.d.ts +17 -0
  162. package/utility/callback-array.lua +61 -0
  163. package/utility/functions.d.ts +8 -0
  164. package/utility/functions.lua +13 -0
  165. package/utility/linked-map.d.ts +35 -0
  166. package/utility/linked-map.lua +107 -0
  167. package/utility/linked-set.d.ts +4 -1
  168. package/utility/linked-set.lua +46 -1
  169. package/utility/lua-maps.d.ts +12 -2
  170. package/utility/lua-maps.lua +37 -2
  171. package/utility/lua-sets.d.ts +1 -0
  172. package/utility/lua-sets.lua +4 -0
  173. package/utility/random.d.ts +102 -0
  174. package/utility/random.lua +273 -0
  175. package/utility/records.lua +20 -1
  176. package/utility/types.d.ts +3 -0
  177. package/utility/unordered-map.d.ts +27 -0
  178. package/utility/unordered-map.lua +99 -0
  179. package/core/types/order.d.ts +0 -25
  180. package/core/types/order.lua +0 -55
  181. /package/engine/internal/{object-data/armor-increase.d.ts → misc/damage-metadata-by-target.d.ts} +0 -0
  182. /package/engine/internal/object-data/{armor-increase.lua → armor-bonus.lua} +0 -0
  183. /package/engine/object-data/entry/ability-type/{attribute-increase.d.ts → attribute-bonus.d.ts} +0 -0
  184. /package/engine/object-data/entry/ability-type/{attribute-increase.lua → attribute-bonus.lua} +0 -0
package/attributes.d.ts CHANGED
@@ -1,12 +1,18 @@
1
1
  /** @noSelfInFile */
2
+ declare const marker: {};
2
3
  export type Attribute<T> = {
3
4
  readonly __attribute: unique symbol;
4
5
  readonly __type: T;
6
+ readonly __marker: typeof marker;
5
7
  } & symbol;
8
+ export declare const attribute: <T>() => Attribute<T>;
9
+ export declare const isAttribute: (value: unknown) => value is Attribute<unknown>;
6
10
  export declare namespace Attribute {
7
11
  const create: <T>() => Attribute<T>;
8
12
  }
9
13
  export declare class AttributesHolder {
10
14
  readonly get: (<T>(attribute: Attribute<T>) => T | undefined) & LuaExtension<"TableGetMethod">;
11
15
  readonly set: (<T>(attribute: Attribute<T>, value: T | undefined) => void) & LuaExtension<"TableSetMethod">;
16
+ getOrPut<T>(attribute: Attribute<T>, defaultValue: () => T): T;
12
17
  }
18
+ export {};
package/attributes.lua CHANGED
@@ -1,11 +1,18 @@
1
1
  local ____lualib = require("lualib_bundle")
2
2
  local __TS__Class = ____lualib.__TS__Class
3
3
  local ____exports = {}
4
+ local marker = {}
5
+ ____exports.attribute = function()
6
+ return {__marker = marker}
7
+ end
8
+ ____exports.isAttribute = function(value)
9
+ return type(value) == "table" and rawget(value, "__marker") == marker
10
+ end
4
11
  ____exports.Attribute = {}
5
12
  local Attribute = ____exports.Attribute
6
13
  do
7
14
  Attribute.create = function()
8
- return {}
15
+ return {__marker = marker}
9
16
  end
10
17
  end
11
18
  ____exports.AttributesHolder = __TS__Class()
@@ -13,4 +20,13 @@ local AttributesHolder = ____exports.AttributesHolder
13
20
  AttributesHolder.name = "AttributesHolder"
14
21
  function AttributesHolder.prototype.____constructor(self)
15
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
16
32
  return ____exports
@@ -80,6 +80,7 @@ export declare class Frame extends Handle<jframehandle> {
80
80
  get onMouseLeave(): FrameEvent;
81
81
  get onMouseUp(): FrameEvent;
82
82
  get onMouseWheel(): FrameEvent<[number]>;
83
+ private trackMouseLocally;
83
84
  get mouseEnterLocalEvent(): Event;
84
85
  get mouseLeaveLocalEvent(): Event;
85
86
  get popupMenuItemChangeEvent(): FrameEvent<[
@@ -15,13 +15,32 @@ local Event = ____event.Event
15
15
  local TriggerEvent = ____event.TriggerEvent
16
16
  local ____timer = require("core.types.timer")
17
17
  local Timer = ____timer.Timer
18
+ local ____frame_2Dcoordinates = require("engine.internal.misc.frame-coordinates")
19
+ local FRAME_MAX_Y = ____frame_2Dcoordinates.FRAME_MAX_Y
20
+ local FRAME_MIN_Y = ____frame_2Dcoordinates.FRAME_MIN_Y
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
27
+ local ____lua_2Dsets = require("utility.lua-sets")
28
+ local mutableLuaSet = ____lua_2Dsets.mutableLuaSet
29
+ local ____socket = require("net.socket")
30
+ local Socket = ____socket.Socket
31
+ local ____lua_2Dmaps = require("utility.lua-maps")
32
+ local getOrPut = ____lua_2Dmaps.getOrPut
33
+ local luaMapInvert = ____lua_2Dmaps.luaMapInvert
34
+ local luaMapOf = ____lua_2Dmaps.luaMapOf
35
+ local mutableLuaMap = ____lua_2Dmaps.mutableLuaMap
18
36
  local frameClick = BlzFrameClick
19
37
  local frameGetEnable = BlzFrameGetEnable
20
38
  local frameIsVisible = BlzFrameIsVisible
21
39
  local frameSetEnable = BlzFrameSetEnable
22
40
  local frameSetScale = BlzFrameSetScale
23
- local getCameraTargetPositionX = GetCameraTargetPositionX
24
- local getCameraTargetPositionY = GetCameraTargetPositionY
41
+ local getHandleId = GetHandleId
42
+ local getOriginFrame = BlzGetOriginFrame
43
+ local location = Location
25
44
  local ____rawget = _G.rawget
26
45
  local rawset = _G.rawset
27
46
  local invoke = Event.invoke
@@ -123,6 +142,79 @@ do
123
142
  FramePoint.BOTTOM_RIGHT = FRAMEPOINT_BOTTOMRIGHT
124
143
  end
125
144
  local tooltipByFrame = setmetatable({}, {__mode = "k"})
145
+ local isMouseInsideLocallyByFrame = mutableLuaMap()
146
+ local mouseEnterLocalEventByFrame = mutableLuaMap()
147
+ local mouseLeaveLocalEventByFrame = mutableLuaMap()
148
+ local isLocalMouseTrackingStarted = false
149
+ --- Reused across ticks to avoid per-tick allocations: only the first `leftFrameCount` /
150
+ -- `enteredFrameCount` entries are meaningful, stale entries beyond them are never read and are
151
+ -- kept collectable by the weak values mode.
152
+ local leftFrames = setmetatable({}, {__mode = "v"})
153
+ local enteredFrames = setmetatable({}, {__mode = "v"})
154
+ --- All frames share a single poll which invokes every mouse leave event before any mouse enter
155
+ -- event within the same tick. With a poll per event, the invocation order would depend on the
156
+ -- event creation order instead, breaking listeners relying on the natural "leave the old frame,
157
+ -- then enter the new frame" order.
158
+ local function startLocalMouseTracking()
159
+ if isLocalMouseTrackingStarted then
160
+ return
161
+ end
162
+ isLocalMouseTrackingStarted = true
163
+ Timer.onPeriod[1 / 64]:addListener(function()
164
+ local leftFrameCount = 0
165
+ local enteredFrameCount = 0
166
+ for frame, wasMouseInside in pairs(isMouseInsideLocallyByFrame) do
167
+ local tooltip = tooltipByFrame[frame]
168
+ local isMouseInside = tooltip ~= nil and tooltip.visible
169
+ if isMouseInside ~= wasMouseInside then
170
+ isMouseInsideLocallyByFrame[frame] = isMouseInside
171
+ if isMouseInside then
172
+ enteredFrames[enteredFrameCount + 1] = frame
173
+ enteredFrameCount = enteredFrameCount + 1
174
+ else
175
+ leftFrames[leftFrameCount + 1] = frame
176
+ leftFrameCount = leftFrameCount + 1
177
+ end
178
+ end
179
+ end
180
+ for i = 1, leftFrameCount do
181
+ local event = mouseLeaveLocalEventByFrame[leftFrames[i]]
182
+ if event ~= nil then
183
+ Event.invoke(event)
184
+ end
185
+ end
186
+ for i = 1, enteredFrameCount do
187
+ local event = mouseEnterLocalEventByFrame[enteredFrames[i]]
188
+ if event ~= nil then
189
+ Event.invoke(event)
190
+ end
191
+ end
192
+ end)
193
+ end
194
+ local keyByAsyncInitOriginFrameType = luaMapOf(ORIGIN_FRAME_PORTRAIT_HP_TEXT, "hp", ORIGIN_FRAME_PORTRAIT_MANA_TEXT, "mana")
195
+ local asyncInitOriginFrameTypeByKey = luaMapInvert(keyByAsyncInitOriginFrameType)
196
+ local seenAsyncInitOriginFrameTypes = mutableLuaSet()
197
+ local seenAsyncInitOriginFrameTypesSocket = __TS__New(Socket)
198
+ local seenPlayersByAsyncInitOriginFrameType = mutableLuaMap()
199
+ seenAsyncInitOriginFrameTypesSocket.onMessage:addListener(function(player, key)
200
+ local asyncInitOriginFrameType = asyncInitOriginFrameTypeByKey[key]
201
+ if asyncInitOriginFrameType ~= nil then
202
+ getOrPut(seenPlayersByAsyncInitOriginFrameType, asyncInitOriginFrameType, mutableLuaSet)[player] = true
203
+ end
204
+ end)
205
+ local function haveAllPlayersSeenAsyncInitOriginFrameType(frame)
206
+ local players = seenPlayersByAsyncInitOriginFrameType[frame]
207
+ if players == nil then
208
+ return false
209
+ end
210
+ for ____, player in ipairs(Player.all) do
211
+ if player.isUser and player.isPlaying and not (players[player] ~= nil) then
212
+ return false
213
+ end
214
+ end
215
+ keyByAsyncInitOriginFrameType[frame] = nil
216
+ return true
217
+ end
126
218
  ____exports.Frame = __TS__Class()
127
219
  local Frame = ____exports.Frame
128
220
  Frame.name = "Frame"
@@ -155,6 +247,18 @@ function Frame.prototype.getEvent(self, eventType, c)
155
247
  end
156
248
  return self.events[eventId]
157
249
  end
250
+ function Frame.prototype.trackMouseLocally(self)
251
+ if not (tooltipByFrame[self] ~= nil) then
252
+ ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent = self
253
+ local tooltip = ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent == self and ____exports.Frame:createByType("SIMPLEFRAME", "", ____exports.Frame.CONSOLE_UI) or ____exports.Frame:createByType("FRAME", "", ____exports.Frame.GAME_UI)
254
+ ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent = ____exports.Frame.CONSOLE_UI
255
+ self:setTooltip(tooltip)
256
+ end
257
+ if not (isMouseInsideLocallyByFrame[self] ~= nil) then
258
+ isMouseInsideLocallyByFrame[self] = false
259
+ startLocalMouseTracking()
260
+ end
261
+ end
158
262
  function Frame.prototype.hide(self)
159
263
  self.hideCounter = self.hideCounter + 1
160
264
  if self.hideCounter > 0 then
@@ -301,7 +405,17 @@ function Frame.byOrigin(self, frameType, index)
301
405
  if index == nil then
302
406
  index = 0
303
407
  end
304
- return self:of(BlzGetOriginFrame(frameType, index))
408
+ local frame = getOriginFrame(frameType, index)
409
+ local asyncInitOriginFrameTypeKey = keyByAsyncInitOriginFrameType[frameType]
410
+ if index == 0 and asyncInitOriginFrameTypeKey ~= nil and not haveAllPlayersSeenAsyncInitOriginFrameType(frameType) then
411
+ if getHandleId(frame) == 0 or seenAsyncInitOriginFrameTypes[frameType] ~= nil then
412
+ location(0, 0)
413
+ else
414
+ seenAsyncInitOriginFrameTypes[frameType] = true
415
+ seenAsyncInitOriginFrameTypesSocket:send(asyncInitOriginFrameTypeKey)
416
+ end
417
+ end
418
+ return self:of(frame)
305
419
  end
306
420
  Frame.GAME_UI = ____exports.Frame:byOrigin(ORIGIN_FRAME_GAME_UI)
307
421
  Frame.CONSOLE_UI = ____exports.Frame:byOrigin(ORIGIN_FRAME_SIMPLE_UI_PARENT)
@@ -344,27 +458,21 @@ __TS__ObjectDefineProperty(
344
458
  Frame,
345
459
  "minX",
346
460
  {get = function(self)
347
- local w = BlzGetLocalClientWidth()
348
- local h = BlzGetLocalClientHeight()
349
- local width4by3 = (w - h / 600 * 800) / 2
350
- local pxtodpi = 0.6 / h
351
- return -width4by3 * pxtodpi
461
+ local minX = getFrameMinXMaxX()
462
+ return minX
352
463
  end}
353
464
  )
354
465
  __TS__ObjectDefineProperty(
355
466
  Frame,
356
467
  "maxX",
357
468
  {get = function(self)
358
- local w = BlzGetLocalClientWidth()
359
- local h = BlzGetLocalClientHeight()
360
- local width4by3 = (w - h / 600 * 800) / 2
361
- local pxtodpi = 0.6 / h
362
- return (-width4by3 + w) * pxtodpi
469
+ local ____, maxX = getFrameMinXMaxX()
470
+ return maxX
363
471
  end}
364
472
  )
365
473
  Frame.centerX = 0.4
366
- Frame.minY = 0
367
- Frame.maxY = 0.6
474
+ Frame.minY = FRAME_MIN_Y
475
+ Frame.maxY = FRAME_MAX_Y
368
476
  Frame.centerY = 0.3
369
477
  __TS__SetDescriptor(
370
478
  Frame.prototype,
@@ -626,24 +734,8 @@ __TS__SetDescriptor(
626
734
  "mouseEnterLocalEvent",
627
735
  {get = function(self)
628
736
  local event = __TS__New(Event)
629
- if not (tooltipByFrame[self] ~= nil) then
630
- ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent = self
631
- local tooltip = ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent == self and ____exports.Frame:createByType("SIMPLEFRAME", "", ____exports.Frame.CONSOLE_UI) or ____exports.Frame:createByType("FRAME", "", ____exports.Frame.GAME_UI)
632
- ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent = ____exports.Frame.CONSOLE_UI
633
- self:setTooltip(tooltip)
634
- end
635
- local isMouseInside = false
636
- Timer.onPeriod[1 / 64]:addListener(function()
637
- local tooltip = tooltipByFrame[self]
638
- if tooltip and tooltip.visible then
639
- if not isMouseInside then
640
- isMouseInside = true
641
- Event.invoke(event)
642
- end
643
- else
644
- isMouseInside = false
645
- end
646
- end)
737
+ self:trackMouseLocally()
738
+ mouseEnterLocalEventByFrame[self] = event
647
739
  rawset(self, "mouseEnterLocalEvent", event)
648
740
  return event
649
741
  end},
@@ -654,24 +746,8 @@ __TS__SetDescriptor(
654
746
  "mouseLeaveLocalEvent",
655
747
  {get = function(self)
656
748
  local event = __TS__New(Event)
657
- if not (tooltipByFrame[self] ~= nil) then
658
- ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent = self
659
- local tooltip = ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent == self and ____exports.Frame:createByType("SIMPLEFRAME", "", ____exports.Frame.CONSOLE_UI) or ____exports.Frame:createByType("FRAME", "", ____exports.Frame.GAME_UI)
660
- ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent = ____exports.Frame.CONSOLE_UI
661
- self:setTooltip(tooltip)
662
- end
663
- local isMouseInside = false
664
- Timer.onPeriod[1 / 64]:addListener(function()
665
- local tooltip = tooltipByFrame[self]
666
- if tooltip and tooltip.visible then
667
- isMouseInside = true
668
- else
669
- if isMouseInside then
670
- isMouseInside = false
671
- Event.invoke(event)
672
- end
673
- end
674
- end)
749
+ self:trackMouseLocally()
750
+ mouseLeaveLocalEventByFrame[self] = event
675
751
  rawset(self, "mouseLeaveLocalEvent", event)
676
752
  return event
677
753
  end},
@@ -938,16 +1014,19 @@ __TS__ObjectDefineProperty(
938
1014
  local event = __TS__New(Event)
939
1015
  local syncX = 0
940
1016
  local syncY = 0
941
- local syncCamX = getCameraTargetPositionX()
942
- local syncCamY = getCameraTargetPositionY()
1017
+ local syncFrameX = 0
1018
+ local syncFrameY = 0
943
1019
  local lastX = syncX
944
1020
  local lastY = syncY
945
1021
  self.onMouseMove:addListener(function(player, x, y)
946
1022
  if player.isLocal then
947
1023
  syncX = x
948
1024
  syncY = y
949
- syncCamX = getCameraTargetPositionX()
950
- syncCamY = getCameraTargetPositionY()
1025
+ syncFrameX, syncFrameY = worldCoordinatesToFrame(
1026
+ x,
1027
+ y,
1028
+ getTerrainZ(x, y)
1029
+ )
951
1030
  lastX = x
952
1031
  lastY = y
953
1032
  invoke(event, x, y)
@@ -957,9 +1036,8 @@ __TS__ObjectDefineProperty(
957
1036
  if syncX == 0 and syncY == 0 then
958
1037
  return
959
1038
  end
960
- local x = syncX + (getCameraTargetPositionX() - syncCamX)
961
- local y = syncY + (getCameraTargetPositionY() - syncCamY)
962
- if x ~= lastX or y ~= lastY then
1039
+ local x, y, ____, isDefinite = frameCoordinatesToWorld(syncFrameX, syncFrameY)
1040
+ if isDefinite and (x ~= lastX or y ~= lastY) then
963
1041
  lastX = x
964
1042
  lastY = y
965
1043
  invoke(event, x, y)
@@ -15,6 +15,8 @@ local ____exception = require("exception")
15
15
  local IllegalStateException = ____exception.IllegalStateException
16
16
  local ____attributes = require("attributes")
17
17
  local AttributesHolder = ____attributes.AttributesHolder
18
+ local ____preconditions = require("utility.preconditions")
19
+ local checkNotNull = ____preconditions.checkNotNull
18
20
  local getHandleId = GetHandleId
19
21
  local onCreateEventByHandleConstructor = {}
20
22
  local onDestroyEventByHandleConstructor = {}
@@ -66,17 +68,12 @@ function Handle.prototype.onDestroy(self, ...)
66
68
  return nil
67
69
  end
68
70
  function Handle.prototype.destroy(self, ...)
71
+ if self[0] == 2 or self[0] == 3 then
72
+ return nil
73
+ end
69
74
  local clazz = self.constructor
70
75
  local id = getHandleId(self.handle)
71
- if not clazz.memoized[id] then
72
- error(
73
- __TS__New(
74
- IllegalStateException,
75
- "Double-destroy run for handle " .. tostring(id)
76
- ),
77
- 0
78
- )
79
- end
76
+ checkNotNull(clazz.memoized[id])
80
77
  self[0] = 2
81
78
  if self.onDestroyEvent then
82
79
  Event.invoke(self.onDestroyEvent)
@@ -1,4 +1,5 @@
1
1
  /** @noSelfInFile */
2
2
  import { Item } from "../../engine/internal/item";
3
3
  import "../../engine/internal/item+owner";
4
+ import "../../engine/internal/item/fields";
4
5
  export { Item };
@@ -2,5 +2,6 @@ local ____exports = {}
2
2
  local ____item = require("engine.internal.item")
3
3
  local Item = ____item.Item
4
4
  require("engine.internal.item+owner")
5
+ require("engine.internal.item.fields")
5
6
  ____exports.Item = Item
6
7
  return ____exports
@@ -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;
@@ -16,6 +28,7 @@ export declare class Player extends Handle<jplayer> {
16
28
  static readonly neutralExtra: Player;
17
29
  private static events;
18
30
  readonly id: number;
31
+ readonly slotState: jplayerslotstate;
19
32
  constructor(handle: jplayer);
20
33
  onDestroy(): HandleDestructor;
21
34
  toString(): string;
@@ -33,7 +46,6 @@ export declare class Player extends Handle<jplayer> {
33
46
  get isUser(): boolean;
34
47
  get isPlaying(): boolean;
35
48
  get controller(): jmapcontrol;
36
- get slotState(): jplayerslotstate;
37
49
  clearSelection(): void;
38
50
  selectSingle(unit: Unit): void;
39
51
  select(unit: Unit): void;
@@ -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]>;
@@ -66,6 +81,7 @@ export declare class Player extends Handle<jplayer> {
66
81
  };
67
82
  };
68
83
  static get onChat(): Event<[player: Player, message: string]>;
84
+ static readonly colorChangedEvent: Event<[Player]>;
69
85
  static byId(id: number): Player | undefined;
70
86
  }
71
87
  export {};
@@ -1,7 +1,7 @@
1
1
  local ____lualib = require("lualib_bundle")
2
+ local __TS__New = ____lualib.__TS__New
2
3
  local __TS__Class = ____lualib.__TS__Class
3
4
  local __TS__ClassExtends = ____lualib.__TS__ClassExtends
4
- local __TS__New = ____lualib.__TS__New
5
5
  local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
6
6
  local __TS__ObjectDefineProperty = ____lualib.__TS__ObjectDefineProperty
7
7
  local ____exports = {}
@@ -21,20 +21,42 @@ local ____exception = require("exception")
21
21
  local IllegalStateException = ____exception.IllegalStateException
22
22
  local ____math = require("math")
23
23
  local MAXIMUM_INTEGER = ____math.MAXIMUM_INTEGER
24
+ local ____player_2Dlocal_2Dhandle = require("engine.internal.misc.player-local-handle")
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
24
29
  local getPlayerColor = GetPlayerColor
25
30
  local getPlayerName = GetPlayerName
26
31
  local getPlayerTechCount = GetPlayerTechCount
27
32
  local getPlayerTechMaxAllowed = GetPlayerTechMaxAllowed
33
+ local getTriggerPlayer = GetTriggerPlayer
34
+ local setPlayerAlliance = SetPlayerAlliance
28
35
  local setPlayerTechMaxAllowed = SetPlayerTechMaxAllowed
29
36
  local setPlayerTechResearched = SetPlayerTechResearched
30
37
  local setPlayerAbilityAvailable = SetPlayerAbilityAvailable
38
+ local triggerRegisterPlayerAllianceChange = TriggerRegisterPlayerAllianceChange
31
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
+ }
52
+ local playerColorChangedEvent = __TS__New(Event)
32
53
  ____exports.Player = __TS__Class()
33
54
  local Player = ____exports.Player
34
55
  Player.name = "Player"
35
56
  __TS__ClassExtends(Player, Handle)
36
57
  function Player.prototype.____constructor(self, handle)
37
58
  Handle.prototype.____constructor(self, handle)
59
+ self.slotState = GetPlayerSlotState(self.handle)
38
60
  self.id = GetPlayerId(handle)
39
61
  end
40
62
  function Player.prototype.onDestroy(self)
@@ -83,6 +105,12 @@ end
83
105
  function Player.prototype.isEnemyOf(self, other)
84
106
  return IsPlayerEnemy(self.handle, other.handle)
85
107
  end
108
+ function Player.prototype.setAlliance(self, other, ____type, value)
109
+ setPlayerAlliance(self.handle, other.handle, nativeByPlayerAllianceType[____type], value)
110
+ end
111
+ function Player.prototype.getAlliance(self, other, ____type)
112
+ return getPlayerAlliance(self.handle, other.handle, nativeByPlayerAllianceType[____type])
113
+ end
86
114
  function Player.prototype.setAbilityAvailable(self, abilityId, available)
87
115
  setPlayerAbilityAvailable(self.handle, abilityId, available)
88
116
  end
@@ -122,14 +150,11 @@ function Player.getMouseEvent(self, event, collector)
122
150
  self.events[eventId] = __TS__New(
123
151
  TriggerEvent,
124
152
  function(trigger)
125
- Timer:simple(
126
- 0,
127
- function()
128
- for ____, player in ipairs(____exports.Player.all) do
129
- TriggerRegisterPlayerEvent(trigger, player.handle, event)
130
- end
153
+ Timer:run(function()
154
+ for ____, player in ipairs(____exports.Player.all) do
155
+ TriggerRegisterPlayerEvent(trigger, player.handle, event)
131
156
  end
132
- )
157
+ end)
133
158
  end,
134
159
  collector or (function() return {} end)
135
160
  )
@@ -178,7 +203,7 @@ function Player.getKeyEvent(self, isDown)
178
203
  TriggerAddCondition(
179
204
  trigger,
180
205
  Condition(function()
181
- local player = ____exports.Player:of(GetTriggerPlayer())
206
+ local player = ____exports.Player:of(getTriggerPlayer())
182
207
  local key = BlzGetTriggerPlayerKey()
183
208
  local metaKey = BlzGetTriggerPlayerMetaKey()
184
209
  Event.invoke(event, player, key, metaKey)
@@ -249,7 +274,7 @@ Player.all = (function()
249
274
  end
250
275
  return all
251
276
  end)()
252
- Player["local"] = ____exports.Player:of(GetLocalPlayer())
277
+ Player["local"] = ____exports.Player:of(PLAYER_LOCAL_HANDLE)
253
278
  Player.neutralPassive = ____exports.Player.all[PLAYER_NEUTRAL_PASSIVE + 1]
254
279
  Player.neutralAggressive = ____exports.Player.all[PLAYER_NEUTRAL_AGGRESSIVE + 1]
255
280
  Player.neutralVictim = ____exports.Player.all[bj_PLAYER_NEUTRAL_VICTIM + 1]
@@ -277,6 +302,7 @@ __TS__SetDescriptor(
277
302
  end,
278
303
  set = function(self, color)
279
304
  SetPlayerColor(self.handle, color.handle)
305
+ Event.invoke(playerColorChangedEvent, self)
280
306
  end
281
307
  },
282
308
  true
@@ -339,7 +365,7 @@ __TS__SetDescriptor(
339
365
  Player.prototype,
340
366
  "isUser",
341
367
  {get = function(self)
342
- return GetPlayerController(self.handle) == MAP_CONTROL_USER
368
+ return self.controller == MAP_CONTROL_USER
343
369
  end},
344
370
  true
345
371
  )
@@ -347,7 +373,7 @@ __TS__SetDescriptor(
347
373
  Player.prototype,
348
374
  "isPlaying",
349
375
  {get = function(self)
350
- return GetPlayerSlotState(self.handle) == PLAYER_SLOT_STATE_PLAYING
376
+ return self.slotState == PLAYER_SLOT_STATE_PLAYING
351
377
  end},
352
378
  true
353
379
  )
@@ -355,17 +381,30 @@ __TS__SetDescriptor(
355
381
  Player.prototype,
356
382
  "controller",
357
383
  {get = function(self)
358
- return GetPlayerController(self.handle)
384
+ local controller = GetPlayerController(self.handle)
385
+ rawset(self, "controller", controller)
386
+ return controller
359
387
  end},
360
388
  true
361
389
  )
362
- __TS__SetDescriptor(
363
- Player.prototype,
364
- "slotState",
390
+ __TS__ObjectDefineProperty(
391
+ Player,
392
+ "allianceChangedEvent",
365
393
  {get = function(self)
366
- return GetPlayerSlotState(self.handle)
367
- end},
368
- true
394
+ local event = lazyRecord(function(____type)
395
+ return __TS__New(
396
+ TriggerEvent,
397
+ function(trigger)
398
+ for ____, player in ipairs(____exports.Player.all) do
399
+ triggerRegisterPlayerAllianceChange(trigger, player.handle, nativeByPlayerAllianceType[____type])
400
+ end
401
+ end,
402
+ function() return ____exports.Player:of(getTriggerPlayer()) end
403
+ )
404
+ end)
405
+ rawset(self, "allianceChangedEvent", event)
406
+ return event
407
+ end}
369
408
  )
370
409
  __TS__ObjectDefineProperty(
371
410
  Player,
@@ -373,7 +412,7 @@ __TS__ObjectDefineProperty(
373
412
  {get = function(self)
374
413
  return ____exports.Player:getEvent(
375
414
  EVENT_PLAYER_LEAVE,
376
- function() return ____exports.Player:of(GetTriggerPlayer()) end
415
+ function() return ____exports.Player:of(getTriggerPlayer()) end
377
416
  )
378
417
  end}
379
418
  )
@@ -383,7 +422,7 @@ __TS__ObjectDefineProperty(
383
422
  {get = function(self)
384
423
  return ____exports.Player:getMouseEvent(
385
424
  EVENT_PLAYER_MOUSE_DOWN,
386
- function() return ____exports.Player:of(GetTriggerPlayer()), BlzGetTriggerPlayerMouseButton() end
425
+ function() return ____exports.Player:of(getTriggerPlayer()), BlzGetTriggerPlayerMouseButton() end
387
426
  )
388
427
  end}
389
428
  )
@@ -393,7 +432,7 @@ __TS__ObjectDefineProperty(
393
432
  {get = function(self)
394
433
  return ____exports.Player:getMouseEvent(
395
434
  EVENT_PLAYER_MOUSE_UP,
396
- function() return ____exports.Player:of(GetTriggerPlayer()), BlzGetTriggerPlayerMouseButton() end
435
+ function() return ____exports.Player:of(getTriggerPlayer()), BlzGetTriggerPlayerMouseButton() end
397
436
  )
398
437
  end}
399
438
  )
@@ -403,7 +442,7 @@ __TS__ObjectDefineProperty(
403
442
  {get = function(self)
404
443
  return ____exports.Player:getMouseEvent(
405
444
  EVENT_PLAYER_MOUSE_MOVE,
406
- function() return ____exports.Player:of(GetTriggerPlayer()), vec2(
445
+ function() return ____exports.Player:of(getTriggerPlayer()), vec2(
407
446
  BlzGetTriggerPlayerMouseX(),
408
447
  BlzGetTriggerPlayerMouseY()
409
448
  ) end
@@ -439,10 +478,17 @@ __TS__ObjectDefineProperty(
439
478
  TriggerRegisterPlayerChatEvent(trigger, player.handle, "", false)
440
479
  end
441
480
  end,
442
- function() return ____exports.Player:of(GetTriggerPlayer()), GetEventPlayerChatString() end
481
+ function() return ____exports.Player:of(getTriggerPlayer()), GetEventPlayerChatString() end
443
482
  )
444
483
  rawset(self, "onChat", event)
445
484
  return event
446
485
  end}
447
486
  )
487
+ Player.colorChangedEvent = playerColorChangedEvent
488
+ ____exports.Player.onLeave:addListener(
489
+ 999999,
490
+ function(player)
491
+ rawset(player, "slotState", PLAYER_SLOT_STATE_LEFT)
492
+ end
493
+ )
448
494
  return ____exports
@@ -1,4 +1,5 @@
1
1
  /** @noSelfInFile */
2
+ import type { Unit } from "../../engine/internal/unit";
2
3
  export declare class PlayerCamera {
3
4
  private readonly player;
4
5
  private readonly isLocal;
@@ -28,5 +29,6 @@ export declare class PlayerCamera {
28
29
  get roll(): number;
29
30
  set roll(v: number);
30
31
  reset(): void;
32
+ static isUnitInView(unit: Unit): boolean;
31
33
  static of(player: jplayer): PlayerCamera;
32
34
  }