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