改进 ModLoader 兼容性检测 (#2730)

* 改进 ModLoader 兼容性检测

* update
This commit is contained in:
Glavo
2024-02-04 19:40:23 +08:00
committed by GitHub
parent 997552fb7e
commit c9ddb7aab4

View File

@@ -18,6 +18,7 @@
package org.jackhuang.hmcl.ui; package org.jackhuang.hmcl.ui;
import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXButton;
import javafx.beans.InvalidationListener;
import javafx.beans.binding.Bindings; import javafx.beans.binding.Bindings;
import javafx.beans.property.*; import javafx.beans.property.*;
import javafx.css.PseudoClass; import javafx.css.PseudoClass;
@@ -40,6 +41,11 @@ import org.jackhuang.hmcl.ui.construct.RipplerContainer;
import org.jackhuang.hmcl.util.i18n.I18n; import org.jackhuang.hmcl.util.i18n.I18n;
import org.jackhuang.hmcl.util.versioning.VersionNumber; import org.jackhuang.hmcl.util.versioning.VersionNumber;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import static org.jackhuang.hmcl.download.LibraryAnalyzer.LibraryType.*; import static org.jackhuang.hmcl.download.LibraryAnalyzer.LibraryType.*;
import static org.jackhuang.hmcl.util.i18n.I18n.i18n; import static org.jackhuang.hmcl.util.i18n.I18n.i18n;
@@ -135,45 +141,55 @@ public class InstallerItem extends Control {
private final InstallerItem[] libraries; private final InstallerItem[] libraries;
private final HashMap<InstallerItem, Set<InstallerItem>> incompatibleMap = new HashMap<>();
private Set<InstallerItem> getIncompatibles(InstallerItem item) {
return incompatibleMap.computeIfAbsent(item, it -> new HashSet<>());
}
private void addIncompatibles(InstallerItem item, InstallerItem... others) {
Set<InstallerItem> set = getIncompatibles(item);
for (InstallerItem other : others) {
set.add(other);
getIncompatibles(other).add(item);
}
}
private void mutualIncompatible(InstallerItem... items) {
for (InstallerItem item : items) {
Set<InstallerItem> set = getIncompatibles(item);
for (InstallerItem item2 : items) {
if (item2 != item) {
set.add(item2);
}
}
}
}
public InstallerItemGroup(String gameVersion) { public InstallerItemGroup(String gameVersion) {
forge.incompatibleLibraryName.bind(Bindings.createStringBinding(() -> { mutualIncompatible(forge, fabric, quilt, neoForge, liteLoader);
if (fabric.libraryVersion.get() != null) return FABRIC.getPatchId(); addIncompatibles(optiFine, fabric, quilt, neoForge);
if (quilt.libraryVersion.get() != null) return QUILT.getPatchId(); addIncompatibles(fabricApi, forge, quilt, quiltApi, neoForge, liteLoader, optiFine);
if (neoForge.libraryVersion.get() != null) return NEO_FORGE.getPatchId(); addIncompatibles(quiltApi, forge, fabric, fabricApi, neoForge, liteLoader, optiFine);
return null;
}, fabric.libraryVersion, quilt.libraryVersion, neoForge.libraryVersion));
neoForge.incompatibleLibraryName.bind(Bindings.createStringBinding(() -> { InvalidationListener listener = o -> {
if (fabric.libraryVersion.get() != null) return FABRIC.getPatchId(); for (Map.Entry<InstallerItem, Set<InstallerItem>> entry : incompatibleMap.entrySet()) {
if (quilt.libraryVersion.get() != null) return QUILT.getPatchId(); InstallerItem item = entry.getKey();
if (forge.libraryVersion.get() != null) return FORGE.getPatchId();
return null;
}, fabric.libraryVersion, quilt.libraryVersion, forge.libraryVersion));
liteLoader.incompatibleLibraryName.bind(Bindings.createStringBinding(() -> { String incompatibleId = null;
if (fabric.libraryVersion.get() != null) return FABRIC.getPatchId(); for (InstallerItem other : entry.getValue()) {
if (quilt.libraryVersion.get() != null) return QUILT.getPatchId(); if (other.libraryVersion.get() != null) {
if (neoForge.libraryVersion.get() != null) return NEO_FORGE.getPatchId(); incompatibleId = other.id;
return null; break;
}, fabric.libraryVersion, quilt.libraryVersion, neoForge.libraryVersion)); }
}
optiFine.incompatibleLibraryName.bind(Bindings.createStringBinding(() -> { item.incompatibleLibraryName.set(incompatibleId);
if (fabric.libraryVersion.get() != null) return FABRIC.getPatchId(); }
if (quilt.libraryVersion.get() != null) return QUILT.getPatchId(); };
if (neoForge.libraryVersion.get() != null) return NEO_FORGE.getPatchId(); for (InstallerItem item : incompatibleMap.keySet()) {
return null; item.libraryVersion.addListener(listener);
}, fabric.libraryVersion, quilt.libraryVersion, neoForge.libraryVersion));
for (InstallerItem fabric : new InstallerItem[]{fabric, fabricApi}) {
fabric.incompatibleLibraryName.bind(Bindings.createStringBinding(() -> {
if (forge.libraryVersion.get() != null) return FORGE.getPatchId();
if (neoForge.libraryVersion.get() != null) return NEO_FORGE.getPatchId();
if (liteLoader.libraryVersion.get() != null) return LITELOADER.getPatchId();
if (optiFine.libraryVersion.get() != null) return OPTIFINE.getPatchId();
if (quilt.libraryVersion.get() != null) return QUILT.getPatchId();
if (quiltApi.libraryVersion.get() != null) return QUILT_API.getPatchId();
return null;
}, forge.libraryVersion, neoForge.libraryVersion, liteLoader.libraryVersion, optiFine.libraryVersion, quilt.libraryVersion, quiltApi.libraryVersion));
} }
fabricApi.dependencyName.bind(Bindings.createStringBinding(() -> { fabricApi.dependencyName.bind(Bindings.createStringBinding(() -> {
@@ -181,24 +197,11 @@ public class InstallerItem extends Control {
else return null; else return null;
}, fabric.libraryVersion)); }, fabric.libraryVersion));
for (InstallerItem quilt : new InstallerItem[]{quilt, quiltApi}) {
quilt.incompatibleLibraryName.bind(Bindings.createStringBinding(() -> {
if (fabric.libraryVersion.get() != null) return FABRIC.getPatchId();
if (fabricApi.libraryVersion.get() != null) return FABRIC_API.getPatchId();
if (forge.libraryVersion.get() != null) return FORGE.getPatchId();
if (neoForge.libraryVersion.get() != null) return NEO_FORGE.getPatchId();
if (liteLoader.libraryVersion.get() != null) return LITELOADER.getPatchId();
if (optiFine.libraryVersion.get() != null) return OPTIFINE.getPatchId();
return null;
}, fabric.libraryVersion, fabricApi.libraryVersion, forge.libraryVersion, neoForge.libraryVersion, liteLoader.libraryVersion, optiFine.libraryVersion));
}
quiltApi.dependencyName.bind(Bindings.createStringBinding(() -> { quiltApi.dependencyName.bind(Bindings.createStringBinding(() -> {
if (quilt.libraryVersion.get() == null) return QUILT.getPatchId(); if (quilt.libraryVersion.get() == null) return QUILT.getPatchId();
else return null; else return null;
}, quilt.libraryVersion)); }, quilt.libraryVersion));
if (gameVersion == null) { if (gameVersion == null) {
this.libraries = new InstallerItem[]{game, forge, neoForge, liteLoader, optiFine, fabric, fabricApi, quilt, quiltApi}; this.libraries = new InstallerItem[]{game, forge, neoForge, liteLoader, optiFine, fabric, fabricApi, quilt, quiltApi};
} else if (VersionNumber.compare(gameVersion, "1.13") < 0) { } else if (VersionNumber.compare(gameVersion, "1.13") < 0) {