diff --git a/HMCL/image/cleanroom.png b/HMCL/image/cleanroom.png new file mode 100644 index 000000000..39754085d Binary files /dev/null and b/HMCL/image/cleanroom.png differ 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 612cbe046..8b44701e8 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLGameRepository.java @@ -314,6 +314,8 @@ public class HMCLGameRepository extends DefaultGameRepository { return VersionIconType.FABRIC.getIcon(); else if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.FORGE)) return VersionIconType.FORGE.getIcon(); + else if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.CLEANROOM)) + return VersionIconType.CLEANROOM.getIcon(); else if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.NEO_FORGE)) return VersionIconType.NEO_FORGE.getIcon(); else if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.QUILT)) 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 02dacdaea..51c178130 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionIconType.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/VersionIconType.java @@ -34,7 +34,8 @@ public enum VersionIconType { NEO_FORGE("/assets/img/neoforge.png"), FURNACE("/assets/img/furnace.png"), QUILT("/assets/img/quilt.png"), - APRIL_FOOLS("/assets/img/april_fools.png"); + APRIL_FOOLS("/assets/img/april_fools.png"), + CLEANROOM("/assets/img/cleanroom.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 a57f27bbc..f6ecc715c 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/InstallerItem.java @@ -138,6 +138,9 @@ public class InstallerItem extends Control { case "forge": iconType = VersionIconType.FORGE; break; + case "cleanroom": + iconType = VersionIconType.CLEANROOM; + break; case "liteloader": iconType = VersionIconType.CHICKEN; break; @@ -232,6 +235,7 @@ public class InstallerItem extends Control { InstallerItem fabric = new InstallerItem(FABRIC, style); InstallerItem fabricApi = new InstallerItem(FABRIC_API, style); InstallerItem forge = new InstallerItem(FORGE, style); + InstallerItem cleanroom = new InstallerItem(CLEANROOM, style); InstallerItem neoForge = new InstallerItem(NEO_FORGE, style); InstallerItem liteLoader = new InstallerItem(LITELOADER, style); InstallerItem optiFine = new InstallerItem(OPTIFINE, style); @@ -239,11 +243,11 @@ public class InstallerItem extends Control { InstallerItem quiltApi = new InstallerItem(QUILT_API, style); Map> incompatibleMap = new HashMap<>(); - mutualIncompatible(incompatibleMap, forge, fabric, quilt, neoForge); - addIncompatibles(incompatibleMap, liteLoader, fabric, quilt, neoForge); - addIncompatibles(incompatibleMap, optiFine, fabric, quilt, neoForge); - addIncompatibles(incompatibleMap, fabricApi, forge, quiltApi, neoForge, liteLoader, optiFine); - addIncompatibles(incompatibleMap, quiltApi, forge, fabric, fabricApi, neoForge, liteLoader, optiFine); + 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); for (Map.Entry> entry : incompatibleMap.entrySet()) { InstallerItem item = entry.getKey(); @@ -277,7 +281,7 @@ public class InstallerItem extends Control { game.versionProperty.set(new InstalledState(gameVersion, false, false)); } - InstallerItem[] all = {game, forge, neoForge, liteLoader, optiFine, fabric, fabricApi, quilt, quiltApi}; + InstallerItem[] all = {game, forge, neoForge, liteLoader, optiFine, fabric, fabricApi, quilt, quiltApi, cleanroom}; for (InstallerItem item : all) { if (!item.resolvedStateProperty.isBound()) { @@ -293,6 +297,8 @@ public class InstallerItem extends Control { 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}; } else { 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 9c5311d53..6a0d930ac 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 @@ -33,6 +33,7 @@ import javafx.scene.control.ListCell; import javafx.scene.control.ProgressIndicator; import javafx.scene.layout.BorderPane; import javafx.scene.layout.StackPane; +import org.jackhuang.hmcl.download.cleanroom.CleanroomInstallTask; import org.jackhuang.hmcl.download.fabric.FabricAPIInstallTask; import org.jackhuang.hmcl.download.fabric.FabricInstallTask; import org.jackhuang.hmcl.download.forge.ForgeNewInstallTask; @@ -164,6 +165,8 @@ public final class TaskListPane extends StackPane { if (task.getInheritedStage() != null && task.getInheritedStage().startsWith("hmcl.install.game")) return; 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 ForgeNewInstallTask || task instanceof ForgeOldInstallTask) { task.setName(i18n("install.installer.install", i18n("install.installer.forge"))); } else if (task instanceof NeoForgeInstallTask || task instanceof NeoForgeOldInstallTask) { @@ -439,6 +442,7 @@ public final class TaskListPane extends StackPane { 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; 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 69f254d28..8dad9704d 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 @@ -130,6 +130,9 @@ public class InstallersPage extends AbstractInstallersPage { case NEO_FORGE: loaderName = i18n("install.installer.neoforge"); break; + case CLEANROOM: + loaderName = i18n("install.installer.cleanroom"); + 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 360dae621..030d66c4d 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 @@ -31,6 +31,7 @@ import javafx.scene.layout.*; import org.jackhuang.hmcl.download.DownloadProvider; import org.jackhuang.hmcl.download.RemoteVersion; import org.jackhuang.hmcl.download.VersionList; +import org.jackhuang.hmcl.download.cleanroom.CleanroomRemoteVersion; import org.jackhuang.hmcl.download.fabric.FabricAPIRemoteVersion; import org.jackhuang.hmcl.download.fabric.FabricRemoteVersion; import org.jackhuang.hmcl.download.forge.ForgeRemoteVersion; @@ -220,6 +221,8 @@ public final class VersionsPage extends Control implements WizardPage, Refreshab iconType = VersionIconType.OPTIFINE; else if (remoteVersion instanceof ForgeRemoteVersion) iconType = VersionIconType.FORGE; + else if (remoteVersion instanceof CleanroomRemoteVersion) + iconType = VersionIconType.CLEANROOM; else if (remoteVersion instanceof NeoForgeRemoteVersion) iconType = VersionIconType.NEO_FORGE; else if (remoteVersion instanceof FabricRemoteVersion || remoteVersion instanceof FabricAPIRemoteVersion) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadPage.java index e756141f1..441b1780d 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/DownloadPage.java @@ -407,6 +407,9 @@ public class DownloadPage extends Control implements DecoratorPage { case FORGE: content.getTags().add(i18n("install.installer.forge")); break; + case CLEANROOM: + content.getTags().add(i18n("install.installer.cleanroom")); + break; case NEO_FORGED: content.getTags().add(i18n("install.installer.neoforge")); break; 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 1620490a3..9405e3800 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,7 +76,7 @@ public class InstallerListPage extends ListPageBase implements Ve InstallerItem.InstallerItemGroup group = new InstallerItem.InstallerItemGroup(gameVersion, InstallerItem.Style.LIST_ITEM); - // Conventional libraries: game, fabric, forge, neoforge, liteloader, optifine + // Conventional libraries: game, fabric, forge, cleanroom, neoforge, liteloader, optifine for (InstallerItem item : group.getLibraries()) { String libraryId = item.getLibraryId(); 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 340d2ec0d..4e7a12489 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 @@ -424,6 +424,9 @@ class ModListPageSkin extends SkinBase { case FORGE: loaderName = i18n("install.installer.forge"); break; + case CLEANROOM: + loaderName = i18n("install.installer.cleanroom"); + break; case NEO_FORGED: loaderName = i18n("install.installer.neoforge"); break; @@ -550,6 +553,9 @@ class ModListPageSkin extends SkinBase { case FORGE: content.getTags().add(i18n("install.installer.forge")); break; + case CLEANROOM: + content.getTags().add(i18n("install.installer.cleanroom")); + break; case NEO_FORGED: content.getTags().add(i18n("install.installer.neoforge")); 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 a394ec03a..c00ac7c0e 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 @@ -65,6 +65,7 @@ public class VersionIconDialog extends DialogPane { createIcon(VersionIconType.CRAFT_TABLE), createIcon(VersionIconType.FABRIC), createIcon(VersionIconType.FORGE), + createIcon(VersionIconType.CLEANROOM), createIcon(VersionIconType.NEO_FORGE), createIcon(VersionIconType.FURNACE), createIcon(VersionIconType.QUILT) diff --git a/HMCL/src/main/resources/assets/img/cleanroom.png b/HMCL/src/main/resources/assets/img/cleanroom.png new file mode 100644 index 000000000..29ce0cc91 Binary files /dev/null and b/HMCL/src/main/resources/assets/img/cleanroom.png differ diff --git a/HMCL/src/main/resources/assets/img/cleanroom@2x.png b/HMCL/src/main/resources/assets/img/cleanroom@2x.png new file mode 100644 index 000000000..cda6dc036 Binary files /dev/null and b/HMCL/src/main/resources/assets/img/cleanroom@2x.png differ diff --git a/HMCL/src/main/resources/assets/lang/I18N.properties b/HMCL/src/main/resources/assets/lang/I18N.properties index 6a3f62335..f67404f5b 100644 --- a/HMCL/src/main/resources/assets/lang/I18N.properties +++ b/HMCL/src/main/resources/assets/lang/I18N.properties @@ -701,6 +701,7 @@ install.failed.optifine_forge_1.17=For Minecraft 1.17.1, Forge is only compatibl install.failed.version_mismatch=This loader requires the game version %s, but the installed one is %s. install.installer.change_version=%s Incompatible install.installer.choose=Choose Your %s Version +install.installer.cleanroom=Cleanroom install.installer.depend=Requires %s install.installer.do_not_install=Do not install install.installer.fabric=Fabric diff --git a/HMCL/src/main/resources/assets/lang/I18N_zh.properties b/HMCL/src/main/resources/assets/lang/I18N_zh.properties index 7c9b71ffa..109ca04da 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh.properties @@ -510,6 +510,7 @@ install.failed.optifine_forge_1.17=對於 Minecraft 1.17.1 版本,僅 OptiFine install.failed.version_mismatch=該載入器需要的遊戲版本為 %s,但實際的遊戲版本為 %s。 install.installer.change_version=%s 與目前遊戲不相容,請更換版本 install.installer.choose=選取 %s 版本 +install.installer.cleanroom=Cleanroom install.installer.depend=需要先安裝 %s install.installer.do_not_install=不安裝 install.installer.fabric=Fabric 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 abdc7cb1f..77ae0a55f 100644 --- a/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties +++ b/HMCL/src/main/resources/assets/lang/I18N_zh_CN.properties @@ -520,6 +520,7 @@ install.failed.optifine_forge_1.17=对于 Minecraft 1.17.1 版本,仅 OptiFine install.failed.version_mismatch=该组件需要的游戏版本为 %s,但实际的游戏版本为 %s。 install.installer.change_version=%s 与当前游戏不兼容,请更换版本 install.installer.choose=选择 %s 版本 +install.installer.cleanroom=Cleanroom install.installer.depend=需要先安装 %s install.installer.do_not_install=不安装 install.installer.fabric=Fabric @@ -1053,6 +1054,7 @@ settings.advanced.custom_commands.hint=自定义命令被调用时将包含如 \ · $INST_JAVA: 游戏运行使用的 Java 路径;\n\ \ · $INST_FORGE: 若安装了 Forge,将会存在本环境变量;\n\ \ · $INST_NEOFORGE: 若安装了 NeoForge,将会存在本环境变量;\n\ + \ · $INST_CLEANROOM: 若安装了 Cleanroom,将会存在本环境变量;\n\ \ · $INST_LITELOADER: 若安装了 LiteLoader,将会存在本环境变量;\n\ \ · $INST_OPTIFINE: 若安装了 OptiFine,将会存在本环境变量;\n\ \ · $INST_FABRIC: 若安装了 Fabric,将会存在本环境变量;\n\ 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 19dad29d7..44729a983 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/BMCLAPIDownloadProvider.java @@ -17,6 +17,7 @@ */ package org.jackhuang.hmcl.download; +import org.jackhuang.hmcl.download.cleanroom.CleanroomVersionList; import org.jackhuang.hmcl.download.fabric.FabricAPIVersionList; import org.jackhuang.hmcl.download.fabric.FabricVersionList; import org.jackhuang.hmcl.download.forge.ForgeBMCLVersionList; @@ -43,6 +44,7 @@ public final class BMCLAPIDownloadProvider implements DownloadProvider { private final FabricVersionList fabric; private final FabricAPIVersionList fabricApi; private final ForgeBMCLVersionList forge; + private final CleanroomVersionList cleanroom; private final NeoForgeBMCLVersionList neoforge; private final LiteLoaderBMCLVersionList liteLoader; private final OptiFineBMCLVersionList optifine; @@ -56,6 +58,7 @@ public final class BMCLAPIDownloadProvider implements DownloadProvider { this.fabric = new FabricVersionList(this); this.fabricApi = new FabricAPIVersionList(this); this.forge = new ForgeBMCLVersionList(apiRoot); + this.cleanroom = new CleanroomVersionList(this); this.neoforge = new NeoForgeBMCLVersionList(apiRoot); this.liteLoader = new LiteLoaderBMCLVersionList(this); this.optifine = new OptiFineBMCLVersionList(apiRoot); @@ -78,6 +81,8 @@ public final class BMCLAPIDownloadProvider implements DownloadProvider { pair("https://maven.fabricmc.net", apiRoot + "/maven"), pair("https://authlib-injector.yushi.moe", apiRoot + "/mirrors/authlib-injector"), pair("https://repo1.maven.org/maven2", "https://mirrors.cloud.tencent.com/nexus/repository/maven-public"), + pair("https://repo.maven.apache.org/maven2", "https://mirrors.cloud.tencent.com/nexus/repository/maven-public"), + pair("https://hmcl-dev.github.io/metadata/cleanroom", "https://alist.8mi.tech/d/mirror/HMCL-Metadata/Auto/cleanroom"), pair("https://zkitefly.github.io/unlisted-versions-of-minecraft", "https://alist.8mi.tech/d/mirror/unlisted-versions-of-minecraft/Auto") // // https://github.com/mcmod-info-mirror/mcim-rust-api // pair("https://api.modrinth.com", "https://mod.mcimirror.top/modrinth"), @@ -113,6 +118,8 @@ public final class BMCLAPIDownloadProvider implements DownloadProvider { return fabricApi; case "forge": return forge; + case "cleanroom": + return cleanroom; case "neoforge": return neoforge; case "liteloader": 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 cdb5fc7fe..c4dbfbef6 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/LibraryAnalyzer.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/LibraryAnalyzer.java @@ -122,7 +122,7 @@ public final class LibraryAnalyzer implements Iterable[0-9.]+)(-([0-9.]+))?$"); 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 86fc3e032..2c5a5dba4 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MojangDownloadProvider.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MojangDownloadProvider.java @@ -17,6 +17,7 @@ */ package org.jackhuang.hmcl.download; +import org.jackhuang.hmcl.download.cleanroom.CleanroomVersionList; import org.jackhuang.hmcl.download.fabric.FabricAPIVersionList; import org.jackhuang.hmcl.download.fabric.FabricVersionList; import org.jackhuang.hmcl.download.forge.ForgeVersionList; @@ -37,6 +38,7 @@ public class MojangDownloadProvider implements DownloadProvider { private final FabricAPIVersionList fabricApi; private final ForgeVersionList forge; private final NeoForgeOfficialVersionList neoforge; + private final CleanroomVersionList cleanroom; private final LiteLoaderVersionList liteLoader; private final OptiFineBMCLVersionList optifine; private final QuiltVersionList quilt; @@ -51,6 +53,7 @@ public class MojangDownloadProvider implements DownloadProvider { this.fabricApi = new FabricAPIVersionList(this); this.forge = new ForgeVersionList(this); this.neoforge = new NeoForgeOfficialVersionList(this); + this.cleanroom = new CleanroomVersionList(this); this.liteLoader = new LiteLoaderVersionList(this); this.optifine = new OptiFineBMCLVersionList(apiRoot); this.quilt = new QuiltVersionList(this); @@ -78,6 +81,8 @@ public class MojangDownloadProvider implements DownloadProvider { return fabricApi; case "forge": return forge; + case "cleanroom": + return cleanroom; case "neoforge": return neoforge; case "liteloader": diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/cleanroom/CleanroomInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/cleanroom/CleanroomInstallTask.java new file mode 100644 index 000000000..de2ce3de9 --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/cleanroom/CleanroomInstallTask.java @@ -0,0 +1,93 @@ +/* + * 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.cleanroom; + +import org.jackhuang.hmcl.download.DefaultDependencyManager; +import org.jackhuang.hmcl.download.LibraryAnalyzer; +import org.jackhuang.hmcl.download.UnsupportedInstallationException; +import org.jackhuang.hmcl.download.VersionMismatchException; +import org.jackhuang.hmcl.download.forge.ForgeNewInstallTask; +import org.jackhuang.hmcl.game.Version; +import org.jackhuang.hmcl.task.FileDownloadTask; +import org.jackhuang.hmcl.task.Task; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collection; +import java.util.Collections; + +public final class CleanroomInstallTask extends Task { + + private final DefaultDependencyManager dependencyManager; + private final Version version; + private Path installer; + private final CleanroomRemoteVersion remote; + private FileDownloadTask dependent; + private Task task; + + public CleanroomInstallTask(DefaultDependencyManager dependencyManager, Version version, CleanroomRemoteVersion remoteVersion) { + this.dependencyManager = dependencyManager; + this.version = version; + this.remote = remoteVersion; + setSignificance(TaskSignificance.MODERATE); + } + + @Override + public boolean doPreExecute() { + return true; + } + + @Override + public void preExecute() throws Exception { + installer = Files.createTempFile("cleanroom-installer", ".jar"); + + dependent = new FileDownloadTask( + dependencyManager.getDownloadProvider().injectURLsWithCandidates(remote.getUrls()), + installer, null); + dependent.setCacheRepository(dependencyManager.getCacheRepository()); + dependent.setCaching(true); + dependent.addIntegrityCheckHandler(FileDownloadTask.ZIP_INTEGRITY_CHECK_HANDLER); + } + + @Override + public boolean doPostExecute() { + return true; + } + + @Override + public void postExecute() throws Exception { + Files.deleteIfExists(installer); + setResult(task.getResult()); + } + + @Override + public Collection> getDependents() { + return Collections.singleton(dependent); + } + + @Override + public Collection> getDependencies() { + return Collections.singleton(task); + } + + @Override + public void execute() throws IOException, VersionMismatchException, UnsupportedInstallationException { + task = new ForgeNewInstallTask(dependencyManager, version, remote.getSelfVersion(), installer).thenApplyAsync((version) -> version.setId(LibraryAnalyzer.LibraryType.CLEANROOM.getPatchId())); + } +} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/cleanroom/CleanroomRemoteVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/cleanroom/CleanroomRemoteVersion.java new file mode 100644 index 000000000..6d6bfddbd --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/cleanroom/CleanroomRemoteVersion.java @@ -0,0 +1,38 @@ +/* + * 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.cleanroom; + +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.time.Instant; +import java.util.List; + +public class CleanroomRemoteVersion extends RemoteVersion { + public CleanroomRemoteVersion(String gameVersion, String selfVersion, Instant releaseDate, List url) { + super(LibraryAnalyzer.LibraryType.CLEANROOM.getPatchId(), gameVersion, selfVersion, releaseDate, url); + } + + @Override + public Task getInstallTask(DefaultDependencyManager dependencyManager, Version baseVersion) { + return new CleanroomInstallTask(dependencyManager, baseVersion, this); + } +} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/cleanroom/CleanroomVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/cleanroom/CleanroomVersionList.java new file mode 100644 index 000000000..34b2a62e3 --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/cleanroom/CleanroomVersionList.java @@ -0,0 +1,69 @@ +/* + * 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.cleanroom; + +import org.jackhuang.hmcl.download.DownloadProvider; +import org.jackhuang.hmcl.download.VersionList; +import org.jackhuang.hmcl.task.GetTask; +import org.jackhuang.hmcl.task.Task; + +import java.time.Instant; +import java.util.Collections; + +public final class CleanroomVersionList extends VersionList { + private final DownloadProvider downloadProvider; + private static final String LOADER_LIST_URL = "https://hmcl-dev.github.io/metadata/cleanroom/index.json"; + private static final String INSTALLER_URL = "https://hmcl-dev.github.io/metadata/cleanroom/files/cleanroom-%s-installer.jar"; + + public CleanroomVersionList(DownloadProvider downloadProvider) { + this.downloadProvider = downloadProvider; + } + + @Override + public boolean hasType() { + return false; + } + + @Override + public Task refreshAsync() { + return Task.allOf( + new GetTask(downloadProvider.injectURLWithCandidates(LOADER_LIST_URL)).thenGetJsonAsync(ReleaseResult[].class) + ).thenAcceptAsync(results -> { + lock.writeLock().lock(); + + try { + versions.clear(); + for (ReleaseResult version : results.get(0)) { + versions.put("1.12.2", new CleanroomRemoteVersion( + "1.12.2", version.name, Instant.parse(version.created_at), + Collections.singletonList( + String.format(INSTALLER_URL, version.name) + ) + )); + } + } finally { + lock.writeLock().unlock(); + } + }); + } + + private static class ReleaseResult { + String name; + String created_at; + } +} 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 815c25ddc..621ff68c2 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/launch/DefaultLauncher.java @@ -26,7 +26,6 @@ import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.gson.UUIDTypeAdapter; import org.jackhuang.hmcl.util.io.FileUtils; import org.jackhuang.hmcl.util.io.Unzipper; -import org.jackhuang.hmcl.util.platform.Bits; import org.jackhuang.hmcl.util.platform.*; import org.jackhuang.hmcl.util.versioning.GameVersionNumber; @@ -41,8 +40,8 @@ import java.util.*; import java.util.function.Supplier; import static org.jackhuang.hmcl.util.Lang.mapOf; -import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.Pair.pair; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; /** * @author huangyuhui @@ -247,6 +246,10 @@ public class DefaultLauncher extends Launcher { Set classpath = repository.getClasspath(version); + if (analyzer.has(LibraryAnalyzer.LibraryType.CLEANROOM)) { + classpath.removeIf(c -> c.contains("2.9.4-nightly-20150209")); + } + File jar = repository.getVersionJar(version); if (!jar.exists() || !jar.isFile()) throw new IOException("Minecraft jar does not exist"); @@ -551,6 +554,9 @@ public class DefaultLauncher extends Launcher { if (analyzer.has(LibraryAnalyzer.LibraryType.FORGE)) { env.put("INST_FORGE", "1"); } + if (analyzer.has(LibraryAnalyzer.LibraryType.CLEANROOM)) { + env.put("INST_CLEANROOM", "1"); + } if (analyzer.has(LibraryAnalyzer.LibraryType.NEO_FORGE)) { env.put("INST_NEOFORGE", "1"); } 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 97ec524b9..f4b8feacd 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/ModLoaderType.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/ModLoaderType.java @@ -20,6 +20,7 @@ package org.jackhuang.hmcl.mod; public enum ModLoaderType { UNKNOWN, FORGE, + CLEANROOM, NEO_FORGED, FABRIC, QUILT, 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 ee31a96d7..fabe37aec 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 @@ -91,6 +91,8 @@ public class McbbsModpackExportTask extends Task { addons.add(new McbbsModpackManifest.Addon(MINECRAFT.getPatchId(), gameVersion)); analyzer.getVersion(FORGE).ifPresent(forgeVersion -> addons.add(new McbbsModpackManifest.Addon(FORGE.getPatchId(), forgeVersion))); + analyzer.getVersion(CLEANROOM).ifPresent(cleanroomVersion -> + addons.add(new McbbsModpackManifest.Addon(CLEANROOM.getPatchId(), cleanroomVersion))); analyzer.getVersion(NEO_FORGE).ifPresent(neoForgeVersion -> addons.add(new McbbsModpackManifest.Addon(NEO_FORGE.getPatchId(), neoForgeVersion))); analyzer.getVersion(LITELOADER).ifPresent(liteLoaderVersion ->