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