diff --git a/gradle.properties b/gradle.properties index 9d52cc0b..75c81daa 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -project_version=1.9.4 +project_version=1.9.5 diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/Launcher.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/Launcher.java index 68ada078..e54bcdf5 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/Launcher.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/Launcher.java @@ -15,7 +15,7 @@ @Getter @RequiredArgsConstructor public class Launcher implements HeadlessMc { - public static final String VERSION = "1.9.4"; + public static final String VERSION = "1.9.5"; @Delegate private final HeadlessMc headlessMc; diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/LauncherProperties.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/LauncherProperties.java index 774f3442..cc27a9c6 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/LauncherProperties.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/LauncherProperties.java @@ -61,4 +61,6 @@ public interface LauncherProperties extends HmcProperties { Property ASSETS_CHECK_FILE_HASH = bool("hmc.assets.check.file.hash"); Property ASSETS_BACKOFF = bool("hmc.assets.backoff"); + Property SET_LIBRARY_DIR = bool("hmc.set.library.dir"); + } diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/FabricCommand.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/FabricCommand.java index af6292d9..6f74bb0d 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/FabricCommand.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/FabricCommand.java @@ -72,7 +72,10 @@ private void install(Version version, File jarFile, String... args) bestVersion = ParseUtil.parseI(javaVersion); } - val java = ctx.getJavaService().findBestVersion(bestVersion); + Java java = ctx.getJavaService().findBestVersion(bestVersion); + if (java == null) { + java = ctx.getJavaService().findBestVersion(8); + } val jvmArgs = CommandUtil.getOption("--jvm", args); List jvm = Collections.emptyList(); diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/forge/ForgeRepoFormat.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/forge/ForgeRepoFormat.java index 1e6d6c42..17fa1785 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/forge/ForgeRepoFormat.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/command/forge/ForgeRepoFormat.java @@ -2,7 +2,9 @@ public interface ForgeRepoFormat { // E.g. https://maven.neoforged.net/releases/net/neoforged/neoforge/20.4.195/neoforge-20.4.195-installer.jar - String NEO_FORGE_URL = " https://maven.neoforged.net/releases/net/neoforged/neoforge/"; + String NEO_FORGE_URL = "https://maven.neoforged.net/releases/net/neoforged/neoforge/"; + // Exception for 1.20.1: https://maven.neoforged.net/releases/net/neoforged/forge/1.20.1-47.1.104/forge-1.20.1-47.1.104-installer.jar + String NEO_FORGE_ALTERNATIVE_URL = "https://maven.neoforged.net/releases/net/neoforged/forge/"; // E.g. https://maven.minecraftforge.net/net/minecraftforge/forge/1.20.2-48.1.0/forge-1.20.2-48.1.0-installer.jar String LEX_FORGE_URL = "https://maven.minecraftforge.net/net/minecraftforge/forge/"; @@ -28,11 +30,21 @@ static ForgeRepoFormat neoForge() { return new ForgeRepoFormat() { @Override public String getFileName(ForgeVersion version) { + // Exception for 1.20.1: https://maven.neoforged.net/releases/net/neoforged/forge/1.20.1-47.1.104/forge-1.20.1-47.1.104-installer.jar + if ("1.20.1".equals(version.getVersion())) { + return "forge-" + version.getFullName() + "-installer.jar"; + } + return "neoforge-" + version.getName() + "-installer.jar"; } @Override public String getUrl(String baseUrl, ForgeVersion version) { + // Exception for 1.20.1: https://maven.neoforged.net/releases/net/neoforged/forge/1.20.1-47.1.104/forge-1.20.1-47.1.104-installer.jar + if ("1.20.1".equals(version.getVersion()) && baseUrl.equals(NEO_FORGE_URL)) { + return NEO_FORGE_ALTERNATIVE_URL + version.getFullName() + "/" + getFileName(version); + } + return baseUrl + version.getName() + "/" + getFileName(version); } }; diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/java/JavaService.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/java/JavaService.java index e39111e8..4fba8e9c 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/java/JavaService.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/java/JavaService.java @@ -63,6 +63,7 @@ public Java findBestVersion(Integer version) { return java; } + // uhhhhhhhhhhhhhhhhhhhh what?!?!?! if (java.getVersion() > version && (best == null || best.getVersion() - version > java.getVersion() - version)) { best = java; diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/Command.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/Command.java index 3977c938..9f19a65f 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/Command.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/Command.java @@ -43,8 +43,12 @@ public List build() throws LaunchException, AuthException { val result = new ArrayList(); result.add(java.getExecutable()); - result.addAll(Arrays.asList(config.get(LauncherProperties.JVM_ARGS, - new String[0]))); + result.addAll(Arrays.asList(config.get(LauncherProperties.JVM_ARGS, new String[0]))); + if (config.get(LauncherProperties.SET_LIBRARY_DIR, true)) { + System.out.println(launcher.getMcFiles().getDir("libraries").getAbsolutePath()); + result.add("-DlibraryDirectory=" + launcher.getMcFiles().getDir("libraries").getAbsolutePath()); + } + result.addAll(jvmArgs); if (runtime diff --git a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/LaunchOptions.java b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/LaunchOptions.java index af712886..96f91792 100644 --- a/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/LaunchOptions.java +++ b/headlessmc-launcher/src/main/java/me/earth/headlessmc/launcher/launch/LaunchOptions.java @@ -44,7 +44,7 @@ public LaunchOptionsBuilder parseFlags( // if offline only allow launching with the lwjgl flag! if (!lwjgl && launcher.getAccountManager().getOfflineChecker().isOffline()) { log.warning("You are offline, game will start in headless mode!"); - //lwjgl = true; + lwjgl = true; } return this diff --git a/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/launch/CommandTest.java b/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/launch/CommandTest.java index e20e16d4..f2a73316 100644 --- a/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/launch/CommandTest.java +++ b/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/launch/CommandTest.java @@ -3,6 +3,7 @@ import lombok.SneakyThrows; import lombok.val; import me.earth.headlessmc.launcher.LauncherMock; +import me.earth.headlessmc.launcher.LauncherProperties; import me.earth.headlessmc.launcher.UsesResources; import me.earth.headlessmc.launcher.java.Java; import me.earth.headlessmc.launcher.os.OS; @@ -25,6 +26,7 @@ public void testCommand() { LauncherMock.INSTANCE.getJavaService().add(new Java("dummy", 8)); Assertions.assertThrows(LaunchException.class, command::build); LauncherMock.INSTANCE.getJavaService().add(new Java("java-17", 17)); + System.setProperty(LauncherProperties.SET_LIBRARY_DIR.getName(), "false"); val expected = Arrays.asList( "java-17", "-Dhmc.deencapsulate=true", "-Djava.library.path=natives_path", "-cp", diff --git a/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/launch/LaunchTest.java b/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/launch/LaunchTest.java index ae018d99..0cba8a85 100644 --- a/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/launch/LaunchTest.java +++ b/headlessmc-launcher/src/test/java/me/earth/headlessmc/launcher/launch/LaunchTest.java @@ -6,6 +6,7 @@ import lombok.var; import me.earth.headlessmc.launcher.Launcher; import me.earth.headlessmc.launcher.LauncherMock; +import me.earth.headlessmc.launcher.LauncherProperties; import me.earth.headlessmc.launcher.command.LaunchContext; import me.earth.headlessmc.launcher.java.Java; import me.earth.headlessmc.launcher.util.IOUtil; @@ -23,6 +24,7 @@ public class LaunchTest { @Test @SneakyThrows public void testLaunch() { + System.setProperty(LauncherProperties.SET_LIBRARY_DIR.getName(), "false"); setupLauncher(); var builder = ((MockProcessFactory) launcher.getProcessFactory()) .getBuilder(); @@ -50,6 +52,7 @@ public void testLaunch() { @Test public void testWithVmArgs() { + System.setProperty(LauncherProperties.SET_LIBRARY_DIR.getName(), "false"); setupLauncher(); launcher.getCommandContext().execute( // TODO: all this escaping is kinda ehh diff --git a/headlessmc-scripts/hmc b/headlessmc-scripts/hmc index 8d2f502c..74112266 100644 --- a/headlessmc-scripts/hmc +++ b/headlessmc-scripts/hmc @@ -1,2 +1,2 @@ #!/usr/bin/env sh -java -jar headlessmc-launcher-1.9.4.jar --command $@ +java -jar headlessmc-launcher-1.9.5.jar --command $@ diff --git a/headlessmc-scripts/hmc.bat b/headlessmc-scripts/hmc.bat index 6e99d9e8..45052fd0 100644 --- a/headlessmc-scripts/hmc.bat +++ b/headlessmc-scripts/hmc.bat @@ -1,2 +1,2 @@ @echo off -"%JAVA_HOME%\bin\java" -jar headlessmc-launcher-1.9.4.jar --command %* +"%JAVA_HOME%\bin\java" -jar headlessmc-launcher-1.9.5.jar --command %* diff --git a/headlessmc-scripts/hmw b/headlessmc-scripts/hmw index c082d18b..b4b14cbc 100644 --- a/headlessmc-scripts/hmw +++ b/headlessmc-scripts/hmw @@ -1,3 +1,3 @@ #!/bin/bash # when running in docker on windows bash seems to be at /bin/bash TODO: can we make this one script? -java -jar headlessmc-launcher-1.9.4.jar --command $@ +java -jar headlessmc-launcher-1.9.5.jar --command $@