Skip to content

Commit 2abaa64

Browse files
committed
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)
1 parent c8f5132 commit 2abaa64

File tree

4 files changed

+72
-9
lines changed

4 files changed

+72
-9
lines changed

CurseForge.Minecraft.Serverpack.Launcher/FabricMethods.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace CurseForge.Minecraft.Serverpack.Launcher
77
{
88
partial class Program
99
{
10-
private static async Task InstallFabricAsync(string installPath, string minecraftVersion, string loaderVersion, string javaArgs, bool startServer)
10+
private static async Task InstallFabricAsync(string installPath, string minecraftVersion, string loaderVersion, string javaArgs)
1111
{
1212
var fabricInstaller = Directory.EnumerateFiles(installPath).FirstOrDefault(f => f.Contains("fabric-installer-") && f.EndsWith(".jar"));
1313
if (fabricInstaller == null)

CurseForge.Minecraft.Serverpack.Launcher/ForgeMethods.cs

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ namespace CurseForge.Minecraft.Serverpack.Launcher
77
{
88
partial class Program
99
{
10-
private static async Task InstallForgeAsync(string installPath, string javaArgs, bool startServer)
10+
private static async Task InstallForgeAsync(string installPath, string minecraftVersion, string modloaderVersion, string javaArgs)
1111
{
1212
var forgeInstaller = Directory.EnumerateFiles(installPath).FirstOrDefault(f => f.Contains("forge-") && f.Contains("-installer.jar") && f.EndsWith(".jar"));
1313
if (forgeInstaller == null)
@@ -20,7 +20,13 @@ private static async Task InstallForgeAsync(string installPath, string javaArgs,
2020
"--installServer"
2121
};
2222

23-
await RunProcessAsync(installPath, GetJavaExecutable(), false, arguments);
23+
var mcVersion = new Version(minecraftVersion);
24+
25+
var javaPath = mcVersion.Minor <= 16 ? GetJavaExecutable() : Path.Combine(installPath, "runtime", "bin", GetJavaExecutable());
26+
27+
await RunProcessAsync(installPath, javaPath, false, arguments);
28+
29+
var runFile = Path.Combine(installPath, OperatingSystem.IsWindows() ? "run.bat" : "run.sh");
2430

2531
var forgeLoader = Directory.EnumerateFiles(installPath, "*.jar", SearchOption.AllDirectories).FirstOrDefault(f => f.Contains("forge-") && !f.Contains("-installer.jar") && f.EndsWith(".jar"));
2632

@@ -29,9 +35,18 @@ private static async Task InstallForgeAsync(string installPath, string javaArgs,
2935
Console.WriteLine("Could not find the loader, please launch server manually");
3036
}
3137

32-
var javaPath = Path.Combine(installPath, "runtime", "bin", GetJavaExecutable());
33-
34-
CreateLaunchScriptIfMissing(installPath, javaPath, javaArgs, forgeLoader);
38+
// This is if Forge started using their new run-files, instead of putting the jar in the folder
39+
if (File.Exists(runFile))
40+
{
41+
var newForgePath = Path.Combine(installPath, "libraries", "net", "minecraftforge", "forge");
42+
var forgeVersion = Directory.EnumerateDirectories(newForgePath).FirstOrDefault();
43+
var configFile = Path.Combine(forgeVersion, OperatingSystem.IsWindows() ? "win_args.txt" : "unix_args.txt");
44+
CreateSpecialLaunchScriptIfMissing(installPath, javaPath, javaArgs, $"@{configFile}");
45+
}
46+
else
47+
{
48+
CreateLaunchScriptIfMissing(installPath, javaPath, javaArgs, forgeLoader);
49+
}
3550
}
3651
}
3752
}

CurseForge.Minecraft.Serverpack.Launcher/Program.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -252,10 +252,10 @@ private static async Task<int> InstallServer(uint modId, uint fileId, string pat
252252
switch (modLoader)
253253
{
254254
case MinecraftModloader.Fabric:
255-
await InstallFabricAsync(installPath, minecraftVersion, modloaderVersion, javaArgs, startServer);
255+
await InstallFabricAsync(installPath, minecraftVersion, modloaderVersion, javaArgs);
256256
break;
257257
case MinecraftModloader.Forge:
258-
await InstallForgeAsync(installPath, javaArgs, startServer);
258+
await InstallForgeAsync(installPath, minecraftVersion, modloaderVersion, javaArgs);
259259
break;
260260
case MinecraftModloader.Unknown:
261261
Console.WriteLine("Error: Could not determine modloader, bailing out");
@@ -264,7 +264,7 @@ private static async Task<int> InstallServer(uint modId, uint fileId, string pat
264264

265265
if (startServer)
266266
{
267-
await RunProcessAsync(installPath, OperatingSystem.IsWindows() ? "start-server.bat" : "./start-server.sh", true);
267+
await RunProcessAsync(installPath, Path.Combine(installPath, OperatingSystem.IsWindows() ? "start-server.bat" : "start-server.sh"), true);
268268
}
269269
else
270270
{

CurseForge.Minecraft.Serverpack.Launcher/StartupScript.cs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,53 @@ namespace CurseForge.Minecraft.Serverpack.Launcher
66
{
77
partial class Program
88
{
9+
private static void CreateSpecialLaunchScriptIfMissing(string installPath, string javaPath, string javaArgs, params string[] arguments)
10+
{
11+
if (OperatingSystem.IsWindows())
12+
{
13+
var launchScript = Path.Combine(installPath, "start-server.bat");
14+
15+
if (!File.Exists(launchScript))
16+
{
17+
File.WriteAllText(launchScript, $@"@echo OFF
18+
cd {installPath}
19+
{javaPath} {javaArgs} -Dsun.stdout.encoding=UTF-8 {string.Join(" ", arguments)} nogui
20+
echo Server has stopped, press any key to continue
21+
pause");
22+
}
23+
}
24+
else
25+
{
26+
var launchScript = Path.Combine(installPath, "start-server.sh");
27+
28+
if (!File.Exists(launchScript))
29+
{
30+
File.WriteAllText(launchScript, $@"#!/bin/sh
31+
cd {installPath}
32+
{javaPath} {javaArgs} -Dsun.stdout.encoding=UTF-8 {string.Join(" ", arguments)} nogui");
33+
34+
var p = new Process()
35+
{
36+
StartInfo = new ProcessStartInfo()
37+
{
38+
FileName = "/bin/chmod",
39+
Arguments = $"+x {launchScript}",
40+
UseShellExecute = false,
41+
CreateNoWindow = true,
42+
RedirectStandardOutput = true,
43+
RedirectStandardError = true,
44+
RedirectStandardInput = true
45+
}
46+
};
47+
48+
p.Start();
49+
p.StandardOutput.ReadToEnd();
50+
p.WaitForExit();
51+
52+
}
53+
}
54+
}
55+
956
private static void CreateLaunchScriptIfMissing(string installPath, string javaPath, string javaArgs, string jarFile)
1057
{
1158
if (OperatingSystem.IsWindows())
@@ -17,6 +64,7 @@ private static void CreateLaunchScriptIfMissing(string installPath, string javaP
1764
File.WriteAllText(launchScript, $@"@echo OFF
1865
cd {installPath}
1966
{javaPath} {javaArgs} -Dsun.stdout.encoding=UTF-8 -jar {jarFile} nogui
67+
echo Server has stopped, press any key to continue
2068
pause");
2169
}
2270
}

0 commit comments

Comments
 (0)