Exemple #1
0
        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();
        }