Fix decal serialization determinism (#14805)

This commit is contained in:
metalgearsloth
2023-03-23 23:05:27 +11:00
committed by GitHub
parent bb78c75acf
commit 635aa7e999

View File

@@ -1,4 +1,5 @@
using System.Globalization; using System.Globalization;
using System.Linq;
using Robust.Shared.Map; using Robust.Shared.Map;
using Robust.Shared.Serialization; using Robust.Shared.Serialization;
using Robust.Shared.Serialization.Manager; using Robust.Shared.Serialization.Manager;
@@ -62,9 +63,16 @@ namespace Content.Shared.Decals
var uids = new SortedSet<uint>(); var uids = new SortedSet<uint>();
var uidChunkMap = new Dictionary<uint, Vector2i>(); 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); uids.Add(uid);
uidChunkMap[uid] = indices; uidChunkMap[uid] = indices;
@@ -126,9 +134,12 @@ namespace Content.Shared.Decals
} }
var lookupIndex = 0; 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 lookupNode = new MappingDataNode { { "node", serializationManager.WriteValue(data, alwaysWrite, context) } };
var decks = new MappingDataNode(); var decks = new MappingDataNode();
@@ -152,7 +163,7 @@ namespace Content.Shared.Decals
} }
[DataDefinition] [DataDefinition]
private readonly struct DecalData : IEquatable<DecalData> private readonly struct DecalData : IEquatable<DecalData>, IComparable<DecalData>
{ {
[DataField("id")] [DataField("id")]
public readonly string Id = string.Empty; public readonly string Id = string.Empty;
@@ -205,6 +216,19 @@ namespace Content.Shared.Decals
{ {
return HashCode.Combine(Id, Color, Angle, ZIndex, Cleanable); 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);
}
} }
} }
} }