From 7acc39154bfb16b5838b7fcc80abcedd54a0e95a Mon Sep 17 00:00:00 2001 From: Burning_TNT <88144530+burningtnt@users.noreply.github.com> Date: Wed, 31 Jan 2024 01:57:38 +0800 Subject: [PATCH] Fix: Cannot install modpacks with NeoForge for Minecraft 1.20.1. (#2708) * Fix: Cannot install modpacks with NeoForge for Minecraft 1.20.1. * Add supports for MultiMC Modpack with NeoForge. --- .../neoforge/NeoForgeBMCLVersionList.java | 28 +++++++------------ .../neoforge/NeoForgeOfficialVersionList.java | 12 ++++++++ .../neoforge/NeoForgeRemoteVersion.java | 12 ++++++++ .../mod/multimc/MultiMCModpackExportTask.java | 5 ++-- .../multimc/MultiMCModpackInstallTask.java | 11 ++++---- 5 files changed, 41 insertions(+), 27 deletions(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/neoforge/NeoForgeBMCLVersionList.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/neoforge/NeoForgeBMCLVersionList.java index cf4cee35b..a783372ab 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/neoforge/NeoForgeBMCLVersionList.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/neoforge/NeoForgeBMCLVersionList.java @@ -26,6 +26,7 @@ import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.StringUtils; import org.jackhuang.hmcl.util.gson.Validation; import org.jackhuang.hmcl.util.io.HttpRequest; +import org.jackhuang.hmcl.util.versioning.VersionNumber; import java.util.List; import java.util.Optional; @@ -58,6 +59,15 @@ public final class NeoForgeBMCLVersionList extends VersionList getVersion(String gameVersion, String remoteVersion) { + if (gameVersion.equals("1.20.1")) { + remoteVersion = NeoForgeRemoteVersion.fixInvalidVersion(remoteVersion); + remoteVersion = VersionNumber.compare(remoteVersion, "47.1.85") >= 0 ? "1.20.1-" + remoteVersion : remoteVersion; + } + return super.getVersion(gameVersion, remoteVersion); + } + @Override public CompletableFuture refreshAsync(String gameVersion) { return CompletableFuture.completedFuture((Void) null) @@ -87,12 +97,6 @@ public final class NeoForgeBMCLVersionList extends VersionList getVersion(String gameVersion, String remoteVersion) { - remoteVersion = StringUtils.substringAfter(remoteVersion, "-", remoteVersion); - return super.getVersion(gameVersion, remoteVersion); - } - @Immutable private static final class NeoForgeVersion implements Validation { private final String rawVersion; @@ -108,18 +112,6 @@ public final class NeoForgeBMCLVersionList extends VersionList getVersion(String gameVersion, String remoteVersion) { + if (gameVersion.equals("1.20.1")) { + remoteVersion = NeoForgeRemoteVersion.fixInvalidVersion(remoteVersion); + if (!remoteVersion.equals("47.1.82")) { + remoteVersion = "1.20.1-" + remoteVersion; + } + } + return super.getVersion(gameVersion, remoteVersion); + } + @Override public CompletableFuture refreshAsync() { return CompletableFuture.supplyAsync(wrap(() -> new OfficialAPIResult[]{ diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/neoforge/NeoForgeRemoteVersion.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/neoforge/NeoForgeRemoteVersion.java index 3a08acedc..d354e3a1c 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/neoforge/NeoForgeRemoteVersion.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/neoforge/NeoForgeRemoteVersion.java @@ -17,4 +17,16 @@ public class NeoForgeRemoteVersion extends RemoteVersion { public Task getInstallTask(DefaultDependencyManager dependencyManager, Version baseVersion) { return new NeoForgeInstallTask(dependencyManager, baseVersion, this); } + + public static String fixInvalidVersion(String version) { + if (version.startsWith("1.20.1-")) { + if (version.startsWith("forge-", "1.20.1-".length())) { + return version.substring("1.20.1-forge-".length()); + } else { + return version.substring("1.20.1-".length()); + } + } else { + return version; + } + } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/multimc/MultiMCModpackExportTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/multimc/MultiMCModpackExportTask.java index 88d0ca3d0..c0eb4a07f 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/multimc/MultiMCModpackExportTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/multimc/MultiMCModpackExportTask.java @@ -77,9 +77,8 @@ public class MultiMCModpackExportTask extends Task { components.add(new MultiMCManifest.MultiMCManifestComponent(true, false, "net.minecraft", gameVersion)); analyzer.getVersion(FORGE).ifPresent(forgeVersion -> components.add(new MultiMCManifest.MultiMCManifestComponent(false, false, "net.minecraftforge", forgeVersion))); - // MultiMC hasn't supported NeoForge yet. - // analyzer.getVersion(NEO_FORGE).ifPresent(neoForgeVersion -> - // components.add(new MultiMCManifest.MultiMCManifestComponent(false, false, "net.neoforged", neoForgeVersion))); + analyzer.getVersion(NEO_FORGE).ifPresent(neoForgeVersion -> + components.add(new MultiMCManifest.MultiMCManifestComponent(false, false, "net.neoforged", neoForgeVersion))); analyzer.getVersion(LITELOADER).ifPresent(liteLoaderVersion -> components.add(new MultiMCManifest.MultiMCManifestComponent(false, false, "com.mumfrey.liteloader", liteLoaderVersion))); analyzer.getVersion(FABRIC).ifPresent(fabricVersion -> diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/multimc/MultiMCModpackInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/multimc/MultiMCModpackInstallTask.java index d53ac6c5b..017f72244 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/multimc/MultiMCModpackInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/mod/multimc/MultiMCModpackInstallTask.java @@ -78,12 +78,11 @@ public final class MultiMCModpackInstallTask extends Task { builder.version("forge", c.getVersion()); }); - // MultiMC hasn't supported NeoForge yet. - // Optional neoForge = manifest.getMmcPack().getComponents().stream().filter(e -> e.getUid().equals("net.neoforged")).findAny(); - // neoForge.ifPresent(c -> { - // if (c.getVersion() != null) - // builder.version("neoforge", c.getVersion()); - // }); + Optional neoForge = manifest.getMmcPack().getComponents().stream().filter(e -> e.getUid().equals("net.neoforged")).findAny(); + neoForge.ifPresent(c -> { + if (c.getVersion() != null) + builder.version("neoforge", c.getVersion()); + }); Optional liteLoader = manifest.getMmcPack().getComponents().stream().filter(e -> e.getUid().equals("com.mumfrey.liteloader")).findAny(); liteLoader.ifPresent(c -> {