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 5e7c90e6b6..369293ed96 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 @@ -60,7 +60,6 @@ import org.jackhuang.hmcl.modpack.mcbbs.McbbsModpackExportTask; import org.jackhuang.hmcl.modpack.modrinth.ModrinthCompletionTask; import org.jackhuang.hmcl.modpack.modrinth.ModrinthInstallTask; import org.jackhuang.hmcl.modpack.modrinth.ModrinthModpackExportTask; -import org.jackhuang.hmcl.modpack.multimc.MultiMCModpackExportTask; import org.jackhuang.hmcl.modpack.multimc.MultiMCModpackInstallTask; import org.jackhuang.hmcl.modpack.server.ServerModpackCompletionTask; import org.jackhuang.hmcl.modpack.server.ServerModpackExportTask; @@ -204,7 +203,7 @@ public final class TaskListPane extends StackPane { task.setName(i18n("install.installing") + ": " + i18n("modpack.type.server")); } else if (task instanceof HMCLModpackInstallTask) { task.setName(i18n("modpack.installing.given", i18n("modpack.type.hmcl"))); - } else if (task instanceof McbbsModpackExportTask || task instanceof MultiMCModpackExportTask || task instanceof ServerModpackExportTask || task instanceof ModrinthModpackExportTask) { + } else if (task instanceof McbbsModpackExportTask || task instanceof ServerModpackExportTask || task instanceof ModrinthModpackExportTask) { task.setName(i18n("modpack.export")); } else if (task instanceof MinecraftInstanceTask) { task.setName(i18n("modpack.scan")); diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java index e930fc641a..1654504539 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ExportWizardProvider.java @@ -24,14 +24,11 @@ import org.jackhuang.hmcl.modpack.ModAdviser; import org.jackhuang.hmcl.modpack.ModpackExportInfo; import org.jackhuang.hmcl.modpack.mcbbs.McbbsModpackExportTask; import org.jackhuang.hmcl.modpack.modrinth.ModrinthModpackExportTask; -import org.jackhuang.hmcl.modpack.multimc.MultiMCInstanceConfiguration; -import org.jackhuang.hmcl.modpack.multimc.MultiMCModpackExportTask; import org.jackhuang.hmcl.modpack.server.ServerModpackExportTask; import org.jackhuang.hmcl.setting.*; import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.ui.wizard.WizardController; import org.jackhuang.hmcl.ui.wizard.WizardProvider; -import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.SettingsMap; import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.io.JarUtils; @@ -97,9 +94,6 @@ public final class ExportWizardProvider implements WizardProvider { case ModpackTypeSelectionPage.MODPACK_TYPE_MCBBS: exportTask = exportAsMcbbs(exportInfo, dest); break; - case ModpackTypeSelectionPage.MODPACK_TYPE_MULTIMC: - exportTask = exportAsMultiMC(exportInfo, dest); - break; case ModpackTypeSelectionPage.MODPACK_TYPE_SERVER: exportTask = exportAsServer(exportInfo, dest); break; @@ -183,55 +177,6 @@ public final class ExportWizardProvider implements WizardProvider { }; } - private Task exportAsMultiMC(ModpackExportInfo exportInfo, Path modpackFile) { - return new Task() { - @Nullable Task dependency; - - { - setSignificance(TaskSignificance.MODERATE); - } - - @Override - public void execute() { - HMCLGameInstance instance = resolveCurrentGameInstance(); - GameSettings.Effective setting = instance.getEffectiveSettings(); - dependency = new MultiMCModpackExportTask(instance, exportInfo.getWhitelist(), - new MultiMCInstanceConfiguration( - "OneSix", - exportInfo.getName() + "-" + exportInfo.getVersion(), - null, - Lang.toIntOrNull(setting.getInheritable(GameSettings::permSizeProperty)), - setting.getInheritable(GameSettings::commandWrapperProperty), - setting.getInheritable(GameSettings::preLaunchCommandProperty), - null, - exportInfo.getDescription(), - null, - exportInfo.getJavaArguments(), - setting.getInheritable(GameSettings::windowTypeProperty) == GameWindowType.FULLSCREEN, - setting.getWidth(), - setting.getHeight(), - null, - exportInfo.getMinMemory(), - setting.getInheritable(GameSettings::showLogsProperty), - /* showConsoleOnError */ true, - /* autoCloseConsole */ false, - /* overrideMemory */ true, - /* overrideJavaLocation */ false, - /* overrideJavaArgs */ true, - /* overrideConsole */ true, - /* overrideCommands */ true, - /* overrideWindow */ true, - /* iconKey */ null // TODO - ), modpackFile); - } - - @Override - public Collection> getDependencies() { - return Collections.singleton(dependency); - } - }; - } - private Task exportAsServer(ModpackExportInfo exportInfo, Path modpackFile) { return new Task() { @Nullable Task dependency; diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackTypeSelectionPage.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackTypeSelectionPage.java index 9e92ae8852..67abe8314b 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackTypeSelectionPage.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/export/ModpackTypeSelectionPage.java @@ -26,7 +26,6 @@ import javafx.scene.layout.BorderPane; import javafx.scene.layout.VBox; import org.jackhuang.hmcl.modpack.ModpackExportInfo; import org.jackhuang.hmcl.modpack.mcbbs.McbbsModpackExportTask; -import org.jackhuang.hmcl.modpack.multimc.MultiMCModpackExportTask; import org.jackhuang.hmcl.modpack.server.ServerModpackExportTask; import org.jackhuang.hmcl.modpack.modrinth.ModrinthModpackExportTask; import org.jackhuang.hmcl.ui.SVG; @@ -55,7 +54,6 @@ public final class ModpackTypeSelectionPage extends VBox implements WizardPage { this.getChildren().setAll( title, createButton(MODPACK_TYPE_MCBBS, McbbsModpackExportTask.OPTION), - createButton(MODPACK_TYPE_MULTIMC, MultiMCModpackExportTask.OPTION), createButton(MODPACK_TYPE_SERVER, ServerModpackExportTask.OPTION), createButton(MODPACK_TYPE_MODRINTH, ModrinthModpackExportTask.OPTION) ); @@ -98,7 +96,6 @@ public final class ModpackTypeSelectionPage extends VBox implements WizardPage { public static final SettingsMap.Key MODPACK_TYPE = new SettingsMap.Key<>("modpack.type"); public static final String MODPACK_TYPE_MCBBS = "mcbbs"; - public static final String MODPACK_TYPE_MULTIMC = "multimc"; public static final String MODPACK_TYPE_SERVER = "server"; public static final String MODPACK_TYPE_MODRINTH = "modrinth"; } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCModpackExportTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCModpackExportTask.java deleted file mode 100644 index a671f94081..0000000000 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/modpack/multimc/MultiMCModpackExportTask.java +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Hello Minecraft! Launcher - * Copyright (C) 2026 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.modpack.multimc; - -import org.jackhuang.hmcl.game.DefaultGameInstance; -import org.jackhuang.hmcl.game.GameComponentAnalyzer; -import org.jackhuang.hmcl.game.GameComponentType; -import org.jackhuang.hmcl.modpack.ModAdviser; -import org.jackhuang.hmcl.modpack.Modpack; -import org.jackhuang.hmcl.modpack.ModpackExportInfo; -import org.jackhuang.hmcl.task.Task; -import org.jackhuang.hmcl.util.gson.JsonUtils; -import org.jackhuang.hmcl.util.io.Zipper; -import org.jackhuang.hmcl.util.versioning.GameVersionNumber; -import org.jetbrains.annotations.NotNullByDefault; - -import java.io.IOException; -import java.io.StringWriter; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import static org.jackhuang.hmcl.util.logging.Logger.LOG; - -/// Exports one registered game instance as a MultiMC modpack archive. -@NotNullByDefault -public class MultiMCModpackExportTask extends Task { - /// The fixed instance snapshot exported by this task. - private final DefaultGameInstance instance; - - /// The paths selected for inclusion in the archive. - private final List whitelist; - - /// The MultiMC instance configuration written to the archive. - private final MultiMCInstanceConfiguration configuration; - - /// The archive written by this task. - private final Path output; - - /// Creates a MultiMC modpack export task. - /// - /// @param instance the registered instance snapshot to export - /// @param whitelist the paths selected for inclusion - /// @param configuration the MultiMC instance configuration - /// @param output the archive to write - public MultiMCModpackExportTask(DefaultGameInstance instance, List whitelist, MultiMCInstanceConfiguration configuration, Path output) { - this.instance = instance; - this.whitelist = whitelist; - this.configuration = configuration; - this.output = output; - - onDone().register(event -> { - if (event.isFailed()) { - try { - Files.deleteIfExists(output); - } catch (IOException e) { - LOG.warning("Failed to delete modpack file: " + output, e); - } - } - }); - } - - /// {@inheritDoc} - @Override - public void execute() throws Exception { - var instanceId = instance.getId(); - ArrayList blackList = new ArrayList<>(ModAdviser.MODPACK_BLACK_LIST); - blackList.add(instanceId + ".jar"); - blackList.add(instanceId + ".json"); - LOG.info("Compressing game files without some files in blacklist, including files or directories: usernamecache.json, asm, logs, backups, versions, assets, usercache.json, libraries, crash-reports, launcher_profiles.json, NVIDIA, TCNodeTracker"); - try (Zipper zip = new Zipper(output)) { - zip.putDirectory(instance.getRunDirectory(), ".minecraft", path -> Modpack.acceptFile(path, blackList, whitelist)); - - GameVersionNumber version = instance.getVersion(); - if (version == GameVersionNumber.unknown()) { - throw new IOException("Cannot parse the version of " + instanceId); - } - String gameVersion = version.toString(); - GameComponentAnalyzer analyzer = instance.getAnalyzer(); - List components = new ArrayList<>(); - components.add(new MultiMCManifest.MultiMCManifestComponent(true, false, MultiMCComponents.getComponent(GameComponentType.GAME), gameVersion)); - - for (Map.Entry pair : MultiMCComponents.getPairs()) { - if (pair.getValue().isModLoader()) { - String componentVersion = analyzer.getVersion(pair.getValue()); - if (componentVersion != null) { - components.add(new MultiMCManifest.MultiMCManifestComponent(false, false, pair.getKey(), componentVersion)); - } - } - } - - MultiMCManifest mmcPack = new MultiMCManifest(1, components); - zip.putTextFile(JsonUtils.GSON.toJson(mmcPack), "mmc-pack.json"); - - StringWriter writer = new StringWriter(); - configuration.toProperties().store(writer, "Auto generated by Hello Minecraft! Launcher"); - zip.putTextFile(writer.toString(), "instance.cfg"); - - zip.putTextFile("", ".packignore"); - } - } - - /// Export options supported by the MultiMC format. - public static final ModpackExportInfo.Options OPTION = new ModpackExportInfo.Options() - .requireAuthor() - .requireMinMemory(); -}