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); }
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); }
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(); }
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); }
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(); }