diff --git a/Components/MineSharp.Protocol/Packets/Clientbound/Play/DisconnectPacket.cs b/Components/MineSharp.Protocol/Packets/Clientbound/Play/DisconnectPacket.cs new file mode 100644 index 00000000..f9660c84 --- /dev/null +++ b/Components/MineSharp.Protocol/Packets/Clientbound/Play/DisconnectPacket.cs @@ -0,0 +1,43 @@ +using MineSharp.ChatComponent; +using MineSharp.Core.Common; +using MineSharp.Data; +using MineSharp.Data.Protocol; + +namespace MineSharp.Protocol.Packets.Clientbound.Play; +#pragma warning disable CS1591 +/// +/// Disconnect packet for play +/// +public class DisconnectPacket : IPacket +{ + /// + public PacketType Type => PacketType.CB_Play_KickDisconnect; + + /// + /// The reason for being disconnected + /// + public Chat Reason { get; set; } + + /// + /// Create a new instance + /// + /// + public DisconnectPacket(Chat reason) + { + this.Reason = reason; + } + + /// + public void Write(PacketBuffer buffer, MinecraftData version) + { + buffer.WriteString(this.Reason.Json); + } + + /// + public static IPacket Read(PacketBuffer buffer, MinecraftData version) + { + string reason = buffer.ReadString(); + return new DisconnectPacket(new Chat(reason, version)); + } +} +#pragma warning restore CS1591 diff --git a/Components/MineSharp.Protocol/Packets/Handlers/PlayPacketHandler.cs b/Components/MineSharp.Protocol/Packets/Handlers/PlayPacketHandler.cs index ba887738..dc848be1 100644 --- a/Components/MineSharp.Protocol/Packets/Handlers/PlayPacketHandler.cs +++ b/Components/MineSharp.Protocol/Packets/Handlers/PlayPacketHandler.cs @@ -1,4 +1,4 @@ -using MineSharp.Data; +using MineSharp.Data; using MineSharp.Data.Protocol; using MineSharp.Protocol.Packets.Clientbound.Play; using MineSharp.Protocol.Packets.Serverbound.Play; @@ -24,6 +24,7 @@ public Task HandleIncoming(IPacket packet) KeepAlivePacket keepAlive => HandleKeepAlive(keepAlive), BundleDelimiterPacket bundleDelimiter => HandleBundleDelimiter(bundleDelimiter), PingPacket ping => HandlePing(ping), + DisconnectPacket disconnect => HandleDisconnect(disconnect), _ => Task.CompletedTask }; } @@ -34,7 +35,7 @@ public Task HandleOutgoing(IPacket packet) } public bool HandlesIncoming(PacketType type) - => type is PacketType.CB_Play_KeepAlive or PacketType.CB_Play_BundleDelimiter or PacketType.CB_Play_Ping; + => type is PacketType.CB_Play_KeepAlive or PacketType.CB_Play_BundleDelimiter or PacketType.CB_Play_Ping or PacketType.CB_Play_KickDisconnect; private Task HandleKeepAlive(KeepAlivePacket packet) { @@ -53,4 +54,10 @@ private Task HandlePing(PingPacket ping) this._client.SendPacket(new PongPacket(ping.Id)); return Task.CompletedTask; } + + private Task HandleDisconnect(DisconnectPacket packet) + { + _ = Task.Run(() => this._client.Disconnect(packet.Reason.Json)); + return Task.CompletedTask; + } } diff --git a/Components/MineSharp.Protocol/Packets/PacketPalette.cs b/Components/MineSharp.Protocol/Packets/PacketPalette.cs index 568207c5..dc33f4df 100644 --- a/Components/MineSharp.Protocol/Packets/PacketPalette.cs +++ b/Components/MineSharp.Protocol/Packets/PacketPalette.cs @@ -1,4 +1,4 @@ -using MineSharp.Core.Common; +using MineSharp.Core.Common; using MineSharp.Data; using MineSharp.Data.Protocol; using MineSharp.Protocol.Packets.Clientbound.Configuration; @@ -18,6 +18,7 @@ using SBChatPacket = MineSharp.Protocol.Packets.Serverbound.Play.ChatPacket; using LoginDisconnectPacket = MineSharp.Protocol.Packets.Clientbound.Login.DisconnectPacket; using ConfigurationDisconnectPacket = MineSharp.Protocol.Packets.Clientbound.Configuration.DisconnectPacket; +using PlayDisconnectPacket = MineSharp.Protocol.Packets.Clientbound.Play.DisconnectPacket; using CBConfigurationKeepAlivePacket = MineSharp.Protocol.Packets.Clientbound.Configuration.KeepAlivePacket; using SBConfigurationKeepAlivePacket = MineSharp.Protocol.Packets.Serverbound.Configuration.KeepAlivePacket; using CBPluginMessagePacket = MineSharp.Protocol.Packets.Clientbound.Configuration.PluginMessagePacket; @@ -149,7 +150,8 @@ private static void InitializePackets() RegisterPacket(PacketType.CB_Play_ChunkBatchStart); RegisterPacket(PacketType.CB_Play_ChunkBatchFinished); RegisterPacket(PacketType.CB_Play_Ping); - + RegisterPacket(PacketType.CB_Play_KickDisconnect); + RegisterPacket(PacketType.SB_Play_KeepAlive); RegisterPacket(PacketType.SB_Play_Position); RegisterPacket(PacketType.SB_Play_PositionLook);