From e61af714154f4b64f119f32fe7dce35cae23ff98 Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Sat, 14 Aug 2021 18:29:25 +0800 Subject: [PATCH] fix: cannot launch game with bootstraplauncher > 0.1.17. --- .../hmcl/download/LibraryAnalyzer.java | 3 +- .../jackhuang/hmcl/download/MaintainTask.java | 37 +++++++++++++++---- .../hmcl/launch/DefaultLauncher.java | 3 +- 3 files changed, 33 insertions(+), 10 deletions(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/LibraryAnalyzer.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/LibraryAnalyzer.java index 845c81105..af1a5e007 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/LibraryAnalyzer.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/LibraryAnalyzer.java @@ -158,7 +158,8 @@ public final class LibraryAnalyzer implements Iterable { if (!libraryAnalyzer.has(FORGE)) return version; - // The default ignoreList set by Forge installer does not fulfill our requirements - List jvm = builder.getMutableJvmArguments(); - for (int i = 0; i < jvm.size(); i++) { - Argument jvmArg = jvm.get(i); - if (jvmArg instanceof StringArgument) { - String jvmArgStr = jvmArg.toString(); - if (jvmArgStr.startsWith("-DignoreList=")) { - jvm.set(i, new StringArgument("-DignoreList=" + updateIgnoreList(repository, version, jvmArgStr.substring("-DignoreList=".length())))); + Optional bslVersion = libraryAnalyzer.getVersion(BOOTSTRAP_LAUNCHER); + + if (bslVersion.isPresent()) { + if (VersionNumber.VERSION_COMPARATOR.compare(bslVersion.get(), "0.1.17") < 0) { + // The default ignoreList will be applied to all components of libraries in classpath, + // so if game directory located in some directory like /Users/asm, all libraries will be ignored, + // which is not expected. We fix this here. + List jvm = builder.getMutableJvmArguments(); + for (int i = 0; i < jvm.size(); i++) { + Argument jvmArg = jvm.get(i); + if (jvmArg instanceof StringArgument) { + String jvmArgStr = jvmArg.toString(); + if (jvmArgStr.startsWith("-DignoreList=")) { + jvm.set(i, new StringArgument("-DignoreList=" + updateIgnoreList(repository, version, jvmArgStr.substring("-DignoreList=".length())))); + } + } + } + } else { + // bootstraplauncher 0.1.17 will only apply ignoreList to file name of libraries in classpath. + // So we only fixes name of primary jar. + List jvm = builder.getMutableJvmArguments(); + for (int i = 0; i < jvm.size(); i++) { + Argument jvmArg = jvm.get(i); + if (jvmArg instanceof StringArgument) { + String jvmArgStr = jvmArg.toString(); + if (jvmArgStr.startsWith("-DignoreList=")) { + jvm.set(i, new StringArgument(jvmArgStr + ",${primary_jar_name}")); + } + } } } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java index 81828a8fc..add889b0b 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java @@ -304,7 +304,8 @@ public class DefaultLauncher extends Launcher { // when we propose this placeholder. pair("${libraries_directory}", repository.getLibrariesDirectory(version).getAbsolutePath()), // file_separator is used in -DignoreList - pair("${file_separator}", OperatingSystem.FILE_SEPARATOR) + pair("${file_separator}", OperatingSystem.FILE_SEPARATOR), + pair("${primary_jar_name}", FileUtils.getName(repository.getVersionJar(version).toPath())) ); }