using System.Collections.Generic; using Content.Shared.Materials; using Robust.Shared.GameObjects; using Robust.Shared.Interfaces.Reflection; using Robust.Shared.Interfaces.Serialization; using Robust.Shared.IoC; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Utility; namespace Content.Shared.GameObjects.Components.Materials { /// /// Component to store data such as "this object is made out of steel". /// This is not a storage system for say smelteries. /// [RegisterComponent] public class MaterialComponent : Component { public const string SerializationCache = "mat"; public override string Name => "Material"; public Dictionary MaterialTypes => _materialTypes; private Dictionary _materialTypes; public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); // TODO: Writing. if (serializer.Writing) { return; } if (serializer.TryGetCacheData(SerializationCache, out Dictionary cached)) { _materialTypes = cached.ShallowClone(); return; } _materialTypes = new Dictionary(); if (serializer.TryReadDataField("materials", out List list)) { var protoMan = IoCManager.Resolve(); foreach (var entry in list) { var proto = protoMan.Index(entry.Value); _materialTypes[entry.Key] = proto.Material; } } serializer.SetCacheData(SerializationCache, _materialTypes.ShallowClone()); } class MaterialDataEntry : IExposeData { public object Key; public string Value; public void ExposeData(ObjectSerializer serializer) { if (serializer.Writing) { return; } var refl = IoCManager.Resolve(); Value = serializer.ReadDataField("mat"); var key = serializer.ReadDataField("key"); if (refl.TryParseEnumReference(key, out var @enum)) { Key = @enum; return; } Key = key; } } } public enum MaterialKeys { Stack, } }