Fix decal serialization determinism (#14805)
This commit is contained in:
@@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user