From fe74a6508a2dc3d2175317e55e6f30158b69eb24 Mon Sep 17 00:00:00 2001 From: Zkitefly <64117916+zkitefly@users.noreply.github.com> Date: Fri, 6 Jun 2025 22:26:48 +0800 Subject: [PATCH] =?UTF-8?q?fix(fmllib):=20Forge=201.5.2=20=E5=AE=89?= =?UTF-8?q?=E8=A3=85=E6=97=B6=E4=B8=8B=E8=BD=BD=20fmllib=EF=BC=8C=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E6=97=A0=E6=B3=95=E5=90=AF=E5=8A=A8=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hmcl/download/forge/ForgeInstallTask.java | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallTask.java index 5fe58b176..f66759f84 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/forge/ForgeInstallTask.java @@ -20,22 +20,33 @@ package org.jackhuang.hmcl.download.forge; import org.jackhuang.hmcl.download.*; import org.jackhuang.hmcl.game.Version; import org.jackhuang.hmcl.task.FileDownloadTask; +import org.jackhuang.hmcl.task.FileDownloadTask.IntegrityCheck; import org.jackhuang.hmcl.task.Task; +import org.jackhuang.hmcl.util.DigestUtils; import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.io.CompressingUtils; import org.jackhuang.hmcl.util.io.FileUtils; import org.jackhuang.hmcl.util.versioning.GameVersionNumber; +import java.io.File; import java.io.IOException; +import java.io.UncheckedIOException; +import java.net.MalformedURLException; +import java.net.URL; import java.nio.file.FileSystem; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.stream.Collectors; import static org.jackhuang.hmcl.download.UnsupportedInstallationException.UNSUPPORTED_LAUNCH_WRAPPER; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; import static org.jackhuang.hmcl.util.StringUtils.removePrefix; import static org.jackhuang.hmcl.util.StringUtils.removeSuffix; @@ -106,12 +117,94 @@ public final class ForgeInstallTask extends Task { throw new UnsupportedInstallationException(UNSUPPORTED_LAUNCH_WRAPPER); } + if ("1.5.2".equals(remote.getGameVersion())) { + downloadFMLLibs(); + } + if (detectForgeInstallerType(dependencyManager, version, installer)) dependency = new ForgeNewInstallTask(dependencyManager, version, remote.getSelfVersion(), installer); else dependency = new ForgeOldInstallTask(dependencyManager, version, remote.getSelfVersion(), installer); } + // Help Forge download the lib files it needs because the files on their servers are gone + private void downloadFMLLibs() throws IOException { + File baseDir = dependencyManager.getGameRepository().getBaseDirectory(); + File versionRoot = dependencyManager.getGameRepository().getVersionRoot(version.getId()); + + Path baseDirLib = Paths.get(baseDir.getAbsolutePath(), "lib"); + Path versionRootLib = Paths.get(versionRoot.getAbsolutePath(), "lib"); + + Files.createDirectories(baseDirLib); + Files.createDirectories(versionRootLib); + + FMLLib[] fmlLibs = new FMLLib[] { + new FMLLib("argo-small-3.2.jar", "58912ea2858d168c50781f956fa5b59f0f7c6b51"), + new FMLLib("guava-14.0-rc3.jar", "931ae21fa8014c3ce686aaa621eae565fefb1a6a"), + new FMLLib("asm-all-4.1.jar", "054986e962b88d8660ae4566475658469595ef58"), + new FMLLib("bcprov-jdk15on-148.jar", "960dea7c9181ba0b17e8bab0c06a43f0a5f04e65"), + new FMLLib("deobfuscation_data_1.5.2.zip", "446e55cd986582c70fcf12cb27bc00114c5adfd9"), + new FMLLib("scala-library.jar", "458d046151ad179c85429ed7420ffb1eaf6ddf85") + }; + + for (FMLLib lib : fmlLibs) { + Path baseTarget = baseDirLib.resolve(lib.name); + Path versionTarget = versionRootLib.resolve(lib.name); + + boolean needsDownload = false; + if (!Files.exists(baseTarget) + || !DigestUtils.digestToString("SHA-1", Files.newInputStream(baseTarget)).equals(lib.sha1)) { + needsDownload = true; + } + if (!Files.exists(versionTarget) + || !DigestUtils.digestToString("SHA-1", Files.newInputStream(versionTarget)).equals(lib.sha1)) { + needsDownload = true; + } + + if (needsDownload) { + String[] urls = new String[] { + "https://hmcl-dev.github.io/metadata/fmllibs/" + lib.name, + "https://files.multimc.org/fmllibs/" + lib.name + }; + + List urlList = Arrays.stream(urls) + .map(url -> { + try { + return new URL(url); + } catch (MalformedURLException e) { + throw new UncheckedIOException(e); + } + }) + .collect(Collectors.toList()); + + FileDownloadTask baseTask = new FileDownloadTask(urlList, baseTarget.toFile(), + new IntegrityCheck("SHA-1", lib.sha1)); + baseTask.setCaching(true); + try { + baseTask.execute(); + // Only copy if download is successful + try { + Files.copy(baseTarget, versionTarget, java.nio.file.StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + LOG.error("Failed to copy " + lib.name + " to version directory", e); + } + } catch (Exception e) { + LOG.error("Failed to download " + lib.name, e); + } + } + } + } + + private static class FMLLib { + final String name; + final String sha1; + + FMLLib(String name, String sha1) { + this.name = name; + this.sha1 = sha1; + } + } + /** * Detect Forge installer type. *