From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com>
Date: Mon, 1 May 2023 03:41:57 +0000 (+1200)
Subject: Add basic map loader support for entity renaming (#15862)
X-Git-Url: https://git.smokeofanarchy.ru/gitweb.cgi?a=commitdiff_plain;h=90a137c75234784da17ae4c10d80a9613c03648d;p=space-station-14.git
Add basic map loader support for entity renaming (#15862)
---
diff --git a/Content.IntegrationTests/Tests/Chemistry/DispenserTest.cs b/Content.IntegrationTests/Tests/Chemistry/DispenserTest.cs
index 3978dfb100..eebb3358df 100644
--- a/Content.IntegrationTests/Tests/Chemistry/DispenserTest.cs
+++ b/Content.IntegrationTests/Tests/Chemistry/DispenserTest.cs
@@ -15,7 +15,7 @@ public sealed class DispenserTest : InteractionTest
[Test]
public async Task InsertEjectBuiTest()
{
- await SpawnTarget("chem_dispenser");
+ await SpawnTarget("ChemDispenser");
ToggleNeedPower();
// Insert beaker
diff --git a/Content.Server/Maps/MapMigrationSystem.cs b/Content.Server/Maps/MapMigrationSystem.cs
new file mode 100644
index 0000000000..ce11f15fdb
--- /dev/null
+++ b/Content.Server/Maps/MapMigrationSystem.cs
@@ -0,0 +1,76 @@
+using System.Diagnostics.CodeAnalysis;
+using System.IO;
+using System.Linq;
+using Robust.Server.GameObjects;
+using Robust.Server.Maps;
+using Robust.Shared.ContentPack;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Serialization.Markdown;
+using Robust.Shared.Serialization.Markdown.Mapping;
+using Robust.Shared.Serialization.Markdown.Value;
+using Robust.Shared.Utility;
+
+namespace Content.Server.Maps;
+
+///
+/// Performs basic map migration operations by listening for engine events.
+///
+public sealed class MapMigrationSystem : EntitySystem
+{
+ [Dependency] private readonly IPrototypeManager _protoMan = default!;
+ [Dependency] private readonly IResourceManager _resMan = default!;
+
+ private const string MigrationFile = "/migration.yml";
+
+ public override void Initialize()
+ {
+ base.Initialize();
+ SubscribeLocalEvent(OnBeforeReadEvent);
+
+#if DEBUG
+ if (!TryReadFile(out var mappings))
+ return;
+
+ foreach (var node in mappings.Values)
+ {
+ var newId = ((ValueDataNode) node).Value;
+ if (!string.IsNullOrEmpty(newId) && newId != "null")
+ DebugTools.Assert(_protoMan.HasIndex(newId));
+ }
+#endif
+ }
+
+ private bool TryReadFile([NotNullWhen(true)] out MappingDataNode? mappings)
+ {
+ mappings = null;
+ var path = new ResPath(MigrationFile);
+ if (!_resMan.TryContentFileRead(path, out var stream))
+ return false;
+
+ using var reader = new StreamReader(stream, EncodingHelpers.UTF8);
+ var documents = DataNodeParser.ParseYamlStream(reader).FirstOrDefault();
+
+ if (documents == null)
+ return false;
+
+ mappings = (MappingDataNode) documents.Root;
+ return true;
+ }
+
+ private void OnBeforeReadEvent(BeforeEntityReadEvent ev)
+ {
+ if (!TryReadFile(out var mappings))
+ return;
+
+ foreach (var (key, value) in mappings)
+ {
+ if (key is not ValueDataNode keyNode || value is not ValueDataNode valueNode)
+ continue;
+
+ if (string.IsNullOrWhiteSpace(valueNode.Value) || valueNode.Value == "null")
+ ev.DeletedPrototypes.Add(keyNode.Value);
+ else
+ ev.RenamedPrototypes.Add(keyNode.Value, valueNode.Value);
+ }
+ }
+}
diff --git a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml
index 33da740127..a2b8313d3a 100644
--- a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml
+++ b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml
@@ -364,7 +364,7 @@
- type: Sprite
state: medical
- type: MachineBoard
- prototype: chem_dispenser
+ prototype: ChemDispenser
requirements:
Capacitor: 1
materialRequirements:
diff --git a/Resources/Prototypes/Entities/Structures/Dispensers/chem.yml b/Resources/Prototypes/Entities/Structures/Dispensers/chem.yml
index af3c39192d..44babe2411 100644
--- a/Resources/Prototypes/Entities/Structures/Dispensers/chem.yml
+++ b/Resources/Prototypes/Entities/Structures/Dispensers/chem.yml
@@ -1,5 +1,5 @@
- type: entity
- id: chem_dispenser
+ id: ChemDispenser
name: chemical dispenser
parent: ReagentDispenserBase
description: An industrial grade chemical dispenser with a sizeable chemical supply.
@@ -27,8 +27,8 @@
- type: Machine
board: ChemDispenserMachineCircuitboard
- type: Wires
- BoardName: "chem_dispenser"
- LayoutId: chem_dispenser
+ BoardName: "ChemDispenser"
+ LayoutId: ChemDispenser
- type: UpgradePowerDraw
powerDrawMultiplier: 0.75
scaling: Exponential
diff --git a/Resources/migration.yml b/Resources/migration.yml
new file mode 100644
index 0000000000..99e6b3bb6d
--- /dev/null
+++ b/Resources/migration.yml
@@ -0,0 +1,11 @@
+# basic dictionary that maps old entity ids to new entity ids.
+# an empty or "null" string results in the entity getting deleted.
+
+# e.g., you can swap all walls with windows and delete all tables by adding lines like:
+#
+# Window: WallSolid
+# WallSolid: Window
+# Table: null
+
+chem_dispenser: ChemDispenser
+