From 30c27bbb670931339b7c988f26f23e2ad400e546 Mon Sep 17 00:00:00 2001 From: huanghongxun Date: Tue, 20 Aug 2019 00:53:59 +0800 Subject: [PATCH] MultiMC fabric and local libraries --- .../hmcl/game/DefaultGameRepository.java | 5 ++- .../multimc/MultiMCModpackInstallTask.java | 36 +++++++++++++------ 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java index 0901aab12..3efdb21ff 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java @@ -94,7 +94,10 @@ public class DefaultGameRepository implements GameRepository { @Override public File getLibraryFile(Version version, Library lib) { - return new File(getBaseDirectory(), "libraries/" + lib.getPath()); + if ("local".equals(lib.getHint())) + return new File(getVersionRoot(version.getId()), "libraries/" + lib.getFileName()); + else + return new File(getBaseDirectory(), "libraries/" + lib.getPath()); } public Path getArtifactFile(Version version, Artifact artifact) { 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 8f8c2d7c0..91b426cb8 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 @@ -21,16 +21,14 @@ import com.google.gson.JsonParseException; import com.google.gson.reflect.TypeToken; import org.jackhuang.hmcl.download.DefaultDependencyManager; import org.jackhuang.hmcl.download.GameBuilder; -import org.jackhuang.hmcl.download.MaintainTask; +import org.jackhuang.hmcl.game.Arguments; import org.jackhuang.hmcl.game.DefaultGameRepository; import org.jackhuang.hmcl.game.Version; -import org.jackhuang.hmcl.game.VersionLibraryBuilder; import org.jackhuang.hmcl.mod.MinecraftInstanceTask; import org.jackhuang.hmcl.mod.Modpack; import org.jackhuang.hmcl.mod.ModpackConfiguration; import org.jackhuang.hmcl.mod.ModpackInstallTask; import org.jackhuang.hmcl.task.Task; -import org.jackhuang.hmcl.util.Lang; import org.jackhuang.hmcl.util.gson.JsonUtils; import org.jackhuang.hmcl.util.io.CompressingUtils; import org.jackhuang.hmcl.util.io.FileUtils; @@ -41,6 +39,7 @@ import java.io.IOException; import java.nio.file.FileSystem; import java.nio.file.Files; import java.nio.file.Path; +import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Optional; @@ -84,6 +83,12 @@ public final class MultiMCModpackInstallTask extends Task { if (c.getVersion() != null) builder.version("liteloader", c.getVersion()); }); + + Optional fabric = manifest.getMmcPack().getComponents().stream().filter(e -> e.getUid().equals("net.fabricmc.fabric-loader")).findAny(); + fabric.ifPresent(c -> { + if (c.getVersion() != null) + builder.version("fabric", c.getVersion()); + }); } dependents.add(builder.buildAsync()); @@ -145,20 +150,29 @@ public final class MultiMCModpackInstallTask extends Task { for (Path patchJson : Files.newDirectoryStream(patches)) { if (patchJson.toString().endsWith(".json")) { // If json is malformed, we should stop installing this modpack instead of skipping it. - MultiMCInstancePatch patch = JsonUtils.GSON.fromJson(IOUtils.readFullyAsString(Files.newInputStream(patchJson)), MultiMCInstancePatch.class); + MultiMCInstancePatch multiMCPatch = JsonUtils.GSON.fromJson(IOUtils.readFullyAsString(Files.newInputStream(patchJson)), MultiMCInstancePatch.class); - VersionLibraryBuilder builder = new VersionLibraryBuilder(version); - for (String arg : patch.getTweakers()) - builder.addArgument("--tweakClass", arg); + List arguments = new ArrayList<>(); + for (String arg : multiMCPatch.getTweakers()) { + arguments.add("--tweakClass"); + arguments.add(arg); + } - version = builder.build() - .setLibraries(Lang.merge(version.getLibraries(), patch.getLibraries())) - .setMainClass(patch.getMainClass()); + Version patch = new Version(multiMCPatch.getName(), multiMCPatch.getVersion(), 1, new Arguments().addGameArguments(arguments), multiMCPatch.getMainClass(), multiMCPatch.getLibraries()); + version = version.addPatch(patch); } } + + Path libraries = root.resolve("libraries"); + if (Files.exists(libraries)) + FileUtils.copyDirectory(libraries, repository.getVersionRoot(name).toPath().resolve("libraries")); + + Path jarmods = root.resolve("jarmods"); + if (Files.exists(jarmods)) + FileUtils.copyDirectory(jarmods, repository.getVersionRoot(name).toPath().resolve("jarmods")); } - dependencies.add(new MaintainTask(version).thenComposeAsync(repository::save)); + dependencies.add(repository.save(version)); dependencies.add(new MinecraftInstanceTask<>(zipFile, modpack.getEncoding(), "/" + manifest.getName() + "/minecraft", manifest, MODPACK_TYPE, repository.getModpackConfiguration(name))); }