diff --git a/MinecraftClient/McClient.cs b/MinecraftClient/McClient.cs index 00bd910a..5493739d 100644 --- a/MinecraftClient/McClient.cs +++ b/MinecraftClient/McClient.cs @@ -446,6 +446,8 @@ namespace MinecraftClient /// public void OnConnectionLost(ChatBot.DisconnectReason reason, string message) { + handler.Dispose(); + world.Clear(); if (timeoutdetector != null) @@ -761,7 +763,7 @@ namespace MinecraftClient int callingThreadId = Thread.CurrentThread.ManagedThreadId; if (handler != null) { - return handler.GetNetReadThreadId() != callingThreadId; + return handler.GetNetMainThreadId() != callingThreadId; } else { diff --git a/MinecraftClient/Protocol/Handlers/Protocol16.cs b/MinecraftClient/Protocol/Handlers/Protocol16.cs index a819b3a1..1d8dd59c 100644 --- a/MinecraftClient/Protocol/Handlers/Protocol16.cs +++ b/MinecraftClient/Protocol/Handlers/Protocol16.cs @@ -218,7 +218,7 @@ namespace MinecraftClient.Protocol.Handlers /// Get net read thread (main thread) ID /// /// Net read thread ID - public int GetNetReadThreadId() + public int GetNetMainThreadId() { return netRead != null ? netRead.Item1.ManagedThreadId : -1; } diff --git a/MinecraftClient/Protocol/Handlers/Protocol18.cs b/MinecraftClient/Protocol/Handlers/Protocol18.cs index 2036b75b..9389091f 100644 --- a/MinecraftClient/Protocol/Handlers/Protocol18.cs +++ b/MinecraftClient/Protocol/Handlers/Protocol18.cs @@ -76,7 +76,8 @@ namespace MinecraftClient.Protocol.Handlers PacketTypePalette packetPalette; SocketWrapper socketWrapper; DataTypes dataTypes; - Tuple? netRead = null; // main thread + Tuple? netMain = null; // main thread + Tuple? netReader = null; // reader thread ILogger log; RandomNumberGenerator randomGen; @@ -172,7 +173,9 @@ namespace MinecraftClient.Protocol.Handlers /// private void Updater(object? o) { - if (((CancellationToken)o!).IsCancellationRequested) + CancellationToken cancelToken = (CancellationToken)o!; + + if (cancelToken.IsCancellationRequested) return; try @@ -180,7 +183,7 @@ namespace MinecraftClient.Protocol.Handlers Stopwatch stopWatch = new(); while (!packetQueue.IsAddingCompleted) { - ((CancellationToken)o!).ThrowIfCancellationRequested(); + cancelToken.ThrowIfCancellationRequested(); handler.OnUpdate(); @@ -210,7 +213,7 @@ namespace MinecraftClient.Protocol.Handlers catch (ObjectDisposedException) { } catch (OperationCanceledException) { } - if (((CancellationToken)o!).IsCancellationRequested) + if (cancelToken.IsCancellationRequested) return; handler.OnConnectionLost(ChatBot.DisconnectReason.ConnectionLost, ""); @@ -219,13 +222,14 @@ namespace MinecraftClient.Protocol.Handlers /// /// Read and decompress packets. /// - internal void PacketReader() + internal void PacketReader(object? o) { - while (socketWrapper.IsConnected()) + CancellationToken cancelToken = (CancellationToken)o!; + while (socketWrapper.IsConnected() && !cancelToken.IsCancellationRequested) { try { - while (socketWrapper.HasDataAvailable()) + while (socketWrapper.HasDataAvailable() && !cancelToken.IsCancellationRequested) packetQueue.Add(ReadNextPacket()); } catch (System.IO.IOException) { break; } @@ -1449,20 +1453,24 @@ namespace MinecraftClient.Protocol.Handlers /// private void StartUpdating() { - new Thread(new ThreadStart(PacketReader)).Start(); + Thread threadUpdater = new Thread(new ParameterizedThreadStart(Updater)); + threadUpdater.Name = "ProtocolPacketHandler"; + netMain = new Tuple(threadUpdater, new CancellationTokenSource()); + threadUpdater.Start(netMain.Item2.Token); - netRead = new Tuple(new Thread(new ParameterizedThreadStart(Updater)), new CancellationTokenSource()); - netRead.Item1.Name = "ProtocolPacketHandler"; - netRead.Item1.Start(netRead.Item2.Token); + Thread threadReader = new Thread(new ParameterizedThreadStart(PacketReader)); + threadReader.Name = "ProtocolPacketReader"; + netReader = new Tuple(threadReader, new CancellationTokenSource()); + threadReader.Start(netReader.Item2.Token); } /// /// Get net read thread (main thread) ID /// /// Net read thread ID - public int GetNetReadThreadId() + public int GetNetMainThreadId() { - return netRead != null ? netRead.Item1.ManagedThreadId : -1; + return netMain != null ? netMain.Item1.ManagedThreadId : -1; } /// @@ -1472,9 +1480,12 @@ namespace MinecraftClient.Protocol.Handlers { try { - if (netRead != null) + if (netMain != null) { - netRead.Item2.Cancel(); + netMain.Item2.Cancel(); + } + if (netReader != null){ + netReader.Item2.Cancel(); socketWrapper.Disconnect(); } } diff --git a/MinecraftClient/Protocol/IMinecraftCom.cs b/MinecraftClient/Protocol/IMinecraftCom.cs index 5a713257..52bfcac7 100644 --- a/MinecraftClient/Protocol/IMinecraftCom.cs +++ b/MinecraftClient/Protocol/IMinecraftCom.cs @@ -252,6 +252,6 @@ namespace MinecraftClient.Protocol /// Get net read thread (main thread) ID /// /// Net read thread ID - int GetNetReadThreadId(); + int GetNetMainThreadId(); } }