From d3f150ba12949db0b578875836ba915cc0c6f7f0 Mon Sep 17 00:00:00 2001 From: ORelio Date: Sun, 18 Oct 2020 13:09:46 +0200 Subject: [PATCH] Allow force-enabling Forge support for 1.13+ (#1184) Skip login step and join even when forge info is missing in server info. However, this only works for 1.13+. Server info retrieval is required for enabling Forge support on older Minecraft versions. --- MinecraftClient/Program.cs | 21 ++++++++++++++-- .../Protocol/Handlers/Forge/ForgeInfo.cs | 18 ++++++++++++++ .../Protocol/Handlers/Protocol18Forge.cs | 24 +++++++++++++++++++ MinecraftClient/Protocol/ProtocolHandler.cs | 20 ++++++++++++++++ .../Resources/config/MinecraftClient.ini | 6 ++--- MinecraftClient/Resources/lang/en.ini | 2 ++ MinecraftClient/Settings.cs | 17 +++++++++++-- 7 files changed, 101 insertions(+), 7 deletions(-) diff --git a/MinecraftClient/Program.cs b/MinecraftClient/Program.cs index e77fbf82..cbceb48d 100644 --- a/MinecraftClient/Program.cs +++ b/MinecraftClient/Program.cs @@ -124,7 +124,7 @@ namespace MinecraftClient //Test line to troubleshoot invisible colors if (Settings.DebugMessages) { - Translations.WriteLineFormatted(Translations.Get("debug.color_test", "[0123456789ABCDEF]: [§00§11§22§33§44§55§66§77§88§99§aA§bB§cC§dD§eE§fF§r]")); + ConsoleIO.WriteLineFormatted(Translations.Get("debug.color_test", "[0123456789ABCDEF]: [§00§11§22§33§44§55§66§77§88§99§aA§bB§cC§dD§eE§fF§r]")); } //Load cached sessions from disk if necessary @@ -254,7 +254,8 @@ namespace MinecraftClient } } - if (protocolversion == 0 || Settings.ServerMayHaveForge) + //Retrieve server info if version is not manually set OR if need to retrieve Forge information + if (protocolversion == 0 || Settings.ServerAutodetectForge || (Settings.ServerForceForge && !ProtocolHandler.ProtocolMayForceForge(protocolversion))) { if (protocolversion != 0) Translations.WriteLine("mcc.forge"); @@ -266,6 +267,22 @@ namespace MinecraftClient } } + //Force-enable Forge support? + if (Settings.ServerForceForge && forgeInfo == null) + { + if (ProtocolHandler.ProtocolMayForceForge(protocolversion)) + { + Translations.WriteLine("mcc.forgeforce"); + forgeInfo = ProtocolHandler.ProtocolForceForge(protocolversion); + } + else + { + HandleFailure(Translations.Get("error.forgeforce"), true, ChatBots.AutoRelog.DisconnectReason.ConnectionLost); + return; + } + } + + //Proceed to server login if (protocolversion != 0) { try diff --git a/MinecraftClient/Protocol/Handlers/Forge/ForgeInfo.cs b/MinecraftClient/Protocol/Handlers/Forge/ForgeInfo.cs index cd9d3732..1d4e61cf 100755 --- a/MinecraftClient/Protocol/Handlers/Forge/ForgeInfo.cs +++ b/MinecraftClient/Protocol/Handlers/Forge/ForgeInfo.cs @@ -33,6 +33,24 @@ namespace MinecraftClient.Protocol.Handlers.Forge public List Mods; internal FMLVersion Version; + /// + /// Create a new ForgeInfo with the given version. + /// + /// FML version to use + internal ForgeInfo(FMLVersion fmlVersion) + { + switch (fmlVersion) + { + case FMLVersion.FML2: + this.Mods = new List(); + this.Mods.Add(new ForgeMod("forge", "ANY")); + this.Version = fmlVersion; + break; + default: + throw new InvalidOperationException(Translations.Get("error.forgeforce")); + } + } + /// /// Create a new ForgeInfo from the given data. /// diff --git a/MinecraftClient/Protocol/Handlers/Protocol18Forge.cs b/MinecraftClient/Protocol/Handlers/Protocol18Forge.cs index c273d468..46c47142 100644 --- a/MinecraftClient/Protocol/Handlers/Protocol18Forge.cs +++ b/MinecraftClient/Protocol/Handlers/Protocol18Forge.cs @@ -446,6 +446,30 @@ namespace MinecraftClient.Protocol.Handlers || ServerInfoCheckForgeSub(jsonData, ref forgeInfo, FMLVersion.FML2); // MC 1.13 and greater } + /// + /// Server Info: Check if we can force-enable Forge support for this Minecraft version without using server Ping + /// + /// Minecraft protocol version + /// TRUE if we can force-enable Forge support without using server Ping + public static bool ServerMayForceForge(int protocolVersion) + { + return protocolVersion >= ProtocolHandler.MCVer2ProtocolVersion("1.13"); + } + + /// + /// Server Info: Consider Forge to be enabled regardless of server Ping + /// + /// Minecraft protocol version + /// ForgeInfo item stating that Forge is enabled + public static ForgeInfo ServerForceForge(int protocolVersion) + { + if (ServerMayForceForge(protocolVersion)) + { + return new ForgeInfo(FMLVersion.FML2); + } + else throw new InvalidOperationException(Translations.Get("error.forgeforce")); + } + /// /// Server Info: Check for For Forge on a Minecraft server Ping result (Handles FML and FML2 /// diff --git a/MinecraftClient/Protocol/ProtocolHandler.cs b/MinecraftClient/Protocol/ProtocolHandler.cs index b0efaf28..fe1b8c32 100644 --- a/MinecraftClient/Protocol/ProtocolHandler.cs +++ b/MinecraftClient/Protocol/ProtocolHandler.cs @@ -305,6 +305,26 @@ namespace MinecraftClient.Protocol } } + /// + /// Check if we can force-enable Forge support for a Minecraft version without using server Ping + /// + /// Minecraft protocol version + /// TRUE if we can force-enable Forge support without using server Ping + public static bool ProtocolMayForceForge(int protocol) + { + return Protocol18Forge.ServerMayForceForge(protocol); + } + + /// + /// Server Info: Consider Forge to be enabled regardless of server Ping + /// + /// Minecraft protocol version + /// ForgeInfo item stating that Forge is enabled + public static ForgeInfo ProtocolForceForge(int protocol) + { + return Protocol18Forge.ServerForceForge(protocol); + } + public enum LoginResult { OtherError, ServiceUnavailable, SSLError, Success, WrongPassword, AccountMigrated, NotPremium, LoginRequired, InvalidToken, InvalidResponse, NullError }; /// diff --git a/MinecraftClient/Resources/config/MinecraftClient.ini b/MinecraftClient/Resources/config/MinecraftClient.ini index 56e7d8dd..65578ca6 100644 --- a/MinecraftClient/Resources/config/MinecraftClient.ini +++ b/MinecraftClient/Resources/config/MinecraftClient.ini @@ -18,9 +18,9 @@ internalcmdchar=slash # Use 'none', 'slash' or 'backslash' splitmessagedelay=2 # Seconds between each part of a long message botowners=Player1,Player2,Player3 # Name list or myfile.txt, one name per line. !Server admins can impersonate owners! botmessagedelay=2 # Seconds to delay between message a bot makes to avoid accidental spam -mcversion=auto # Use 'auto' or '1.X.X' values -mcforge=auto # Use 'auto' or 'false' -brandinfo=mcc # Use 'mcc','vanilla', or 'none' +mcversion=auto # Use 'auto' or '1.X.X' values. Allows to skip server info retrieval. +mcforge=auto # Use 'auto', 'false' or 'true'. Force-enabling only works for MC 1.13+. +brandinfo=mcc # Use 'mcc', 'vanilla', or 'none'. This is how MCC identifies itself to the server. chatbotlogfile= # Leave empty for no logfile privatemsgscmdname=tell # Used by RemoteControl bot showsystemmessages=true # System messages for server ops diff --git a/MinecraftClient/Resources/lang/en.ini b/MinecraftClient/Resources/lang/en.ini index 0da44018..380a92f1 100644 --- a/MinecraftClient/Resources/lang/en.ini +++ b/MinecraftClient/Resources/lang/en.ini @@ -13,6 +13,7 @@ mcc.ip=Server IP : mcc.use_version=§8Using Minecraft version {0} (protocol v{1}) mcc.unknown_version=§8Unknown or not supported MC version {0}.\nSwitching to autodetection mode. mcc.forge=Checking if server is running Forge... +mcc.forgeforce=Force-enabling Forge support. mcc.resolve=Resolving {0}... mcc.found=§8Found server {0}:{1} for domain {2} mcc.not_found=§8Failed to perform SRV lookup for {0}\n{1}: {2} @@ -54,6 +55,7 @@ debug.request=§8Performing request to {0} error.ping=Failed to ping this IP. error.unsupported=Cannot connect to the server : This version is not supported ! error.determine=Failed to determine server version. +error.forgeforce=Cannot force Forge support for this Minecraft version! error.login=Minecraft Login failed : error.login.migrated=Account migrated, use e-mail as username. error.login.server=Login servers are unavailable. Please try again later. diff --git a/MinecraftClient/Settings.cs b/MinecraftClient/Settings.cs index 6a1c95d1..a7bbe86f 100644 --- a/MinecraftClient/Settings.cs +++ b/MinecraftClient/Settings.cs @@ -28,7 +28,8 @@ namespace MinecraftClient public static string ServerIP = ""; public static ushort ServerPort = 25565; public static string ServerVersion = ""; - public static bool ServerMayHaveForge = true; + public static bool ServerForceForge = false; + public static bool ServerAutodetectForge = true; public static string SingleCommand = ""; public static string ConsoleTitle = ""; @@ -270,7 +271,6 @@ namespace MinecraftClient case "playerheadicon": playerHeadAsIcon = str2bool(argValue); break; case "chatbotlogfile": chatbotLogFile = argValue; break; case "mcversion": ServerVersion = argValue; break; - case "mcforge": ServerMayHaveForge = argValue.ToLower() == "auto" || str2bool(argValue); break; case "splitmessagedelay": splitMessageDelay = TimeSpan.FromSeconds(str2int(argValue)); break; case "scriptcache": CacheScripts = str2bool(argValue); break; case "showsystemmessages": DisplaySystemMessages = str2bool(argValue); break; @@ -377,6 +377,19 @@ namespace MinecraftClient ResolveSrvRecordsShortTimeout = false; } break; + + case "mcforge": + if (argValue.ToLower() == "auto") + { + ServerAutodetectForge = true; + ServerForceForge = false; + } + else + { + ServerAutodetectForge = false; + ServerForceForge = str2bool(argValue); + } + break; } break;