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 +