omegga 1.8.0 → 1.8.1
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.
- package/CHANGELOG.md +9 -0
- package/dist/omegga/commands.js +53 -7
- package/dist/omegga/commands.js.map +1 -1
- package/dist/omegga/plugin/plugin_jsonrpc_stdio.js +38 -0
- package/dist/omegga/plugin/plugin_jsonrpc_stdio.js.map +1 -1
- package/dist/omegga/plugin/plugin_node_safe/proxyOmegga.js +26 -1
- package/dist/omegga/plugin/plugin_node_safe/proxyOmegga.js.map +1 -1
- package/dist/omegga/server.js +172 -9
- package/dist/omegga/server.js.map +1 -1
- package/dist/plugin.js.map +1 -1
- package/dist/webserver/backend/router/role.js +1 -1
- package/dist/webserver/backend/router/role.js.map +1 -1
- package/package.json +1 -1
- package/templates/safe-ts/omegga.d.ts +133 -4
- package/.claude/settings.local.json +0 -53
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,15 @@
|
|
|
4
4
|
|
|
5
5
|
- Future features go here
|
|
6
6
|
|
|
7
|
+
## 1.8.1 - 2026-07-03
|
|
8
|
+
|
|
9
|
+
Prefab support for EA3, replacing the removed `.brs` bricks commands.
|
|
10
|
+
|
|
11
|
+
- Plugins: Add prefab methods (`loadPrefab`, `savePrefab`, `savePrefabAsync`, `givePrefabToPlayer`, `loadPrefabOnPlayer`, `getPrefabs`)
|
|
12
|
+
- Plugins: `clearRegion`/`clearAllBricks` route to the new world clear commands on EA3 and can optionally clear entities
|
|
13
|
+
- Plugins: Deprecate the `.brs` bricks methods removed by the game (`saveBricks`, `loadBricks`, `getSaveData`, `loadBricksOnPlayer`, etc.) - they warn and no-op
|
|
14
|
+
- Commands: Warn when a plugin writes a console command the running game version has removed
|
|
15
|
+
|
|
7
16
|
## 1.8.0 - 2026-06-27
|
|
8
17
|
|
|
9
18
|
Huge breaking changes on in console commands for EA3...
|
package/dist/omegga/commands.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const logger = require("../logger.js");
|
|
3
4
|
const RENAME_VERSION = 14349;
|
|
5
|
+
const EA2_VERSION = 12960;
|
|
6
|
+
const PREFAB_VERSION = 14626;
|
|
4
7
|
class ConsoleCommand {
|
|
5
8
|
/** @param versions [sinceVersion, name] pairs in ascending version order */
|
|
6
9
|
constructor(versions) {
|
|
@@ -15,6 +18,19 @@ class ConsoleCommand {
|
|
|
15
18
|
if (version >= since) name = candidate;
|
|
16
19
|
return name;
|
|
17
20
|
}
|
|
21
|
+
/** Mark this command as removed from the game at `version` (fluent). */
|
|
22
|
+
removedIn(version) {
|
|
23
|
+
this.removedAt = version;
|
|
24
|
+
return this;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Whether this command no longer exists at the given game version. An unknown
|
|
28
|
+
* version (server not started / not detected yet, `<= 0`) is treated as still
|
|
29
|
+
* present so we never warn on commands sent before the version is known.
|
|
30
|
+
*/
|
|
31
|
+
isRemovedAt(version) {
|
|
32
|
+
return this.removedAt != null && version > 0 && version >= this.removedAt;
|
|
33
|
+
}
|
|
18
34
|
/** every name this command has gone by, across versions */
|
|
19
35
|
get names() {
|
|
20
36
|
return this.versions.map(([, name]) => name);
|
|
@@ -31,8 +47,13 @@ const COMMAND_TABLE = {
|
|
|
31
47
|
Bricks: {
|
|
32
48
|
ActuallyReduce: c("Bricks.ActuallyReduce", "br.Bricks.ActuallyReduce"),
|
|
33
49
|
Clear: c("Bricks.Clear", "br.Bricks.Clear"),
|
|
34
|
-
|
|
35
|
-
|
|
50
|
+
// removed at PREFAB_VERSION -> replaced by World.ClearAll / World.ClearRegion
|
|
51
|
+
ClearAll: c("Bricks.ClearAll", "br.Bricks.ClearAll").removedIn(
|
|
52
|
+
PREFAB_VERSION
|
|
53
|
+
),
|
|
54
|
+
ClearRegion: c("Bricks.ClearRegion", "br.Bricks.ClearRegion").removedIn(
|
|
55
|
+
PREFAB_VERSION
|
|
56
|
+
),
|
|
36
57
|
Cluster: {
|
|
37
58
|
EnableMergingDynamicGrids: c(
|
|
38
59
|
"Bricks.Cluster.EnableMergingDynamicGrids",
|
|
@@ -151,8 +172,10 @@ const COMMAND_TABLE = {
|
|
|
151
172
|
"br.Bricks.GenerateMathTables"
|
|
152
173
|
),
|
|
153
174
|
GetOctreeStats: c("Bricks.GetOctreeStats", "br.Bricks.GetOctreeStats"),
|
|
154
|
-
|
|
155
|
-
|
|
175
|
+
// removed at PREFAB_VERSION -> replaced by Prefab.Load
|
|
176
|
+
Load: c("Bricks.Load", "br.Bricks.Load").removedIn(PREFAB_VERSION),
|
|
177
|
+
// removed ~EA2 -> replaced by Prefab.GiveToPlayer (loadPrefabOnPlayer)
|
|
178
|
+
LoadTemplate: c("Bricks.LoadTemplate").removedIn(EA2_VERSION),
|
|
156
179
|
LODScreenSizeScale: c(
|
|
157
180
|
"Bricks.LODScreenSizeScale",
|
|
158
181
|
"br.Bricks.LODScreenSizeScale"
|
|
@@ -190,7 +213,8 @@ const COMMAND_TABLE = {
|
|
|
190
213
|
),
|
|
191
214
|
RebuildClusters: c("Bricks.RebuildClusters", "br.Bricks.RebuildClusters"),
|
|
192
215
|
RebuildMeshes: c("Bricks.RebuildMeshes", "br.Bricks.RebuildMeshes"),
|
|
193
|
-
|
|
216
|
+
// removed at PREFAB_VERSION -> replaced by Prefab.SaveRegion
|
|
217
|
+
Save: c("Bricks.Save", "br.Bricks.Save").removedIn(PREFAB_VERSION),
|
|
194
218
|
SaveFileCompressionLevel: c(
|
|
195
219
|
"Bricks.SaveFileCompressionLevel",
|
|
196
220
|
"br.Bricks.SaveFileCompressionLevel"
|
|
@@ -219,7 +243,10 @@ const COMMAND_TABLE = {
|
|
|
219
243
|
"Bricks.SaveFileReadSizeLimit",
|
|
220
244
|
"br.Bricks.SaveFileReadSizeLimit"
|
|
221
245
|
),
|
|
222
|
-
|
|
246
|
+
// removed at PREFAB_VERSION -> replaced by Prefab.SaveRegion
|
|
247
|
+
SaveRegion: c("Bricks.SaveRegion", "br.Bricks.SaveRegion").removedIn(
|
|
248
|
+
PREFAB_VERSION
|
|
249
|
+
),
|
|
223
250
|
ValidateMathTables: c(
|
|
224
251
|
"Bricks.ValidateMathTables",
|
|
225
252
|
"br.Bricks.ValidateMathTables"
|
|
@@ -415,6 +442,12 @@ const COMMAND_TABLE = {
|
|
|
415
442
|
PlayerParts: {
|
|
416
443
|
UseFastRender: c("br.PlayerParts.UseFastRender")
|
|
417
444
|
},
|
|
445
|
+
// prefab commands added at PREFAB_VERSION (replace the removed .brs commands)
|
|
446
|
+
Prefab: {
|
|
447
|
+
GiveToPlayer: c("br.Prefab.GiveToPlayer"),
|
|
448
|
+
Load: c("br.Prefab.Load"),
|
|
449
|
+
SaveRegion: c("br.Prefab.SaveRegion")
|
|
450
|
+
},
|
|
418
451
|
Resizer: {
|
|
419
452
|
LogTests: c("br.Resizer.LogTests")
|
|
420
453
|
},
|
|
@@ -564,10 +597,14 @@ const COMMAND_TABLE = {
|
|
|
564
597
|
EnableWires: c("BR.WireRenderer.EnableWires")
|
|
565
598
|
},
|
|
566
599
|
World: {
|
|
600
|
+
// added at PREFAB_VERSION (replace the removed Bricks.ClearAll/ClearRegion)
|
|
601
|
+
ClearAll: c("BR.World.ClearAll"),
|
|
602
|
+
ClearRegion: c("BR.World.ClearRegion"),
|
|
567
603
|
CreateEmpty: c("BR.World.CreateEmpty"),
|
|
568
604
|
ListRevisions: c("BR.World.ListRevisions"),
|
|
569
605
|
Load: c("BR.World.Load"),
|
|
570
|
-
|
|
606
|
+
// removed at PREFAB_VERSION -> use Prefab.Load
|
|
607
|
+
LoadAdditive: c("BR.World.LoadAdditive").removedIn(PREFAB_VERSION),
|
|
571
608
|
LoadRevision: c("BR.World.LoadRevision"),
|
|
572
609
|
Save: c("BR.World.Save"),
|
|
573
610
|
SaveAs: c("BR.World.SaveAs")
|
|
@@ -590,6 +627,7 @@ const resolveTree = (tree, version) => {
|
|
|
590
627
|
};
|
|
591
628
|
const resolveConsoleCommands = (version) => resolveTree(COMMAND_TABLE, version);
|
|
592
629
|
const COMMAND_LOOKUP = /* @__PURE__ */ new Map();
|
|
630
|
+
const warnedRemovedCommands = /* @__PURE__ */ new Set();
|
|
593
631
|
const indexTree = (tree) => {
|
|
594
632
|
for (const key in tree) {
|
|
595
633
|
const value = tree[key];
|
|
@@ -609,12 +647,20 @@ const migrateConsoleCommand = (line, version) => {
|
|
|
609
647
|
const head = space === -1 ? line : line.slice(0, space);
|
|
610
648
|
const command = COMMAND_LOOKUP.get(head.toLowerCase());
|
|
611
649
|
if (!command) return line;
|
|
650
|
+
if (command.isRemovedAt(version) && !warnedRemovedCommands.has(head.toLowerCase())) {
|
|
651
|
+
warnedRemovedCommands.add(head.toLowerCase());
|
|
652
|
+
logger.default.warnp(
|
|
653
|
+
`Console command "${head}" was removed in Brickadia CL${command.removedAt} and will have no effect. Update the plugin using it to the prefab/world equivalent.`
|
|
654
|
+
);
|
|
655
|
+
}
|
|
612
656
|
const resolved = command.resolve(version);
|
|
613
657
|
if (resolved.toLowerCase() === head.toLowerCase()) return line;
|
|
614
658
|
return space === -1 ? resolved : resolved + line.slice(space);
|
|
615
659
|
};
|
|
616
660
|
exports.COMMAND_TABLE = COMMAND_TABLE;
|
|
617
661
|
exports.ConsoleCommand = ConsoleCommand;
|
|
662
|
+
exports.EA2_VERSION = EA2_VERSION;
|
|
663
|
+
exports.PREFAB_VERSION = PREFAB_VERSION;
|
|
618
664
|
exports.migrateConsoleCommand = migrateConsoleCommand;
|
|
619
665
|
exports.resolveConsoleCommands = resolveConsoleCommands;
|
|
620
666
|
//# sourceMappingURL=commands.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commands.js","sources":["../../src/omegga/commands.ts"],"sourcesContent":["// AUTO-GENERATED command name table. Maps each Brickadia console command to\n// its name across game versions so plugins/omegga can address commands without\n// hardcoding a name that changes between releases.\n//\n// At CL 14349 nearly every console command gained the `br.` prefix (and a\n// handful were restructured). Before that, the legacy names were used.\n// Minigames were deprecated at CL 14000 and replaced by GameMode commands;\n// the legacy Minigames commands still resolve but are no-ops on newer servers.\n//\n// Resolve the version-correct name with `omegga.Console`, e.g.\n// `omegga.Console.Bricks.Clear` -> \"Bricks.Clear\" or \"br.Bricks.Clear\".\n//\n// Where a command is both a value and a namespace (e.g. `br.DrawDebug.Colliders`\n// and `br.DrawDebug.Colliders.DrawCOM`), the command itself lives under `$`.\n\n/** CL version at which console commands gained the `br.` prefix. */\nconst RENAME_VERSION = 14349;\n\n/** A console command whose name may differ across game versions. */\nexport class ConsoleCommand {\n /** @param versions [sinceVersion, name] pairs in ascending version order */\n constructor(private readonly versions: readonly [number, string][]) {}\n\n /** Resolve the command name for a given game CL version. */\n resolve(version: number): string {\n // unknown version (server not started / not detected yet) -> newest name\n if (!version || version < 0)\n return this.versions[this.versions.length - 1][1];\n let name = this.versions[0][1];\n for (const [since, candidate] of this.versions)\n if (version >= since) name = candidate;\n return name;\n }\n\n /** every name this command has gone by, across versions */\n get names(): readonly string[] {\n return this.versions.map(([, name]) => name);\n }\n}\n\n/** Command renamed with the `br.` prefix at {@link RENAME_VERSION}. */\nconst c = (legacy: string, current = legacy): ConsoleCommand =>\n new ConsoleCommand(\n legacy === current\n ? [[0, legacy]]\n : [\n [0, legacy],\n [RENAME_VERSION, current],\n ],\n );\n\n/** Command with explicit per-version names (ascending by version). */\nconst cv = (versions: [number, string][]): ConsoleCommand =>\n new ConsoleCommand(versions);\n\n/** The raw command table (leaves are version-aware {@link ConsoleCommand}s). */\nexport const COMMAND_TABLE = {\n Bricks: {\n ActuallyReduce: c('Bricks.ActuallyReduce', 'br.Bricks.ActuallyReduce'),\n Clear: c('Bricks.Clear', 'br.Bricks.Clear'),\n ClearAll: c('Bricks.ClearAll', 'br.Bricks.ClearAll'),\n ClearRegion: c('Bricks.ClearRegion', 'br.Bricks.ClearRegion'),\n Cluster: {\n EnableMergingDynamicGrids: c(\n 'Bricks.Cluster.EnableMergingDynamicGrids',\n 'br.Bricks.Cluster.EnableMergingDynamicGrids',\n ),\n EnableMergingGlobalGrid: c(\n 'Bricks.Cluster.EnableMergingGlobalGrid',\n 'br.Bricks.Cluster.EnableMergingGlobalGrid',\n ),\n MaxClusterHalfExtent: c(\n 'Bricks.Cluster.MaxClusterHalfExtent',\n 'br.Bricks.Cluster.MaxClusterHalfExtent',\n ),\n MaxClusterWeight: c(\n 'Bricks.Cluster.MaxClusterWeight',\n 'br.Bricks.Cluster.MaxClusterWeight',\n ),\n MaxSplitWeight: c(\n 'Bricks.Cluster.MaxSplitWeight',\n 'br.Bricks.Cluster.MaxSplitWeight',\n ),\n MinCollapseWeight: c(\n 'Bricks.Cluster.MinCollapseWeight',\n 'br.Bricks.Cluster.MinCollapseWeight',\n ),\n MinMergeThreshold: c(\n 'Bricks.Cluster.MinMergeThreshold',\n 'br.Bricks.Cluster.MinMergeThreshold',\n ),\n MinRootHalfExtent: c(\n 'Bricks.Cluster.MinRootHalfExtent',\n 'br.Bricks.Cluster.MinRootHalfExtent',\n ),\n },\n ClusterMesh: {\n CardCaching: c(\n 'Bricks.ClusterMesh.CardCaching',\n 'br.Bricks.ClusterMesh.CardCaching',\n ),\n DrawDistance: c(\n 'Bricks.ClusterMesh.DrawDistance',\n 'br.Bricks.ClusterMesh.DrawDistance',\n ),\n Hysteresis: c(\n 'Bricks.ClusterMesh.Hysteresis',\n 'br.Bricks.ClusterMesh.Hysteresis',\n ),\n Lod0KeepBias: c(\n 'Bricks.ClusterMesh.Lod0KeepBias',\n 'br.Bricks.ClusterMesh.Lod0KeepBias',\n ),\n MaxTransitionsPerFrame: c(\n 'Bricks.ClusterMesh.MaxTransitionsPerFrame',\n 'br.Bricks.ClusterMesh.MaxTransitionsPerFrame',\n ),\n MemoryBudgetBucketSize: c(\n 'Bricks.ClusterMesh.MemoryBudgetBucketSize',\n 'br.Bricks.ClusterMesh.MemoryBudgetBucketSize',\n ),\n MemoryBudgetMB: c(\n 'Bricks.ClusterMesh.MemoryBudgetMB',\n 'br.Bricks.ClusterMesh.MemoryBudgetMB',\n ),\n Residency: c(\n 'Bricks.ClusterMesh.Residency',\n 'br.Bricks.ClusterMesh.Residency',\n ),\n ResidencyConeHysteresis: c(\n 'Bricks.ClusterMesh.ResidencyConeHysteresis',\n 'br.Bricks.ClusterMesh.ResidencyConeHysteresis',\n ),\n ResidencyConeMargin: c(\n 'Bricks.ClusterMesh.ResidencyConeMargin',\n 'br.Bricks.ClusterMesh.ResidencyConeMargin',\n ),\n ResidencyWideFOV: c(\n 'Bricks.ClusterMesh.ResidencyWideFOV',\n 'br.Bricks.ClusterMesh.ResidencyWideFOV',\n ),\n ResidencyZoomHysteresisKillRate: c(\n 'Bricks.ClusterMesh.ResidencyZoomHysteresisKillRate',\n 'br.Bricks.ClusterMesh.ResidencyZoomHysteresisKillRate',\n ),\n },\n DebugSaveFileScreenshots: c(\n 'Bricks.DebugSaveFileScreenshots',\n 'br.Bricks.DebugSaveFileScreenshots',\n ),\n DisableLoadWiresForLegacySave: c(\n 'Bricks.DisableLoadWiresForLegacySave',\n 'br.Bricks.DisableLoadWiresForLegacySave',\n ),\n DrawDebugOctree: c('Bricks.DrawDebugOctree', 'br.Bricks.DrawDebugOctree'),\n DumpChunkStats: c('Bricks.DumpChunkStats', 'br.Bricks.DumpChunkStats'),\n DumpCoverageStats: c(\n 'Bricks.DumpCoverageStats',\n 'br.Bricks.DumpCoverageStats',\n ),\n DumpGeometryStats: c(\n 'Bricks.DumpGeometryStats',\n 'br.Bricks.DumpGeometryStats',\n ),\n DumpGroupStats: c('Bricks.DumpGroupStats', 'br.Bricks.DumpGroupStats'),\n EnableExtendedSort: c(\n 'Bricks.EnableExtendedSort',\n 'br.Bricks.EnableExtendedSort',\n ),\n EnableLumenCards: c(\n 'Bricks.EnableLumenCards',\n 'br.Bricks.EnableLumenCards',\n ),\n ExportModel: c('Bricks.ExportModel', 'br.Bricks.ExportModel'),\n GenerateGates: c('BR.Bricks.GenerateGates'),\n GenerateMathTables: c(\n 'Bricks.GenerateMathTables',\n 'br.Bricks.GenerateMathTables',\n ),\n GetOctreeStats: c('Bricks.GetOctreeStats', 'br.Bricks.GetOctreeStats'),\n Load: c('Bricks.Load', 'br.Bricks.Load'),\n LoadTemplate: c('Bricks.LoadTemplate'),\n LODScreenSizeScale: c(\n 'Bricks.LODScreenSizeScale',\n 'br.Bricks.LODScreenSizeScale',\n ),\n LogClusterBuildTime: c(\n 'Bricks.LogClusterBuildTime',\n 'br.Bricks.LogClusterBuildTime',\n ),\n LogStreamSizes: c('Bricks.LogStreamSizes', 'br.Bricks.LogStreamSizes'),\n MaxChunkClusterEntriesPerTick: c(\n 'Bricks.MaxChunkClusterEntriesPerTick',\n 'br.Bricks.MaxChunkClusterEntriesPerTick',\n ),\n MaxChunkEntries: c('Bricks.MaxChunkEntries', 'br.Bricks.MaxChunkEntries'),\n MaxChunkUpdatesPerTick: c(\n 'Bricks.MaxChunkUpdatesPerTick',\n 'br.Bricks.MaxChunkUpdatesPerTick',\n ),\n MaxChunkUpdateTimePerTick: c(\n 'Bricks.MaxChunkUpdateTimePerTick',\n 'br.Bricks.MaxChunkUpdateTimePerTick',\n ),\n MaxClusterResultsToApplyPerTick: c(\n 'Bricks.MaxClusterResultsToApplyPerTick',\n 'br.Bricks.MaxClusterResultsToApplyPerTick',\n ),\n MaxSubscribed: c('br.MaxSubscribedBricks', 'br.Bricks.MaxSubscribed'),\n OptimizeVertexCache: c(\n 'Bricks.OptimizeVertexCache',\n 'br.Bricks.OptimizeVertexCache',\n ),\n PrintOctreeLeafStats: c(\n 'Bricks.PrintOctreeLeafStats',\n 'br.Bricks.PrintOctreeLeafStats',\n ),\n RebuildClusters: c('Bricks.RebuildClusters', 'br.Bricks.RebuildClusters'),\n RebuildMeshes: c('Bricks.RebuildMeshes', 'br.Bricks.RebuildMeshes'),\n Save: c('Bricks.Save', 'br.Bricks.Save'),\n SaveFileCompressionLevel: c(\n 'Bricks.SaveFileCompressionLevel',\n 'br.Bricks.SaveFileCompressionLevel',\n ),\n SaveFileReadBrickLimit: c(\n 'Bricks.SaveFileReadBrickLimit',\n 'br.Bricks.SaveFileReadBrickLimit',\n ),\n SaveFileReadComponentInstanceLimit: c(\n 'Bricks.SaveFileReadComponentInstanceLimit',\n 'br.Bricks.SaveFileReadComponentInstanceLimit',\n ),\n SaveFileReadComponentTypeLimit: c(\n 'Bricks.SaveFileReadComponentTypeLimit',\n 'br.Bricks.SaveFileReadComponentTypeLimit',\n ),\n SaveFileReadDimensionLimit: c(\n 'Bricks.SaveFileReadDimensionLimit',\n 'br.Bricks.SaveFileReadDimensionLimit',\n ),\n SaveFileReadOwnerLimit: c(\n 'Bricks.SaveFileReadOwnerLimit',\n 'br.Bricks.SaveFileReadOwnerLimit',\n ),\n SaveFileReadSizeLimit: c(\n 'Bricks.SaveFileReadSizeLimit',\n 'br.Bricks.SaveFileReadSizeLimit',\n ),\n SaveRegion: c('Bricks.SaveRegion', 'br.Bricks.SaveRegion'),\n ValidateMathTables: c(\n 'Bricks.ValidateMathTables',\n 'br.Bricks.ValidateMathTables',\n ),\n Vehicle: {\n AntiRollScale: c(\n 'Bricks.Vehicle.AntiRollScale',\n 'br.Bricks.Vehicle.AntiRollScale',\n ),\n ClientFullSim: c(\n 'Bricks.Vehicle.ClientFullSim',\n 'br.Bricks.Vehicle.ClientFullSim',\n ),\n DebugDraw: c('Bricks.Vehicle.DebugDraw', 'br.Bricks.Vehicle.DebugDraw'),\n },\n WheelEngine: {\n VisualiseTurningCircles: c(\n 'Bricks.WheelEngine.VisualiseTurningCircles',\n 'br.Bricks.WheelEngine.VisualiseTurningCircles',\n ),\n },\n WipeMirrorTables: c(\n 'Bricks.WipeMirrorTables',\n 'br.Bricks.WipeMirrorTables',\n ),\n },\n BundleCompressionLevel: c('BR.BundleCompressionLevel'),\n Bundles: {\n AutoCloseDelay: c('Bundles.AutoCloseDelay', 'br.Bundles.AutoCloseDelay'),\n },\n Catalog: {\n ClearCache: c('Catalog.ClearCache', 'br.Catalog.ClearCache'),\n HideBlacklisted: c('Catalog.HideBlacklisted', 'br.Catalog.HideBlacklisted'),\n },\n Chat: {\n Broadcast: c('Chat.Broadcast', 'br.Chat.Broadcast'),\n Command: c('Chat.Command', 'br.Chat.Command'),\n MessageForUnknownCommands: c(\n 'Chat.MessageForUnknownCommands',\n 'br.Chat.MessageForUnknownCommands',\n ),\n StatusMessage: c('Chat.StatusMessage', 'br.Chat.StatusMessage'),\n Whisper: c('Chat.Whisper', 'br.Chat.Whisper'),\n },\n ComplexityWarning: {\n BrickCount: c(\n 'br.BrickCountWarningThreshold',\n 'br.ComplexityWarning.BrickCount',\n ),\n FrozenEntityCount: c(\n 'br.FrozenEntityCountWarningThreshold',\n 'br.ComplexityWarning.FrozenEntityCount',\n ),\n UnfrozenEntityCount: c(\n 'br.UnfrozenEntityCountWarningThreshold',\n 'br.ComplexityWarning.UnfrozenEntityCount',\n ),\n },\n Debug: {\n CauseEnsure: c('CauseEnsure', 'br.Debug.CauseEnsure'),\n CauseHang: c('CauseHang', 'br.Debug.CauseHang'),\n ChangeBundleOwner: c('BR.Debug.ChangeBundleOwner'),\n Crash: c('Crash', 'br.Debug.Crash'),\n ListBundleOwners: c('BR.Debug.ListBundleOwners'),\n TestMarkdown: c('TestMarkdown', 'br.Debug.TestMarkdown'),\n TestMarkup: c('TestMarkup', 'br.Debug.TestMarkup'),\n },\n DrawDebug: {\n BrickClusters: {\n $: c('BR.DrawDebugBrickClusters', 'br.DrawDebug.BrickClusters'),\n Neighbors: c(\n 'BR.DrawDebugBrickClusters.Neighbors',\n 'br.DrawDebug.BrickClusters.Neighbors',\n ),\n OctreeBounds: c(\n 'BR.DrawDebugBrickClusters.OctreeBounds',\n 'br.DrawDebug.BrickClusters.OctreeBounds',\n ),\n },\n BrickClusterSplitTree: c(\n 'BR.DrawDebugBrickClusterSplitTree',\n 'br.DrawDebug.BrickClusterSplitTree',\n ),\n BrickLumenCards: c(\n 'BR.DrawDebugBrickLumenCards',\n 'br.DrawDebug.BrickLumenCards',\n ),\n ClientUpdates: c('BR.DrawDebugClientUpdates', 'br.DrawDebug.ClientUpdates'),\n Colliders: {\n $: c('BR.DrawDebugColliders', 'br.DrawDebug.Colliders'),\n DrawCOM: c(\n 'BR.DrawDebugColliders.DrawCOM',\n 'br.DrawDebug.Colliders.DrawCOM',\n ),\n DrawCustomMass: c(\n 'BR.DrawDebugColliders.DrawCustomMass',\n 'br.DrawDebug.Colliders.DrawCustomMass',\n ),\n },\n Constraints: c('BR.DrawDebugConstraints', 'br.DrawDebug.Constraints'),\n Entities: {\n $: c('BR.DrawDebugEntities', 'br.DrawDebug.Entities'),\n Boxes: c('BR.DrawDebugEntities.Boxes', 'br.DrawDebug.Entities.Boxes'),\n Dots: c('BR.DrawDebugEntities.Dots', 'br.DrawDebug.Entities.Dots'),\n },\n Lights: {\n $: c('BR.DrawDebugLights', 'br.DrawDebug.Lights'),\n RedThreshold: c(\n 'BR.DrawDebugLights.RedThreshold',\n 'br.DrawDebug.Lights.RedThreshold',\n ),\n },\n Texts: c('BR.DrawDebugTexts', 'br.DrawDebug.Texts'),\n },\n EnableImgui: c('br.EnableImgui'),\n EOS: {\n AttemptLogin: c('BR.EOS.AttemptLogin'),\n Disable: c('BR.EOS.Disable'),\n SetSocketName: c('BR.EOS.SetSocketName'),\n },\n GPUMappedArray: {\n MinBlocks: c('BR.GPUMappedArray.MinBlocks'),\n ReservedHeadroomBlocks: c('BR.GPUMappedArray.ReservedHeadroomBlocks'),\n },\n Inspector: {\n ShowFloatTest: c('Inspector.ShowFloatTest', 'br.Inspector.ShowFloatTest'),\n ShowGraphics: c('Inspector.ShowGraphics', 'br.Inspector.ShowGraphics'),\n },\n Interview: c('BR.Interview'),\n Iris: {\n EnableMapDeltaSerialization: c('BR.Iris.EnableMapDeltaSerialization'),\n },\n LagIndicator: {\n MinLatency: c('br.LagIndicatorMinLatency', 'br.LagIndicator.MinLatency'),\n MinTimeSincePacket: c(\n 'br.LagIndicatorMinTimeSincePacket',\n 'br.LagIndicator.MinTimeSincePacket',\n ),\n },\n Lua: {\n Execute: c('Lua.Execute', 'br.Lua.Execute'),\n ExecuteScript: c('Lua.ExecuteScript', 'br.Lua.ExecuteScript'),\n },\n Msgpack: {\n Default: {\n MaxContainerSize: c(\n 'msgpack.Default.MaxContainerSize',\n 'br.Msgpack.Default.MaxContainerSize',\n ),\n MaxDepth: c('msgpack.Default.MaxDepth', 'br.Msgpack.Default.MaxDepth'),\n MaxEnumValueCount: c(\n 'msgpack.Default.MaxEnumValueCount',\n 'br.Msgpack.Default.MaxEnumValueCount',\n ),\n MaxFieldCount: c(\n 'msgpack.Default.MaxFieldCount',\n 'br.Msgpack.Default.MaxFieldCount',\n ),\n MaxFieldNameLength: c(\n 'msgpack.Default.MaxFieldNameLength',\n 'br.Msgpack.Default.MaxFieldNameLength',\n ),\n MaxFlatArraySize: c(\n 'msgpack.Default.MaxFlatArraySize',\n 'br.Msgpack.Default.MaxFlatArraySize',\n ),\n MaxNameLength: c(\n 'msgpack.Default.MaxNameLength',\n 'br.Msgpack.Default.MaxNameLength',\n ),\n MaxStringLength: c(\n 'msgpack.Default.MaxStringLength',\n 'br.Msgpack.Default.MaxStringLength',\n ),\n MaxTypeCount: c(\n 'msgpack.Default.MaxTypeCount',\n 'br.Msgpack.Default.MaxTypeCount',\n ),\n },\n },\n NudgePhysicsObject: c('BR.NudgePhysicsObject'),\n Permissions: {\n GrantRole: c('Permissions.GrantRole', 'br.Permissions.GrantRole'),\n RevokeRole: c('Permissions.RevokeRole', 'br.Permissions.RevokeRole'),\n Save: c('Permissions.Save', 'br.Permissions.Save'),\n },\n Physics: {\n ForceFreezeDynamicGrids: c('BR.Physics.ForceFreezeDynamicGrids'),\n },\n Placer: {\n LogRowTests: c('br.Placer.LogRowTests'),\n },\n PlayerParts: {\n UseFastRender: c('br.PlayerParts.UseFastRender'),\n },\n Resizer: {\n LogTests: c('br.Resizer.LogTests'),\n },\n RunHardwareBenchmark: c('BR.RunHardwareBenchmark'),\n Server: {\n Environment: {\n LoadPreset: c(\n 'Server.Environment.LoadPreset',\n 'br.Server.Environment.LoadPreset',\n ),\n Reset: c('Server.Environment.Reset', 'br.Server.Environment.Reset'),\n SavePreset: c(\n 'Server.Environment.SavePreset',\n 'br.Server.Environment.SavePreset',\n ),\n },\n GameMode: {\n EndRound: c('Server.GameMode.EndRound', 'br.Server.GameMode.EndRound'),\n NextRound: c('Server.GameMode.NextRound', 'br.Server.GameMode.NextRound'),\n PrintLeaderboard: c(\n 'Server.GameMode.PrintLeaderboard',\n 'br.Server.GameMode.PrintLeaderboard',\n ),\n Reset: c('Server.GameMode.Reset', 'br.Server.GameMode.Reset'),\n },\n Minigames: {\n Delete: c('Server.Minigames.Delete'),\n List: c('Server.Minigames.List'),\n LoadPreset: c('Server.Minigames.LoadPreset'),\n NextRound: cv([\n [0, 'Server.Minigames.NextRound'],\n [14000, 'Server.GameMode.NextRound'],\n [14349, 'br.Server.GameMode.NextRound'],\n ]),\n Reset: cv([\n [0, 'Server.Minigames.Reset'],\n [14000, 'Server.GameMode.Reset'],\n [14349, 'br.Server.GameMode.Reset'],\n ]),\n SavePreset: c('Server.Minigames.SavePreset'),\n },\n PlayerPositions: c('Server.PlayerPositions', 'br.Server.PlayerPositions'),\n Players: {\n Damage: c('Server.Players.Damage', 'br.Server.Players.Damage'),\n GiveItem: c('Server.Players.GiveItem', 'br.Server.Players.GiveItem'),\n Kill: c('Server.Players.Kill', 'br.Server.Players.Kill'),\n PrintAllLeaderboardValues: c(\n 'Server.Players.PrintAllLeaderboardValues',\n 'br.Server.Players.PrintAllLeaderboardValues',\n ),\n PrintLeaderboardValue: c(\n 'Server.Players.PrintLeaderboardValue',\n 'br.Server.Players.PrintLeaderboardValue',\n ),\n RemoveItem: c(\n 'Server.Players.RemoveItem',\n 'br.Server.Players.RemoveItem',\n ),\n SetLeaderboardValue: c(\n 'Server.Players.SetLeaderboardValue',\n 'br.Server.Players.SetLeaderboardValue',\n ),\n SetMinigame: c('Server.Players.SetMinigame'),\n SetTeam: c('Server.Players.SetTeam', 'br.Server.Players.SetTeam'),\n },\n Status: c('Server.Status', 'br.Server.Status'),\n Teams: {\n PrintAllLeaderboardValues: c(\n 'Server.Teams.PrintAllLeaderboardValues',\n 'br.Server.Teams.PrintAllLeaderboardValues',\n ),\n PrintLeaderboardValue: c(\n 'Server.Teams.PrintLeaderboardValue',\n 'br.Server.Teams.PrintLeaderboardValue',\n ),\n },\n },\n Text: {\n FlushRecoveryFrames: c('br.Text.FlushRecoveryFrames'),\n MaxCharsPolledPerFrame: c('br.Text.MaxCharsPolledPerFrame'),\n MaxCharsShapedPerFrame: c('br.Text.MaxCharsShapedPerFrame'),\n },\n Thumbnails: {\n WipeCache: c('BR.Thumbnails.WipeCache'),\n },\n Voice: {\n DebugDecode: c('voice.DebugDecode', 'br.Voice.DebugDecode'),\n SyntheticInput: c('voice.SyntheticInput', 'br.Voice.SyntheticInput'),\n TestJitter: c('voice.TestJitter', 'br.Voice.TestJitter'),\n },\n Weapons: {\n DebugFiringVectors: c(\n 'weapons.DebugFiringVectors',\n 'br.Weapons.DebugFiringVectors',\n ),\n DebugHitValidation: c(\n 'weapons.DebugHitValidation',\n 'br.Weapons.DebugHitValidation',\n ),\n EnableHitValidation: c(\n 'weapons.EnableHitValidation',\n 'br.Weapons.EnableHitValidation',\n ),\n LatencyCompensationDelayMethod: c(\n 'weapons.LatencyCompensationDelayMethod',\n 'br.Weapons.LatencyCompensationDelayMethod',\n ),\n LatencyCompensationLimit: c(\n 'weapons.LatencyCompensationLimit',\n 'br.Weapons.LatencyCompensationLimit',\n ),\n LatencyCompensationOffset: c(\n 'weapons.LatencyCompensationOffset',\n 'br.Weapons.LatencyCompensationOffset',\n ),\n ProjectileClientLatencyCompensationEnabled: c(\n 'weapons.ProjectileClientLatencyCompensationEnabled',\n 'br.Weapons.ProjectileClientLatencyCompensationEnabled',\n ),\n ProjectileLatencyCompensationEnabled: c(\n 'weapons.ProjectileLatencyCompensationEnabled',\n 'br.Weapons.ProjectileLatencyCompensationEnabled',\n ),\n ProjectilePredictionEnabled: c(\n 'weapons.ProjectilePredictionEnabled',\n 'br.Weapons.ProjectilePredictionEnabled',\n ),\n },\n WireFuzzer: {\n ClearBreakpoints: c('BR.WireFuzzer.ClearBreakpoints'),\n ComponentsPerTick: c('BR.WireFuzzer.ComponentsPerTick'),\n DisconnectBeforeConnect: c('BR.WireFuzzer.DisconnectBeforeConnect'),\n GatesPerTick: c('BR.WireFuzzer.GatesPerTick'),\n MaxComponents: c('BR.WireFuzzer.MaxComponents'),\n MaxGates: c('BR.WireFuzzer.MaxGates'),\n MaxWires: c('BR.WireFuzzer.MaxWires'),\n ModificationsPerTick: c('BR.WireFuzzer.ModificationsPerTick'),\n RerouteDuplication: c('BR.WireFuzzer.RerouteDuplication'),\n Start: c('BR.WireFuzzer.Start'),\n StartWithSeed: c('BR.WireFuzzer.StartWithSeed'),\n Stop: c('BR.WireFuzzer.Stop'),\n WiresPerTick: c('BR.WireFuzzer.WiresPerTick'),\n },\n WireGraphViz: c('BR.WireGraphViz'),\n WireRenderer: {\n EnablePorts: c('BR.WireRenderer.EnablePorts'),\n EnableWires: c('BR.WireRenderer.EnableWires'),\n },\n World: {\n CreateEmpty: c('BR.World.CreateEmpty'),\n ListRevisions: c('BR.World.ListRevisions'),\n Load: c('BR.World.Load'),\n LoadAdditive: c('BR.World.LoadAdditive'),\n LoadRevision: c('BR.World.LoadRevision'),\n Save: c('BR.World.Save'),\n SaveAs: c('BR.World.SaveAs'),\n },\n WorldSerializer: {\n LogPrefabLoads: c('BR.WorldSerializer.LogPrefabLoads'),\n RedirectLegacyWheelJoints: c(\n 'BR.WorldSerializer.RedirectLegacyWheelJoints',\n ),\n WipeOwnershipOnLoad: c('BR.WorldSerializer.WipeOwnershipOnLoad'),\n },\n} satisfies CommandTree;\n\ntype CommandTree = { [key: string]: ConsoleCommand | CommandTree };\n\n/** Recursively turn a {@link CommandTree} into resolved command-name strings. */\ntype Resolved<T> = T extends ConsoleCommand\n ? string\n : { [K in keyof T]: Resolved<T[K]> };\n\n/**\n * Version-resolved console command names, nested by namespace.\n * Every leaf is the command string for the running game version.\n */\nexport type ConsoleCommands = Resolved<typeof COMMAND_TABLE>;\n\nconst resolveTree = (tree: CommandTree, version: number): unknown => {\n const out: Record<string, unknown> = {};\n for (const key in tree) {\n const value = tree[key];\n out[key] =\n value instanceof ConsoleCommand\n ? value.resolve(version)\n : resolveTree(value, version);\n }\n return out;\n};\n\n/** Build the resolved {@link ConsoleCommands} map for a game CL version. */\nexport const resolveConsoleCommands = (version: number): ConsoleCommands =>\n resolveTree(COMMAND_TABLE, version) as ConsoleCommands;\n\n// Reverse lookup: every known command name (lowercased, across all versions)\n// -> the command. First write wins so canonical commands keep priority over\n// the deprecated aliases injected later in the table.\nconst COMMAND_LOOKUP = new Map<string, ConsoleCommand>();\nconst indexTree = (tree: CommandTree): void => {\n for (const key in tree) {\n const value = tree[key];\n if (value instanceof ConsoleCommand) {\n for (const name of value.names) {\n const lower = name.toLowerCase();\n if (!COMMAND_LOOKUP.has(lower)) COMMAND_LOOKUP.set(lower, value);\n }\n } else {\n indexTree(value);\n }\n }\n};\nindexTree(COMMAND_TABLE);\n\n/**\n * Rewrite a console command line so a stale command name resolves to the name\n * the running game version expects. The first word (up to the first space) is\n * matched case-insensitively against every known command name; if it maps to a\n * command whose version-correct name differs, that word is swapped. Lines that\n * don't start with a known command are returned unchanged.\n */\nexport const migrateConsoleCommand = (\n line: string,\n version: number,\n): string => {\n const space = line.indexOf(' ');\n const head = space === -1 ? line : line.slice(0, space);\n const command = COMMAND_LOOKUP.get(head.toLowerCase());\n if (!command) return line;\n const resolved = command.resolve(version);\n // already a valid name for this version (console names are case-insensitive)\n if (resolved.toLowerCase() === head.toLowerCase()) return line;\n return space === -1 ? resolved : resolved + line.slice(space);\n};\n"],"names":[],"mappings":";;AAgBA,MAAM,iBAAiB;AAGhB,MAAM,eAAe;AAAA;AAAA,EAE1B,YAA6B,UAAuC;AAAvC,SAAA,WAAA;AAAA,EAAwC;AAAA;AAAA,EAGrE,QAAQ,SAAyB;AAE/B,QAAI,CAAC,WAAW,UAAU;AACxB,aAAO,KAAK,SAAS,KAAK,SAAS,SAAS,CAAC,EAAE,CAAC;AAClD,QAAI,OAAO,KAAK,SAAS,CAAC,EAAE,CAAC;AAC7B,eAAW,CAAC,OAAO,SAAS,KAAK,KAAK;AACpC,UAAI,WAAW,MAAO,QAAO;AAC/B,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,QAA2B;AAC7B,WAAO,KAAK,SAAS,IAAI,CAAC,CAAA,EAAG,IAAI,MAAM,IAAI;AAAA,EAC7C;AACF;AAGA,MAAM,IAAI,CAAC,QAAgB,UAAU,WACnC,IAAI;AAAA,EACF,WAAW,UACP,CAAC,CAAC,GAAG,MAAM,CAAC,IACZ;AAAA,IACE,CAAC,GAAG,MAAM;AAAA,IACV,CAAC,gBAAgB,OAAO;AAAA,EAAA;AAEhC;AAGF,MAAM,KAAK,CAAC,aACV,IAAI,eAAe,QAAQ;AAGtB,MAAM,gBAAgB;AAAA,EAC3B,QAAQ;AAAA,IACN,gBAAgB,EAAE,yBAAyB,0BAA0B;AAAA,IACrE,OAAO,EAAE,gBAAgB,iBAAiB;AAAA,IAC1C,UAAU,EAAE,mBAAmB,oBAAoB;AAAA,IACnD,aAAa,EAAE,sBAAsB,uBAAuB;AAAA,IAC5D,SAAS;AAAA,MACP,2BAA2B;AAAA,QACzB;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,yBAAyB;AAAA,QACvB;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,sBAAsB;AAAA,QACpB;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,kBAAkB;AAAA,QAChB;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,gBAAgB;AAAA,QACd;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,mBAAmB;AAAA,QACjB;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,mBAAmB;AAAA,QACjB;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,mBAAmB;AAAA,QACjB;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,IAEF,aAAa;AAAA,MACX,aAAa;AAAA,QACX;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,cAAc;AAAA,QACZ;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,YAAY;AAAA,QACV;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,cAAc;AAAA,QACZ;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,wBAAwB;AAAA,QACtB;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,wBAAwB;AAAA,QACtB;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,gBAAgB;AAAA,QACd;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,yBAAyB;AAAA,QACvB;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,qBAAqB;AAAA,QACnB;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,kBAAkB;AAAA,QAChB;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,iCAAiC;AAAA,QAC/B;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,IAEF,0BAA0B;AAAA,MACxB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,+BAA+B;AAAA,MAC7B;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,iBAAiB,EAAE,0BAA0B,2BAA2B;AAAA,IACxE,gBAAgB,EAAE,yBAAyB,0BAA0B;AAAA,IACrE,mBAAmB;AAAA,MACjB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,mBAAmB;AAAA,MACjB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,gBAAgB,EAAE,yBAAyB,0BAA0B;AAAA,IACrE,oBAAoB;AAAA,MAClB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,kBAAkB;AAAA,MAChB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,aAAa,EAAE,sBAAsB,uBAAuB;AAAA,IAC5D,eAAe,EAAE,yBAAyB;AAAA,IAC1C,oBAAoB;AAAA,MAClB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,gBAAgB,EAAE,yBAAyB,0BAA0B;AAAA,IACrE,MAAM,EAAE,eAAe,gBAAgB;AAAA,IACvC,cAAc,EAAE,qBAAqB;AAAA,IACrC,oBAAoB;AAAA,MAClB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,qBAAqB;AAAA,MACnB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,gBAAgB,EAAE,yBAAyB,0BAA0B;AAAA,IACrE,+BAA+B;AAAA,MAC7B;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,iBAAiB,EAAE,0BAA0B,2BAA2B;AAAA,IACxE,wBAAwB;AAAA,MACtB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,2BAA2B;AAAA,MACzB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,iCAAiC;AAAA,MAC/B;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,eAAe,EAAE,0BAA0B,yBAAyB;AAAA,IACpE,qBAAqB;AAAA,MACnB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,sBAAsB;AAAA,MACpB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,iBAAiB,EAAE,0BAA0B,2BAA2B;AAAA,IACxE,eAAe,EAAE,wBAAwB,yBAAyB;AAAA,IAClE,MAAM,EAAE,eAAe,gBAAgB;AAAA,IACvC,0BAA0B;AAAA,MACxB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,wBAAwB;AAAA,MACtB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,oCAAoC;AAAA,MAClC;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,gCAAgC;AAAA,MAC9B;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,4BAA4B;AAAA,MAC1B;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,wBAAwB;AAAA,MACtB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,uBAAuB;AAAA,MACrB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,YAAY,EAAE,qBAAqB,sBAAsB;AAAA,IACzD,oBAAoB;AAAA,MAClB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,SAAS;AAAA,MACP,eAAe;AAAA,QACb;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,eAAe;AAAA,QACb;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,WAAW,EAAE,4BAA4B,6BAA6B;AAAA,IAAA;AAAA,IAExE,aAAa;AAAA,MACX,yBAAyB;AAAA,QACvB;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,IAEF,kBAAkB;AAAA,MAChB;AAAA,MACA;AAAA,IAAA;AAAA,EACF;AAAA,EAEF,wBAAwB,EAAE,2BAA2B;AAAA,EACrD,SAAS;AAAA,IACP,gBAAgB,EAAE,0BAA0B,2BAA2B;AAAA,EAAA;AAAA,EAEzE,SAAS;AAAA,IACP,YAAY,EAAE,sBAAsB,uBAAuB;AAAA,IAC3D,iBAAiB,EAAE,2BAA2B,4BAA4B;AAAA,EAAA;AAAA,EAE5E,MAAM;AAAA,IACJ,WAAW,EAAE,kBAAkB,mBAAmB;AAAA,IAClD,SAAS,EAAE,gBAAgB,iBAAiB;AAAA,IAC5C,2BAA2B;AAAA,MACzB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,eAAe,EAAE,sBAAsB,uBAAuB;AAAA,IAC9D,SAAS,EAAE,gBAAgB,iBAAiB;AAAA,EAAA;AAAA,EAE9C,mBAAmB;AAAA,IACjB,YAAY;AAAA,MACV;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,mBAAmB;AAAA,MACjB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,qBAAqB;AAAA,MACnB;AAAA,MACA;AAAA,IAAA;AAAA,EACF;AAAA,EAEF,OAAO;AAAA,IACL,aAAa,EAAE,eAAe,sBAAsB;AAAA,IACpD,WAAW,EAAE,aAAa,oBAAoB;AAAA,IAC9C,mBAAmB,EAAE,4BAA4B;AAAA,IACjD,OAAO,EAAE,SAAS,gBAAgB;AAAA,IAClC,kBAAkB,EAAE,2BAA2B;AAAA,IAC/C,cAAc,EAAE,gBAAgB,uBAAuB;AAAA,IACvD,YAAY,EAAE,cAAc,qBAAqB;AAAA,EAAA;AAAA,EAEnD,WAAW;AAAA,IACT,eAAe;AAAA,MACb,GAAG,EAAE,6BAA6B,4BAA4B;AAAA,MAC9D,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,cAAc;AAAA,QACZ;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,IAEF,uBAAuB;AAAA,MACrB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,iBAAiB;AAAA,MACf;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,eAAe,EAAE,6BAA6B,4BAA4B;AAAA,IAC1E,WAAW;AAAA,MACT,GAAG,EAAE,yBAAyB,wBAAwB;AAAA,MACtD,SAAS;AAAA,QACP;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,gBAAgB;AAAA,QACd;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,IAEF,aAAa,EAAE,2BAA2B,0BAA0B;AAAA,IACpE,UAAU;AAAA,MACR,GAAG,EAAE,wBAAwB,uBAAuB;AAAA,MACpD,OAAO,EAAE,8BAA8B,6BAA6B;AAAA,MACpE,MAAM,EAAE,6BAA6B,4BAA4B;AAAA,IAAA;AAAA,IAEnE,QAAQ;AAAA,MACN,GAAG,EAAE,sBAAsB,qBAAqB;AAAA,MAChD,cAAc;AAAA,QACZ;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,IAEF,OAAO,EAAE,qBAAqB,oBAAoB;AAAA,EAAA;AAAA,EAEpD,aAAa,EAAE,gBAAgB;AAAA,EAC/B,KAAK;AAAA,IACH,cAAc,EAAE,qBAAqB;AAAA,IACrC,SAAS,EAAE,gBAAgB;AAAA,IAC3B,eAAe,EAAE,sBAAsB;AAAA,EAAA;AAAA,EAEzC,gBAAgB;AAAA,IACd,WAAW,EAAE,6BAA6B;AAAA,IAC1C,wBAAwB,EAAE,0CAA0C;AAAA,EAAA;AAAA,EAEtE,WAAW;AAAA,IACT,eAAe,EAAE,2BAA2B,4BAA4B;AAAA,IACxE,cAAc,EAAE,0BAA0B,2BAA2B;AAAA,EAAA;AAAA,EAEvE,WAAW,EAAE,cAAc;AAAA,EAC3B,MAAM;AAAA,IACJ,6BAA6B,EAAE,qCAAqC;AAAA,EAAA;AAAA,EAEtE,cAAc;AAAA,IACZ,YAAY,EAAE,6BAA6B,4BAA4B;AAAA,IACvE,oBAAoB;AAAA,MAClB;AAAA,MACA;AAAA,IAAA;AAAA,EACF;AAAA,EAEF,KAAK;AAAA,IACH,SAAS,EAAE,eAAe,gBAAgB;AAAA,IAC1C,eAAe,EAAE,qBAAqB,sBAAsB;AAAA,EAAA;AAAA,EAE9D,SAAS;AAAA,IACP,SAAS;AAAA,MACP,kBAAkB;AAAA,QAChB;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,UAAU,EAAE,4BAA4B,6BAA6B;AAAA,MACrE,mBAAmB;AAAA,QACjB;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,eAAe;AAAA,QACb;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,oBAAoB;AAAA,QAClB;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,kBAAkB;AAAA,QAChB;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,eAAe;AAAA,QACb;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,iBAAiB;AAAA,QACf;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,cAAc;AAAA,QACZ;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,EACF;AAAA,EAEF,oBAAoB,EAAE,uBAAuB;AAAA,EAC7C,aAAa;AAAA,IACX,WAAW,EAAE,yBAAyB,0BAA0B;AAAA,IAChE,YAAY,EAAE,0BAA0B,2BAA2B;AAAA,IACnE,MAAM,EAAE,oBAAoB,qBAAqB;AAAA,EAAA;AAAA,EAEnD,SAAS;AAAA,IACP,yBAAyB,EAAE,oCAAoC;AAAA,EAAA;AAAA,EAEjE,QAAQ;AAAA,IACN,aAAa,EAAE,uBAAuB;AAAA,EAAA;AAAA,EAExC,aAAa;AAAA,IACX,eAAe,EAAE,8BAA8B;AAAA,EAAA;AAAA,EAEjD,SAAS;AAAA,IACP,UAAU,EAAE,qBAAqB;AAAA,EAAA;AAAA,EAEnC,sBAAsB,EAAE,yBAAyB;AAAA,EACjD,QAAQ;AAAA,IACN,aAAa;AAAA,MACX,YAAY;AAAA,QACV;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,OAAO,EAAE,4BAA4B,6BAA6B;AAAA,MAClE,YAAY;AAAA,QACV;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,IAEF,UAAU;AAAA,MACR,UAAU,EAAE,4BAA4B,6BAA6B;AAAA,MACrE,WAAW,EAAE,6BAA6B,8BAA8B;AAAA,MACxE,kBAAkB;AAAA,QAChB;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,OAAO,EAAE,yBAAyB,0BAA0B;AAAA,IAAA;AAAA,IAE9D,WAAW;AAAA,MACT,QAAQ,EAAE,yBAAyB;AAAA,MACnC,MAAM,EAAE,uBAAuB;AAAA,MAC/B,YAAY,EAAE,6BAA6B;AAAA,MAC3C,WAAW,GAAG;AAAA,QACZ,CAAC,GAAG,4BAA4B;AAAA,QAChC,CAAC,MAAO,2BAA2B;AAAA,QACnC,CAAC,OAAO,8BAA8B;AAAA,MAAA,CACvC;AAAA,MACD,OAAO,GAAG;AAAA,QACR,CAAC,GAAG,wBAAwB;AAAA,QAC5B,CAAC,MAAO,uBAAuB;AAAA,QAC/B,CAAC,OAAO,0BAA0B;AAAA,MAAA,CACnC;AAAA,MACD,YAAY,EAAE,6BAA6B;AAAA,IAAA;AAAA,IAE7C,iBAAiB,EAAE,0BAA0B,2BAA2B;AAAA,IACxE,SAAS;AAAA,MACP,QAAQ,EAAE,yBAAyB,0BAA0B;AAAA,MAC7D,UAAU,EAAE,2BAA2B,4BAA4B;AAAA,MACnE,MAAM,EAAE,uBAAuB,wBAAwB;AAAA,MACvD,2BAA2B;AAAA,QACzB;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,uBAAuB;AAAA,QACrB;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,YAAY;AAAA,QACV;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,qBAAqB;AAAA,QACnB;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,aAAa,EAAE,4BAA4B;AAAA,MAC3C,SAAS,EAAE,0BAA0B,2BAA2B;AAAA,IAAA;AAAA,IAElE,QAAQ,EAAE,iBAAiB,kBAAkB;AAAA,IAC7C,OAAO;AAAA,MACL,2BAA2B;AAAA,QACzB;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,uBAAuB;AAAA,QACrB;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,EACF;AAAA,EAEF,MAAM;AAAA,IACJ,qBAAqB,EAAE,6BAA6B;AAAA,IACpD,wBAAwB,EAAE,gCAAgC;AAAA,IAC1D,wBAAwB,EAAE,gCAAgC;AAAA,EAAA;AAAA,EAE5D,YAAY;AAAA,IACV,WAAW,EAAE,yBAAyB;AAAA,EAAA;AAAA,EAExC,OAAO;AAAA,IACL,aAAa,EAAE,qBAAqB,sBAAsB;AAAA,IAC1D,gBAAgB,EAAE,wBAAwB,yBAAyB;AAAA,IACnE,YAAY,EAAE,oBAAoB,qBAAqB;AAAA,EAAA;AAAA,EAEzD,SAAS;AAAA,IACP,oBAAoB;AAAA,MAClB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,oBAAoB;AAAA,MAClB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,qBAAqB;AAAA,MACnB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,gCAAgC;AAAA,MAC9B;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,0BAA0B;AAAA,MACxB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,2BAA2B;AAAA,MACzB;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,4CAA4C;AAAA,MAC1C;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,sCAAsC;AAAA,MACpC;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,6BAA6B;AAAA,MAC3B;AAAA,MACA;AAAA,IAAA;AAAA,EACF;AAAA,EAEF,YAAY;AAAA,IACV,kBAAkB,EAAE,gCAAgC;AAAA,IACpD,mBAAmB,EAAE,iCAAiC;AAAA,IACtD,yBAAyB,EAAE,uCAAuC;AAAA,IAClE,cAAc,EAAE,4BAA4B;AAAA,IAC5C,eAAe,EAAE,6BAA6B;AAAA,IAC9C,UAAU,EAAE,wBAAwB;AAAA,IACpC,UAAU,EAAE,wBAAwB;AAAA,IACpC,sBAAsB,EAAE,oCAAoC;AAAA,IAC5D,oBAAoB,EAAE,kCAAkC;AAAA,IACxD,OAAO,EAAE,qBAAqB;AAAA,IAC9B,eAAe,EAAE,6BAA6B;AAAA,IAC9C,MAAM,EAAE,oBAAoB;AAAA,IAC5B,cAAc,EAAE,4BAA4B;AAAA,EAAA;AAAA,EAE9C,cAAc,EAAE,iBAAiB;AAAA,EACjC,cAAc;AAAA,IACZ,aAAa,EAAE,6BAA6B;AAAA,IAC5C,aAAa,EAAE,6BAA6B;AAAA,EAAA;AAAA,EAE9C,OAAO;AAAA,IACL,aAAa,EAAE,sBAAsB;AAAA,IACrC,eAAe,EAAE,wBAAwB;AAAA,IACzC,MAAM,EAAE,eAAe;AAAA,IACvB,cAAc,EAAE,uBAAuB;AAAA,IACvC,cAAc,EAAE,uBAAuB;AAAA,IACvC,MAAM,EAAE,eAAe;AAAA,IACvB,QAAQ,EAAE,iBAAiB;AAAA,EAAA;AAAA,EAE7B,iBAAiB;AAAA,IACf,gBAAgB,EAAE,mCAAmC;AAAA,IACrD,2BAA2B;AAAA,MACzB;AAAA,IAAA;AAAA,IAEF,qBAAqB,EAAE,wCAAwC;AAAA,EAAA;AAEnE;AAeA,MAAM,cAAc,CAAC,MAAmB,YAA6B;AACnE,QAAM,MAA+B,CAAA;AACrC,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,KAAK,GAAG;AACtB,QAAI,GAAG,IACL,iBAAiB,iBACb,MAAM,QAAQ,OAAO,IACrB,YAAY,OAAO,OAAO;AAAA,EAClC;AACA,SAAO;AACT;AAGO,MAAM,yBAAyB,CAAC,YACrC,YAAY,eAAe,OAAO;AAKpC,MAAM,qCAAqB,IAAA;AAC3B,MAAM,YAAY,CAAC,SAA4B;AAC7C,aAAW,OAAO,MAAM;AACtB,UAAM,QAAQ,KAAK,GAAG;AACtB,QAAI,iBAAiB,gBAAgB;AACnC,iBAAW,QAAQ,MAAM,OAAO;AAC9B,cAAM,QAAQ,KAAK,YAAA;AACnB,YAAI,CAAC,eAAe,IAAI,KAAK,EAAG,gBAAe,IAAI,OAAO,KAAK;AAAA,MACjE;AAAA,IACF,OAAO;AACL,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF;AACF;AACA,UAAU,aAAa;AAShB,MAAM,wBAAwB,CACnC,MACA,YACW;AACX,QAAM,QAAQ,KAAK,QAAQ,GAAG;AAC9B,QAAM,OAAO,UAAU,KAAK,OAAO,KAAK,MAAM,GAAG,KAAK;AACtD,QAAM,UAAU,eAAe,IAAI,KAAK,aAAa;AACrD,MAAI,CAAC,QAAS,QAAO;AACrB,QAAM,WAAW,QAAQ,QAAQ,OAAO;AAExC,MAAI,SAAS,YAAA,MAAkB,KAAK,YAAA,EAAe,QAAO;AAC1D,SAAO,UAAU,KAAK,WAAW,WAAW,KAAK,MAAM,KAAK;AAC9D;;;;;"}
|
|
1
|
+
{"version":3,"file":"commands.js","sources":["../../src/omegga/commands.ts"],"sourcesContent":["import Logger from '@/logger';\n\n// AUTO-GENERATED command name table. Maps each Brickadia console command to\n// its name across game versions so plugins/omegga can address commands without\n// hardcoding a name that changes between releases.\n//\n// At CL 14349 nearly every console command gained the `br.` prefix (and a\n// handful were restructured). Before that, the legacy names were used.\n// Minigames were deprecated at CL 14000 and replaced by GameMode commands;\n// the legacy Minigames commands still resolve but are no-ops on newer servers.\n// At CL 14626 the .brs bricks commands (Bricks.Save/Load/Clear*, World.LoadAdditive)\n// were removed in favor of the prefab/world commands; invoking a removed command\n// logs a warning ({@link migrateConsoleCommand}).\n//\n// Resolve the version-correct name with `omegga.Console`, e.g.\n// `omegga.Console.Bricks.Clear` -> \"Bricks.Clear\" or \"br.Bricks.Clear\".\n//\n// Where a command is both a value and a namespace (e.g. `br.DrawDebug.Colliders`\n// and `br.DrawDebug.Colliders.DrawCOM`), the command itself lives under `$`.\n\n/** CL version at which console commands gained the `br.` prefix. */\nconst RENAME_VERSION = 14349;\n\n/**\n * CL version at which `Bricks.LoadTemplate` was removed (~EA2). Earliest EA2\n * build observed is CL12960; the command was gone by then.\n */\nexport const EA2_VERSION = 12960;\n\n/**\n * CL version (~EA3) at which the legacy .brs bricks console commands were\n * removed in favor of prefab (`br.Prefab.*`) and world (`br.World.Clear*`)\n * commands.\n */\nexport const PREFAB_VERSION = 14626;\n\n/** A console command whose name may differ across game versions. */\nexport class ConsoleCommand {\n /** CL version at which the game removed this command, if it was ever removed. */\n removedAt?: number;\n\n /** @param versions [sinceVersion, name] pairs in ascending version order */\n constructor(private readonly versions: readonly [number, string][]) {}\n\n /** Resolve the command name for a given game CL version. */\n resolve(version: number): string {\n // unknown version (server not started / not detected yet) -> newest name\n if (!version || version < 0)\n return this.versions[this.versions.length - 1][1];\n let name = this.versions[0][1];\n for (const [since, candidate] of this.versions)\n if (version >= since) name = candidate;\n return name;\n }\n\n /** Mark this command as removed from the game at `version` (fluent). */\n removedIn(version: number): this {\n this.removedAt = version;\n return this;\n }\n\n /**\n * Whether this command no longer exists at the given game version. An unknown\n * version (server not started / not detected yet, `<= 0`) is treated as still\n * present so we never warn on commands sent before the version is known.\n */\n isRemovedAt(version: number): boolean {\n return this.removedAt != null && version > 0 && version >= this.removedAt;\n }\n\n /** every name this command has gone by, across versions */\n get names(): readonly string[] {\n return this.versions.map(([, name]) => name);\n }\n}\n\n/** Command renamed with the `br.` prefix at {@link RENAME_VERSION}. */\nconst c = (legacy: string, current = legacy): ConsoleCommand =>\n new ConsoleCommand(\n legacy === current\n ? [[0, legacy]]\n : [\n [0, legacy],\n [RENAME_VERSION, current],\n ],\n );\n\n/** Command with explicit per-version names (ascending by version). */\nconst cv = (versions: [number, string][]): ConsoleCommand =>\n new ConsoleCommand(versions);\n\n/** The raw command table (leaves are version-aware {@link ConsoleCommand}s). */\nexport const COMMAND_TABLE = {\n Bricks: {\n ActuallyReduce: c('Bricks.ActuallyReduce', 'br.Bricks.ActuallyReduce'),\n Clear: c('Bricks.Clear', 'br.Bricks.Clear'),\n // removed at PREFAB_VERSION -> replaced by World.ClearAll / World.ClearRegion\n ClearAll: c('Bricks.ClearAll', 'br.Bricks.ClearAll').removedIn(\n PREFAB_VERSION,\n ),\n ClearRegion: c('Bricks.ClearRegion', 'br.Bricks.ClearRegion').removedIn(\n PREFAB_VERSION,\n ),\n Cluster: {\n EnableMergingDynamicGrids: c(\n 'Bricks.Cluster.EnableMergingDynamicGrids',\n 'br.Bricks.Cluster.EnableMergingDynamicGrids',\n ),\n EnableMergingGlobalGrid: c(\n 'Bricks.Cluster.EnableMergingGlobalGrid',\n 'br.Bricks.Cluster.EnableMergingGlobalGrid',\n ),\n MaxClusterHalfExtent: c(\n 'Bricks.Cluster.MaxClusterHalfExtent',\n 'br.Bricks.Cluster.MaxClusterHalfExtent',\n ),\n MaxClusterWeight: c(\n 'Bricks.Cluster.MaxClusterWeight',\n 'br.Bricks.Cluster.MaxClusterWeight',\n ),\n MaxSplitWeight: c(\n 'Bricks.Cluster.MaxSplitWeight',\n 'br.Bricks.Cluster.MaxSplitWeight',\n ),\n MinCollapseWeight: c(\n 'Bricks.Cluster.MinCollapseWeight',\n 'br.Bricks.Cluster.MinCollapseWeight',\n ),\n MinMergeThreshold: c(\n 'Bricks.Cluster.MinMergeThreshold',\n 'br.Bricks.Cluster.MinMergeThreshold',\n ),\n MinRootHalfExtent: c(\n 'Bricks.Cluster.MinRootHalfExtent',\n 'br.Bricks.Cluster.MinRootHalfExtent',\n ),\n },\n ClusterMesh: {\n CardCaching: c(\n 'Bricks.ClusterMesh.CardCaching',\n 'br.Bricks.ClusterMesh.CardCaching',\n ),\n DrawDistance: c(\n 'Bricks.ClusterMesh.DrawDistance',\n 'br.Bricks.ClusterMesh.DrawDistance',\n ),\n Hysteresis: c(\n 'Bricks.ClusterMesh.Hysteresis',\n 'br.Bricks.ClusterMesh.Hysteresis',\n ),\n Lod0KeepBias: c(\n 'Bricks.ClusterMesh.Lod0KeepBias',\n 'br.Bricks.ClusterMesh.Lod0KeepBias',\n ),\n MaxTransitionsPerFrame: c(\n 'Bricks.ClusterMesh.MaxTransitionsPerFrame',\n 'br.Bricks.ClusterMesh.MaxTransitionsPerFrame',\n ),\n MemoryBudgetBucketSize: c(\n 'Bricks.ClusterMesh.MemoryBudgetBucketSize',\n 'br.Bricks.ClusterMesh.MemoryBudgetBucketSize',\n ),\n MemoryBudgetMB: c(\n 'Bricks.ClusterMesh.MemoryBudgetMB',\n 'br.Bricks.ClusterMesh.MemoryBudgetMB',\n ),\n Residency: c(\n 'Bricks.ClusterMesh.Residency',\n 'br.Bricks.ClusterMesh.Residency',\n ),\n ResidencyConeHysteresis: c(\n 'Bricks.ClusterMesh.ResidencyConeHysteresis',\n 'br.Bricks.ClusterMesh.ResidencyConeHysteresis',\n ),\n ResidencyConeMargin: c(\n 'Bricks.ClusterMesh.ResidencyConeMargin',\n 'br.Bricks.ClusterMesh.ResidencyConeMargin',\n ),\n ResidencyWideFOV: c(\n 'Bricks.ClusterMesh.ResidencyWideFOV',\n 'br.Bricks.ClusterMesh.ResidencyWideFOV',\n ),\n ResidencyZoomHysteresisKillRate: c(\n 'Bricks.ClusterMesh.ResidencyZoomHysteresisKillRate',\n 'br.Bricks.ClusterMesh.ResidencyZoomHysteresisKillRate',\n ),\n },\n DebugSaveFileScreenshots: c(\n 'Bricks.DebugSaveFileScreenshots',\n 'br.Bricks.DebugSaveFileScreenshots',\n ),\n DisableLoadWiresForLegacySave: c(\n 'Bricks.DisableLoadWiresForLegacySave',\n 'br.Bricks.DisableLoadWiresForLegacySave',\n ),\n DrawDebugOctree: c('Bricks.DrawDebugOctree', 'br.Bricks.DrawDebugOctree'),\n DumpChunkStats: c('Bricks.DumpChunkStats', 'br.Bricks.DumpChunkStats'),\n DumpCoverageStats: c(\n 'Bricks.DumpCoverageStats',\n 'br.Bricks.DumpCoverageStats',\n ),\n DumpGeometryStats: c(\n 'Bricks.DumpGeometryStats',\n 'br.Bricks.DumpGeometryStats',\n ),\n DumpGroupStats: c('Bricks.DumpGroupStats', 'br.Bricks.DumpGroupStats'),\n EnableExtendedSort: c(\n 'Bricks.EnableExtendedSort',\n 'br.Bricks.EnableExtendedSort',\n ),\n EnableLumenCards: c(\n 'Bricks.EnableLumenCards',\n 'br.Bricks.EnableLumenCards',\n ),\n ExportModel: c('Bricks.ExportModel', 'br.Bricks.ExportModel'),\n GenerateGates: c('BR.Bricks.GenerateGates'),\n GenerateMathTables: c(\n 'Bricks.GenerateMathTables',\n 'br.Bricks.GenerateMathTables',\n ),\n GetOctreeStats: c('Bricks.GetOctreeStats', 'br.Bricks.GetOctreeStats'),\n // removed at PREFAB_VERSION -> replaced by Prefab.Load\n Load: c('Bricks.Load', 'br.Bricks.Load').removedIn(PREFAB_VERSION),\n // removed ~EA2 -> replaced by Prefab.GiveToPlayer (loadPrefabOnPlayer)\n LoadTemplate: c('Bricks.LoadTemplate').removedIn(EA2_VERSION),\n LODScreenSizeScale: c(\n 'Bricks.LODScreenSizeScale',\n 'br.Bricks.LODScreenSizeScale',\n ),\n LogClusterBuildTime: c(\n 'Bricks.LogClusterBuildTime',\n 'br.Bricks.LogClusterBuildTime',\n ),\n LogStreamSizes: c('Bricks.LogStreamSizes', 'br.Bricks.LogStreamSizes'),\n MaxChunkClusterEntriesPerTick: c(\n 'Bricks.MaxChunkClusterEntriesPerTick',\n 'br.Bricks.MaxChunkClusterEntriesPerTick',\n ),\n MaxChunkEntries: c('Bricks.MaxChunkEntries', 'br.Bricks.MaxChunkEntries'),\n MaxChunkUpdatesPerTick: c(\n 'Bricks.MaxChunkUpdatesPerTick',\n 'br.Bricks.MaxChunkUpdatesPerTick',\n ),\n MaxChunkUpdateTimePerTick: c(\n 'Bricks.MaxChunkUpdateTimePerTick',\n 'br.Bricks.MaxChunkUpdateTimePerTick',\n ),\n MaxClusterResultsToApplyPerTick: c(\n 'Bricks.MaxClusterResultsToApplyPerTick',\n 'br.Bricks.MaxClusterResultsToApplyPerTick',\n ),\n MaxSubscribed: c('br.MaxSubscribedBricks', 'br.Bricks.MaxSubscribed'),\n OptimizeVertexCache: c(\n 'Bricks.OptimizeVertexCache',\n 'br.Bricks.OptimizeVertexCache',\n ),\n PrintOctreeLeafStats: c(\n 'Bricks.PrintOctreeLeafStats',\n 'br.Bricks.PrintOctreeLeafStats',\n ),\n RebuildClusters: c('Bricks.RebuildClusters', 'br.Bricks.RebuildClusters'),\n RebuildMeshes: c('Bricks.RebuildMeshes', 'br.Bricks.RebuildMeshes'),\n // removed at PREFAB_VERSION -> replaced by Prefab.SaveRegion\n Save: c('Bricks.Save', 'br.Bricks.Save').removedIn(PREFAB_VERSION),\n SaveFileCompressionLevel: c(\n 'Bricks.SaveFileCompressionLevel',\n 'br.Bricks.SaveFileCompressionLevel',\n ),\n SaveFileReadBrickLimit: c(\n 'Bricks.SaveFileReadBrickLimit',\n 'br.Bricks.SaveFileReadBrickLimit',\n ),\n SaveFileReadComponentInstanceLimit: c(\n 'Bricks.SaveFileReadComponentInstanceLimit',\n 'br.Bricks.SaveFileReadComponentInstanceLimit',\n ),\n SaveFileReadComponentTypeLimit: c(\n 'Bricks.SaveFileReadComponentTypeLimit',\n 'br.Bricks.SaveFileReadComponentTypeLimit',\n ),\n SaveFileReadDimensionLimit: c(\n 'Bricks.SaveFileReadDimensionLimit',\n 'br.Bricks.SaveFileReadDimensionLimit',\n ),\n SaveFileReadOwnerLimit: c(\n 'Bricks.SaveFileReadOwnerLimit',\n 'br.Bricks.SaveFileReadOwnerLimit',\n ),\n SaveFileReadSizeLimit: c(\n 'Bricks.SaveFileReadSizeLimit',\n 'br.Bricks.SaveFileReadSizeLimit',\n ),\n // removed at PREFAB_VERSION -> replaced by Prefab.SaveRegion\n SaveRegion: c('Bricks.SaveRegion', 'br.Bricks.SaveRegion').removedIn(\n PREFAB_VERSION,\n ),\n ValidateMathTables: c(\n 'Bricks.ValidateMathTables',\n 'br.Bricks.ValidateMathTables',\n ),\n Vehicle: {\n AntiRollScale: c(\n 'Bricks.Vehicle.AntiRollScale',\n 'br.Bricks.Vehicle.AntiRollScale',\n ),\n ClientFullSim: c(\n 'Bricks.Vehicle.ClientFullSim',\n 'br.Bricks.Vehicle.ClientFullSim',\n ),\n DebugDraw: c('Bricks.Vehicle.DebugDraw', 'br.Bricks.Vehicle.DebugDraw'),\n },\n WheelEngine: {\n VisualiseTurningCircles: c(\n 'Bricks.WheelEngine.VisualiseTurningCircles',\n 'br.Bricks.WheelEngine.VisualiseTurningCircles',\n ),\n },\n WipeMirrorTables: c(\n 'Bricks.WipeMirrorTables',\n 'br.Bricks.WipeMirrorTables',\n ),\n },\n BundleCompressionLevel: c('BR.BundleCompressionLevel'),\n Bundles: {\n AutoCloseDelay: c('Bundles.AutoCloseDelay', 'br.Bundles.AutoCloseDelay'),\n },\n Catalog: {\n ClearCache: c('Catalog.ClearCache', 'br.Catalog.ClearCache'),\n HideBlacklisted: c('Catalog.HideBlacklisted', 'br.Catalog.HideBlacklisted'),\n },\n Chat: {\n Broadcast: c('Chat.Broadcast', 'br.Chat.Broadcast'),\n Command: c('Chat.Command', 'br.Chat.Command'),\n MessageForUnknownCommands: c(\n 'Chat.MessageForUnknownCommands',\n 'br.Chat.MessageForUnknownCommands',\n ),\n StatusMessage: c('Chat.StatusMessage', 'br.Chat.StatusMessage'),\n Whisper: c('Chat.Whisper', 'br.Chat.Whisper'),\n },\n ComplexityWarning: {\n BrickCount: c(\n 'br.BrickCountWarningThreshold',\n 'br.ComplexityWarning.BrickCount',\n ),\n FrozenEntityCount: c(\n 'br.FrozenEntityCountWarningThreshold',\n 'br.ComplexityWarning.FrozenEntityCount',\n ),\n UnfrozenEntityCount: c(\n 'br.UnfrozenEntityCountWarningThreshold',\n 'br.ComplexityWarning.UnfrozenEntityCount',\n ),\n },\n Debug: {\n CauseEnsure: c('CauseEnsure', 'br.Debug.CauseEnsure'),\n CauseHang: c('CauseHang', 'br.Debug.CauseHang'),\n ChangeBundleOwner: c('BR.Debug.ChangeBundleOwner'),\n Crash: c('Crash', 'br.Debug.Crash'),\n ListBundleOwners: c('BR.Debug.ListBundleOwners'),\n TestMarkdown: c('TestMarkdown', 'br.Debug.TestMarkdown'),\n TestMarkup: c('TestMarkup', 'br.Debug.TestMarkup'),\n },\n DrawDebug: {\n BrickClusters: {\n $: c('BR.DrawDebugBrickClusters', 'br.DrawDebug.BrickClusters'),\n Neighbors: c(\n 'BR.DrawDebugBrickClusters.Neighbors',\n 'br.DrawDebug.BrickClusters.Neighbors',\n ),\n OctreeBounds: c(\n 'BR.DrawDebugBrickClusters.OctreeBounds',\n 'br.DrawDebug.BrickClusters.OctreeBounds',\n ),\n },\n BrickClusterSplitTree: c(\n 'BR.DrawDebugBrickClusterSplitTree',\n 'br.DrawDebug.BrickClusterSplitTree',\n ),\n BrickLumenCards: c(\n 'BR.DrawDebugBrickLumenCards',\n 'br.DrawDebug.BrickLumenCards',\n ),\n ClientUpdates: c('BR.DrawDebugClientUpdates', 'br.DrawDebug.ClientUpdates'),\n Colliders: {\n $: c('BR.DrawDebugColliders', 'br.DrawDebug.Colliders'),\n DrawCOM: c(\n 'BR.DrawDebugColliders.DrawCOM',\n 'br.DrawDebug.Colliders.DrawCOM',\n ),\n DrawCustomMass: c(\n 'BR.DrawDebugColliders.DrawCustomMass',\n 'br.DrawDebug.Colliders.DrawCustomMass',\n ),\n },\n Constraints: c('BR.DrawDebugConstraints', 'br.DrawDebug.Constraints'),\n Entities: {\n $: c('BR.DrawDebugEntities', 'br.DrawDebug.Entities'),\n Boxes: c('BR.DrawDebugEntities.Boxes', 'br.DrawDebug.Entities.Boxes'),\n Dots: c('BR.DrawDebugEntities.Dots', 'br.DrawDebug.Entities.Dots'),\n },\n Lights: {\n $: c('BR.DrawDebugLights', 'br.DrawDebug.Lights'),\n RedThreshold: c(\n 'BR.DrawDebugLights.RedThreshold',\n 'br.DrawDebug.Lights.RedThreshold',\n ),\n },\n Texts: c('BR.DrawDebugTexts', 'br.DrawDebug.Texts'),\n },\n EnableImgui: c('br.EnableImgui'),\n EOS: {\n AttemptLogin: c('BR.EOS.AttemptLogin'),\n Disable: c('BR.EOS.Disable'),\n SetSocketName: c('BR.EOS.SetSocketName'),\n },\n GPUMappedArray: {\n MinBlocks: c('BR.GPUMappedArray.MinBlocks'),\n ReservedHeadroomBlocks: c('BR.GPUMappedArray.ReservedHeadroomBlocks'),\n },\n Inspector: {\n ShowFloatTest: c('Inspector.ShowFloatTest', 'br.Inspector.ShowFloatTest'),\n ShowGraphics: c('Inspector.ShowGraphics', 'br.Inspector.ShowGraphics'),\n },\n Interview: c('BR.Interview'),\n Iris: {\n EnableMapDeltaSerialization: c('BR.Iris.EnableMapDeltaSerialization'),\n },\n LagIndicator: {\n MinLatency: c('br.LagIndicatorMinLatency', 'br.LagIndicator.MinLatency'),\n MinTimeSincePacket: c(\n 'br.LagIndicatorMinTimeSincePacket',\n 'br.LagIndicator.MinTimeSincePacket',\n ),\n },\n Lua: {\n Execute: c('Lua.Execute', 'br.Lua.Execute'),\n ExecuteScript: c('Lua.ExecuteScript', 'br.Lua.ExecuteScript'),\n },\n Msgpack: {\n Default: {\n MaxContainerSize: c(\n 'msgpack.Default.MaxContainerSize',\n 'br.Msgpack.Default.MaxContainerSize',\n ),\n MaxDepth: c('msgpack.Default.MaxDepth', 'br.Msgpack.Default.MaxDepth'),\n MaxEnumValueCount: c(\n 'msgpack.Default.MaxEnumValueCount',\n 'br.Msgpack.Default.MaxEnumValueCount',\n ),\n MaxFieldCount: c(\n 'msgpack.Default.MaxFieldCount',\n 'br.Msgpack.Default.MaxFieldCount',\n ),\n MaxFieldNameLength: c(\n 'msgpack.Default.MaxFieldNameLength',\n 'br.Msgpack.Default.MaxFieldNameLength',\n ),\n MaxFlatArraySize: c(\n 'msgpack.Default.MaxFlatArraySize',\n 'br.Msgpack.Default.MaxFlatArraySize',\n ),\n MaxNameLength: c(\n 'msgpack.Default.MaxNameLength',\n 'br.Msgpack.Default.MaxNameLength',\n ),\n MaxStringLength: c(\n 'msgpack.Default.MaxStringLength',\n 'br.Msgpack.Default.MaxStringLength',\n ),\n MaxTypeCount: c(\n 'msgpack.Default.MaxTypeCount',\n 'br.Msgpack.Default.MaxTypeCount',\n ),\n },\n },\n NudgePhysicsObject: c('BR.NudgePhysicsObject'),\n Permissions: {\n GrantRole: c('Permissions.GrantRole', 'br.Permissions.GrantRole'),\n RevokeRole: c('Permissions.RevokeRole', 'br.Permissions.RevokeRole'),\n Save: c('Permissions.Save', 'br.Permissions.Save'),\n },\n Physics: {\n ForceFreezeDynamicGrids: c('BR.Physics.ForceFreezeDynamicGrids'),\n },\n Placer: {\n LogRowTests: c('br.Placer.LogRowTests'),\n },\n PlayerParts: {\n UseFastRender: c('br.PlayerParts.UseFastRender'),\n },\n // prefab commands added at PREFAB_VERSION (replace the removed .brs commands)\n Prefab: {\n GiveToPlayer: c('br.Prefab.GiveToPlayer'),\n Load: c('br.Prefab.Load'),\n SaveRegion: c('br.Prefab.SaveRegion'),\n },\n Resizer: {\n LogTests: c('br.Resizer.LogTests'),\n },\n RunHardwareBenchmark: c('BR.RunHardwareBenchmark'),\n Server: {\n Environment: {\n LoadPreset: c(\n 'Server.Environment.LoadPreset',\n 'br.Server.Environment.LoadPreset',\n ),\n Reset: c('Server.Environment.Reset', 'br.Server.Environment.Reset'),\n SavePreset: c(\n 'Server.Environment.SavePreset',\n 'br.Server.Environment.SavePreset',\n ),\n },\n GameMode: {\n EndRound: c('Server.GameMode.EndRound', 'br.Server.GameMode.EndRound'),\n NextRound: c('Server.GameMode.NextRound', 'br.Server.GameMode.NextRound'),\n PrintLeaderboard: c(\n 'Server.GameMode.PrintLeaderboard',\n 'br.Server.GameMode.PrintLeaderboard',\n ),\n Reset: c('Server.GameMode.Reset', 'br.Server.GameMode.Reset'),\n },\n Minigames: {\n Delete: c('Server.Minigames.Delete'),\n List: c('Server.Minigames.List'),\n LoadPreset: c('Server.Minigames.LoadPreset'),\n NextRound: cv([\n [0, 'Server.Minigames.NextRound'],\n [14000, 'Server.GameMode.NextRound'],\n [14349, 'br.Server.GameMode.NextRound'],\n ]),\n Reset: cv([\n [0, 'Server.Minigames.Reset'],\n [14000, 'Server.GameMode.Reset'],\n [14349, 'br.Server.GameMode.Reset'],\n ]),\n SavePreset: c('Server.Minigames.SavePreset'),\n },\n PlayerPositions: c('Server.PlayerPositions', 'br.Server.PlayerPositions'),\n Players: {\n Damage: c('Server.Players.Damage', 'br.Server.Players.Damage'),\n GiveItem: c('Server.Players.GiveItem', 'br.Server.Players.GiveItem'),\n Kill: c('Server.Players.Kill', 'br.Server.Players.Kill'),\n PrintAllLeaderboardValues: c(\n 'Server.Players.PrintAllLeaderboardValues',\n 'br.Server.Players.PrintAllLeaderboardValues',\n ),\n PrintLeaderboardValue: c(\n 'Server.Players.PrintLeaderboardValue',\n 'br.Server.Players.PrintLeaderboardValue',\n ),\n RemoveItem: c(\n 'Server.Players.RemoveItem',\n 'br.Server.Players.RemoveItem',\n ),\n SetLeaderboardValue: c(\n 'Server.Players.SetLeaderboardValue',\n 'br.Server.Players.SetLeaderboardValue',\n ),\n SetMinigame: c('Server.Players.SetMinigame'),\n SetTeam: c('Server.Players.SetTeam', 'br.Server.Players.SetTeam'),\n },\n Status: c('Server.Status', 'br.Server.Status'),\n Teams: {\n PrintAllLeaderboardValues: c(\n 'Server.Teams.PrintAllLeaderboardValues',\n 'br.Server.Teams.PrintAllLeaderboardValues',\n ),\n PrintLeaderboardValue: c(\n 'Server.Teams.PrintLeaderboardValue',\n 'br.Server.Teams.PrintLeaderboardValue',\n ),\n },\n },\n Text: {\n FlushRecoveryFrames: c('br.Text.FlushRecoveryFrames'),\n MaxCharsPolledPerFrame: c('br.Text.MaxCharsPolledPerFrame'),\n MaxCharsShapedPerFrame: c('br.Text.MaxCharsShapedPerFrame'),\n },\n Thumbnails: {\n WipeCache: c('BR.Thumbnails.WipeCache'),\n },\n Voice: {\n DebugDecode: c('voice.DebugDecode', 'br.Voice.DebugDecode'),\n SyntheticInput: c('voice.SyntheticInput', 'br.Voice.SyntheticInput'),\n TestJitter: c('voice.TestJitter', 'br.Voice.TestJitter'),\n },\n Weapons: {\n DebugFiringVectors: c(\n 'weapons.DebugFiringVectors',\n 'br.Weapons.DebugFiringVectors',\n ),\n DebugHitValidation: c(\n 'weapons.DebugHitValidation',\n 'br.Weapons.DebugHitValidation',\n ),\n EnableHitValidation: c(\n 'weapons.EnableHitValidation',\n 'br.Weapons.EnableHitValidation',\n ),\n LatencyCompensationDelayMethod: c(\n 'weapons.LatencyCompensationDelayMethod',\n 'br.Weapons.LatencyCompensationDelayMethod',\n ),\n LatencyCompensationLimit: c(\n 'weapons.LatencyCompensationLimit',\n 'br.Weapons.LatencyCompensationLimit',\n ),\n LatencyCompensationOffset: c(\n 'weapons.LatencyCompensationOffset',\n 'br.Weapons.LatencyCompensationOffset',\n ),\n ProjectileClientLatencyCompensationEnabled: c(\n 'weapons.ProjectileClientLatencyCompensationEnabled',\n 'br.Weapons.ProjectileClientLatencyCompensationEnabled',\n ),\n ProjectileLatencyCompensationEnabled: c(\n 'weapons.ProjectileLatencyCompensationEnabled',\n 'br.Weapons.ProjectileLatencyCompensationEnabled',\n ),\n ProjectilePredictionEnabled: c(\n 'weapons.ProjectilePredictionEnabled',\n 'br.Weapons.ProjectilePredictionEnabled',\n ),\n },\n WireFuzzer: {\n ClearBreakpoints: c('BR.WireFuzzer.ClearBreakpoints'),\n ComponentsPerTick: c('BR.WireFuzzer.ComponentsPerTick'),\n DisconnectBeforeConnect: c('BR.WireFuzzer.DisconnectBeforeConnect'),\n GatesPerTick: c('BR.WireFuzzer.GatesPerTick'),\n MaxComponents: c('BR.WireFuzzer.MaxComponents'),\n MaxGates: c('BR.WireFuzzer.MaxGates'),\n MaxWires: c('BR.WireFuzzer.MaxWires'),\n ModificationsPerTick: c('BR.WireFuzzer.ModificationsPerTick'),\n RerouteDuplication: c('BR.WireFuzzer.RerouteDuplication'),\n Start: c('BR.WireFuzzer.Start'),\n StartWithSeed: c('BR.WireFuzzer.StartWithSeed'),\n Stop: c('BR.WireFuzzer.Stop'),\n WiresPerTick: c('BR.WireFuzzer.WiresPerTick'),\n },\n WireGraphViz: c('BR.WireGraphViz'),\n WireRenderer: {\n EnablePorts: c('BR.WireRenderer.EnablePorts'),\n EnableWires: c('BR.WireRenderer.EnableWires'),\n },\n World: {\n // added at PREFAB_VERSION (replace the removed Bricks.ClearAll/ClearRegion)\n ClearAll: c('BR.World.ClearAll'),\n ClearRegion: c('BR.World.ClearRegion'),\n CreateEmpty: c('BR.World.CreateEmpty'),\n ListRevisions: c('BR.World.ListRevisions'),\n Load: c('BR.World.Load'),\n // removed at PREFAB_VERSION -> use Prefab.Load\n LoadAdditive: c('BR.World.LoadAdditive').removedIn(PREFAB_VERSION),\n LoadRevision: c('BR.World.LoadRevision'),\n Save: c('BR.World.Save'),\n SaveAs: c('BR.World.SaveAs'),\n },\n WorldSerializer: {\n LogPrefabLoads: c('BR.WorldSerializer.LogPrefabLoads'),\n RedirectLegacyWheelJoints: c(\n 'BR.WorldSerializer.RedirectLegacyWheelJoints',\n ),\n WipeOwnershipOnLoad: c('BR.WorldSerializer.WipeOwnershipOnLoad'),\n },\n} satisfies CommandTree;\n\ntype CommandTree = { [key: string]: ConsoleCommand | CommandTree };\n\n/** Recursively turn a {@link CommandTree} into resolved command-name strings. */\ntype Resolved<T> = T extends ConsoleCommand\n ? string\n : { [K in keyof T]: Resolved<T[K]> };\n\n/**\n * Version-resolved console command names, nested by namespace.\n * Every leaf is the command string for the running game version.\n */\nexport type ConsoleCommands = Resolved<typeof COMMAND_TABLE>;\n\nconst resolveTree = (tree: CommandTree, version: number): unknown => {\n const out: Record<string, unknown> = {};\n for (const key in tree) {\n const value = tree[key];\n out[key] =\n value instanceof ConsoleCommand\n ? value.resolve(version)\n : resolveTree(value, version);\n }\n return out;\n};\n\n/** Build the resolved {@link ConsoleCommands} map for a game CL version. */\nexport const resolveConsoleCommands = (version: number): ConsoleCommands =>\n resolveTree(COMMAND_TABLE, version) as ConsoleCommands;\n\n// Reverse lookup: every known command name (lowercased, across all versions)\n// -> the command. First write wins so canonical commands keep priority over\n// the deprecated aliases injected later in the table.\nconst COMMAND_LOOKUP = new Map<string, ConsoleCommand>();\n\n// removed-command names (lowercased) we've already warned about, to avoid spam\nconst warnedRemovedCommands = new Set<string>();\nconst indexTree = (tree: CommandTree): void => {\n for (const key in tree) {\n const value = tree[key];\n if (value instanceof ConsoleCommand) {\n for (const name of value.names) {\n const lower = name.toLowerCase();\n if (!COMMAND_LOOKUP.has(lower)) COMMAND_LOOKUP.set(lower, value);\n }\n } else {\n indexTree(value);\n }\n }\n};\nindexTree(COMMAND_TABLE);\n\n/**\n * Rewrite a console command line so a stale command name resolves to the name\n * the running game version expects. The first word (up to the first space) is\n * matched case-insensitively against every known command name; if it maps to a\n * command whose version-correct name differs, that word is swapped. Lines that\n * don't start with a known command are returned unchanged.\n */\nexport const migrateConsoleCommand = (\n line: string,\n version: number,\n): string => {\n const space = line.indexOf(' ');\n const head = space === -1 ? line : line.slice(0, space);\n const command = COMMAND_LOOKUP.get(head.toLowerCase());\n if (!command) return line;\n\n // warn (once per command) when a plugin invokes a command the running game\n // version has removed - it will have no effect\n if (\n command.isRemovedAt(version) &&\n !warnedRemovedCommands.has(head.toLowerCase())\n ) {\n warnedRemovedCommands.add(head.toLowerCase());\n Logger.warnp(\n `Console command \"${head}\" was removed in Brickadia CL${command.removedAt} ` +\n `and will have no effect. Update the plugin using it to the prefab/world equivalent.`,\n );\n }\n\n const resolved = command.resolve(version);\n // already a valid name for this version (console names are case-insensitive)\n if (resolved.toLowerCase() === head.toLowerCase()) return line;\n return space === -1 ? resolved : resolved + line.slice(space);\n};\n"],"names":["Logger"],"mappings":"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"}
|
|
@@ -390,6 +390,44 @@ class RpcPlugin extends _interface.Plugin {
|
|
|
390
390
|
"getSavePath",
|
|
391
391
|
(name2) => this.omegga.getSavePath(name2)
|
|
392
392
|
);
|
|
393
|
+
rpc.addMethod("getPrefabs", () => this.omegga.getPrefabs());
|
|
394
|
+
rpc.addMethod(
|
|
395
|
+
"loadPrefab",
|
|
396
|
+
({
|
|
397
|
+
path: path2,
|
|
398
|
+
...options
|
|
399
|
+
}) => this.omegga.loadPrefab(path2, options)
|
|
400
|
+
);
|
|
401
|
+
rpc.addMethod(
|
|
402
|
+
"savePrefab",
|
|
403
|
+
({
|
|
404
|
+
path: path2,
|
|
405
|
+
...options
|
|
406
|
+
}) => this.omegga.savePrefab(path2, options)
|
|
407
|
+
);
|
|
408
|
+
rpc.addMethod(
|
|
409
|
+
"savePrefabAsync",
|
|
410
|
+
({
|
|
411
|
+
path: path2,
|
|
412
|
+
...options
|
|
413
|
+
}) => this.omegga.savePrefabAsync(path2, options)
|
|
414
|
+
);
|
|
415
|
+
rpc.addMethod(
|
|
416
|
+
"givePrefabToPlayer",
|
|
417
|
+
({
|
|
418
|
+
path: path2,
|
|
419
|
+
player,
|
|
420
|
+
preserveOwnership = false
|
|
421
|
+
}) => this.omegga.givePrefabToPlayer(path2, player, { preserveOwnership })
|
|
422
|
+
);
|
|
423
|
+
rpc.addMethod(
|
|
424
|
+
"loadPrefabOnPlayer",
|
|
425
|
+
({
|
|
426
|
+
path: path2,
|
|
427
|
+
player,
|
|
428
|
+
preserveOwnership = false
|
|
429
|
+
}) => this.omegga.loadPrefabOnPlayer(path2, player, { preserveOwnership })
|
|
430
|
+
);
|
|
393
431
|
rpc.addMethod(
|
|
394
432
|
"clearBricks",
|
|
395
433
|
({ target, quiet = false }) => this.omegga.clearBricks(target, quiet)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin_jsonrpc_stdio.js","sources":["../../../src/omegga/plugin/plugin_jsonrpc_stdio.ts"],"sourcesContent":["import Logger from '@/logger';\nimport { EnvironmentPreset } from '@brickadia/presets';\nimport Omegga from '@omegga/server';\nimport { WriteSaveObject } from 'brs-js';\nimport {\n JSONRPCClient,\n JSONRPCServer,\n JSONRPCServerAndClient,\n} from 'json-rpc-2.0';\nimport { ChildProcessWithoutNullStreams, spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport readline from 'readline';\nimport { Plugin } from './interface';\nimport { bootstrap } from './plugin_node_safe/proxyOmegga';\n\n// TODO: check if version is compatible (v1 -> v2) from file\n// TODO: write jsonrpc wrappers in a few languages, implement a few simple plugins\n// TODO: languages: [ python, go ]\n\nconst MAIN_FILE = 'omegga_plugin';\nconst DOC_FILE = 'doc.json';\nconst PLUGIN_FILE = 'plugin.json';\n\nexport default class RpcPlugin extends Plugin {\n #child: ChildProcessWithoutNullStreams;\n #rpc: JSONRPCServerAndClient;\n #errInterface: readline.Interface;\n #outInterface: readline.Interface;\n\n messageCounter: number;\n\n // all RPC plugins require a main (binary) file and a doc file\n static canLoad(pluginPath: string) {\n return (\n fs.existsSync(path.join(pluginPath, MAIN_FILE)) &&\n fs.existsSync(path.join(pluginPath, DOC_FILE))\n );\n }\n\n // websocket rpc plugin type\n static getFormat() {\n return 'jsonrpc_stdio';\n }\n\n // documentation is based on doc.json file\n getDocumentation() {\n return this.documentation;\n }\n constructor(pluginPath: string, omegga: Omegga) {\n super(pluginPath, omegga);\n\n this.messageCounter = 0;\n\n // TODO: validate documentation\n this.documentation = Plugin.readJSON(path.join(pluginPath, DOC_FILE));\n this.pluginConfig = Plugin.readJSON(path.join(pluginPath, PLUGIN_FILE));\n this.pluginFile = path.join(pluginPath, MAIN_FILE);\n\n this.eventPassthrough = this.eventPassthrough.bind(this);\n this.commands = [];\n\n this.initRPC();\n }\n\n isLoaded() {\n return !!this.#child && !this.#child.exitCode;\n }\n\n // determing if a command is registered\n isCommand(cmd: string) {\n return this.commands.includes(cmd);\n }\n\n // spawn the plugin as a child process\n async load() {\n const name = this.getName();\n const verbose = (...msg: any[]) => Logger.verbose(name.underline, ...msg);\n verbose('Load method invoked');\n let frozen = true,\n timed = false;\n this.commands = [];\n\n // can't load the plugin if the child is still running\n if (this.#child) {\n verbose('Plugin already has child process');\n return false;\n }\n\n let config;\n try {\n verbose('Getting plugin config');\n config = await this.storage.getConfig();\n } catch (e) {\n return false;\n }\n\n try {\n if (this.pluginConfig?.emitConfig) {\n verbose('Emitting plugin config');\n await fs.promises.writeFile(\n path.join(this.path, this.pluginConfig.emitConfig),\n JSON.stringify(config),\n );\n }\n verbose('Spawning child process');\n this.#child = spawn(this.pluginFile);\n this.#child.stdin.setDefaultEncoding('utf8');\n this.#outInterface = readline.createInterface({\n input: this.#child.stdout,\n terminal: false,\n });\n this.#errInterface = readline.createInterface({\n input: this.#child.stderr,\n terminal: false,\n });\n this.attachListeners();\n } catch (err) {\n Logger.errorp(\n 'error loading stdio rpc plugin',\n name.brightRed.underline,\n err,\n );\n await this.kill();\n this.emitStatus();\n return false;\n }\n\n return Promise.race([\n (async () => {\n try {\n // get some initial information to create an omegga proxy\n const initialData = bootstrap(this.omegga);\n\n verbose('Sending initial data');\n // send all of the mock events to the proxy omegga\n for (const ev in initialData) {\n // send some initial information\n this.notify(ev, initialData[ev]);\n }\n\n verbose('Initializing event passthrough');\n // pass events through\n this.omegga.on('*', this.eventPassthrough);\n\n try {\n // tell the plugin to start\n verbose('Waiting for plugin to start...');\n const result = await this.emit('init', config);\n\n verbose('Initialized with result:', result);\n // plugins can return a result object\n if (typeof result === 'object' && result) {\n // if registeredCommands is in the results, register the provided strings as commands\n const cmds = result.registeredCommands;\n if (\n cmds &&\n cmds instanceof Array &&\n cmds.every(i => typeof i === 'string')\n )\n this.commands = cmds;\n }\n } catch (e) {\n if (!e.message) return;\n Logger.errorp(name.brightRed.underline, 'error starting: ', e);\n }\n\n // plugin is not frozen, resolve that it has loaded\n frozen = false;\n if (timed) return;\n this.emitStatus();\n return true;\n } catch (e) {\n if (timed) return;\n Logger.errorp(\n 'error loading stdio rpc plugin',\n name.brightRed.underline,\n e,\n );\n await this.kill();\n frozen = false;\n this.emitStatus();\n return false;\n }\n })(),\n new Promise<boolean>(resolve => {\n // let user know if the child quit while launching\n this.#child.once('exit', () => {\n if (!frozen || timed) return;\n verbose('Plugin exited during init');\n frozen = false;\n this.emitStatus();\n resolve(false);\n });\n\n // check if the child is frozen (while true)\n setTimeout(() => {\n if (!frozen) return;\n Logger.errorp(\n 'I appear to be unresponsive when starting (maybe I forgot to respond to init)',\n name.brightRed.underline,\n );\n this.kill();\n timed = true;\n this.emitStatus();\n resolve(false);\n }, 5000);\n }),\n ]);\n }\n\n // kill the child process after requesting it to stop\n unload() {\n if (!this.#child || this.#child.exitCode) {\n this.detachListeners();\n this.emitStatus();\n return Promise.resolve(true);\n }\n let frozen = true,\n timed = false;\n const name = this.getName();\n\n return Promise.race([\n (async (): Promise<boolean> => {\n try {\n // let the plugin know it's time to stop, if this error it's probably because the method was not implemented\n try {\n await this.emit('stop');\n } catch (e) {\n // lazy developer - just implement stop please\n }\n\n await this.kill();\n\n frozen = false;\n if (timed) return;\n this.emitStatus();\n this.commands = [];\n return true;\n } catch (e) {\n if (timed) return;\n Logger.errorp(\n 'error unloading rpc plugin',\n name.brightRed.underline,\n e,\n );\n frozen = false;\n this.emitStatus();\n return false;\n }\n })(),\n // this is wrapped in a promise for the freeze check\n new Promise<boolean>(resolve => {\n // check if the child is frozen (while true)\n setTimeout(() => {\n if (!frozen) return;\n Logger.errorp(\n 'I appear to be unresponsive when stopping (maybe I forgot to respond to stop)',\n name.brightRed.underline,\n );\n this.kill();\n timed = true;\n this.emitStatus();\n resolve(true);\n }, 5000);\n }),\n ]);\n }\n\n // attaches event listeners\n attachListeners() {\n const name = this.getName();\n\n this.#outInterface.on('line', line => {\n try {\n const rpcData = JSON.parse(line);\n try {\n this.#rpc.receiveAndSend(rpcData);\n } catch (e) {\n Logger.error(\n this.getName().brightRed.underline,\n '!>'.red,\n 'error parsing rpc data',\n e,\n line,\n );\n }\n } catch {\n // fallback to logging\n Logger.log(name.underline, '>>'.green, line);\n }\n });\n\n // stderr - print out the errors\n this.#errInterface.on('line', err => {\n Logger.error(name.brightRed.underline, '!>'.red, err);\n });\n\n this.#child.on('error', () => this.kill());\n this.#child.on('close', () => this.kill());\n this.#child.on('exit', code => {\n Logger.errorp(\n '!>'.red,\n 'rpc plugin',\n name.brightRed.underline,\n 'exited with code',\n code,\n );\n this.kill();\n });\n }\n\n // removes previously attached event listeners\n detachListeners() {\n this.#outInterface.removeAllListeners('line');\n this.#errInterface.removeAllListeners('line');\n if (this.#child) {\n this.#child.removeAllListeners('exit');\n this.#child.removeAllListeners('close');\n this.#child.removeAllListeners('error');\n }\n }\n\n // write a string to the child process\n writeln(line: string) {\n try {\n if (this.#child && !this.#child.exitCode)\n this.#child.stdin.write(line + '\\n');\n } catch (e) {\n // the child probably died... oops!\n }\n }\n\n // forcibly kills the plugin\n async kill() {\n this.#rpc.rejectAllPendingRequests('Plugin Terminated');\n this.detachListeners();\n this.omegga.off('*', this.eventPassthrough);\n if (!this.#child) return;\n\n // create a promise for the exit of the process\n const promise = new Promise(resolve => this.#child.once('exit', resolve));\n\n // kill the process\n this.#child.kill('SIGINT');\n\n // ...kill it again just to make sure it's dead\n spawn('kill', ['-9', this.#child.pid + '']);\n\n // wait for the process to exit\n await promise;\n this.#child = undefined;\n this.emitStatus();\n }\n\n eventPassthrough(type: string, ...args: any[]) {\n if (!this.#child) return;\n this.notify(type, args);\n }\n\n // setup the JSONRPC communication\n initRPC() {\n const server = new JSONRPCServer();\n const client = new JSONRPCClient(req => {\n try {\n this.writeln(JSON.stringify(req));\n return Promise.resolve();\n } catch (error) {\n return Promise.reject(error);\n }\n });\n const rpc = (this.#rpc = new JSONRPCServerAndClient(server, client));\n\n // plugin log generator function\n const ezLog =\n (\n logFn: 'log' | 'error' | 'info' | 'debug' | 'warn' | 'trace',\n name: string,\n symbol: string,\n ) =>\n (line: any) =>\n console[logFn](name.underline, symbol, line);\n\n const name = this.getName();\n\n // server can output logs special formatting for stdout\n rpc.addMethod('log', ezLog('log', name, '>>'.green));\n rpc.addMethod('error', ezLog('error', name.brightRed, '!>'.red));\n rpc.addMethod('info', ezLog('info', name, '#>'.blue));\n rpc.addMethod('debug', ezLog('debug', name, '?>'.blue));\n rpc.addMethod('warn', ezLog('warn', name.brightYellow, ':>'.yellow));\n rpc.addMethod('trace', ezLog('trace', name, 'T>'.grey));\n\n // plugin store interactions\n rpc.addMethod('store.get', key =>\n this.storage.get(key as unknown as string),\n );\n rpc.addMethod('store.set', ([key, value]: [key: string, value: any]) =>\n this.storage.set(key, value),\n );\n rpc.addMethod('store.delete', key =>\n this.storage.delete(key as unknown as string),\n );\n rpc.addMethod('store.wipe', () => this.storage.wipe());\n rpc.addMethod('store.count', () => this.storage.count());\n rpc.addMethod('store.keys', () => this.storage.keys());\n\n // server can run console commands\n rpc.addMethod('exec', line =>\n this.omegga.writeln(line as unknown as string),\n );\n rpc.addMethod('writeln', line =>\n this.omegga.writeln(line as unknown as string),\n );\n rpc.addMethod('broadcast', line =>\n this.omegga.broadcast(line as unknown as string),\n );\n rpc.addMethod(\n 'whisper',\n ({ target, line }: { target: string; line: string }) =>\n this.omegga.whisper(target, line),\n );\n rpc.addMethod(\n 'middlePrint',\n ({ target, line }: { target: string; line: string }) =>\n this.omegga.middlePrint(target, line),\n );\n rpc.addMethod('getPlayers', () => this.omegga.getPlayers());\n rpc.addMethod('getPlayerPosition', name =>\n this.omegga.getPlayer(name as unknown as string)?.getPosition(),\n ); // included for compatibility\n rpc.addMethod('getAllPlayerPositions', () =>\n this.omegga.getAllPlayerPositions(),\n );\n rpc.addMethod('getEnvironmentPresets', () =>\n this.omegga.getEnvironmentPresets(),\n );\n rpc.addMethod('resetEnvironment', () => this.omegga.resetEnvironment());\n rpc.addMethod('saveEnvironment', name =>\n this.omegga.saveEnvironment(name as unknown as string),\n );\n rpc.addMethod('loadEnvironment', name =>\n this.omegga.loadEnvironment(name as unknown as string),\n );\n rpc.addMethod('loadEnvironmentData', data =>\n this.omegga.loadEnvironmentData(data as EnvironmentPreset),\n );\n rpc.addMethod('getServerStatus', () => this.omegga.getServerStatus());\n rpc.addMethod('getMinigames', () => this.omegga.getMinigames());\n rpc.addMethod('getMinigamePresets', () => this.omegga.getMinigamePresets());\n rpc.addMethod(\n 'saveMinigame',\n ({ index, name }: { index: number; name: string }) =>\n this.omegga.saveMinigame(index, name),\n );\n rpc.addMethod(\n 'loadMinigame',\n ({ name, owner }: { name: string; owner: string }) =>\n this.omegga.loadMinigame(name, owner),\n );\n rpc.addMethod('nextRoundMinigame', index =>\n this.omegga.nextRoundMinigame(index as unknown as number),\n );\n rpc.addMethod('resetMinigame', index =>\n this.omegga.resetMinigame(index as unknown as number),\n );\n rpc.addMethod('deleteMinigame', index =>\n this.omegga.deleteMinigame(index as unknown as number),\n );\n rpc.addMethod('listMinigames', () => this.omegga.listMinigames());\n rpc.addMethod('getHostId', () => this.omegga.getHostId());\n rpc.addMethod('getRoleSetup', () => this.omegga.getRoleSetup());\n rpc.addMethod('getBanList', () => this.omegga.getBanList());\n rpc.addMethod('getSaves', () => this.omegga.getSaves());\n rpc.addMethod('getSavePath', name =>\n this.omegga.getSavePath(name as unknown as string),\n );\n rpc.addMethod(\n 'clearBricks',\n ({ target, quiet = false }: { target: string; quiet?: boolean }) =>\n this.omegga.clearBricks(target, quiet),\n );\n rpc.addMethod('clearAllBricks', quiet =>\n this.omegga.clearAllBricks(quiet as unknown as boolean),\n );\n rpc.addMethod('saveBricks', name =>\n this.omegga.saveBricks(name as unknown as string),\n );\n rpc.addMethod(\n 'loadBricks',\n ({\n name,\n offX = 0,\n offY = 0,\n offZ = 0,\n quiet = false,\n }: {\n name: string;\n offX?: number;\n offY?: number;\n offZ?: number;\n quiet?: boolean;\n }) => this.omegga.loadBricks(name, { offX, offY, offZ, quiet }),\n );\n rpc.addMethod(\n 'loadBricksOnPlayer',\n ({\n name,\n player,\n offX = 0,\n offY = 0,\n offZ = 0,\n }: {\n name: string;\n player: string;\n offX?: number;\n offY?: number;\n offZ?: number;\n quiet?: boolean;\n }) => this.omegga.loadBricksOnPlayer(name, player, { offX, offY, offZ }),\n );\n rpc.addMethod('readSaveData', name =>\n this.omegga.readSaveData(name as unknown as string),\n );\n rpc.addMethod('getSaveData', () => this.omegga.getSaveData());\n rpc.addMethod(\n 'loadSaveData',\n ({\n data,\n offX = 0,\n offY = 0,\n offZ = 0,\n quiet = false,\n }: {\n data: WriteSaveObject;\n offX?: number;\n offY?: number;\n offZ?: number;\n quiet?: boolean;\n }) => this.omegga.loadSaveData(data, { offX, offY, offZ, quiet }),\n );\n rpc.addMethod(\n 'loadSaveDataOnPlayer',\n ({\n data,\n player,\n offX = 0,\n offY = 0,\n offZ = 0,\n }: {\n data: WriteSaveObject;\n player: string;\n offX?: number;\n offY?: number;\n offZ?: number;\n quiet?: boolean;\n }) =>\n this.omegga.loadSaveDataOnPlayer(data, player, { offX, offY, offZ }),\n );\n rpc.addMethod('changeMap', map =>\n this.omegga.changeMap(map as unknown as string),\n );\n rpc.addMethod('unload', () => this.unload());\n rpc.addMethod('reload', async () => {\n await this.unload();\n await this.load();\n });\n\n // player related operations\n const addPlayerMethod = (name: string) =>\n rpc.addMethod(`player.${name}`, player =>\n (this.omegga.getPlayer(player as unknown as string) as any)?.[name](),\n );\n rpc.addMethod('player.get', target => {\n let player = this.omegga.getPlayer(target as unknown as string);\n return player && { ...player, host: player.isHost() };\n });\n addPlayerMethod('getRoles');\n addPlayerMethod('getPermissions');\n addPlayerMethod('getNameColor');\n addPlayerMethod('getPosition');\n addPlayerMethod('getPawn');\n addPlayerMethod('getGhostBrick');\n addPlayerMethod('getPaint');\n addPlayerMethod('isCrouched');\n addPlayerMethod('isDead');\n addPlayerMethod('getTemplateBounds');\n addPlayerMethod('getTemplateBoundsData');\n addPlayerMethod('kill');\n addPlayerMethod('getScore');\n addPlayerMethod('getLeaderboard');\n rpc.addMethod(\n 'player.loadDataAtGhostBrick',\n ({\n target,\n data,\n rotate = true,\n offX = 0,\n offY = 0,\n offZ = 0,\n quiet = false,\n }: {\n target: string;\n data: WriteSaveObject;\n rotate?: boolean;\n offX?: number;\n offY?: number;\n offZ?: number;\n quiet?: boolean;\n }) =>\n this.omegga\n .getPlayer(target)\n ?.loadDataAtGhostBrick(data, { rotate, offX, offY, offZ, quiet }),\n );\n rpc.addMethod(\n 'player.loadSaveData',\n ({\n target,\n data,\n offX = 0,\n offY = 0,\n offZ = 0,\n }: {\n target: string;\n data: WriteSaveObject;\n offX?: number;\n offY?: number;\n offZ?: number;\n }) =>\n this.omegga.getPlayer(target)?.loadSaveData(data, { offX, offY, offZ }),\n );\n rpc.addMethod(\n 'player.clearBricks',\n ({ target, quiet = false }: { target: string; quiet?: boolean }) =>\n this.omegga.getPlayer(target)?.clearBricks(quiet),\n );\n rpc.addMethod(\n 'player.loadBricks',\n ({ target, saveName }: { target: string; saveName: string }) =>\n this.omegga.getPlayer(target)?.loadBricks(saveName),\n );\n rpc.addMethod(\n 'player.damage',\n ({ target, amount }: { target: string; amount: number }) =>\n this.omegga.getPlayer(target)?.damage(amount),\n );\n rpc.addMethod(\n 'player.heal',\n ({ target, amount }: { target: string; amount: number }) =>\n this.omegga.getPlayer(target)?.heal(amount),\n );\n rpc.addMethod(\n 'player.giveItem',\n ({ target, item }: { target: string; item: string }) =>\n this.omegga.getPlayer(target)?.giveItem(item as any),\n );\n rpc.addMethod(\n 'player.takeItem',\n ({ target, item }: { target: string; item: string }) =>\n this.omegga.getPlayer(target)?.takeItem(item as any),\n );\n rpc.addMethod(\n 'player.setTeam',\n ({ target, teamIndex }: { target: string; teamIndex: number }) =>\n this.omegga.getPlayer(target)?.setTeam(teamIndex),\n );\n rpc.addMethod(\n 'player.setMinigame',\n ({ target, index }: { target: string; index: number }) =>\n this.omegga.getPlayer(target)?.setMinigame(index),\n );\n rpc.addMethod(\n 'player.setScore',\n ({\n target,\n minigameIndex,\n score,\n }: {\n target: string;\n minigameIndex: number;\n score: number;\n }) => this.omegga.getPlayer(target)?.setScore(minigameIndex, score),\n );\n rpc.addMethod(\n 'player.setLeaderboard',\n ({\n target,\n key,\n value,\n }: {\n target: string;\n key: string;\n value: number;\n }) => this.omegga.getPlayer(target)?.setLeaderboard(key, value),\n );\n\n // plugin related operations\n rpc.addMethod('plugin.get', async name => {\n const plugin = this.omegga.pluginLoader.plugins.find(\n p => p.getName() === (name as unknown as string),\n );\n\n if (plugin) {\n return {\n name,\n documentation: plugin.getDocumentation(),\n loaded: plugin.isLoaded(),\n };\n } else {\n return null;\n }\n });\n\n rpc.addMethod(\n 'plugin.emit',\n async ([name, event, ...args]: [string, string, ...any[]]) => {\n const plugin = this.omegga.pluginLoader.plugins.find(\n p => p.getName() === name,\n );\n\n if (plugin) {\n return plugin.emitPlugin(event, this.getName(), args);\n } else {\n return null;\n }\n },\n );\n }\n\n // emit a custom plugin event\n async emitPlugin(event: string, from: string, args: any[]) {\n return await this.emit('plugin:emit', [event, from, ...args]);\n }\n\n // emit a message to the plugin via the jsonrpc client and expect a response\n emit(type: string, arg?: any) {\n return this.#rpc.request(type, arg);\n }\n\n // emit a message to the plugin via the jsonrpc client, don't expect a response\n notify(type: string, arg?: any) {\n try {\n this.#rpc.notify(type, arg);\n } catch (e) {\n // this only happens if the RPC library is hitting some issues - probably redundant\n }\n }\n}\n"],"names":["Plugin","Logger","spawn","bootstrap","JSONRPCServer","JSONRPCClient","JSONRPCServerAndClient","name"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin_jsonrpc_stdio.js","sources":["../../../src/omegga/plugin/plugin_jsonrpc_stdio.ts"],"sourcesContent":["import Logger from '@/logger';\nimport { EnvironmentPreset } from '@brickadia/presets';\nimport Omegga from '@omegga/server';\nimport { WriteSaveObject } from 'brs-js';\nimport {\n JSONRPCClient,\n JSONRPCServer,\n JSONRPCServerAndClient,\n} from 'json-rpc-2.0';\nimport { ChildProcessWithoutNullStreams, spawn } from 'node:child_process';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport readline from 'readline';\nimport { Plugin } from './interface';\nimport { bootstrap } from './plugin_node_safe/proxyOmegga';\n\n// TODO: check if version is compatible (v1 -> v2) from file\n// TODO: write jsonrpc wrappers in a few languages, implement a few simple plugins\n// TODO: languages: [ python, go ]\n\nconst MAIN_FILE = 'omegga_plugin';\nconst DOC_FILE = 'doc.json';\nconst PLUGIN_FILE = 'plugin.json';\n\nexport default class RpcPlugin extends Plugin {\n #child: ChildProcessWithoutNullStreams;\n #rpc: JSONRPCServerAndClient;\n #errInterface: readline.Interface;\n #outInterface: readline.Interface;\n\n messageCounter: number;\n\n // all RPC plugins require a main (binary) file and a doc file\n static canLoad(pluginPath: string) {\n return (\n fs.existsSync(path.join(pluginPath, MAIN_FILE)) &&\n fs.existsSync(path.join(pluginPath, DOC_FILE))\n );\n }\n\n // websocket rpc plugin type\n static getFormat() {\n return 'jsonrpc_stdio';\n }\n\n // documentation is based on doc.json file\n getDocumentation() {\n return this.documentation;\n }\n constructor(pluginPath: string, omegga: Omegga) {\n super(pluginPath, omegga);\n\n this.messageCounter = 0;\n\n // TODO: validate documentation\n this.documentation = Plugin.readJSON(path.join(pluginPath, DOC_FILE));\n this.pluginConfig = Plugin.readJSON(path.join(pluginPath, PLUGIN_FILE));\n this.pluginFile = path.join(pluginPath, MAIN_FILE);\n\n this.eventPassthrough = this.eventPassthrough.bind(this);\n this.commands = [];\n\n this.initRPC();\n }\n\n isLoaded() {\n return !!this.#child && !this.#child.exitCode;\n }\n\n // determing if a command is registered\n isCommand(cmd: string) {\n return this.commands.includes(cmd);\n }\n\n // spawn the plugin as a child process\n async load() {\n const name = this.getName();\n const verbose = (...msg: any[]) => Logger.verbose(name.underline, ...msg);\n verbose('Load method invoked');\n let frozen = true,\n timed = false;\n this.commands = [];\n\n // can't load the plugin if the child is still running\n if (this.#child) {\n verbose('Plugin already has child process');\n return false;\n }\n\n let config;\n try {\n verbose('Getting plugin config');\n config = await this.storage.getConfig();\n } catch (e) {\n return false;\n }\n\n try {\n if (this.pluginConfig?.emitConfig) {\n verbose('Emitting plugin config');\n await fs.promises.writeFile(\n path.join(this.path, this.pluginConfig.emitConfig),\n JSON.stringify(config),\n );\n }\n verbose('Spawning child process');\n this.#child = spawn(this.pluginFile);\n this.#child.stdin.setDefaultEncoding('utf8');\n this.#outInterface = readline.createInterface({\n input: this.#child.stdout,\n terminal: false,\n });\n this.#errInterface = readline.createInterface({\n input: this.#child.stderr,\n terminal: false,\n });\n this.attachListeners();\n } catch (err) {\n Logger.errorp(\n 'error loading stdio rpc plugin',\n name.brightRed.underline,\n err,\n );\n await this.kill();\n this.emitStatus();\n return false;\n }\n\n return Promise.race([\n (async () => {\n try {\n // get some initial information to create an omegga proxy\n const initialData = bootstrap(this.omegga);\n\n verbose('Sending initial data');\n // send all of the mock events to the proxy omegga\n for (const ev in initialData) {\n // send some initial information\n this.notify(ev, initialData[ev]);\n }\n\n verbose('Initializing event passthrough');\n // pass events through\n this.omegga.on('*', this.eventPassthrough);\n\n try {\n // tell the plugin to start\n verbose('Waiting for plugin to start...');\n const result = await this.emit('init', config);\n\n verbose('Initialized with result:', result);\n // plugins can return a result object\n if (typeof result === 'object' && result) {\n // if registeredCommands is in the results, register the provided strings as commands\n const cmds = result.registeredCommands;\n if (\n cmds &&\n cmds instanceof Array &&\n cmds.every(i => typeof i === 'string')\n )\n this.commands = cmds;\n }\n } catch (e) {\n if (!e.message) return;\n Logger.errorp(name.brightRed.underline, 'error starting: ', e);\n }\n\n // plugin is not frozen, resolve that it has loaded\n frozen = false;\n if (timed) return;\n this.emitStatus();\n return true;\n } catch (e) {\n if (timed) return;\n Logger.errorp(\n 'error loading stdio rpc plugin',\n name.brightRed.underline,\n e,\n );\n await this.kill();\n frozen = false;\n this.emitStatus();\n return false;\n }\n })(),\n new Promise<boolean>(resolve => {\n // let user know if the child quit while launching\n this.#child.once('exit', () => {\n if (!frozen || timed) return;\n verbose('Plugin exited during init');\n frozen = false;\n this.emitStatus();\n resolve(false);\n });\n\n // check if the child is frozen (while true)\n setTimeout(() => {\n if (!frozen) return;\n Logger.errorp(\n 'I appear to be unresponsive when starting (maybe I forgot to respond to init)',\n name.brightRed.underline,\n );\n this.kill();\n timed = true;\n this.emitStatus();\n resolve(false);\n }, 5000);\n }),\n ]);\n }\n\n // kill the child process after requesting it to stop\n unload() {\n if (!this.#child || this.#child.exitCode) {\n this.detachListeners();\n this.emitStatus();\n return Promise.resolve(true);\n }\n let frozen = true,\n timed = false;\n const name = this.getName();\n\n return Promise.race([\n (async (): Promise<boolean> => {\n try {\n // let the plugin know it's time to stop, if this error it's probably because the method was not implemented\n try {\n await this.emit('stop');\n } catch (e) {\n // lazy developer - just implement stop please\n }\n\n await this.kill();\n\n frozen = false;\n if (timed) return;\n this.emitStatus();\n this.commands = [];\n return true;\n } catch (e) {\n if (timed) return;\n Logger.errorp(\n 'error unloading rpc plugin',\n name.brightRed.underline,\n e,\n );\n frozen = false;\n this.emitStatus();\n return false;\n }\n })(),\n // this is wrapped in a promise for the freeze check\n new Promise<boolean>(resolve => {\n // check if the child is frozen (while true)\n setTimeout(() => {\n if (!frozen) return;\n Logger.errorp(\n 'I appear to be unresponsive when stopping (maybe I forgot to respond to stop)',\n name.brightRed.underline,\n );\n this.kill();\n timed = true;\n this.emitStatus();\n resolve(true);\n }, 5000);\n }),\n ]);\n }\n\n // attaches event listeners\n attachListeners() {\n const name = this.getName();\n\n this.#outInterface.on('line', line => {\n try {\n const rpcData = JSON.parse(line);\n try {\n this.#rpc.receiveAndSend(rpcData);\n } catch (e) {\n Logger.error(\n this.getName().brightRed.underline,\n '!>'.red,\n 'error parsing rpc data',\n e,\n line,\n );\n }\n } catch {\n // fallback to logging\n Logger.log(name.underline, '>>'.green, line);\n }\n });\n\n // stderr - print out the errors\n this.#errInterface.on('line', err => {\n Logger.error(name.brightRed.underline, '!>'.red, err);\n });\n\n this.#child.on('error', () => this.kill());\n this.#child.on('close', () => this.kill());\n this.#child.on('exit', code => {\n Logger.errorp(\n '!>'.red,\n 'rpc plugin',\n name.brightRed.underline,\n 'exited with code',\n code,\n );\n this.kill();\n });\n }\n\n // removes previously attached event listeners\n detachListeners() {\n this.#outInterface.removeAllListeners('line');\n this.#errInterface.removeAllListeners('line');\n if (this.#child) {\n this.#child.removeAllListeners('exit');\n this.#child.removeAllListeners('close');\n this.#child.removeAllListeners('error');\n }\n }\n\n // write a string to the child process\n writeln(line: string) {\n try {\n if (this.#child && !this.#child.exitCode)\n this.#child.stdin.write(line + '\\n');\n } catch (e) {\n // the child probably died... oops!\n }\n }\n\n // forcibly kills the plugin\n async kill() {\n this.#rpc.rejectAllPendingRequests('Plugin Terminated');\n this.detachListeners();\n this.omegga.off('*', this.eventPassthrough);\n if (!this.#child) return;\n\n // create a promise for the exit of the process\n const promise = new Promise(resolve => this.#child.once('exit', resolve));\n\n // kill the process\n this.#child.kill('SIGINT');\n\n // ...kill it again just to make sure it's dead\n spawn('kill', ['-9', this.#child.pid + '']);\n\n // wait for the process to exit\n await promise;\n this.#child = undefined;\n this.emitStatus();\n }\n\n eventPassthrough(type: string, ...args: any[]) {\n if (!this.#child) return;\n this.notify(type, args);\n }\n\n // setup the JSONRPC communication\n initRPC() {\n const server = new JSONRPCServer();\n const client = new JSONRPCClient(req => {\n try {\n this.writeln(JSON.stringify(req));\n return Promise.resolve();\n } catch (error) {\n return Promise.reject(error);\n }\n });\n const rpc = (this.#rpc = new JSONRPCServerAndClient(server, client));\n\n // plugin log generator function\n const ezLog =\n (\n logFn: 'log' | 'error' | 'info' | 'debug' | 'warn' | 'trace',\n name: string,\n symbol: string,\n ) =>\n (line: any) =>\n console[logFn](name.underline, symbol, line);\n\n const name = this.getName();\n\n // server can output logs special formatting for stdout\n rpc.addMethod('log', ezLog('log', name, '>>'.green));\n rpc.addMethod('error', ezLog('error', name.brightRed, '!>'.red));\n rpc.addMethod('info', ezLog('info', name, '#>'.blue));\n rpc.addMethod('debug', ezLog('debug', name, '?>'.blue));\n rpc.addMethod('warn', ezLog('warn', name.brightYellow, ':>'.yellow));\n rpc.addMethod('trace', ezLog('trace', name, 'T>'.grey));\n\n // plugin store interactions\n rpc.addMethod('store.get', key =>\n this.storage.get(key as unknown as string),\n );\n rpc.addMethod('store.set', ([key, value]: [key: string, value: any]) =>\n this.storage.set(key, value),\n );\n rpc.addMethod('store.delete', key =>\n this.storage.delete(key as unknown as string),\n );\n rpc.addMethod('store.wipe', () => this.storage.wipe());\n rpc.addMethod('store.count', () => this.storage.count());\n rpc.addMethod('store.keys', () => this.storage.keys());\n\n // server can run console commands\n rpc.addMethod('exec', line =>\n this.omegga.writeln(line as unknown as string),\n );\n rpc.addMethod('writeln', line =>\n this.omegga.writeln(line as unknown as string),\n );\n rpc.addMethod('broadcast', line =>\n this.omegga.broadcast(line as unknown as string),\n );\n rpc.addMethod(\n 'whisper',\n ({ target, line }: { target: string; line: string }) =>\n this.omegga.whisper(target, line),\n );\n rpc.addMethod(\n 'middlePrint',\n ({ target, line }: { target: string; line: string }) =>\n this.omegga.middlePrint(target, line),\n );\n rpc.addMethod('getPlayers', () => this.omegga.getPlayers());\n rpc.addMethod('getPlayerPosition', name =>\n this.omegga.getPlayer(name as unknown as string)?.getPosition(),\n ); // included for compatibility\n rpc.addMethod('getAllPlayerPositions', () =>\n this.omegga.getAllPlayerPositions(),\n );\n rpc.addMethod('getEnvironmentPresets', () =>\n this.omegga.getEnvironmentPresets(),\n );\n rpc.addMethod('resetEnvironment', () => this.omegga.resetEnvironment());\n rpc.addMethod('saveEnvironment', name =>\n this.omegga.saveEnvironment(name as unknown as string),\n );\n rpc.addMethod('loadEnvironment', name =>\n this.omegga.loadEnvironment(name as unknown as string),\n );\n rpc.addMethod('loadEnvironmentData', data =>\n this.omegga.loadEnvironmentData(data as EnvironmentPreset),\n );\n rpc.addMethod('getServerStatus', () => this.omegga.getServerStatus());\n rpc.addMethod('getMinigames', () => this.omegga.getMinigames());\n rpc.addMethod('getMinigamePresets', () => this.omegga.getMinigamePresets());\n rpc.addMethod(\n 'saveMinigame',\n ({ index, name }: { index: number; name: string }) =>\n this.omegga.saveMinigame(index, name),\n );\n rpc.addMethod(\n 'loadMinigame',\n ({ name, owner }: { name: string; owner: string }) =>\n this.omegga.loadMinigame(name, owner),\n );\n rpc.addMethod('nextRoundMinigame', index =>\n this.omegga.nextRoundMinigame(index as unknown as number),\n );\n rpc.addMethod('resetMinigame', index =>\n this.omegga.resetMinigame(index as unknown as number),\n );\n rpc.addMethod('deleteMinigame', index =>\n this.omegga.deleteMinigame(index as unknown as number),\n );\n rpc.addMethod('listMinigames', () => this.omegga.listMinigames());\n rpc.addMethod('getHostId', () => this.omegga.getHostId());\n rpc.addMethod('getRoleSetup', () => this.omegga.getRoleSetup());\n rpc.addMethod('getBanList', () => this.omegga.getBanList());\n rpc.addMethod('getSaves', () => this.omegga.getSaves());\n rpc.addMethod('getSavePath', name =>\n this.omegga.getSavePath(name as unknown as string),\n );\n rpc.addMethod('getPrefabs', () => this.omegga.getPrefabs());\n rpc.addMethod(\n 'loadPrefab',\n ({\n path,\n ...options\n }: {\n path: string;\n offX?: number;\n offY?: number;\n offZ?: number;\n atOriginalPosition?: boolean;\n orientation?: number;\n rootEntityPersistentIndex?: number;\n mirrorAxes?: number;\n overrideUserId?: string;\n }) => this.omegga.loadPrefab(path, options),\n );\n rpc.addMethod(\n 'savePrefab',\n ({\n path,\n ...options\n }: {\n path: string;\n region?: {\n center: [number, number, number];\n extent: [number, number, number];\n };\n entities?: boolean;\n rootEntityPersistentIndex?: number;\n userId?: string;\n }) => this.omegga.savePrefab(path, options),\n );\n rpc.addMethod(\n 'savePrefabAsync',\n ({\n path,\n ...options\n }: {\n path: string;\n region?: {\n center: [number, number, number];\n extent: [number, number, number];\n };\n entities?: boolean;\n rootEntityPersistentIndex?: number;\n userId?: string;\n }) => this.omegga.savePrefabAsync(path, options),\n );\n rpc.addMethod(\n 'givePrefabToPlayer',\n ({\n path,\n player,\n preserveOwnership = false,\n }: {\n path: string;\n player: string;\n preserveOwnership?: boolean;\n }) => this.omegga.givePrefabToPlayer(path, player, { preserveOwnership }),\n );\n rpc.addMethod(\n 'loadPrefabOnPlayer',\n ({\n path,\n player,\n preserveOwnership = false,\n }: {\n path: string;\n player: string;\n preserveOwnership?: boolean;\n }) => this.omegga.loadPrefabOnPlayer(path, player, { preserveOwnership }),\n );\n rpc.addMethod(\n 'clearBricks',\n ({ target, quiet = false }: { target: string; quiet?: boolean }) =>\n this.omegga.clearBricks(target, quiet),\n );\n rpc.addMethod('clearAllBricks', quiet =>\n this.omegga.clearAllBricks(quiet as unknown as boolean),\n );\n rpc.addMethod('saveBricks', name =>\n this.omegga.saveBricks(name as unknown as string),\n );\n rpc.addMethod(\n 'loadBricks',\n ({\n name,\n offX = 0,\n offY = 0,\n offZ = 0,\n quiet = false,\n }: {\n name: string;\n offX?: number;\n offY?: number;\n offZ?: number;\n quiet?: boolean;\n }) => this.omegga.loadBricks(name, { offX, offY, offZ, quiet }),\n );\n rpc.addMethod(\n 'loadBricksOnPlayer',\n ({\n name,\n player,\n offX = 0,\n offY = 0,\n offZ = 0,\n }: {\n name: string;\n player: string;\n offX?: number;\n offY?: number;\n offZ?: number;\n quiet?: boolean;\n }) => this.omegga.loadBricksOnPlayer(name, player, { offX, offY, offZ }),\n );\n rpc.addMethod('readSaveData', name =>\n this.omegga.readSaveData(name as unknown as string),\n );\n rpc.addMethod('getSaveData', () => this.omegga.getSaveData());\n rpc.addMethod(\n 'loadSaveData',\n ({\n data,\n offX = 0,\n offY = 0,\n offZ = 0,\n quiet = false,\n }: {\n data: WriteSaveObject;\n offX?: number;\n offY?: number;\n offZ?: number;\n quiet?: boolean;\n }) => this.omegga.loadSaveData(data, { offX, offY, offZ, quiet }),\n );\n rpc.addMethod(\n 'loadSaveDataOnPlayer',\n ({\n data,\n player,\n offX = 0,\n offY = 0,\n offZ = 0,\n }: {\n data: WriteSaveObject;\n player: string;\n offX?: number;\n offY?: number;\n offZ?: number;\n quiet?: boolean;\n }) =>\n this.omegga.loadSaveDataOnPlayer(data, player, { offX, offY, offZ }),\n );\n rpc.addMethod('changeMap', map =>\n this.omegga.changeMap(map as unknown as string),\n );\n rpc.addMethod('unload', () => this.unload());\n rpc.addMethod('reload', async () => {\n await this.unload();\n await this.load();\n });\n\n // player related operations\n const addPlayerMethod = (name: string) =>\n rpc.addMethod(`player.${name}`, player =>\n (this.omegga.getPlayer(player as unknown as string) as any)?.[name](),\n );\n rpc.addMethod('player.get', target => {\n let player = this.omegga.getPlayer(target as unknown as string);\n return player && { ...player, host: player.isHost() };\n });\n addPlayerMethod('getRoles');\n addPlayerMethod('getPermissions');\n addPlayerMethod('getNameColor');\n addPlayerMethod('getPosition');\n addPlayerMethod('getPawn');\n addPlayerMethod('getGhostBrick');\n addPlayerMethod('getPaint');\n addPlayerMethod('isCrouched');\n addPlayerMethod('isDead');\n addPlayerMethod('getTemplateBounds');\n addPlayerMethod('getTemplateBoundsData');\n addPlayerMethod('kill');\n addPlayerMethod('getScore');\n addPlayerMethod('getLeaderboard');\n rpc.addMethod(\n 'player.loadDataAtGhostBrick',\n ({\n target,\n data,\n rotate = true,\n offX = 0,\n offY = 0,\n offZ = 0,\n quiet = false,\n }: {\n target: string;\n data: WriteSaveObject;\n rotate?: boolean;\n offX?: number;\n offY?: number;\n offZ?: number;\n quiet?: boolean;\n }) =>\n this.omegga\n .getPlayer(target)\n ?.loadDataAtGhostBrick(data, { rotate, offX, offY, offZ, quiet }),\n );\n rpc.addMethod(\n 'player.loadSaveData',\n ({\n target,\n data,\n offX = 0,\n offY = 0,\n offZ = 0,\n }: {\n target: string;\n data: WriteSaveObject;\n offX?: number;\n offY?: number;\n offZ?: number;\n }) =>\n this.omegga.getPlayer(target)?.loadSaveData(data, { offX, offY, offZ }),\n );\n rpc.addMethod(\n 'player.clearBricks',\n ({ target, quiet = false }: { target: string; quiet?: boolean }) =>\n this.omegga.getPlayer(target)?.clearBricks(quiet),\n );\n rpc.addMethod(\n 'player.loadBricks',\n ({ target, saveName }: { target: string; saveName: string }) =>\n this.omegga.getPlayer(target)?.loadBricks(saveName),\n );\n rpc.addMethod(\n 'player.damage',\n ({ target, amount }: { target: string; amount: number }) =>\n this.omegga.getPlayer(target)?.damage(amount),\n );\n rpc.addMethod(\n 'player.heal',\n ({ target, amount }: { target: string; amount: number }) =>\n this.omegga.getPlayer(target)?.heal(amount),\n );\n rpc.addMethod(\n 'player.giveItem',\n ({ target, item }: { target: string; item: string }) =>\n this.omegga.getPlayer(target)?.giveItem(item as any),\n );\n rpc.addMethod(\n 'player.takeItem',\n ({ target, item }: { target: string; item: string }) =>\n this.omegga.getPlayer(target)?.takeItem(item as any),\n );\n rpc.addMethod(\n 'player.setTeam',\n ({ target, teamIndex }: { target: string; teamIndex: number }) =>\n this.omegga.getPlayer(target)?.setTeam(teamIndex),\n );\n rpc.addMethod(\n 'player.setMinigame',\n ({ target, index }: { target: string; index: number }) =>\n this.omegga.getPlayer(target)?.setMinigame(index),\n );\n rpc.addMethod(\n 'player.setScore',\n ({\n target,\n minigameIndex,\n score,\n }: {\n target: string;\n minigameIndex: number;\n score: number;\n }) => this.omegga.getPlayer(target)?.setScore(minigameIndex, score),\n );\n rpc.addMethod(\n 'player.setLeaderboard',\n ({\n target,\n key,\n value,\n }: {\n target: string;\n key: string;\n value: number;\n }) => this.omegga.getPlayer(target)?.setLeaderboard(key, value),\n );\n\n // plugin related operations\n rpc.addMethod('plugin.get', async name => {\n const plugin = this.omegga.pluginLoader.plugins.find(\n p => p.getName() === (name as unknown as string),\n );\n\n if (plugin) {\n return {\n name,\n documentation: plugin.getDocumentation(),\n loaded: plugin.isLoaded(),\n };\n } else {\n return null;\n }\n });\n\n rpc.addMethod(\n 'plugin.emit',\n async ([name, event, ...args]: [string, string, ...any[]]) => {\n const plugin = this.omegga.pluginLoader.plugins.find(\n p => p.getName() === name,\n );\n\n if (plugin) {\n return plugin.emitPlugin(event, this.getName(), args);\n } else {\n return null;\n }\n },\n );\n }\n\n // emit a custom plugin event\n async emitPlugin(event: string, from: string, args: any[]) {\n return await this.emit('plugin:emit', [event, from, ...args]);\n }\n\n // emit a message to the plugin via the jsonrpc client and expect a response\n emit(type: string, arg?: any) {\n return this.#rpc.request(type, arg);\n }\n\n // emit a message to the plugin via the jsonrpc client, don't expect a response\n notify(type: string, arg?: any) {\n try {\n this.#rpc.notify(type, arg);\n } catch (e) {\n // this only happens if the RPC library is hitting some issues - probably redundant\n }\n }\n}\n"],"names":["Plugin","Logger","spawn","bootstrap","JSONRPCServer","JSONRPCClient","JSONRPCServerAndClient","name","path"],"mappings":"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"}
|
|
@@ -14,6 +14,7 @@ const bootstrap = (omegga) => ({
|
|
|
14
14
|
verbose: omegga.verbose,
|
|
15
15
|
savePath: omegga.savePath,
|
|
16
16
|
worldPath: omegga.worldPath,
|
|
17
|
+
prefabPath: omegga.prefabPath,
|
|
17
18
|
path: omegga.path,
|
|
18
19
|
configPath: omegga.configPath,
|
|
19
20
|
presetPath: omegga.presetPath,
|
|
@@ -44,6 +45,12 @@ const STEAL_PROTOTYPES = {
|
|
|
44
45
|
getSaves: true,
|
|
45
46
|
getWorldPath: true,
|
|
46
47
|
getWorlds: true,
|
|
48
|
+
getPrefabs: true,
|
|
49
|
+
loadPrefab: true,
|
|
50
|
+
loadPrefabOnPlayer: true,
|
|
51
|
+
savePrefab: true,
|
|
52
|
+
savePrefabAsync: true,
|
|
53
|
+
givePrefabToPlayer: true,
|
|
47
54
|
getWorldRevisions: true,
|
|
48
55
|
loadWorld: true,
|
|
49
56
|
loadWorldRevision: true,
|
|
@@ -219,7 +226,7 @@ class ProxyOmegga extends EventEmitter {
|
|
|
219
226
|
clearRegion(region, options) {
|
|
220
227
|
throw badBorrow("clearRegion");
|
|
221
228
|
}
|
|
222
|
-
clearAllBricks(
|
|
229
|
+
clearAllBricks(options) {
|
|
223
230
|
throw badBorrow("clearAllBricks");
|
|
224
231
|
}
|
|
225
232
|
saveBricks(saveName, region) {
|
|
@@ -240,6 +247,24 @@ class ProxyOmegga extends EventEmitter {
|
|
|
240
247
|
getWorlds() {
|
|
241
248
|
throw badBorrow("getWorlds");
|
|
242
249
|
}
|
|
250
|
+
getPrefabs() {
|
|
251
|
+
throw badBorrow("getPrefabs");
|
|
252
|
+
}
|
|
253
|
+
loadPrefab(path, options) {
|
|
254
|
+
throw badBorrow("loadPrefab");
|
|
255
|
+
}
|
|
256
|
+
loadPrefabOnPlayer(path, player2, options) {
|
|
257
|
+
throw badBorrow("loadPrefabOnPlayer");
|
|
258
|
+
}
|
|
259
|
+
savePrefab(path, options) {
|
|
260
|
+
throw badBorrow("savePrefab");
|
|
261
|
+
}
|
|
262
|
+
savePrefabAsync(path, options) {
|
|
263
|
+
throw badBorrow("savePrefabAsync");
|
|
264
|
+
}
|
|
265
|
+
givePrefabToPlayer(path, player2, options) {
|
|
266
|
+
throw badBorrow("givePrefabToPlayer");
|
|
267
|
+
}
|
|
243
268
|
getSavePath(saveName) {
|
|
244
269
|
throw badBorrow("getSavePath");
|
|
245
270
|
}
|