diff --git a/MinecraftClient/ChatBots/AutoRelog.cs b/MinecraftClient/ChatBots/AutoRelog.cs
index c384eb7c9f..24e6570ac6 100644
--- a/MinecraftClient/ChatBots/AutoRelog.cs
+++ b/MinecraftClient/ChatBots/AutoRelog.cs
@@ -137,9 +137,10 @@ private void LaunchDelayedReconnection(string? msg)
{
double delay = random.NextDouble() * (Config.Delay.max - Config.Delay.min) + Config.Delay.min;
LogDebugToConsole(string.Format(string.IsNullOrEmpty(msg) ? Translations.bot_autoRelog_reconnect_always : Translations.bot_autoRelog_reconnect, msg));
- LogToConsole(string.Format(Translations.bot_autoRelog_wait, delay));
- System.Threading.Thread.Sleep((int)Math.Floor(delay * 1000));
- ReconnectToTheServer();
+
+ // TODO: Change this translation string to add the retries left text
+ LogToConsole(string.Format(Translations.bot_autoRelog_wait, delay) + $" ({Config.Retries - Configs._BotRecoAttempts} retries left)");
+ ReconnectToTheServer(Config.Retries - Configs._BotRecoAttempts, (int)Math.Floor(delay), true);
}
public static bool OnDisconnectStatic(DisconnectReason reason, string message)
diff --git a/MinecraftClient/McClient.cs b/MinecraftClient/McClient.cs
index 294c3a9711..48f1cbaaea 100644
--- a/MinecraftClient/McClient.cs
+++ b/MinecraftClient/McClient.cs
@@ -153,6 +153,7 @@ public enum MovementType { Sneak, Walk, Sprint }
private static IMinecraftComHandler? instance;
public static IMinecraftComHandler? Instance => instance;
+
///
/// Starts the main chat client, wich will login to the server using the MinecraftCom class.
///
@@ -245,28 +246,48 @@ public McClient(SessionToken session, PlayerKeyPair? playerKeyPair, string serve
return;
- Retry:
+ Retry:
if (timeoutdetector != null)
{
timeoutdetector.Item2.Cancel();
timeoutdetector = null;
}
- if (ReconnectionAttemptsLeft > 0)
+
+ if (!Config.ChatBot.AutoRelog.Enabled)
{
- Log.Info(string.Format(Translations.mcc_reconnect, ReconnectionAttemptsLeft));
- Thread.Sleep(5000);
- ReconnectionAttemptsLeft--;
- Program.Restart();
- }
- else if (InternalConfig.InteractiveMode)
+ if (ReconnectionAttemptsLeft > 0)
+ {
+ Log.Info(string.Format(Translations.mcc_reconnect, ReconnectionAttemptsLeft));
+ Thread.Sleep(5000);
+ ReconnectionAttemptsLeft--;
+ Program.Restart();
+ }
+ else if (InternalConfig.InteractiveMode)
+ {
+ ConsoleInteractive.ConsoleReader.StopReadThread();
+ ConsoleInteractive.ConsoleReader.MessageReceived -= ConsoleReaderOnMessageReceived;
+ ConsoleInteractive.ConsoleReader.OnInputChange -= ConsoleIO.AutocompleteHandler;
+ Program.HandleFailure();
+ }
+
+ throw new Exception("Initialization failed.");
+ }
+ else
{
- ConsoleInteractive.ConsoleReader.StopReadThread();
- ConsoleInteractive.ConsoleReader.MessageReceived -= ConsoleReaderOnMessageReceived;
- ConsoleInteractive.ConsoleReader.OnInputChange -= ConsoleIO.AutocompleteHandler;
- Program.HandleFailure();
- }
+ // The AutoRelog ChatBot will handle reconnection at this point.
+ // This is important, or else we'll have multiple instances of the client running at the same time.
- throw new Exception("Initialization failed.");
+ if (ReconnectionAttemptsLeft == 0)
+ {
+ if (InternalConfig.InteractiveMode)
+ {
+ ConsoleInteractive.ConsoleReader.StopReadThread();
+ ConsoleInteractive.ConsoleReader.MessageReceived -= ConsoleReaderOnMessageReceived;
+ ConsoleInteractive.ConsoleReader.OnInputChange -= ConsoleIO.AutocompleteHandler;
+ Program.HandleFailure();
+ }
+ }
+ }
}
///
@@ -572,7 +593,7 @@ public void OnConnectionLost(ChatBot.DisconnectReason reason, string message)
ConsoleInteractive.ConsoleReader.StopReadThread();
ConsoleInteractive.ConsoleReader.MessageReceived -= ConsoleReaderOnMessageReceived;
ConsoleInteractive.ConsoleReader.OnInputChange -= ConsoleIO.AutocompleteHandler;
- Program.HandleFailure();
+ Program.HandleFailure(message, false, reason);
}
}
diff --git a/MinecraftClient/Program.cs b/MinecraftClient/Program.cs
index 9c126bee32..599ee7229f 100644
--- a/MinecraftClient/Program.cs
+++ b/MinecraftClient/Program.cs
@@ -398,7 +398,12 @@ private static void RequestPassword()
///
private static void InitializeClient()
{
- InternalConfig.MinecraftVersion = Config.Main.Advanced.MinecraftVersion;
+ // Ensure that we use the provided Minecraft version if we can't connect automatically.
+ //
+ // useMcVersionOnce is set to true on HandleFailure()
+ // whenever we are unable to connect to the server and the user provides a version number.
+ if (!useMcVersionOnce)
+ InternalConfig.MinecraftVersion = Config.Main.Advanced.MinecraftVersion;
SessionToken session = new();
PlayerKeyPair? playerKeyPair = null;
@@ -406,7 +411,7 @@ private static void InitializeClient()
ProtocolHandler.LoginResult result = ProtocolHandler.LoginResult.LoginRequired;
string loginLower = ToLowerIfNeed(InternalConfig.Account.Login);
- if (InternalConfig.Account.Password == "-")
+ if (InternalConfig.Account.Password == "-" || InternalConfig.Account.Password == string.Empty)
{
ConsoleIO.WriteLineFormatted("ยง8" + Translations.mcc_offline, acceptnewlines: true);
result = ProtocolHandler.LoginResult.Success;
@@ -749,7 +754,7 @@ public static void HandleFailure(string? errorMessage = null, bool versionError
if (InternalConfig.MinecraftVersion != "")
{
useMcVersionOnce = true;
- Restart();
+ Restart(0, true);
return;
}
}