]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Fix decal serialization determinism (#14805)
authormetalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Thu, 23 Mar 2023 12:05:27 +0000 (23:05 +1100)
committerGitHub <noreply@github.com>
Thu, 23 Mar 2023 12:05:27 +0000 (23:05 +1100)
Content.Shared/Decals/DecalGridChunkCollectionTypeSerializer.cs

index ad6b803e767d6a29b47908ad023fe5638d9e57dc..bd48a93e92f2f462fd55676cad90ad8f9b2c66d2 100644 (file)
@@ -1,4 +1,5 @@
 using System.Globalization;
+using System.Linq;
 using Robust.Shared.Map;
 using Robust.Shared.Serialization;
 using Robust.Shared.Serialization.Manager;
@@ -62,9 +63,16 @@ namespace Content.Shared.Decals
 
             var uids = new SortedSet<uint>();
             var uidChunkMap = new Dictionary<uint, Vector2i>();
-            foreach (var (indices, decals) in dictionary)
+            var allIndices = dictionary.Keys.ToList();
+            allIndices.Sort((x, y) => x.X == y.X ? x.Y.CompareTo(y.Y) : x.X.CompareTo(y.X));
+
+            foreach (var indices in allIndices)
             {
-                foreach (var uid in decals.Decals.Keys)
+                var decals = dictionary[indices];
+                var decalUids = decals.Decals.Keys.ToList();
+                decalUids.Sort();
+
+                foreach (var uid in decalUids)
                 {
                     uids.Add(uid);
                     uidChunkMap[uid] = indices;
@@ -126,9 +134,12 @@ namespace Content.Shared.Decals
             }
 
             var lookupIndex = 0;
+            var lookupNodes = lookup.Keys.ToList();
+            lookupNodes.Sort();
 
-            foreach (var (data, uids) in lookup)
+            foreach (var data in lookupNodes)
             {
+                var uids = lookup[data];
                 var lookupNode = new MappingDataNode { { "node", serializationManager.WriteValue(data, alwaysWrite, context) } };
                 var decks = new MappingDataNode();
 
@@ -152,7 +163,7 @@ namespace Content.Shared.Decals
         }
 
         [DataDefinition]
-        private readonly struct DecalData : IEquatable<DecalData>
+        private readonly struct DecalData : IEquatable<DecalData>, IComparable<DecalData>
         {
             [DataField("id")]
             public readonly string Id = string.Empty;
@@ -205,6 +216,19 @@ namespace Content.Shared.Decals
             {
                 return HashCode.Combine(Id, Color, Angle, ZIndex, Cleanable);
             }
+
+            public int CompareTo(DecalData other)
+            {
+                var idComparison = string.Compare(Id, other.Id, StringComparison.Ordinal);
+                if (idComparison != 0)
+                    return idComparison;
+
+                var zIndexComparison = ZIndex.CompareTo(other.ZIndex);
+                if (zIndexComparison != 0)
+                    return zIndexComparison;
+
+                return Cleanable.CompareTo(other.Cleanable);
+            }
         }
     }
 }