Add basic map loader support for entity renaming (#15862)

This commit is contained in:
Leon Friedrich
2023-05-01 15:41:57 +12:00
committed by GitHub
parent 0ac66082d1
commit 90a137c752
5 changed files with 92 additions and 5 deletions

View File

@@ -15,7 +15,7 @@ public sealed class DispenserTest : InteractionTest
[Test]
public async Task InsertEjectBuiTest()
{
await SpawnTarget("chem_dispenser");
await SpawnTarget("ChemDispenser");
ToggleNeedPower();
// Insert beaker

View File

@@ -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;
/// <summary>
/// Performs basic map migration operations by listening for engine <see cref="MapLoaderSystem"/> events.
/// </summary>
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<BeforeEntityReadEvent>(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<EntityPrototype>(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);
}
}
}

View File

@@ -364,7 +364,7 @@
- type: Sprite
state: medical
- type: MachineBoard
prototype: chem_dispenser
prototype: ChemDispenser
requirements:
Capacitor: 1
materialRequirements:

View File

@@ -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

11
Resources/migration.yml Normal file
View File

@@ -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