diff --git a/MinecraftClient/McClient.cs b/MinecraftClient/McClient.cs index 5493739d..586798ac 100644 --- a/MinecraftClient/McClient.cs +++ b/MinecraftClient/McClient.cs @@ -281,6 +281,20 @@ namespace MinecraftClient } } + /// + /// Retrieve messages from the queue and send. + /// Note: requires external locking. + /// + private void TrySendMessageToServer() + { + while (chatQueue.Count > 0 && nextMessageSendTime < DateTime.Now) + { + string text = chatQueue.Dequeue(); + handler.SendChatMessage(text, playerKeyPair); + nextMessageSendTime = DateTime.Now + Settings.messageCooldown; + } + } + /// /// Called ~10 times per second by the protocol handler /// @@ -295,22 +309,16 @@ namespace MinecraftClient } catch (Exception e) { - if (!(e is ThreadAbortException)) - { + if (e is not ThreadAbortException) Log.Warn("Update: Got error from " + bot.ToString() + ": " + e.ToString()); - } - else throw; //ThreadAbortException should not be caught + else + throw; //ThreadAbortException should not be caught } } lock (chatQueue) { - if (chatQueue.Count > 0 && nextMessageSendTime < DateTime.Now) - { - string text = chatQueue.Dequeue(); - handler.SendChatMessage(text, playerKeyPair); - nextMessageSendTime = DateTime.Now + Settings.messageCooldown; - } + TrySendMessageToServer(); } if (terrainAndMovementsEnabled && locationReceived) @@ -539,7 +547,7 @@ namespace MinecraftClient if (ConsoleIO.BasicIO && text.Length > 0 && text[0] == (char)0x00) { //Process a request from the GUI - string[] command = text.Substring(1).Split((char)0x00); + string[] command = text[1..].Split((char)0x00); switch (command[0].ToLower()) { case "autocomplete": @@ -1148,6 +1156,7 @@ namespace MinecraftClient } } else chatQueue.Enqueue(text); + TrySendMessageToServer(); } } diff --git a/MinecraftClient/Protocol/Handlers/Protocol18.cs b/MinecraftClient/Protocol/Handlers/Protocol18.cs index 9389091f..1d34bd94 100644 --- a/MinecraftClient/Protocol/Handlers/Protocol18.cs +++ b/MinecraftClient/Protocol/Handlers/Protocol18.cs @@ -229,14 +229,22 @@ namespace MinecraftClient.Protocol.Handlers { try { - while (socketWrapper.HasDataAvailable() && !cancelToken.IsCancellationRequested) + while (socketWrapper.HasDataAvailable()) + { packetQueue.Add(ReadNextPacket()); + + if (cancelToken.IsCancellationRequested) + break; + } } catch (System.IO.IOException) { break; } catch (SocketException) { break; } catch (NullReferenceException) { break; } catch (Ionic.Zlib.ZlibException) { break; } + if (cancelToken.IsCancellationRequested) + break; + Thread.Sleep(10); } packetQueue.CompleteAdding();