fix(core): Cleans up serialization (#606)
This commit is contained in:
parent
8418d4a7db
commit
cb66bef0e5
7 changed files with 177 additions and 218 deletions
|
|
@ -24,9 +24,6 @@ namespace Server
|
|||
long Position { get; }
|
||||
void Close();
|
||||
void Write(string value);
|
||||
void Write(DateTime value);
|
||||
void Write(TimeSpan value);
|
||||
void Write(decimal value);
|
||||
void Write(long value);
|
||||
void Write(ulong value);
|
||||
void Write(int value);
|
||||
|
|
@ -38,17 +35,120 @@ namespace Server
|
|||
void Write(byte value);
|
||||
void Write(sbyte value);
|
||||
void Write(bool value);
|
||||
void WriteEncodedInt(int value);
|
||||
void Write(IPAddress value);
|
||||
void WriteDeltaTime(DateTime value);
|
||||
void Write(Point3D value);
|
||||
void Write(Point2D value);
|
||||
void Write(Rectangle2D value);
|
||||
void Write(Rectangle3D value);
|
||||
void Write(Map value);
|
||||
void Write(Race value);
|
||||
void Write(ReadOnlySpan<byte> bytes);
|
||||
|
||||
void Write(DateTime value)
|
||||
{
|
||||
var ticks = (value.Kind switch
|
||||
{
|
||||
DateTimeKind.Local => value.ToUniversalTime(),
|
||||
DateTimeKind.Unspecified => value.ToLocalTime().ToUniversalTime(),
|
||||
_ => value
|
||||
}).Ticks;
|
||||
|
||||
Write(ticks);
|
||||
}
|
||||
void WriteDeltaTime(DateTime value)
|
||||
{
|
||||
var ticks = (value.Kind switch
|
||||
{
|
||||
DateTimeKind.Local => value.ToUniversalTime(),
|
||||
DateTimeKind.Unspecified => value.ToLocalTime().ToUniversalTime(),
|
||||
_ => value
|
||||
}).Ticks;
|
||||
|
||||
// Technically supports negative deltas for times in the past
|
||||
Write(ticks - DateTime.UtcNow.Ticks);
|
||||
}
|
||||
void Write(IPAddress value)
|
||||
{
|
||||
Span<byte> stack = stackalloc byte[16];
|
||||
value.TryWriteBytes(stack, out var bytesWritten);
|
||||
Write((byte)bytesWritten);
|
||||
Write(stack[..bytesWritten]);
|
||||
}
|
||||
void Write(TimeSpan value)
|
||||
{
|
||||
Write(value.Ticks);
|
||||
}
|
||||
|
||||
public void Write(decimal value)
|
||||
{
|
||||
var bits = decimal.GetBits(value);
|
||||
|
||||
for (var i = 0; i < 4; ++i)
|
||||
{
|
||||
Write(bits[i]);
|
||||
}
|
||||
}
|
||||
void WriteEncodedInt(int value)
|
||||
{
|
||||
var v = (uint)value;
|
||||
|
||||
while (v >= 0x80)
|
||||
{
|
||||
Write((byte)(v | 0x80));
|
||||
v >>= 7;
|
||||
}
|
||||
|
||||
Write((byte)v);
|
||||
}
|
||||
void Write(Point3D value)
|
||||
{
|
||||
Write(value.m_X);
|
||||
Write(value.m_Y);
|
||||
Write(value.m_Z);
|
||||
}
|
||||
void Write(Point2D value)
|
||||
{
|
||||
Write(value.m_X);
|
||||
Write(value.m_Y);
|
||||
}
|
||||
void Write(Rectangle2D value)
|
||||
{
|
||||
Write(value.Start);
|
||||
Write(value.End);
|
||||
}
|
||||
void Write(Rectangle3D value)
|
||||
{
|
||||
Write(value.Start);
|
||||
Write(value.End);
|
||||
}
|
||||
void Write(Map value) => Write((byte)(value?.MapIndex ?? 0xFF));
|
||||
void Write(Race value) => Write((byte)(value?.RaceIndex ?? 0xFF));
|
||||
void Write(ReadOnlySpan<byte> bytes);
|
||||
unsafe void Write<T>(T value) where T : unmanaged, Enum
|
||||
{
|
||||
var size = sizeof(T);
|
||||
|
||||
switch (size)
|
||||
{
|
||||
default: throw new ArgumentException($"Argument of type {typeof(T)} is not a normal enum");
|
||||
case 1:
|
||||
{
|
||||
Write((byte)1);
|
||||
Write(*(byte*)&value);
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
Write((byte)2);
|
||||
Write(*(ushort*)&value);
|
||||
break;
|
||||
}
|
||||
case 4:
|
||||
{
|
||||
Write((byte)3);
|
||||
WriteEncodedInt(*(int*)&value);
|
||||
break;
|
||||
}
|
||||
case 8:
|
||||
{
|
||||
Write((byte)4);
|
||||
Write(*(ulong*)&value);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
long Seek(long offset, SeekOrigin origin);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue