Files
2025-07-06 00:23:46 +02:00

142 lines
3.0 KiB
C#

using System;
using System.Linq;
using System.Runtime.Serialization;
using System.Security.Permissions;
using BinaryPack.Attributes;
namespace NitroxModel.DataStructures;
/// <summary>
/// Used to reference a Unity GameObject and makes it possible to synchronize a GameObject between connected players.
/// </summary>
[Serializable]
[DataContract]
public class NitroxId : ISerializable, IEquatable<NitroxId>, IComparable<NitroxId>
{
[DataMember(Order = 1)]
[SerializableMember]
private Guid guid { get; init; }
[IgnoreConstructor]
public NitroxId()
{
guid = Guid.NewGuid();
}
/// <summary>
/// Create a NitroxId from a string
/// </summary>
/// <param name="str">a NitroxID as string</param>
public NitroxId(string str)
{
guid = new Guid(str);
}
public NitroxId(Guid guid)
{
this.guid = guid;
}
public NitroxId(byte[] bytes)
{
guid = new Guid(bytes);
}
protected NitroxId(SerializationInfo info, StreamingContext context)
{
byte[] bytes = (byte[])info.GetValue("id", typeof(byte[]));
guid = new Guid(bytes);
}
public virtual void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("id", guid.ToByteArray());
}
public static bool operator ==(NitroxId id1, NitroxId id2)
{
if (id1 is null)
{
if (id2 is null)
{
return true;
}
return false;
}
return id1.Equals(id2);
}
public static bool operator !=(NitroxId id1, NitroxId id2)
{
return !(id1 == id2);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj))
{
return false;
}
if (obj.GetType() != GetType())
{
return false;
}
return Equals((NitroxId)obj);
}
public bool Equals(NitroxId other)
{
if (ReferenceEquals(null, other))
{
return false;
}
if (ReferenceEquals(this, other))
{
return true;
}
return guid.Equals(other.guid);
}
public override int GetHashCode()
{
return guid.GetHashCode();
}
public override string ToString()
{
return guid.ToString();
}
[IgnoredMember]
private static int[] byteOrder = { 15, 14, 13, 12, 11, 10, 9, 8, 6, 7, 4, 5, 0, 1, 2, 3 };
public NitroxId Increment()
{
byte[] bytes = guid.ToByteArray();
bool canIncrement = byteOrder.Any(i => ++bytes[i] != 0);
Guid nextGuid = new(canIncrement ? bytes : new byte[16]);
return new NitroxId(nextGuid);
}
public int CompareTo(NitroxId other)
{
if (ReferenceEquals(this, other))
{
return 0;
}
if (ReferenceEquals(null, other))
{
return 1;
}
return guid.CompareTo(other.guid);
}
}