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(); int length = buffer.ReadVariableInt32(); using var stream = buffer.ReadAlignedMemory(length); SystemMessage = serializer.Deserialize(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(); 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(); } } } }