From 2abaa6406bc1b980ef0343527b6a60a0039f2a97 Mon Sep 17 00:00:00 2001 From: NoLifeKing Date: Thu, 21 Jul 2022 10:08:02 +0200 Subject: [PATCH] fix: Newer Forge versions needs to get started differently. (And use different java versions and so on) Also fixes ability to properly launch server when it's done. (Helps if you enter the entire path) --- .../FabricMethods.cs | 2 +- .../ForgeMethods.cs | 25 ++++++++-- .../Program.cs | 6 +-- .../StartupScript.cs | 48 +++++++++++++++++++ 4 files changed, 72 insertions(+), 9 deletions(-) diff --git a/CurseForge.Minecraft.Serverpack.Launcher/FabricMethods.cs b/CurseForge.Minecraft.Serverpack.Launcher/FabricMethods.cs index 6e0cb91..28d7578 100644 --- a/CurseForge.Minecraft.Serverpack.Launcher/FabricMethods.cs +++ b/CurseForge.Minecraft.Serverpack.Launcher/FabricMethods.cs @@ -7,7 +7,7 @@ namespace CurseForge.Minecraft.Serverpack.Launcher { partial class Program { - private static async Task InstallFabricAsync(string installPath, string minecraftVersion, string loaderVersion, string javaArgs, bool startServer) + private static async Task InstallFabricAsync(string installPath, string minecraftVersion, string loaderVersion, string javaArgs) { var fabricInstaller = Directory.EnumerateFiles(installPath).FirstOrDefault(f => f.Contains("fabric-installer-") && f.EndsWith(".jar")); if (fabricInstaller == null) diff --git a/CurseForge.Minecraft.Serverpack.Launcher/ForgeMethods.cs b/CurseForge.Minecraft.Serverpack.Launcher/ForgeMethods.cs index ec5ab25..4c76f8f 100644 --- a/CurseForge.Minecraft.Serverpack.Launcher/ForgeMethods.cs +++ b/CurseForge.Minecraft.Serverpack.Launcher/ForgeMethods.cs @@ -7,7 +7,7 @@ namespace CurseForge.Minecraft.Serverpack.Launcher { partial class Program { - private static async Task InstallForgeAsync(string installPath, string javaArgs, bool startServer) + private static async Task InstallForgeAsync(string installPath, string minecraftVersion, string modloaderVersion, string javaArgs) { var forgeInstaller = Directory.EnumerateFiles(installPath).FirstOrDefault(f => f.Contains("forge-") && f.Contains("-installer.jar") && f.EndsWith(".jar")); if (forgeInstaller == null) @@ -20,7 +20,13 @@ private static async Task InstallForgeAsync(string installPath, string javaArgs, "--installServer" }; - await RunProcessAsync(installPath, GetJavaExecutable(), false, arguments); + var mcVersion = new Version(minecraftVersion); + + var javaPath = mcVersion.Minor <= 16 ? GetJavaExecutable() : Path.Combine(installPath, "runtime", "bin", GetJavaExecutable()); + + await RunProcessAsync(installPath, javaPath, false, arguments); + + var runFile = Path.Combine(installPath, OperatingSystem.IsWindows() ? "run.bat" : "run.sh"); var forgeLoader = Directory.EnumerateFiles(installPath, "*.jar", SearchOption.AllDirectories).FirstOrDefault(f => f.Contains("forge-") && !f.Contains("-installer.jar") && f.EndsWith(".jar")); @@ -29,9 +35,18 @@ private static async Task InstallForgeAsync(string installPath, string javaArgs, Console.WriteLine("Could not find the loader, please launch server manually"); } - var javaPath = Path.Combine(installPath, "runtime", "bin", GetJavaExecutable()); - - CreateLaunchScriptIfMissing(installPath, javaPath, javaArgs, forgeLoader); + // This is if Forge started using their new run-files, instead of putting the jar in the folder + if (File.Exists(runFile)) + { + var newForgePath = Path.Combine(installPath, "libraries", "net", "minecraftforge", "forge"); + var forgeVersion = Directory.EnumerateDirectories(newForgePath).FirstOrDefault(); + var configFile = Path.Combine(forgeVersion, OperatingSystem.IsWindows() ? "win_args.txt" : "unix_args.txt"); + CreateSpecialLaunchScriptIfMissing(installPath, javaPath, javaArgs, $"@{configFile}"); + } + else + { + CreateLaunchScriptIfMissing(installPath, javaPath, javaArgs, forgeLoader); + } } } } diff --git a/CurseForge.Minecraft.Serverpack.Launcher/Program.cs b/CurseForge.Minecraft.Serverpack.Launcher/Program.cs index e5c024c..a89070f 100644 --- a/CurseForge.Minecraft.Serverpack.Launcher/Program.cs +++ b/CurseForge.Minecraft.Serverpack.Launcher/Program.cs @@ -252,10 +252,10 @@ private static async Task InstallServer(uint modId, uint fileId, string pat switch (modLoader) { case MinecraftModloader.Fabric: - await InstallFabricAsync(installPath, minecraftVersion, modloaderVersion, javaArgs, startServer); + await InstallFabricAsync(installPath, minecraftVersion, modloaderVersion, javaArgs); break; case MinecraftModloader.Forge: - await InstallForgeAsync(installPath, javaArgs, startServer); + await InstallForgeAsync(installPath, minecraftVersion, modloaderVersion, javaArgs); break; case MinecraftModloader.Unknown: Console.WriteLine("Error: Could not determine modloader, bailing out"); @@ -264,7 +264,7 @@ private static async Task InstallServer(uint modId, uint fileId, string pat if (startServer) { - await RunProcessAsync(installPath, OperatingSystem.IsWindows() ? "start-server.bat" : "./start-server.sh", true); + await RunProcessAsync(installPath, Path.Combine(installPath, OperatingSystem.IsWindows() ? "start-server.bat" : "start-server.sh"), true); } else { diff --git a/CurseForge.Minecraft.Serverpack.Launcher/StartupScript.cs b/CurseForge.Minecraft.Serverpack.Launcher/StartupScript.cs index a1c4113..b5fb1af 100644 --- a/CurseForge.Minecraft.Serverpack.Launcher/StartupScript.cs +++ b/CurseForge.Minecraft.Serverpack.Launcher/StartupScript.cs @@ -6,6 +6,53 @@ namespace CurseForge.Minecraft.Serverpack.Launcher { partial class Program { + private static void CreateSpecialLaunchScriptIfMissing(string installPath, string javaPath, string javaArgs, params string[] arguments) + { + if (OperatingSystem.IsWindows()) + { + var launchScript = Path.Combine(installPath, "start-server.bat"); + + if (!File.Exists(launchScript)) + { + File.WriteAllText(launchScript, $@"@echo OFF +cd {installPath} +{javaPath} {javaArgs} -Dsun.stdout.encoding=UTF-8 {string.Join(" ", arguments)} nogui +echo Server has stopped, press any key to continue +pause"); + } + } + else + { + var launchScript = Path.Combine(installPath, "start-server.sh"); + + if (!File.Exists(launchScript)) + { + File.WriteAllText(launchScript, $@"#!/bin/sh +cd {installPath} +{javaPath} {javaArgs} -Dsun.stdout.encoding=UTF-8 {string.Join(" ", arguments)} nogui"); + + var p = new Process() + { + StartInfo = new ProcessStartInfo() + { + FileName = "/bin/chmod", + Arguments = $"+x {launchScript}", + UseShellExecute = false, + CreateNoWindow = true, + RedirectStandardOutput = true, + RedirectStandardError = true, + RedirectStandardInput = true + } + }; + + p.Start(); + p.StandardOutput.ReadToEnd(); + p.WaitForExit(); + + } + } + } + private static void CreateLaunchScriptIfMissing(string installPath, string javaPath, string javaArgs, string jarFile) { if (OperatingSystem.IsWindows()) @@ -17,6 +64,7 @@ private static void CreateLaunchScriptIfMissing(string installPath, string javaP File.WriteAllText(launchScript, $@"@echo OFF cd {installPath} {javaPath} {javaArgs} -Dsun.stdout.encoding=UTF-8 -jar {jarFile} nogui +echo Server has stopped, press any key to continue pause"); } }