diff --git a/.gitignore b/.gitignore index c5743c880..760c29d96 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,5 @@ NVIDIA # netbeans .nb-gradle + +*.exe \ No newline at end of file diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MaintainTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MaintainTask.java index 663838524..459d66d8e 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MaintainTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/download/MaintainTask.java @@ -70,6 +70,13 @@ public class MaintainTask extends Task { } } + public static Version maintainPreservingPatches(GameRepository repository, Version version) { + if (!version.isResolvedPreservingPatches()) + throw new IllegalArgumentException("MaintainTask requires independent game version"); + Version newVersion = maintain(repository, version.resolve(repository)); + return newVersion.setPatches(version.getPatches()).markAsUnresolved(); + } + private static Version maintainGameWithLaunchWrapper(Version version) { LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version); VersionLibraryBuilder builder = new VersionLibraryBuilder(version); 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 a4ce679be..f82d897e3 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java @@ -18,6 +18,7 @@ package org.jackhuang.hmcl.game; import com.google.gson.JsonParseException; +import org.jackhuang.hmcl.download.MaintainTask; import org.jackhuang.hmcl.download.game.VersionJsonSaveTask; import org.jackhuang.hmcl.event.Event; import org.jackhuang.hmcl.event.EventBus; @@ -393,7 +394,11 @@ public class DefaultGameRepository implements GameRepository { } public Task save(Version version) { - return new VersionJsonSaveTask(this, version); + if (version.isResolvedPreservingPatches()) { + return new VersionJsonSaveTask(this, MaintainTask.maintainPreservingPatches(this, version)); + } else { + return new VersionJsonSaveTask(this, version); + } } public boolean isLoaded() { diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Version.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Version.java index fd1346304..4f449ec19 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Version.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/Version.java @@ -223,7 +223,7 @@ public class Version implements Comparable, Validation { */ public Version resolve(VersionProvider provider) throws VersionNotFoundException { if (isResolved()) return this; - return resolve(provider, new HashSet<>()).setResolved(); + return resolve(provider, new HashSet<>()).markAsResolved(); } protected Version merge(Version parent, boolean isPatch) { @@ -243,12 +243,12 @@ public class Version implements Comparable, Validation { Lang.merge(parent.compatibilityRules, this.compatibilityRules), downloads == null ? parent.downloads : downloads, logging == null ? parent.logging : logging, - type, - time, - releaseTime, + type == null ? parent.type : type, + time == null ? parent.time : time, + releaseTime == null ? parent.releaseTime : releaseTime, Lang.merge(minimumLauncherVersion, parent.minimumLauncherVersion, Math::max), hidden, - false, + true, isPatch ? parent.patches : Lang.merge(Lang.merge(parent.patches, Collections.singleton(toPatch())), patches)); } @@ -256,7 +256,10 @@ public class Version implements Comparable, Validation { Version thisVersion; if (inheritsFrom == null) { - thisVersion = this.jar == null ? this.setJar(id) : this; + if (isRoot()) + thisVersion = new Version(id).setJar(id); + else + thisVersion = this.jar == null ? this.setJar(id) : this; } else { // To maximize the compatibility. if (!resolvedSoFar.add(id)) { @@ -315,10 +318,14 @@ public class Version implements Comparable, Validation { return thisVersion.setId(id); } - private Version setResolved() { + private Version markAsResolved() { return new Version(true, id, version, priority, minecraftArguments, arguments, mainClass, inheritsFrom, jar, assetIndex, assets, libraries, compatibilityRules, downloads, logging, type, time, releaseTime, minimumLauncherVersion, hidden, root, patches); } + public Version markAsUnresolved() { + return new Version(false, id, version, priority, minecraftArguments, arguments, mainClass, inheritsFrom, jar, assetIndex, assets, libraries, compatibilityRules, downloads, logging, type, time, releaseTime, minimumLauncherVersion, hidden, root, patches); + } + private Version setHidden(Boolean hidden) { return new Version(true, id, version, priority, minecraftArguments, arguments, mainClass, inheritsFrom, jar, assetIndex, assets, libraries, compatibilityRules, downloads, logging, type, time, releaseTime, minimumLauncherVersion, hidden, root, patches); }