From 8c6808e7139f19425c3d0bfd65f5a81158126cc6 Mon Sep 17 00:00:00 2001 From: Ryan <87820585+SprainedSpark89@users.noreply.github.com> Date: Sun, 13 Sep 2026 08:46:38 -0700 Subject: [PATCH 1/2] The Worst Server Fix Ever At least it works??? --- .gitignore | 1 + src/main/java/org/quiltmc/installer/VersionManifest.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1c94804..8a55b20 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,4 @@ $RECYCLE.BIN/ # macOS .DS_Store .profileconfig.json +gradle.properties diff --git a/src/main/java/org/quiltmc/installer/VersionManifest.java b/src/main/java/org/quiltmc/installer/VersionManifest.java index 730a4cc..28da5c1 100644 --- a/src/main/java/org/quiltmc/installer/VersionManifest.java +++ b/src/main/java/org/quiltmc/installer/VersionManifest.java @@ -36,7 +36,7 @@ */ // TODO: Abstract to another library for sharing logic with meta? public final class VersionManifest implements Collection { - private static final String LAUNCHER_META_URL = "https://ornithemc.net/mc-versions/version_manifest.json"; + private static final String LAUNCHER_META_URL = "https://ornithemc.net/mc-versions/gen2/version_manifest.json"; private static final String LAUNCHER_META_BY_GEN_URL = "https://ornithemc.net/mc-versions/gen2/version_manifest.json"; private final Version latestRelease; From a62979ceb51b919d7ab7cf6212acd7168f532cc8 Mon Sep 17 00:00:00 2001 From: Ryan <87820585+SprainedSpark89@users.noreply.github.com> Date: Sun, 13 Sep 2026 10:01:31 -0700 Subject: [PATCH 2/2] client/server filters --- .../quiltmc/installer/VersionManifest.java | 64 ++++++++++++++++++- .../installer/gui/swing/AbstractPanel.java | 3 +- 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/quiltmc/installer/VersionManifest.java b/src/main/java/org/quiltmc/installer/VersionManifest.java index 28da5c1..be562e1 100644 --- a/src/main/java/org/quiltmc/installer/VersionManifest.java +++ b/src/main/java/org/quiltmc/installer/VersionManifest.java @@ -20,6 +20,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.io.UncheckedIOException; +import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.nio.charset.StandardCharsets; @@ -147,6 +148,7 @@ private static void readVersions(JsonReader reader, Map version String url = null; String time = null; String releaseTime = null; + String details = null; // used for getting client and server while (reader.hasNext()) { String key = reader.nextName(); @@ -187,6 +189,13 @@ private static void readVersions(JsonReader reader, Map version releaseTime = reader.nextString(); break; + case "details": + if (reader.peek() != JsonToken.STRING) { + throw new ParseException("Version release time must be a string", reader); + } + + details = reader.nextString(); + break; // v2 adds sha1 and complianceLevel, we do not need those default: reader.skipValue(); @@ -194,6 +203,11 @@ private static void readVersions(JsonReader reader, Map version } reader.endObject(); + + boolean[] clientServer = new boolean[] {false,false}; + if(details != null) { + clientServer = readDetails(details); + } if (id == null) throw new ParseException("Version id is required", reader); if (type == null) throw new ParseException("Version type is required", reader); @@ -203,11 +217,45 @@ private static void readVersions(JsonReader reader, Map version // if (time == null) throw new ParseException("Version time is required", reader); // if (releaseTime == null) throw new ParseException("Version release time is required", reader); - versions.put(id, new Version(id, type, url, time, releaseTime)); + versions.put(id, new Version(id, type, url, time, releaseTime, clientServer[1], clientServer[0])); } reader.endArray(); } + + private static boolean[] readDetails(String detailsUrl) throws MalformedURLException, IOException { + boolean[] clientServer = new boolean[] {false,false}; + URL url = new URL(detailsUrl); + InputStreamReader stream = new InputStreamReader(Connections.openConnection(url).getInputStream(), StandardCharsets.UTF_8); + BufferedReader buf = new BufferedReader(stream); + try (JsonReader reader = JsonReader.json(buf)) { + if (reader.peek() != JsonToken.BEGIN_OBJECT) { + throw new ParseException("Description Meta was invalid type", reader); + } + reader.beginObject(); + while (reader.hasNext()) { + String key = reader.nextName(); + + switch (key) { + case "client": + if (reader.peek() != JsonToken.BOOLEAN) { + throw new ParseException("Description client must be a boolean", reader); + } + clientServer[0] = reader.nextBoolean(); + break; + case "server": + if (reader.peek() != JsonToken.BOOLEAN) { + throw new ParseException("Description server must be a boolean", reader); + } + clientServer[1] = reader.nextBoolean(); + break; + default: + reader.skipValue(); + } + } + } + return clientServer; + } private VersionManifest(Version latestRelease, Version latestSnapshot, Map versions) { this.latestRelease = latestRelease; @@ -326,13 +374,17 @@ public static final class Version { private final String url; private final String time; private final String releaseTime; + private final boolean serverVer; + private final boolean clientVer; - Version(String id, String type, String url, String time, String releaseTime) { + Version(String id, String type, String url, String time, String releaseTime, boolean serverVer, boolean clientVer) { this.id = id; this.type = type; this.url = url; this.time = time; this.releaseTime = releaseTime; + this.serverVer = serverVer; + this.clientVer = clientVer; } public String id() { @@ -354,5 +406,13 @@ public String time() { public String releaseTime() { return this.releaseTime; } + + public boolean hasClientVersion() { + return clientVer; + } + + public boolean hasServerVersion() { + return serverVer; + } } } diff --git a/src/main/java/org/quiltmc/installer/gui/swing/AbstractPanel.java b/src/main/java/org/quiltmc/installer/gui/swing/AbstractPanel.java index 904c77d..e73c37d 100644 --- a/src/main/java/org/quiltmc/installer/gui/swing/AbstractPanel.java +++ b/src/main/java/org/quiltmc/installer/gui/swing/AbstractPanel.java @@ -96,12 +96,13 @@ static void populateMinecraftVersions(GameSide side, JComboBox comboBox, // Setup the combo box for Minecraft version selection comboBox.removeAllItems(); - manifest.parallelStream().filter(version -> version.type().equals("release") + manifest.parallelStream().filter(version -> (version.type().equals("release") || (version.type().equals("snapshot") && snapshots) || (version.type().equals("old_beta") && snapshots) || (version.type().equals("old_alpha") && snapshots) || (version.type().equals("alpha_server") && snapshots) || (version.type().equals("classic_server") && snapshots)) + && ((GameSide.CLIENT == side && version.hasClientVersion())) || (GameSide.SERVER == side && version.hasServerVersion())) .map(VersionManifest.Version::id) .filter(intermediaryVersions::containsKey) .forEachOrdered(comboBox::addItem);