public static async Task SerializeAsync(IPacket packet, MinecraftStream stream) { if (packet == null) { throw new ArgumentNullException(nameof(packet)); } if (stream == null) { throw new ArgumentNullException(nameof(stream)); } await stream.Lock.WaitAsync(); await using var dataStream = new MinecraftStream(); if (packet is ChunkDataPacket chunkData) { await chunkData.WriteAsync(dataStream); } else { var valueDict = packet.GetAllObjects().OrderBy(x => x.Key.Order); foreach (var(key, value) in valueDict) { //await Globals.PacketLogger.LogDebugAsync($"Writing value @ {dataStream.Position}: {value} ({value.GetType()})"); var dataType = key.Type; if (dataType == DataType.Auto) { dataType = value.GetType().ToDataType(); } await dataStream.WriteAsync(dataType, key, value); } } var packetLength = packet.Id.GetVarIntLength() + (int)dataStream.Length; await stream.WriteVarIntAsync(packetLength); await stream.WriteVarIntAsync(packet.Id); dataStream.Position = 0; // await dataStream.DumpAsync(packet: packet); await dataStream.CopyToAsync(stream); stream.Lock.Release(); }