diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackInstallTask.java b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackInstallTask.java index 1d766e126..265e12e06 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackInstallTask.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/game/HMCLModpackInstallTask.java @@ -19,7 +19,6 @@ package org.jackhuang.hmcl.game; import com.google.gson.JsonParseException; import com.google.gson.reflect.TypeToken; -import org.jackhuang.hmcl.download.DefaultDependencyManager; import org.jackhuang.hmcl.download.DependencyManager; import org.jackhuang.hmcl.download.game.VersionJsonSaveTask; import org.jackhuang.hmcl.mod.*; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultDependencyManager.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultDependencyManager.java index f7b1be279..c5bf0010c 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultDependencyManager.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/DefaultDependencyManager.java @@ -18,10 +18,7 @@ package org.jackhuang.hmcl.download; import org.jackhuang.hmcl.download.forge.ForgeInstallTask; -import org.jackhuang.hmcl.download.game.GameAssetDownloadTask; -import org.jackhuang.hmcl.download.game.GameLibrariesTask; -import org.jackhuang.hmcl.download.game.GameLoggingDownloadTask; -import org.jackhuang.hmcl.download.game.VersionJsonSaveTask; +import org.jackhuang.hmcl.download.game.*; import org.jackhuang.hmcl.download.liteloader.LiteLoaderInstallTask; import org.jackhuang.hmcl.download.optifine.OptiFineInstallTask; import org.jackhuang.hmcl.game.DefaultGameRepository; @@ -86,12 +83,15 @@ public class DefaultDependencyManager extends AbstractDependencyManager { switch (libraryId) { case "forge": return new ForgeInstallTask(this, gameVersion, version, libraryVersion) + .then(variables -> new LibrariesUniqueTask(variables.get("version"))) .then(variables -> new VersionJsonSaveTask(repository, variables.get("version"))); case "liteloader": return new LiteLoaderInstallTask(this, gameVersion, version, libraryVersion) + .then(variables -> new LibrariesUniqueTask(variables.get("version"))) .then(variables -> new VersionJsonSaveTask(repository, variables.get("version"))); case "optifine": return new OptiFineInstallTask(this, gameVersion, version, libraryVersion) + .then(variables -> new LibrariesUniqueTask(variables.get("version"))) .then(variables -> new VersionJsonSaveTask(repository, variables.get("version"))); default: throw new IllegalArgumentException("Library id " + libraryId + " is unrecognized."); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/LibrariesUniqueTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/LibrariesUniqueTask.java new file mode 100644 index 000000000..1e71b8e21 --- /dev/null +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/game/LibrariesUniqueTask.java @@ -0,0 +1,75 @@ +/* + * Hello Minecraft! Launcher. + * Copyright (C) 2017 huangyuhui + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see {http://www.gnu.org/licenses/}. + */ +package org.jackhuang.hmcl.download.game; + +import org.jackhuang.hmcl.game.Library; +import org.jackhuang.hmcl.game.Version; +import org.jackhuang.hmcl.task.TaskResult; +import org.jackhuang.hmcl.util.SimpleMultimap; +import org.jackhuang.hmcl.util.VersionNumber; + +import java.util.*; +import java.util.stream.Collectors; + +public class LibrariesUniqueTask extends TaskResult { + private final Version version; + private final String id; + + public LibrariesUniqueTask(Version version) { + this(version, "version"); + } + + public LibrariesUniqueTask(Version version, String id) { + this.version = version; + this.id = id; + } + + @Override + public void execute() throws Exception { + List libraries = new ArrayList<>(version.getLibraries()); + + Map versionMap = new HashMap<>(); + SimpleMultimap multimap = new SimpleMultimap(HashMap::new, LinkedList::new); + + for (Library library : libraries) { + String id = library.getGroupId() + ":" + library.getArtifactId(); + VersionNumber number = VersionNumber.asVersion(library.getVersion()); + + if (versionMap.containsKey(id)) { + VersionNumber otherNumber = versionMap.get(id); + if (number.compareTo(otherNumber) > 0) { + multimap.removeKey(id); + versionMap.put(id, number); + multimap.put(id, library); + } else if (number.compareTo(otherNumber) == 0) { + multimap.put(id, library); + } + } else { + versionMap.put(id, number); + multimap.put(id, library); + } + } + + setResult(version.setLibraries(multimap.values().stream().sorted().collect(Collectors.toList()))); + } + + @Override + public String getId() { + return id; + } +} 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 8a5dabcda..a8eeee2a3 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Library.java @@ -26,6 +26,7 @@ import org.jackhuang.hmcl.util.Platform; import java.lang.reflect.Type; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; /** @@ -33,7 +34,7 @@ import java.util.Optional; * * @author huangyuhui */ -public class Library { +public class Library implements Comparable { private final String groupId; private final String artifactId; @@ -107,6 +108,10 @@ public class Library { return artifactId; } + public String getName() { + return groupId + ":" + artifactId + ":" + version; + } + public String getVersion() { return version; } @@ -137,7 +142,29 @@ public class Library { @Override public String toString() { - return "Library[" + groupId + ":" + artifactId + ":" + version + "]"; + return "Library[" + getName() + "]"; + } + + @Override + public int compareTo(Library o) { + if (getName().compareTo(o.getName()) == 0) + return Boolean.compare(isNative(), o.isNative()); + else + return getName().compareTo(o.getName()); + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof Library)) + return false; + + Library other = (Library) obj; + return getName().equals(other.getName()) && (isNative() == other.isNative()); + } + + @Override + public int hashCode() { + return Objects.hash(getName(), isNative()); } public static Library fromName(String name) { @@ -182,7 +209,7 @@ public class Library { if (src == null) return JsonNull.INSTANCE; JsonObject obj = new JsonObject(); - obj.addProperty("name", src.groupId + ":" + src.artifactId + ":" + src.version); + obj.addProperty("name", src.getName()); obj.addProperty("url", src.url); obj.add("downloads", context.serialize(src.downloads)); obj.add("extract", context.serialize(src.extract));