diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java index fdc12283b..dc5e50fd1 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java @@ -282,7 +282,7 @@ public class HMCLGameRepository extends DefaultGameRepository { } if (LibraryAnalyzer.isModded(this, version)) { - LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version); + LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version, getGameVersion(version).orElse(null)); if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.FABRIC)) return VersionIconType.FABRIC.getIcon(); else if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.FORGE)) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackInstallTask.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackInstallTask.java index df1e69162..22748b551 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackInstallTask.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackInstallTask.java @@ -93,7 +93,7 @@ public final class HMCLModpackInstallTask extends Task { public void execute() throws Exception { String json = CompressingUtils.readTextZipEntry(zipFile, "minecraft/pack.json"); Version originalVersion = JsonUtils.GSON.fromJson(json, Version.class).setId(name).setJar(null); - LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(originalVersion); + LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(originalVersion, repository.getGameVersion(originalVersion).orElse(null)); Task libraryTask = Task.supplyAsync(() -> originalVersion); // reinstall libraries // libraries of Forge and OptiFine should be obtained by installation. diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java index a00b8ee9a..5957f5b07 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/LauncherHelper.java @@ -417,7 +417,7 @@ public final class LauncherHelper { JavaVersionConstraint violatedMandatoryConstraint = null; List violatedSuggestedConstraints = null; - LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(version); + LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(version, gameVersion.toString()); for (JavaVersionConstraint constraint : JavaVersionConstraint.ALL) { if (constraint.appliesToVersion(gameVersion, version, javaVersion, analyzer)) { if (!constraint.checkJava(gameVersion, version, javaVersion)) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java index 9b719766c..f7946995e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/GameCrashWindow.java @@ -99,7 +99,7 @@ public class GameCrashWindow extends Stage { this.version = version; this.launchOptions = launchOptions; this.logs = logs; - this.analyzer = LibraryAnalyzer.analyze(version); + this.analyzer = LibraryAnalyzer.analyze(version, repository.getGameVersion(version).orElse(null)); memory = Optional.ofNullable(launchOptions.getMaxMemory()).map(i -> i + " MB").orElse("-"); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java index dd84d1840..0bbb02d65 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/AdditionalInstallersPage.java @@ -84,7 +84,8 @@ class AdditionalInstallersPage extends InstallersPage { @Override protected void reload() { - LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(version.resolvePreservingPatches(repository)); + Version resolved = version.resolvePreservingPatches(repository); + LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(resolved, repository.getGameVersion(resolved).orElse(null)); String game = analyzer.getVersion(MINECRAFT).orElse(null); String currentGameVersion = Lang.nonNull(getVersion("game"), game); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadPage.java index e466d9d02..f00db92d2 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadPage.java @@ -32,6 +32,7 @@ import javafx.scene.image.ImageView; import javafx.scene.layout.*; import javafx.stage.FileChooser; import org.jackhuang.hmcl.download.LibraryAnalyzer; +import org.jackhuang.hmcl.game.HMCLGameRepository; import org.jackhuang.hmcl.game.Version; import org.jackhuang.hmcl.mod.ModLoaderType; import org.jackhuang.hmcl.mod.RemoteMod; @@ -291,8 +292,9 @@ public class DownloadPage extends Control implements DecoratorPage { if (control.versions == null) return; if (control.version.getProfile() != null && control.version.getVersion() != null) { - Version game = control.version.getProfile().getRepository().getResolvedPreservingPatchesVersion(control.version.getVersion()); - LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(game); + HMCLGameRepository repository = control.version.getProfile().getRepository(); + Version game = repository.getResolvedPreservingPatchesVersion(control.version.getVersion()); + LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(game, repository.getGameVersion(game).orElse(null)); libraryAnalyzer.getVersion(LibraryAnalyzer.LibraryType.MINECRAFT).ifPresent(currentGameVersion -> { Set currentGameModLoaders = libraryAnalyzer.getModLoaders(); if (control.versions.containsKey(currentGameVersion)) { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameItem.java index 69c3db5a9..843192d52 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/GameItem.java @@ -27,6 +27,8 @@ import javafx.scene.control.Control; import javafx.scene.control.Skin; import javafx.scene.image.Image; import org.jackhuang.hmcl.download.LibraryAnalyzer; +import org.jackhuang.hmcl.game.HMCLGameRepository; +import org.jackhuang.hmcl.game.Version; import org.jackhuang.hmcl.mod.ModpackConfiguration; import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.util.i18n.I18n; @@ -62,7 +64,9 @@ public class GameItem extends Control { CompletableFuture.supplyAsync(() -> profile.getRepository().getGameVersion(id).orElse(i18n("message.unknown")), POOL_VERSION_RESOLVE) .thenAcceptAsync(game -> { StringBuilder libraries = new StringBuilder(game); - LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(profile.getRepository().getResolvedPreservingPatchesVersion(id)); + HMCLGameRepository repository = profile.getRepository(); + Version resolved = repository.getResolvedPreservingPatchesVersion(id); + LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(resolved, repository.getGameVersion(resolved).orElse(null)); for (LibraryAnalyzer.LibraryMark mark : analyzer) { String libraryId = mark.getLibraryId(); String libraryVersion = mark.getLibraryVersion(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/InstallerListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/InstallerListPage.java index adb3198ef..de495ed93 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/InstallerListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/InstallerListPage.java @@ -72,7 +72,7 @@ public class InstallerListPage extends ListPageBase implements Ve CompletableFuture.supplyAsync(() -> { gameVersion = profile.getRepository().getGameVersion(version).orElse(null); - return LibraryAnalyzer.analyze(profile.getRepository().getResolvedPreservingPatchesVersion(versionId)); + return LibraryAnalyzer.analyze(profile.getRepository().getResolvedPreservingPatchesVersion(versionId), gameVersion); }).thenAcceptAsync(analyzer -> { Function removeAction = libraryId -> () -> { profile.getDependency().removeLibraryAsync(version, libraryId) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPage.java index 687cf3c23..b667d4497 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPage.java @@ -24,6 +24,8 @@ import javafx.collections.ObservableList; import javafx.scene.control.Skin; import javafx.stage.FileChooser; import org.jackhuang.hmcl.download.LibraryAnalyzer; +import org.jackhuang.hmcl.game.HMCLGameRepository; +import org.jackhuang.hmcl.game.Version; import org.jackhuang.hmcl.mod.LocalModFile; import org.jackhuang.hmcl.mod.ModManager; import org.jackhuang.hmcl.setting.Profile; @@ -84,7 +86,9 @@ public final class ModListPage extends ListPageBase LibraryAnalyzer.analyze(independentVersion).removeLibrary(libraryId).build()); + return Task.supplyAsync(() -> LibraryAnalyzer.analyze(independentVersion, gameVersion).removeLibrary(libraryId).build()); } } 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 b8b493483..8b189f066 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/LibraryAnalyzer.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/LibraryAnalyzer.java @@ -130,12 +130,16 @@ public final class LibraryAnalyzer implements Iterable> libraries = new HashMap<>(); + if (gameVersion != null) { + libraries.put(LibraryType.MINECRAFT.getPatchId(), pair(null, gameVersion)); + } + List rawLibraries = version.resolve(null).getLibraries(); for (Library library : rawLibraries) { for (LibraryType type : LibraryType.values()) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MaintainTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MaintainTask.java index ea610a4b8..538fdba40 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MaintainTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MaintainTask.java @@ -63,7 +63,7 @@ public class MaintainTask extends Task { String mainClass = version.resolve(null).getMainClass(); if (mainClass != null && mainClass.equals(LibraryAnalyzer.LAUNCH_WRAPPER_MAIN)) { - version = maintainOptiFineLibrary(repository, maintainGameWithLaunchWrapper(unique(version), true), false); + version = maintainOptiFineLibrary(repository, maintainGameWithLaunchWrapper(repository, unique(version), true), false); } else if (mainClass != null && mainClass.equals(LibraryAnalyzer.MOD_LAUNCHER_MAIN)) { // Forge 1.13 and OptiFine version = maintainOptiFineLibrary(repository, maintainGameWithCpwModLauncher(repository, unique(version)), true); @@ -97,8 +97,8 @@ public class MaintainTask extends Task { return newVersion.setPatches(version.getPatches()).markAsUnresolved(); } - private static Version maintainGameWithLaunchWrapper(Version version, boolean reorderTweakClass) { - LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version); + private static Version maintainGameWithLaunchWrapper(GameRepository repository, Version version, boolean reorderTweakClass) { + LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version, repository.getGameVersion(version).orElse(null)); VersionLibraryBuilder builder = new VersionLibraryBuilder(version); String mainClass = null; @@ -147,7 +147,7 @@ public class MaintainTask extends Task { } private static Version maintainGameWithCpwModLauncher(GameRepository repository, Version version) { - LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version); + LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version, repository.getGameVersion(version).orElse(null)); VersionLibraryBuilder builder = new VersionLibraryBuilder(version); if (!libraryAnalyzer.has(FORGE)) return version; @@ -205,7 +205,7 @@ public class MaintainTask extends Task { // Fix wrong configurations when launching 1.17+ with Forge. private static Version maintainGameWithCpwBoostrapLauncher(GameRepository repository, Version version) { - LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version); + LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version, repository.getGameVersion(version).orElse(null)); VersionLibraryBuilder builder = new VersionLibraryBuilder(version); if (!libraryAnalyzer.has(FORGE) && !libraryAnalyzer.has(NEO_FORGE)) return version; @@ -247,7 +247,7 @@ public class MaintainTask extends Task { } private static Version maintainOptiFineLibrary(GameRepository repository, Version version, boolean remove) { - LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version); + LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version, repository.getGameVersion(version).orElse(null)); List libraries = new ArrayList<>(version.getLibraries()); if (libraryAnalyzer.has(OPTIFINE)) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameVerificationFixTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameVerificationFixTask.java index 22229f248..1224378f5 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameVerificationFixTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/GameVerificationFixTask.java @@ -63,7 +63,7 @@ public final class GameVerificationFixTask extends Task { @Override public void execute() throws IOException { File jar = dependencyManager.getGameRepository().getVersionJar(version); - LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(version); + LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(version, gameVersion); if (jar.exists() && GameVersionNumber.compare(gameVersion, "1.6") < 0 && analyzer.has(LibraryAnalyzer.LibraryType.FORGE)) { try (FileSystem fs = CompressingUtils.createWritableZipFileSystem(jar.toPath(), StandardCharsets.UTF_8)) { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/JavaVersionConstraint.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/JavaVersionConstraint.java index 6d28371c8..3a43e1c28 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/JavaVersionConstraint.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/JavaVersionConstraint.java @@ -226,7 +226,7 @@ public enum JavaVersionConstraint { public static VersionRanges findSuitableJavaVersionRange(GameVersionNumber gameVersion, Version version) { VersionRange mandatoryJavaRange = VersionRange.all(); VersionRange suggestedJavaRange = VersionRange.all(); - LibraryAnalyzer analyzer = version != null ? LibraryAnalyzer.analyze(version) : null; + LibraryAnalyzer analyzer = version != null ? LibraryAnalyzer.analyze(version, gameVersion != null ? gameVersion.toString() : null) : null; for (JavaVersionConstraint java : ALL) { if (java.appliesToVersion(gameVersion, version, null, analyzer)) { VersionRange javaVersionRange = java.getJavaVersionRange(version); 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 3048997a9..56e5bb059 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java @@ -505,7 +505,7 @@ public class DefaultLauncher extends Launcher { } } - LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(version); + LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(version, repository.getGameVersion(version).orElse(null)); if (analyzer.has(LibraryAnalyzer.LibraryType.FORGE)) { env.put("INST_FORGE", "1"); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/mcbbs/McbbsModpackExportTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/mcbbs/McbbsModpackExportTask.java index 94230414f..23d22fd12 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/mcbbs/McbbsModpackExportTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/mcbbs/McbbsModpackExportTask.java @@ -82,9 +82,9 @@ public class McbbsModpackExportTask extends Task { } }); - LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(repository.getResolvedPreservingPatchesVersion(version)); String gameVersion = repository.getGameVersion(version) .orElseThrow(() -> new IOException("Cannot parse the version of " + version)); + LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(repository.getResolvedPreservingPatchesVersion(version), gameVersion); // Mcbbs manifest List addons = new ArrayList<>(); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/multimc/MultiMCModpackExportTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/multimc/MultiMCModpackExportTask.java index c0eb4a07f..9d90dacc2 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/multimc/MultiMCModpackExportTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/multimc/MultiMCModpackExportTask.java @@ -70,9 +70,9 @@ public class MultiMCModpackExportTask extends Task { try (Zipper zip = new Zipper(output.toPath())) { zip.putDirectory(repository.getRunDirectory(versionId).toPath(), ".minecraft", path -> Modpack.acceptFile(path, blackList, whitelist)); - LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(repository.getResolvedPreservingPatchesVersion(versionId)); String gameVersion = repository.getGameVersion(versionId) .orElseThrow(() -> new IOException("Cannot parse the version of " + versionId)); + LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(repository.getResolvedPreservingPatchesVersion(versionId), gameVersion); List components = new ArrayList<>(); components.add(new MultiMCManifest.MultiMCManifestComponent(true, false, "net.minecraft", gameVersion)); analyzer.getVersion(FORGE).ifPresent(forgeVersion -> diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/server/ServerModpackExportTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/server/ServerModpackExportTask.java index fc7d9e174..5261c8e1b 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/server/ServerModpackExportTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/server/ServerModpackExportTask.java @@ -78,9 +78,9 @@ public class ServerModpackExportTask extends Task { } }); - LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(repository.getResolvedPreservingPatchesVersion(versionId)); String gameVersion = repository.getGameVersion(versionId) .orElseThrow(() -> new IOException("Cannot parse the version of " + versionId)); + LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(repository.getResolvedPreservingPatchesVersion(versionId), gameVersion); List addons = new ArrayList<>(); addons.add(new ServerModpackManifest.Addon(MINECRAFT.getPatchId(), gameVersion)); analyzer.getVersion(FORGE).ifPresent(forgeVersion ->