forked from space-syndicate/space-station-14
Signed-off-by: Prole <172158352+Prole0@users.noreply.github.com> Co-authored-by: PJBot <pieterjan.briers+bot@gmail.com> Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Co-authored-by: Samuka-C <47865393+Samuka-C@users.noreply.github.com> Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> Co-authored-by: Partmedia <kevinz5000@gmail.com> Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Co-authored-by: themias <89101928+themias@users.noreply.github.com> Co-authored-by: Victor Shen <71985089+Vexerot@users.noreply.github.com> Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com> Co-authored-by: Milon <milonpl.git@proton.me> Co-authored-by: Kirus59 <145689588+Kirus59@users.noreply.github.com> Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Co-authored-by: Stomf <5dorkydorks@gmail.com> Co-authored-by: drakewill-CRL <46307022+drakewill-CRL@users.noreply.github.com> Co-authored-by: PraxisMapper <praxismapper@gmail.com> Co-authored-by: EmoGarbage404 <retron404@gmail.com> Co-authored-by: lzk <124214523+lzk228@users.noreply.github.com> Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> Co-authored-by: IProduceWidgets <107586145+IProduceWidgets@users.noreply.github.com> Co-authored-by: TytosB <54259736+TytosB@users.noreply.github.com> Co-authored-by: abadaba695 <spacestation13thingy@gmail.com> Co-authored-by: kosticia <kosticia46@gmail.com> Co-authored-by: Thinbug <101073555+Thinbug0@users.noreply.github.com> Co-authored-by: pathetic meowmeow <uhhadd@gmail.com> Co-authored-by: SlamBamActionman <83650252+SlamBamActionman@users.noreply.github.com> Co-authored-by: Boaz1111 <149967078+Boaz1111@users.noreply.github.com> Co-authored-by: ActiveMammmoth <140334666+ActiveMammmoth@users.noreply.github.com> Co-authored-by: Myra <vasilis@pikachu.systems> Co-authored-by: Whatstone <166147148+whatston3@users.noreply.github.com> Co-authored-by: Pieter-Jan Briers <pieterjan.briers+git@gmail.com> Co-authored-by: K-Dynamic <20566341+K-Dynamic@users.noreply.github.com> Co-authored-by: Gentleman-Bird <dcgreen406@gmail.com> Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Co-authored-by: BIGZi0348 <svalker0348@gmail.com> Co-authored-by: LaCumbiaDelCoronavirus <90893484+LaCumbiaDelCoronavirus@users.noreply.github.com> Co-authored-by: imatsoup <93290208+imatsoup@users.noreply.github.com> Co-authored-by: Matthew Herber <32679887+happyrobot33@users.noreply.github.com> Co-authored-by: Ertanic <36124833+Ertanic@users.noreply.github.com> Co-authored-by: MissKay1994 <15877268+MissKay1994@users.noreply.github.com> Co-authored-by: Errant <35878406+Errant-4@users.noreply.github.com> Co-authored-by: eoineoineoin <helloworld@eoinrul.es> Co-authored-by: Tiniest Shark <head.rebel@yahoo.com> Co-authored-by: nikitosych <boriszyn@gmail.com> Co-authored-by: Tayrtahn <tayrtahn@gmail.com> Co-authored-by: Perry Fraser <perryprog@users.noreply.github.com> Co-authored-by: YoungThug <ramialanbagy@gmail.com> Co-authored-by: beck-thompson <107373427+beck-thompson@users.noreply.github.com> Co-authored-by: metalgearsloth <comedian_vs_clown@hotmail.com> Co-authored-by: Southbridge <7013162+southbridge-fur@users.noreply.github.com> Co-authored-by: Vladislav Suchkov <20380250+murolem@users.noreply.github.com> Co-authored-by: Prole <172158352+Prole0@users.noreply.github.com> Co-authored-by: Unkn0wn_Gh0st <shadowstalkermll@gmail.com> Co-authored-by: 3nderall <101940324+3nderall@users.noreply.github.com> Co-authored-by: Radezolid <snappednexus@gmail.com> Co-authored-by: J <billsmith116@gmail.com> Co-authored-by: Ghagliiarghii <68826635+Ghagliiarghii@users.noreply.github.com> Co-authored-by: chromiumboy <50505512+chromiumboy@users.noreply.github.com> Co-authored-by: youtissoum <51883137+youtissoum@users.noreply.github.com> Co-authored-by: Minemoder5000 <minemoder50000@gmail.com> Co-authored-by: Spanky <scott@wearejacob.com> Co-authored-by: Spessmann <156740760+Spessmann@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: brainfood1183 <113240905+brainfood1183@users.noreply.github.com> Co-authored-by: Deerstop <edainturner@gmail.com> Co-authored-by: B_Kirill <153602297+B-Kirill@users.noreply.github.com> Co-authored-by: archee1 <archee3@hotmail.co.uk> Co-authored-by: Cojoke <83733158+Cojoke-dot@users.noreply.github.com> Co-authored-by: Quantum-cross <7065792+Quantum-cross@users.noreply.github.com> Co-authored-by: poklj <compgeek223@gmail.com> Co-authored-by: Krunklehorn <42424291+Krunklehorn@users.noreply.github.com> Co-authored-by: OnyxTheBrave <131422822+OnyxTheBrave@users.noreply.github.com> Co-authored-by: UpAndLeaves <92269094+Alpha-Two@users.noreply.github.com> Co-authored-by: Flareguy <78941145+Flareguy@users.noreply.github.com> Co-authored-by: Zalycon <84675130+Zalycon@users.noreply.github.com> Co-authored-by: deltanedas <39013340+deltanedas@users.noreply.github.com> Co-authored-by: Verm <32827189+Vermidia@users.noreply.github.com> Co-authored-by: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com> Co-authored-by: ScarKy0 <scarky0@onet.eu> Co-authored-by: Dmitry <57028746+dimm00n@users.noreply.github.com>
228 lines
8.5 KiB
C#
228 lines
8.5 KiB
C#
using System.Globalization;
|
|
using System.Linq;
|
|
using System.Numerics;
|
|
using Robust.Shared.Map;
|
|
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.Sequence;
|
|
using Robust.Shared.Serialization.Markdown.Validation;
|
|
using Robust.Shared.Serialization.Markdown.Value;
|
|
using Robust.Shared.Serialization.TypeSerializers.Interfaces;
|
|
using Robust.Shared.Utility;
|
|
using static Content.Shared.Decals.DecalGridComponent;
|
|
|
|
namespace Content.Shared.Decals
|
|
{
|
|
[TypeSerializer]
|
|
public sealed partial class DecalGridChunkCollectionTypeSerializer : ITypeSerializer<DecalGridChunkCollection, MappingDataNode>
|
|
{
|
|
public ValidationNode Validate(ISerializationManager serializationManager, MappingDataNode node,
|
|
IDependencyCollection dependencies, ISerializationContext? context = null)
|
|
{
|
|
return serializationManager.ValidateNode<Dictionary<Vector2i, Dictionary<uint, Decal>>>(node, context);
|
|
}
|
|
|
|
public DecalGridChunkCollection Read(ISerializationManager serializationManager,
|
|
MappingDataNode node,
|
|
IDependencyCollection dependencies, SerializationHookContext hookCtx, ISerializationContext? context = null,
|
|
ISerializationManager.InstantiationDelegate<DecalGridChunkCollection>? _ = default)
|
|
{
|
|
node.TryGetValue("version", out var versionNode);
|
|
var version = ((ValueDataNode?) versionNode)?.AsInt() ?? 1;
|
|
Dictionary<Vector2i, DecalChunk> dictionary;
|
|
uint nextIndex = 0;
|
|
var ids = new HashSet<uint>();
|
|
|
|
// TODO: Dump this when we don't need support anymore.
|
|
if (version > 1)
|
|
{
|
|
var nodes = (SequenceDataNode) node["nodes"];
|
|
dictionary = new Dictionary<Vector2i, DecalChunk>();
|
|
|
|
foreach (var dNode in nodes)
|
|
{
|
|
var aNode = (MappingDataNode) dNode;
|
|
var data = serializationManager.Read<DecalData>(aNode["node"], hookCtx, context);
|
|
var deckNodes = (MappingDataNode) aNode["decals"];
|
|
|
|
foreach (var (decalUidNode, decalData) in deckNodes)
|
|
{
|
|
var dUid = uint.Parse(decalUidNode, CultureInfo.InvariantCulture);
|
|
var coords = serializationManager.Read<Vector2>(decalData, hookCtx, context);
|
|
|
|
var chunkOrigin = SharedMapSystem.GetChunkIndices(coords, SharedDecalSystem.ChunkSize);
|
|
var chunk = dictionary.GetOrNew(chunkOrigin);
|
|
var decal = new Decal(coords, data.Id, data.Color, data.Angle, data.ZIndex, data.Cleanable);
|
|
|
|
nextIndex = Math.Max(nextIndex, dUid);
|
|
|
|
// Re-used ID somehow
|
|
// This will bump all IDs by up to 1 but will ensure the map is still readable.
|
|
if (!ids.Add(dUid))
|
|
{
|
|
dUid = nextIndex++;
|
|
ids.Add(dUid);
|
|
}
|
|
|
|
chunk.Decals[dUid] = decal;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
dictionary = serializationManager.Read<Dictionary<Vector2i, DecalChunk>>(node, hookCtx, context, notNullableOverride: true);
|
|
|
|
foreach (var decals in dictionary.Values)
|
|
{
|
|
foreach (var uid in decals.Decals.Keys)
|
|
{
|
|
nextIndex = Math.Max(uid, nextIndex);
|
|
}
|
|
}
|
|
}
|
|
|
|
nextIndex++;
|
|
return new DecalGridChunkCollection(dictionary) { NextDecalId = nextIndex };
|
|
}
|
|
|
|
public DataNode Write(ISerializationManager serializationManager,
|
|
DecalGridChunkCollection value, IDependencyCollection dependencies,
|
|
bool alwaysWrite = false,
|
|
ISerializationContext? context = null)
|
|
{
|
|
var lookup = new Dictionary<DecalData, List<uint>>();
|
|
var decalLookup = new Dictionary<uint, Decal>();
|
|
|
|
var allData = new MappingDataNode();
|
|
// Want consistent chunk + decal ordering so diffs aren't mangled
|
|
var nodes = new SequenceDataNode();
|
|
|
|
// Assuming decal indices stay consistent:
|
|
// We'll write decals by
|
|
// - decaldata
|
|
// - decal uid
|
|
// - additional decal data
|
|
|
|
// Build all of the decal lookups first.
|
|
foreach (var chunk in value.ChunkCollection.Values)
|
|
{
|
|
foreach (var (uid, decal) in chunk.Decals)
|
|
{
|
|
var data = new DecalData(decal);
|
|
var existing = lookup.GetOrNew(data);
|
|
existing.Add(uid);
|
|
decalLookup[uid] = decal;
|
|
}
|
|
}
|
|
|
|
var lookupNodes = lookup.Keys.ToList();
|
|
lookupNodes.Sort();
|
|
|
|
foreach (var data in lookupNodes)
|
|
{
|
|
var uids = lookup[data];
|
|
var lookupNode = new MappingDataNode { { "node", serializationManager.WriteValue(data, alwaysWrite, context) } };
|
|
var decks = new MappingDataNode();
|
|
|
|
uids.Sort();
|
|
|
|
foreach (var uid in uids)
|
|
{
|
|
var decal = decalLookup[uid];
|
|
// Inline coordinates
|
|
decks.Add(uid.ToString(), serializationManager.WriteValue(decal.Coordinates, alwaysWrite, context));
|
|
}
|
|
|
|
lookupNode.Add("decals", decks);
|
|
nodes.Add(lookupNode);
|
|
}
|
|
|
|
allData.Add("version", 2.ToString(CultureInfo.InvariantCulture));
|
|
allData.Add("nodes", nodes);
|
|
|
|
return allData;
|
|
}
|
|
|
|
[DataDefinition]
|
|
private readonly partial struct DecalData : IEquatable<DecalData>, IComparable<DecalData>
|
|
{
|
|
[DataField("id")]
|
|
public string Id { get; init; } = string.Empty;
|
|
|
|
[DataField("color")]
|
|
public Color? Color { get; init; }
|
|
|
|
[DataField("angle")]
|
|
public Angle Angle { get; init; } = Angle.Zero;
|
|
|
|
[DataField("zIndex")]
|
|
public int ZIndex { get; init; }
|
|
|
|
[DataField("cleanable")]
|
|
public bool Cleanable { get; init; }
|
|
|
|
public DecalData(string id, Color? color, Angle angle, int zIndex, bool cleanable)
|
|
{
|
|
Id = id;
|
|
Color = color;
|
|
Angle = angle;
|
|
ZIndex = zIndex;
|
|
Cleanable = cleanable;
|
|
}
|
|
|
|
public DecalData(Decal decal)
|
|
{
|
|
Id = decal.Id;
|
|
Color = decal.Color;
|
|
Angle = decal.Angle;
|
|
ZIndex = decal.ZIndex;
|
|
Cleanable = decal.Cleanable;
|
|
}
|
|
|
|
public bool Equals(DecalData other)
|
|
{
|
|
return Id == other.Id &&
|
|
Nullable.Equals(Color, other.Color) &&
|
|
Angle.Equals(other.Angle) &&
|
|
ZIndex == other.ZIndex &&
|
|
Cleanable == other.Cleanable;
|
|
}
|
|
|
|
public override bool Equals(object? obj)
|
|
{
|
|
return obj is DecalData other && Equals(other);
|
|
}
|
|
|
|
public override int GetHashCode()
|
|
{
|
|
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 colorComparison = string.Compare(Color?.ToHex(), other.Color?.ToHex(), StringComparison.Ordinal);
|
|
|
|
if (colorComparison != 0)
|
|
return colorComparison;
|
|
|
|
var angleComparison = Angle.Theta.CompareTo(other.Angle.Theta);
|
|
|
|
if (angleComparison != 0)
|
|
return angleComparison;
|
|
|
|
var zIndexComparison = ZIndex.CompareTo(other.ZIndex);
|
|
if (zIndexComparison != 0)
|
|
return zIndexComparison;
|
|
|
|
return Cleanable.CompareTo(other.Cleanable);
|
|
}
|
|
}
|
|
}
|
|
}
|