mirror of
https://github.com/HMCL-dev/HMCL.git
synced 2025-09-14 06:17:47 -04:00
patch forge installer DOWNLOAD_MOJMAPS task to use mirrors
This commit is contained in:
parent
9bc10fb27d
commit
e138815c7b
@ -22,11 +22,16 @@ import org.jackhuang.hmcl.download.DefaultDependencyManager;
|
|||||||
import org.jackhuang.hmcl.download.LibraryAnalyzer;
|
import org.jackhuang.hmcl.download.LibraryAnalyzer;
|
||||||
import org.jackhuang.hmcl.download.forge.ForgeNewInstallProfile.Processor;
|
import org.jackhuang.hmcl.download.forge.ForgeNewInstallProfile.Processor;
|
||||||
import org.jackhuang.hmcl.download.game.GameLibrariesTask;
|
import org.jackhuang.hmcl.download.game.GameLibrariesTask;
|
||||||
|
import org.jackhuang.hmcl.download.game.VersionJsonDownloadTask;
|
||||||
import org.jackhuang.hmcl.game.Artifact;
|
import org.jackhuang.hmcl.game.Artifact;
|
||||||
import org.jackhuang.hmcl.game.DefaultGameRepository;
|
import org.jackhuang.hmcl.game.DefaultGameRepository;
|
||||||
|
import org.jackhuang.hmcl.game.DownloadInfo;
|
||||||
|
import org.jackhuang.hmcl.game.DownloadType;
|
||||||
import org.jackhuang.hmcl.game.Library;
|
import org.jackhuang.hmcl.game.Library;
|
||||||
import org.jackhuang.hmcl.game.Version;
|
import org.jackhuang.hmcl.game.Version;
|
||||||
|
import org.jackhuang.hmcl.task.FileDownloadTask;
|
||||||
import org.jackhuang.hmcl.task.Task;
|
import org.jackhuang.hmcl.task.Task;
|
||||||
|
import org.jackhuang.hmcl.task.FileDownloadTask.IntegrityCheck;
|
||||||
import org.jackhuang.hmcl.util.StringUtils;
|
import org.jackhuang.hmcl.util.StringUtils;
|
||||||
import org.jackhuang.hmcl.util.function.ExceptionalFunction;
|
import org.jackhuang.hmcl.util.function.ExceptionalFunction;
|
||||||
import org.jackhuang.hmcl.util.gson.JsonUtils;
|
import org.jackhuang.hmcl.util.gson.JsonUtils;
|
||||||
@ -39,9 +44,11 @@ import org.jackhuang.hmcl.util.platform.OperatingSystem;
|
|||||||
import org.jackhuang.hmcl.util.platform.SystemUtils;
|
import org.jackhuang.hmcl.util.platform.SystemUtils;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.net.URL;
|
||||||
import java.nio.file.FileSystem;
|
import java.nio.file.FileSystem;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
@ -55,6 +62,7 @@ import java.util.zip.ZipException;
|
|||||||
import static org.jackhuang.hmcl.util.DigestUtils.digest;
|
import static org.jackhuang.hmcl.util.DigestUtils.digest;
|
||||||
import static org.jackhuang.hmcl.util.Hex.encodeHex;
|
import static org.jackhuang.hmcl.util.Hex.encodeHex;
|
||||||
import static org.jackhuang.hmcl.util.Logging.LOG;
|
import static org.jackhuang.hmcl.util.Logging.LOG;
|
||||||
|
import static org.jackhuang.hmcl.util.gson.JsonUtils.fromNonNullJson;
|
||||||
|
|
||||||
public class ForgeNewInstallTask extends Task<Version> {
|
public class ForgeNewInstallTask extends Task<Version> {
|
||||||
|
|
||||||
@ -78,8 +86,8 @@ public class ForgeNewInstallTask extends Task<Version> {
|
|||||||
String key = entry.getKey();
|
String key = entry.getKey();
|
||||||
String value = entry.getValue();
|
String value = entry.getValue();
|
||||||
|
|
||||||
key = parseLiteral(key, vars, ExceptionalFunction.identity());
|
key = parseLiteral(key, vars);
|
||||||
value = parseLiteral(value, vars, ExceptionalFunction.identity());
|
value = parseLiteral(value, vars);
|
||||||
|
|
||||||
if (key == null || value == null) {
|
if (key == null || value == null) {
|
||||||
throw new ArtifactMalformedException("Invalid forge installation configuration");
|
throw new ArtifactMalformedException("Invalid forge installation configuration");
|
||||||
@ -139,7 +147,7 @@ public class ForgeNewInstallTask extends Task<Version> {
|
|||||||
|
|
||||||
List<String> args = new ArrayList<>(processor.getArgs().size());
|
List<String> args = new ArrayList<>(processor.getArgs().size());
|
||||||
for (String arg : processor.getArgs()) {
|
for (String arg : processor.getArgs()) {
|
||||||
String parsed = parseLiteral(arg, vars, ExceptionalFunction.identity());
|
String parsed = parseLiteral(arg, vars);
|
||||||
if (parsed == null)
|
if (parsed == null)
|
||||||
throw new ArtifactMalformedException("Invalid forge installation configuration");
|
throw new ArtifactMalformedException("Invalid forge installation configuration");
|
||||||
args.add(parsed);
|
args.add(parsed);
|
||||||
@ -250,6 +258,10 @@ public class ForgeNewInstallTask extends Task<Version> {
|
|||||||
return plainConverter.apply(replaceTokens(var, literal));
|
return plainConverter.apply(replaceTokens(var, literal));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String parseLiteral(String literal, Map<String, String> var) {
|
||||||
|
return parseLiteral(literal, var, ExceptionalFunction.identity());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<Task<?>> getDependents() {
|
public Collection<Task<?>> getDependents() {
|
||||||
return dependents;
|
return dependents;
|
||||||
@ -294,8 +306,65 @@ public class ForgeNewInstallTask extends Task<Version> {
|
|||||||
dependents.add(new GameLibrariesTask(dependencyManager, version, true, profile.getLibraries()));
|
dependents.add(new GameLibrariesTask(dependencyManager, version, true, profile.getLibraries()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Map<String, String> parseOptions(List<String> args, Map<String, String> vars) {
|
||||||
|
Map<String, String> options = new LinkedHashMap<>();
|
||||||
|
String optionName = null;
|
||||||
|
for (String arg : args) {
|
||||||
|
if (arg.startsWith("--")) {
|
||||||
|
if (optionName != null) {
|
||||||
|
options.put(optionName, "");
|
||||||
|
}
|
||||||
|
optionName = arg.substring(2);
|
||||||
|
} else {
|
||||||
|
if (optionName == null) {
|
||||||
|
// ignore
|
||||||
|
} else {
|
||||||
|
options.put(optionName, parseLiteral(arg, vars));
|
||||||
|
optionName = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (optionName != null) {
|
||||||
|
options.put(optionName, "");
|
||||||
|
}
|
||||||
|
return options;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Task<?> patchDownloadMojangMappingsTask(Processor processor, Map<String, String> vars) {
|
||||||
|
Map<String, String> options = parseOptions(processor.getArgs(), vars);
|
||||||
|
if (!"DOWNLOAD_MOJMAPS".equals(options.get("task")) || !"client".equals(options.get("side")))
|
||||||
|
return null;
|
||||||
|
String version = options.get("version");
|
||||||
|
String output = options.get("output");
|
||||||
|
if (version == null || output == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
LOG.info("Patching DOWNLOAD_MOJMAPS task");
|
||||||
|
return new VersionJsonDownloadTask(version, dependencyManager)
|
||||||
|
.thenComposeAsync(json -> {
|
||||||
|
DownloadInfo mappings = fromNonNullJson(json, Version.class)
|
||||||
|
.getDownloads().get(DownloadType.CLIENT_MAPPINGS);
|
||||||
|
if (mappings == null) {
|
||||||
|
throw new Exception("client_mappings download info not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
List<URL> mappingsUrl = dependencyManager.getDownloadProvider()
|
||||||
|
.injectURLWithCandidates(mappings.getUrl());
|
||||||
|
FileDownloadTask mappingsTask = new FileDownloadTask(
|
||||||
|
mappingsUrl,
|
||||||
|
new File(output),
|
||||||
|
IntegrityCheck.of("SHA-1", mappings.getSha1()));
|
||||||
|
mappingsTask.setCaching(true);
|
||||||
|
mappingsTask.setCacheRepository(dependencyManager.getCacheRepository());
|
||||||
|
return mappingsTask;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
private Task<?> createProcessorTask(Processor processor, Map<String, String> vars) {
|
private Task<?> createProcessorTask(Processor processor, Map<String, String> vars) {
|
||||||
Task<?> task = new ProcessorTask(processor, vars);
|
Task<?> task = patchDownloadMojangMappingsTask(processor, vars);
|
||||||
|
if (task == null) {
|
||||||
|
task = new ProcessorTask(processor, vars);
|
||||||
|
}
|
||||||
task.onDone().register(
|
task.onDone().register(
|
||||||
() -> updateProgress(processorDoneCount.incrementAndGet(), processors.size()));
|
() -> updateProgress(processorDoneCount.incrementAndGet(), processors.size()));
|
||||||
return task;
|
return task;
|
||||||
|
@ -214,6 +214,10 @@ public class Version implements Comparable<Version>, Validation {
|
|||||||
return compatibilityRules == null ? Collections.emptyList() : Collections.unmodifiableList(compatibilityRules);
|
return compatibilityRules == null ? Collections.emptyList() : Collections.unmodifiableList(compatibilityRules);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Map<DownloadType, DownloadInfo> getDownloads() {
|
||||||
|
return downloads == null ? Collections.emptyMap() : Collections.unmodifiableMap(downloads);
|
||||||
|
}
|
||||||
|
|
||||||
public DownloadInfo getDownloadInfo() {
|
public DownloadInfo getDownloadInfo() {
|
||||||
DownloadInfo client = downloads == null ? null : downloads.get(DownloadType.CLIENT);
|
DownloadInfo client = downloads == null ? null : downloads.get(DownloadType.CLIENT);
|
||||||
String jarName = jar == null ? id : jar;
|
String jarName = jar == null ? id : jar;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user