warscript 0.0.1-dev.448dcfb → 0.0.1-dev.459629d

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 (140) hide show
  1. package/attributes.d.ts +1 -0
  2. package/attributes.lua +9 -0
  3. package/core/types/frame.d.ts +1 -0
  4. package/core/types/frame.lua +126 -46
  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 +67 -23
  10. package/core/types/playerCamera.lua +44 -0
  11. package/core/types/sound.lua +1 -1
  12. package/core/types/tileCell.d.ts +11 -1
  13. package/core/types/tileCell.lua +97 -0
  14. package/core/types/timer.d.ts +3 -2
  15. package/core/types/timer.lua +22 -2
  16. package/decl/native.d.ts +2 -2
  17. package/destroyable.d.ts +1 -0
  18. package/destroyable.lua +9 -0
  19. package/engine/behavior.d.ts +12 -1
  20. package/engine/behavior.lua +199 -65
  21. package/engine/behaviour/ability/apply-buff.lua +4 -4
  22. package/engine/behaviour/ability/damage.d.ts +3 -0
  23. package/engine/behaviour/ability/damage.lua +8 -2
  24. package/engine/behaviour/ability/emulate-impact.lua +5 -4
  25. package/engine/behaviour/ability/remove-buffs.d.ts +9 -0
  26. package/engine/behaviour/ability/remove-buffs.lua +21 -0
  27. package/engine/behaviour/ability.d.ts +11 -6
  28. package/engine/behaviour/ability.lua +31 -1
  29. package/engine/behaviour/unit/stun-immunity.d.ts +9 -5
  30. package/engine/behaviour/unit/stun-immunity.lua +17 -7
  31. package/engine/behaviour/unit.d.ts +15 -5
  32. package/engine/behaviour/unit.lua +126 -22
  33. package/engine/buff.d.ts +65 -21
  34. package/engine/buff.lua +362 -179
  35. package/engine/internal/ability.lua +21 -20
  36. package/engine/internal/item/fields.d.ts +12 -0
  37. package/engine/internal/item/fields.lua +33 -0
  38. package/engine/internal/item.d.ts +11 -14
  39. package/engine/internal/item.lua +77 -69
  40. package/engine/internal/mechanics/cast-ability.lua +6 -3
  41. package/engine/internal/object-data/attribute-bonus.lua +2 -2
  42. package/engine/internal/object-data/health-bonus.d.ts +2 -0
  43. package/engine/internal/object-data/health-bonus.lua +16 -0
  44. package/engine/internal/object-data/mana-bonus.d.ts +2 -0
  45. package/engine/internal/object-data/mana-bonus.lua +16 -0
  46. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.d.ts +2 -0
  47. package/engine/internal/object-data/mana-regeneration-rate-increase-factor.lua +16 -0
  48. package/engine/internal/unit/ability.d.ts +14 -14
  49. package/engine/internal/unit/ability.lua +72 -45
  50. package/engine/internal/unit/attributes.d.ts +17 -0
  51. package/engine/internal/unit/attributes.lua +46 -0
  52. package/engine/internal/unit/bonus.d.ts +6 -0
  53. package/engine/internal/unit/bonus.lua +33 -3
  54. package/engine/internal/unit/fly-height.d.ts +7 -0
  55. package/engine/internal/unit/fly-height.lua +20 -0
  56. package/engine/internal/unit/interrupts.d.ts +12 -0
  57. package/engine/internal/unit/interrupts.lua +28 -0
  58. package/engine/internal/unit/main-selected.lua +12 -27
  59. package/engine/internal/unit/range-event.d.ts +12 -0
  60. package/engine/internal/unit/range-event.lua +90 -0
  61. package/engine/internal/unit/scale.d.ts +7 -0
  62. package/engine/internal/unit/scale.lua +20 -0
  63. package/engine/internal/unit+bonus.lua +3 -3
  64. package/engine/internal/unit-missile-launch.lua +51 -20
  65. package/engine/internal/unit.d.ts +17 -21
  66. package/engine/internal/unit.lua +166 -188
  67. package/engine/local-client.d.ts +7 -0
  68. package/engine/local-client.lua +86 -1
  69. package/engine/object-data/auxiliary/health-regeneration-type.d.ts +8 -0
  70. package/engine/object-data/auxiliary/health-regeneration-type.lua +2 -0
  71. package/engine/object-data/auxiliary/unit-attribute.lua +1 -1
  72. package/engine/object-data/entry/ability-type/{armor-increase.d.ts → armor-bonus.d.ts} +3 -3
  73. package/engine/object-data/entry/ability-type/{armor-increase.lua → armor-bonus.lua} +9 -9
  74. package/engine/object-data/entry/ability-type/health-bonus.d.ts +8 -0
  75. package/engine/object-data/entry/ability-type/health-bonus.lua +26 -0
  76. package/engine/object-data/entry/ability-type/mana-bonus.d.ts +8 -0
  77. package/engine/object-data/entry/ability-type/mana-bonus.lua +26 -0
  78. package/engine/object-data/entry/ability-type/mana-regeneration.d.ts +8 -0
  79. package/engine/object-data/entry/ability-type/mana-regeneration.lua +26 -0
  80. package/engine/object-data/entry/ability-type/reincarnation.d.ts +8 -0
  81. package/engine/object-data/entry/ability-type/reincarnation.lua +26 -0
  82. package/engine/object-data/entry/ability-type.d.ts +2 -0
  83. package/engine/object-data/entry/ability-type.lua +88 -5
  84. package/engine/object-data/entry/buff-type/applicable.lua +113 -109
  85. package/engine/object-data/entry/destructible-type.d.ts +27 -1
  86. package/engine/object-data/entry/destructible-type.lua +155 -0
  87. package/engine/object-data/entry/unit-type.d.ts +4 -0
  88. package/engine/object-data/entry/unit-type.lua +76 -32
  89. package/engine/object-field/ability.lua +2 -2
  90. package/engine/object-field/item.d.ts +22 -0
  91. package/engine/object-field/item.lua +118 -0
  92. package/engine/object-field/unit.d.ts +20 -5
  93. package/engine/object-field/unit.lua +61 -0
  94. package/engine/object-field.d.ts +10 -2
  95. package/engine/object-field.lua +268 -123
  96. package/engine/random.d.ts +10 -0
  97. package/engine/random.lua +21 -0
  98. package/engine/standard/fields/ability.d.ts +2 -2
  99. package/engine/standard/fields/ability.lua +2 -2
  100. package/engine/standard/fields/item.d.ts +4 -0
  101. package/engine/standard/fields/item.lua +6 -0
  102. package/engine/standard/fields/unit.d.ts +11 -3
  103. package/engine/standard/fields/unit.lua +15 -2
  104. package/engine/synchronization.d.ts +11 -0
  105. package/engine/synchronization.lua +77 -0
  106. package/engine/text-tag.lua +3 -2
  107. package/engine/unit.d.ts +5 -0
  108. package/engine/unit.lua +5 -0
  109. package/lualib_bundle.lua +1 -1
  110. package/math.d.ts +2 -0
  111. package/math.lua +14 -0
  112. package/net/socket.lua +1 -1
  113. package/network.lua +25 -1
  114. package/objutil/buff.lua +10 -8
  115. package/objutil/object.lua +1 -1
  116. package/operation.d.ts +8 -1
  117. package/operation.lua +38 -18
  118. package/package.json +5 -5
  119. package/patch-lua.lua +15 -0
  120. package/patch-lualib.lua +1 -1
  121. package/utility/arrays.d.ts +1 -0
  122. package/utility/arrays.lua +8 -0
  123. package/utility/callback-array.d.ts +17 -0
  124. package/utility/callback-array.lua +61 -0
  125. package/utility/linked-map.d.ts +35 -0
  126. package/utility/linked-map.lua +107 -0
  127. package/utility/linked-set.d.ts +4 -1
  128. package/utility/linked-set.lua +46 -1
  129. package/utility/lua-maps.d.ts +11 -2
  130. package/utility/lua-maps.lua +33 -2
  131. package/utility/random.d.ts +102 -0
  132. package/utility/random.lua +273 -0
  133. package/utility/records.lua +20 -1
  134. package/utility/types.d.ts +3 -0
  135. package/utility/unordered-map.d.ts +27 -0
  136. package/utility/unordered-map.lua +99 -0
  137. /package/engine/internal/object-data/{armor-increase.d.ts → armor-bonus.d.ts} +0 -0
  138. /package/engine/internal/object-data/{armor-increase.lua → armor-bonus.lua} +0 -0
  139. /package/engine/object-data/entry/ability-type/{attribute-increase.d.ts → attribute-bonus.d.ts} +0 -0
  140. /package/engine/object-data/entry/ability-type/{attribute-increase.lua → attribute-bonus.lua} +0 -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
@@ -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<[
@@ -19,13 +19,28 @@ 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
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
22
36
  local frameClick = BlzFrameClick
23
37
  local frameGetEnable = BlzFrameGetEnable
24
38
  local frameIsVisible = BlzFrameIsVisible
25
39
  local frameSetEnable = BlzFrameSetEnable
26
40
  local frameSetScale = BlzFrameSetScale
27
- local getCameraTargetPositionX = GetCameraTargetPositionX
28
- local getCameraTargetPositionY = GetCameraTargetPositionY
41
+ local getHandleId = GetHandleId
42
+ local getOriginFrame = BlzGetOriginFrame
43
+ local location = Location
29
44
  local ____rawget = _G.rawget
30
45
  local rawset = _G.rawset
31
46
  local invoke = Event.invoke
@@ -127,6 +142,79 @@ do
127
142
  FramePoint.BOTTOM_RIGHT = FRAMEPOINT_BOTTOMRIGHT
128
143
  end
129
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
130
218
  ____exports.Frame = __TS__Class()
131
219
  local Frame = ____exports.Frame
132
220
  Frame.name = "Frame"
@@ -159,6 +247,18 @@ function Frame.prototype.getEvent(self, eventType, c)
159
247
  end
160
248
  return self.events[eventId]
161
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
162
262
  function Frame.prototype.hide(self)
163
263
  self.hideCounter = self.hideCounter + 1
164
264
  if self.hideCounter > 0 then
@@ -305,7 +405,17 @@ function Frame.byOrigin(self, frameType, index)
305
405
  if index == nil then
306
406
  index = 0
307
407
  end
308
- 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)
309
419
  end
310
420
  Frame.GAME_UI = ____exports.Frame:byOrigin(ORIGIN_FRAME_GAME_UI)
311
421
  Frame.CONSOLE_UI = ____exports.Frame:byOrigin(ORIGIN_FRAME_SIMPLE_UI_PARENT)
@@ -624,24 +734,8 @@ __TS__SetDescriptor(
624
734
  "mouseEnterLocalEvent",
625
735
  {get = function(self)
626
736
  local event = __TS__New(Event)
627
- if not (tooltipByFrame[self] ~= nil) then
628
- ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent = self
629
- 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)
630
- ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent = ____exports.Frame.CONSOLE_UI
631
- self:setTooltip(tooltip)
632
- end
633
- local isMouseInside = false
634
- Timer.onPeriod[1 / 64]:addListener(function()
635
- local tooltip = tooltipByFrame[self]
636
- if tooltip and tooltip.visible then
637
- if not isMouseInside then
638
- isMouseInside = true
639
- Event.invoke(event)
640
- end
641
- else
642
- isMouseInside = false
643
- end
644
- end)
737
+ self:trackMouseLocally()
738
+ mouseEnterLocalEventByFrame[self] = event
645
739
  rawset(self, "mouseEnterLocalEvent", event)
646
740
  return event
647
741
  end},
@@ -652,24 +746,8 @@ __TS__SetDescriptor(
652
746
  "mouseLeaveLocalEvent",
653
747
  {get = function(self)
654
748
  local event = __TS__New(Event)
655
- if not (tooltipByFrame[self] ~= nil) then
656
- ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent = self
657
- 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)
658
- ____exports.Frame.SIMPLE_FRAME_TEST_CHILD.parent = ____exports.Frame.CONSOLE_UI
659
- self:setTooltip(tooltip)
660
- end
661
- local isMouseInside = false
662
- Timer.onPeriod[1 / 64]:addListener(function()
663
- local tooltip = tooltipByFrame[self]
664
- if tooltip and tooltip.visible then
665
- isMouseInside = true
666
- else
667
- if isMouseInside then
668
- isMouseInside = false
669
- Event.invoke(event)
670
- end
671
- end
672
- end)
749
+ self:trackMouseLocally()
750
+ mouseLeaveLocalEventByFrame[self] = event
673
751
  rawset(self, "mouseLeaveLocalEvent", event)
674
752
  return event
675
753
  end},
@@ -936,16 +1014,19 @@ __TS__ObjectDefineProperty(
936
1014
  local event = __TS__New(Event)
937
1015
  local syncX = 0
938
1016
  local syncY = 0
939
- local syncCamX = getCameraTargetPositionX()
940
- local syncCamY = getCameraTargetPositionY()
1017
+ local syncFrameX = 0
1018
+ local syncFrameY = 0
941
1019
  local lastX = syncX
942
1020
  local lastY = syncY
943
1021
  self.onMouseMove:addListener(function(player, x, y)
944
1022
  if player.isLocal then
945
1023
  syncX = x
946
1024
  syncY = y
947
- syncCamX = getCameraTargetPositionX()
948
- syncCamY = getCameraTargetPositionY()
1025
+ syncFrameX, syncFrameY = worldCoordinatesToFrame(
1026
+ x,
1027
+ y,
1028
+ getTerrainZ(x, y)
1029
+ )
949
1030
  lastX = x
950
1031
  lastY = y
951
1032
  invoke(event, x, y)
@@ -955,9 +1036,8 @@ __TS__ObjectDefineProperty(
955
1036
  if syncX == 0 and syncY == 0 then
956
1037
  return
957
1038
  end
958
- local x = syncX + (getCameraTargetPositionX() - syncCamX)
959
- local y = syncY + (getCameraTargetPositionY() - syncCamY)
960
- 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
961
1041
  lastX = x
962
1042
  lastY = y
963
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 = {}
@@ -23,20 +23,40 @@ 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
+ }
52
+ local playerColorChangedEvent = __TS__New(Event)
34
53
  ____exports.Player = __TS__Class()
35
54
  local Player = ____exports.Player
36
55
  Player.name = "Player"
37
56
  __TS__ClassExtends(Player, Handle)
38
57
  function Player.prototype.____constructor(self, handle)
39
58
  Handle.prototype.____constructor(self, handle)
59
+ self.slotState = GetPlayerSlotState(self.handle)
40
60
  self.id = GetPlayerId(handle)
41
61
  end
42
62
  function Player.prototype.onDestroy(self)
@@ -85,6 +105,12 @@ end
85
105
  function Player.prototype.isEnemyOf(self, other)
86
106
  return IsPlayerEnemy(self.handle, other.handle)
87
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
88
114
  function Player.prototype.setAbilityAvailable(self, abilityId, available)
89
115
  setPlayerAbilityAvailable(self.handle, abilityId, available)
90
116
  end
@@ -124,14 +150,11 @@ function Player.getMouseEvent(self, event, collector)
124
150
  self.events[eventId] = __TS__New(
125
151
  TriggerEvent,
126
152
  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
153
+ Timer:run(function()
154
+ for ____, player in ipairs(____exports.Player.all) do
155
+ TriggerRegisterPlayerEvent(trigger, player.handle, event)
133
156
  end
134
- )
157
+ end)
135
158
  end,
136
159
  collector or (function() return {} end)
137
160
  )
@@ -180,7 +203,7 @@ function Player.getKeyEvent(self, isDown)
180
203
  TriggerAddCondition(
181
204
  trigger,
182
205
  Condition(function()
183
- local player = ____exports.Player:of(GetTriggerPlayer())
206
+ local player = ____exports.Player:of(getTriggerPlayer())
184
207
  local key = BlzGetTriggerPlayerKey()
185
208
  local metaKey = BlzGetTriggerPlayerMetaKey()
186
209
  Event.invoke(event, player, key, metaKey)
@@ -279,6 +302,7 @@ __TS__SetDescriptor(
279
302
  end,
280
303
  set = function(self, color)
281
304
  SetPlayerColor(self.handle, color.handle)
305
+ Event.invoke(playerColorChangedEvent, self)
282
306
  end
283
307
  },
284
308
  true
@@ -341,7 +365,7 @@ __TS__SetDescriptor(
341
365
  Player.prototype,
342
366
  "isUser",
343
367
  {get = function(self)
344
- return GetPlayerController(self.handle) == MAP_CONTROL_USER
368
+ return self.controller == MAP_CONTROL_USER
345
369
  end},
346
370
  true
347
371
  )
@@ -349,7 +373,7 @@ __TS__SetDescriptor(
349
373
  Player.prototype,
350
374
  "isPlaying",
351
375
  {get = function(self)
352
- return GetPlayerSlotState(self.handle) == PLAYER_SLOT_STATE_PLAYING
376
+ return self.slotState == PLAYER_SLOT_STATE_PLAYING
353
377
  end},
354
378
  true
355
379
  )
@@ -357,17 +381,30 @@ __TS__SetDescriptor(
357
381
  Player.prototype,
358
382
  "controller",
359
383
  {get = function(self)
360
- return GetPlayerController(self.handle)
384
+ local controller = GetPlayerController(self.handle)
385
+ rawset(self, "controller", controller)
386
+ return controller
361
387
  end},
362
388
  true
363
389
  )
364
- __TS__SetDescriptor(
365
- Player.prototype,
366
- "slotState",
390
+ __TS__ObjectDefineProperty(
391
+ Player,
392
+ "allianceChangedEvent",
367
393
  {get = function(self)
368
- return GetPlayerSlotState(self.handle)
369
- end},
370
- 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}
371
408
  )
372
409
  __TS__ObjectDefineProperty(
373
410
  Player,
@@ -375,7 +412,7 @@ __TS__ObjectDefineProperty(
375
412
  {get = function(self)
376
413
  return ____exports.Player:getEvent(
377
414
  EVENT_PLAYER_LEAVE,
378
- function() return ____exports.Player:of(GetTriggerPlayer()) end
415
+ function() return ____exports.Player:of(getTriggerPlayer()) end
379
416
  )
380
417
  end}
381
418
  )
@@ -385,7 +422,7 @@ __TS__ObjectDefineProperty(
385
422
  {get = function(self)
386
423
  return ____exports.Player:getMouseEvent(
387
424
  EVENT_PLAYER_MOUSE_DOWN,
388
- function() return ____exports.Player:of(GetTriggerPlayer()), BlzGetTriggerPlayerMouseButton() end
425
+ function() return ____exports.Player:of(getTriggerPlayer()), BlzGetTriggerPlayerMouseButton() end
389
426
  )
390
427
  end}
391
428
  )
@@ -395,7 +432,7 @@ __TS__ObjectDefineProperty(
395
432
  {get = function(self)
396
433
  return ____exports.Player:getMouseEvent(
397
434
  EVENT_PLAYER_MOUSE_UP,
398
- function() return ____exports.Player:of(GetTriggerPlayer()), BlzGetTriggerPlayerMouseButton() end
435
+ function() return ____exports.Player:of(getTriggerPlayer()), BlzGetTriggerPlayerMouseButton() end
399
436
  )
400
437
  end}
401
438
  )
@@ -405,7 +442,7 @@ __TS__ObjectDefineProperty(
405
442
  {get = function(self)
406
443
  return ____exports.Player:getMouseEvent(
407
444
  EVENT_PLAYER_MOUSE_MOVE,
408
- function() return ____exports.Player:of(GetTriggerPlayer()), vec2(
445
+ function() return ____exports.Player:of(getTriggerPlayer()), vec2(
409
446
  BlzGetTriggerPlayerMouseX(),
410
447
  BlzGetTriggerPlayerMouseY()
411
448
  ) end
@@ -441,10 +478,17 @@ __TS__ObjectDefineProperty(
441
478
  TriggerRegisterPlayerChatEvent(trigger, player.handle, "", false)
442
479
  end
443
480
  end,
444
- function() return ____exports.Player:of(GetTriggerPlayer()), GetEventPlayerChatString() end
481
+ function() return ____exports.Player:of(getTriggerPlayer()), GetEventPlayerChatString() end
445
482
  )
446
483
  rawset(self, "onChat", event)
447
484
  return event
448
485
  end}
449
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
+ )
450
494
  return ____exports
@@ -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
@@ -22,7 +22,7 @@ local setSoundPlayPosition = SetSoundPlayPosition
22
22
  local stopSound = StopSound
23
23
  local attachSoundToUnit = AttachSoundToUnit
24
24
  local killSoundWhenDone = KillSoundWhenDone
25
- ____exports.SoundChannel = SoundChannel or ({})
25
+ ____exports.SoundChannel = ____exports.SoundChannel or ({})
26
26
  ____exports.SoundChannel.General = 0
27
27
  ____exports.SoundChannel[____exports.SoundChannel.General] = "General"
28
28
  ____exports.SoundChannel.UnitSelection = 1
@@ -1,10 +1,20 @@
1
1
  /** @noSelfInFile */
2
- export declare class TileCell implements Readonly<Vec2> {
2
+ import { AttributesHolder } from "../../attributes";
3
+ export declare class TileCell extends AttributesHolder implements Readonly<Vec2> {
3
4
  private readonly id;
4
5
  readonly x: number;
5
6
  readonly y: number;
6
7
  readonly z: undefined;
7
8
  protected constructor(id: number, x: number, y: number, z: undefined);
9
+ get up(): TileCell;
10
+ get down(): TileCell;
11
+ get left(): TileCell;
12
+ get right(): TileCell;
13
+ get terrainTypeId(): number;
14
+ set terrainTypeId(terrainTypeId: number);
15
+ get terrainVariance(): number;
16
+ set terrainVariance(terrainVariance: number);
17
+ randomizeTerrainVariance(): void;
8
18
  isInRangeOf(x: number, y: number, range: number): boolean;
9
19
  isInRangeOf(tileCell: TileCell, range: number): boolean;
10
20
  static getInRect(minX: number, minY: number, maxX: number, maxY: number): TileCell[];