Files
RobustToolbox/Robust.Shared/Network/Messages/MsgEntity.cs
2022-03-31 10:24:27 +11:00

82 lines
2.6 KiB
C#

using System;
using System.IO;
using Lidgren.Network;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC;
using Robust.Shared.Serialization;
using Robust.Shared.Timing;
#nullable disable
namespace Robust.Shared.Network.Messages
{
public sealed class MsgEntity : NetMessage
{
public override MsgGroups MsgGroup => MsgGroups.EntityEvent;
public EntityMessageType Type { get; set; }
public EntityEventArgs SystemMessage { get; set; }
public EntityUid EntityUid { get; set; }
public uint NetId { get; set; }
public uint Sequence { get; set; }
public GameTick SourceTick { get; set; }
public override void ReadFromBuffer(NetIncomingMessage buffer)
{
Type = (EntityMessageType)buffer.ReadByte();
SourceTick = buffer.ReadGameTick();
Sequence = buffer.ReadUInt32();
switch (Type)
{
case EntityMessageType.SystemMessage:
{
var serializer = IoCManager.Resolve<IRobustSerializer>();
int length = buffer.ReadVariableInt32();
using var stream = buffer.ReadAlignedMemory(length);
SystemMessage = serializer.Deserialize<EntityEventArgs>(stream);
}
break;
}
}
public override void WriteToBuffer(NetOutgoingMessage buffer)
{
buffer.Write((byte)Type);
buffer.Write(SourceTick);
buffer.Write(Sequence);
switch (Type)
{
case EntityMessageType.SystemMessage:
{
var serializer = IoCManager.Resolve<IRobustSerializer>();
using (var stream = new MemoryStream())
{
serializer.Serialize(stream, SystemMessage);
buffer.WriteVariableInt32((int)stream.Length);
stream.TryGetBuffer(out var segment);
buffer.Write(segment);
}
}
break;
}
}
public override string ToString()
{
var timingData = $"T: {SourceTick} S: {Sequence}";
switch (Type)
{
case EntityMessageType.Error:
return "MsgEntity Error";
case EntityMessageType.SystemMessage:
return $"MsgEntity Comp, {timingData}, {SystemMessage}";
default:
throw new ArgumentOutOfRangeException();
}
}
}
}