예제 #1
0
        public async Task CopyToAsync(MinecraftStream stream)
        {
            await using var dataStream = new MinecraftStream();
            await dataStream.WriteByteAsync((sbyte)this.Type);

            await dataStream.WriteVarIntAsync(this.Children.Count);

            foreach (CommandNode childNode in this.Children)
            {
                await dataStream.WriteVarIntAsync(childNode.Index);
            }

            if (this.Type.HasFlag(CommandNodeType.HasRedirect))
            {
                //TODO: Add redirect functionality if needed
                await dataStream.WriteVarIntAsync(0);
            }

            if ((this.Type.HasFlag(CommandNodeType.Argument) || this.Type.HasFlag(CommandNodeType.Literal)) && !this.Name.IsNullOrEmpty())
            {
                await dataStream.WriteStringAsync(this.Name);
            }

            if (this.Type.HasFlag(CommandNodeType.Argument))
            {
                await this.Parser.WriteAsync(dataStream);
            }

            dataStream.Position = 0;
            await dataStream.CopyToAsync(stream);
        }
예제 #2
0
        public async Task CopyToAsync(MinecraftStream stream)
        {
            await using var dataStream = new MinecraftStream();
            await dataStream.WriteByteAsync((sbyte)this.Type);

            await dataStream.WriteVarIntAsync(this.Children.Count);

            foreach (var childNode in this.Children.Select(x => x.Index).Distinct())
            {
                await dataStream.WriteVarIntAsync(childNode);
            }

            //if (this.Type.HasFlag(CommandNodeType.HasRedirect))
            //{
            //    //TODO: Add redirect functionality if needed
            //    await dataStream.WriteVarIntAsync(0);
            //}

            if ((this.Type.HasFlag(CommandNodeType.Argument) || this.Type.HasFlag(CommandNodeType.Literal)))
            {
                await dataStream.WriteStringAsync(this.Name);
            }

            if (this.Type.HasFlag(CommandNodeType.Argument))
            {
                await this.Parser.WriteAsync(dataStream);
            }

            dataStream.Position = 0;
            await dataStream.CopyToAsync(stream);
        }
예제 #3
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();
        }
예제 #4
0
        public async Task WriteToAsync(MinecraftStream stream)
        {
            await using var data = new MinecraftStream();
            await this.container.WriteToAsync(data);

            /*await data.WriteAsync(this.BlockLightArray.Data);//Lights get sent in a different packet
             *
             * if (Overworld)
             *  await data.WriteAsync(this.SkyLightArray.Data);*/

            data.Position = 0;
            await data.CopyToAsync(stream);
        }
예제 #5
0
        internal static async Task WriteAsync(this IPacket packet, MinecraftStream stream)
        {
            await stream.Lock.WaitAsync();

            await using var dataStream = new MinecraftStream();
            await packet.WriteAsync(dataStream);

            var packetLength = packet.Id.GetVarIntLength() + (int)dataStream.Length;

            await stream.WriteVarIntAsync(packetLength);

            await stream.WriteVarIntAsync(packet.Id);

            dataStream.Position = 0;
            await dataStream.CopyToAsync(stream);

            stream.Lock.Release();
        }