MappingMapDataMessage.cs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. using System.IO;
  2. using Lidgren.Network;
  3. using Robust.Shared.Network;
  4. using Robust.Shared.Serialization;
  5. using Robust.Shared.Utility;
  6. namespace Content.Shared.Mapping;
  7. public sealed class MappingMapDataMessage : NetMessage
  8. {
  9. public override MsgGroups MsgGroup => MsgGroups.Command;
  10. public override NetDeliveryMethod DeliveryMethod => NetDeliveryMethod.ReliableUnordered;
  11. public ZStdCompressionContext Context = default!;
  12. public string Yml = default!;
  13. public override void ReadFromBuffer(NetIncomingMessage buffer, IRobustSerializer serializer)
  14. {
  15. MsgSize = buffer.LengthBytes;
  16. var uncompressedLength = buffer.ReadVariableInt32();
  17. var compressedLength = buffer.ReadVariableInt32();
  18. var stream = new MemoryStream(compressedLength);
  19. buffer.ReadAlignedMemory(stream, compressedLength);
  20. using var decompress = new ZStdDecompressStream(stream);
  21. using var decompressed = new MemoryStream(uncompressedLength);
  22. decompress.CopyTo(decompressed, uncompressedLength);
  23. decompressed.Position = 0;
  24. serializer.DeserializeDirect(decompressed, out Yml);
  25. }
  26. public override void WriteToBuffer(NetOutgoingMessage buffer, IRobustSerializer serializer)
  27. {
  28. var stream = new MemoryStream();
  29. serializer.SerializeDirect(stream, Yml);
  30. buffer.WriteVariableInt32((int) stream.Length);
  31. stream.Position = 0;
  32. var buf = new byte[ZStd.CompressBound((int) stream.Length)];
  33. var length = Context.Compress2(buf, stream.AsSpan());
  34. buffer.WriteVariableInt32(length);
  35. buffer.Write(buf.AsSpan(0, length));
  36. }
  37. }