From 92dfbf7b8d287486514eb8cf3db47e19424fdbc5 Mon Sep 17 00:00:00 2001 From: Ciilu <109708109+Ciilu@users.noreply.github.com> Date: Sun, 28 Dec 2025 10:38:35 +0800 Subject: [PATCH 01/11] Legacy Fabric --- .../hmcl/game/HMCLGameRepository.java | 4 +- .../hmcl/setting/VersionIconType.java | 4 +- .../org/jackhuang/hmcl/ui/InstallerItem.java | 24 +- .../hmcl/ui/construct/TaskListPane.java | 35 +-- .../hmcl/ui/download/InstallersPage.java | 3 + .../hmcl/ui/download/VersionsPage.java | 4 + .../hmcl/ui/versions/InstallerListPage.java | 6 +- .../hmcl/ui/versions/ModListPageSkin.java | 6 + .../hmcl/ui/versions/VersionIconDialog.java | 1 + .../resources/assets/img/legacyfabric.png | Bin 0 -> 2411 bytes .../resources/assets/img/legacyfabric@2x.png | Bin 0 -> 3923 bytes .../resources/assets/lang/I18N.properties | 3 + .../resources/assets/lang/I18N_zh.properties | 3 + .../assets/lang/I18N_zh_CN.properties | 3 + .../download/BMCLAPIDownloadProvider.java | 11 + .../hmcl/download/LibraryAnalyzer.java | 25 +- .../hmcl/download/MojangDownloadProvider.java | 10 + .../download/fabric/FabricAPIInstallTask.java | 2 +- .../LegacyFabricAPIInstallTask.java | 61 +++++ .../LegacyFabricAPIRemoteVersion.java | 67 ++++++ .../LegacyFabricAPIVersionList.java | 53 +++++ .../legacyfabric/LegacyFabricInstallTask.java | 216 ++++++++++++++++++ .../LegacyFabricRemoteVersion.java | 44 ++++ .../legacyfabric/LegacyFabricVersionList.java | 106 +++++++++ .../download/quilt/QuiltAPIInstallTask.java | 2 +- .../hmcl/launch/DefaultLauncher.java | 3 + .../org/jackhuang/hmcl/mod/ModLoaderType.java | 3 +- .../mod/mcbbs/McbbsModpackExportTask.java | 2 + 28 files changed, 668 insertions(+), 33 deletions(-) create mode 100644 HMCL/src/main/resources/assets/img/legacyfabric.png create mode 100644 HMCL/src/main/resources/assets/img/legacyfabric@2x.png create mode 100644 HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricAPIInstallTask.java create mode 100644 HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricAPIRemoteVersion.java create mode 100644 HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricAPIVersionList.java create mode 100644 HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricInstallTask.java create mode 100644 HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricRemoteVersion.java create mode 100644 HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricVersionList.java 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 b99d5ed62e..65752f2ad6 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java @@ -317,7 +317,9 @@ public Image getVersionIconImage(String id) { if (LibraryAnalyzer.isModded(this, version)) { LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version, null); - if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.FABRIC)) + if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.LEGACY_FABRIC)) + return VersionIconType.LEGACY_FABRIC.getIcon(); + else if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.FABRIC)) return VersionIconType.FABRIC.getIcon(); else if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.QUILT)) return VersionIconType.QUILT.getIcon(); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionIconType.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionIconType.java index 09675738c3..dd19336b8c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionIconType.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionIconType.java @@ -36,7 +36,9 @@ public enum VersionIconType { FURNACE("/assets/img/furnace.png"), QUILT("/assets/img/quilt.png"), APRIL_FOOLS("/assets/img/april_fools.png"), - CLEANROOM("/assets/img/cleanroom.png"); + CLEANROOM("/assets/img/cleanroom.png"), + LEGACY_FABRIC("/assets/img/legacyfabric.png") + ; // Please append new items at last diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java index 9c237a7bd8..d367c8cdcd 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java @@ -135,6 +135,10 @@ public InstallerItem(String id, Style style) { case "fabric-api": iconType = VersionIconType.FABRIC; break; + case "legacyfabric": + case "legacyfabric-api": + iconType = VersionIconType.LEGACY_FABRIC; + break; case "forge": iconType = VersionIconType.FORGE; break; @@ -236,6 +240,8 @@ public InstallerItemGroup(String gameVersion, Style style) { InstallerItem fabricApi = new InstallerItem(FABRIC_API, style); InstallerItem forge = new InstallerItem(FORGE, style); InstallerItem cleanroom = new InstallerItem(CLEANROOM, style); + InstallerItem legacyfabric = new InstallerItem(LEGACY_FABRIC, style); + InstallerItem legacyfabricApi = new InstallerItem(LEGACY_FABRIC_API, style); InstallerItem neoForge = new InstallerItem(NEO_FORGE, style); InstallerItem liteLoader = new InstallerItem(LITELOADER, style); InstallerItem optiFine = new InstallerItem(OPTIFINE, style); @@ -243,11 +249,11 @@ public InstallerItemGroup(String gameVersion, Style style) { InstallerItem quiltApi = new InstallerItem(QUILT_API, style); Map> incompatibleMap = new HashMap<>(); - mutualIncompatible(incompatibleMap, forge, fabric, quilt, neoForge, cleanroom); - addIncompatibles(incompatibleMap, liteLoader, fabric, quilt, neoForge, cleanroom); - addIncompatibles(incompatibleMap, optiFine, fabric, quilt, neoForge, cleanroom); - addIncompatibles(incompatibleMap, fabricApi, forge, quiltApi, neoForge, liteLoader, optiFine, cleanroom); - addIncompatibles(incompatibleMap, quiltApi, forge, fabric, fabricApi, neoForge, liteLoader, optiFine, cleanroom); + mutualIncompatible(incompatibleMap, forge, fabric, quilt, neoForge, cleanroom, legacyfabric); + addIncompatibles(incompatibleMap, liteLoader, fabric, quilt, neoForge, cleanroom, legacyfabric); + addIncompatibles(incompatibleMap, optiFine, fabric, quilt, neoForge, cleanroom, liteLoader, legacyfabric); + addIncompatibles(incompatibleMap, fabricApi, forge, quiltApi, neoForge, liteLoader, optiFine, cleanroom, legacyfabricApi, legacyfabricApi); + addIncompatibles(incompatibleMap, quiltApi, forge, fabric, fabricApi, neoForge, liteLoader, optiFine, cleanroom, legacyfabric, legacyfabricApi); for (Map.Entry> entry : incompatibleMap.entrySet()) { InstallerItem item = entry.getKey(); @@ -281,7 +287,7 @@ public InstallerItemGroup(String gameVersion, Style style) { game.versionProperty.set(new InstalledState(gameVersion, false, false)); } - InstallerItem[] all = {game, forge, neoForge, liteLoader, optiFine, fabric, fabricApi, quilt, quiltApi, cleanroom}; + InstallerItem[] all = {game, forge, neoForge, liteLoader, optiFine, fabric, fabricApi, quilt, quiltApi, legacyfabric, legacyfabricApi, cleanroom}; for (InstallerItem item : all) { if (!item.resolvedStateProperty.isBound()) { @@ -298,9 +304,9 @@ public InstallerItemGroup(String gameVersion, Style style) { if (gameVersion == null) { this.libraries = all; } else if (gameVersion.equals("1.12.2")) { - this.libraries = new InstallerItem[]{game, forge, cleanroom, liteLoader, optiFine}; - } else if (GameVersionNumber.compare(gameVersion, "1.13") < 0) { - this.libraries = new InstallerItem[]{game, forge, liteLoader, optiFine}; + this.libraries = new InstallerItem[]{game, forge, cleanroom, liteLoader, legacyfabric, legacyfabricApi, optiFine}; + } else if (GameVersionNumber.compare(gameVersion, "1.13.2") <= 0) { + this.libraries = new InstallerItem[]{game, forge, liteLoader, optiFine, legacyfabric, legacyfabricApi}; } else { this.libraries = new InstallerItem[]{game, forge, neoForge, optiFine, fabric, fabricApi, quilt, quiltApi}; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java index 06153282b2..d1d3b9eb7b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java @@ -41,6 +41,7 @@ import org.jackhuang.hmcl.download.game.GameAssetDownloadTask; import org.jackhuang.hmcl.download.game.GameInstallTask; import org.jackhuang.hmcl.download.java.mojang.MojangJavaDownloadTask; +import org.jackhuang.hmcl.download.legacyfabric.LegacyFabricInstallTask; import org.jackhuang.hmcl.download.liteloader.LiteLoaderInstallTask; import org.jackhuang.hmcl.download.neoforge.NeoForgeInstallTask; import org.jackhuang.hmcl.download.neoforge.NeoForgeOldInstallTask; @@ -164,6 +165,8 @@ public void onRunning(Task task) { task.setName(i18n("install.installer.install", i18n("install.installer.game"))); } else if (task instanceof CleanroomInstallTask) { task.setName(i18n("install.installer.install", i18n("install.installer.cleanroom"))); + } else if (task instanceof LegacyFabricInstallTask) { + task.setName(i18n("install.installer.install", i18n("install.installer.legacyfabric"))); } else if (task instanceof ForgeNewInstallTask || task instanceof ForgeOldInstallTask) { task.setName(i18n("install.installer.install", i18n("install.installer.forge"))); } else if (task instanceof NeoForgeInstallTask || task instanceof NeoForgeOldInstallTask) { @@ -428,21 +431,23 @@ private StageNode(String stage) { // CHECKSTYLE:OFF // @formatter:off switch (stageKey) { - case "hmcl.modpack": message = i18n("install.modpack"); break; - case "hmcl.modpack.download": message = i18n("launch.state.modpack"); break; - case "hmcl.install.assets": message = i18n("assets.download"); break; - case "hmcl.install.libraries": message = i18n("libraries.download"); break; - case "hmcl.install.game": message = i18n("install.installer.install", i18n("install.installer.game") + " " + stageValue); break; - case "hmcl.install.forge": message = i18n("install.installer.install", i18n("install.installer.forge") + " " + stageValue); break; - case "hmcl.install.cleanroom": message = i18n("install.installer.install", i18n("install.installer.cleanroom") + " " + stageValue); break; - case "hmcl.install.neoforge": message = i18n("install.installer.install", i18n("install.installer.neoforge") + " " + stageValue); break; - case "hmcl.install.liteloader": message = i18n("install.installer.install", i18n("install.installer.liteloader") + " " + stageValue); break; - case "hmcl.install.optifine": message = i18n("install.installer.install", i18n("install.installer.optifine") + " " + stageValue); break; - case "hmcl.install.fabric": message = i18n("install.installer.install", i18n("install.installer.fabric") + " " + stageValue); break; - case "hmcl.install.fabric-api": message = i18n("install.installer.install", i18n("install.installer.fabric-api") + " " + stageValue); break; - case "hmcl.install.quilt": message = i18n("install.installer.install", i18n("install.installer.quilt") + " " + stageValue); break; - case "hmcl.install.quilt-api": message = i18n("install.installer.install", i18n("install.installer.quilt-api") + " " + stageValue); break; - default: message = i18n(stageKey); break; + case "hmcl.modpack": message = i18n("install.modpack"); break; + case "hmcl.modpack.download": message = i18n("launch.state.modpack"); break; + case "hmcl.install.assets": message = i18n("assets.download"); break; + case "hmcl.install.libraries": message = i18n("libraries.download"); break; + case "hmcl.install.game": message = i18n("install.installer.install", i18n("install.installer.game") + " " + stageValue); break; + case "hmcl.install.forge": message = i18n("install.installer.install", i18n("install.installer.forge") + " " + stageValue); break; + case "hmcl.install.cleanroom": message = i18n("install.installer.install", i18n("install.installer.cleanroom") + " " + stageValue); break; + case "hmcl.install.neoforge": message = i18n("install.installer.install", i18n("install.installer.neoforge") + " " + stageValue); break; + case "hmcl.install.liteloader": message = i18n("install.installer.install", i18n("install.installer.liteloader") + " " + stageValue); break; + case "hmcl.install.optifine": message = i18n("install.installer.install", i18n("install.installer.optifine") + " " + stageValue); break; + case "hmcl.install.fabric": message = i18n("install.installer.install", i18n("install.installer.fabric") + " " + stageValue); break; + case "hmcl.install.fabric-api": message = i18n("install.installer.install", i18n("install.installer.fabric-api") + " " + stageValue); break; + case "hmcl.install.legacyfabric": message = i18n("install.installer.install", i18n("install.installer.legacyfabric-api") + " " + stageValue); break; + case "hmcl.install.legacyfabric-api": message = i18n("install.installer.install", i18n("install.installer.legacyfabric-api") + " " + stageValue); break; + case "hmcl.install.quilt": message = i18n("install.installer.install", i18n("install.installer.quilt") + " " + stageValue); break; + case "hmcl.install.quilt-api": message = i18n("install.installer.install", i18n("install.installer.quilt-api") + " " + stageValue); break; + default: message = i18n(stageKey); break; } // @formatter:on // CHECKSTYLE:ON diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java index 346c4a0dfa..d2c2f3774f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java @@ -132,6 +132,9 @@ private void setTxtNameWithLoaders() { case CLEANROOM: loaderName = i18n("install.installer.cleanroom"); break; + case LEGACY_FABRIC: + loaderName = i18n("install.installer.legacyfabric").replace(" ","_"); + break; case FABRIC: loaderName = i18n("install.installer.fabric"); break; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java index daa341ee8a..1e88870b61 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/VersionsPage.java @@ -38,6 +38,8 @@ import org.jackhuang.hmcl.download.fabric.FabricRemoteVersion; import org.jackhuang.hmcl.download.forge.ForgeRemoteVersion; import org.jackhuang.hmcl.download.game.GameRemoteVersion; +import org.jackhuang.hmcl.download.legacyfabric.LegacyFabricAPIRemoteVersion; +import org.jackhuang.hmcl.download.legacyfabric.LegacyFabricRemoteVersion; import org.jackhuang.hmcl.download.liteloader.LiteLoaderRemoteVersion; import org.jackhuang.hmcl.download.neoforge.NeoForgeRemoteVersion; import org.jackhuang.hmcl.download.optifine.OptiFineRemoteVersion; @@ -273,6 +275,8 @@ else if (remoteVersion instanceof CleanroomRemoteVersion) iconType = VersionIconType.CLEANROOM; else if (remoteVersion instanceof NeoForgeRemoteVersion) iconType = VersionIconType.NEO_FORGE; + else if (remoteVersion instanceof LegacyFabricRemoteVersion || remoteVersion instanceof LegacyFabricAPIRemoteVersion) + iconType = VersionIconType.LEGACY_FABRIC; else if (remoteVersion instanceof FabricRemoteVersion || remoteVersion instanceof FabricAPIRemoteVersion) iconType = VersionIconType.FABRIC; else if (remoteVersion instanceof QuiltRemoteVersion || remoteVersion instanceof QuiltAPIRemoteVersion) 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 2f487ff1d8..5d7aa7fbe1 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 @@ -76,12 +76,12 @@ public void loadVersion(Profile profile, String versionId) { InstallerItem.InstallerItemGroup group = new InstallerItem.InstallerItemGroup(gameVersion, InstallerItem.Style.LIST_ITEM); - // Conventional libraries: game, fabric, forge, cleanroom, neoforge, liteloader, optifine + // Conventional libraries: game, fabric, legacyfabric, forge, cleanroom, neoforge, liteloader, optifine for (InstallerItem item : group.getLibraries()) { String libraryId = item.getLibraryId(); - // Skip fabric-api and quilt-api - if (libraryId.contains("fabric-api") || libraryId.contains("quilt-api")) { + // Skip fabric-api and quilt-api and legacyfabric-api + if (libraryId.endsWith("-api")) { continue; } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java index dd60f01301..77f5bc0a44 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java @@ -465,6 +465,9 @@ final class ModInfoDialog extends JFXDialogLayout { case CLEANROOM: loaderName = i18n("install.installer.cleanroom"); break; + case LEGACY_FABRIC: + loaderName = i18n("install.installer.legacyfabric"); + break; case NEO_FORGED: loaderName = i18n("install.installer.neoforge"); break; @@ -654,6 +657,9 @@ protected void updateControl(ModInfoObject dataItem, boolean empty) { case FORGE: content.addTagWarning(i18n("install.installer.forge")); break; + case LEGACY_FABRIC: + content.addTagWarning(i18n("install.installer.legacyfabric")); + break; case CLEANROOM: content.addTagWarning(i18n("install.installer.cleanroom")); break; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionIconDialog.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionIconDialog.java index 3c35219364..a48fc63a09 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionIconDialog.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/VersionIconDialog.java @@ -64,6 +64,7 @@ public VersionIconDialog(Profile profile, String versionId, Runnable onFinish) { createIcon(VersionIconType.OPTIFINE), createIcon(VersionIconType.CRAFT_TABLE), createIcon(VersionIconType.FABRIC), + createIcon(VersionIconType.LEGACY_FABRIC), createIcon(VersionIconType.FORGE), createIcon(VersionIconType.CLEANROOM), createIcon(VersionIconType.NEO_FORGE), diff --git a/HMCL/src/main/resources/assets/img/legacyfabric.png b/HMCL/src/main/resources/assets/img/legacyfabric.png new file mode 100644 index 0000000000000000000000000000000000000000..c98938a23fdfcd1c5b8920f0c51aaa4832efacac GIT binary patch literal 2411 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 literal 0 HcmV?d00001 diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index dbed63c568..4f3b1f9533 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -715,6 +715,8 @@ install.installer.depend=Requires %s install.installer.do_not_install=Do not install install.installer.fabric=Fabric install.installer.fabric-api=Fabric API +install.installer.legacyfabric=Legacy Fabric +install.installer.legacyfabric-api=Legacy Fabric API install.installer.fabric-api.warning=Warning: Fabric API is a mod and will be installed into the mod directory of the game instance. Please do not change the working directory of the game, or the Fabric API will not function. If you do want to change the directory, you should reinstall it. install.installer.forge=Forge install.installer.neoforge=NeoForge @@ -1273,6 +1275,7 @@ settings.advanced.custom_commands.hint=The following environment variables are p \ · $INST_LITELOADER: set if LiteLoader is installed.\n\ \ · $INST_OPTIFINE: set if OptiFine is installed.\n\ \ · $INST_FABRIC: set if Fabric is installed.\n\ + \ · $INST_LEGACYFABRIC: set if Legacy Fabric is installed.\n\ \ · $INST_QUILT: set if Quilt is installed. settings.advanced.dont_check_game_completeness=Do not check game integrity settings.advanced.dont_check_jvm_validity=Do not check JVM compatibility diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index e3a50aab7d..7d1632a5ec 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -522,6 +522,8 @@ install.installer.depend=需要先安裝 %s install.installer.do_not_install=不安裝 install.installer.fabric=Fabric install.installer.fabric-api=Fabric API +install.installer.legacyfabric=Legacy Fabric +install.installer.legacyfabric-api=Legacy Fabric API install.installer.fabric-api.warning=警告:Fabric API 是一個模組,將會被安裝到新遊戲的模組目錄。請你在安裝遊戲後不要修改目前遊戲的「執行路徑」設定。如果你在之後修改了相關設定,則需要重新安裝 Fabric API。 install.installer.forge=Forge install.installer.neoforge=NeoForge @@ -1066,6 +1068,7 @@ settings.advanced.custom_commands.hint=自訂指令被呼叫時將包含如下 \ · $INST_LITELOADER: 若安裝了 LiteLoader,將會存在本環境變數;\n\ \ · $INST_OPTIFINE: 若安裝了 OptiFine,將會存在本環境變數;\n\ \ · $INST_FABRIC: 若安裝了 Fabric,將會存在本環境變數;\n\ + \ · $INST_LEGACYFABRIC: 若安裝了 Legacy Fabric,將會存在本環境變數;\n\ \ · $INST_QUILT: 若安裝了 Quilt,將會存在本環境變數。 settings.advanced.dont_check_game_completeness=不檢查遊戲完整性 settings.advanced.dont_check_jvm_validity=不檢查 Java 虛擬機與遊戲的相容性 diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties index 09aff45729..b3f3004c5a 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -531,6 +531,8 @@ install.installer.cleanroom=Cleanroom install.installer.depend=需要先安装 %s install.installer.do_not_install=不安装 install.installer.fabric=Fabric +install.installer.legacyfabric=Legacy Fabric +install.installer.legacyfabric-api=Legacy Fabric API install.installer.fabric-api=Fabric API install.installer.fabric-api.warning=警告:Fabric API 是一个模组,将会被安装到新游戏的模组文件夹。请你在安装游戏后不要修改当前游戏的“运行路径”设置。如果你在之后修改了相关设置,则需要重新安装 Fabric API。 install.installer.forge=Forge @@ -1076,6 +1078,7 @@ settings.advanced.custom_commands.hint=自定义命令被调用时将包含如 \ · $INST_LITELOADER: 若安装了 LiteLoader,将会存在本环境变量;\n\ \ · $INST_OPTIFINE: 若安装了 OptiFine,将会存在本环境变量;\n\ \ · $INST_FABRIC: 若安装了 Fabric,将会存在本环境变量;\n\ + \ · $INST_LEGACYFABRIC: 若安装了 Legacy Fabric,将会存在本环境变量;\n\ \ · $INST_QUILT: 若安装了 Quilt,将会存在本环境变量。 settings.advanced.dont_check_game_completeness=不检查游戏完整性 settings.advanced.dont_check_jvm_validity=不检查 Java 虚拟机与游戏的兼容性 diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java index 22b85cbf9d..88b6223c7c 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java @@ -22,6 +22,8 @@ import org.jackhuang.hmcl.download.fabric.FabricVersionList; import org.jackhuang.hmcl.download.forge.ForgeBMCLVersionList; import org.jackhuang.hmcl.download.game.GameVersionList; +import org.jackhuang.hmcl.download.legacyfabric.LegacyFabricAPIVersionList; +import org.jackhuang.hmcl.download.legacyfabric.LegacyFabricVersionList; import org.jackhuang.hmcl.download.liteloader.LiteLoaderBMCLVersionList; import org.jackhuang.hmcl.download.neoforge.NeoForgeBMCLVersionList; import org.jackhuang.hmcl.download.optifine.OptiFineBMCLVersionList; @@ -47,6 +49,8 @@ public final class BMCLAPIDownloadProvider implements DownloadProvider { private final FabricAPIVersionList fabricApi; private final ForgeBMCLVersionList forge; private final CleanroomVersionList cleanroom; + private final LegacyFabricVersionList legacyFabric; + private final LegacyFabricAPIVersionList legacyFabricApi; private final NeoForgeBMCLVersionList neoforge; private final LiteLoaderBMCLVersionList liteLoader; private final OptiFineBMCLVersionList optifine; @@ -66,6 +70,9 @@ public BMCLAPIDownloadProvider(String apiRoot) { this.optifine = new OptiFineBMCLVersionList(apiRoot); this.quilt = new QuiltVersionList(this); this.quiltApi = new QuiltAPIVersionList(this); + this.legacyFabric = new LegacyFabricVersionList(this); + this.legacyFabricApi = new LegacyFabricAPIVersionList(this); + this.replacement = Arrays.asList( pair("https://bmclapi2.bangbang93.com", apiRoot), pair("https://launchermeta.mojang.com", apiRoot), @@ -133,6 +140,10 @@ public VersionList getVersionListById(String id) { return quilt; case "quilt-api": return quiltApi; + case "legacyfabric": + return legacyFabric; + case "legacyfabric-api": + return legacyFabricApi; default: throw new IllegalArgumentException("Unrecognized version list id: " + id); } 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 edbb735efa..c0eb38d6ec 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/LibraryAnalyzer.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/LibraryAnalyzer.java @@ -189,7 +189,29 @@ public Set getModLoaders() { public enum LibraryType { MINECRAFT(true, "game", "^$", "^$", null), - FABRIC(true, "fabric", "net\\.fabricmc", "fabric-loader", ModLoaderType.FABRIC), + LEGACY_FABRIC(true, "legacyfabric", "net\\.fabricmc", "fabric-loader", ModLoaderType.LEGACY_FABRIC) { + @Override + protected boolean matchLibrary(Library library, List libraries) { + for (Library l : libraries) { + if (l.getGroupId().equals("net.legacyfabric")) { + return true; + } + } + return false; + } + }, + LEGACY_FABRIC_API(false, "legacyfabric-api", "net\\.legacyfabric", "legacyfabric-api", null), + FABRIC(true, "fabric", "net\\.fabricmc", "fabric-loader", ModLoaderType.FABRIC) { + @Override + protected boolean matchLibrary(Library library, List libraries) { + for (Library l : libraries) { + if (LEGACY_FABRIC.matchLibrary(l, libraries)) { + return false; + } + } + return super.matchLibrary(library, libraries); + } + }, FABRIC_API(true, "fabric-api", "net\\.fabricmc", "fabric-api", null), FORGE(true, "forge", "net\\.minecraftforge", "(forge|fmlloader)", ModLoaderType.FORGE) { private final Pattern FORGE_VERSION_MATCHER = Pattern.compile("^([0-9.]+)-(?[0-9.]+)(-([0-9.]+))?$"); @@ -278,6 +300,7 @@ private String scanVersion(Version version) { private final ModLoaderType modLoaderType; private static final Map PATCH_ID_MAP = new HashMap<>(); + static { for (LibraryType type : values()) { PATCH_ID_MAP.put(type.getPatchId(), type); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MojangDownloadProvider.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MojangDownloadProvider.java index df8424c1ec..6432f16c15 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MojangDownloadProvider.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MojangDownloadProvider.java @@ -22,6 +22,8 @@ import org.jackhuang.hmcl.download.fabric.FabricVersionList; import org.jackhuang.hmcl.download.forge.ForgeVersionList; import org.jackhuang.hmcl.download.game.GameVersionList; +import org.jackhuang.hmcl.download.legacyfabric.LegacyFabricAPIVersionList; +import org.jackhuang.hmcl.download.legacyfabric.LegacyFabricVersionList; import org.jackhuang.hmcl.download.liteloader.LiteLoaderVersionList; import org.jackhuang.hmcl.download.neoforge.NeoForgeOfficialVersionList; import org.jackhuang.hmcl.download.optifine.OptiFineBMCLVersionList; @@ -47,6 +49,8 @@ public class MojangDownloadProvider implements DownloadProvider { private final OptiFineBMCLVersionList optifine; private final QuiltVersionList quilt; private final QuiltAPIVersionList quiltApi; + private final LegacyFabricVersionList legacyFabric; + private final LegacyFabricAPIVersionList legacyFabricApi; public MojangDownloadProvider() { // If there is no official download channel available, fallback to BMCLAPI. @@ -62,6 +66,8 @@ public MojangDownloadProvider() { this.optifine = new OptiFineBMCLVersionList(apiRoot); this.quilt = new QuiltVersionList(this); this.quiltApi = new QuiltAPIVersionList(this); + this.legacyFabric = new LegacyFabricVersionList(this); + this.legacyFabricApi = new LegacyFabricAPIVersionList(this); } @Override @@ -97,6 +103,10 @@ public VersionList getVersionListById(String id) { return quilt; case "quilt-api": return quiltApi; + case "legacyfabric": + return legacyFabric; + case "legacyfabric-api": + return legacyFabricApi; default: throw new IllegalArgumentException("Unrecognized version list id: " + id); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricAPIInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricAPIInstallTask.java index 90c5f388a3..e74c8bf621 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricAPIInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricAPIInstallTask.java @@ -59,7 +59,7 @@ public boolean isRelyingOnDependencies() { public void execute() throws IOException { dependencies.add(new FileDownloadTask( remote.getVersion().getFile().getUrl(), - dependencyManager.getGameRepository().getRunDirectory(version.getId()).resolve("mods").resolve("fabric-api-" + remote.getVersion().getVersion() + ".jar"), + dependencyManager.getGameRepository().getModsDirectory(version.getId()).resolve("fabric-api-" + remote.getVersion().getVersion() + ".jar"), remote.getVersion().getFile().getIntegrityCheck()) ); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricAPIInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricAPIInstallTask.java new file mode 100644 index 0000000000..1a9c2de6a0 --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricAPIInstallTask.java @@ -0,0 +1,61 @@ +/* + * Hello Minecraft! Launcher + * Copyright (C) 2021 huangyuhui and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.jackhuang.hmcl.download.legacyfabric; + +import org.jackhuang.hmcl.download.DefaultDependencyManager; +import org.jackhuang.hmcl.game.Version; +import org.jackhuang.hmcl.task.FileDownloadTask; +import org.jackhuang.hmcl.task.Task; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public final class LegacyFabricAPIInstallTask extends Task { + + private final DefaultDependencyManager dependencyManager; + private final Version version; + private final LegacyFabricAPIRemoteVersion remote; + private final List> dependencies = new ArrayList<>(1); + + public LegacyFabricAPIInstallTask(DefaultDependencyManager dependencyManager, Version version, LegacyFabricAPIRemoteVersion remoteVersion) { + this.dependencyManager = dependencyManager; + this.version = version; + this.remote = remoteVersion; + } + + @Override + public Collection> getDependencies() { + return dependencies; + } + + @Override + public boolean isRelyingOnDependencies() { + return false; + } + + @Override + public void execute() throws IOException { + dependencies.add(new FileDownloadTask( + remote.getVersion().getFile().getUrl(), + dependencyManager.getGameRepository().getModsDirectory(version.getId()).resolve("legacy-fabric-api-" + remote.getVersion().getVersion() + ".jar"), + remote.getVersion().getFile().getIntegrityCheck()) + ); + } +} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricAPIRemoteVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricAPIRemoteVersion.java new file mode 100644 index 0000000000..eb21c07aab --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricAPIRemoteVersion.java @@ -0,0 +1,67 @@ +/* + * Hello Minecraft! Launcher + * Copyright (C) 2022 huangyuhui and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.jackhuang.hmcl.download.legacyfabric; + +import org.jackhuang.hmcl.download.DefaultDependencyManager; +import org.jackhuang.hmcl.download.LibraryAnalyzer; +import org.jackhuang.hmcl.download.RemoteVersion; +import org.jackhuang.hmcl.game.Version; +import org.jackhuang.hmcl.mod.RemoteMod; +import org.jackhuang.hmcl.task.Task; + +import java.time.Instant; +import java.util.List; + +public class LegacyFabricAPIRemoteVersion extends RemoteVersion { + private final String fullVersion; + private final RemoteMod.Version version; + + /** + * Constructor. + * + * @param gameVersion the Minecraft version that this remote version suits. + * @param selfVersion the version string of the remote version. + * @param urls the installer or universal jar original URL. + */ + LegacyFabricAPIRemoteVersion(String gameVersion, String selfVersion, String fullVersion, Instant datePublished, RemoteMod.Version version, List urls) { + super(LibraryAnalyzer.LibraryType.LEGACY_FABRIC_API.getPatchId(), gameVersion, selfVersion, datePublished, urls); + + this.fullVersion = fullVersion; + this.version = version; + } + + @Override + public String getFullVersion() { + return fullVersion; + } + + public RemoteMod.Version getVersion() { + return version; + } + + @Override + public Task getInstallTask(DefaultDependencyManager dependencyManager, Version baseVersion) { + return new LegacyFabricAPIInstallTask(dependencyManager, baseVersion, this); + } + + @Override + public int compareTo(RemoteVersion o) { + if (!(o instanceof LegacyFabricAPIRemoteVersion)) return 0; + return -this.getReleaseDate().compareTo(o.getReleaseDate()); + } +} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricAPIVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricAPIVersionList.java new file mode 100644 index 0000000000..da21df24a5 --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricAPIVersionList.java @@ -0,0 +1,53 @@ +/* + * Hello Minecraft! Launcher + * Copyright (C) 2022 huangyuhui and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.jackhuang.hmcl.download.legacyfabric; + +import org.jackhuang.hmcl.download.DownloadProvider; +import org.jackhuang.hmcl.download.VersionList; +import org.jackhuang.hmcl.mod.RemoteMod; +import org.jackhuang.hmcl.mod.modrinth.ModrinthRemoteModRepository; +import org.jackhuang.hmcl.task.Task; +import org.jackhuang.hmcl.util.Lang; + +import java.util.Collections; + +public class LegacyFabricAPIVersionList extends VersionList { + + private final DownloadProvider downloadProvider; + + public LegacyFabricAPIVersionList(DownloadProvider downloadProvider) { + this.downloadProvider = downloadProvider; + } + + @Override + public boolean hasType() { + return false; + } + + @Override + public Task refreshAsync() { + return Task.runAsync(() -> { + for (RemoteMod.Version modVersion : Lang.toIterable(ModrinthRemoteModRepository.MODS.getRemoteVersionsById("legacy-fabric-api"))) { + for (String gameVersion : modVersion.getGameVersions()) { + versions.put(gameVersion, new LegacyFabricAPIRemoteVersion(gameVersion, modVersion.getVersion(), modVersion.getName(), modVersion.getDatePublished(), modVersion, + Collections.singletonList(modVersion.getFile().getUrl()))); + } + } + }); + } +} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricInstallTask.java new file mode 100644 index 0000000000..eff43015d7 --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricInstallTask.java @@ -0,0 +1,216 @@ +/* + * Hello Minecraft! Launcher + * Copyright (C) 2022 huangyuhui and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.jackhuang.hmcl.download.legacyfabric; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import org.jackhuang.hmcl.download.DefaultDependencyManager; +import org.jackhuang.hmcl.download.LibraryAnalyzer; +import org.jackhuang.hmcl.download.UnsupportedInstallationException; +import org.jackhuang.hmcl.game.Arguments; +import org.jackhuang.hmcl.game.Artifact; +import org.jackhuang.hmcl.game.Library; +import org.jackhuang.hmcl.game.Version; +import org.jackhuang.hmcl.task.GetTask; +import org.jackhuang.hmcl.task.Task; +import org.jackhuang.hmcl.util.gson.JsonUtils; + +import java.util.*; + +import static org.jackhuang.hmcl.download.UnsupportedInstallationException.FABRIC_NOT_COMPATIBLE_WITH_FORGE; + +public final class LegacyFabricInstallTask extends Task { + + private final DefaultDependencyManager dependencyManager; + private final Version version; + private final LegacyFabricRemoteVersion remote; + private final GetTask launchMetaTask; + private final List> dependencies = new ArrayList<>(1); + + public LegacyFabricInstallTask(DefaultDependencyManager dependencyManager, Version version, LegacyFabricRemoteVersion remoteVersion) { + this.dependencyManager = dependencyManager; + this.version = version; + this.remote = remoteVersion; + + launchMetaTask = new GetTask(dependencyManager.getDownloadProvider().injectURLsWithCandidates(remoteVersion.getUrls())); + launchMetaTask.setCacheRepository(dependencyManager.getCacheRepository()); + } + + @Override + public boolean doPreExecute() { + return true; + } + + @Override + public void preExecute() throws Exception { + if (!Objects.equals("net.minecraft.client.main.Main", version.resolve(dependencyManager.getGameRepository()).getMainClass())) + throw new UnsupportedInstallationException(FABRIC_NOT_COMPATIBLE_WITH_FORGE); + } + + @Override + public Collection> getDependents() { + return Collections.singleton(launchMetaTask); + } + + @Override + public Collection> getDependencies() { + return dependencies; + } + + @Override + public boolean isRelyingOnDependencies() { + return false; + } + + @Override + public void execute() { + setResult(getPatch(JsonUtils.GSON.fromJson(launchMetaTask.getResult(), LegacyFabricInfo.class), remote.getGameVersion(), remote.getSelfVersion())); + + dependencies.add(dependencyManager.checkLibraryCompletionAsync(getResult(), true)); + } + + private Version getPatch(LegacyFabricInfo legacyFabricInfo, String gameVersion, String loaderVersion) { + JsonObject launcherMeta = legacyFabricInfo.launcherMeta; + Arguments arguments = new Arguments(); + + String mainClass; + if (!launcherMeta.get("mainClass").isJsonObject()) { + mainClass = launcherMeta.get("mainClass").getAsString(); + } else { + mainClass = launcherMeta.get("mainClass").getAsJsonObject().get("client").getAsString(); + } + + if (launcherMeta.has("launchwrapper")) { + String clientTweaker = launcherMeta.get("launchwrapper").getAsJsonObject().get("tweakers").getAsJsonObject().get("client").getAsJsonArray().get(0).getAsString(); + arguments = arguments.addGameArguments("--tweakClass", clientTweaker); + } + + JsonObject librariesObject = launcherMeta.getAsJsonObject("libraries"); + List libraries = new ArrayList<>(); + + // "common, server" is hard coded in fabric installer. + // Don't know the purpose of ignoring client libraries. + for (String side : new String[]{"common", "server"}) { + for (JsonElement element : librariesObject.getAsJsonArray(side)) { + libraries.add(JsonUtils.GSON.fromJson(element, Library.class)); + } + } + + // libraries.add(new Library(Artifact.fromDescriptor(legacyFabricInfo.hashed.maven), getMavenRepositoryByGroup(legacyFabricInfo.hashed.maven), null)); + libraries.add(new Library(Artifact.fromDescriptor(legacyFabricInfo.intermediary.maven), getMavenRepositoryByGroup(legacyFabricInfo.intermediary.maven), null)); + libraries.add(new Library(Artifact.fromDescriptor(legacyFabricInfo.loader.maven), getMavenRepositoryByGroup(legacyFabricInfo.loader.maven), null)); + + return new Version(LibraryAnalyzer.LibraryType.LEGACY_FABRIC.getPatchId(), loaderVersion, Version.PRIORITY_LOADER, arguments, mainClass, libraries); + } + + private static String getMavenRepositoryByGroup(String maven) { + Artifact artifact = Artifact.fromDescriptor(maven); + switch (artifact.getGroup()) { + case "net.fabricmc": + return "https://maven.fabricmc.net/"; + case "net.legacyfabric": + return "https://maven.legacyfabric.net/"; + default: + return "https://maven.fabricmc.net/"; + } + } + + public static class LegacyFabricInfo { + private final LoaderInfo loader; + private final IntermediaryInfo hashed; + private final IntermediaryInfo intermediary; + private final JsonObject launcherMeta; + + public LegacyFabricInfo(LoaderInfo loader, IntermediaryInfo hashed, IntermediaryInfo intermediary, JsonObject launcherMeta) { + this.loader = loader; + this.hashed = hashed; + this.intermediary = intermediary; + this.launcherMeta = launcherMeta; + } + + public LoaderInfo getLoader() { + return loader; + } + + public IntermediaryInfo getHashed() { + return hashed; + } + + public IntermediaryInfo getIntermediary() { + return intermediary; + } + + public JsonObject getLauncherMeta() { + return launcherMeta; + } + } + + public static class LoaderInfo { + private final String separator; + private final int build; + private final String maven; + private final String version; + private final boolean stable; + + public LoaderInfo(String separator, int build, String maven, String version, boolean stable) { + this.separator = separator; + this.build = build; + this.maven = maven; + this.version = version; + this.stable = stable; + } + + public String getSeparator() { + return separator; + } + + public int getBuild() { + return build; + } + + public String getMaven() { + return maven; + } + + public String getVersion() { + return version; + } + + public boolean isStable() { + return stable; + } + } + + public static class IntermediaryInfo { + private final String maven; + private final String version; + + public IntermediaryInfo(String maven, String version) { + this.maven = maven; + this.version = version; + } + + public String getMaven() { + return maven; + } + + public String getVersion() { + return version; + } + } +} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricRemoteVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricRemoteVersion.java new file mode 100644 index 0000000000..cd29f0fddd --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricRemoteVersion.java @@ -0,0 +1,44 @@ +/* + * Hello Minecraft! Launcher + * Copyright (C) 2022 huangyuhui and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.jackhuang.hmcl.download.legacyfabric; + +import org.jackhuang.hmcl.download.DefaultDependencyManager; +import org.jackhuang.hmcl.download.LibraryAnalyzer; +import org.jackhuang.hmcl.download.RemoteVersion; +import org.jackhuang.hmcl.game.Version; +import org.jackhuang.hmcl.task.Task; + +import java.util.List; + +public class LegacyFabricRemoteVersion extends RemoteVersion { + /** + * Constructor. + * + * @param gameVersion the Minecraft version that this remote version suits. + * @param selfVersion the version string of the remote version. + * @param urls the installer or universal jar original URL. + */ + LegacyFabricRemoteVersion(String gameVersion, String selfVersion, List urls) { + super(LibraryAnalyzer.LibraryType.LEGACY_FABRIC.getPatchId(), gameVersion, selfVersion, null, urls); + } + + @Override + public Task getInstallTask(DefaultDependencyManager dependencyManager, Version baseVersion) { + return new LegacyFabricInstallTask(dependencyManager, baseVersion, this); + } +} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricVersionList.java new file mode 100644 index 0000000000..5533e9e5ff --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricVersionList.java @@ -0,0 +1,106 @@ +/* + * Hello Minecraft! Launcher + * Copyright (C) 2022 huangyuhui and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package org.jackhuang.hmcl.download.legacyfabric; + +import org.jackhuang.hmcl.download.DownloadProvider; +import org.jackhuang.hmcl.download.VersionList; +import org.jackhuang.hmcl.task.Task; +import org.jackhuang.hmcl.util.gson.JsonUtils; +import org.jackhuang.hmcl.util.io.NetworkUtils; +import org.jetbrains.annotations.Nullable; + +import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import static org.jackhuang.hmcl.util.gson.JsonUtils.listTypeOf; + +public final class LegacyFabricVersionList extends VersionList { + private final DownloadProvider downloadProvider; + + public LegacyFabricVersionList(DownloadProvider downloadProvider) { + this.downloadProvider = downloadProvider; + } + + @Override + public boolean hasType() { + return false; + } + + @Override + public Task refreshAsync() { + return Task.runAsync(() -> { + List gameVersions = getGameVersions(GAME_META_URL); + List loaderVersions = getGameVersions(LOADER_META_URL); + + lock.writeLock().lock(); + + try { + for (String gameVersion : gameVersions) + for (String loaderVersion : loaderVersions) + versions.put(gameVersion, new LegacyFabricRemoteVersion(gameVersion, loaderVersion, + Collections.singletonList(getLaunchMetaUrl(gameVersion, loaderVersion)))); + } finally { + lock.writeLock().unlock(); + } + }); + } + + private static final String LOADER_META_URL = "https://meta.legacyfabric.net/v2/versions/loader"; + private static final String GAME_META_URL = "https://meta.legacyfabric.net/v2/versions/game"; + + private List getGameVersions(String metaUrl) throws IOException { + String json = NetworkUtils.doGet(downloadProvider.injectURLWithCandidates(metaUrl)); + return JsonUtils.GSON.fromJson(json, listTypeOf(GameVersion.class)) + .stream().map(GameVersion::getVersion).collect(Collectors.toList()); + } + + private static String getLaunchMetaUrl(String gameVersion, String loaderVersion) { + return String.format("https://meta.legacyfabric.net/v2/versions/loader/%s/%s", gameVersion, loaderVersion); + } + + private static class GameVersion { + private final String version; + private final String maven; + private final boolean stable; + + public GameVersion() { + this("", null, false); + } + + public GameVersion(String version, String maven, boolean stable) { + this.version = version; + this.maven = maven; + this.stable = stable; + } + + public String getVersion() { + return version; + } + + @Nullable + public String getMaven() { + return maven; + } + + public boolean isStable() { + return stable; + } + } +} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/quilt/QuiltAPIInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/quilt/QuiltAPIInstallTask.java index b0d9eb2bf9..5f06cccba5 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/quilt/QuiltAPIInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/quilt/QuiltAPIInstallTask.java @@ -59,7 +59,7 @@ public boolean isRelyingOnDependencies() { public void execute() throws IOException { dependencies.add(new FileDownloadTask( remote.getVersion().getFile().getUrl(), - dependencyManager.getGameRepository().getRunDirectory(version.getId()).resolve("mods").resolve("quilt-api-" + remote.getVersion().getVersion() + ".jar"), + dependencyManager.getGameRepository().getModsDirectory(version.getId()).resolve("quilt-api-" + remote.getVersion().getVersion() + ".jar"), remote.getVersion().getFile().getIntegrityCheck()) ); } 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 3f4ba0098c..67244ff99a 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java @@ -597,6 +597,9 @@ private Map getEnvVars() { if (analyzer.has(LibraryAnalyzer.LibraryType.QUILT)) { env.put("INST_QUILT", "1"); } + if (analyzer.has(LibraryAnalyzer.LibraryType.LEGACY_FABRIC)) { + env.put("INST_LEGACYFABRIC", "1"); + } env.putAll(options.getEnvironmentVariables()); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/ModLoaderType.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/ModLoaderType.java index f4b8feacd8..c1205803a6 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/ModLoaderType.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/ModLoaderType.java @@ -25,5 +25,6 @@ public enum ModLoaderType { FABRIC, QUILT, LITE_LOADER, - PACK; + LEGACY_FABRIC, + PACK } 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 2429b10737..98b3c9a973 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 @@ -109,6 +109,8 @@ public void execute() throws Exception { addons.add(new McbbsModpackManifest.Addon(FABRIC.getPatchId(), fabricVersion))); analyzer.getVersion(QUILT).ifPresent(quiltVersion -> addons.add(new McbbsModpackManifest.Addon(QUILT.getPatchId(), quiltVersion))); + analyzer.getVersion(LEGACY_FABRIC).ifPresent(quiltVersion -> + addons.add(new McbbsModpackManifest.Addon(LEGACY_FABRIC.getPatchId(), quiltVersion))); List libraries = new ArrayList<>(); // TODO libraries From 07320a4bf474b4a4374666844406c62b0594ff9d Mon Sep 17 00:00:00 2001 From: Ciilu <109708109+Ciilu@users.noreply.github.com> Date: Sun, 28 Dec 2025 10:40:18 +0800 Subject: [PATCH 02/11] update --- .../main/java/org/jackhuang/hmcl/ui/versions/ModListPage.java | 4 ++++ 1 file changed, 4 insertions(+) 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 e91f1b3da9..5b937682a1 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 @@ -152,6 +152,10 @@ private void updateSupportedLoaders(ModManager modManager) { supportedLoaders.add(ModLoaderType.FABRIC); } + if (analyzer.has(LibraryAnalyzer.LibraryType.LEGACY_FABRIC)) { + supportedLoaders.add(ModLoaderType.FABRIC); + } + if (analyzer.has(LibraryAnalyzer.LibraryType.FABRIC) && modManager.hasMod("kilt", ModLoaderType.FABRIC)) { supportedLoaders.add(ModLoaderType.FORGE); supportedLoaders.add(ModLoaderType.NEO_FORGED); From ff66c0f5ca28b217a56c25136af33fe8e3ce49aa Mon Sep 17 00:00:00 2001 From: Ciilu <109708109+Ciilu@users.noreply.github.com> Date: Sun, 28 Dec 2025 10:54:22 +0800 Subject: [PATCH 03/11] update --- .../hmcl/download/LibraryAnalyzer.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 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 c0eb38d6ec..2b4d8ace94 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/LibraryAnalyzer.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/LibraryAnalyzer.java @@ -189,31 +189,36 @@ public Set getModLoaders() { public enum LibraryType { MINECRAFT(true, "game", "^$", "^$", null), - LEGACY_FABRIC(true, "legacyfabric", "net\\.fabricmc", "fabric-loader", ModLoaderType.LEGACY_FABRIC) { + LEGACY_FABRIC(true, "legacyfabric", "net.fabricmc", "fabric-loader", ModLoaderType.LEGACY_FABRIC) { @Override protected boolean matchLibrary(Library library, List libraries) { + if (!super.matchLibrary(library, libraries)) { + return false; + } for (Library l : libraries) { - if (l.getGroupId().equals("net.legacyfabric")) { + if ("net.legacyfabric".equals(l.getGroupId())) { return true; } } return false; } }, - LEGACY_FABRIC_API(false, "legacyfabric-api", "net\\.legacyfabric", "legacyfabric-api", null), - FABRIC(true, "fabric", "net\\.fabricmc", "fabric-loader", ModLoaderType.FABRIC) { + LEGACY_FABRIC_API(false, "legacyfabric-api", "net.legacyfabric", "legacyfabric-api", null), + FABRIC(true, "fabric", "net.fabricmc", "fabric-loader", ModLoaderType.FABRIC) { @Override protected boolean matchLibrary(Library library, List libraries) { + if (!super.matchLibrary(library, libraries)) { + return false; + } for (Library l : libraries) { - if (LEGACY_FABRIC.matchLibrary(l, libraries)) { + if ("net.legacyfabric".equals(l.getGroupId())) { return false; } } - return super.matchLibrary(library, libraries); + return true; } }, - FABRIC_API(true, "fabric-api", "net\\.fabricmc", "fabric-api", null), - FORGE(true, "forge", "net\\.minecraftforge", "(forge|fmlloader)", ModLoaderType.FORGE) { + FABRIC_API(true, "fabric-api", "net.fabricmc", "fabric-api", null),FORGE(true, "forge", "net\\.minecraftforge", "(forge|fmlloader)", ModLoaderType.FORGE) { private final Pattern FORGE_VERSION_MATCHER = Pattern.compile("^([0-9.]+)-(?[0-9.]+)(-([0-9.]+))?$"); @Override From 829c91809ef1b48787d3197e2b7f2abeaf7f340b Mon Sep 17 00:00:00 2001 From: Ciilu <109708109+Ciilu@users.noreply.github.com> Date: Mon, 29 Dec 2025 22:00:25 +0800 Subject: [PATCH 04/11] update --- .../org/jackhuang/hmcl/ui/InstallerItem.java | 43 ++----- .../hmcl/ui/construct/TaskListPane.java | 34 +++--- .../hmcl/ui/download/InstallersPage.java | 35 ++---- .../hmcl/ui/versions/ModListPageSkin.java | 59 +++------- .../download/BMCLAPIDownloadProvider.java | 43 +++---- .../hmcl/download/MojangDownloadProvider.java | 43 +++---- .../download/fabric/FabricInstallTask.java | 4 + .../legacyfabric/LegacyFabricInstallTask.java | 108 ++---------------- .../hmcl/download/quilt/QuiltInstallTask.java | 4 + 9 files changed, 102 insertions(+), 271 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java index d367c8cdcd..48a2870f76 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java @@ -128,39 +128,16 @@ public InstallerItem(String id, Style style) { this.style = style; switch (id) { - case "game": - iconType = VersionIconType.GRASS; - break; - case "fabric": - case "fabric-api": - iconType = VersionIconType.FABRIC; - break; - case "legacyfabric": - case "legacyfabric-api": - iconType = VersionIconType.LEGACY_FABRIC; - break; - case "forge": - iconType = VersionIconType.FORGE; - break; - case "cleanroom": - iconType = VersionIconType.CLEANROOM; - break; - case "liteloader": - iconType = VersionIconType.CHICKEN; - break; - case "optifine": - iconType = VersionIconType.OPTIFINE; - break; - case "quilt": - case "quilt-api": - iconType = VersionIconType.QUILT; - break; - case "neoforge": - iconType = VersionIconType.NEO_FORGE; - break; - default: - iconType = null; - break; + case "game" -> iconType = VersionIconType.GRASS; + case "fabric", "fabric-api" -> iconType = VersionIconType.FABRIC; + case "legacyfabric", "legacyfabric-api" -> iconType = VersionIconType.LEGACY_FABRIC; + case "forge" -> iconType = VersionIconType.FORGE; + case "cleanroom" -> iconType = VersionIconType.CLEANROOM; + case "liteloader" -> iconType = VersionIconType.CHICKEN; + case "optifine" -> iconType = VersionIconType.OPTIFINE; + case "quilt", "quilt-api" -> iconType = VersionIconType.QUILT; + case "neoforge" -> iconType = VersionIconType.NEO_FORGE; + default -> iconType = null; } } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java index d1d3b9eb7b..dcc4da6270 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java @@ -431,23 +431,23 @@ private StageNode(String stage) { // CHECKSTYLE:OFF // @formatter:off switch (stageKey) { - case "hmcl.modpack": message = i18n("install.modpack"); break; - case "hmcl.modpack.download": message = i18n("launch.state.modpack"); break; - case "hmcl.install.assets": message = i18n("assets.download"); break; - case "hmcl.install.libraries": message = i18n("libraries.download"); break; - case "hmcl.install.game": message = i18n("install.installer.install", i18n("install.installer.game") + " " + stageValue); break; - case "hmcl.install.forge": message = i18n("install.installer.install", i18n("install.installer.forge") + " " + stageValue); break; - case "hmcl.install.cleanroom": message = i18n("install.installer.install", i18n("install.installer.cleanroom") + " " + stageValue); break; - case "hmcl.install.neoforge": message = i18n("install.installer.install", i18n("install.installer.neoforge") + " " + stageValue); break; - case "hmcl.install.liteloader": message = i18n("install.installer.install", i18n("install.installer.liteloader") + " " + stageValue); break; - case "hmcl.install.optifine": message = i18n("install.installer.install", i18n("install.installer.optifine") + " " + stageValue); break; - case "hmcl.install.fabric": message = i18n("install.installer.install", i18n("install.installer.fabric") + " " + stageValue); break; - case "hmcl.install.fabric-api": message = i18n("install.installer.install", i18n("install.installer.fabric-api") + " " + stageValue); break; - case "hmcl.install.legacyfabric": message = i18n("install.installer.install", i18n("install.installer.legacyfabric-api") + " " + stageValue); break; - case "hmcl.install.legacyfabric-api": message = i18n("install.installer.install", i18n("install.installer.legacyfabric-api") + " " + stageValue); break; - case "hmcl.install.quilt": message = i18n("install.installer.install", i18n("install.installer.quilt") + " " + stageValue); break; - case "hmcl.install.quilt-api": message = i18n("install.installer.install", i18n("install.installer.quilt-api") + " " + stageValue); break; - default: message = i18n(stageKey); break; + case "hmcl.modpack" -> message = i18n("install.modpack"); + case "hmcl.modpack.download" -> message = i18n("launch.state.modpack"); + case "hmcl.install.assets" -> message = i18n("assets.download"); + case "hmcl.install.libraries" -> message = i18n("libraries.download"); + case "hmcl.install.game" -> message = i18n("install.installer.install", i18n("install.installer.game") + " " + stageValue); + case "hmcl.install.forge" -> message = i18n("install.installer.install", i18n("install.installer.forge") + " " + stageValue); + case "hmcl.install.cleanroom" -> message = i18n("install.installer.install", i18n("install.installer.cleanroom") + " " + stageValue); + case "hmcl.install.neoforge" -> message = i18n("install.installer.install", i18n("install.installer.neoforge") + " " + stageValue); + case "hmcl.install.liteloader" -> message = i18n("install.installer.install", i18n("install.installer.liteloader") + " " + stageValue); + case "hmcl.install.optifine" -> message = i18n("install.installer.install", i18n("install.installer.optifine") + " " + stageValue); + case "hmcl.install.fabric" -> message = i18n("install.installer.install", i18n("install.installer.fabric") + " " + stageValue); + case "hmcl.install.fabric-api" -> message = i18n("install.installer.install", i18n("install.installer.fabric-api") + " " + stageValue); + case "hmcl.install.legacyfabric" -> message = i18n("install.installer.install", i18n("install.installer.legacyfabric") + " " + stageValue); + case "hmcl.install.legacyfabric-api" -> message = i18n("install.installer.install", i18n("install.installer.legacyfabric-api") + " " + stageValue); + case "hmcl.install.quilt" -> message = i18n("install.installer.install", i18n("install.installer.quilt") + " " + stageValue); + case "hmcl.install.quilt-api" -> message = i18n("install.installer.install", i18n("install.installer.quilt-api") + " " + stageValue); + default -> message = i18n(stageKey); } // @formatter:on // CHECKSTYLE:ON diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java index d2c2f3774f..7d10d20973 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java @@ -123,32 +123,17 @@ private void setTxtNameWithLoaders() { if (libraryType != null) { String loaderName; switch (libraryType) { - case FORGE: - loaderName = i18n("install.installer.forge"); - break; - case NEO_FORGE: - loaderName = i18n("install.installer.neoforge"); - break; - case CLEANROOM: - loaderName = i18n("install.installer.cleanroom"); - break; - case LEGACY_FABRIC: - loaderName = i18n("install.installer.legacyfabric").replace(" ","_"); - break; - case FABRIC: - loaderName = i18n("install.installer.fabric"); - break; - case LITELOADER: - loaderName = i18n("install.installer.liteloader"); - break; - case QUILT: - loaderName = i18n("install.installer.quilt"); - break; - case OPTIFINE: - loaderName = i18n("install.installer.optifine"); - break; - default: + case FORGE -> loaderName = i18n("install.installer.forge"); + case NEO_FORGE -> loaderName = i18n("install.installer.neoforge"); + case CLEANROOM -> loaderName = i18n("install.installer.cleanroom"); + case LEGACY_FABRIC -> loaderName = i18n("install.installer.legacyfabric").replace(" ", "_"); + case FABRIC -> loaderName = i18n("install.installer.fabric"); + case LITELOADER -> loaderName = i18n("install.installer.liteloader"); + case QUILT -> loaderName = i18n("install.installer.quilt"); + case OPTIFINE -> loaderName = i18n("install.installer.optifine"); + default -> { continue; + } } nameBuilder.append("-").append(loaderName); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java index 77f5bc0a44..3cb9715f66 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java @@ -459,29 +459,16 @@ final class ModInfoDialog extends JFXDialogLayout { for (ModLoaderType modLoaderType : versionOptional.get().getLoaders()) { String loaderName; switch (modLoaderType) { - case FORGE: - loaderName = i18n("install.installer.forge"); - break; - case CLEANROOM: - loaderName = i18n("install.installer.cleanroom"); - break; - case LEGACY_FABRIC: - loaderName = i18n("install.installer.legacyfabric"); - break; - case NEO_FORGED: - loaderName = i18n("install.installer.neoforge"); - break; - case FABRIC: - loaderName = i18n("install.installer.fabric"); - break; - case LITE_LOADER: - loaderName = i18n("install.installer.liteloader"); - break; - case QUILT: - loaderName = i18n("install.installer.quilt"); - break; - default: + case FORGE -> loaderName = i18n("install.installer.forge"); + case CLEANROOM -> loaderName = i18n("install.installer.cleanroom"); + case LEGACY_FABRIC -> loaderName = i18n("install.installer.legacyfabric"); + case NEO_FORGED -> loaderName = i18n("install.installer.neoforge"); + case FABRIC -> loaderName = i18n("install.installer.fabric"); + case LITE_LOADER -> loaderName = i18n("install.installer.liteloader"); + case QUILT -> loaderName = i18n("install.installer.quilt"); + default -> { continue; + } } if (title.getTags() .stream() @@ -654,27 +641,13 @@ protected void updateControl(ModInfoObject dataItem, boolean empty) { } else if (!ModListPageSkin.this.getSkinnable().supportedLoaders.contains(modLoaderType)) { warning.add(i18n("mods.warning.loader_mismatch")); switch (dataItem.getModInfo().getModLoaderType()) { - case FORGE: - content.addTagWarning(i18n("install.installer.forge")); - break; - case LEGACY_FABRIC: - content.addTagWarning(i18n("install.installer.legacyfabric")); - break; - case CLEANROOM: - content.addTagWarning(i18n("install.installer.cleanroom")); - break; - case NEO_FORGED: - content.addTagWarning(i18n("install.installer.neoforge")); - break; - case FABRIC: - content.addTagWarning(i18n("install.installer.fabric")); - break; - case LITE_LOADER: - content.addTagWarning(i18n("install.installer.liteloader")); - break; - case QUILT: - content.addTagWarning(i18n("install.installer.quilt")); - break; + case FORGE -> content.addTagWarning(i18n("install.installer.forge")); + case LEGACY_FABRIC -> content.addTagWarning(i18n("install.installer.legacyfabric")); + case CLEANROOM -> content.addTagWarning(i18n("install.installer.cleanroom")); + case NEO_FORGED -> content.addTagWarning(i18n("install.installer.neoforge")); + case FABRIC -> content.addTagWarning(i18n("install.installer.fabric")); + case LITE_LOADER -> content.addTagWarning(i18n("install.installer.liteloader")); + case QUILT -> content.addTagWarning(i18n("install.installer.quilt")); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java index 88b6223c7c..7042d32279 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java @@ -119,34 +119,21 @@ public List getAssetObjectCandidates(String assetObjectLocation) { @Override public VersionList getVersionListById(String id) { - switch (id) { - case "game": - return game; - case "fabric": - return fabric; - case "fabric-api": - return fabricApi; - case "forge": - return forge; - case "cleanroom": - return cleanroom; - case "neoforge": - return neoforge; - case "liteloader": - return liteLoader; - case "optifine": - return optifine; - case "quilt": - return quilt; - case "quilt-api": - return quiltApi; - case "legacyfabric": - return legacyFabric; - case "legacyfabric-api": - return legacyFabricApi; - default: - throw new IllegalArgumentException("Unrecognized version list id: " + id); - } + return switch (id) { + case "game" -> game; + case "fabric" -> fabric; + case "fabric-api" -> fabricApi; + case "forge" -> forge; + case "cleanroom" -> cleanroom; + case "neoforge" -> neoforge; + case "liteloader" -> liteLoader; + case "optifine" -> optifine; + case "quilt" -> quilt; + case "quilt-api" -> quiltApi; + case "legacyfabric" -> legacyFabric; + case "legacyfabric-api" -> legacyFabricApi; + default -> throw new IllegalArgumentException("Unrecognized version list id: " + id); + }; } @Override diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MojangDownloadProvider.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MojangDownloadProvider.java index 6432f16c15..716acbcc39 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MojangDownloadProvider.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MojangDownloadProvider.java @@ -82,34 +82,21 @@ public List getAssetObjectCandidates(String assetObjectLocation) { @Override public VersionList getVersionListById(String id) { - switch (id) { - case "game": - return game; - case "fabric": - return fabric; - case "fabric-api": - return fabricApi; - case "forge": - return forge; - case "cleanroom": - return cleanroom; - case "neoforge": - return neoforge; - case "liteloader": - return liteLoader; - case "optifine": - return optifine; - case "quilt": - return quilt; - case "quilt-api": - return quiltApi; - case "legacyfabric": - return legacyFabric; - case "legacyfabric-api": - return legacyFabricApi; - default: - throw new IllegalArgumentException("Unrecognized version list id: " + id); - } + return switch (id) { + case "game" -> game; + case "fabric" -> fabric; + case "fabric-api" -> fabricApi; + case "forge" -> forge; + case "cleanroom" -> cleanroom; + case "neoforge" -> neoforge; + case "liteloader" -> liteLoader; + case "optifine" -> optifine; + case "quilt" -> quilt; + case "quilt-api" -> quiltApi; + case "legacyfabric" -> legacyFabric; + case "legacyfabric-api" -> legacyFabricApi; + default -> throw new IllegalArgumentException("Unrecognized version list id: " + id); + }; } @Override diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricInstallTask.java index 458d8dd9b4..b21586201a 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/fabric/FabricInstallTask.java @@ -28,6 +28,7 @@ import org.jackhuang.hmcl.game.Version; import org.jackhuang.hmcl.task.GetTask; import org.jackhuang.hmcl.task.Task; +import org.jackhuang.hmcl.util.gson.JsonSerializable; import org.jackhuang.hmcl.util.gson.JsonUtils; import java.io.IOException; @@ -127,6 +128,7 @@ private Version getPatch(FabricInfo fabricInfo, String gameVersion, String loade return new Version(LibraryAnalyzer.LibraryType.FABRIC.getPatchId(), loaderVersion, Version.PRIORITY_LOADER, arguments, mainClass, libraries); } + @JsonSerializable public static class FabricInfo { private final LoaderInfo loader; private final IntermediaryInfo intermediary; @@ -151,6 +153,7 @@ public JsonObject getLauncherMeta() { } } + @JsonSerializable public static class LoaderInfo { private final String separator; private final int build; @@ -187,6 +190,7 @@ public boolean isStable() { } } + @JsonSerializable public static class IntermediaryInfo { private final String maven; private final String version; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricInstallTask.java index eff43015d7..7ef8cd1227 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/legacyfabric/LegacyFabricInstallTask.java @@ -22,6 +22,7 @@ import org.jackhuang.hmcl.download.DefaultDependencyManager; import org.jackhuang.hmcl.download.LibraryAnalyzer; import org.jackhuang.hmcl.download.UnsupportedInstallationException; +import org.jackhuang.hmcl.download.fabric.FabricInstallTask; import org.jackhuang.hmcl.game.Arguments; import org.jackhuang.hmcl.game.Artifact; import org.jackhuang.hmcl.game.Library; @@ -79,13 +80,13 @@ public boolean isRelyingOnDependencies() { @Override public void execute() { - setResult(getPatch(JsonUtils.GSON.fromJson(launchMetaTask.getResult(), LegacyFabricInfo.class), remote.getGameVersion(), remote.getSelfVersion())); + setResult(getPatch(JsonUtils.GSON.fromJson(launchMetaTask.getResult(), FabricInstallTask.FabricInfo.class), remote.getGameVersion(), remote.getSelfVersion())); dependencies.add(dependencyManager.checkLibraryCompletionAsync(getResult(), true)); } - private Version getPatch(LegacyFabricInfo legacyFabricInfo, String gameVersion, String loaderVersion) { - JsonObject launcherMeta = legacyFabricInfo.launcherMeta; + private Version getPatch(FabricInstallTask.FabricInfo legacyFabricInfo, String gameVersion, String loaderVersion) { + JsonObject launcherMeta = legacyFabricInfo.getLauncherMeta(); Arguments arguments = new Arguments(); String mainClass; @@ -112,105 +113,18 @@ private Version getPatch(LegacyFabricInfo legacyFabricInfo, String gameVersion, } // libraries.add(new Library(Artifact.fromDescriptor(legacyFabricInfo.hashed.maven), getMavenRepositoryByGroup(legacyFabricInfo.hashed.maven), null)); - libraries.add(new Library(Artifact.fromDescriptor(legacyFabricInfo.intermediary.maven), getMavenRepositoryByGroup(legacyFabricInfo.intermediary.maven), null)); - libraries.add(new Library(Artifact.fromDescriptor(legacyFabricInfo.loader.maven), getMavenRepositoryByGroup(legacyFabricInfo.loader.maven), null)); + libraries.add(new Library(Artifact.fromDescriptor(legacyFabricInfo.getIntermediary().getMaven()), getMavenRepositoryByGroup(legacyFabricInfo.getIntermediary().getMaven()), null)); + libraries.add(new Library(Artifact.fromDescriptor(legacyFabricInfo.getLoader().getMaven()), getMavenRepositoryByGroup(legacyFabricInfo.getLoader().getMaven()), null)); return new Version(LibraryAnalyzer.LibraryType.LEGACY_FABRIC.getPatchId(), loaderVersion, Version.PRIORITY_LOADER, arguments, mainClass, libraries); } private static String getMavenRepositoryByGroup(String maven) { Artifact artifact = Artifact.fromDescriptor(maven); - switch (artifact.getGroup()) { - case "net.fabricmc": - return "https://maven.fabricmc.net/"; - case "net.legacyfabric": - return "https://maven.legacyfabric.net/"; - default: - return "https://maven.fabricmc.net/"; - } - } - - public static class LegacyFabricInfo { - private final LoaderInfo loader; - private final IntermediaryInfo hashed; - private final IntermediaryInfo intermediary; - private final JsonObject launcherMeta; - - public LegacyFabricInfo(LoaderInfo loader, IntermediaryInfo hashed, IntermediaryInfo intermediary, JsonObject launcherMeta) { - this.loader = loader; - this.hashed = hashed; - this.intermediary = intermediary; - this.launcherMeta = launcherMeta; - } - - public LoaderInfo getLoader() { - return loader; - } - - public IntermediaryInfo getHashed() { - return hashed; - } - - public IntermediaryInfo getIntermediary() { - return intermediary; - } - - public JsonObject getLauncherMeta() { - return launcherMeta; - } - } - - public static class LoaderInfo { - private final String separator; - private final int build; - private final String maven; - private final String version; - private final boolean stable; - - public LoaderInfo(String separator, int build, String maven, String version, boolean stable) { - this.separator = separator; - this.build = build; - this.maven = maven; - this.version = version; - this.stable = stable; - } - - public String getSeparator() { - return separator; - } - - public int getBuild() { - return build; - } - - public String getMaven() { - return maven; - } - - public String getVersion() { - return version; - } - - public boolean isStable() { - return stable; - } - } - - public static class IntermediaryInfo { - private final String maven; - private final String version; - - public IntermediaryInfo(String maven, String version) { - this.maven = maven; - this.version = version; - } - - public String getMaven() { - return maven; - } - - public String getVersion() { - return version; - } + return switch (artifact.getGroup()) { + case "net.fabricmc" -> "https://maven.fabricmc.net/"; + case "net.legacyfabric" -> "https://maven.legacyfabric.net/"; + default -> "https://maven.fabricmc.net/"; + }; } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/quilt/QuiltInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/quilt/QuiltInstallTask.java index c0bd512907..01642cecf0 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/quilt/QuiltInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/quilt/QuiltInstallTask.java @@ -28,6 +28,7 @@ import org.jackhuang.hmcl.game.Version; import org.jackhuang.hmcl.task.GetTask; import org.jackhuang.hmcl.task.Task; +import org.jackhuang.hmcl.util.gson.JsonSerializable; import org.jackhuang.hmcl.util.gson.JsonUtils; import java.util.*; @@ -135,6 +136,7 @@ private static String getMavenRepositoryByGroup(String maven) { } } + @JsonSerializable public static class QuiltInfo { private final LoaderInfo loader; private final IntermediaryInfo hashed; @@ -165,6 +167,7 @@ public JsonObject getLauncherMeta() { } } + @JsonSerializable public static class LoaderInfo { private final String separator; private final int build; @@ -201,6 +204,7 @@ public boolean isStable() { } } + @JsonSerializable public static class IntermediaryInfo { private final String maven; private final String version; From f804625dcedd2a9bec0264cb125419ac10ac282a Mon Sep 17 00:00:00 2001 From: Glavo Date: Wed, 7 Jan 2026 22:45:15 +0800 Subject: [PATCH 05/11] update --- .../org/jackhuang/hmcl/ui/InstallerItem.java | 24 +++++------ .../hmcl/ui/construct/TaskListPane.java | 38 +++++++++--------- .../hmcl/ui/download/InstallersPage.java | 28 ++++++------- .../resources/assets/img/legacyfabric.png | Bin 2411 -> 2404 bytes .../resources/assets/img/legacyfabric@2x.png | Bin 3923 -> 3575 bytes 5 files changed, 45 insertions(+), 45 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java index 48a2870f76..486d769b82 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java @@ -127,18 +127,18 @@ public InstallerItem(String id, Style style) { this.id = id; this.style = style; - switch (id) { - case "game" -> iconType = VersionIconType.GRASS; - case "fabric", "fabric-api" -> iconType = VersionIconType.FABRIC; - case "legacyfabric", "legacyfabric-api" -> iconType = VersionIconType.LEGACY_FABRIC; - case "forge" -> iconType = VersionIconType.FORGE; - case "cleanroom" -> iconType = VersionIconType.CLEANROOM; - case "liteloader" -> iconType = VersionIconType.CHICKEN; - case "optifine" -> iconType = VersionIconType.OPTIFINE; - case "quilt", "quilt-api" -> iconType = VersionIconType.QUILT; - case "neoforge" -> iconType = VersionIconType.NEO_FORGE; - default -> iconType = null; - } + iconType = switch (id) { + case "game" -> VersionIconType.GRASS; + case "fabric", "fabric-api" -> VersionIconType.FABRIC; + case "legacyfabric", "legacyfabric-api" -> VersionIconType.LEGACY_FABRIC; + case "forge" -> VersionIconType.FORGE; + case "cleanroom" -> VersionIconType.CLEANROOM; + case "liteloader" -> VersionIconType.CHICKEN; + case "optifine" -> VersionIconType.OPTIFINE; + case "quilt", "quilt-api" -> VersionIconType.QUILT; + case "neoforge" -> VersionIconType.NEO_FORGE; + default -> null; + }; } public String getLibraryId() { diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java index dcc4da6270..0eb62cbed8 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskListPane.java @@ -430,25 +430,25 @@ private StageNode(String stage) { // CHECKSTYLE:OFF // @formatter:off - switch (stageKey) { - case "hmcl.modpack" -> message = i18n("install.modpack"); - case "hmcl.modpack.download" -> message = i18n("launch.state.modpack"); - case "hmcl.install.assets" -> message = i18n("assets.download"); - case "hmcl.install.libraries" -> message = i18n("libraries.download"); - case "hmcl.install.game" -> message = i18n("install.installer.install", i18n("install.installer.game") + " " + stageValue); - case "hmcl.install.forge" -> message = i18n("install.installer.install", i18n("install.installer.forge") + " " + stageValue); - case "hmcl.install.cleanroom" -> message = i18n("install.installer.install", i18n("install.installer.cleanroom") + " " + stageValue); - case "hmcl.install.neoforge" -> message = i18n("install.installer.install", i18n("install.installer.neoforge") + " " + stageValue); - case "hmcl.install.liteloader" -> message = i18n("install.installer.install", i18n("install.installer.liteloader") + " " + stageValue); - case "hmcl.install.optifine" -> message = i18n("install.installer.install", i18n("install.installer.optifine") + " " + stageValue); - case "hmcl.install.fabric" -> message = i18n("install.installer.install", i18n("install.installer.fabric") + " " + stageValue); - case "hmcl.install.fabric-api" -> message = i18n("install.installer.install", i18n("install.installer.fabric-api") + " " + stageValue); - case "hmcl.install.legacyfabric" -> message = i18n("install.installer.install", i18n("install.installer.legacyfabric") + " " + stageValue); - case "hmcl.install.legacyfabric-api" -> message = i18n("install.installer.install", i18n("install.installer.legacyfabric-api") + " " + stageValue); - case "hmcl.install.quilt" -> message = i18n("install.installer.install", i18n("install.installer.quilt") + " " + stageValue); - case "hmcl.install.quilt-api" -> message = i18n("install.installer.install", i18n("install.installer.quilt-api") + " " + stageValue); - default -> message = i18n(stageKey); - } + message = switch (stageKey) { + case "hmcl.modpack" -> i18n("install.modpack"); + case "hmcl.modpack.download" -> i18n("launch.state.modpack"); + case "hmcl.install.assets" -> i18n("assets.download"); + case "hmcl.install.libraries" -> i18n("libraries.download"); + case "hmcl.install.game" -> i18n("install.installer.install", i18n("install.installer.game") + " " + stageValue); + case "hmcl.install.forge" -> i18n("install.installer.install", i18n("install.installer.forge") + " " + stageValue); + case "hmcl.install.cleanroom" -> i18n("install.installer.install", i18n("install.installer.cleanroom") + " " + stageValue); + case "hmcl.install.neoforge" -> i18n("install.installer.install", i18n("install.installer.neoforge") + " " + stageValue); + case "hmcl.install.liteloader" -> i18n("install.installer.install", i18n("install.installer.liteloader") + " " + stageValue); + case "hmcl.install.optifine" -> i18n("install.installer.install", i18n("install.installer.optifine") + " " + stageValue); + case "hmcl.install.fabric" -> i18n("install.installer.install", i18n("install.installer.fabric") + " " + stageValue); + case "hmcl.install.fabric-api" -> i18n("install.installer.install", i18n("install.installer.fabric-api") + " " + stageValue); + case "hmcl.install.legacyfabric" -> i18n("install.installer.install", i18n("install.installer.legacyfabric") + " " + stageValue); + case "hmcl.install.legacyfabric-api" -> i18n("install.installer.install", i18n("install.installer.legacyfabric-api") + " " + stageValue); + case "hmcl.install.quilt" -> i18n("install.installer.install", i18n("install.installer.quilt") + " " + stageValue); + case "hmcl.install.quilt-api" -> i18n("install.installer.install", i18n("install.installer.quilt-api") + " " + stageValue); + default -> i18n(stageKey); + }; // @formatter:on // CHECKSTYLE:ON diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java index 7d10d20973..efc8b25c07 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/download/InstallersPage.java @@ -121,20 +121,20 @@ private void setTxtNameWithLoaders() { LibraryAnalyzer.LibraryType libraryType = LibraryAnalyzer.LibraryType.fromPatchId(libraryId); if (libraryType != null) { - String loaderName; - switch (libraryType) { - case FORGE -> loaderName = i18n("install.installer.forge"); - case NEO_FORGE -> loaderName = i18n("install.installer.neoforge"); - case CLEANROOM -> loaderName = i18n("install.installer.cleanroom"); - case LEGACY_FABRIC -> loaderName = i18n("install.installer.legacyfabric").replace(" ", "_"); - case FABRIC -> loaderName = i18n("install.installer.fabric"); - case LITELOADER -> loaderName = i18n("install.installer.liteloader"); - case QUILT -> loaderName = i18n("install.installer.quilt"); - case OPTIFINE -> loaderName = i18n("install.installer.optifine"); - default -> { - continue; - } - } + String loaderName = switch (libraryType) { + case FORGE -> i18n("install.installer.forge"); + case NEO_FORGE -> i18n("install.installer.neoforge"); + case CLEANROOM -> i18n("install.installer.cleanroom"); + case LEGACY_FABRIC -> i18n("install.installer.legacyfabric").replace(" ", "_"); + case FABRIC -> i18n("install.installer.fabric"); + case LITELOADER -> i18n("install.installer.liteloader"); + case QUILT -> i18n("install.installer.quilt"); + case OPTIFINE -> i18n("install.installer.optifine"); + default -> null; + }; + + if (loaderName == null) + continue; nameBuilder.append("-").append(loaderName); } diff --git a/HMCL/src/main/resources/assets/img/legacyfabric.png b/HMCL/src/main/resources/assets/img/legacyfabric.png index c98938a23fdfcd1c5b8920f0c51aaa4832efacac..6dc7d3a661a4cb9a653ed297bb87082326f97e19 100644 GIT binary patch delta 2112 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 delta 2885 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 From 547f216e1d8e0cc19f8511918280c6baa086e3c9 Mon Sep 17 00:00:00 2001 From: Glavo Date: Wed, 7 Jan 2026 22:46:30 +0800 Subject: [PATCH 06/11] update --- .../java/org/jackhuang/hmcl/game/HMCLGameRepository.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 65752f2ad6..8465e30cb3 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java @@ -317,12 +317,12 @@ public Image getVersionIconImage(String id) { if (LibraryAnalyzer.isModded(this, version)) { LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version, null); - if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.LEGACY_FABRIC)) - return VersionIconType.LEGACY_FABRIC.getIcon(); - else if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.FABRIC)) + if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.FABRIC)) return VersionIconType.FABRIC.getIcon(); else if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.QUILT)) return VersionIconType.QUILT.getIcon(); + else if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.LEGACY_FABRIC)) + return VersionIconType.LEGACY_FABRIC.getIcon(); else if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.NEO_FORGE)) return VersionIconType.NEO_FORGE.getIcon(); else if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.FORGE)) From 1482b33c9a00caba8493747b32406113f1dcfdd1 Mon Sep 17 00:00:00 2001 From: Glavo Date: Wed, 7 Jan 2026 22:46:54 +0800 Subject: [PATCH 07/11] update --- .../main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 8465e30cb3..ed1f3d0561 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java @@ -317,7 +317,7 @@ public Image getVersionIconImage(String id) { if (LibraryAnalyzer.isModded(this, version)) { LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version, null); - if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.FABRIC)) + if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.FABRIC)) return VersionIconType.FABRIC.getIcon(); else if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.QUILT)) return VersionIconType.QUILT.getIcon(); From 87a39e5b39f6c7ba8eb4059aa823adb754737377 Mon Sep 17 00:00:00 2001 From: Glavo Date: Wed, 7 Jan 2026 22:49:30 +0800 Subject: [PATCH 08/11] update --- .../hmcl/ui/versions/ModListPageSkin.java | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java index 3cb9715f66..7b018768d5 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/ModListPageSkin.java @@ -457,19 +457,18 @@ final class ModInfoDialog extends JFXDialogLayout { RemoteMod remoteMod = repository.getModById(versionOptional.get().getModid()); FXUtils.runInFX(() -> { for (ModLoaderType modLoaderType : versionOptional.get().getLoaders()) { - String loaderName; - switch (modLoaderType) { - case FORGE -> loaderName = i18n("install.installer.forge"); - case CLEANROOM -> loaderName = i18n("install.installer.cleanroom"); - case LEGACY_FABRIC -> loaderName = i18n("install.installer.legacyfabric"); - case NEO_FORGED -> loaderName = i18n("install.installer.neoforge"); - case FABRIC -> loaderName = i18n("install.installer.fabric"); - case LITE_LOADER -> loaderName = i18n("install.installer.liteloader"); - case QUILT -> loaderName = i18n("install.installer.quilt"); - default -> { - continue; - } - } + String loaderName = switch (modLoaderType) { + case FORGE -> i18n("install.installer.forge"); + case CLEANROOM -> i18n("install.installer.cleanroom"); + case LEGACY_FABRIC -> i18n("install.installer.legacyfabric"); + case NEO_FORGED -> i18n("install.installer.neoforge"); + case FABRIC -> i18n("install.installer.fabric"); + case LITE_LOADER -> i18n("install.installer.liteloader"); + case QUILT -> i18n("install.installer.quilt"); + default -> null; + }; + if (loaderName == null) + continue; if (title.getTags() .stream() .noneMatch(it -> it.getText().equals(loaderName))) { From da70d356aae689ef8e2fdbdb2050517c762a5422 Mon Sep 17 00:00:00 2001 From: Ciilu <109708109+Ciilu@users.noreply.github.com> Date: Thu, 8 Jan 2026 21:38:21 +0800 Subject: [PATCH 09/11] update --- .../java/org/jackhuang/hmcl/download/LibraryAnalyzer.java | 5 +++-- 1 file changed, 3 insertions(+), 2 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 2b4d8ace94..7a778e6742 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/LibraryAnalyzer.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/LibraryAnalyzer.java @@ -189,7 +189,7 @@ public Set getModLoaders() { public enum LibraryType { MINECRAFT(true, "game", "^$", "^$", null), - LEGACY_FABRIC(true, "legacyfabric", "net.fabricmc", "fabric-loader", ModLoaderType.LEGACY_FABRIC) { + LEGACY_FABRIC(true, "legacyfabric", "net\\.fabricmc", "fabric-loader", ModLoaderType.LEGACY_FABRIC) { @Override protected boolean matchLibrary(Library library, List libraries) { if (!super.matchLibrary(library, libraries)) { @@ -218,7 +218,8 @@ protected boolean matchLibrary(Library library, List libraries) { return true; } }, - FABRIC_API(true, "fabric-api", "net.fabricmc", "fabric-api", null),FORGE(true, "forge", "net\\.minecraftforge", "(forge|fmlloader)", ModLoaderType.FORGE) { + FABRIC_API(true, "fabric-api", "net.fabricmc", "fabric-api", null), + FORGE(true, "forge", "net\\.minecraftforge", "(forge|fmlloader)", ModLoaderType.FORGE) { private final Pattern FORGE_VERSION_MATCHER = Pattern.compile("^([0-9.]+)-(?[0-9.]+)(-([0-9.]+))?$"); @Override From 46ddf9bdf396875c78bd6101f1d015a39abab7db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=9E=E5=BA=90?= <109708109+CiiLu@users.noreply.github.com> Date: Sat, 10 Jan 2026 20:46:01 +0800 Subject: [PATCH 10/11] Update McbbsModpackExportTask.java --- .../org/jackhuang/hmcl/mod/mcbbs/McbbsModpackExportTask.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 98b3c9a973..3386951788 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 @@ -109,8 +109,8 @@ public void execute() throws Exception { addons.add(new McbbsModpackManifest.Addon(FABRIC.getPatchId(), fabricVersion))); analyzer.getVersion(QUILT).ifPresent(quiltVersion -> addons.add(new McbbsModpackManifest.Addon(QUILT.getPatchId(), quiltVersion))); - analyzer.getVersion(LEGACY_FABRIC).ifPresent(quiltVersion -> - addons.add(new McbbsModpackManifest.Addon(LEGACY_FABRIC.getPatchId(), quiltVersion))); + analyzer.getVersion(LEGACY_FABRIC).ifPresent(legacyfabricVersion -> + addons.add(new McbbsModpackManifest.Addon(LEGACY_FABRIC.getPatchId(), legacyfabricVersion))); List libraries = new ArrayList<>(); // TODO libraries From 1422b8566f839bea6ac0797db0a18146a8a02816 Mon Sep 17 00:00:00 2001 From: Ciilu <109708109+Ciilu@users.noreply.github.com> Date: Sun, 11 Jan 2026 21:33:53 +0800 Subject: [PATCH 11/11] update --- .../java/org/jackhuang/hmcl/download/LibraryAnalyzer.java | 4 ++-- 1 file changed, 2 insertions(+), 2 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 7a778e6742..bfbac5d9b2 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/LibraryAnalyzer.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/LibraryAnalyzer.java @@ -204,7 +204,7 @@ protected boolean matchLibrary(Library library, List libraries) { } }, LEGACY_FABRIC_API(false, "legacyfabric-api", "net.legacyfabric", "legacyfabric-api", null), - FABRIC(true, "fabric", "net.fabricmc", "fabric-loader", ModLoaderType.FABRIC) { + FABRIC(true, "fabric", "net\\.fabricmc", "fabric-loader", ModLoaderType.FABRIC) { @Override protected boolean matchLibrary(Library library, List libraries) { if (!super.matchLibrary(library, libraries)) { @@ -218,7 +218,7 @@ protected boolean matchLibrary(Library library, List libraries) { return true; } }, - FABRIC_API(true, "fabric-api", "net.fabricmc", "fabric-api", null), + FABRIC_API(true, "fabric-api", "net\\.fabricmc", "fabric-api", null), FORGE(true, "forge", "net\\.minecraftforge", "(forge|fmlloader)", ModLoaderType.FORGE) { private final Pattern FORGE_VERSION_MATCHER = Pattern.compile("^([0-9.]+)-(?[0-9.]+)(-([0-9.]+))?$");