using Robust.Shared.Serialization.Manager; using Robust.Shared.Serialization.Markdown; using Robust.Shared.Serialization.Markdown.Mapping; using Robust.Shared.Serialization.Markdown.Validation; using Robust.Shared.Serialization.TypeSerializers.Interfaces; namespace Content.Shared.Decals { [TypeSerializer] public sealed class DecalGridChunkCollectionTypeSerializer : ITypeSerializer { public ValidationNode Validate(ISerializationManager serializationManager, MappingDataNode node, IDependencyCollection dependencies, ISerializationContext? context = null) { return serializationManager.ValidateNode>>(node, context); } public DecalGridComponent.DecalGridChunkCollection Read(ISerializationManager serializationManager, MappingDataNode node, IDependencyCollection dependencies, bool skipHook, ISerializationContext? context = null, ISerializationManager.InstantiationDelegate? _ = default) { var dictionary = serializationManager.Read>>(node, context, skipHook); var uids = new SortedSet(); var uidChunkMap = new Dictionary(); foreach (var (indices, decals) in dictionary) { foreach (var (uid, _) in decals) { uids.Add(uid); uidChunkMap[uid] = indices; } } var uidMap = new Dictionary(); uint nextIndex = 0; foreach (var uid in uids) { uidMap[uid] = nextIndex++; } var newDict = new Dictionary>(); foreach (var (oldUid, newUid) in uidMap) { var indices = uidChunkMap[oldUid]; if(!newDict.ContainsKey(indices)) newDict[indices] = new(); newDict[indices][newUid] = dictionary[indices][oldUid]; } return new DecalGridComponent.DecalGridChunkCollection(newDict){NextUid = nextIndex}; } public DataNode Write(ISerializationManager serializationManager, DecalGridComponent.DecalGridChunkCollection value, IDependencyCollection dependencies, bool alwaysWrite = false, ISerializationContext? context = null) { return serializationManager.WriteValue(value.ChunkCollection, alwaysWrite, context); } } }