warscript 0.0.1-dev.fd21394 → 0.0.1-dev.fe0aeea

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 (157) hide show
  1. package/binaryreader.d.ts +1 -0
  2. package/binaryreader.lua +3 -0
  3. package/config.d.ts +5 -0
  4. package/config.lua +10 -0
  5. package/core/types/effect.d.ts +14 -6
  6. package/core/types/effect.lua +131 -35
  7. package/core/types/frame.d.ts +8 -0
  8. package/core/types/frame.lua +93 -1
  9. package/core/types/sound.d.ts +17 -24
  10. package/core/types/sound.lua +94 -24
  11. package/core/util.d.ts +1 -1
  12. package/core/util.lua +18 -1
  13. package/engine/behavior.d.ts +2 -2
  14. package/engine/behavior.lua +6 -6
  15. package/engine/behaviour/ability/always-enabled.d.ts +7 -0
  16. package/engine/behaviour/ability/always-enabled.lua +31 -0
  17. package/engine/behaviour/ability/apply-buff.d.ts +8 -5
  18. package/engine/behaviour/ability/apply-buff.lua +32 -0
  19. package/engine/behaviour/ability/apply-unit-behavior.lua +1 -0
  20. package/engine/behaviour/ability/damage.d.ts +36 -11
  21. package/engine/behaviour/ability/damage.lua +90 -32
  22. package/engine/behaviour/ability/emulate-impact.d.ts +6 -0
  23. package/engine/behaviour/ability/emulate-impact.lua +28 -0
  24. package/engine/behaviour/ability/heal.d.ts +33 -6
  25. package/engine/behaviour/ability/heal.lua +89 -10
  26. package/engine/behaviour/ability/instant-impact.d.ts +2 -2
  27. package/engine/behaviour/ability/instant-impact.lua +4 -19
  28. package/engine/behaviour/ability/on-command-impact.d.ts +8 -0
  29. package/engine/behaviour/ability/on-command-impact.lua +25 -0
  30. package/engine/behaviour/ability/remove-buffs.d.ts +16 -0
  31. package/engine/behaviour/ability/remove-buffs.lua +28 -0
  32. package/engine/behaviour/ability/restore-mana.d.ts +15 -0
  33. package/engine/behaviour/ability/restore-mana.lua +29 -0
  34. package/engine/behaviour/ability.d.ts +20 -4
  35. package/engine/behaviour/ability.lua +111 -38
  36. package/engine/behaviour/unit.d.ts +7 -0
  37. package/engine/behaviour/unit.lua +20 -0
  38. package/engine/buff.d.ts +101 -39
  39. package/engine/buff.lua +458 -203
  40. package/engine/game-map.d.ts +7 -0
  41. package/engine/game-map.lua +32 -0
  42. package/engine/internal/ability.d.ts +16 -13
  43. package/engine/internal/ability.lua +80 -76
  44. package/engine/internal/item/ability.lua +106 -0
  45. package/engine/internal/item+owner.lua +2 -2
  46. package/engine/internal/item.d.ts +2 -2
  47. package/engine/internal/item.lua +56 -25
  48. package/engine/internal/mechanics/ability-duration.lua +1 -1
  49. package/engine/internal/misc/ability-disable-counter.d.ts +2 -0
  50. package/engine/internal/misc/ability-disable-counter.lua +13 -0
  51. package/engine/internal/object-data/auto-attack-speed-increase.d.ts +1 -1
  52. package/engine/internal/object-data/auto-attack-speed-increase.lua +2 -0
  53. package/engine/internal/object-data/evasion-probability.d.ts +2 -0
  54. package/engine/internal/object-data/evasion-probability.lua +16 -0
  55. package/engine/internal/unit/ability.d.ts +10 -1
  56. package/engine/internal/unit/ability.lua +36 -14
  57. package/engine/internal/unit/add-item-to-slot-init.d.ts +2 -0
  58. package/engine/internal/unit/add-item-to-slot-init.lua +23 -0
  59. package/engine/internal/unit/add-item-to-slot.d.ts +2 -0
  60. package/engine/internal/unit/add-item-to-slot.lua +52 -0
  61. package/engine/internal/unit/bonus.d.ts +6 -2
  62. package/engine/internal/unit/bonus.lua +23 -1
  63. package/engine/internal/unit/ignore-events-items.d.ts +2 -0
  64. package/engine/internal/unit/ignore-events-items.lua +5 -0
  65. package/engine/internal/unit/item.d.ts +24 -0
  66. package/engine/internal/unit/item.lua +78 -0
  67. package/engine/internal/unit/main-selected.d.ts +13 -0
  68. package/engine/internal/unit/main-selected.lua +51 -0
  69. package/engine/internal/unit+ability.lua +2 -2
  70. package/engine/internal/unit+transport.lua +4 -10
  71. package/engine/internal/unit-missile-launch.lua +24 -5
  72. package/engine/internal/unit.d.ts +31 -10
  73. package/engine/internal/unit.lua +170 -83
  74. package/engine/internal/utility.lua +12 -0
  75. package/engine/lightning.d.ts +12 -5
  76. package/engine/lightning.lua +48 -14
  77. package/engine/local-client.d.ts +7 -2
  78. package/engine/local-client.lua +82 -0
  79. package/engine/object-data/auxiliary/animation-name.d.ts +1 -0
  80. package/engine/object-data/auxiliary/animation-name.lua +16 -0
  81. package/engine/object-data/auxiliary/attachment-preset.d.ts +7 -2
  82. package/engine/object-data/auxiliary/attachment-preset.lua +4 -3
  83. package/engine/object-data/auxiliary/sound-eax.d.ts +10 -0
  84. package/engine/object-data/auxiliary/sound-eax.lua +2 -0
  85. package/engine/object-data/auxiliary/sound-preset-name.d.ts +5 -1
  86. package/engine/object-data/auxiliary/tech-tree-dependency.d.ts +1 -1
  87. package/engine/object-data/entry/ability-type/blank-configurable.lua +12 -1
  88. package/engine/object-data/entry/ability-type/carrion-swarm.d.ts +14 -0
  89. package/engine/object-data/entry/ability-type/carrion-swarm.lua +65 -0
  90. package/engine/object-data/entry/ability-type/disease-cloud.lua +2 -2
  91. package/engine/object-data/entry/ability-type/engineering-upgrade.lua +2 -2
  92. package/engine/object-data/entry/ability-type/ensnare.d.ts +12 -0
  93. package/engine/object-data/entry/ability-type/ensnare.lua +52 -0
  94. package/engine/object-data/entry/ability-type/feral-spirit.lua +2 -2
  95. package/engine/object-data/entry/ability-type/phase-shift.d.ts +10 -0
  96. package/engine/object-data/entry/ability-type/phase-shift.lua +39 -0
  97. package/engine/object-data/entry/ability-type/phoenix-morph.lua +4 -4
  98. package/engine/object-data/entry/ability-type/raise-dead.d.ts +17 -0
  99. package/engine/object-data/entry/ability-type/raise-dead.lua +78 -0
  100. package/engine/object-data/entry/ability-type/shock-wave.d.ts +4 -0
  101. package/engine/object-data/entry/ability-type/shock-wave.lua +26 -0
  102. package/engine/object-data/entry/ability-type/summon-quilbeast.lua +2 -2
  103. package/engine/object-data/entry/ability-type/summon-water-elemental.lua +2 -2
  104. package/engine/object-data/entry/ability-type/web.d.ts +12 -0
  105. package/engine/object-data/entry/ability-type/web.lua +52 -0
  106. package/engine/object-data/entry/ability-type.d.ts +19 -17
  107. package/engine/object-data/entry/ability-type.lua +82 -33
  108. package/engine/object-data/entry/buff-type/applicable.lua +13 -37
  109. package/engine/object-data/entry/buff-type.d.ts +1 -1
  110. package/engine/object-data/entry/buff-type.lua +2 -2
  111. package/engine/object-data/entry/destructible-type.d.ts +1 -1
  112. package/engine/object-data/entry/item-type.d.ts +15 -1
  113. package/engine/object-data/entry/item-type.lua +93 -2
  114. package/engine/object-data/entry/lightning-type.d.ts +1 -1
  115. package/engine/object-data/entry/sound-preset.d.ts +33 -0
  116. package/engine/object-data/entry/sound-preset.lua +140 -0
  117. package/engine/object-data/entry/unit-type.d.ts +8 -1
  118. package/engine/object-data/entry/unit-type.lua +61 -8
  119. package/engine/object-data/entry/upgrade.d.ts +1 -1
  120. package/engine/object-data/entry/upgrade.lua +4 -4
  121. package/engine/object-data/entry.d.ts +16 -14
  122. package/engine/object-data/entry.lua +60 -32
  123. package/engine/object-data/utility/object-data-entry-id-generator.lua +7 -0
  124. package/engine/object-field/ability.d.ts +26 -3
  125. package/engine/object-field/ability.lua +54 -1
  126. package/engine/object-field.d.ts +2 -2
  127. package/engine/object-field.lua +4 -0
  128. package/engine/standard/entries/sound-preset.d.ts +10 -0
  129. package/engine/standard/entries/sound-preset.lua +10 -0
  130. package/engine/standard/fields/ability.d.ts +2 -0
  131. package/engine/standard/fields/ability.lua +2 -0
  132. package/engine/unit.d.ts +3 -0
  133. package/engine/unit.lua +3 -0
  134. package/index.d.ts +1 -0
  135. package/index.lua +1 -0
  136. package/lualib_bundle.lua +7 -2
  137. package/net/socket.d.ts +7 -1
  138. package/net/socket.lua +45 -4
  139. package/network.d.ts +1 -0
  140. package/network.lua +3 -2
  141. package/objutil/buff.lua +1 -1
  142. package/objutil/unit.lua +8 -0
  143. package/package.json +2 -2
  144. package/patch-lua.d.ts +0 -0
  145. package/patch-lua.lua +10 -0
  146. package/property.d.ts +55 -0
  147. package/property.lua +374 -0
  148. package/utility/arrays.d.ts +8 -1
  149. package/utility/arrays.lua +34 -3
  150. package/utility/lazy.d.ts +2 -0
  151. package/utility/lazy.lua +14 -0
  152. package/utility/linked-set.d.ts +11 -2
  153. package/utility/linked-set.lua +5 -2
  154. package/utility/reflection.lua +11 -7
  155. package/utility/types.d.ts +1 -0
  156. package/core/mapbounds.d.ts +0 -8
  157. package/core/mapbounds.lua +0 -12
package/lualib_bundle.lua CHANGED
@@ -1094,6 +1094,11 @@ do
1094
1094
  end
1095
1095
  if __TS__StringIncludes(_VERSION, "Lua 5.0") then
1096
1096
  return debug.traceback(("[Level " .. tostring(level)) .. "]")
1097
+ elseif _VERSION == "Lua 5.1" then
1098
+ return string.sub(
1099
+ debug.traceback("", level),
1100
+ 2
1101
+ )
1097
1102
  else
1098
1103
  return debug.traceback(nil, level)
1099
1104
  end
@@ -1102,7 +1107,7 @@ do
1102
1107
  return function(self)
1103
1108
  local description = getDescription(self)
1104
1109
  local caller = debug.getinfo(3, "f")
1105
- local isClassicLua = __TS__StringIncludes(_VERSION, "Lua 5.0") or _VERSION == "Lua 5.1"
1110
+ local isClassicLua = __TS__StringIncludes(_VERSION, "Lua 5.0")
1106
1111
  if isClassicLua or caller and caller.func ~= error then
1107
1112
  return description
1108
1113
  else
@@ -1126,7 +1131,7 @@ do
1126
1131
  end
1127
1132
  self.message = message
1128
1133
  self.name = "Error"
1129
- self.stack = getErrorStack(nil, self.constructor.new)
1134
+ self.stack = getErrorStack(nil, __TS__New)
1130
1135
  local metatable = getmetatable(self)
1131
1136
  if metatable and not metatable.__errorToStringPatched then
1132
1137
  metatable.__errorToStringPatched = true
package/net/socket.d.ts CHANGED
@@ -1,9 +1,15 @@
1
1
  /** @noSelfInFile */
2
2
  import { Event } from "../event";
3
3
  import { Player } from "../core/types/player";
4
+ declare const enum SocketPropertyKey {
5
+ ID = 0,
6
+ CHUNK_ID = 1
7
+ }
4
8
  export declare class Socket {
5
- private readonly id;
9
+ private readonly [SocketPropertyKey.ID];
10
+ private readonly [SocketPropertyKey.CHUNK_ID];
6
11
  readonly onMessage: Event<[Player, string]>;
7
12
  constructor();
8
13
  send(data: string): void;
9
14
  }
15
+ export {};
package/net/socket.lua CHANGED
@@ -7,6 +7,11 @@ local Event = ____event.Event
7
7
  local ____network = require("network")
8
8
  local send = ____network.send
9
9
  local onReceive = ____network.onReceive
10
+ local MAX_PAYLOAD_LENGTH = ____network.MAX_PAYLOAD_LENGTH
11
+ local ____math = require("math")
12
+ local ceil = ____math.ceil
13
+ local stringSub = string.sub
14
+ local tableConcat = table.concat
10
15
  local nextId = 0
11
16
  ____exports.Socket = __TS__Class()
12
17
  local Socket = ____exports.Socket
@@ -14,13 +19,49 @@ Socket.name = "Socket"
14
19
  function Socket.prototype.____constructor(self)
15
20
  local ____tostring_0 = tostring
16
21
  nextId = nextId + 1
17
- self.id = ____tostring_0(nextId)
22
+ self[0] = ____tostring_0(nextId)
23
+ local ____tostring_1 = tostring
24
+ nextId = nextId + 1
25
+ self[1] = ____tostring_1(nextId)
18
26
  self.onMessage = __TS__New(Event)
19
- onReceive[self.id]:addListener(function(sender, data)
20
- Event.invoke(self.onMessage, sender, data)
27
+ local chunksByPlayer = {}
28
+ onReceive[self[0]]:addListener(function(sender, data)
29
+ local chunks = chunksByPlayer[sender]
30
+ if chunks ~= nil then
31
+ chunks[#chunks + 1] = data
32
+ Event.invoke(
33
+ self.onMessage,
34
+ sender,
35
+ tableConcat(chunks)
36
+ )
37
+ chunksByPlayer[sender] = nil
38
+ else
39
+ Event.invoke(self.onMessage, sender, data)
40
+ end
41
+ end)
42
+ onReceive[self[1]]:addListener(function(sender, data)
43
+ local chunks = chunksByPlayer[sender]
44
+ if chunks == nil then
45
+ chunks = {}
46
+ chunksByPlayer[sender] = chunks
47
+ end
48
+ chunks[#chunks + 1] = data
21
49
  end)
22
50
  end
23
51
  function Socket.prototype.send(self, data)
24
- send(self.id, data)
52
+ local chunks = ceil(#data / MAX_PAYLOAD_LENGTH) - 1
53
+ local offset = 1
54
+ for _ = 0, chunks - 1 do
55
+ local nextOffset = offset + MAX_PAYLOAD_LENGTH
56
+ send(
57
+ self[1],
58
+ stringSub(data, offset, nextOffset - 1)
59
+ )
60
+ offset = nextOffset
61
+ end
62
+ send(
63
+ self[0],
64
+ stringSub(data, offset)
65
+ )
25
66
  end
26
67
  return ____exports
package/network.d.ts CHANGED
@@ -2,6 +2,7 @@
2
2
  import { Event } from "./event";
3
3
  import { Player } from "./core/types/player";
4
4
  import { Operation, OperationContinue, OperationMonitor } from "./operation";
5
+ export declare const MAX_PAYLOAD_LENGTH = 255;
5
6
  export declare const onReceive: {
6
7
  [prefix: string]: Event<[Player, string]>;
7
8
  } & {
package/network.lua CHANGED
@@ -25,6 +25,7 @@ local concat = table.concat
25
25
  local pack = string.pack
26
26
  local sub = string.sub
27
27
  local ____unpack = string.unpack
28
+ ____exports.MAX_PAYLOAD_LENGTH = 255
28
29
  ____exports.onReceive = setmetatable(
29
30
  {},
30
31
  {__index = function(self, prefix)
@@ -42,11 +43,11 @@ ____exports.onReceive = setmetatable(
42
43
  end}
43
44
  )
44
45
  function ____exports.send(id, payload)
45
- if #payload > 255 then
46
+ if #payload > ____exports.MAX_PAYLOAD_LENGTH then
46
47
  error(
47
48
  __TS__New(
48
49
  IllegalArgumentException,
49
- "payload length must be <= 256, but was " .. tostring(#payload)
50
+ (("payload length must be <= " .. tostring(____exports.MAX_PAYLOAD_LENGTH)) .. ", but was ") .. tostring(#payload)
50
51
  ),
51
52
  0
52
53
  )
package/objutil/buff.lua CHANGED
@@ -762,7 +762,7 @@ Unit.onDamaging:addListener(function(source, target, event)
762
762
  end)
763
763
  end
764
764
  end)
765
- Unit.onItemPickup:addListener(function(unit, item)
765
+ Unit.itemPickedUpEvent:addListener(function(unit, item)
766
766
  if item.powerup and item:hasAbility(fourCC("APdi")) then
767
767
  end
768
768
  end)
package/objutil/unit.lua CHANGED
@@ -11,6 +11,8 @@ local ____exports = {}
11
11
  local ____object = require("objutil.object")
12
12
  local ObjectDefinition = ____object.ObjectDefinition
13
13
  local idgen = require("objutil.idgen")
14
+ local ____config = require("config")
15
+ local WarscriptConfig = ____config.WarscriptConfig
14
16
  local attackTypes = setmetatable(
15
17
  {
16
18
  normal = "normal",
@@ -593,6 +595,9 @@ __TS__SetDescriptor(
593
595
  end,
594
596
  set = function(self, v)
595
597
  self:setStringField("umdl", v)
598
+ if WarscriptConfig.AUTOMATICALLY_SET_UNIT_TYPE_PORTRAIT_MODEL_PATH then
599
+ self:setStringField("upor", "")
600
+ end
596
601
  end
597
602
  },
598
603
  true
@@ -606,6 +611,9 @@ __TS__SetDescriptor(
606
611
  end,
607
612
  set = function(self, v)
608
613
  self.object:setField("umdl:hd", v)
614
+ if WarscriptConfig.AUTOMATICALLY_SET_UNIT_TYPE_PORTRAIT_MODEL_PATH then
615
+ self.object:setField("upor:hd", "")
616
+ end
609
617
  end
610
618
  },
611
619
  true
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package",
3
3
  "name": "warscript",
4
- "version": "0.0.1-dev.fd21394",
4
+ "version": "0.0.1-dev.fe0aeea",
5
5
  "description": "A typescript library for Warcraft III using Warpack.",
6
6
  "keywords": [
7
7
  "warcraft",
@@ -24,7 +24,7 @@
24
24
  "@warscript/language-extensions": "^0.0.1",
25
25
  "@warscript/tstl-plugin": "^0.0.4",
26
26
  "lua-types": "^2.13.1",
27
- "warpack": "0.0.1-dev.07dd222"
27
+ "warpack": "0.0.1-dev.9a8d1de"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@typescript-eslint/eslint-plugin": "^8.13.0",
package/patch-lua.d.ts ADDED
File without changes
package/patch-lua.lua ADDED
@@ -0,0 +1,10 @@
1
+ local getmetatable = _G.getmetatable
2
+ local ipairs = _G.ipairs
3
+
4
+ _G.ipairs = function(t)
5
+ local metatable = getmetatable(t)
6
+ if metatable and metatable.__ipairs then
7
+ return metatable.__ipairs(t)
8
+ end
9
+ return ipairs(t)
10
+ end
package/property.d.ts ADDED
@@ -0,0 +1,55 @@
1
+ /** @noSelfInFile */
2
+ import { Player } from "./core/types/player";
3
+ import { Event } from "./event";
4
+ export declare class PersistentPropertiesConfig {
5
+ static defaultFileName: string;
6
+ }
7
+ declare const enum PropertyPropertyKey {
8
+ DEFAULT_VALUE = 0,
9
+ VALUE = 1,
10
+ IS_CHANGED = 2
11
+ }
12
+ export declare class Property<T> {
13
+ readonly valueChangeEvent: Event<[newValue: T, oldValue: T]>;
14
+ private [PropertyPropertyKey.DEFAULT_VALUE];
15
+ private [PropertyPropertyKey.VALUE];
16
+ private [PropertyPropertyKey.IS_CHANGED]?;
17
+ constructor(defaultValue: T);
18
+ get defaultValue(): T;
19
+ set defaultValue(defaultValue: T);
20
+ get value(): T;
21
+ set value(value: T);
22
+ get isChanged(): boolean;
23
+ reset(): boolean;
24
+ set(value: T): boolean;
25
+ get(): T;
26
+ }
27
+ declare const enum PlayerPropertyPropertyKey {
28
+ DEFAULT_VALUE = 0,
29
+ VALUE_BY_PLAYER = 1,
30
+ IS_CHANGED_BY_PLAYER = 2
31
+ }
32
+ export declare class PlayerProperty<T> {
33
+ readonly valueChangeEvent: Event<[player: Player, newValue: T, oldValue: T]>;
34
+ private readonly [PlayerPropertyPropertyKey.DEFAULT_VALUE];
35
+ private readonly [PlayerPropertyPropertyKey.VALUE_BY_PLAYER];
36
+ private readonly [PlayerPropertyPropertyKey.IS_CHANGED_BY_PLAYER];
37
+ constructor(defaultValue: T);
38
+ isChanged(player: Player): boolean;
39
+ reset(player: Player): boolean;
40
+ set(player: Player, value: T): boolean;
41
+ get(player: Player): T;
42
+ }
43
+ export declare class PersistentProperty<T extends undefined | boolean | number | string> extends Property<T> {
44
+ readonly id: number;
45
+ constructor(id: number, defaultValue: T, valueChangeEventListener?: (newValue: T, oldValue: T) => void);
46
+ reset(): boolean;
47
+ set(value: T): boolean;
48
+ }
49
+ export declare class PersistentPlayerProperty<T extends string | number | boolean> extends PlayerProperty<T> {
50
+ readonly id: number;
51
+ constructor(id: number, initialValue: T, valueChangeEventListener?: (player: Player, newValue: T, oldValue: T) => void);
52
+ reset(player: Player): boolean;
53
+ set(player: Player, value: T): boolean;
54
+ }
55
+ export {};
package/property.lua ADDED
@@ -0,0 +1,374 @@
1
+ local ____lualib = require("lualib_bundle")
2
+ local __TS__Class = ____lualib.__TS__Class
3
+ local __TS__New = ____lualib.__TS__New
4
+ local __TS__SetDescriptor = ____lualib.__TS__SetDescriptor
5
+ local __TS__ClassExtends = ____lualib.__TS__ClassExtends
6
+ local ____exports = {}
7
+ local savePropertyValues
8
+ local ____binaryreader = require("binaryreader")
9
+ local BinaryReader = ____binaryreader.BinaryReader
10
+ local ____binarywriter = require("binarywriter")
11
+ local BinaryWriter = ____binarywriter.BinaryWriter
12
+ local ____player = require("core.types.player")
13
+ local Player = ____player.Player
14
+ local ____timer = require("core.types.timer")
15
+ local Timer = ____timer.Timer
16
+ local ____event = require("event")
17
+ local Event = ____event.Event
18
+ local file = require("file")
19
+ local ____network = require("network")
20
+ local synchronize = ____network.synchronize
21
+ local base64 = require("utility.base64")
22
+ local lzw = require("utility.lzw")
23
+ local ____preconditions = require("utility.preconditions")
24
+ local ____require = ____preconditions.require
25
+ local invoke = Event.invoke
26
+ ____exports.PersistentPropertiesConfig = __TS__Class()
27
+ local PersistentPropertiesConfig = ____exports.PersistentPropertiesConfig
28
+ PersistentPropertiesConfig.name = "PersistentPropertiesConfig"
29
+ function PersistentPropertiesConfig.prototype.____constructor(self)
30
+ end
31
+ PersistentPropertiesConfig.defaultFileName = ""
32
+ ____exports.Property = __TS__Class()
33
+ local Property = ____exports.Property
34
+ Property.name = "Property"
35
+ function Property.prototype.____constructor(self, defaultValue)
36
+ self.valueChangeEvent = __TS__New(Event)
37
+ self[0] = defaultValue
38
+ self[1] = defaultValue
39
+ end
40
+ function Property.prototype.reset(self)
41
+ if self[2] then
42
+ self[2] = nil
43
+ local defaultValue = self[0]
44
+ local oldValue = self[1]
45
+ if defaultValue ~= oldValue then
46
+ self[1] = defaultValue
47
+ invoke(self.valueChangeEvent, defaultValue, oldValue)
48
+ end
49
+ return true
50
+ end
51
+ return false
52
+ end
53
+ function Property.prototype.set(self, value)
54
+ self[2] = true
55
+ local oldValue = self[1]
56
+ self[1] = value
57
+ if value ~= oldValue then
58
+ invoke(self.valueChangeEvent, value, oldValue)
59
+ return true
60
+ end
61
+ return false
62
+ end
63
+ function Property.prototype.get(self)
64
+ return self[1]
65
+ end
66
+ __TS__SetDescriptor(
67
+ Property.prototype,
68
+ "defaultValue",
69
+ {
70
+ get = function(self)
71
+ return self[0]
72
+ end,
73
+ set = function(self, defaultValue)
74
+ local oldDefaultValue = self[0]
75
+ if defaultValue ~= oldDefaultValue then
76
+ self[0] = defaultValue
77
+ if not self[2] then
78
+ self[1] = defaultValue
79
+ invoke(self.valueChangeEvent, defaultValue, oldDefaultValue)
80
+ end
81
+ end
82
+ end
83
+ },
84
+ true
85
+ )
86
+ __TS__SetDescriptor(
87
+ Property.prototype,
88
+ "value",
89
+ {
90
+ get = function(self)
91
+ return self:get()
92
+ end,
93
+ set = function(self, value)
94
+ self:set(value)
95
+ end
96
+ },
97
+ true
98
+ )
99
+ __TS__SetDescriptor(
100
+ Property.prototype,
101
+ "isChanged",
102
+ {get = function(self)
103
+ return self[2] == true
104
+ end},
105
+ true
106
+ )
107
+ ____exports.PlayerProperty = __TS__Class()
108
+ local PlayerProperty = ____exports.PlayerProperty
109
+ PlayerProperty.name = "PlayerProperty"
110
+ function PlayerProperty.prototype.____constructor(self, defaultValue)
111
+ self.valueChangeEvent = __TS__New(Event)
112
+ self[0] = defaultValue
113
+ self[1] = {}
114
+ self[2] = {}
115
+ end
116
+ function PlayerProperty.prototype.isChanged(self, player)
117
+ return self[2][player] ~= nil
118
+ end
119
+ function PlayerProperty.prototype.reset(self, player)
120
+ if self[2][player] ~= nil then
121
+ self[2][player] = nil
122
+ local initialValue = self[0]
123
+ local oldValue = self[1][player]
124
+ self[1][player] = nil
125
+ if initialValue ~= oldValue then
126
+ invoke(self.valueChangeEvent, player, initialValue, oldValue)
127
+ end
128
+ return true
129
+ end
130
+ return false
131
+ end
132
+ function PlayerProperty.prototype.set(self, player, value)
133
+ self[2][player] = true
134
+ local oldValue = self[1][player]
135
+ self[1][player] = value
136
+ if value ~= oldValue then
137
+ invoke(self.valueChangeEvent, player, value, oldValue)
138
+ return true
139
+ end
140
+ return false
141
+ end
142
+ function PlayerProperty.prototype.get(self, player)
143
+ local ____table_PlayerPropertyPropertyKey_IS_CHANGED_BY_PLAYER_has_result_0
144
+ if self[2][player] ~= nil then
145
+ ____table_PlayerPropertyPropertyKey_IS_CHANGED_BY_PLAYER_has_result_0 = self[1][player]
146
+ else
147
+ ____table_PlayerPropertyPropertyKey_IS_CHANGED_BY_PLAYER_has_result_0 = self[0]
148
+ end
149
+ return ____table_PlayerPropertyPropertyKey_IS_CHANGED_BY_PLAYER_has_result_0
150
+ end
151
+ local NULL_VALUE = {}
152
+ local loadedValueById
153
+ local loadedValueByIdByPlayer = {}
154
+ local localValueById = {}
155
+ local persistentPropertyById = {}
156
+ local persistentPlayerPropertyById = {}
157
+ ____exports.PersistentProperty = __TS__Class()
158
+ local PersistentProperty = ____exports.PersistentProperty
159
+ PersistentProperty.name = "PersistentProperty"
160
+ __TS__ClassExtends(PersistentProperty, ____exports.Property)
161
+ function PersistentProperty.prototype.____constructor(self, id, defaultValue, valueChangeEventListener)
162
+ PersistentProperty.____super.prototype.____constructor(self, defaultValue)
163
+ self.id = id
164
+ ____require(not (persistentPropertyById[id] ~= nil) and not (persistentPlayerPropertyById[id] ~= nil))
165
+ persistentPropertyById[id] = self
166
+ if valueChangeEventListener ~= nil then
167
+ self.valueChangeEvent:addListener(valueChangeEventListener)
168
+ end
169
+ local value = loadedValueById and loadedValueById[id]
170
+ if value ~= nil then
171
+ local ____self_set_4 = self.set
172
+ local ____temp_3
173
+ if value == NULL_VALUE then
174
+ ____temp_3 = nil
175
+ else
176
+ ____temp_3 = value
177
+ end
178
+ ____self_set_4(self, ____temp_3)
179
+ end
180
+ end
181
+ function PersistentProperty.prototype.reset(self)
182
+ if PersistentProperty.____super.prototype.reset(self) then
183
+ localValueById[self.id] = nil
184
+ savePropertyValues()
185
+ return true
186
+ end
187
+ return false
188
+ end
189
+ function PersistentProperty.prototype.set(self, value)
190
+ if PersistentProperty.____super.prototype.set(self, value) then
191
+ localValueById[self.id] = value == nil and NULL_VALUE or value
192
+ savePropertyValues()
193
+ return true
194
+ end
195
+ return false
196
+ end
197
+ ____exports.PersistentPlayerProperty = __TS__Class()
198
+ local PersistentPlayerProperty = ____exports.PersistentPlayerProperty
199
+ PersistentPlayerProperty.name = "PersistentPlayerProperty"
200
+ __TS__ClassExtends(PersistentPlayerProperty, ____exports.PlayerProperty)
201
+ function PersistentPlayerProperty.prototype.____constructor(self, id, initialValue, valueChangeEventListener)
202
+ PersistentPlayerProperty.____super.prototype.____constructor(self, initialValue)
203
+ self.id = id
204
+ ____require(not (persistentPropertyById[id] ~= nil) and not (persistentPlayerPropertyById[id] ~= nil))
205
+ persistentPlayerPropertyById[id] = self
206
+ if valueChangeEventListener ~= nil then
207
+ self.valueChangeEvent:addListener(valueChangeEventListener)
208
+ end
209
+ for ____, player in ipairs(Player.all) do
210
+ local ____opt_5 = loadedValueByIdByPlayer and loadedValueByIdByPlayer[player]
211
+ local value = ____opt_5 and ____opt_5[id]
212
+ if value ~= nil then
213
+ local ____self_set_10 = self.set
214
+ local ____temp_9
215
+ if value == NULL_VALUE then
216
+ ____temp_9 = nil
217
+ else
218
+ ____temp_9 = value
219
+ end
220
+ ____self_set_10(self, player, ____temp_9)
221
+ end
222
+ end
223
+ end
224
+ function PersistentPlayerProperty.prototype.reset(self, player)
225
+ if PersistentPlayerProperty.____super.prototype.reset(self, player) then
226
+ if player.isLocal then
227
+ localValueById[self.id] = nil
228
+ end
229
+ savePropertyValues(player)
230
+ return true
231
+ end
232
+ return false
233
+ end
234
+ function PersistentPlayerProperty.prototype.set(self, player, value)
235
+ if PersistentPlayerProperty.____super.prototype.set(self, player, value) then
236
+ if player.isLocal then
237
+ localValueById[self.id] = value
238
+ end
239
+ savePropertyValues(player)
240
+ return true
241
+ end
242
+ return false
243
+ end
244
+ savePropertyValues = function(player)
245
+ if player ~= nil and not player.isLocal or loadedValueById == nil or loadedValueByIdByPlayer[Player["local"]] == nil then
246
+ return
247
+ end
248
+ local writer = __TS__New(BinaryWriter)
249
+ writer:writeUInt32(0)
250
+ local size = 0
251
+ for ____ in pairs(localValueById) do
252
+ size = size + 1
253
+ end
254
+ writer:writeUInt32(size)
255
+ for id, value in pairs(localValueById) do
256
+ writer:writeInt32(id)
257
+ if value == NULL_VALUE then
258
+ writer:writeUInt8(0)
259
+ elseif value == false then
260
+ writer:writeUInt8(1)
261
+ elseif value == true then
262
+ writer:writeUInt8(2)
263
+ elseif type(value) == "number" then
264
+ if math.type(value) == "integer" then
265
+ writer:writeUInt8(3)
266
+ writer:writeInt32(value)
267
+ else
268
+ writer:writeUInt8(4)
269
+ writer:writeFloat(value)
270
+ end
271
+ else
272
+ writer:writeUInt8(5)
273
+ writer:writeUInt32(#value)
274
+ writer:writeBytes(value)
275
+ end
276
+ end
277
+ file.write(
278
+ ____exports.PersistentPropertiesConfig.defaultFileName,
279
+ base64.encode(lzw.compress(tostring(writer)))
280
+ )
281
+ end
282
+ local function loadPropertyValues(fileData, player)
283
+ do
284
+ local function ____catch(_)
285
+ return true, {}
286
+ end
287
+ local ____try, ____hasReturned, ____returnValue = pcall(function()
288
+ local valueById = {}
289
+ local reader = __TS__New(
290
+ BinaryReader,
291
+ lzw.decompress(base64.decode(fileData))
292
+ )
293
+ reader:readUInt32()
294
+ local size = reader:readUInt32()
295
+ for _ = 1, size do
296
+ local id = reader:readInt32()
297
+ local dataType = reader:readUInt8()
298
+ if dataType == 0 then
299
+ valueById[id] = NULL_VALUE
300
+ elseif dataType == 1 then
301
+ valueById[id] = false
302
+ elseif dataType == 2 then
303
+ valueById[id] = true
304
+ elseif dataType == 3 then
305
+ valueById[id] = reader:readInt32()
306
+ elseif dataType == 4 then
307
+ valueById[id] = reader:readFloat()
308
+ elseif dataType == 5 then
309
+ valueById[id] = reader:readBytes(reader:readUInt32())
310
+ end
311
+ end
312
+ for id, value in pairs(valueById) do
313
+ local persistentProperty = persistentPropertyById[id]
314
+ if persistentProperty ~= nil then
315
+ if not persistentProperty.isChanged then
316
+ local ____persistentProperty_set_12 = persistentProperty.set
317
+ local ____temp_11
318
+ if value == NULL_VALUE then
319
+ ____temp_11 = nil
320
+ else
321
+ ____temp_11 = value
322
+ end
323
+ ____persistentProperty_set_12(persistentProperty, ____temp_11)
324
+ end
325
+ elseif player ~= nil then
326
+ local persistentPlayerProperty = persistentPlayerPropertyById[id]
327
+ if persistentPlayerProperty ~= nil then
328
+ if not persistentPlayerProperty:isChanged(player) then
329
+ local ____persistentPlayerProperty_set_15 = persistentPlayerProperty.set
330
+ local ____player_14 = player
331
+ local ____temp_13
332
+ if value == NULL_VALUE then
333
+ ____temp_13 = nil
334
+ else
335
+ ____temp_13 = value
336
+ end
337
+ ____persistentPlayerProperty_set_15(persistentPlayerProperty, ____player_14, ____temp_13)
338
+ end
339
+ elseif player.isLocal then
340
+ localValueById[id] = value
341
+ end
342
+ else
343
+ localValueById[id] = value
344
+ end
345
+ end
346
+ return true, valueById
347
+ end)
348
+ if not ____try then
349
+ ____hasReturned, ____returnValue = ____catch(____hasReturned)
350
+ end
351
+ if ____hasReturned then
352
+ return ____returnValue
353
+ end
354
+ end
355
+ end
356
+ Timer:run(function()
357
+ local data = file.read(____exports.PersistentPropertiesConfig.defaultFileName) or ""
358
+ loadedValueById = loadPropertyValues(data)
359
+ for ____, player in ipairs(Player.all) do
360
+ local ____self_16 = synchronize(player, data)
361
+ ____self_16["then"](
362
+ ____self_16,
363
+ function(____, synchronizedData)
364
+ loadedValueByIdByPlayer[player] = loadPropertyValues(synchronizedData, player)
365
+ savePropertyValues(player)
366
+ end,
367
+ function()
368
+ loadedValueByIdByPlayer[player] = {}
369
+ savePropertyValues(player)
370
+ end
371
+ )
372
+ end
373
+ end)
374
+ return ____exports
@@ -32,7 +32,10 @@ export declare const flatMapToLuaSet: {
32
32
  };
33
33
  export declare const mapIndexed: <T, R>(array: readonly T[], transform: (index: number, value: T) => R) => R[];
34
34
  export declare const associate: <T, K extends AnyNotNil, V>(array: readonly T[], keySelector: (value: T) => K, valueSelector: (value: T) => V) => LuaMap<K, V>;
35
- export declare const associateBy: <K extends AnyNotNil, V>(array: readonly V[], keySelector: (value: V) => K) => LuaMap<K, V>;
35
+ export declare const associateBy: {
36
+ <K extends AnyNotNil, V>(array: readonly V[], keySelector: (value: V) => K): LuaMap<K, V>;
37
+ <K extends KeysOfType<V, AnyNotNil>, V>(array: readonly V[], keySelector: K): LuaMap<V[K] extends AnyNotNil ? V[K] : never, V>;
38
+ };
36
39
  export declare const associateByIndexed: <K extends AnyNotNil, V>(array: readonly V[], keySelector: (index: number, value: V) => K) => LuaMap<K, V>;
37
40
  export declare const associateWith: <K extends AnyNotNil, V>(array: readonly K[], valueSelector: (value: K) => V) => LuaMap<K, V>;
38
41
  export declare const associateWithIndexed: <K extends AnyNotNil, V>(array: readonly K[], valueSelector: (index: number, value: K) => V) => LuaMap<K, V>;
@@ -41,6 +44,10 @@ export declare const average: (array: readonly number[]) => number;
41
44
  export declare const sum: (array: readonly number[]) => number;
42
45
  export declare const product: (array: readonly number[]) => number;
43
46
  export declare const max: (array: readonly number[]) => number;
47
+ export declare const maxBy: {
48
+ <T, Args extends any[]>(array: readonly T[], selector: (value: T, ...args: Args) => number, ...args: Args): T | undefined;
49
+ <T, K extends KeysOfType<T, number>>(array: readonly T[], key: K): T | undefined;
50
+ };
44
51
  export declare const intersperse: <T>(array: readonly T[], delimiter: T) => T[];
45
52
  export declare const zip: <T, R, V>(array: readonly T[], otherArray: readonly R[], transform: (value: T, otherValue: R) => V) => V[];
46
53
  export declare const chunked: <T>(array: readonly T[], size: number) => T[][];