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 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...
@@ -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
- ClearAll: c("Bricks.ClearAll", "br.Bricks.ClearAll"),
35
- ClearRegion: c("Bricks.ClearRegion", "br.Bricks.ClearRegion"),
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
- Load: c("Bricks.Load", "br.Bricks.Load"),
155
- LoadTemplate: c("Bricks.LoadTemplate"),
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
- Save: c("Bricks.Save", "br.Bricks.Save"),
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
- SaveRegion: c("Bricks.SaveRegion", "br.Bricks.SaveRegion"),
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
- LoadAdditive: c("BR.World.LoadAdditive"),
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(quiet) {
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
  }