omegga 1.8.0 → 1.9.0

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,27 @@
4
4
 
5
5
  - Future features go here
6
6
 
7
+ ## 1.9.0 - 2026-07-05
8
+
9
+ Wire graph log events and a brs-js 3.0.0 upgrade for native brdb/brz reading.
10
+
11
+ - Plugins: Add `wirelog` event, emitted for each `[Wire Graph]` console log with the raw text
12
+ - Plugins: Add `wirecmd:command` event, emitted when a `[Wire Graph]` log starts with a command word (lowercased) followed by space-separated args
13
+ - Update brs-js to 3.2.1 and expose brdb/brz features on `OMEGGA_UTIL.brdb`
14
+ - World revisions are now read directly from the `.brdb` file instead of the game console, so `getWorldRevisions` no longer requires the server to be running
15
+ - Plugins: Add `OMEGGA_UTIL.Sqlite` for opening sqlite files (or brdb files)
16
+ - Plugins: `loadSaveData`/`loadSaveDataOnPlayer`/`getSaveData` are back using `brs-js` 3
17
+ - Fix `clearRegion`, `clearAllBricks`, `loadSaveData`, `getSaveData`, in safe plugins
18
+
19
+ ## 1.8.1 - 2026-07-03
20
+
21
+ Prefab support for EA3, replacing the removed `.brs` bricks commands.
22
+
23
+ - Plugins: Add prefab methods (`loadPrefab`, `savePrefab`, `savePrefabAsync`, `givePrefabToPlayer`, `loadPrefabOnPlayer`, `getPrefabs`)
24
+ - Plugins: `clearRegion`/`clearAllBricks` route to the new world clear commands on EA3 and can optionally clear entities
25
+ - Plugins: Deprecate the `.brs` bricks methods removed by the game (`saveBricks`, `loadBricks`, `getSaveData`, `loadBricksOnPlayer`, etc.) - they warn and no-op
26
+ - Commands: Warn when a plugin writes a console command the running game version has removed
27
+
7
28
  ## 1.8.0 - 2026-06-27
8
29
 
9
30
  Huge breaking changes on in console commands for EA3...
package/README.md CHANGED
@@ -891,7 +891,9 @@ Register custom `/commands` by returning `{registeredCommands: ['foo', 'bar']}`
891
891
  | `event:NAME` | [>player from click<, ...args] | Runs when an interact component has `event:NAME: arg1,arg2,arg\,3, | |
892
892
  | `mapchange` | \[{map}\] | Runs when the map changes | |
893
893
  | `autorestart` | [autorestart config] | Runs server has an autorestart scheduled | |
894
- | `minigamejoin` | {player: {name, id}; minigameName: string} | Runs when a player joins a minigame. Note that minigameName is not unique between minigames. minigameName will be null if player leaves all minigames. This will run before `join` | |
894
+ | `minigamejoin` | {player: {name, id}; minigameName: string} | **Deprecated as of EA3.** Runs when a player joins a minigame. Note that minigameName is not unique between minigames. minigameName will be null if player leaves all minigames. This will run before `join` | |
895
+ | `wirelog` | [raw string] | Runs when a `[Wire Graph]` log line is emitted. `raw` is the text after the `[Wire Graph] ` prefix | |
896
+ | `wirecmd:command` | [...args] | Runs when a `[Wire Graph]` log starts with `command args`. `command` is lowercased; args are the remaining space-separated words | |
895
897
 
896
898
  ### Folder Structure
897
899
 
@@ -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":"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"}
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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"}
@@ -11,6 +11,7 @@ const init = require("./init.js");
11
11
  const mapChange = require("./mapChange.js");
12
12
  const interact = require("./interact.js");
13
13
  const minigameJoin = require("./minigameJoin.js");
14
+ const wire = require("./wire.js");
14
15
  const MATCHERS = [
15
16
  join.default,
16
17
  leave.default,
@@ -22,7 +23,8 @@ const MATCHERS = [
22
23
  init.default,
23
24
  mapChange.default,
24
25
  interact.default,
25
- minigameJoin.default
26
+ minigameJoin.default,
27
+ wire.default
26
28
  ];
27
29
  exports.default = MATCHERS;
28
30
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/omegga/matchers/index.ts"],"sourcesContent":["import { MatchGenerator } from './types';\n\nimport join from './join';\n// 'join' event => { name, id, state, controller }\n\nimport leave from './leave';\n// 'leave' event => { name, id, state, controller }\n\nimport chat from './chat';\n// 'chat' event => name, message; 'chatcmd:command' event => name, [...args]\n// 'kick' event => name, kicker, reason\n\nimport command from './command';\n// 'cmd:command' event => name, args (string)\n\nimport auth from './auth';\n// assigns host, 'host' event, 'start' event, 'unauthorized' event\n\nimport exit from './exit';\n// 'exit' event\n\nimport version from './version';\n// 'version' event, check game version\n\nimport init from './init';\n// watch loginit for any funny business\n\nimport mapChange from './mapChange';\n// 'mapchange' event\n\n// interaction event\nimport interact from './interact';\n\n// minigame join event\nimport minigameJoin from './minigameJoin';\n\nexport default [\n join,\n leave,\n chat,\n command,\n auth,\n exit,\n version,\n init,\n mapChange,\n interact,\n minigameJoin,\n] as MatchGenerator<any>[];\n"],"names":["join","leave","chat","command","auth","exit","version","init","mapChange","interact","minigameJoin"],"mappings":";;;;;;;;;;;;;AAoCA,MAAA,WAAe;AAAA,EACbA,KAAAA;AAAAA,EACAC,MAAAA;AAAAA,EACAC,KAAAA;AAAAA,EACAC,QAAAA;AAAAA,EACAC,KAAAA;AAAAA,EACAC,KAAAA;AAAAA,EACAC,QAAAA;AAAAA,EACAC,KAAAA;AAAAA,EACAC,UAAAA;AAAAA,EACAC,SAAAA;AAAAA,EACAC,aAAAA;AACF;;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/omegga/matchers/index.ts"],"sourcesContent":["import { MatchGenerator } from './types';\n\nimport join from './join';\n// 'join' event => { name, id, state, controller }\n\nimport leave from './leave';\n// 'leave' event => { name, id, state, controller }\n\nimport chat from './chat';\n// 'chat' event => name, message; 'chatcmd:command' event => name, [...args]\n// 'kick' event => name, kicker, reason\n\nimport command from './command';\n// 'cmd:command' event => name, args (string)\n\nimport auth from './auth';\n// assigns host, 'host' event, 'start' event, 'unauthorized' event\n\nimport exit from './exit';\n// 'exit' event\n\nimport version from './version';\n// 'version' event, check game version\n\nimport init from './init';\n// watch loginit for any funny business\n\nimport mapChange from './mapChange';\n// 'mapchange' event\n\n// interaction event\nimport interact from './interact';\n\n// minigame join event\nimport minigameJoin from './minigameJoin';\n\nimport wire from './wire';\n// 'wirelog' event => raw; 'wirecmd:command' event => [...args]\n\nexport default [\n join,\n leave,\n chat,\n command,\n auth,\n exit,\n version,\n init,\n mapChange,\n interact,\n minigameJoin,\n wire,\n] as MatchGenerator<any>[];\n"],"names":["join","leave","chat","command","auth","exit","version","init","mapChange","interact","minigameJoin","wire"],"mappings":";;;;;;;;;;;;;;AAuCA,MAAA,WAAe;AAAA,EACbA,KAAAA;AAAAA,EACAC,MAAAA;AAAAA,EACAC,KAAAA;AAAAA,EACAC,QAAAA;AAAAA,EACAC,KAAAA;AAAAA,EACAC,KAAAA;AAAAA,EACAC,QAAAA;AAAAA,EACAC,KAAAA;AAAAA,EACAC,UAAAA;AAAAA,EACAC,SAAAA;AAAAA,EACAC,aAAAA;AAAAA,EACAC,KAAAA;AACF;;"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const wire = (omegga) => {
4
+ const wireRegExp = /^\[Wire Graph\] (?<raw>.*)$/;
5
+ return {
6
+ // listen for wire graph messages
7
+ pattern(_line, logMatch) {
8
+ if (!logMatch) return;
9
+ const { generator, data } = logMatch.groups;
10
+ if (generator !== "LogBrickadia") return;
11
+ const match = data.match(wireRegExp);
12
+ if (!match) return;
13
+ return { raw: match.groups.raw };
14
+ },
15
+ // when there's a match, emit the wire log event
16
+ callback({ raw }) {
17
+ omegga.emit("wirelog", raw);
18
+ const [cmd, ...args] = raw.split(" ");
19
+ if (cmd.length > 0) {
20
+ omegga.emit("wirecmd:" + cmd.toLowerCase(), ...args);
21
+ omegga.emit("wirecmd", cmd.toLowerCase(), ...args);
22
+ }
23
+ }
24
+ };
25
+ };
26
+ exports.default = wire;
27
+ //# sourceMappingURL=wire.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wire.js","sources":["../../../src/omegga/matchers/wire.ts"],"sourcesContent":["import { MatchGenerator } from './types';\n\nconst wire: MatchGenerator<{ raw: string }> = omegga => {\n // pattern to match wire graph log messages\n // e.g. `LogBrickadia: [Wire Graph] test`\n const wireRegExp = /^\\[Wire Graph\\] (?<raw>.*)$/;\n\n return {\n // listen for wire graph messages\n pattern(_line, logMatch) {\n // line is not generic console log\n if (!logMatch) return;\n\n const { generator, data } = logMatch.groups;\n // check if log is a brickadia log\n if (generator !== 'LogBrickadia') return;\n\n // match the wire graph log pattern\n const match = data.match(wireRegExp);\n if (!match) return;\n\n return { raw: match.groups.raw };\n },\n // when there's a match, emit the wire log event\n callback({ raw }) {\n omegga.emit('wirelog', raw);\n\n // wire command parsing, emit `wirecmd:test` when `test ...` is logged\n const [cmd, ...args] = raw.split(' ');\n if (cmd.length > 0) {\n omegga.emit('wirecmd:' + cmd.toLowerCase(), ...args);\n omegga.emit('wirecmd', cmd.toLowerCase(), ...args);\n }\n },\n };\n};\n\nexport default wire;\n"],"names":[],"mappings":";;AAEA,MAAM,OAAwC,CAAA,WAAU;AAGtD,QAAM,aAAa;AAEnB,SAAO;AAAA;AAAA,IAEL,QAAQ,OAAO,UAAU;AAEvB,UAAI,CAAC,SAAU;AAEf,YAAM,EAAE,WAAW,KAAA,IAAS,SAAS;AAErC,UAAI,cAAc,eAAgB;AAGlC,YAAM,QAAQ,KAAK,MAAM,UAAU;AACnC,UAAI,CAAC,MAAO;AAEZ,aAAO,EAAE,KAAK,MAAM,OAAO,IAAA;AAAA,IAC7B;AAAA;AAAA,IAEA,SAAS,EAAE,OAAO;AAChB,aAAO,KAAK,WAAW,GAAG;AAG1B,YAAM,CAAC,KAAK,GAAG,IAAI,IAAI,IAAI,MAAM,GAAG;AACpC,UAAI,IAAI,SAAS,GAAG;AAClB,eAAO,KAAK,aAAa,IAAI,YAAA,GAAe,GAAG,IAAI;AACnD,eAAO,KAAK,WAAW,IAAI,YAAA,GAAe,GAAG,IAAI;AAAA,MACnD;AAAA,IACF;AAAA,EAAA;AAEJ;;"}
@@ -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)