diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java index 4325eac472..3767dd721d 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java @@ -17,11 +17,12 @@ */ package org.jackhuang.hmcl.game; -import com.google.gson.*; +import com.google.gson.JsonParseException; import com.google.gson.annotations.SerializedName; import org.jackhuang.hmcl.util.Constants; import org.jackhuang.hmcl.util.Immutable; import org.jackhuang.hmcl.util.ToStringBuilder; +import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.gson.TolerableValidationException; import org.jackhuang.hmcl.util.gson.Validation; import org.jackhuang.hmcl.util.platform.Architecture; @@ -46,7 +47,7 @@ public class Library implements Comparable, Validation { private final String url; private final LibrariesDownloadInfo downloads; private final ExtractRules extract; - private final Map natives; + private final Map natives; private final List rules; private final List checksums; @@ -64,7 +65,7 @@ public Library(Artifact artifact, String url, LibrariesDownloadInfo downloads) { this(artifact, url, downloads, null, null, null, null, null, null); } - public Library(Artifact artifact, String url, LibrariesDownloadInfo downloads, List checksums, ExtractRules extract, Map natives, List rules, String hint, String filename) { + public Library(Artifact artifact, String url, LibrariesDownloadInfo downloads, List checksums, ExtractRules extract, Map natives, List rules, String hint, String filename) { this.artifact = artifact; this.url = url; this.downloads = downloads; @@ -93,13 +94,33 @@ public String getVersion() { } public String getClassifier() { - if (artifact.getClassifier() == null) - if (natives != null && natives.containsKey(OperatingSystem.CURRENT_OS)) - return natives.get(OperatingSystem.CURRENT_OS).replace("${arch}", Architecture.SYSTEM_ARCH.getBits().getBit()); - else + if (artifact.getClassifier() == null) { + if (natives == null) { return null; - else + } + + String current = natives.get(OperatingSystem.CURRENT_OS.getCheckedName()); + if (current == null) { + for (String value : natives.values()) { + int i = value.indexOf('-'); + if (i == -1) { + continue; + } + + Architecture architecture = JsonUtils.GSON.fromJson(value.substring(i + 1), Architecture.class); + if (architecture == Architecture.SYSTEM_ARCH) { + current = natives.get(value); + break; + } + } + } + if (current == null) { + return null; + } + return current.replace("${arch}", Architecture.SYSTEM_ARCH.getBits().getBit()); + } else { return artifact.getClassifier(); + } } public ExtractRules getExtract() { @@ -159,6 +180,7 @@ public List getRules() { /** * Hint for how to locate the library file. + * * @return null for default, "local" for location in version/<version>/libraries/filename */ @Nullable @@ -168,6 +190,7 @@ public String getHint() { /** * Available when hint is "local" + * * @return the filename of the local library in version/<version>/libraries/$filename */ @Nullable diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/tlauncher/TLauncherLibrary.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/tlauncher/TLauncherLibrary.java index 665f7ea2b4..41ad87d11b 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/tlauncher/TLauncherLibrary.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/tlauncher/TLauncherLibrary.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; +import java.util.stream.Collectors; @Immutable public class TLauncherLibrary { @@ -58,7 +59,9 @@ public Library toLibrary() { new LibrariesDownloadInfo(artifact, classifiers), checksums, extract, - natives, + natives.entrySet().stream().collect(Collectors.toMap( + entry -> entry.getKey().getCheckedName(), Map.Entry::getValue + )), rules, null, null 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 155f3353c0..1cb64e6fbe 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 @@ -182,7 +182,7 @@ public void execute() throws Exception { try { multiMCPatch = JsonUtils.GSON.fromJson(FileUtils.readText(patchJson), MultiMCInstancePatch.class); } catch (JsonParseException e) { - throw new IllegalArgumentException("Cannot parse MultiMC patch json: " + patchJson); + throw new IllegalArgumentException("Cannot parse MultiMC patch json: " + patchJson, e); } List arguments = new ArrayList<>();