using Robust.Shared.Serialization; 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; using static Content.Shared.Decals.DecalGridComponent; 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, SerializationHookContext hookCtx, ISerializationContext? context = null, ISerializationManager.InstantiationDelegate? _ = default) { var dictionary = serializationManager.Read>(node, hookCtx, context, notNullableOverride: true); var uids = new SortedSet(); var uidChunkMap = new Dictionary(); foreach (var (indices, decals) in dictionary) { foreach (var uid in decals.Decals.Keys) { 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].Decals[newUid] = dictionary[indices].Decals[oldUid]; } return new DecalGridComponent.DecalGridChunkCollection(newDict){NextDecalId = nextIndex}; } public DataNode Write(ISerializationManager serializationManager, DecalGridComponent.DecalGridChunkCollection value, IDependencyCollection dependencies, bool alwaysWrite = false, ISerializationContext? context = null) { return serializationManager.WriteValue(value.ChunkCollection, alwaysWrite, context, notNullableOverride: true); } } }