Fix #2854: 修复 LibraryAnalyzer.analyze 无法获得游戏版本的问题 (#2859)

* Fix #2854: 修复 LibraryAnalyzer.analyze 无法获得游戏版本的问题

* delete debug code

* update
This commit is contained in:
Glavo
2024-02-27 21:12:35 +08:00
committed by GitHub
parent 2ee5d9ceed
commit 559aefd6b6
18 changed files with 41 additions and 25 deletions

View File

@@ -282,7 +282,7 @@ public class HMCLGameRepository extends DefaultGameRepository {
} }
if (LibraryAnalyzer.isModded(this, version)) { if (LibraryAnalyzer.isModded(this, version)) {
LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version); LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version, getGameVersion(version).orElse(null));
if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.FABRIC)) if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.FABRIC))
return VersionIconType.FABRIC.getIcon(); return VersionIconType.FABRIC.getIcon();
else if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.FORGE)) else if (libraryAnalyzer.has(LibraryAnalyzer.LibraryType.FORGE))

View File

@@ -93,7 +93,7 @@ public final class HMCLModpackInstallTask extends Task<Void> {
public void execute() throws Exception { public void execute() throws Exception {
String json = CompressingUtils.readTextZipEntry(zipFile, "minecraft/pack.json"); String json = CompressingUtils.readTextZipEntry(zipFile, "minecraft/pack.json");
Version originalVersion = JsonUtils.GSON.fromJson(json, Version.class).setId(name).setJar(null); Version originalVersion = JsonUtils.GSON.fromJson(json, Version.class).setId(name).setJar(null);
LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(originalVersion); LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(originalVersion, repository.getGameVersion(originalVersion).orElse(null));
Task<Version> libraryTask = Task.supplyAsync(() -> originalVersion); Task<Version> libraryTask = Task.supplyAsync(() -> originalVersion);
// reinstall libraries // reinstall libraries
// libraries of Forge and OptiFine should be obtained by installation. // libraries of Forge and OptiFine should be obtained by installation.

View File

@@ -417,7 +417,7 @@ public final class LauncherHelper {
JavaVersionConstraint violatedMandatoryConstraint = null; JavaVersionConstraint violatedMandatoryConstraint = null;
List<JavaVersionConstraint> violatedSuggestedConstraints = null; List<JavaVersionConstraint> violatedSuggestedConstraints = null;
LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(version); LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(version, gameVersion.toString());
for (JavaVersionConstraint constraint : JavaVersionConstraint.ALL) { for (JavaVersionConstraint constraint : JavaVersionConstraint.ALL) {
if (constraint.appliesToVersion(gameVersion, version, javaVersion, analyzer)) { if (constraint.appliesToVersion(gameVersion, version, javaVersion, analyzer)) {
if (!constraint.checkJava(gameVersion, version, javaVersion)) { if (!constraint.checkJava(gameVersion, version, javaVersion)) {

View File

@@ -99,7 +99,7 @@ public class GameCrashWindow extends Stage {
this.version = version; this.version = version;
this.launchOptions = launchOptions; this.launchOptions = launchOptions;
this.logs = logs; this.logs = logs;
this.analyzer = LibraryAnalyzer.analyze(version); this.analyzer = LibraryAnalyzer.analyze(version, repository.getGameVersion(version).orElse(null));
memory = Optional.ofNullable(launchOptions.getMaxMemory()).map(i -> i + " MB").orElse("-"); memory = Optional.ofNullable(launchOptions.getMaxMemory()).map(i -> i + " MB").orElse("-");

View File

@@ -84,7 +84,8 @@ class AdditionalInstallersPage extends InstallersPage {
@Override @Override
protected void reload() { protected void reload() {
LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(version.resolvePreservingPatches(repository)); Version resolved = version.resolvePreservingPatches(repository);
LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(resolved, repository.getGameVersion(resolved).orElse(null));
String game = analyzer.getVersion(MINECRAFT).orElse(null); String game = analyzer.getVersion(MINECRAFT).orElse(null);
String currentGameVersion = Lang.nonNull(getVersion("game"), game); String currentGameVersion = Lang.nonNull(getVersion("game"), game);

View File

@@ -32,6 +32,7 @@ import javafx.scene.image.ImageView;
import javafx.scene.layout.*; import javafx.scene.layout.*;
import javafx.stage.FileChooser; import javafx.stage.FileChooser;
import org.jackhuang.hmcl.download.LibraryAnalyzer; import org.jackhuang.hmcl.download.LibraryAnalyzer;
import org.jackhuang.hmcl.game.HMCLGameRepository;
import org.jackhuang.hmcl.game.Version; import org.jackhuang.hmcl.game.Version;
import org.jackhuang.hmcl.mod.ModLoaderType; import org.jackhuang.hmcl.mod.ModLoaderType;
import org.jackhuang.hmcl.mod.RemoteMod; import org.jackhuang.hmcl.mod.RemoteMod;
@@ -291,8 +292,9 @@ public class DownloadPage extends Control implements DecoratorPage {
if (control.versions == null) return; if (control.versions == null) return;
if (control.version.getProfile() != null && control.version.getVersion() != null) { if (control.version.getProfile() != null && control.version.getVersion() != null) {
Version game = control.version.getProfile().getRepository().getResolvedPreservingPatchesVersion(control.version.getVersion()); HMCLGameRepository repository = control.version.getProfile().getRepository();
LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(game); Version game = repository.getResolvedPreservingPatchesVersion(control.version.getVersion());
LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(game, repository.getGameVersion(game).orElse(null));
libraryAnalyzer.getVersion(LibraryAnalyzer.LibraryType.MINECRAFT).ifPresent(currentGameVersion -> { libraryAnalyzer.getVersion(LibraryAnalyzer.LibraryType.MINECRAFT).ifPresent(currentGameVersion -> {
Set<ModLoaderType> currentGameModLoaders = libraryAnalyzer.getModLoaders(); Set<ModLoaderType> currentGameModLoaders = libraryAnalyzer.getModLoaders();
if (control.versions.containsKey(currentGameVersion)) { if (control.versions.containsKey(currentGameVersion)) {

View File

@@ -27,6 +27,8 @@ import javafx.scene.control.Control;
import javafx.scene.control.Skin; import javafx.scene.control.Skin;
import javafx.scene.image.Image; import javafx.scene.image.Image;
import org.jackhuang.hmcl.download.LibraryAnalyzer; import org.jackhuang.hmcl.download.LibraryAnalyzer;
import org.jackhuang.hmcl.game.HMCLGameRepository;
import org.jackhuang.hmcl.game.Version;
import org.jackhuang.hmcl.mod.ModpackConfiguration; import org.jackhuang.hmcl.mod.ModpackConfiguration;
import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.setting.Profile;
import org.jackhuang.hmcl.util.i18n.I18n; import org.jackhuang.hmcl.util.i18n.I18n;
@@ -62,7 +64,9 @@ public class GameItem extends Control {
CompletableFuture.supplyAsync(() -> profile.getRepository().getGameVersion(id).orElse(i18n("message.unknown")), POOL_VERSION_RESOLVE) CompletableFuture.supplyAsync(() -> profile.getRepository().getGameVersion(id).orElse(i18n("message.unknown")), POOL_VERSION_RESOLVE)
.thenAcceptAsync(game -> { .thenAcceptAsync(game -> {
StringBuilder libraries = new StringBuilder(game); StringBuilder libraries = new StringBuilder(game);
LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(profile.getRepository().getResolvedPreservingPatchesVersion(id)); HMCLGameRepository repository = profile.getRepository();
Version resolved = repository.getResolvedPreservingPatchesVersion(id);
LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(resolved, repository.getGameVersion(resolved).orElse(null));
for (LibraryAnalyzer.LibraryMark mark : analyzer) { for (LibraryAnalyzer.LibraryMark mark : analyzer) {
String libraryId = mark.getLibraryId(); String libraryId = mark.getLibraryId();
String libraryVersion = mark.getLibraryVersion(); String libraryVersion = mark.getLibraryVersion();

View File

@@ -72,7 +72,7 @@ public class InstallerListPage extends ListPageBase<InstallerItem> implements Ve
CompletableFuture.supplyAsync(() -> { CompletableFuture.supplyAsync(() -> {
gameVersion = profile.getRepository().getGameVersion(version).orElse(null); gameVersion = profile.getRepository().getGameVersion(version).orElse(null);
return LibraryAnalyzer.analyze(profile.getRepository().getResolvedPreservingPatchesVersion(versionId)); return LibraryAnalyzer.analyze(profile.getRepository().getResolvedPreservingPatchesVersion(versionId), gameVersion);
}).thenAcceptAsync(analyzer -> { }).thenAcceptAsync(analyzer -> {
Function<String, Runnable> removeAction = libraryId -> () -> { Function<String, Runnable> removeAction = libraryId -> () -> {
profile.getDependency().removeLibraryAsync(version, libraryId) profile.getDependency().removeLibraryAsync(version, libraryId)

View File

@@ -24,6 +24,8 @@ import javafx.collections.ObservableList;
import javafx.scene.control.Skin; import javafx.scene.control.Skin;
import javafx.stage.FileChooser; import javafx.stage.FileChooser;
import org.jackhuang.hmcl.download.LibraryAnalyzer; import org.jackhuang.hmcl.download.LibraryAnalyzer;
import org.jackhuang.hmcl.game.HMCLGameRepository;
import org.jackhuang.hmcl.game.Version;
import org.jackhuang.hmcl.mod.LocalModFile; import org.jackhuang.hmcl.mod.LocalModFile;
import org.jackhuang.hmcl.mod.ModManager; import org.jackhuang.hmcl.mod.ModManager;
import org.jackhuang.hmcl.setting.Profile; import org.jackhuang.hmcl.setting.Profile;
@@ -84,7 +86,9 @@ public final class ModListPage extends ListPageBase<ModListPageSkin.ModInfoObjec
this.profile = profile; this.profile = profile;
this.versionId = id; this.versionId = id;
libraryAnalyzer = LibraryAnalyzer.analyze(profile.getRepository().getResolvedPreservingPatchesVersion(id)); HMCLGameRepository repository = profile.getRepository();
Version resolved = repository.getResolvedPreservingPatchesVersion(id);
libraryAnalyzer = LibraryAnalyzer.analyze(resolved, repository.getGameVersion(resolved).orElse(null));
modded.set(libraryAnalyzer.hasModLoader()); modded.set(libraryAnalyzer.hasModLoader());
loadMods(profile.getRepository().getModManager(id)); loadMods(profile.getRepository().getModManager(id));
} }

View File

@@ -106,7 +106,7 @@ public class DefaultDependencyManager extends AbstractDependencyManager {
Version original = repository.getVersion(version.getId()); Version original = repository.getVersion(version.getId());
Version resolved = original.resolvePreservingPatches(repository); Version resolved = original.resolvePreservingPatches(repository);
LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(resolved); LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(resolved, repository.getGameVersion(resolved).orElse(null));
for (LibraryAnalyzer.LibraryType type : LibraryAnalyzer.LibraryType.values()) { for (LibraryAnalyzer.LibraryType type : LibraryAnalyzer.LibraryType.values()) {
if (!analyzer.has(type)) if (!analyzer.has(type))
continue; continue;
@@ -218,8 +218,9 @@ public class DefaultDependencyManager extends AbstractDependencyManager {
if (version.isResolved()) if (version.isResolved())
throw new IllegalArgumentException("removeLibraryWithoutSavingAsync requires non-resolved version"); throw new IllegalArgumentException("removeLibraryWithoutSavingAsync requires non-resolved version");
Version independentVersion = version.resolvePreservingPatches(repository); Version independentVersion = version.resolvePreservingPatches(repository);
String gameVersion = repository.getGameVersion(independentVersion).orElse(null);
return Task.supplyAsync(() -> LibraryAnalyzer.analyze(independentVersion).removeLibrary(libraryId).build()); return Task.supplyAsync(() -> LibraryAnalyzer.analyze(independentVersion, gameVersion).removeLibrary(libraryId).build());
} }
} }

View File

@@ -130,12 +130,16 @@ public final class LibraryAnalyzer implements Iterable<LibraryAnalyzer.LibraryMa
return version; return version;
} }
public static LibraryAnalyzer analyze(Version version) { public static LibraryAnalyzer analyze(Version version, String gameVersion) {
if (version.getInheritsFrom() != null) if (version.getInheritsFrom() != null)
throw new IllegalArgumentException("LibraryAnalyzer can only analyze independent game version"); throw new IllegalArgumentException("LibraryAnalyzer can only analyze independent game version");
Map<String, Pair<Library, String>> libraries = new HashMap<>(); Map<String, Pair<Library, String>> libraries = new HashMap<>();
if (gameVersion != null) {
libraries.put(LibraryType.MINECRAFT.getPatchId(), pair(null, gameVersion));
}
List<Library> rawLibraries = version.resolve(null).getLibraries(); List<Library> rawLibraries = version.resolve(null).getLibraries();
for (Library library : rawLibraries) { for (Library library : rawLibraries) {
for (LibraryType type : LibraryType.values()) { for (LibraryType type : LibraryType.values()) {

View File

@@ -63,7 +63,7 @@ public class MaintainTask extends Task<Version> {
String mainClass = version.resolve(null).getMainClass(); String mainClass = version.resolve(null).getMainClass();
if (mainClass != null && mainClass.equals(LibraryAnalyzer.LAUNCH_WRAPPER_MAIN)) { if (mainClass != null && mainClass.equals(LibraryAnalyzer.LAUNCH_WRAPPER_MAIN)) {
version = maintainOptiFineLibrary(repository, maintainGameWithLaunchWrapper(unique(version), true), false); version = maintainOptiFineLibrary(repository, maintainGameWithLaunchWrapper(repository, unique(version), true), false);
} else if (mainClass != null && mainClass.equals(LibraryAnalyzer.MOD_LAUNCHER_MAIN)) { } else if (mainClass != null && mainClass.equals(LibraryAnalyzer.MOD_LAUNCHER_MAIN)) {
// Forge 1.13 and OptiFine // Forge 1.13 and OptiFine
version = maintainOptiFineLibrary(repository, maintainGameWithCpwModLauncher(repository, unique(version)), true); version = maintainOptiFineLibrary(repository, maintainGameWithCpwModLauncher(repository, unique(version)), true);
@@ -97,8 +97,8 @@ public class MaintainTask extends Task<Version> {
return newVersion.setPatches(version.getPatches()).markAsUnresolved(); return newVersion.setPatches(version.getPatches()).markAsUnresolved();
} }
private static Version maintainGameWithLaunchWrapper(Version version, boolean reorderTweakClass) { private static Version maintainGameWithLaunchWrapper(GameRepository repository, Version version, boolean reorderTweakClass) {
LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version); LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version, repository.getGameVersion(version).orElse(null));
VersionLibraryBuilder builder = new VersionLibraryBuilder(version); VersionLibraryBuilder builder = new VersionLibraryBuilder(version);
String mainClass = null; String mainClass = null;
@@ -147,7 +147,7 @@ public class MaintainTask extends Task<Version> {
} }
private static Version maintainGameWithCpwModLauncher(GameRepository repository, Version version) { private static Version maintainGameWithCpwModLauncher(GameRepository repository, Version version) {
LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version); LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version, repository.getGameVersion(version).orElse(null));
VersionLibraryBuilder builder = new VersionLibraryBuilder(version); VersionLibraryBuilder builder = new VersionLibraryBuilder(version);
if (!libraryAnalyzer.has(FORGE)) return version; if (!libraryAnalyzer.has(FORGE)) return version;
@@ -205,7 +205,7 @@ public class MaintainTask extends Task<Version> {
// Fix wrong configurations when launching 1.17+ with Forge. // Fix wrong configurations when launching 1.17+ with Forge.
private static Version maintainGameWithCpwBoostrapLauncher(GameRepository repository, Version version) { private static Version maintainGameWithCpwBoostrapLauncher(GameRepository repository, Version version) {
LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version); LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version, repository.getGameVersion(version).orElse(null));
VersionLibraryBuilder builder = new VersionLibraryBuilder(version); VersionLibraryBuilder builder = new VersionLibraryBuilder(version);
if (!libraryAnalyzer.has(FORGE) && !libraryAnalyzer.has(NEO_FORGE)) return version; if (!libraryAnalyzer.has(FORGE) && !libraryAnalyzer.has(NEO_FORGE)) return version;
@@ -247,7 +247,7 @@ public class MaintainTask extends Task<Version> {
} }
private static Version maintainOptiFineLibrary(GameRepository repository, Version version, boolean remove) { private static Version maintainOptiFineLibrary(GameRepository repository, Version version, boolean remove) {
LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version); LibraryAnalyzer libraryAnalyzer = LibraryAnalyzer.analyze(version, repository.getGameVersion(version).orElse(null));
List<Library> libraries = new ArrayList<>(version.getLibraries()); List<Library> libraries = new ArrayList<>(version.getLibraries());
if (libraryAnalyzer.has(OPTIFINE)) { if (libraryAnalyzer.has(OPTIFINE)) {

View File

@@ -63,7 +63,7 @@ public final class GameVerificationFixTask extends Task<Void> {
@Override @Override
public void execute() throws IOException { public void execute() throws IOException {
File jar = dependencyManager.getGameRepository().getVersionJar(version); File jar = dependencyManager.getGameRepository().getVersionJar(version);
LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(version); LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(version, gameVersion);
if (jar.exists() && GameVersionNumber.compare(gameVersion, "1.6") < 0 && analyzer.has(LibraryAnalyzer.LibraryType.FORGE)) { if (jar.exists() && GameVersionNumber.compare(gameVersion, "1.6") < 0 && analyzer.has(LibraryAnalyzer.LibraryType.FORGE)) {
try (FileSystem fs = CompressingUtils.createWritableZipFileSystem(jar.toPath(), StandardCharsets.UTF_8)) { try (FileSystem fs = CompressingUtils.createWritableZipFileSystem(jar.toPath(), StandardCharsets.UTF_8)) {

View File

@@ -226,7 +226,7 @@ public enum JavaVersionConstraint {
public static VersionRanges findSuitableJavaVersionRange(GameVersionNumber gameVersion, Version version) { public static VersionRanges findSuitableJavaVersionRange(GameVersionNumber gameVersion, Version version) {
VersionRange<VersionNumber> mandatoryJavaRange = VersionRange.all(); VersionRange<VersionNumber> mandatoryJavaRange = VersionRange.all();
VersionRange<VersionNumber> suggestedJavaRange = VersionRange.all(); VersionRange<VersionNumber> suggestedJavaRange = VersionRange.all();
LibraryAnalyzer analyzer = version != null ? LibraryAnalyzer.analyze(version) : null; LibraryAnalyzer analyzer = version != null ? LibraryAnalyzer.analyze(version, gameVersion != null ? gameVersion.toString() : null) : null;
for (JavaVersionConstraint java : ALL) { for (JavaVersionConstraint java : ALL) {
if (java.appliesToVersion(gameVersion, version, null, analyzer)) { if (java.appliesToVersion(gameVersion, version, null, analyzer)) {
VersionRange<VersionNumber> javaVersionRange = java.getJavaVersionRange(version); VersionRange<VersionNumber> javaVersionRange = java.getJavaVersionRange(version);

View File

@@ -505,7 +505,7 @@ public class DefaultLauncher extends Launcher {
} }
} }
LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(version); LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(version, repository.getGameVersion(version).orElse(null));
if (analyzer.has(LibraryAnalyzer.LibraryType.FORGE)) { if (analyzer.has(LibraryAnalyzer.LibraryType.FORGE)) {
env.put("INST_FORGE", "1"); env.put("INST_FORGE", "1");
} }

View File

@@ -82,9 +82,9 @@ public class McbbsModpackExportTask extends Task<Void> {
} }
}); });
LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(repository.getResolvedPreservingPatchesVersion(version));
String gameVersion = repository.getGameVersion(version) String gameVersion = repository.getGameVersion(version)
.orElseThrow(() -> new IOException("Cannot parse the version of " + version)); .orElseThrow(() -> new IOException("Cannot parse the version of " + version));
LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(repository.getResolvedPreservingPatchesVersion(version), gameVersion);
// Mcbbs manifest // Mcbbs manifest
List<McbbsModpackManifest.Addon> addons = new ArrayList<>(); List<McbbsModpackManifest.Addon> addons = new ArrayList<>();

View File

@@ -70,9 +70,9 @@ public class MultiMCModpackExportTask extends Task<Void> {
try (Zipper zip = new Zipper(output.toPath())) { try (Zipper zip = new Zipper(output.toPath())) {
zip.putDirectory(repository.getRunDirectory(versionId).toPath(), ".minecraft", path -> Modpack.acceptFile(path, blackList, whitelist)); zip.putDirectory(repository.getRunDirectory(versionId).toPath(), ".minecraft", path -> Modpack.acceptFile(path, blackList, whitelist));
LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(repository.getResolvedPreservingPatchesVersion(versionId));
String gameVersion = repository.getGameVersion(versionId) String gameVersion = repository.getGameVersion(versionId)
.orElseThrow(() -> new IOException("Cannot parse the version of " + versionId)); .orElseThrow(() -> new IOException("Cannot parse the version of " + versionId));
LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(repository.getResolvedPreservingPatchesVersion(versionId), gameVersion);
List<MultiMCManifest.MultiMCManifestComponent> components = new ArrayList<>(); List<MultiMCManifest.MultiMCManifestComponent> components = new ArrayList<>();
components.add(new MultiMCManifest.MultiMCManifestComponent(true, false, "net.minecraft", gameVersion)); components.add(new MultiMCManifest.MultiMCManifestComponent(true, false, "net.minecraft", gameVersion));
analyzer.getVersion(FORGE).ifPresent(forgeVersion -> analyzer.getVersion(FORGE).ifPresent(forgeVersion ->

View File

@@ -78,9 +78,9 @@ public class ServerModpackExportTask extends Task<Void> {
} }
}); });
LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(repository.getResolvedPreservingPatchesVersion(versionId));
String gameVersion = repository.getGameVersion(versionId) String gameVersion = repository.getGameVersion(versionId)
.orElseThrow(() -> new IOException("Cannot parse the version of " + versionId)); .orElseThrow(() -> new IOException("Cannot parse the version of " + versionId));
LibraryAnalyzer analyzer = LibraryAnalyzer.analyze(repository.getResolvedPreservingPatchesVersion(versionId), gameVersion);
List<ServerModpackManifest.Addon> addons = new ArrayList<>(); List<ServerModpackManifest.Addon> addons = new ArrayList<>();
addons.add(new ServerModpackManifest.Addon(MINECRAFT.getPatchId(), gameVersion)); addons.add(new ServerModpackManifest.Addon(MINECRAFT.getPatchId(), gameVersion));
analyzer.getVersion(FORGE).ifPresent(forgeVersion -> analyzer.getVersion(FORGE).ifPresent(forgeVersion ->