From be4317cf9d982018b4ff86375d680826ffacb62f Mon Sep 17 00:00:00 2001 From: Sefa Eyeoglu Date: Thu, 28 Dec 2023 22:20:03 +0100 Subject: refactor!: package using Nix Signed-off-by: Sefa Eyeoglu --- meta/common/__init__.py | 23 +- meta/common/forge.py | 5 +- meta/common/mojang-library-patches.json | 2879 +++++++++++++++++++++ meta/common/mojang-minecraft-experiments.json | 104 + meta/common/mojang-minecraft-legacy-override.json | 585 +++++ meta/common/mojang-minecraft-legacy-services.json | 218 ++ meta/common/mojang-minecraft-old-snapshots.json | 604 +++++ meta/common/mojang.py | 16 +- meta/run/__init__.py | 1 + meta/run/generate_fabric.py | 143 + meta/run/generate_forge.py | 472 ++++ meta/run/generate_liteloader.py | 118 + meta/run/generate_mojang.py | 576 +++++ meta/run/generate_neoforge.py | 181 ++ meta/run/generate_quilt.py | 161 ++ meta/run/index.py | 78 + meta/run/update_fabric.py | 130 + meta/run/update_forge.py | 397 +++ meta/run/update_liteloader.py | 37 + meta/run/update_mojang.py | 161 ++ meta/run/update_neoforge.py | 319 +++ meta/run/update_quilt.py | 122 + 22 files changed, 7310 insertions(+), 20 deletions(-) create mode 100644 meta/common/mojang-library-patches.json create mode 100644 meta/common/mojang-minecraft-experiments.json create mode 100644 meta/common/mojang-minecraft-legacy-override.json create mode 100644 meta/common/mojang-minecraft-legacy-services.json create mode 100644 meta/common/mojang-minecraft-old-snapshots.json create mode 100644 meta/run/__init__.py create mode 100755 meta/run/generate_fabric.py create mode 100755 meta/run/generate_forge.py create mode 100755 meta/run/generate_liteloader.py create mode 100755 meta/run/generate_mojang.py create mode 100644 meta/run/generate_neoforge.py create mode 100755 meta/run/generate_quilt.py create mode 100755 meta/run/index.py create mode 100755 meta/run/update_fabric.py create mode 100755 meta/run/update_forge.py create mode 100755 meta/run/update_liteloader.py create mode 100755 meta/run/update_mojang.py create mode 100644 meta/run/update_neoforge.py create mode 100755 meta/run/update_quilt.py (limited to 'meta') diff --git a/meta/common/__init__.py b/meta/common/__init__.py index 454a2cfeb8..9e623bdca8 100644 --- a/meta/common/__init__.py +++ b/meta/common/__init__.py @@ -1,4 +1,5 @@ import os +import os.path import datetime from urllib.parse import urlparse @@ -16,24 +17,24 @@ def serialize_datetime(dt: datetime.datetime): return dt.isoformat() +def cache_path(): + if "META_CACHE_DIR" in os.environ: + return os.environ["META_CACHE_DIR"] + return "cache" + + def launcher_path(): - if "LAUNCHER_DIR" in os.environ: - return os.environ["LAUNCHER_DIR"] + if "META_LAUNCHER_DIR" in os.environ: + return os.environ["META_LAUNCHER_DIR"] return "launcher" def upstream_path(): - if "UPSTREAM_DIR" in os.environ: - return os.environ["UPSTREAM_DIR"] + if "META_UPSTREAM_DIR" in os.environ: + return os.environ["META_UPSTREAM_DIR"] return "upstream" -def static_path(): - if "STATIC_DIR" in os.environ: - return os.environ["STATIC_DIR"] - return "static" - - def ensure_upstream_dir(path): path = os.path.join(upstream_path(), path) if not os.path.exists(path): @@ -78,7 +79,7 @@ def merge_dict(base: dict, overlay: dict): def default_session(): - forever_cache = FileCache("caches/http_cache", forever=True) + forever_cache = FileCache(os.path.join(cache_path(), "http_cache"), forever=True) sess = CacheControl(requests.Session(), forever_cache) sess.headers.update({"User-Agent": "PrismLauncherMeta/1.0"}) diff --git a/meta/common/forge.py b/meta/common/forge.py index 4fccc7dcb6..25be5a9949 100644 --- a/meta/common/forge.py +++ b/meta/common/forge.py @@ -1,4 +1,4 @@ -from os.path import join +from os.path import join, dirname from ..model import GradleSpecifier, make_launcher_library @@ -10,8 +10,7 @@ INSTALLER_MANIFEST_DIR = join(BASE_DIR, "installer_manifests") VERSION_MANIFEST_DIR = join(BASE_DIR, "version_manifests") FILE_MANIFEST_DIR = join(BASE_DIR, "files_manifests") DERIVED_INDEX_FILE = join(BASE_DIR, "derived_index.json") - -STATIC_LEGACYINFO_FILE = join(BASE_DIR, "forge-legacyinfo.json") +LEGACYINFO_FILE = join(BASE_DIR, "legacyinfo.json") FORGE_COMPONENT = "net.minecraftforge" diff --git a/meta/common/mojang-library-patches.json b/meta/common/mojang-library-patches.json new file mode 100644 index 0000000000..74d4d26c4b --- /dev/null +++ b/meta/common/mojang-library-patches.json @@ -0,0 +1,2879 @@ +[ + { + "_comment": "Only allow osx-arm64 for existing LWJGL 3.3.2/3.3.3", + "match": [ + "org.lwjgl:lwjgl-freetype-natives-macos-arm64:3.3.2", + "org.lwjgl:lwjgl-glfw-natives-macos-arm64:3.3.2", + "org.lwjgl:lwjgl-jemalloc-natives-macos-arm64:3.3.2", + "org.lwjgl:lwjgl-openal-natives-macos-arm64:3.3.2", + "org.lwjgl:lwjgl-opengl-natives-macos-arm64:3.3.2", + "org.lwjgl:lwjgl-stb-natives-macos-arm64:3.3.2", + "org.lwjgl:lwjgl-tinyfd-natives-macos-arm64:3.3.2", + "org.lwjgl:lwjgl-natives-macos-arm64:3.3.2", + "org.lwjgl:lwjgl-freetype-natives-macos-arm64:3.3.3", + "org.lwjgl:lwjgl-glfw-natives-macos-arm64:3.3.3", + "org.lwjgl:lwjgl-jemalloc-natives-macos-arm64:3.3.3", + "org.lwjgl:lwjgl-openal-natives-macos-arm64:3.3.3", + "org.lwjgl:lwjgl-opengl-natives-macos-arm64:3.3.3", + "org.lwjgl:lwjgl-stb-natives-macos-arm64:3.3.3", + "org.lwjgl:lwjgl-tinyfd-natives-macos-arm64:3.3.3", + "org.lwjgl:lwjgl-natives-macos-arm64:3.3.3" + ], + "override": { + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + }, + { + "_comment": "Only allow windows-arm64 for existing LWJGL 3.3.2/3.3.3", + "match": [ + "org.lwjgl:lwjgl-freetype-natives-windows-arm64:3.3.2", + "org.lwjgl:lwjgl-glfw-natives-windows-arm64:3.3.2", + "org.lwjgl:lwjgl-jemalloc-natives-windows-arm64:3.3.2", + "org.lwjgl:lwjgl-openal-natives-windows-arm64:3.3.2", + "org.lwjgl:lwjgl-opengl-natives-windows-arm64:3.3.2", + "org.lwjgl:lwjgl-stb-natives-windows-arm64:3.3.2", + "org.lwjgl:lwjgl-tinyfd-natives-windows-arm64:3.3.2", + "org.lwjgl:lwjgl-natives-windows-arm64:3.3.2", + "org.lwjgl:lwjgl-freetype-natives-windows-arm64:3.3.3", + "org.lwjgl:lwjgl-glfw-natives-windows-arm64:3.3.3", + "org.lwjgl:lwjgl-jemalloc-natives-windows-arm64:3.3.3", + "org.lwjgl:lwjgl-openal-natives-windows-arm64:3.3.3", + "org.lwjgl:lwjgl-opengl-natives-windows-arm64:3.3.3", + "org.lwjgl:lwjgl-stb-natives-windows-arm64:3.3.3", + "org.lwjgl:lwjgl-tinyfd-natives-windows-arm64:3.3.3", + "org.lwjgl:lwjgl-natives-windows-arm64:3.3.3" + ], + "override": { + "rules": [ + { + "action": "allow", + "os": { + "name": "windows-arm64" + } + } + ] + } + }, + { + "_comment": "Add missing tinyfd to the broken LWJGL 3.2.2 variant", + "match": [ + "org.lwjgl:lwjgl:3.2.2" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9", + "size": 7092, + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2.jar" + } + }, + "name": "org.lwjgl:lwjgl-tinyfd:3.2.2" + }, + { + "downloads": { + "artifact": { + "sha1": "fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9", + "size": 7092, + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2.jar" + }, + "classifiers": { + "natives-linux": { + "sha1": "39e35b161c130635d9c8918ce04e887a30c5b687", + "size": 38804, + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2-natives-linux.jar" + }, + "natives-macos": { + "sha1": "46d0798228b8a28e857a2a0f02310fd6ba2a4eab", + "size": 42136, + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2-natives-macos.jar" + }, + "natives-windows": { + "sha1": "e9115958773644e863332a6a06488d26f9e1fc9f", + "size": 208314, + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2-natives-windows.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-tinyfd:3.2.2", + "natives": { + "linux": "natives-linux", + "osx": "natives-macos", + "windows": "natives-windows" + } + } + ], + "patchAdditionalLibraries": true + }, + { + "_comment": "Add additional library just for osx-arm64. No override needed", + "match": [ + "ca.weblite:java-objc-bridge:1.0.0" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "369a83621e3c65496348491e533cb97fe5f2f37d", + "size": 91947, + "url": "https://github.com/MinecraftMachina/Java-Objective-C-Bridge/releases/download/1.1.0-mmachina.1/java-objc-bridge-1.1.jar" + } + }, + "name": "ca.weblite:java-objc-bridge:1.1.0-mmachina.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add additional classifiers for jinput-platform", + "match": [ + "net.java.jinput:jinput-platform:2.0.5" + ], + "override": { + "downloads": { + "classifiers": { + "natives-osx-arm64": { + "sha1": "5189eb40db3087fb11ca063b68fa4f4c20b199dd", + "size": 10031, + "url": "https://github.com/r58Playz/jinput-m1/raw/main/plugins/OSX/bin/jinput-platform-2.0.5.jar" + }, + "natives-linux-arm64": { + "sha1": "42b388ccb7c63cec4e9f24f4dddef33325f8b212", + "size": 10932, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-2.9.4/jinput-platform-2.0.5-natives-linux.jar" + }, + "natives-linux-arm32": { + "sha1": "f3c455b71c5146acb5f8a9513247fc06db182fd5", + "size": 4521, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-2.9.4/jinput-platform-2.0.5-natives-linux.jar" + } + } + }, + "natives": { + "linux-arm64": "natives-linux-arm64", + "linux-arm32": "natives-linux-arm32", + "osx-arm64": "natives-osx-arm64" + } + } + }, + { + "_comment": "Use a newer version on osx-arm64", + "match": [ + "com.mojang:text2speech:1.0.10", + "com.mojang:text2speech:1.5", + "com.mojang:text2speech:1.6", + "com.mojang:text2speech:1.7", + "com.mojang:text2speech:1.10.1", + "com.mojang:text2speech:1.10.3", + "com.mojang:text2speech:1.11.2" + ], + "override": { + "rules": [ + { + "action": "allow" + }, + { + "action": "disallow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "f378f889797edd7df8d32272c06ca80a1b6b0f58", + "size": 13164, + "url": "https://libraries.minecraft.net/com/mojang/text2speech/1.11.3/text2speech-1.11.3.jar" + } + }, + "name": "com.mojang:text2speech:1.11.3", + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Use a newer version on osx-arm64, linux-arm64, and linux-arm32", + "match": [ + "org.lwjgl.lwjgl:lwjgl:2.9.3", + "org.lwjgl.lwjgl:lwjgl:2.9.1-nightly-20131120", + "org.lwjgl.lwjgl:lwjgl:2.9.1-nightly-20131017", + "org.lwjgl.lwjgl:lwjgl:2.9.1-nightly-20130708-debug3", + "org.lwjgl.lwjgl:lwjgl:2.9.1" + ], + "override": { + "rules": [ + { + "action": "allow" + }, + { + "action": "disallow", + "os": { + "name": "osx-arm64" + } + }, + { + "action": "disallow", + "os": { + "name": "linux-arm64" + } + }, + { + "action": "disallow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "697517568c68e78ae0b4544145af031c81082dfe", + "size": 1047168, + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl/2.9.4-nightly-20150209/lwjgl-2.9.4-nightly-20150209.jar" + } + }, + "name": "org.lwjgl.lwjgl:lwjgl:2.9.4-nightly-20150209", + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + }, + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + }, + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Use a newer version on osx-arm64, linux-arm64, and linux-arm32", + "match": [ + "org.lwjgl.lwjgl:lwjgl_util:2.9.3", + "org.lwjgl.lwjgl:lwjgl_util:2.9.1-nightly-20131120", + "org.lwjgl.lwjgl:lwjgl_util:2.9.1-nightly-20131017", + "org.lwjgl.lwjgl:lwjgl_util:2.9.1-nightly-20130708-debug3", + "org.lwjgl.lwjgl:lwjgl_util:2.9.1" + ], + "override": { + "rules": [ + { + "action": "allow" + }, + { + "action": "disallow", + "os": { + "name": "osx-arm64" + } + }, + { + "action": "disallow", + "os": { + "name": "linux-arm64" + } + }, + { + "action": "disallow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "d51a7c040a721d13efdfbd34f8b257b2df882ad0", + "size": 173887, + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl_util/2.9.4-nightly-20150209/lwjgl_util-2.9.4-nightly-20150209.jar" + } + }, + "name": "org.lwjgl.lwjgl:lwjgl_util:2.9.4-nightly-20150209", + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + }, + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + }, + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", + "match": [ + "org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209", + "org.lwjgl.lwjgl:lwjgl-platform:2.9.3", + "org.lwjgl.lwjgl:lwjgl-platform:2.9.1-nightly-20131120", + "org.lwjgl.lwjgl:lwjgl-platform:2.9.1-nightly-20131017", + "org.lwjgl.lwjgl:lwjgl-platform:2.9.1-nightly-20130708-debug3", + "org.lwjgl.lwjgl:lwjgl-platform:2.9.1" + ], + "override": { + "downloads": { + "classifiers": { + "natives-osx-arm64": { + "sha1": "eff546c0b319d6ffc7a835652124c18089c67f36", + "size": 488316, + "url": "https://github.com/MinecraftMachina/lwjgl/releases/download/2.9.4-20150209-mmachina.2/lwjgl-platform-2.9.4-nightly-20150209-natives-osx.jar" + }, + "natives-linux-arm64": { + "sha1": "63ac7da0f4a4785c7eadc0f8edc1e9dcc4dd08cb", + "size": 579979, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-2.9.4/lwjgl-platform-2.9.4-nightly-20150209-natives-linux.jar" + }, + "natives-linux-arm32": { + "sha1": "fa483e540a9a753a5ffbb23dcf7879a5bf752611", + "size": 475177, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-2.9.4/lwjgl-platform-2.9.4-nightly-20150209-natives-linux.jar" + } + } + }, + "natives": { + "linux-arm64": "natives-linux-arm64", + "linux-arm32": "natives-linux-arm32", + "osx-arm64": "natives-osx-arm64" + } + } + }, + { + "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", + "match": [ + "org.lwjgl:lwjgl-glfw:3.2.2", + "org.lwjgl:lwjgl-glfw:3.2.1", + "org.lwjgl:lwjgl-glfw:3.1.6", + "org.lwjgl:lwjgl-glfw:3.1.2" + ], + "override": { + "rules": [ + { + "action": "allow" + }, + { + "action": "disallow", + "os": { + "name": "linux-arm64" + } + }, + { + "action": "disallow", + "os": { + "name": "linux-arm32" + } + }, + { + "action": "disallow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "155d175037efc76630940c197ca6dea2b17d7e18", + "size": 108691, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-glfw.jar" + } + }, + "name": "org.lwjgl:lwjgl-glfw:3.2.2-gman64.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "155d175037efc76630940c197ca6dea2b17d7e18", + "size": 108691, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-glfw.jar" + }, + "classifiers": { + "natives-linux-arm64": { + "sha1": "074ad243761147df0d060fbefc814614d2ff75cc", + "size": 85072, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-glfw-natives-linux-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-glfw:3.2.2-gman64.1", + "natives": { + "linux-arm64": "natives-linux-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "99e9a39fa8ed4167e3ff9e04d47eb32c9e69804d", + "size": 108691, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-glfw.jar" + } + }, + "name": "org.lwjgl:lwjgl-glfw:3.2.2-gman32.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "99e9a39fa8ed4167e3ff9e04d47eb32c9e69804d", + "size": 108691, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-glfw.jar" + }, + "classifiers": { + "natives-linux-arm32": { + "sha1": "4265f2fbe3b9d642591165165a17cf406cf7b98e", + "size": 80186, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-glfw-natives-linux-arm32.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-glfw:3.2.2-gman32.1", + "natives": { + "linux-arm32": "natives-linux-arm32" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "e9a101bca4fa30d26b21b526ff28e7c2d8927f1b", + "size": 130128, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-glfw.jar" + } + }, + "name": "org.lwjgl:lwjgl-glfw:3.3.1-mmachina.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "e9a101bca4fa30d26b21b526ff28e7c2d8927f1b", + "size": 130128, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-glfw.jar" + }, + "classifiers": { + "natives-osx-arm64": { + "sha1": "71d793d0a5a42e3dfe78eb882abc2523a2c6b496", + "size": 129076, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-glfw-natives-macos-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-glfw:3.3.1-mmachina.1", + "natives": { + "osx-arm64": "natives-osx-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", + "match": [ + "org.lwjgl:lwjgl-jemalloc:3.2.2", + "org.lwjgl:lwjgl-jemalloc:3.2.1", + "org.lwjgl:lwjgl-jemalloc:3.1.6", + "org.lwjgl:lwjgl-jemalloc:3.1.2" + ], + "override": { + "rules": [ + { + "action": "allow" + }, + { + "action": "disallow", + "os": { + "name": "linux-arm64" + } + }, + { + "action": "disallow", + "os": { + "name": "linux-arm32" + } + }, + { + "action": "disallow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "cc04eec29b2fa8c298791af9800a3766d9617954", + "size": 33790, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-jemalloc.jar" + } + }, + "name": "org.lwjgl:lwjgl-jemalloc:3.2.2-gman64.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "cc04eec29b2fa8c298791af9800a3766d9617954", + "size": 33790, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-jemalloc.jar" + }, + "classifiers": { + "natives-linux-arm64": { + "sha1": "762d7d80c9cdf3a3f3fc80c8a5f86612255edfe0", + "size": 156343, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-jemalloc-patched-natives-linux-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-jemalloc:3.2.2-gman64.2", + "natives": { + "linux-arm64": "natives-linux-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "8224ae2e8fc6d8e1a0fc7d84dc917aa3c440620c", + "size": 33790, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-jemalloc.jar" + } + }, + "name": "org.lwjgl:lwjgl-jemalloc:3.2.2-gman32.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "8224ae2e8fc6d8e1a0fc7d84dc917aa3c440620c", + "size": 33790, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-jemalloc.jar" + }, + "classifiers": { + "natives-linux-arm32": { + "sha1": "9163a2a5559ef87bc13ead8fea84417ea3928748", + "size": 134237, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-jemalloc-natives-linux-arm32.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-jemalloc:3.2.2-gman32.1", + "natives": { + "linux-arm32": "natives-linux-arm32" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "4fb94224378d3588d52d2beb172f2eeafea2d546", + "size": 36976, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-jemalloc.jar" + } + }, + "name": "org.lwjgl:lwjgl-jemalloc:3.3.1-mmachina.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "4fb94224378d3588d52d2beb172f2eeafea2d546", + "size": 36976, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-jemalloc.jar" + }, + "classifiers": { + "natives-osx-arm64": { + "sha1": "b0be721188d2e7195798780b1c5fe7eafe8091c1", + "size": 103478, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-jemalloc-natives-macos-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-jemalloc:3.3.1-mmachina.1", + "natives": { + "osx-arm64": "natives-osx-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", + "match": [ + "org.lwjgl:lwjgl-openal:3.2.2", + "org.lwjgl:lwjgl-openal:3.2.1", + "org.lwjgl:lwjgl-openal:3.1.6", + "org.lwjgl:lwjgl-openal:3.1.2" + ], + "override": { + "rules": [ + { + "action": "allow" + }, + { + "action": "disallow", + "os": { + "name": "linux-arm64" + } + }, + { + "action": "disallow", + "os": { + "name": "linux-arm32" + } + }, + { + "action": "disallow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "6dfce9dc6a9629c75b2ae01a8df7e7be80ba0261", + "size": 79582, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-openal.jar" + } + }, + "name": "org.lwjgl:lwjgl-openal:3.2.2-gman64.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "6dfce9dc6a9629c75b2ae01a8df7e7be80ba0261", + "size": 79582, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-openal.jar" + }, + "classifiers": { + "natives-linux-arm64": { + "sha1": "948e415b5b2a2c650c25b377a4a9f443b21ce92e", + "size": 469432, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-openal-natives-linux-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-openal:3.2.2-gman64.1", + "natives": { + "linux-arm64": "natives-linux-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "304f0571fd5971621ee6da86a4c1e90f6f52e2ee", + "size": 79582, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-openal.jar" + } + }, + "name": "org.lwjgl:lwjgl-openal:3.2.2-gman32.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "304f0571fd5971621ee6da86a4c1e90f6f52e2ee", + "size": 79582, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-openal.jar" + }, + "classifiers": { + "natives-linux-arm32": { + "sha1": "ecbc981fdd996492a1f6334f003ed62e5a8c0cd5", + "size": 398418, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-openal-natives-linux-arm32.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-openal:3.2.2-gman32.1", + "natives": { + "linux-arm32": "natives-linux-arm32" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "d48e753d85916fc8a200ccddc709b36e3865cc4e", + "size": 88880, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-openal.jar" + } + }, + "name": "org.lwjgl:lwjgl-openal:3.3.1-mmachina.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "d48e753d85916fc8a200ccddc709b36e3865cc4e", + "size": 88880, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-openal.jar" + }, + "classifiers": { + "natives-osx-arm64": { + "sha1": "6b80fc0b982a0723b141e88859c42d6f71bd723f", + "size": 346131, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-openal-natives-macos-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-openal:3.3.1-mmachina.1", + "natives": { + "osx-arm64": "natives-osx-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", + "match": [ + "org.lwjgl:lwjgl-opengl:3.2.2", + "org.lwjgl:lwjgl-opengl:3.2.1", + "org.lwjgl:lwjgl-opengl:3.1.6", + "org.lwjgl:lwjgl-opengl:3.1.2" + ], + "override": { + "rules": [ + { + "action": "allow" + }, + { + "action": "disallow", + "os": { + "name": "linux-arm64" + } + }, + { + "action": "disallow", + "os": { + "name": "linux-arm32" + } + }, + { + "action": "disallow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "198bc2f72e0b2eb401eb6f5999aea52909b31ac4", + "size": 937609, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-opengl.jar" + } + }, + "name": "org.lwjgl:lwjgl-opengl:3.2.2-gman64.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "198bc2f72e0b2eb401eb6f5999aea52909b31ac4", + "size": 937609, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-opengl.jar" + }, + "classifiers": { + "natives-linux-arm64": { + "sha1": "bd40897077bf7d12f562da898b18ac2c68e1f9d7", + "size": 56109, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-opengl-natives-linux-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-opengl:3.2.2-gman64.1", + "natives": { + "linux-arm64": "natives-linux-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "9762ae928d02147e716cd82e929b74a97ea9600a", + "size": 937609, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-opengl.jar" + } + }, + "name": "org.lwjgl:lwjgl-opengl:3.2.2-gman32.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "9762ae928d02147e716cd82e929b74a97ea9600a", + "size": 937609, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-opengl.jar" + }, + "classifiers": { + "natives-linux-arm32": { + "sha1": "3af5599c74dd76dd8dbb567b3f9b4963a6abeed5", + "size": 56388, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-opengl-natives-linux-arm32.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-opengl:3.2.2-gman32.1", + "natives": { + "linux-arm32": "natives-linux-arm32" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "962c2a8d2a8cdd3b89de3d78d766ab5e2133c2f4", + "size": 929233, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-opengl.jar" + } + }, + "name": "org.lwjgl:lwjgl-opengl:3.3.1-mmachina.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "962c2a8d2a8cdd3b89de3d78d766ab5e2133c2f4", + "size": 929233, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-opengl.jar" + }, + "classifiers": { + "natives-osx-arm64": { + "sha1": "bb575058e0372f515587b5d2d04ff7db185f3ffe", + "size": 41667, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-opengl-natives-macos-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-opengl:3.3.1-mmachina.1", + "natives": { + "osx-arm64": "natives-osx-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", + "match": [ + "org.lwjgl:lwjgl-stb:3.2.2", + "org.lwjgl:lwjgl-stb:3.2.1", + "org.lwjgl:lwjgl-stb:3.1.6", + "org.lwjgl:lwjgl-stb:3.1.2" + ], + "override": { + "rules": [ + { + "action": "allow" + }, + { + "action": "disallow", + "os": { + "name": "linux-arm64" + } + }, + { + "action": "disallow", + "os": { + "name": "linux-arm32" + } + }, + { + "action": "disallow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "46a5735f3eb9d17eb5dcbdd5afa194066d2a6555", + "size": 104075, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-stb.jar" + } + }, + "name": "org.lwjgl:lwjgl-stb:3.2.2-gman64.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "46a5735f3eb9d17eb5dcbdd5afa194066d2a6555", + "size": 104075, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-stb.jar" + }, + "classifiers": { + "natives-linux-arm64": { + "sha1": "077efa7d7ea41b32df5c6078e912e724cccd06db", + "size": 202038, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-stb-natives-linux-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-stb:3.2.2-gman64.1", + "natives": { + "linux-arm64": "natives-linux-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "ea979b0af45b8e689f5f47c989aa8550c148d8a2", + "size": 104075, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-stb.jar" + } + }, + "name": "org.lwjgl:lwjgl-stb:3.2.2-gman32.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "ea979b0af45b8e689f5f47c989aa8550c148d8a2", + "size": 104075, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-stb.jar" + }, + "classifiers": { + "natives-linux-arm32": { + "sha1": "ec9d70aaebd0ff76dfeecf8f00b56118bf3706b1", + "size": 149387, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-stb-natives-linux-arm32.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-stb:3.2.2-gman32.1", + "natives": { + "linux-arm32": "natives-linux-arm32" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "703e4b533e2542560e9f94d6d8bd148be1c1d572", + "size": 113273, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-stb.jar" + } + }, + "name": "org.lwjgl:lwjgl-stb:3.3.1-mmachina.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "703e4b533e2542560e9f94d6d8bd148be1c1d572", + "size": 113273, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-stb.jar" + }, + "classifiers": { + "natives-osx-arm64": { + "sha1": "98f0ad956c754723ef354d50057cc30417ef376a", + "size": 178409, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-stb-natives-macos-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-stb:3.3.1-mmachina.1", + "natives": { + "osx-arm64": "natives-osx-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", + "match": [ + "org.lwjgl:lwjgl-tinyfd:3.2.2", + "org.lwjgl:lwjgl-tinyfd:3.2.1", + "org.lwjgl:lwjgl-tinyfd:3.1.6", + "org.lwjgl:lwjgl-tinyfd:3.1.2" + ], + "override": { + "rules": [ + { + "action": "allow" + }, + { + "action": "disallow", + "os": { + "name": "linux-arm64" + } + }, + { + "action": "disallow", + "os": { + "name": "linux-arm32" + } + }, + { + "action": "disallow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "3a75b9811607633bf33c978f53964df1534a4bc1", + "size": 5571, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-tinyfd.jar" + } + }, + "name": "org.lwjgl:lwjgl-tinyfd:3.2.2-gman64.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "3a75b9811607633bf33c978f53964df1534a4bc1", + "size": 5571, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-tinyfd.jar" + }, + "classifiers": { + "natives-linux-arm64": { + "sha1": "37c744ca289b5d7ae155d79e39029488b3254e5b", + "size": 37893, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-tinyfd-natives-linux-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-tinyfd:3.2.2-gman64.1", + "natives": { + "linux-arm64": "natives-linux-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "a8c09f5b7fa24bd53ec329c231b566497a163d5b", + "size": 5571, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-tinyfd.jar" + } + }, + "name": "org.lwjgl:lwjgl-tinyfd:3.2.2-gman32.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "a8c09f5b7fa24bd53ec329c231b566497a163d5b", + "size": 5571, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-tinyfd.jar" + }, + "classifiers": { + "natives-linux-arm32": { + "sha1": "82d16054ada6633297a3108fb6d8bae98800c76f", + "size": 41663, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-tinyfd-natives-linux-arm32.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-tinyfd:3.2.2-gman32.1", + "natives": { + "linux-arm32": "natives-linux-arm32" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "1203660b3131cbb8681b17ce6437412545be95e0", + "size": 6802, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-tinyfd.jar" + } + }, + "name": "org.lwjgl:lwjgl-tinyfd:3.3.1-mmachina.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "1203660b3131cbb8681b17ce6437412545be95e0", + "size": 6802, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-tinyfd.jar" + }, + "classifiers": { + "natives-osx-arm64": { + "sha1": "015b931a2daba8f0c317d84c9d14e8e98ae56e0c", + "size": 41384, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-tinyfd-natives-macos-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-tinyfd:3.3.1-mmachina.1", + "natives": { + "osx-arm64": "natives-osx-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", + "match": [ + "org.lwjgl:lwjgl:3.2.2", + "org.lwjgl:lwjgl:3.2.1", + "org.lwjgl:lwjgl:3.1.6", + "org.lwjgl:lwjgl:3.1.2" + ], + "override": { + "rules": [ + { + "action": "allow" + }, + { + "action": "disallow", + "os": { + "name": "linux-arm64" + } + }, + { + "action": "disallow", + "os": { + "name": "linux-arm32" + } + }, + { + "action": "disallow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "360899386df83d6a8407844a94478607af937f97", + "size": 318833, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-core.jar" + } + }, + "name": "org.lwjgl:lwjgl:3.2.2-gman64.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "360899386df83d6a8407844a94478607af937f97", + "size": 318833, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-core.jar" + }, + "classifiers": { + "natives-linux-arm64": { + "sha1": "612efd57d12b2e48e554858eb35e7e2eb46ebb4c", + "size": 87121, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-natives-linux-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl:3.2.2-gman64.1", + "natives": { + "linux-arm64": "natives-linux-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "16ea3934fca417368250d1ddac01a30c1809d317", + "size": 318413, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-core.jar" + } + }, + "name": "org.lwjgl:lwjgl:3.2.2-gman32.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "16ea3934fca417368250d1ddac01a30c1809d317", + "size": 318413, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-core.jar" + }, + "classifiers": { + "natives-linux-arm32": { + "sha1": "6bd0b37fef777a309936a72dc7f63126e8c79ea5", + "size": 90296, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-natives-linux-arm32.jar" + } + } + }, + "name": "org.lwjgl:lwjgl:3.2.2-gman32.1", + "natives": { + "linux-arm32": "natives-linux-arm32" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "8e664dd69ad7bbcf2053da23efc7848e39e498db", + "size": 719038, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl.jar" + } + }, + "name": "org.lwjgl:lwjgl:3.3.1-mmachina.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "8e664dd69ad7bbcf2053da23efc7848e39e498db", + "size": 719038, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl.jar" + }, + "classifiers": { + "natives-osx-arm64": { + "sha1": "984df31fadaab86838877b112e5b4e4f68a00ccf", + "size": 42693, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-natives-macos-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl:3.3.1-mmachina.1", + "natives": { + "osx-arm64": "natives-osx-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Only allow osx-arm64 for existing LWJGL 3.3.1", + "match": [ + "org.lwjgl:lwjgl-glfw-natives-macos-arm64:3.3.1", + "org.lwjgl:lwjgl-jemalloc-natives-macos-arm64:3.3.1", + "org.lwjgl:lwjgl-openal-natives-macos-arm64:3.3.1", + "org.lwjgl:lwjgl-opengl-natives-macos-arm64:3.3.1", + "org.lwjgl:lwjgl-stb-natives-macos-arm64:3.3.1", + "org.lwjgl:lwjgl-tinyfd-natives-macos-arm64:3.3.1", + "org.lwjgl:lwjgl-natives-macos-arm64:3.3.1" + ], + "override": { + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + }, + { + "_comment": "Only allow osx-arm64 for existing java-objc-bridge:1.1", + "match": [ + "ca.weblite:java-objc-bridge:1.1" + ], + "override": { + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + }, + { + "_comment": "Only allow windows-arm64 for existing LWJGL 3.3.1", + "match": [ + "org.lwjgl:lwjgl-glfw-natives-windows-arm64:3.3.1", + "org.lwjgl:lwjgl-jemalloc-natives-windows-arm64:3.3.1", + "org.lwjgl:lwjgl-openal-natives-windows-arm64:3.3.1", + "org.lwjgl:lwjgl-opengl-natives-windows-arm64:3.3.1", + "org.lwjgl:lwjgl-stb-natives-windows-arm64:3.3.1", + "org.lwjgl:lwjgl-tinyfd-natives-windows-arm64:3.3.1", + "org.lwjgl:lwjgl-natives-windows-arm64:3.3.1" + ], + "override": { + "rules": [ + { + "action": "allow", + "os": { + "name": "windows-arm64" + } + } + ] + } + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.1", + "match": [ + "org.lwjgl:lwjgl-glfw:3.3.1" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "513eb39b866d0fe131a18d5c517087805433b029", + "size": 112350, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm64:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.1", + "match": [ + "org.lwjgl:lwjgl-jemalloc:3.3.1" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "749be48a9b86ee2c3a2da5fd77511208adcfb33b", + "size": 159993, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.3.1/lwjgl-jemalloc-patched-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm64:3.3.1-gman64.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.1", + "match": [ + "org.lwjgl:lwjgl-openal:3.3.1" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "cf4e303257e82981b8b2e31bba3d7f8f7b8f42b2", + "size": 470743, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-openal-natives-linux-arm64:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.1", + "match": [ + "org.lwjgl:lwjgl-opengl:3.3.1" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "1c528fb258a6e63e8fceb4482d8db0f3af10a634", + "size": 57908, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm64:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.1", + "match": [ + "org.lwjgl:lwjgl-stb:3.3.1" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "8e8348a1813aad7f30aaf75ea197151ebb7beba9", + "size": 205491, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-stb-natives-linux-arm64:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.1", + "match": [ + "org.lwjgl:lwjgl-tinyfd:3.3.1" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "964f628b7a82fd909def086c0dd9a4b84bb259ae", + "size": 42654, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm64:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.1", + "match": [ + "org.lwjgl:lwjgl:3.3.1" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "b597401014acb7196c76d97e15a6288f54f1f692", + "size": 86308, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl/lwjgl-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-natives-linux-arm64:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.1", + "match": [ + "org.lwjgl:lwjgl-glfw:3.3.1" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "816d935933f2dd743074c4e717cc25b55720f294", + "size": 104027, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm32:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.1", + "match": [ + "org.lwjgl:lwjgl-jemalloc:3.3.1" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "a96a6d6cb3876d7813fcee53c3c24f246aeba3b3", + "size": 136157, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-jemalloc/lwjgl-jemalloc-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm32:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.1", + "match": [ + "org.lwjgl:lwjgl-openal:3.3.1" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "ffbe35d7fa5ec9b7eca136a7c71f24d4025a510b", + "size": 400129, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-openal-natives-linux-arm32:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.1", + "match": [ + "org.lwjgl:lwjgl-opengl:3.3.1" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "e3550fa91097fd56e361b4370fa822220fef3595", + "size": 58474, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm32:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.1", + "match": [ + "org.lwjgl:lwjgl-stb:3.3.1" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "b08226bab162c06ae69337d8a1b0ee0a3fdf0b90", + "size": 153889, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-stb-natives-linux-arm32:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.1", + "match": [ + "org.lwjgl:lwjgl-tinyfd:3.3.1" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "d53d331e859217a61298fcbcf8d79137f3df345c", + "size": 48061, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm32:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.1", + "match": [ + "org.lwjgl:lwjgl:3.3.1" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "41a3c1dd15d6b964eb8196dde69720a3e3e5e969", + "size": 82374, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl/lwjgl-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-natives-linux-arm32:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.2", + "match": [ + "org.lwjgl:lwjgl-freetype:3.3.2" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "896e7d9b8f60d7273f3d491c69270afc67ece3ce", + "size": 1073374, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-freetype/lwjgl-freetype-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-freetype-natives-linux-arm64:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.2", + "match": [ + "org.lwjgl:lwjgl-glfw:3.3.2" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "bc49e64bae0f7ff103a312ee8074a34c4eb034c7", + "size": 120168, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm64:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.2", + "match": [ + "org.lwjgl:lwjgl-jemalloc:3.3.2" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "5249f18a9ae20ea86c5816bc3107a888ce7a17d2", + "size": 206402, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-jemalloc/lwjgl-jemalloc-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm64:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.2", + "match": [ + "org.lwjgl:lwjgl-openal:3.3.2" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "22408980cc579709feaf9acb807992d3ebcf693f", + "size": 590865, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-openal-natives-linux-arm64:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.2", + "match": [ + "org.lwjgl:lwjgl-opengl:3.3.2" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "bb9eb56da6d1d549d6a767218e675e36bc568eb9", + "size": 58627, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm64:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.2", + "match": [ + "org.lwjgl:lwjgl-stb:3.3.2" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "11a380c37b0f03cb46db235e064528f84d736ff7", + "size": 207419, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-stb-natives-linux-arm64:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.2", + "match": [ + "org.lwjgl:lwjgl-tinyfd:3.3.2" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "93f8c5bc1984963cd79109891fb5a9d1e580373e", + "size": 43381, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm64:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.2", + "match": [ + "org.lwjgl:lwjgl:3.3.2" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "8bd89332c90a90e6bc4aa997a25c05b7db02c90a", + "size": 90795, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl/lwjgl-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-natives-linux-arm64:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.2", + "match": [ + "org.lwjgl:lwjgl-freetype:3.3.2" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "b7f77ceb951182659fd400437272aa7e96709968", + "size": 924657, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-freetype/lwjgl-freetype-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-freetype-natives-linux-arm32:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.2", + "match": [ + "org.lwjgl:lwjgl-glfw:3.3.2" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "5907d9a6b7c44fb0612a63bb1cff5992588f65be", + "size": 110067, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm32:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.2", + "match": [ + "org.lwjgl:lwjgl-jemalloc:3.3.2" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "9367437ce192e4d6f5725d53d85520644c0b0d6f", + "size": 177571, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-jemalloc/lwjgl-jemalloc-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm32:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.2", + "match": [ + "org.lwjgl:lwjgl-openal:3.3.2" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "7c82bbc33ef49ee4094b216c940db564b2998224", + "size": 503352, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-openal-natives-linux-arm32:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.2", + "match": [ + "org.lwjgl:lwjgl-opengl:3.3.2" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "821f9a2d1d583c44893f42b96f6977682b48a99b", + "size": 59265, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm32:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.2", + "match": [ + "org.lwjgl:lwjgl-stb:3.3.2" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "ca9333da184aade20757151f4615f1e27ca521ae", + "size": 154928, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-stb-natives-linux-arm32:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.2", + "match": [ + "org.lwjgl:lwjgl-tinyfd:3.3.2" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "807e220913aa0740449ff90d3b3d825cf5f359ed", + "size": 48788, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm32:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.2", + "match": [ + "org.lwjgl:lwjgl:3.3.2" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "afcbfaaa46f217e98a6da4208550f71de1f2a225", + "size": 89347, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl/lwjgl-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-natives-linux-arm32:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.3", + "match": [ + "org.lwjgl:lwjgl-freetype:3.3.3" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "498965aac06c4a0d42df1fbef6bacd05bde7f974", + "size": 1093516, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-freetype/lwjgl-freetype-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-freetype-natives-linux-arm64:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.3", + "match": [ + "org.lwjgl:lwjgl-glfw:3.3.3" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "492a0f11f85b85899a6568f07511160c1b87cd38", + "size": 122159, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm64:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.3", + "match": [ + "org.lwjgl:lwjgl-jemalloc:3.3.3" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "eff8b86798191192fe2cba2dc2776109f30c239d", + "size": 209315, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-jemalloc/lwjgl-jemalloc-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm64:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.3", + "match": [ + "org.lwjgl:lwjgl-openal:3.3.3" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "ad8f302118a65bb8d615f8a2a680db58fb8f835e", + "size": 592963, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-openal-natives-linux-arm64:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.3", + "match": [ + "org.lwjgl:lwjgl-opengl:3.3.3" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "2096f6b94b2d68745d858fbfe53aacf5f0c8074c", + "size": 58625, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm64:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.3", + "match": [ + "org.lwjgl:lwjgl-stb:3.3.3" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "ddc177afc2be1ee8d93684b11363b80589a13fe1", + "size": 207418, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-stb-natives-linux-arm64:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.3", + "match": [ + "org.lwjgl:lwjgl-tinyfd:3.3.3" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "2823a8c955c758d0954d282888075019ef99cec7", + "size": 43864, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm64:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.3", + "match": [ + "org.lwjgl:lwjgl:3.3.3" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "f35d8b6ffe1ac1e3a5eb1d4e33de80f044ad5fd8", + "size": 91294, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl/lwjgl-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-natives-linux-arm64:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.3", + "match": [ + "org.lwjgl:lwjgl-freetype:3.3.3" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "7dd3b1f751571adaf2c4dc882bc675a5d1e796e6", + "size": 942636, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-freetype/lwjgl-freetype-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-freetype-natives-linux-arm32:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.3", + "match": [ + "org.lwjgl:lwjgl-glfw:3.3.3" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "d9af485c32545b37dd5359b163161d42d7534dcf", + "size": 112560, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm32:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.3", + "match": [ + "org.lwjgl:lwjgl-jemalloc:3.3.3" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "109b6931880d02d4e65ced38928a16e41d19873e", + "size": 178324, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-jemalloc/lwjgl-jemalloc-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm32:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.3", + "match": [ + "org.lwjgl:lwjgl-openal:3.3.3" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "e1702aa09d20359d6cf5cb2999fa7685a785eca7", + "size": 505618, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-openal-natives-linux-arm32:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.3", + "match": [ + "org.lwjgl:lwjgl-opengl:3.3.3" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "dbba17fc5ac0985d14a57c11f9537617d67b9952", + "size": 59263, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm32:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.3", + "match": [ + "org.lwjgl:lwjgl-stb:3.3.3" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "1ae28ff044699ff29b0e980ffabd73fba8a664b3", + "size": 154931, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-stb-natives-linux-arm32:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.3", + "match": [ + "org.lwjgl:lwjgl-tinyfd:3.3.3" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "c2a0a05c82c4b9f69ded0b6ad5f417addea78ce2", + "size": 49495, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm32:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.3", + "match": [ + "org.lwjgl:lwjgl:3.3.3" + ], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "2075c51a80f0ef0f22ba616ba54007ac2b0debd4", + "size": 89565, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl/lwjgl-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-natives-linux-arm32:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Replace glfw from 3.3.1 with version from 3.3.2 to prevent stack smashing", + "match": [ + "org.lwjgl:lwjgl-glfw-natives-linux:3.3.1" + ], + "override": { + "downloads": { + "artifact": { + "sha1": "0766bb0e8e829598b1c8052fd8173c62af741c52", + "size": 115553, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-glfw/lwjgl-glfw-natives-linux.jar" + } + }, + "name": "org.lwjgl:lwjgl-glfw-natives-linux:3.3.2-lwjgl.1" + } + } +] diff --git a/meta/common/mojang-minecraft-experiments.json b/meta/common/mojang-minecraft-experiments.json new file mode 100644 index 0000000000..94b50c1a60 --- /dev/null +++ b/meta/common/mojang-minecraft-experiments.json @@ -0,0 +1,104 @@ +{ + "experiments": [ + { + "id": "1_19_deep_dark_experimental_snapshot-1", + "wiki": "https://minecraft.wiki/w/Java_Edition_Deep_Dark_Experimental_Snapshot_1", + "url": "https://launcher.mojang.com/v1/objects/b1e589c1d6ed73519797214bc796e53f5429ac46/1_19_deep_dark_experimental_snapshot-1.zip" + }, + { + "id": "1_18_experimental-snapshot-7", + "wiki": "https://minecraft.wiki/w/Java_Edition_1.18_Experimental_Snapshot_7", + "url": "https://launcher.mojang.com/v1/objects/ab4ecebb133f56dd4c4c4c3257f030a947ddea84/1_18_experimental-snapshot-7.zip" + }, + { + "id": "1_18_experimental-snapshot-6", + "wiki": "https://minecraft.wiki/w/Java_Edition_1.18_Experimental_Snapshot_6", + "url": "https://launcher.mojang.com/v1/objects/4697c84c6a347d0b8766759d5b00bc5a00b1b858/1_18_experimental-snapshot-6.zip" + }, + { + "id": "1_18_experimental-snapshot-5", + "wiki": "https://minecraft.wiki/w/Java_Edition_1.18_Experimental_Snapshot_5", + "url": "https://launcher.mojang.com/v1/objects/d9cb7f6fb4e440862adfb40a385d83e3f8d154db/1_18_experimental-snapshot-5.zip" + }, + { + "id": "1_18_experimental-snapshot-4", + "wiki": "https://minecraft.wiki/w/Java_Edition_1.18_Experimental_Snapshot_4", + "url": "https://launcher.mojang.com/v1/objects/b92a360cbae2eb896a62964ad8c06c3493b6c390/1_18_experimental-snapshot-4.zip" + }, + { + "id": "1_18_experimental-snapshot-3", + "wiki": "https://minecraft.wiki/w/Java_Edition_1.18_Experimental_Snapshot_3", + "url": "https://launcher.mojang.com/v1/objects/846648ff9fe60310d584061261de43010e5c722b/1_18_experimental-snapshot-3.zip" + }, + { + "id": "1_18_experimental-snapshot-2", + "wiki": "https://minecraft.wiki/w/Java_Edition_1.18_Experimental_Snapshot_2", + "url": "https://launcher.mojang.com/v1/objects/0adfe4f321aa45248fc88ac888bed5556633e7fb/1_18_experimental-snapshot-2.zip" + }, + { + "id": "1_18_experimental-snapshot-1", + "wiki": "https://minecraft.wiki/w/Java_Edition_1.18_Experimental_Snapshot_1", + "url": "https://launcher.mojang.com/v1/objects/231bba2a21e18b8c60976e1f6110c053b7b93226/1_18_experimental-snapshot-1.zip" + }, + { + "id": "1_16_combat-6", + "wiki": "https://minecraft.wiki/w/Java_Edition_Combat_Test_8c", + "url": "https://launcher.mojang.com/experiments/combat/ea08f7eb1f96cdc82464e27c0f95d23965083cfb/1_16_combat-6.zip" + }, + { + "id": "1_16_combat-5", + "wiki": "https://minecraft.wiki/w/Java_Edition_Combat_Test_8b", + "url": "https://launcher.mojang.com/experiments/combat/9b2b984d635d373564b50803807225c75d7fd447/1_16_combat-5.zip" + }, + { + "id": "1_16_combat-4", + "wiki": "https://minecraft.wiki/w/Java_Edition_Combat_Test_8", + "url": "https://cdn.discordapp.com/attachments/369990015096455168/947864881028272198/1_16_combat-4.zip" + }, + { + "id": "1_16_combat-3", + "wiki": "https://minecraft.wiki/w/Java_Edition_Combat_Test_7c", + "url": "https://launcher.mojang.com/experiments/combat/2557b99d95588505e988886220779087d7d6b1e9/1_16_combat-3.zip" + }, + { + "id": "1_16_combat-2", + "wiki": "https://minecraft.wiki/w/Java_Edition_Combat_Test_7b", + "url": "https://archive.org/download/Combat_Test_7ab/1_16_combat-2.zip" + }, + { + "id": "1_16_combat-1", + "wiki": "https://minecraft.wiki/w/Java_Edition_Combat_Test_7", + "url": "https://archive.org/download/Combat_Test_7ab/1_16_combat-1.zip" + }, + { + "id": "1_16_combat-0", + "wiki": "https://minecraft.wiki/w/Java_Edition_Combat_Test_6", + "url": "https://launcher.mojang.com/experiments/combat/5a8ceec8681ed96ab6ecb9607fb5d19c8a755559/1_16_combat-0.zip" + }, + { + "id": "1_15_combat-6", + "wiki": "https://minecraft.wiki/w/Java_Edition_Combat_Test_5", + "url": "https://launcher.mojang.com/experiments/combat/52263d42a626b40c947e523128f7a195ec5af76a/1_15_combat-6.zip" + }, + { + "id": "1_15_combat-1", + "wiki": "https://minecraft.wiki/w/Java_Edition_Combat_Test_4", + "url": "https://launcher.mojang.com/experiments/combat/ac11ea96f3bb2fa2b9b76ab1d20cacb1b1f7ef60/1_15_combat-1.zip" + }, + { + "id": "1_14_combat-3", + "wiki": "https://minecraft.wiki/w/Java_Edition_Combat_Test_3", + "url": "https://launcher.mojang.com/experiments/combat/0f209c9c84b81c7d4c88b4632155b9ae550beb89/1_14_combat-3.zip" + }, + { + "id": "1_14_combat-0", + "wiki": "https://minecraft.wiki/w/Java_Edition_Combat_Test_2", + "url": "https://launcher.mojang.com/experiments/combat/d164bb6ecc5fca9ac02878c85f11befae61ac1ca/1_14_combat-0.zip" + }, + { + "id": "1_14_combat-212796", + "wiki": "https://minecraft.wiki/w/Java_Edition_1.14.3_-_Combat_Test", + "url": "https://launcher.mojang.com/experiments/combat/610f5c9874ba8926d5ae1bcce647e5f0e6e7c889/1_14_combat-212796.zip" + } + ] +} \ No newline at end of file diff --git a/meta/common/mojang-minecraft-legacy-override.json b/meta/common/mojang-minecraft-legacy-override.json new file mode 100644 index 0000000000..d1d951d05f --- /dev/null +++ b/meta/common/mojang-minecraft-legacy-override.json @@ -0,0 +1,585 @@ +{ + "versions": { + "1.5.2": { + "releaseTime": "2013-04-25T17:45:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "1.5.1": { + "releaseTime": "2013-03-20T12:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "13w12~": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "1.5": { + "releaseTime": "2013-03-07T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "13w10b": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "13w10a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "13w09c": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "13w09b": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "13w09a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "13w11a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "13w07a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "13w06a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "13w05b": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "13w05a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "13w04a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "13w03a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "13w02b": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "13w02a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "13w01b": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "13w01a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "1.4.7": { + "releaseTime": "2012-12-28T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "1.4.6": { + "releaseTime": "2012-12-20T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w50b": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w50a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w49a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "1.4.5": { + "releaseTime": "2012-11-20T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "1.4.4": { + "releaseTime": "2012-11-14T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "1.4.3": { + "releaseTime": "2012-11-01T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "1.4.2": { + "releaseTime": "2012-10-25T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "1.4.1": { + "releaseTime": "2012-10-23T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "1.4": { + "releaseTime": "2012-10-19T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w42b": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w42a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w41b": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w41a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w40b": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w40a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w39b": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w39a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w38b": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w38a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w37a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w36a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w34b": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w34a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "1.3.2": { + "releaseTime": "2012-08-16T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w32a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "1.3.1": { + "releaseTime": "2012-08-01T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "1.3": { + "releaseTime": "2012-07-26T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w30e": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w30d": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w30c": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w30b": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w30a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w27a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w26a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w25a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w24a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w23b": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w23a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w22a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w21b": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w21a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w19a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w18a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w17a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w16a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "1.2.5": { + "releaseTime": "2012-03-30T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "1.2.4": { + "releaseTime": "2012-03-22T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "1.2.3": { + "releaseTime": "2012-03-02T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "1.2.2": { + "releaseTime": "2012-03-01T00:00:01+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "1.2.1": { + "releaseTime": "2012-03-01T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "1.2": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w08a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w07a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w07b": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w06a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w05b": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w05a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w04a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w03a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "1.1": { + "releaseTime": "2012-01-12T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "12w01a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "11w50a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "11w49a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "11w48a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "11w47a": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "1.0": { + "releaseTime": "2011-11-18T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.9-pre6": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.9-pre5": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.9-pre4": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.9-pre3": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.9-pre2": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.9-pre1": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.8.1": { + "releaseTime": "2011-09-19T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.8": { + "releaseTime": "2011-09-15T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.8-pre2": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.8-pre1-2": { + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.7.3": { + "releaseTime": "2011-07-08T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.7.2": { + "releaseTime": "2011-07-01T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.7": { + "releaseTime": "2011-06-30T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.6.6": { + "releaseTime": "2011-05-31T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.6.5": { + "releaseTime": "2011-05-28T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.6.4": { + "releaseTime": "2011-05-26T00:00:04+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.6.3": { + "releaseTime": "2011-05-26T00:00:03+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.6.2": { + "releaseTime": "2011-05-26T00:00:02+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.6.1": { + "releaseTime": "2011-05-26T00:00:01+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.6": { + "releaseTime": "2011-05-26T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.5_01": { + "releaseTime": "2011-04-20T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.5": { + "releaseTime": "2011-04-19T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.4_01": { + "releaseTime": "2011-04-05T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.4": { + "releaseTime": "2011-03-31T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.3_01": { + "releaseTime": "2011-02-23T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.3b": { + "releaseTime": "2011-02-22T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.2_02": { + "releaseTime": "2011-01-21T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.2_01": { + "releaseTime": "2011-01-14T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.2": { + "releaseTime": "2011-01-13T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.1_02": { + "releaseTime": "2010-12-22T00:00:01+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.1_01": { + "releaseTime": "2010-12-22T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.0.2": { + "releaseTime": "2010-12-21T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.0_01": { + "releaseTime": "2010-12-20T00:00:01+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "b1.0": { + "releaseTime": "2010-12-20T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "a1.2.6": { + "releaseTime": "2010-12-03T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "a1.2.5": { + "releaseTime": "2010-12-01T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "a1.2.4_01": { + "releaseTime": "2010-11-30T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "a1.2.3_04": { + "releaseTime": "2010-11-26T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "a1.2.3_02": { + "releaseTime": "2010-11-25T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "a1.2.3_01": { + "releaseTime": "2010-11-24T00:00:01+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "a1.2.3": { + "releaseTime": "2010-11-24T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "a1.2.2b": { + "releaseTime": "2010-11-10T00:00:01+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "a1.2.2a": { + "releaseTime": "2010-11-10T00:00:00+02:00", + "+traits": ["legacyLaunch", "texturepacks"] + }, + "a1.2.1_01": { + "releaseTime": "2010-11-05T00:00:01+02:00", + "+traits": ["legacyLaunch", "no-texturepacks"] + }, + "a1.2.1": { + "releaseTime": "2010-11-05T00:00:00+02:00", + "+traits": ["legacyLaunch", "no-texturepacks"] + }, + "a1.2.0_02": { + "releaseTime": "2010-11-04T00:00:00+02:00", + "+traits": ["legacyLaunch", "no-texturepacks"] + }, + "a1.2.0_01": { + "releaseTime": "2010-10-31T00:00:00+02:00", + "+traits": ["legacyLaunch", "no-texturepacks"] + }, + "a1.2.0": { + "releaseTime": "2010-10-30T00:00:00+02:00", + "+traits": ["legacyLaunch", "no-texturepacks"] + }, + "a1.1.2_01": { + "releaseTime": "2010-09-23T00:00:00+02:00", + "+traits": ["legacyLaunch", "no-texturepacks"], + "+jvmArgs": ["-Djava.util.Arrays.useLegacyMergeSort=true"] + }, + "a1.1.2": { + "releaseTime": "2010-09-20T00:00:00+02:00", + "+traits": ["legacyLaunch", "no-texturepacks"], + "+jvmArgs": ["-Djava.util.Arrays.useLegacyMergeSort=true"] + }, + "a1.1.0": { + "releaseTime": "2010-09-13T00:00:00+02:00", + "+traits": ["legacyLaunch", "no-texturepacks"], + "+jvmArgs": ["-Djava.util.Arrays.useLegacyMergeSort=true"] + }, + "a1.0.17_04": { + "releaseTime": "2010-08-23T00:00:00+02:00", + "+traits": ["legacyLaunch", "no-texturepacks"], + "+jvmArgs": ["-Djava.util.Arrays.useLegacyMergeSort=true"] + }, + "a1.0.17_02": { + "releaseTime": "2010-08-20T00:00:00+02:00", + "+traits": ["legacyLaunch", "no-texturepacks"], + "+jvmArgs": ["-Djava.util.Arrays.useLegacyMergeSort=true"] + }, + "a1.0.16": { + "releaseTime": "2010-08-12T00:00:00+02:00", + "+traits": ["legacyLaunch", "no-texturepacks"], + "+jvmArgs": ["-Djava.util.Arrays.useLegacyMergeSort=true"] + }, + "a1.0.15": { + "releaseTime": "2010-08-04T00:00:00+02:00", + "+traits": ["legacyLaunch", "no-texturepacks"], + "+jvmArgs": ["-Djava.util.Arrays.useLegacyMergeSort=true"] + }, + "a1.0.14": { + "releaseTime": "2010-07-30T00:00:00+02:00", + "+traits": ["legacyLaunch", "no-texturepacks"], + "+jvmArgs": ["-Djava.util.Arrays.useLegacyMergeSort=true"] + }, + "a1.0.11": { + "releaseTime": "2010-07-23T00:00:00+02:00", + "+traits": ["legacyLaunch", "no-texturepacks"], + "+jvmArgs": ["-Djava.util.Arrays.useLegacyMergeSort=true"] + }, + "a1.0.5_01": { + "releaseTime": "2010-07-13T00:00:00+02:00", + "mainClass": "y", + "+traits": ["legacyLaunch", "no-texturepacks"], + "+jvmArgs": ["-Djava.util.Arrays.useLegacyMergeSort=true"] + }, + "a1.0.4": { + "releaseTime": "2010-07-09T00:00:00+02:00", + "mainClass": "ax", + "+traits": ["legacyLaunch", "no-texturepacks"], + "+jvmArgs": ["-Djava.util.Arrays.useLegacyMergeSort=true"] + }, + "inf-20100618": { + "releaseTime": "2010-06-16T00:00:00+02:00", + "mainClass": "net.minecraft.client.d", + "appletClass": "net.minecraft.client.MinecraftApplet", + "+traits": ["legacyLaunch", "no-texturepacks"], + "+jvmArgs": ["-Djava.util.Arrays.useLegacyMergeSort=true"] + }, + "c0.30_01c": { + "releaseTime": "2009-12-22T00:00:00+02:00", + "mainClass": "com.mojang.minecraft.l", + "appletClass": "com.mojang.minecraft.MinecraftApplet", + "+traits": ["legacyLaunch", "no-texturepacks"] + }, + "c0.0.13a_03": { + "releaseTime": "2009-05-22T00:00:00+02:00", + "mainClass": "com.mojang.minecraft.c", + "appletClass": "com.mojang.minecraft.MinecraftApplet", + "+traits": ["legacyLaunch", "no-texturepacks"] + }, + "c0.0.13a": { + "releaseTime": "2009-05-31T00:00:00+02:00", + "mainClass": "com.mojang.minecraft.Minecraft", + "appletClass": "com.mojang.minecraft.MinecraftApplet", + "+traits": ["legacyLaunch", "no-texturepacks"] + }, + "c0.0.11a": { + "releaseTime": "2009-05-17T00:00:00+02:00", + "mainClass": "com.mojang.minecraft.Minecraft", + "appletClass": "com.mojang.minecraft.MinecraftApplet", + "+traits": ["legacyLaunch", "no-texturepacks"] + }, + "rd-161348": { + "releaseTime": "2009-05-16T13:48:00+02:00", + "mainClass": "com.mojang.minecraft.RubyDung", + "+traits": ["no-texturepacks"] + }, + "rd-160052": { + "releaseTime": "2009-05-16T00:52:00+02:00", + "mainClass": "com.mojang.rubydung.RubyDung", + "+traits": ["no-texturepacks"] + }, + "rd-20090515": { + "mainClass": "com.mojang.rubydung.RubyDung", + "+traits": ["no-texturepacks"] + }, + "rd-132328": { + "releaseTime": "2009-05-13T23:28:00+02:00", + "mainClass": "com.mojang.rubydung.RubyDung", + "+traits": ["no-texturepacks"] + }, + "rd-132211": { + "releaseTime": "2009-05-13T22:11:00+02:00", + "mainClass": "com.mojang.rubydung.RubyDung", + "+traits": ["no-texturepacks"] + } + } +} diff --git a/meta/common/mojang-minecraft-legacy-services.json b/meta/common/mojang-minecraft-legacy-services.json new file mode 100644 index 0000000000..420d3f8c74 --- /dev/null +++ b/meta/common/mojang-minecraft-legacy-services.json @@ -0,0 +1,218 @@ +[ + "c0.30_01c", + "inf-20100618", + "a1.0.4", + "a1.0.5_01", + "a1.0.11", + "a1.0.14", + "a1.0.15", + "a1.0.16", + "a1.0.17_02", + "a1.0.17_04", + "a1.1.0", + "a1.1.2", + "a1.1.2_01", + "a1.2.0", + "a1.2.0_01", + "a1.2.0_02", + "a1.2.1", + "a1.2.1_01", + "a1.2.2a", + "a1.2.2b", + "a1.2.3", + "a1.2.3_01", + "a1.2.3_02", + "a1.2.3_04", + "a1.2.4_01", + "a1.2.5", + "a1.2.6", + "b1.0", + "b1.0_01", + "b1.0.2", + "b1.1_01", + "b1.1_02", + "b1.2", + "b1.2_01", + "b1.2_02", + "b1.3b", + "b1.3_01", + "b1.4", + "b1.4_01", + "b1.5", + "b1.5_01", + "b1.6", + "b1.6.1", + "b1.6.2", + "b1.6.3", + "b1.6.4", + "b1.6.5", + "b1.6.6", + "b1.7", + "b1.7.2", + "b1.7.3", + "b1.8-pre1-2", + "b1.8-pre2", + "b1.8", + "b1.8.1", + "b1.9-pre1", + "b1.9-pre2", + "b1.9-pre3", + "b1.9-pre4", + "b1.9-pre5", + "b1.9-pre6", + "1.0", + "11w47a", + "11w48a", + "11w49a", + "11w50a", + "12w01a", + "1.1", + "12w03a", + "12w04a", + "12w05a", + "12w05b", + "12w06a", + "12w07b", + "12w07a", + "12w08a", + "1.2", + "1.2.1", + "1.2.2", + "1.2.3", + "1.2.4", + "1.2.5", + "12w16a", + "12w17a", + "12w18a", + "12w19a", + "12w21a", + "12w21b", + "12w22a", + "12w23a", + "12w23b", + "12w24a", + "12w25a", + "12w26a", + "12w27a", + "12w30a", + "12w30b", + "12w30c", + "12w30d", + "12w30e", + "1.3", + "1.3.1", + "12w32a", + "1.3.2", + "12w34a", + "12w34b", + "12w36a", + "12w37a", + "12w38a", + "12w38b", + "12w39a", + "12w39b", + "12w40a", + "12w40b", + "12w41a", + "12w41b", + "12w42a", + "12w42b", + "1.4", + "1.4.1", + "1.4.2", + "1.4.3", + "1.4.4", + "1.4.5", + "12w49a", + "12w50a", + "12w50b", + "1.4.6", + "1.4.7", + "13w01a", + "13w01b", + "13w02a", + "13w02b", + "13w03a", + "13w04a", + "13w05a", + "13w05b", + "13w06a", + "13w07a", + "13w11a", + "13w09a", + "13w09b", + "13w09c", + "13w10a", + "13w10b", + "1.5", + "13w12~", + "1.5.1", + "1.5.2", + "13w17a", + "13w18a", + "13w18b", + "13w18c", + "13w19a", + "13w21a", + "13w21b", + "13w22a", + "13w23a", + "13w23b", + "13w24a", + "13w24b", + "13w25a", + "13w25b", + "13w25c", + "13w26a", + "1.6", + "1.6.1", + "1.6.2", + "13w36a", + "13w36b", + "13w37a", + "1.6.3", + "13w37b", + "1.6.4", + "13w38a", + "13w38b", + "13w38c", + "13w39a", + "13w39b", + "13w41a", + "13w41b", + "13w42a", + "13w42b", + "13w43a", + "1.7", + "1.7.1", + "1.7.2", + "13w47a", + "13w47b", + "13w47c", + "13w47d", + "13w47e", + "13w48a", + "13w48b", + "13w49a", + "1.7.3", + "1.7.4", + "14w02a", + "14w02b", + "14w02c", + "14w03a", + "14w03b", + "14w04a", + "14w04b", + "14w05a", + "14w05b", + "14w06a", + "14w06b", + "14w07a", + "1.7.5", + "14w08a", + "14w10b", + "14w10c", + "1.7.6-pre1", + "1.7.6-pre2", + "14w11a" +] diff --git a/meta/common/mojang-minecraft-old-snapshots.json b/meta/common/mojang-minecraft-old-snapshots.json new file mode 100644 index 0000000000..24ee0ce8b8 --- /dev/null +++ b/meta/common/mojang-minecraft-old-snapshots.json @@ -0,0 +1,604 @@ +{ + "old_snapshots": [ + { + "id": "1_2", + "wiki": "https://minecraft.wiki/w/Java_Edition_1.2", + "url": "https://archive.org/download/Minecraft-JSONs/1.2.json", + "sha1": "a2064011425a5e5befd9dee5eeb4f968ddf5ac77", + "size": 3988919, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/1_2/minecraft.jar" + }, + { + "id": "11w47a", + "wiki": "https://minecraft.wiki/w/Java_Edition_11w47a", + "url": "https://archive.org/download/Minecraft-JSONs/11w47a.json", + "sha1": "4e327918708d22e7443fbadefb9831ca04af4b90", + "size": 2242242, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/11w47a/minecraft.jar" + }, + { + "id": "11w48a", + "wiki": "https://minecraft.wiki/w/Java_Edition_11w48a", + "url": "https://archive.org/download/Minecraft-JSONs/11w48a.json", + "sha1": "fede770abe88a19e844d99dda611a7d18184155a", + "size": 2242604, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/11w48a/minecraft.jar" + }, + { + "id": "11w49a", + "wiki": "https://minecraft.wiki/w/Java_Edition_11w49a", + "url": "https://archive.org/download/Minecraft-JSONs/11w49a.json", + "sha1": "6f92a726e6b8b64f66c7e4d236f983c278d5af54", + "size": 3510866, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/11w49a/minecraft.jar" + }, + { + "id": "11w50a", + "wiki": "https://minecraft.wiki/w/Java_Edition_11w50a", + "url": "https://archive.org/download/Minecraft-JSONs/11w50a.json", + "sha1": "f4981ba0fee00a16d8dc9ec87bf2c4fdb51e4b7c", + "size": 3509701, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/11w50a/minecraft.jar" + }, + { + "id": "12w01a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w01a", + "url": "https://archive.org/download/Minecraft-JSONs/12w01a.json", + "sha1": "653a9cf55884b6bc4dcf3c574331e04bd5ad1032", + "size": 3839447, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w01a/minecraft.jar" + }, + { + "id": "12w03a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w03a", + "url": "https://archive.org/download/Minecraft-JSONs/12w03a.json", + "sha1": "e581c7c9dd57cbf73f72b833be5eff6109187df0", + "size": 3875210, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w03a/minecraft.jar" + }, + { + "id": "12w04a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w04a", + "url": "https://archive.org/download/Minecraft-JSONs/12w04a.json", + "sha1": "4911c473e856ec8102b8419eb36d0f54dad029a0", + "size": 3911974, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w04a/minecraft.jar" + }, + { + "id": "12w05a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w05a", + "url": "https://archive.org/download/Minecraft-JSONs/12w05a.json", + "sha1": "28328e67b82564335aa8280095a0716a2eb790de", + "size": 3931639, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w05a/minecraft.jar" + }, + { + "id": "12w05b", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w05b", + "url": "https://archive.org/download/Minecraft-JSONs/12w05b.json", + "sha1": "75fbc4a39a244d0f1eb842ff8385e992e2b47dd5", + "size": 3931694, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w05b/minecraft.jar" + }, + { + "id": "12w06a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w06a", + "url": "https://archive.org/download/Minecraft-JSONs/12w06a.json", + "sha1": "a8403c0d4c0cdb65722d864d9cf42663b8aab08b", + "size": 3934973, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w06a/minecraft.jar" + }, + { + "id": "12w07a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w07a", + "url": "https://archive.org/download/Minecraft-JSONs/12w07a.json", + "sha1": "e7ad115b29612b893972f0817030d993bc56fb7e", + "size": 3956252, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w07a/minecraft.jar" + }, + { + "id": "12w07b", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w07b", + "url": "https://archive.org/download/Minecraft-JSONs/12w07b.json", + "sha1": "0eea35d588fc2cee5d397472aa3565f48c220217", + "size": 3956323, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w07b/minecraft.jar" + }, + { + "id": "12w08a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w08a", + "url": "https://archive.org/download/Minecraft-JSONs/12w08a.json", + "sha1": "db2fcfdd23526b0f381ef2f3f2fd049d36227230", + "size": 3981486, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w08a/minecraft.jar" + }, + { + "id": "12w16a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w16a", + "url": "https://archive.org/download/Minecraft-JSONs/12w16a.json", + "sha1": "6b0a9fe3ac275f79ac6d259f4279752274ec05f8", + "size": 4080437, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w16a/minecraft.jar" + }, + { + "id": "12w17a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w17a", + "url": "https://archive.org/download/Minecraft-JSONs/12w17a.json", + "sha1": "17d41f8a07e054040ba34e523593bdea7f0fb6ba", + "size": 4114768, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w17a/minecraft.jar" + }, + { + "id": "12w18a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w18a", + "url": "https://archive.org/download/Minecraft-JSONs/12w18a.json", + "sha1": "9e9ab992317048bee9158ad9d1e2bc758db2b4af", + "size": 4317820, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w18a/minecraft.zip/bin/minecraft.jar" + }, + { + "id": "12w19a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w19a", + "url": "https://archive.org/download/Minecraft-JSONs/12w19a.json", + "sha1": "474aaac9a8b1dcbf312a5c09c7eae4a6aa401225", + "size": 4343792, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w19a/minecraft.zip/bin/minecraft.jar" + }, + { + "id": "12w21a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w21a", + "url": "https://archive.org/download/Minecraft-JSONs/12w21a.json", + "sha1": "e755423a04b0efde01e035a9d651acadeba0aef9", + "size": 4409586, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w21a/minecraft.jar" + }, + { + "id": "12w21b", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w21b", + "url": "https://archive.org/download/Minecraft-JSONs/12w21b.json", + "sha1": "84437ded4839b29d34f83e9f3bab07cc48980faf", + "size": 4499708, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w21b/minecraft.jar" + }, + { + "id": "12w22a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w22a", + "url": "https://archive.org/download/Minecraft-JSONs/12w22a.json", + "sha1": "3631a714cb465d39f5cb5c18aa23abf38031b359", + "size": 4542344, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w22a/minecraft.jar" + }, + { + "id": "12w23a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w23a", + "url": "https://archive.org/download/Minecraft-JSONs/12w23a.json", + "sha1": "4a5a8e3349ea2e9d67fa4dde6ec68d385bff46f0", + "size": 4543912, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w23a/minecraft.jar" + }, + { + "id": "12w23b", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w23b", + "url": "https://archive.org/download/Minecraft-JSONs/12w23b.json", + "sha1": "e107667bcbb4443afc160a7eeb8f347acc9826f8", + "size": 4543928, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w23b/minecraft.jar" + }, + { + "id": "12w24a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w24a", + "url": "https://archive.org/download/Minecraft-JSONs/12w24a.json", + "sha1": "e479c425ffe6ca3512d97ad0e02a8cd85356bf83", + "size": 4540049, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w24a/minecraft.jar" + }, + { + "id": "12w25a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w25a", + "url": "https://archive.org/download/Minecraft-JSONs/12w25a.json", + "sha1": "eddf53994e40ecc44f582d4b47b9a441844909b6", + "size": 4556548, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w25a/minecraft.jar" + }, + { + "id": "12w26a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w26a", + "url": "https://archive.org/download/Minecraft-JSONs/12w26a.json", + "sha1": "2d1e782a4c4435fe921027ae464a272945cca925", + "size": 4573075, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w26a/minecraft.jar" + }, + { + "id": "12w27a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w27a", + "url": "https://archive.org/download/Minecraft-JSONs/12w27a.json", + "sha1": "5e69b80f9c757bdc8275c1f6ce7e71820fe6d79a", + "size": 4584956, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w27a/minecraft.jar" + }, + { + "id": "12w30a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w30a", + "url": "https://archive.org/download/Minecraft-JSONs/12w30a.json", + "sha1": "368215d7fd38ee3e829725e11b3f193d45801128", + "size": 4584574, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w30a/minecraft.jar" + }, + { + "id": "12w30b", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w30b", + "url": "https://archive.org/download/Minecraft-JSONs/12w30b.json", + "sha1": "9d1e450cdb300ec426b50762e031796a8349aa1c", + "size": 4584593, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w30b/minecraft.jar" + }, + { + "id": "12w30c", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w30c", + "url": "https://archive.org/download/Minecraft-JSONs/12w30c.json", + "sha1": "92817a0c3f3c913ad68bdb082ac1f147db986282", + "size": 4584617, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w30c/minecraft.jar" + }, + { + "id": "12w30d", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w30d", + "url": "https://archive.org/download/Minecraft-JSONs/12w30d.json", + "sha1": "a5e7508de2d3993cb5222d8e4f8415226745d6ff", + "size": 4585459, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w30d/minecraft.jar" + }, + { + "id": "12w30e", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w30e", + "url": "https://archive.org/download/Minecraft-JSONs/12w30e.json", + "sha1": "1a37562cda14028dae15b331bfd36108e617a477", + "size": 4585506, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w30e/minecraft.jar" + }, + { + "id": "12w32a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w32a", + "url": "https://archive.org/download/Minecraft-JSONs/12w32a.json", + "sha1": "13183e023c8918ed08c302c2fe1438f61b53d094", + "size": 4628354, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w32a/minecraft.jar" + }, + { + "id": "12w34a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w34a", + "url": "https://archive.org/download/Minecraft-JSONs/12w34a.json", + "sha1": "41769085c020f4651b5b5dd50a6f83be2b000b29", + "size": 4676139, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w34a/minecraft.jar" + }, + { + "id": "12w34b", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w34b", + "url": "https://archive.org/download/Minecraft-JSONs/12w34b.json", + "sha1": "5fb51efc8f07ea57ffc2a02a7dac8a2835651b61", + "size": 4682004, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w34b/minecraft.jar" + }, + { + "id": "12w36a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w36a", + "url": "https://archive.org/download/Minecraft-JSONs/12w36a.json", + "sha1": "914bd89686c4621da327d50375a1edbdd9c177da", + "size": 4705667, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w36a/minecraft.jar" + }, + { + "id": "12w37a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w37a", + "url": "https://archive.org/download/Minecraft-JSONs/12w37a.json", + "sha1": "50ea0bac2c91b13c0881bbf99aad66a046533781", + "size": 4727781, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w37a/minecraft.jar" + }, + { + "id": "12w38a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w38a", + "url": "https://archive.org/download/Minecraft-JSONs/12w38a.json", + "sha1": "69e5a531fa615eb870345feb25f26126fe95586b", + "size": 4752649, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w38a/minecraft.jar" + }, + { + "id": "12w38b", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w38b", + "url": "https://archive.org/download/Minecraft-JSONs/12w38b.json", + "sha1": "867505cb4934016bf46cb8c7833ef0eaef8d39d9", + "size": 4767044, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w38b/minecraft.jar" + }, + { + "id": "12w39a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w39a", + "url": "https://archive.org/download/Minecraft-JSONs/12w39a.json", + "sha1": "65247c02036156b9f34c17f7d8bb053641afd0e7", + "size": 4768937, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w39a/minecraft.jar" + }, + { + "id": "12w39b", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w39b", + "url": "https://archive.org/download/Minecraft-JSONs/12w39b.json", + "sha1": "620d02bfd74204462a810874f83929d0b8b0b936", + "size": 4766448, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w39b/minecraft.jar" + }, + { + "id": "12w40a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w40a", + "url": "https://archive.org/download/Minecraft-JSONs/12w40a.json", + "sha1": "434652551e93fdfb4de30cbe64310037777f7eff", + "size": 4884173, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w40a/minecraft.jar" + }, + { + "id": "12w40b", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w40b", + "url": "https://archive.org/download/Minecraft-JSONs/12w40b.json", + "sha1": "1612e0fa6062f764844c5a71ff89660c311f38ae", + "size": 4884732, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w40b/minecraft.jar" + }, + { + "id": "12w41a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w41a", + "url": "https://archive.org/download/Minecraft-JSONs/12w41a.json", + "sha1": "7327bcd4da0d194565d6ee732b1fa48e8b14b347", + "size": 4900512, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w41a/minecraft.jar" + }, + { + "id": "12w41b", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w41b", + "url": "https://archive.org/download/Minecraft-JSONs/12w41b.json", + "sha1": "d73a5b6919d10689811c11d1c3debcd817050039", + "size": 4900976, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w41b/minecraft.jar" + }, + { + "id": "12w42a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w42a", + "url": "https://archive.org/download/Minecraft-JSONs/12w42a.json", + "sha1": "0b10f7afbd54392b387a23c34547cb0f30d48998", + "size": 4919860, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w42a/minecraft.jar" + }, + { + "id": "12w42b", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w42b", + "url": "https://archive.org/download/Minecraft-JSONs/12w42b.json", + "sha1": "74024eab7588bd33dd53baa756fd4deb92557b0a", + "size": 4921744, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w42b/minecraft.jar" + }, + { + "id": "12w49a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w49a", + "url": "https://archive.org/download/Minecraft-JSONs/12w49a.json", + "sha1": "a5a4cf65cf89207eb6ad7371c9237973865eba81", + "size": 4990865, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w49a/minecraft.jar" + }, + { + "id": "12w50a", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w50a", + "url": "https://archive.org/download/Minecraft-JSONs/12w50a.json", + "sha1": "96a6427720aef608a594ed1e0291e77cba398155", + "size": 5004175, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w50a/minecraft.jar" + }, + { + "id": "12w50b", + "wiki": "https://minecraft.wiki/w/Java_Edition_12w50b", + "url": "https://archive.org/download/Minecraft-JSONs/12w50b.json", + "sha1": "73dc6efe46fef478cc5ed123e711872450e193fd", + "size": 5005360, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/12w50b/minecraft.jar" + }, + { + "id": "13w01a", + "wiki": "https://minecraft.wiki/w/Java_Edition_13w01a", + "url": "https://archive.org/download/Minecraft-JSONs/13w01a.json", + "sha1": "e3256fe44cd7c6a1bf45570337e634b030589878", + "size": 5033591, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/13w01a/minecraft.jar" + }, + { + "id": "13w01b", + "wiki": "https://minecraft.wiki/w/Java_Edition_13w01b", + "url": "https://archive.org/download/Minecraft-JSONs/13w01b.json", + "sha1": "87f9f88eb3dcc80dcf818e44af774ab7ff63eb66", + "size": 5035543, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/13w01b/minecraft.jar" + }, + { + "id": "13w02a", + "wiki": "https://minecraft.wiki/w/Java_Edition_13w02a", + "url": "https://archive.org/download/Minecraft-JSONs/13w02a.json", + "sha1": "e9a57e8d5dcddcc9d919054c19b10eb71fcc304e", + "size": 5499864, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/13w02a/minecraft.jar" + }, + { + "id": "13w02b", + "wiki": "https://minecraft.wiki/w/Java_Edition_13w02b", + "url": "https://archive.org/download/Minecraft-JSONs/13w02b.json", + "sha1": "9289953c82ce69ec3d2e59a6044a9c900a99478f", + "size": 5363159, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/13w02b/minecraft.jar" + }, + { + "id": "13w03a", + "wiki": "https://minecraft.wiki/w/Java_Edition_13w03a", + "url": "https://archive.org/download/Minecraft-JSONs/13w03a.json", + "sha1": "6a2d3ffa88b7f5e0949f041193c6525d1c4cc22e", + "size": 6401672, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/13w03a/minecraft.jar" + }, + { + "id": "13w04a", + "wiki": "https://minecraft.wiki/w/Java_Edition_13w04a", + "url": "https://archive.org/download/Minecraft-JSONs/13w04a.json", + "sha1": "dff06285694aab7771682f949d51bca98ce52359", + "size": 6426112, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/13w04a/minecraft.jar" + }, + { + "id": "13w05a", + "wiki": "https://minecraft.wiki/w/Java_Edition_13w05a", + "url": "https://archive.org/download/Minecraft-JSONs/13w05a.json", + "sha1": "7808f090cb92afc8084545dd2ea305773bbd5e6e", + "size": 6442319, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/13w05a/minecraft.jar" + }, + { + "id": "13w05b", + "wiki": "https://minecraft.wiki/w/Java_Edition_13w05b", + "url": "https://archive.org/download/Minecraft-JSONs/13w05b.json", + "sha1": "72074d7cb843229292f71ae917dcefbc0f01461d", + "size": 6442459, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/13w05b/minecraft.jar" + }, + { + "id": "13w06a", + "wiki": "https://minecraft.wiki/w/Java_Edition_13w06a", + "url": "https://archive.org/download/Minecraft-JSONs/13w06a.json", + "sha1": "da409ce9f9c910c08cc729aadc6f592b8ff813cb", + "size": 6445893, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/13w06a/minecraft.jar" + }, + { + "id": "13w07a", + "wiki": "https://minecraft.wiki/w/Java_Edition_13w07a", + "url": "https://archive.org/download/Minecraft-JSONs/13w07a.json", + "sha1": "61f7dad52c34838be7a1e7d37a2370ac847ab87a", + "size": 6510193, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/13w07a/minecraft.jar" + }, + { + "id": "13w09a", + "wiki": "https://minecraft.wiki/w/Java_Edition_13w09a", + "url": "https://archive.org/download/Minecraft-JSONs/13w09a.json", + "sha1": "9ac49c55ca76eedfc985fa245dd0682e08b34982", + "size": 5574252, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/13w09a/minecraft.jar" + }, + { + "id": "13w09b", + "wiki": "https://minecraft.wiki/w/Java_Edition_13w09b", + "url": "https://archive.org/download/Minecraft-JSONs/13w09b.json", + "sha1": "635161d84725b1988f814c890fe5841ad99121e1", + "size": 5578604, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/13w09b/minecraft.jar" + }, + { + "id": "13w09c", + "wiki": "https://minecraft.wiki/w/Java_Edition_13w09c", + "url": "https://archive.org/download/Minecraft-JSONs/13w09c.json", + "sha1": "1367ef1410c2ce7ac0f1c58727aa4883c8677469", + "size": 5533426, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/13w09c/minecraft.jar" + }, + { + "id": "13w10a", + "wiki": "https://minecraft.wiki/w/Java_Edition_13w10a", + "url": "https://archive.org/download/Minecraft-JSONs/13w10a.json", + "sha1": "9162bca3ba8a77da2cd26cda1e46ca89a44bac4a", + "size": 5534991, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/13w10a/minecraft.jar" + }, + { + "id": "13w10b", + "wiki": "https://minecraft.wiki/w/Java_Edition_13w10b", + "url": "https://archive.org/download/Minecraft-JSONs/13w10b.json", + "sha1": "21e35ffe1772d1cf89aea653c7a883acb54b13a3", + "size": 5555235, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/13w10b/minecraft.jar" + }, + { + "id": "13w11a", + "wiki": "https://minecraft.wiki/w/Java_Edition_13w11a", + "url": "https://archive.org/download/Minecraft-JSONs/13w11a.json", + "sha1": "bec6c96bc4413ea3092428aba93d7425fe6a4ea9", + "size": 5556608, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/13w11a/minecraft.jar" + }, + { + "id": "13w12~", + "wiki": "https://minecraft.wiki/w/Java_Edition_13w12~", + "url": "https://archive.org/download/Minecraft-JSONs/13w12~.json", + "sha1": "66d6c6b5205ae1e8f0ad3eb78ccf66500f39c0c7", + "size": 5561634, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/13w12_/minecraft.jar" + }, + { + "id": "b1_8-pre1", + "wiki": "https://minecraft.wiki/w/Java_Edition_b1.8-pre1-2", + "url": "https://archive.org/download/Minecraft-JSONs/b1.8-pre1-2.json", + "sha1": "6789c69ede3aedf83b800c76bea56855d38a0afc", + "size": 1893151, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/1_8-pre/minecraft.jar" + }, + { + "id": "b1_8-pre2", + "wiki": "https://minecraft.wiki/w/Java_Edition_b1.8-pre2", + "url": "https://archive.org/download/Minecraft-JSONs/b1.8-pre2.json", + "sha1": "44191f2895bf1e064269c9279778f2e3e9c3c9c7", + "size": 1897780, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/1_8-pre2/minecraft.jar" + }, + { + "id": "b1_9-pre1", + "wiki": "https://minecraft.wiki/w/Java_Edition_b1.9-pre1", + "url": "https://archive.org/download/Minecraft-JSONs/b1.9-pre1.json", + "sha1": "fdeef0129af130aa00702e53c37c5c4029b7d50e", + "size": 1966908, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/1_9-pre/minecraft.jar" + }, + { + "id": "b1_9-pre2", + "wiki": "https://minecraft.wiki/w/Java_Edition_b1.9-pre2", + "url": "https://archive.org/download/Minecraft-JSONs/b1.9-pre2.json", + "sha1": "b0d40cf43b625631af65e2a645c34b533251da0e", + "size": 1988123, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/1_9-pre2/minecraft.jar" + }, + { + "id": "b1_9-pre3", + "wiki": "https://minecraft.wiki/w/Java_Edition_b1.9-pre3", + "url": "https://archive.org/download/Minecraft-JSONs/b1.9-pre3.json", + "sha1": "5b7fe76a602b7511c97740e36dc25040ccb6e76b", + "size": 2087104, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/1_9-pre3/minecraft.jar" + }, + { + "id": "b1_9-pre4", + "wiki": "https://minecraft.wiki/w/Java_Edition_b1.9-pre4", + "url": "https://archive.org/download/Minecraft-JSONs/b1.9-pre4.json", + "sha1": "5c4831d9705f2e00e3cd993e89b822636492932a", + "size": 2147107, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/1_9-pre4/minecraft.jar" + }, + { + "id": "b1_9-pre5", + "wiki": "https://minecraft.wiki/w/Java_Edition_b1.9-pre5", + "url": "https://archive.org/download/Minecraft-JSONs/b1.9-pre5.json", + "sha1": "e109b297d2c4ee7a0bd6aed72f38f7e3185654cf", + "size": 2211261, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/1_9-pre5/minecraft.jar" + }, + { + "id": "b1_9-pre6", + "wiki": "https://minecraft.wiki/w/Java_Edition_b1.9-pre6", + "url": "https://archive.org/download/Minecraft-JSONs/b1.9-pre6.json", + "sha1": "f0983e65cd1c0768b0d1fec471ce4f69173b8126", + "size": 2239270, + "jar": "https://archive.org/download/assets.minecraft.net-2013-11-13/assets.minecraft.net/1_9-pre6/minecraft.jar" + } + ] +} diff --git a/meta/common/mojang.py b/meta/common/mojang.py index f484e8d6a4..5fda2e002f 100644 --- a/meta/common/mojang.py +++ b/meta/common/mojang.py @@ -1,4 +1,4 @@ -from os.path import join +from os.path import join, dirname BASE_DIR = "mojang" @@ -6,11 +6,15 @@ VERSION_MANIFEST_FILE = join(BASE_DIR, "version_manifest_v2.json") VERSIONS_DIR = join(BASE_DIR, "versions") ASSETS_DIR = join(BASE_DIR, "assets") -STATIC_EXPERIMENTS_FILE = join(BASE_DIR, "minecraft-experiments.json") -STATIC_OLD_SNAPSHOTS_FILE = join(BASE_DIR, "minecraft-old-snapshots.json") -STATIC_OVERRIDES_FILE = join(BASE_DIR, "minecraft-legacy-override.json") -STATIC_LEGACY_SERVICES_FILE = join(BASE_DIR, "minecraft-legacy-services.json") -LIBRARY_PATCHES_FILE = join(BASE_DIR, "library-patches.json") +STATIC_EXPERIMENTS_FILE = join(dirname(__file__), "mojang-minecraft-experiments.json") +STATIC_OLD_SNAPSHOTS_FILE = join( + dirname(__file__), "mojang-minecraft-old-snapshots.json" +) +STATIC_OVERRIDES_FILE = join(dirname(__file__), "mojang-minecraft-legacy-override.json") +STATIC_LEGACY_SERVICES_FILE = join( + dirname(__file__), "mojang-minecraft-legacy-services.json" +) +LIBRARY_PATCHES_FILE = join(dirname(__file__), "mojang-library-patches.json") MINECRAFT_COMPONENT = "net.minecraft" LWJGL_COMPONENT = "org.lwjgl" diff --git a/meta/run/__init__.py b/meta/run/__init__.py new file mode 100644 index 0000000000..1bfe4f9ac8 --- /dev/null +++ b/meta/run/__init__.py @@ -0,0 +1 @@ +"""Main scripts""" diff --git a/meta/run/generate_fabric.py b/meta/run/generate_fabric.py new file mode 100755 index 0000000000..7ca50dd6aa --- /dev/null +++ b/meta/run/generate_fabric.py @@ -0,0 +1,143 @@ +import json +import os + +from meta.common import ( + ensure_component_dir, + launcher_path, + upstream_path, + transform_maven_key, +) +from meta.common.fabric import ( + JARS_DIR, + INSTALLER_INFO_DIR, + META_DIR, + INTERMEDIARY_COMPONENT, + LOADER_COMPONENT, +) +from meta.model import MetaVersion, Dependency, Library, MetaPackage, GradleSpecifier +from meta.model.fabric import FabricJarInfo, FabricInstallerDataV1, FabricMainClasses + +LAUNCHER_DIR = launcher_path() +UPSTREAM_DIR = upstream_path() + +ensure_component_dir(LOADER_COMPONENT) +ensure_component_dir(INTERMEDIARY_COMPONENT) + + +def load_jar_info(artifact_key) -> FabricJarInfo: + return FabricJarInfo.parse_file( + os.path.join(UPSTREAM_DIR, JARS_DIR, f"{artifact_key}.json") + ) + + +def load_installer_info(version) -> FabricInstallerDataV1: + return FabricInstallerDataV1.parse_file( + os.path.join(UPSTREAM_DIR, INSTALLER_INFO_DIR, f"{version}.json") + ) + + +def process_loader_version(entry) -> MetaVersion: + jar_info = load_jar_info(transform_maven_key(entry["maven"])) + installer_info = load_installer_info(entry["version"]) + + v = MetaVersion( + name="Fabric Loader", uid="net.fabricmc.fabric-loader", version=entry["version"] + ) + v.release_time = jar_info.release_time + v.requires = [Dependency(uid="net.fabricmc.intermediary")] + v.order = 10 + v.type = "release" + if isinstance(installer_info.main_class, FabricMainClasses): + v.main_class = installer_info.main_class.client + else: + v.main_class = installer_info.main_class + v.libraries = [] + v.libraries.extend(installer_info.libraries.common) + v.libraries.extend(installer_info.libraries.client) + loader_lib = Library( + name=GradleSpecifier.from_string(entry["maven"]), + url="https://maven.fabricmc.net", + ) + v.libraries.append(loader_lib) + return v + + +def process_intermediary_version(entry) -> MetaVersion: + jar_info = load_jar_info(transform_maven_key(entry["maven"])) + + v = MetaVersion( + name="Intermediary Mappings", + uid="net.fabricmc.intermediary", + version=entry["version"], + ) + v.release_time = jar_info.release_time + v.requires = [Dependency(uid="net.minecraft", equals=entry["version"])] + v.order = 11 + v.type = "release" + v.libraries = [] + v.volatile = True + intermediary_lib = Library( + name=GradleSpecifier.from_string(entry["maven"]), + url="https://maven.fabricmc.net", + ) + v.libraries.append(intermediary_lib) + return v + + +def main(): + recommended_loader_versions = [] + recommended_intermediary_versions = [] + + with open( + os.path.join(UPSTREAM_DIR, META_DIR, "loader.json"), "r", encoding="utf-8" + ) as f: + loader_version_index = json.load(f) + for entry in loader_version_index: + version = entry["version"] + print(f"Processing loader {version}") + + v = process_loader_version(entry) + + # Fabric Meta has a separate "stable" field, let's use that + if not recommended_loader_versions and entry["stable"]: + recommended_loader_versions.append(version) + + v.write(os.path.join(LAUNCHER_DIR, LOADER_COMPONENT, f"{v.version}.json")) + + with open( + os.path.join(UPSTREAM_DIR, META_DIR, "intermediary.json"), "r", encoding="utf-8" + ) as f: + intermediary_version_index = json.load(f) + for entry in intermediary_version_index: + version = entry["version"] + print(f"Processing intermediary {version}") + + v = process_intermediary_version(entry) + + recommended_intermediary_versions.append( + version + ) # all intermediaries are recommended + + v.write( + os.path.join(LAUNCHER_DIR, INTERMEDIARY_COMPONENT, f"{v.version}.json") + ) + + package = MetaPackage(uid=LOADER_COMPONENT, name="Fabric Loader") + package.recommended = recommended_loader_versions + package.description = ( + "Fabric Loader is a tool to load Fabric-compatible mods in game environments." + ) + package.project_url = "https://fabricmc.net" + package.authors = ["Fabric Developers"] + package.write(os.path.join(LAUNCHER_DIR, LOADER_COMPONENT, "package.json")) + + package = MetaPackage(uid=INTERMEDIARY_COMPONENT, name="Intermediary Mappings") + package.recommended = recommended_intermediary_versions + package.description = "Intermediary mappings allow using Fabric Loader with mods for Minecraft in a more compatible manner." + package.project_url = "https://fabricmc.net" + package.authors = ["Fabric Developers"] + package.write(os.path.join(LAUNCHER_DIR, INTERMEDIARY_COMPONENT, "package.json")) + + +if __name__ == "__main__": + main() diff --git a/meta/run/generate_forge.py b/meta/run/generate_forge.py new file mode 100755 index 0000000000..95b5ac39cb --- /dev/null +++ b/meta/run/generate_forge.py @@ -0,0 +1,472 @@ +import os +import re +import sys +from packaging import version as pversion +from operator import attrgetter +from typing import Collection + +from meta.common import ensure_component_dir, launcher_path, upstream_path +from meta.common.forge import ( + FORGE_COMPONENT, + INSTALLER_MANIFEST_DIR, + VERSION_MANIFEST_DIR, + DERIVED_INDEX_FILE, + LEGACYINFO_FILE, + INSTALLER_INFO_DIR, + BAD_VERSIONS, + FORGEWRAPPER_LIBRARY, +) +from meta.common.mojang import MINECRAFT_COMPONENT +from meta.model import ( + MetaVersion, + Dependency, + Library, + GradleSpecifier, + MojangLibraryDownloads, + MojangArtifact, + MetaPackage, +) +from meta.model.forge import ( + ForgeVersion, + ForgeInstallerProfile, + ForgeLegacyInfo, + fml_libs_for_version, + ForgeInstallerProfileV2, + InstallerInfo, + DerivedForgeIndex, + ForgeLegacyInfoList, +) +from meta.model.mojang import MojangVersion + +LAUNCHER_DIR = launcher_path() +UPSTREAM_DIR = upstream_path() + +ensure_component_dir(FORGE_COMPONENT) + + +def eprint(*args, **kwargs): + print(*args, file=sys.stderr, **kwargs) + + +# Construct a set of libraries out of a Minecraft version file, for filtering. +mc_version_cache = {} + + +def load_mc_version_filter(version: str): + if version in mc_version_cache: + return mc_version_cache[version] + v = MetaVersion.parse_file( + os.path.join(LAUNCHER_DIR, MINECRAFT_COMPONENT, f"{version}.json") + ) + libs = set(map(attrgetter("name"), v.libraries)) + mc_version_cache[version] = libs + return libs + + +""" +Match a library coordinate to a set of library coordinates. + * Block those that pass completely. + * For others, block those with lower versions than in the set. +""" + + +def should_ignore_artifact(libs: Collection[GradleSpecifier], match: GradleSpecifier): + for ver in libs: + if ( + ver.group == match.group + and ver.artifact == match.artifact + and ver.classifier == match.classifier + ): + if ver.version == match.version: + # Everything is matched perfectly - this one will be ignored + return True + elif pversion.parse(ver.version) > pversion.parse(match.version): + return True + else: + # Otherwise it did not match - new version is higher and this is an upgrade + return False + # No match found in the set - we need to keep this + return False + + +def version_from_profile( + profile: ForgeInstallerProfile, version: ForgeVersion +) -> MetaVersion: + v = MetaVersion(name="Forge", version=version.rawVersion, uid=FORGE_COMPONENT) + mc_version = profile.install.minecraft + v.requires = [Dependency(uid=MINECRAFT_COMPONENT, equals=mc_version)] + v.main_class = profile.version_info.main_class + v.release_time = profile.version_info.time + + args = profile.version_info.minecraft_arguments + tweakers = [] + expression = re.compile(r"--tweakClass ([a-zA-Z0-9.]+)") + match = expression.search(args) + while match is not None: + tweakers.append(match.group(1)) + args = args[: match.start()] + args[match.end() :] + match = expression.search(args) + if len(tweakers) > 0: + args = args.strip() + v.additional_tweakers = tweakers + # v.minecraftArguments = args + + v.libraries = [] + mc_filter = load_mc_version_filter(mc_version) + for forge_lib in profile.version_info.libraries: + if ( + forge_lib.name.is_lwjgl() + or forge_lib.name.is_log4j() + or should_ignore_artifact(mc_filter, forge_lib.name) + ): + continue + + overridden_name = forge_lib.name + if overridden_name.group == "net.minecraftforge": + if overridden_name.artifact == "minecraftforge": + overridden_name.artifact = "forge" + overridden_name.version = "%s-%s" % ( + mc_version, + overridden_name.version, + ) + + overridden_name.classifier = "universal" + elif overridden_name.artifact == "forge": + overridden_name.classifier = "universal" + + overridden_lib = Library(name=overridden_name) + if forge_lib.url == "http://maven.minecraftforge.net/": + overridden_lib.url = "https://maven.minecraftforge.net/" + else: + overridden_lib.url = forge_lib.url + # if forge_lib.checksums and len(forge_lib.checksums) == 2: + # overridden_lib.mmcHint = "forge-pack-xz" + v.libraries.append(overridden_lib) + + v.order = 5 + return v + + +def version_from_modernized_installer( + installer: MojangVersion, version: ForgeVersion +) -> MetaVersion: + v = MetaVersion(name="Forge", version=version.rawVersion, uid=FORGE_COMPONENT) + mc_version = version.mc_version + v.requires = [Dependency(uid=MINECRAFT_COMPONENT, equals=mc_version)] + v.main_class = installer.main_class + v.release_time = installer.release_time + + args = installer.minecraft_arguments + tweakers = [] + expression = re.compile("--tweakClass ([a-zA-Z0-9.]+)") + match = expression.search(args) + while match is not None: + tweakers.append(match.group(1)) + args = args[: match.start()] + args[match.end() :] + match = expression.search(args) + if len(tweakers) > 0: + args = args.strip() + v.additional_tweakers = tweakers + # v.minecraftArguments = args + + v.libraries = [] + + mc_filter = load_mc_version_filter(mc_version) + for forge_lib in installer.libraries: + if ( + forge_lib.name.is_lwjgl() + or forge_lib.name.is_log4j() + or should_ignore_artifact(mc_filter, forge_lib.name) + ): + continue + + if forge_lib.name.group == "net.minecraftforge": + if forge_lib.name.artifact == "forge": + overridden_name = forge_lib.name + overridden_name.classifier = "universal" + forge_lib.downloads.artifact.path = overridden_name.path() + forge_lib.downloads.artifact.url = ( + "https://maven.minecraftforge.net/%s" % overridden_name.path() + ) + forge_lib.name = overridden_name + + elif forge_lib.name.artifact == "minecraftforge": + overridden_name = forge_lib.name + overridden_name.artifact = "forge" + overridden_name.classifier = "universal" + overridden_name.version = "%s-%s" % ( + mc_version, + overridden_name.version, + ) + forge_lib.downloads.artifact.path = overridden_name.path() + forge_lib.downloads.artifact.url = ( + "https://maven.minecraftforge.net/%s" % overridden_name.path() + ) + forge_lib.name = overridden_name + + v.libraries.append(forge_lib) + + v.order = 5 + return v + + +def version_from_legacy(info: ForgeLegacyInfo, version: ForgeVersion) -> MetaVersion: + v = MetaVersion(name="Forge", version=version.rawVersion, uid=FORGE_COMPONENT) + mc_version = version.mc_version_sane + v.requires = [Dependency(uid=MINECRAFT_COMPONENT, equals=mc_version)] + v.release_time = info.release_time + v.order = 5 + if fml_libs_for_version( + mc_version + ): # WHY, WHY DID I WASTE MY TIME REWRITING FMLLIBSMAPPING + v.additional_traits = ["legacyFML"] + + classifier = "client" + if "universal" in version.url(): + classifier = "universal" + + main_mod = Library( + name=GradleSpecifier( + "net.minecraftforge", "forge", version.long_version, classifier + ) + ) + main_mod.downloads = MojangLibraryDownloads() + main_mod.downloads.artifact = MojangArtifact( + url=version.url(), sha1=info.sha1, size=info.size + ) + main_mod.downloads.artifact.path = None + v.jar_mods = [main_mod] + return v + + +def version_from_build_system_installer( + installer: MojangVersion, profile: ForgeInstallerProfileV2, version: ForgeVersion +) -> MetaVersion: + v = MetaVersion(name="Forge", version=version.rawVersion, uid=FORGE_COMPONENT) + v.requires = [Dependency(uid=MINECRAFT_COMPONENT, equals=version.mc_version_sane)] + v.main_class = "io.github.zekerzhayard.forgewrapper.installer.Main" + + # FIXME: Add the size and hash here + v.maven_files = [] + + # load the locally cached installer file info and use it to add the installer entry in the json + info = InstallerInfo.parse_file( + os.path.join(UPSTREAM_DIR, INSTALLER_INFO_DIR, f"{version.long_version}.json") + ) + installer_lib = Library( + name=GradleSpecifier( + "net.minecraftforge", "forge", version.long_version, "installer" + ) + ) + installer_lib.downloads = MojangLibraryDownloads() + installer_lib.downloads.artifact = MojangArtifact( + url="https://maven.minecraftforge.net/%s" % (installer_lib.name.path()), + sha1=info.sha1hash, + size=info.size, + ) + v.maven_files.append(installer_lib) + + for forge_lib in profile.libraries: + if forge_lib.name.is_log4j(): + continue + + if ( + forge_lib.name.group == "net.minecraftforge" + and forge_lib.name.artifact == "forge" + and forge_lib.name.classifier == "universal" + ): + forge_lib.downloads.artifact.url = ( + "https://maven.minecraftforge.net/%s" % forge_lib.name.path() + ) + v.maven_files.append(forge_lib) + + v.libraries = [] + + v.libraries.append(FORGEWRAPPER_LIBRARY) + + for forge_lib in installer.libraries: + if forge_lib.name.is_log4j(): + continue + + if forge_lib.name.group == "net.minecraftforge": + if forge_lib.name.artifact == "forge" and not forge_lib.name.classifier: + forge_lib.name.classifier = "launcher" + forge_lib.downloads.artifact.path = forge_lib.name.path() + forge_lib.downloads.artifact.url = ( + "https://maven.minecraftforge.net/%s" % forge_lib.name.path() + ) + forge_lib.name = forge_lib.name + # net.minecraftforge.forge:client doesn't exist??? (49.0.x) + if not len(forge_lib.downloads.artifact.url): + continue + v.libraries.append(forge_lib) + + v.release_time = installer.release_time + v.order = 5 + mc_args = ( + "--username ${auth_player_name} --version ${version_name} --gameDir ${game_directory} " + "--assetsDir ${assets_root} --assetIndex ${assets_index_name} --uuid ${auth_uuid} " + "--accessToken ${auth_access_token} --userType ${user_type} --versionType ${version_type}" + ) + for arg in installer.arguments.game: + mc_args += f" {arg}" + if "--fml.forgeGroup" not in installer.arguments.game: + mc_args += f" --fml.forgeGroup net.minecraftforge" + if "--fml.forgeVersion" not in installer.arguments.game: + mc_args += f" --fml.forgeVersion {version.rawVersion}" + if "--fml.mcVersion" not in installer.arguments.game: + mc_args += f" --fml.mcVersion {version.mc_version}" + v.minecraft_arguments = mc_args + return v + + +def main(): + # load the locally cached version list + remote_versions = DerivedForgeIndex.parse_file( + os.path.join(UPSTREAM_DIR, DERIVED_INDEX_FILE) + ) + recommended_versions = [] + + legacy_info_list = ForgeLegacyInfoList.parse_file( + os.path.join(UPSTREAM_DIR, LEGACYINFO_FILE) + ) + legacy_versions = [ + "1.1", + "1.2.3", + "1.2.4", + "1.2.5", + "1.3.2", + "1.4.1", + "1.4.2", + "1.4.3", + "1.4.4", + "1.4.5", + "1.4.6", + "1.4.7", + "1.5", + "1.5.1", + "1.5.2", + "1.6.1", + "1.6.2", + "1.6.3", + "1.6.4", + "1.7.10", + "1.7.10-pre4", + "1.7.2", + "1.8", + "1.8.8", + "1.8.9", + "1.9", + "1.9.4", + "1.10", + "1.10.2", + "1.11", + "1.11.2", + "1.12", + "1.12.1", + "1.12.2", + ] + + for key, entry in remote_versions.versions.items(): + if entry.mc_version is None: + eprint("Skipping %s with invalid MC version" % key) + continue + + version = ForgeVersion(entry) + + if version.long_version in BAD_VERSIONS: + # Version 1.12.2-14.23.5.2851 is ultra cringe, I can't imagine why you would even spend one second on + # actually adding support for this version. + # It is cringe, because it's installer info is broken af + eprint(f"Skipping bad version {version.long_version}") + continue + + if version.url() is None: + eprint("Skipping %s with no valid files" % key) + continue + eprint("Processing Forge %s" % version.rawVersion) + version_elements = version.rawVersion.split(".") + if len(version_elements) < 1: + eprint("Skipping version %s with not enough version elements" % key) + continue + + major_version_str = version_elements[0] + if not major_version_str.isnumeric(): + eprint( + "Skipping version %s with non-numeric major version %s" + % (key, major_version_str) + ) + continue + + if entry.recommended: + recommended_versions.append(version.rawVersion) + + # If we do not have the corresponding Minecraft version, we ignore it + if not os.path.isfile( + os.path.join( + LAUNCHER_DIR, MINECRAFT_COMPONENT, f"{version.mc_version_sane}.json" + ) + ): + eprint( + "Skipping %s with no corresponding Minecraft version %s" + % (key, version.mc_version_sane) + ) + continue + + # Path for new-style build system based installers + installer_version_filepath = os.path.join( + UPSTREAM_DIR, VERSION_MANIFEST_DIR, f"{version.long_version}.json" + ) + profile_filepath = os.path.join( + UPSTREAM_DIR, INSTALLER_MANIFEST_DIR, f"{version.long_version}.json" + ) + + eprint(installer_version_filepath) + if os.path.isfile(installer_version_filepath): + installer = MojangVersion.parse_file(installer_version_filepath) + if entry.mc_version in legacy_versions: + v = version_from_modernized_installer(installer, version) + else: + profile = ForgeInstallerProfileV2.parse_file(profile_filepath) + v = version_from_build_system_installer(installer, profile, version) + else: + if version.uses_installer(): + # If we do not have the Forge json, we ignore this version + if not os.path.isfile(profile_filepath): + eprint("Skipping %s with missing profile json" % key) + continue + profile = ForgeInstallerProfile.parse_file(profile_filepath) + v = version_from_profile(profile, version) + else: + # Generate json for legacy here + if version.mc_version_sane == "1.6.1": + continue + build = version.build + if ( + str(build).encode("utf-8").decode("utf8") + not in legacy_info_list.number + ): + eprint( + "Legacy build %d is missing in legacy info. Ignoring." % build + ) + continue + + v = version_from_legacy(legacy_info_list.number[str(build)], version) + + v.write(os.path.join(LAUNCHER_DIR, FORGE_COMPONENT, f"{v.version}.json")) + + recommended_versions.sort() + + print("Recommended versions:", recommended_versions) + + package = MetaPackage( + uid=FORGE_COMPONENT, + name="Forge", + project_url="https://www.minecraftforge.net/forum/", + ) + package.recommended = recommended_versions + package.write(os.path.join(LAUNCHER_DIR, FORGE_COMPONENT, "package.json")) + + +if __name__ == "__main__": + main() diff --git a/meta/run/generate_liteloader.py b/meta/run/generate_liteloader.py new file mode 100755 index 0000000000..2fe95fcc42 --- /dev/null +++ b/meta/run/generate_liteloader.py @@ -0,0 +1,118 @@ +import os +from datetime import datetime +from typing import List, Tuple, Dict, Optional + +from meta.common import ensure_component_dir, launcher_path, upstream_path +from meta.common.liteloader import LITELOADER_COMPONENT, VERSIONS_FILE +from meta.common.mojang import MINECRAFT_COMPONENT +from meta.model import MetaVersion, GradleSpecifier, Library, MetaPackage, Dependency +from meta.model.liteloader import LiteloaderIndex, LiteloaderArtefact + +LAUNCHER_DIR = launcher_path() +UPSTREAM_DIR = upstream_path() + +ensure_component_dir(LITELOADER_COMPONENT) + + +def process_artefacts( + mc_version: str, artefacts: Dict[str, LiteloaderArtefact], is_snapshot: bool +) -> Tuple[List[MetaVersion], Optional[MetaVersion]]: + versions: List[MetaVersion] = [] + lookup: Dict[str, MetaVersion] = {} + latest_version = None + latest = None + for x, artefact in artefacts.items(): + if x == "latest": + latest_version = artefact.version + continue + v = MetaVersion( + name="LiteLoader", + uid=LITELOADER_COMPONENT, + version=artefact.version, + requires=[Dependency(uid=MINECRAFT_COMPONENT, equals=mc_version)], + release_time=datetime.utcfromtimestamp(int(artefact.timestamp)), + additional_tweakers=[artefact.tweakClass], + main_class="net.minecraft.launchwrapper.Launch", + order=10, + libraries=artefact.libraries, + type="release", + ) + + if is_snapshot: + v.type = "snapshot" + + # hack to make broken liteloader versions work + for lib in v.libraries: + if lib.name == GradleSpecifier("org.ow2.asm", "asm-all", "5.0.3"): + lib.url = "https://repo.maven.apache.org/maven2/" + if lib.name == GradleSpecifier("org.ow2.asm", "asm-all", "5.2"): + lib.url = "http://repo.liteloader.com/" + + liteloader_lib = Library( + name=GradleSpecifier("com.mumfrey", "liteloader", v.version), + url="http://dl.liteloader.com/versions/", + ) + if is_snapshot: + liteloader_lib.mmcHint = "always-stale" + v.libraries.append(liteloader_lib) + + versions.append(v) + lookup[v.version] = v + + if latest_version: + latest = lookup[latest_version] + return versions, latest + + +def process_versions(index: LiteloaderIndex) -> Tuple[List[MetaVersion], List[str]]: + all_versions: List[MetaVersion] = [] + recommended: List[str] = [] + for mcVersion, versionObject in index.versions.items(): + # ignore this for now. It should be a jar mod or something. + if mcVersion == "1.5.2": + continue + + latest_release = None + if versionObject.artefacts: + versions, latest_release = process_artefacts( + mcVersion, versionObject.artefacts.liteloader, False + ) + all_versions.extend(versions) + if versionObject.snapshots: + versions, latest_snapshot = process_artefacts( + mcVersion, versionObject.snapshots.liteloader, True + ) + all_versions.extend(versions) + + if latest_release: + recommended.append(latest_release.version) + + recommended.sort() + + all_versions.sort(key=lambda x: x.release_time, reverse=True) + return all_versions, recommended + + +def main(): + index = LiteloaderIndex.parse_file(os.path.join(UPSTREAM_DIR, VERSIONS_FILE)) + + all_versions, recommended = process_versions(index) + + for version in all_versions: + version.write( + os.path.join(LAUNCHER_DIR, LITELOADER_COMPONENT, f"{version.version}.json") + ) + + package = MetaPackage( + uid=LITELOADER_COMPONENT, + name="LiteLoader", + description=index.meta.description, + project_url=index.meta.url, + authors=[index.meta.authors], + recommended=recommended, + ) + package.write(os.path.join(LAUNCHER_DIR, LITELOADER_COMPONENT, "package.json")) + + +if __name__ == "__main__": + main() diff --git a/meta/run/generate_mojang.py b/meta/run/generate_mojang.py new file mode 100755 index 0000000000..e0068c24ec --- /dev/null +++ b/meta/run/generate_mojang.py @@ -0,0 +1,576 @@ +import copy +import hashlib +import os +from collections import defaultdict, namedtuple +from operator import attrgetter +from pprint import pprint +from packaging import version as pversion +from typing import Optional, List + +from meta.common import ensure_component_dir, launcher_path, upstream_path +from meta.common.mojang import ( + STATIC_LEGACY_SERVICES_FILE, + VERSION_MANIFEST_FILE, + MINECRAFT_COMPONENT, + LWJGL3_COMPONENT, + LWJGL_COMPONENT, + STATIC_OVERRIDES_FILE, + VERSIONS_DIR, + LIBRARY_PATCHES_FILE, +) +from meta.model import ( + MetaVersion, + Library, + GradleSpecifier, + MojangLibraryDownloads, + MojangArtifact, + Dependency, + MetaPackage, + MojangRules, +) +from meta.model.mojang import ( + LegacyServices, + MojangIndexWrap, + MojangIndex, + MojangVersion, + LegacyOverrideIndex, + LibraryPatches, + SUPPORTED_FEATURES, +) + +APPLY_SPLIT_NATIVES_WORKAROUND = True + +LAUNCHER_DIR = launcher_path() +UPSTREAM_DIR = upstream_path() + +ensure_component_dir(MINECRAFT_COMPONENT) +ensure_component_dir(LWJGL_COMPONENT) +ensure_component_dir(LWJGL3_COMPONENT) + + +def map_log4j_artifact(version): + x = pversion.parse(version) + if x <= pversion.parse("2.0"): + return "2.0-beta9-fixed", "https://files.prismlauncher.org/maven/%s" + if x <= pversion.parse("2.17.1"): + return ( + "2.17.1", + "https://repo1.maven.org/maven2/%s", + ) # This is the only version that's patched (as of 2022/02/19) + return None, None + + +LOG4J_HASHES = { + "2.0-beta9-fixed": { + "log4j-api": { + "sha1": "b61eaf2e64d8b0277e188262a8b771bbfa1502b3", + "size": 107347, + }, + "log4j-core": { + "sha1": "677991ea2d7426f76309a73739cecf609679492c", + "size": 677588, + }, + }, + "2.17.1": { + "log4j-api": { + "sha1": "d771af8e336e372fb5399c99edabe0919aeaf5b2", + "size": 301872, + }, + "log4j-core": { + "sha1": "779f60f3844dadc3ef597976fcb1e5127b1f343d", + "size": 1790452, + }, + "log4j-slf4j18-impl": { + "sha1": "ca499d751f4ddd8afb016ef698c30be0da1d09f7", + "size": 21268, + }, + }, +} + +# We want versions that contain natives for all platforms. If there are multiple, pick the latest one +# LWJGL versions we want +PASS_VARIANTS = [ + # TODO: needs arm64 for Linux? + "8a9b08f11271eb4de3b50e5d069949500b2c7bc1", # 3.3.3 (2024-04-03 11:49:39+00:00) + "765b4ab443051d286bdbb1c19cd7dc86b0792dce", # 3.3.2 (2024-01-17 13:19:20+00:00) + "54c4fb1d6a96ac3007c947bf310c8bcf94a862be", # 3.3.1 (2023-04-20 11:55:19+00:00) split natives, with WoA natives + "ea4973ebc9eadf059f30f0958c89f330898bff51", # 3.2.2 (2019-07-04 14:41:05+00:00) will be patched, missing tinyfd + "235fc413bc4c76b269c207f7bca6464f1e1f1d80", # 3.2.1 (2019-02-13 16:12:08+00:00) + "deb1a436d806413207350735a00e04b54d113916", # 3.1.6 (2018-10-18 14:46:12+00:00) + "3e47f0f742fb759401754769fa59c508fd8fda75", # 3.1.2 (2018-06-21 12:57:11+00:00) + "a3f254df5a63a0a1635755733022029e8cfae1b3", # 2.9.4-nightly-20150209 (2016-12-20 14:05:34+00:00) + "879be09c0bd0d4bafc2ea4ea3d2ab8607a0d976c", # 2.9.3 (2015-01-30 11:58:24+00:00) + "8d4951d00253dfaa36a0faf1c8be541431861c30", # 2.9.1 (2014-05-22 14:44:33+00:00) + "cf58c9f92fed06cb041a7244c6b4b667e6d544cc", # 2.9.1-nightly-20131120 (2013-12-06 13:55:34+00:00) + "27dcadcba29a1a7127880ca1a77efa9ece866f24", # 2.9.0 (2013-09-06 12:31:58+00:00) +] + +# LWJGL versions we def. don't want! +BAD_VARIANTS = [ + "79bde9e46e9ad9accebda11e8293ed08d80dbdc3", # 3.3.2 (2023-08-30 11:24:35+00:00) does not have lwjgl-freetype + "8836c419f90f69a278b97d945a34af165c24ff60", # 3.3.1 (2022-05-18 13:51:54+00:00) split natives, with workaround, replaced by 23w26a + "3c624b94c06dbc4abae08fe6156d74abe4a2cca5", # 3.3.1 (2022-05-04 14:41:35+00:00) we already have a nice 3.3.1 + "e1106ca765798218323b7a6d7528050260ea9d88", # 3.3.1 (2022-05-04 14:41:35+00:00) doesn't use split natives + "90b3d9ca01058286c033b6b7ae7f6dc370a04015", # 3.2.2 (2022-03-31 14:53:25+00:00) only linux, windows + "d986df9598fa2bcf4a5baab5edf044548e66d011", # 3.2.2 (2021-12-10 03:36:38+00:00) only linux, windows + "4b73fccb9e5264c2068bdbc26f9651429abbf21a", # 3.2.2 (2021-08-25 14:41:57+00:00) only linux, windows + "090cec3577ecfe438b890b2a9410ea07aa725e16", # 3.2.2 (2021-04-07 14:04:09+00:00) only linux, windows + "ab463e9ebc6a36abf22f2aa27b219dd372ff5069", # 3.2.2 (2019-08-13 07:33:42+00:00) only linux, windows + "51d8ff5a7efc949b4ad2088930e151d6b88ba616", # 3.2.2 (2019-07-19 09:25:47+00:00) only linux, windows + "854649a5bd1455b89117593ae82ff90c8132cacf", # 3.2.1 (2019-04-18 11:05:19+00:00) only osx, windows + "89fcb489261b05f622e8052fe0b588b0cfe49c24", # 3.1.6 (2019-04-18 11:05:19+00:00) only linux + "f04052162b50fa1433f67e1a90bc79466c4ab776", # 2.9.0 (2013-10-21 16:34:47+00:00) only linux, windows + "6442fc475f501fbd0fc4244fd1c38c02d9ebaf7e", # 2.9.0 (2011-03-30 22:00:00+00:00) fine but newer variant available +] + + +def add_or_get_bucket(buckets, rules: Optional[MojangRules]) -> MetaVersion: + rule_hash = None + if rules: + rule_hash = hash(rules.json()) + + if rule_hash in buckets: + bucket = buckets[rule_hash] + else: + bucket = MetaVersion(name="LWJGL", version="undetermined", uid=LWJGL_COMPONENT) + bucket.type = "release" + buckets[rule_hash] = bucket + return bucket + + +def hash_lwjgl_version(lwjgl: MetaVersion): + lwjgl_copy = copy.deepcopy(lwjgl) + lwjgl_copy.release_time = None + return hashlib.sha1(lwjgl_copy.json().encode("utf-8", "strict")).hexdigest() + + +def sort_libs_by_name(library): + return library.name + + +LWJGLEntry = namedtuple("LWJGLEntry", ("version", "sha1")) + +lwjglVersionVariants = defaultdict(list) + + +def add_lwjgl_version(variants, lwjgl): + lwjgl_copy = copy.deepcopy(lwjgl) + libraries = list(lwjgl_copy.libraries) + libraries.sort(key=sort_libs_by_name) + lwjgl_copy.libraries = libraries + + version = lwjgl_copy.version + current_hash = hash_lwjgl_version(lwjgl_copy) + found = False + for variant in variants[version]: + existing_hash = variant.sha1 + if current_hash == existing_hash: + found = True + break + if not found: + print("!!! New variant for LWJGL version %s" % version) + variants[version].append(LWJGLEntry(version=lwjgl_copy, sha1=current_hash)) + + +def remove_paths_from_lib(lib): + if lib.downloads.artifact: + lib.downloads.artifact.path = None + if lib.downloads.classifiers: + for key, value in lib.downloads.classifiers.items(): + value.path = None + + +def adapt_new_style_arguments(arguments): + foo = [] + # we ignore the jvm arguments entirely. + # grab the strings, log the complex stuff + for arg in arguments.game: + if isinstance(arg, str): + if arg == "--clientId": + continue + if arg == "${clientid}": + continue + if arg == "--xuid": + continue + if arg == "${auth_xuid}": + continue + foo.append(arg) + else: + print("!!! Unrecognized structure in Minecraft game arguments:") + pprint(arg) + return " ".join(foo) + + +def adapt_new_style_arguments_to_traits(arguments): + foo = [] + # we ignore the jvm arguments entirely. + # grab the object, log the errors + for arg in arguments.game: + if isinstance(arg, dict): + for rule in arg["rules"]: + for k, v in rule["features"].items(): + if rule["action"] == "allow" and v and k in SUPPORTED_FEATURES: + foo.append(f"feature:{k}") + return foo + + +def is_macos_only(rules: Optional[MojangRules]): + allows_osx = False + allows_all = False + # print("Considering", specifier, "rules", rules) + if rules: + for rule in rules: + if rule.action == "allow" and rule.os and rule.os.name == "osx": + allows_osx = True + if rule.action == "allow" and not rule.os: + allows_all = True + if allows_osx and not allows_all: + return True + return False + + +def patch_library(lib: Library, patches: LibraryPatches) -> List[Library]: + to_patch = [lib] + + new_libraries = [] + while to_patch: + target = to_patch.pop(0) + + for patch in patches: + if patch.applies(target): + if patch.override: + target.merge(patch.override) + + if patch.additionalLibraries: + additional_copy = copy.deepcopy(patch.additionalLibraries) + new_libraries += list(dict.fromkeys(additional_copy)) + if patch.patchAdditionalLibraries: + to_patch += additional_copy + + return new_libraries + + +def process_single_variant(lwjgl_variant: MetaVersion, patches: LibraryPatches): + lwjgl_version = lwjgl_variant.version + v = copy.deepcopy(lwjgl_variant) + + new_libraries = [] + for lib in v.libraries: + new_libraries += patch_library(lib, patches) + v.libraries += list(dict.fromkeys(new_libraries)) + + if lwjgl_version[0] == "2": + filename = os.path.join(LAUNCHER_DIR, LWJGL_COMPONENT, f"{lwjgl_version}.json") + + v.name = "LWJGL 2" + v.uid = LWJGL_COMPONENT + v.conflicts = [Dependency(uid=LWJGL3_COMPONENT)] + elif lwjgl_version[0] == "3": + filename = os.path.join(LAUNCHER_DIR, LWJGL3_COMPONENT, f"{lwjgl_version}.json") + + v.name = "LWJGL 3" + v.uid = LWJGL3_COMPONENT + v.conflicts = [Dependency(uid=LWJGL_COMPONENT)] + # remove jutils and jinput from LWJGL 3 + # this is a dependency that Mojang kept in, but doesn't belong there anymore + filtered_libraries = list( + filter(lambda l: l.name.artifact not in ["jutils", "jinput"], v.libraries) + ) + v.libraries = filtered_libraries + else: + raise Exception("LWJGL version not recognized: %s" % v.version) + + v.volatile = True + v.order = -1 + good = True + for lib in v.libraries: + # skip libraries without natives or that we patched + if not lib.natives or lib in new_libraries: + continue + checked_dict = {"linux", "windows", "osx"} + if not checked_dict.issubset(lib.natives.keys()): + print("Missing system classifier!", v.version, lib.name, lib.natives.keys()) + good = False + break + if lib.downloads: + for entry in checked_dict: + baked_entry = lib.natives[entry] + if baked_entry not in lib.downloads.classifiers: + print( + "Missing download for classifier!", + v.version, + lib.name, + baked_entry, + lib.downloads.classifiers.keys(), + ) + good = False + break + if good: + v.write(filename) + else: + print("Skipped LWJGL", v.version) + + +def lib_is_split_native(lib: Library) -> bool: + if lib.name.classifier and lib.name.classifier.startswith("natives-"): + return True + return False + + +def version_has_split_natives(v: MojangVersion) -> bool: + for lib in v.libraries: + if lib_is_split_native(lib): + return True + return False + + +def main(): + # get the local version list + override_index = LegacyOverrideIndex.parse_file(STATIC_OVERRIDES_FILE) + legacy_services = LegacyServices.parse_file(STATIC_LEGACY_SERVICES_FILE) + library_patches = LibraryPatches.parse_file(LIBRARY_PATCHES_FILE) + + found_any_lwjgl3 = False + + for filename in os.listdir(os.path.join(UPSTREAM_DIR, VERSIONS_DIR)): + input_file = os.path.join(UPSTREAM_DIR, VERSIONS_DIR, filename) + if not input_file.endswith(".json"): + # skip non JSON files + continue + print("Processing", filename) + mojang_version = MojangVersion.parse_file(input_file) + v = mojang_version.to_meta_version( + "Minecraft", MINECRAFT_COMPONENT, mojang_version.id + ) + + libs_minecraft = [] + new_libs_minecraft = [] + is_lwjgl_3 = False + has_split_natives = version_has_split_natives(v) + buckets = {} + + for lib in v.libraries: + specifier = lib.name + + # generic fixes + remove_paths_from_lib(lib) + + if APPLY_SPLIT_NATIVES_WORKAROUND and lib_is_split_native(lib): + # merge classifier into artifact name to workaround bug in launcher + specifier.artifact += f"-{specifier.classifier}" + specifier.classifier = None + + if specifier.is_lwjgl(): + if has_split_natives: # implies lwjgl3 + bucket = add_or_get_bucket(buckets, None) + is_lwjgl_3 = True + found_any_lwjgl3 = True + bucket.version = specifier.version + if not bucket.libraries: + bucket.libraries = [] + bucket.libraries.append(lib) + bucket.release_time = v.release_time + else: + rules = None + if lib.rules: + rules = lib.rules + lib.rules = None + if is_macos_only(rules): + print( + "Candidate library ", + specifier, + " is only for macOS and is therefore ignored.", + ) + continue + bucket = add_or_get_bucket(buckets, rules) + if ( + specifier.group == "org.lwjgl.lwjgl" + and specifier.artifact == "lwjgl" + ): + bucket.version = specifier.version + if specifier.group == "org.lwjgl" and specifier.artifact == "lwjgl": + is_lwjgl_3 = True + found_any_lwjgl3 = True + bucket.version = specifier.version + if not bucket.libraries: + bucket.libraries = [] + bucket.libraries.append(lib) + bucket.release_time = v.release_time + # FIXME: workaround for insane log4j nonsense from December 2021. Probably needs adjustment. + elif lib.name.is_log4j(): + version_override, maven_override = map_log4j_artifact(lib.name.version) + + if version_override and maven_override: + if version_override not in LOG4J_HASHES: + raise Exception( + "ERROR: unhandled log4j version (overriden) %s!" + % version_override + ) + + if lib.name.artifact not in LOG4J_HASHES[version_override]: + raise Exception( + "ERROR: unhandled log4j artifact %s!" % lib.name.artifact + ) + + replacement_name = GradleSpecifier( + "org.apache.logging.log4j", lib.name.artifact, version_override + ) + artifact = MojangArtifact( + url=maven_override % (replacement_name.path()), + sha1=LOG4J_HASHES[version_override][lib.name.artifact]["sha1"], + size=LOG4J_HASHES[version_override][lib.name.artifact]["size"], + ) + + libs_minecraft.append( + Library( + name=replacement_name, + downloads=MojangLibraryDownloads(artifact=artifact), + ) + ) + else: + libs_minecraft.append(lib) + else: + new_libs_minecraft += patch_library(lib, library_patches) + libs_minecraft.append(lib) + if len(buckets) == 1: + for key in buckets: + lwjgl = buckets[key] + lwjgl.libraries = sorted(lwjgl.libraries, key=attrgetter("name")) + add_lwjgl_version(lwjglVersionVariants, lwjgl) + print("Found only candidate LWJGL", lwjgl.version, key) + else: + # multiple buckets for LWJGL. [None] is common to all, other keys are for different sets of rules + for key in buckets: + if key is None: + continue + lwjgl = buckets[key] + if None in buckets: + lwjgl.libraries = sorted( + lwjgl.libraries + buckets[None].libraries, + key=attrgetter("name"), + ) + else: + lwjgl.libraries = sorted(lwjgl.libraries, key=attrgetter("name")) + add_lwjgl_version(lwjglVersionVariants, lwjgl) + print("Found candidate LWJGL", lwjgl.version, key) + # remove the common bucket... + if None in buckets: + del buckets[None] + v.libraries = libs_minecraft + list(dict.fromkeys(new_libs_minecraft)) + + if is_lwjgl_3: + lwjgl_dependency = Dependency(uid=LWJGL3_COMPONENT) + else: + lwjgl_dependency = Dependency(uid=LWJGL_COMPONENT) + if len(buckets) == 1: + suggested_version = next(iter(buckets.values())).version + if is_lwjgl_3: + lwjgl_dependency.suggests = suggested_version + else: + lwjgl_dependency.suggests = "2.9.4-nightly-20150209" + else: + bad_versions = {"3.1.6", "3.2.1"} + our_versions = set() + + for lwjgl in iter(buckets.values()): + our_versions = our_versions.union({lwjgl.version}) + + if our_versions == bad_versions: + print("Found broken 3.1.6/3.2.1 combo, forcing LWJGL to 3.2.1") + suggested_version = "3.2.1" + lwjgl_dependency.suggests = suggested_version + else: + raise Exception( + "ERROR: cannot determine single suggested LWJGL version in %s" + % mojang_version.id + ) + + # if it uses LWJGL 3, add the trait that enables starting on first thread on macOS + if is_lwjgl_3: + if not v.additional_traits: + v.additional_traits = [] + v.additional_traits.append("FirstThreadOnMacOS") + v.requires = [lwjgl_dependency] + v.order = -2 + # process 1.13 arguments into previous version + if not mojang_version.minecraft_arguments and mojang_version.arguments: + v.minecraft_arguments = adapt_new_style_arguments(mojang_version.arguments) + if not v.additional_traits: + v.additional_traits = [] + v.additional_traits.extend( + adapt_new_style_arguments_to_traits(mojang_version.arguments) + ) + out_filename = os.path.join( + LAUNCHER_DIR, MINECRAFT_COMPONENT, f"{v.version}.json" + ) + if v.version in override_index.versions: + override = override_index.versions[v.version] + override.apply_onto_meta_version(v) + if v.version in legacy_services: + if v.additional_traits == None: + v.additional_traits = [] + v.additional_traits.append("legacyServices") + v.write(out_filename) + + for lwjglVersionVariant in lwjglVersionVariants: + decided_variant = None + passed_variants = 0 + unknown_variants = 0 + print( + "%d variant(s) for LWJGL %s:" + % (len(lwjglVersionVariants[lwjglVersionVariant]), lwjglVersionVariant) + ) + + for variant in lwjglVersionVariants[lwjglVersionVariant]: + if variant.sha1 in BAD_VARIANTS: + print("Variant %s ignored because it's marked as bad." % variant.sha1) + continue + if variant.sha1 in PASS_VARIANTS: + print("Variant %s accepted." % variant.sha1) + decided_variant = variant + passed_variants += 1 + continue + # print natives classifiers to decide which variant to use + n = [ + x.natives.keys() + for x in variant.version.libraries + if x.natives is not None + ] + print(n) + + print( + f' "{variant.sha1}", # {lwjglVersionVariant} ({variant.version.release_time})' + ) + unknown_variants += 1 + print("") + + if decided_variant and passed_variants == 1 and unknown_variants == 0: + process_single_variant(decided_variant.version, library_patches) + else: + raise Exception( + "No variant decided for version %s out of %d possible ones and %d unknown ones." + % (lwjglVersionVariant, passed_variants, unknown_variants) + ) + + lwjgl_package = MetaPackage(uid=LWJGL_COMPONENT, name="LWJGL 2") + lwjgl_package.write(os.path.join(LAUNCHER_DIR, LWJGL_COMPONENT, "package.json")) + + if found_any_lwjgl3: + lwjgl_package = MetaPackage(uid=LWJGL3_COMPONENT, name="LWJGL 3") + lwjgl_package.write( + os.path.join(LAUNCHER_DIR, LWJGL3_COMPONENT, "package.json") + ) + + mojang_index = MojangIndexWrap( + MojangIndex.parse_file(os.path.join(UPSTREAM_DIR, VERSION_MANIFEST_FILE)) + ) + + minecraft_package = MetaPackage(uid=MINECRAFT_COMPONENT, name="Minecraft") + minecraft_package.recommended = [mojang_index.latest.release] + minecraft_package.write( + os.path.join(LAUNCHER_DIR, MINECRAFT_COMPONENT, "package.json") + ) + + +if __name__ == "__main__": + main() diff --git a/meta/run/generate_neoforge.py b/meta/run/generate_neoforge.py new file mode 100644 index 0000000000..ee1e26908d --- /dev/null +++ b/meta/run/generate_neoforge.py @@ -0,0 +1,181 @@ +from copy import deepcopy +import os +import re +import sys +from operator import attrgetter +from typing import Collection + +from meta.common import ensure_component_dir, launcher_path, upstream_path +from meta.common.neoforge import ( + NEOFORGE_COMPONENT, + INSTALLER_MANIFEST_DIR, + VERSION_MANIFEST_DIR, + DERIVED_INDEX_FILE, + INSTALLER_INFO_DIR, +) +from meta.common.forge import FORGEWRAPPER_LIBRARY +from meta.common.mojang import MINECRAFT_COMPONENT +from meta.model import ( + MetaVersion, + Dependency, + Library, + GradleSpecifier, + MojangLibraryDownloads, + MojangArtifact, + MetaPackage, +) +from meta.model.neoforge import ( + NeoForgeVersion, + NeoForgeInstallerProfileV2, + InstallerInfo, + DerivedNeoForgeIndex, +) +from meta.model.mojang import MojangVersion + +LAUNCHER_DIR = launcher_path() +UPSTREAM_DIR = upstream_path() + +ensure_component_dir(NEOFORGE_COMPONENT) + + +def eprint(*args, **kwargs): + print(*args, file=sys.stderr, **kwargs) + + +def version_from_build_system_installer( + installer: MojangVersion, + profile: NeoForgeInstallerProfileV2, + version: NeoForgeVersion, +) -> MetaVersion: + v = MetaVersion(name="NeoForge", version=version.rawVersion, uid=NEOFORGE_COMPONENT) + v.requires = [Dependency(uid=MINECRAFT_COMPONENT, equals=version.mc_version_sane)] + v.main_class = "io.github.zekerzhayard.forgewrapper.installer.Main" + + # FIXME: Add the size and hash here + v.maven_files = [] + + # load the locally cached installer file info and use it to add the installer entry in the json + info = InstallerInfo.parse_file( + os.path.join(UPSTREAM_DIR, INSTALLER_INFO_DIR, f"{version.long_version}.json") + ) + installer_lib = Library( + name=GradleSpecifier( + "net.neoforged", version.artifact, version.long_version, "installer" + ) + ) + installer_lib.downloads = MojangLibraryDownloads() + installer_lib.downloads.artifact = MojangArtifact( + url="https://maven.neoforged.net/%s" % (installer_lib.name.path()), + sha1=info.sha1hash, + size=info.size, + ) + v.maven_files.append(installer_lib) + + for forge_lib in profile.libraries: + if forge_lib.name.is_log4j(): + continue + + v.maven_files.append(forge_lib) + + v.libraries = [] + + v.libraries.append(FORGEWRAPPER_LIBRARY) + + for forge_lib in installer.libraries: + if forge_lib.name.is_log4j(): + continue + + v.libraries.append(forge_lib) + + v.release_time = installer.release_time + v.order = 5 + mc_args = ( + "--username ${auth_player_name} --version ${version_name} --gameDir ${game_directory} " + "--assetsDir ${assets_root} --assetIndex ${assets_index_name} --uuid ${auth_uuid} " + "--accessToken ${auth_access_token} --userType ${user_type} --versionType ${version_type}" + ) + for arg in installer.arguments.game: + mc_args += f" {arg}" + v.minecraft_arguments = mc_args + return v + + +def main(): + # load the locally cached version list + remote_versions = DerivedNeoForgeIndex.parse_file( + os.path.join(UPSTREAM_DIR, DERIVED_INDEX_FILE) + ) + recommended_versions = [] + + for key, entry in remote_versions.versions.items(): + if entry.mc_version is None: + eprint("Skipping %s with invalid MC version" % key) + continue + + version = NeoForgeVersion(entry) + + if version.url() is None: + eprint("Skipping %s with no valid files" % key) + continue + eprint("Processing Forge %s" % version.rawVersion) + version_elements = version.rawVersion.split(".") + if len(version_elements) < 1: + eprint("Skipping version %s with not enough version elements" % key) + continue + + major_version_str = version_elements[0] + if not major_version_str.isnumeric(): + eprint( + "Skipping version %s with non-numeric major version %s" + % (key, major_version_str) + ) + continue + + if entry.recommended: + recommended_versions.append(version.rawVersion) + + # If we do not have the corresponding Minecraft version, we ignore it + if not os.path.isfile( + os.path.join( + LAUNCHER_DIR, MINECRAFT_COMPONENT, f"{version.mc_version_sane}.json" + ) + ): + eprint( + "Skipping %s with no corresponding Minecraft version %s" + % (key, version.mc_version_sane) + ) + continue + + # Path for new-style build system based installers + installer_version_filepath = os.path.join( + UPSTREAM_DIR, VERSION_MANIFEST_DIR, f"{version.long_version}.json" + ) + profile_filepath = os.path.join( + UPSTREAM_DIR, INSTALLER_MANIFEST_DIR, f"{version.long_version}.json" + ) + + eprint(installer_version_filepath) + assert os.path.isfile( + installer_version_filepath + ), f"version {installer_version_filepath} does not have installer version manifest" + installer = MojangVersion.parse_file(installer_version_filepath) + profile = NeoForgeInstallerProfileV2.parse_file(profile_filepath) + v = version_from_build_system_installer(installer, profile, version) + + v.write(os.path.join(LAUNCHER_DIR, NEOFORGE_COMPONENT, f"{v.version}.json")) + + recommended_versions.sort() + + print("Recommended versions:", recommended_versions) + + package = MetaPackage( + uid=NEOFORGE_COMPONENT, + name="NeoForge", + project_url="https://neoforged.net", + ) + package.recommended = recommended_versions + package.write(os.path.join(LAUNCHER_DIR, NEOFORGE_COMPONENT, "package.json")) + + +if __name__ == "__main__": + main() diff --git a/meta/run/generate_quilt.py b/meta/run/generate_quilt.py new file mode 100755 index 0000000000..ccf2797380 --- /dev/null +++ b/meta/run/generate_quilt.py @@ -0,0 +1,161 @@ +import json +import os + +from meta.common import ( + ensure_component_dir, + launcher_path, + upstream_path, + transform_maven_key, +) +from meta.common.quilt import ( + JARS_DIR, + INSTALLER_INFO_DIR, + META_DIR, + INTERMEDIARY_COMPONENT, + LOADER_COMPONENT, + USE_QUILT_MAPPINGS, + DISABLE_BEACON_ARG, + DISABLE_BEACON_VERSIONS, +) +from meta.model import MetaVersion, Dependency, Library, MetaPackage, GradleSpecifier +from meta.model.fabric import FabricJarInfo, FabricInstallerDataV1, FabricMainClasses + +LAUNCHER_DIR = launcher_path() +UPSTREAM_DIR = upstream_path() + +ensure_component_dir(LOADER_COMPONENT) +ensure_component_dir(INTERMEDIARY_COMPONENT) + + +def load_jar_info(artifact_key) -> FabricJarInfo: + return FabricJarInfo.parse_file( + os.path.join(UPSTREAM_DIR, JARS_DIR, f"{artifact_key}.json") + ) + + +def load_installer_info(version) -> FabricInstallerDataV1: + return FabricInstallerDataV1.parse_file( + os.path.join(UPSTREAM_DIR, INSTALLER_INFO_DIR, f"{version}.json") + ) + + +def process_loader_version(entry) -> (MetaVersion, bool): + should_recommend = ( + "-" not in entry["version"] + ) # Don't recommend pre releases as per SemVer + + jar_info = load_jar_info(transform_maven_key(entry["maven"])) + installer_info = load_installer_info(entry["version"]) + + v = MetaVersion(name="Quilt Loader", uid=LOADER_COMPONENT, version=entry["version"]) + v.release_time = jar_info.release_time + v.requires = [Dependency(uid=INTERMEDIARY_COMPONENT)] + v.order = 10 + v.type = "release" + if isinstance(installer_info.main_class, FabricMainClasses): + v.main_class = installer_info.main_class.client + else: + v.main_class = installer_info.main_class + v.libraries = [] + v.libraries.extend(installer_info.libraries.common) + v.libraries.extend(installer_info.libraries.client) + loader_lib = Library( + name=GradleSpecifier.from_string(entry["maven"]), + url="https://maven.quiltmc.org/repository/release", + ) + v.libraries.append(loader_lib) + + if entry["version"] in DISABLE_BEACON_VERSIONS: + if not v.additional_jvm_args: + v.additional_jvm_args = [] + v.additional_jvm_args.append(DISABLE_BEACON_ARG) + + return v, should_recommend + + +def process_intermediary_version(entry) -> MetaVersion: + jar_info = load_jar_info(transform_maven_key(entry["maven"])) + + v = MetaVersion( + name="Quilt Intermediary Mappings", + uid=INTERMEDIARY_COMPONENT, + version=entry["version"], + ) + v.release_time = jar_info.release_time + v.requires = [Dependency(uid="net.minecraft", equals=entry["version"])] + v.order = 11 + v.type = "release" + v.libraries = [] + v.volatile = True + intermediary_lib = Library( + name=GradleSpecifier.from_string(entry["maven"]), + url="https://maven.quiltmc.org/repository/release", + ) + v.libraries.append(intermediary_lib) + return v + + +def main(): + recommended_loader_versions = [] + recommended_intermediary_versions = [] + + with open( + os.path.join(UPSTREAM_DIR, META_DIR, "loader.json"), "r", encoding="utf-8" + ) as f: + loader_version_index = json.load(f) + for entry in loader_version_index: + version = entry["version"] + print(f"Processing loader {version}") + + v, should_recommend = process_loader_version(entry) + + if ( + not recommended_loader_versions and should_recommend + ): # newest stable loader is recommended + recommended_loader_versions.append(version) + + v.write(os.path.join(LAUNCHER_DIR, LOADER_COMPONENT, f"{v.version}.json")) + + if USE_QUILT_MAPPINGS: + with open( + os.path.join(UPSTREAM_DIR, META_DIR, "hashed.json"), "r", encoding="utf-8" + ) as f: + intermediary_version_index = json.load(f) + for entry in intermediary_version_index: + version = entry["version"] + print(f"Processing intermediary {version}") + + v = process_intermediary_version(entry) + + recommended_intermediary_versions.append( + version + ) # all intermediaries are recommended + + v.write( + os.path.join( + LAUNCHER_DIR, INTERMEDIARY_COMPONENT, f"{v.version}.json" + ) + ) + + package = MetaPackage(uid=LOADER_COMPONENT, name="Quilt Loader") + package.recommended = recommended_loader_versions + package.description = "The Quilt project is an open, community-driven modding toolchain designed primarily for Minecraft." + package.project_url = "https://quiltmc.org/" + package.authors = ["Quilt Project"] + package.write(os.path.join(LAUNCHER_DIR, LOADER_COMPONENT, "package.json")) + + if USE_QUILT_MAPPINGS: + package = MetaPackage( + uid=INTERMEDIARY_COMPONENT, name="Quilt Intermediary Mappings" + ) + package.recommended = recommended_intermediary_versions + package.description = "Intermediary mappings allow using Quilt Loader with mods for Minecraft in a more compatible manner." + package.project_url = "https://quiltmc.org/" + package.authors = ["Quilt Project"] + package.write( + os.path.join(LAUNCHER_DIR, INTERMEDIARY_COMPONENT, "package.json") + ) + + +if __name__ == "__main__": + main() diff --git a/meta/run/index.py b/meta/run/index.py new file mode 100755 index 0000000000..23dc2336ea --- /dev/null +++ b/meta/run/index.py @@ -0,0 +1,78 @@ +import hashlib +import os +from operator import attrgetter + +from meta.common import launcher_path +from meta.model import MetaVersion, MetaPackage +from meta.model.index import ( + MetaPackageIndex, + MetaVersionIndex, + MetaVersionIndexEntry, + MetaPackageIndexEntry, +) + +LAUNCHER_DIR = launcher_path() + + +# take the hash type (like hashlib.md5) and filename, return hex string of hash +def hash_file(hash_fn, file_name): + hash_instance = hash_fn() + with open(file_name, "rb") as f: + for chunk in iter(lambda: f.read(4096), b""): + hash_instance.update(chunk) + return hash_instance.hexdigest() + + +# ignore these files when indexing versions +ignore = {"index.json", "package.json", ".git", ".github"} + +# initialize output structures - package list level +packages = MetaPackageIndex() + +# walk through all the package folders +for package in sorted(os.listdir(LAUNCHER_DIR)): + if package in ignore: + continue + + sharedData = MetaPackage.parse_file( + os.path.join(LAUNCHER_DIR, package, "package.json") + ) + recommendedVersions = set() + if sharedData.recommended: + recommendedVersions = set(sharedData.recommended) + + # initialize output structures - version list level + versionList = MetaVersionIndex(uid=package, name=sharedData.name) + + # walk through all the versions of the package + for filename in os.listdir(LAUNCHER_DIR + "/%s" % package): + if filename in ignore: + continue + # parse and hash the version file + filepath = LAUNCHER_DIR + "/%s/%s" % (package, filename) + filehash = hash_file(hashlib.sha256, filepath) + versionFile = MetaVersion.parse_file(filepath) + is_recommended = versionFile.version in recommendedVersions + + versionEntry = MetaVersionIndexEntry.from_meta_version( + versionFile, is_recommended, filehash + ) + + versionList.versions.append(versionEntry) + + # sort the versions in descending order by time of release + versionList.versions = sorted( + versionList.versions, key=attrgetter("release_time"), reverse=True + ) + + # write the version index for the package + outFilePath = LAUNCHER_DIR + "/%s/index.json" % package + versionList.write(outFilePath) + + # insert entry into the package index + packageEntry = MetaPackageIndexEntry( + uid=package, name=sharedData.name, sha256=hash_file(hashlib.sha256, outFilePath) + ) + packages.packages.append(packageEntry) + +packages.write(os.path.join(LAUNCHER_DIR, "index.json")) diff --git a/meta/run/update_fabric.py b/meta/run/update_fabric.py new file mode 100755 index 0000000000..132495b92c --- /dev/null +++ b/meta/run/update_fabric.py @@ -0,0 +1,130 @@ +import json +import os +import zipfile +from datetime import datetime + +import requests + +from meta.common import ( + upstream_path, + ensure_upstream_dir, + transform_maven_key, + default_session, +) +from meta.common.fabric import ( + JARS_DIR, + INSTALLER_INFO_DIR, + META_DIR, + DATETIME_FORMAT_HTTP, +) +from meta.model.fabric import FabricJarInfo + +UPSTREAM_DIR = upstream_path() + +ensure_upstream_dir(JARS_DIR) +ensure_upstream_dir(INSTALLER_INFO_DIR) +ensure_upstream_dir(META_DIR) + +sess = default_session() + + +def filehash(filename, hashtype, blocksize=65536): + h = hashtype() + with open(filename, "rb") as f: + for block in iter(lambda: f.read(blocksize), b""): + h.update(block) + return h.hexdigest() + + +def get_maven_url(maven_key, server, ext): + parts = maven_key.split(":", 3) + maven_ver_url = ( + server + parts[0].replace(".", "/") + "/" + parts[1] + "/" + parts[2] + "/" + ) + maven_url = maven_ver_url + parts[1] + "-" + parts[2] + ext + return maven_url + + +def get_json_file(path, url): + with open(path, "w", encoding="utf-8") as f: + r = sess.get(url) + r.raise_for_status() + version_json = r.json() + json.dump(version_json, f, sort_keys=True, indent=4) + return version_json + + +def head_file(url): + r = sess.head(url) + r.raise_for_status() + return r.headers + + +def get_binary_file(path, url): + with open(path, "wb") as f: + r = sess.get(url) + r.raise_for_status() + for chunk in r.iter_content(chunk_size=128): + f.write(chunk) + + +def compute_jar_file(path, url): + # These two approaches should result in the same metadata, except for the timestamp which might be a few minutes + # off for the fallback method + try: + # Let's not download a Jar file if we don't need to. + headers = head_file(url) + tstamp = datetime.strptime(headers["Last-Modified"], DATETIME_FORMAT_HTTP) + except requests.HTTPError: + # Just in case something changes in the future + print(f"Falling back to downloading jar for {url}") + + jar_path = path + ".jar" + get_binary_file(jar_path, url) + tstamp = datetime.fromtimestamp(0) + with zipfile.ZipFile(jar_path) as jar: + allinfo = jar.infolist() + for info in allinfo: + tstamp_new = datetime(*info.date_time) + if tstamp_new > tstamp: + tstamp = tstamp_new + + data = FabricJarInfo(release_time=tstamp) + data.write(path + ".json") + + +def main(): + # get the version list for each component we are interested in + for component in ["intermediary", "loader"]: + index = get_json_file( + os.path.join(UPSTREAM_DIR, META_DIR, f"{component}.json"), + "https://meta.fabricmc.net/v2/versions/" + component, + ) + for it in index: + print(f"Processing {component} {it['version']} ") + jar_maven_url = get_maven_url( + it["maven"], "https://maven.fabricmc.net/", ".jar" + ) + compute_jar_file( + os.path.join(UPSTREAM_DIR, JARS_DIR, transform_maven_key(it["maven"])), + jar_maven_url, + ) + + # for each loader, download installer JSON file from maven + with open( + os.path.join(UPSTREAM_DIR, META_DIR, "loader.json"), "r", encoding="utf-8" + ) as loaderVersionIndexFile: + loader_version_index = json.load(loaderVersionIndexFile) + for it in loader_version_index: + print(f"Downloading JAR info for loader {it['version']} ") + maven_url = get_maven_url( + it["maven"], "https://maven.fabricmc.net/", ".json" + ) + get_json_file( + os.path.join(UPSTREAM_DIR, INSTALLER_INFO_DIR, f"{it['version']}.json"), + maven_url, + ) + + +if __name__ == "__main__": + main() diff --git a/meta/run/update_forge.py b/meta/run/update_forge.py new file mode 100755 index 0000000000..8fc8920bad --- /dev/null +++ b/meta/run/update_forge.py @@ -0,0 +1,397 @@ +""" + Get the source files necessary for generating Forge versions +""" + +import copy +import hashlib +import json +import os +import re +import sys +import zipfile +from contextlib import suppress +from datetime import datetime +from pathlib import Path +from pprint import pprint + +from pydantic import ValidationError + +from meta.common import upstream_path, ensure_upstream_dir, default_session +from meta.common.forge import ( + JARS_DIR, + INSTALLER_INFO_DIR, + INSTALLER_MANIFEST_DIR, + VERSION_MANIFEST_DIR, + FILE_MANIFEST_DIR, + BAD_VERSIONS, + LEGACYINFO_FILE, +) +from meta.model.forge import ( + ForgeFile, + ForgeEntry, + ForgeMCVersionInfo, + ForgeLegacyInfoList, + DerivedForgeIndex, + ForgeVersion, + ForgeInstallerProfile, + ForgeInstallerProfileV2, + InstallerInfo, + ForgeLegacyInfo, +) +from meta.model.mojang import MojangVersion + +UPSTREAM_DIR = upstream_path() + +ensure_upstream_dir(JARS_DIR) +ensure_upstream_dir(INSTALLER_INFO_DIR) +ensure_upstream_dir(INSTALLER_MANIFEST_DIR) +ensure_upstream_dir(VERSION_MANIFEST_DIR) +ensure_upstream_dir(FILE_MANIFEST_DIR) + +LEGACYINFO_PATH = os.path.join(UPSTREAM_DIR, LEGACYINFO_FILE) + +sess = default_session() + + +def eprint(*args, **kwargs): + print(*args, file=sys.stderr, **kwargs) + + +def filehash(filename, hashtype, blocksize=65536): + hashtype = hashtype() + with open(filename, "rb") as f: + for block in iter(lambda: f.read(blocksize), b""): + hashtype.update(block) + return hashtype.hexdigest() + + +def get_single_forge_files_manifest(longversion): + print(f"Getting Forge manifest for {longversion}") + path_thing = UPSTREAM_DIR + "/forge/files_manifests/%s.json" % longversion + files_manifest_file = Path(path_thing) + from_file = False + if files_manifest_file.is_file(): + with open(path_thing, "r") as f: + files_json = json.load(f) + from_file = True + else: + file_url = ( + "https://files.minecraftforge.net/net/minecraftforge/forge/%s/meta.json" + % longversion + ) + r = sess.get(file_url) + r.raise_for_status() + files_json = r.json() + + ret_dict = dict() + + for classifier, extensionObj in files_json.get("classifiers").items(): + assert type(classifier) == str + assert type(extensionObj) == dict + + # assert len(extensionObj.items()) == 1 + index = 0 + count = 0 + while index < len(extensionObj.items()): + mutable_copy = copy.deepcopy(extensionObj) + extension, hashtype = mutable_copy.popitem() + if not type(classifier) == str: + pprint(classifier) + pprint(extensionObj) + if not type(hashtype) == str: + pprint(classifier) + pprint(extensionObj) + print( + "%s: Skipping missing hash for extension %s:" + % (longversion, extension) + ) + index += 1 + continue + assert type(classifier) == str + processed_hash = re.sub(r"\W", "", hashtype) + if not len(processed_hash) == 32: + print( + "%s: Skipping invalid hash for extension %s:" + % (longversion, extension) + ) + pprint(extensionObj) + index += 1 + continue + + file_obj = ForgeFile( + classifier=classifier, hash=processed_hash, extension=extension + ) + if count == 0: + ret_dict[classifier] = file_obj + index += 1 + count += 1 + else: + print( + "%s: Multiple objects detected for classifier %s:" + % (longversion, classifier) + ) + pprint(extensionObj) + assert False + + if not from_file: + with open(path_thing, "w", encoding="utf-8") as f: + json.dump(files_json, f, sort_keys=True, indent=4) + + return ret_dict + + +def main(): + # get the remote version list fragments + r = sess.get( + "https://files.minecraftforge.net/net/minecraftforge/forge/maven-metadata.json" + ) + r.raise_for_status() + main_json = r.json() + assert type(main_json) == dict + + r = sess.get( + "https://files.minecraftforge.net/net/minecraftforge/forge/promotions_slim.json" + ) + r.raise_for_status() + promotions_json = r.json() + assert type(promotions_json) == dict + + promoted_key_expression = re.compile( + "(?P[^-]+)-(?P(latest)|(recommended))(-(?P[a-zA-Z0-9\\.]+))?" + ) + + recommended_set = set() + + new_index = DerivedForgeIndex() + + # FIXME: does not fully validate that the file has not changed format + # NOTE: For some insane reason, the format of the versions here is special. It having a branch at the end means it + # affects that particular branch. + # We don't care about Forge having branches. + # Therefore we only use the short version part for later identification and filter out the branch-specific + # promotions (among other errors). + print("Processing promotions:") + for promoKey, shortversion in promotions_json.get("promos").items(): + match = promoted_key_expression.match(promoKey) + if not match: + print("Skipping promotion %s, the key did not parse:" % promoKey) + pprint(promoKey) + assert match + if not match.group("mc"): + print( + "Skipping promotion %s, because it has no Minecraft version." % promoKey + ) + continue + if match.group("branch"): + print("Skipping promotion %s, because it on a branch only." % promoKey) + continue + elif match.group("promotion") == "recommended": + recommended_set.add(shortversion) + print("%s added to recommended set" % shortversion) + elif match.group("promotion") == "latest": + pass + else: + assert False + + version_expression = re.compile( + "^(?P[0-9a-zA-Z_\\.]+)-(?P[0-9\\.]+\\.(?P[0-9]+))(-(?P[a-zA-Z0-9\\.]+))?$" + ) + + print("") + print("Processing versions:") + for mc_version, value in main_json.items(): + assert type(mc_version) == str + assert type(value) == list + for long_version in value: + assert type(long_version) == str + match = version_expression.match(long_version) + if not match: + pprint(long_version) + assert match + assert match.group("mc") == mc_version + + files = get_single_forge_files_manifest(long_version) + + build = int(match.group("build")) + version = match.group("ver") + branch = match.group("branch") + + is_recommended = version in recommended_set + + entry = ForgeEntry( + long_version=long_version, + mc_version=mc_version, + version=version, + build=build, + branch=branch, + # NOTE: we add this later after the fact. The forge promotions file lies about these. + latest=False, + recommended=is_recommended, + files=files, + ) + new_index.versions[long_version] = entry + if not new_index.by_mc_version: + new_index.by_mc_version = dict() + if mc_version not in new_index.by_mc_version: + new_index.by_mc_version.setdefault(mc_version, ForgeMCVersionInfo()) + new_index.by_mc_version[mc_version].versions.append(long_version) + # NOTE: we add this later after the fact. The forge promotions file lies about these. + # if entry.latest: + # new_index.by_mc_version[mc_version].latest = long_version + if entry.recommended: + new_index.by_mc_version[mc_version].recommended = long_version + + print("") + print("Post processing promotions and adding missing 'latest':") + for mc_version, info in new_index.by_mc_version.items(): + latest_version = info.versions[-1] + info.latest = latest_version + new_index.versions[latest_version].latest = True + print("Added %s as latest for %s" % (latest_version, mc_version)) + + print("") + print("Dumping index files...") + + with open(UPSTREAM_DIR + "/forge/maven-metadata.json", "w", encoding="utf-8") as f: + json.dump(main_json, f, sort_keys=True, indent=4) + + with open(UPSTREAM_DIR + "/forge/promotions_slim.json", "w", encoding="utf-8") as f: + json.dump(promotions_json, f, sort_keys=True, indent=4) + + new_index.write(UPSTREAM_DIR + "/forge/derived_index.json") + + legacy_info_list = ForgeLegacyInfoList() + + print("Grabbing installers and dumping installer profiles...") + # get the installer jars - if needed - and get the installer profiles out of them + for key, entry in new_index.versions.items(): + eprint("Updating Forge %s" % key) + if entry.mc_version is None: + eprint("Skipping %d with invalid MC version" % entry.build) + continue + + version = ForgeVersion(entry) + if version.url() is None: + eprint("Skipping %d with no valid files" % version.build) + continue + if version.long_version in BAD_VERSIONS: + eprint(f"Skipping bad version {version.long_version}") + continue + + jar_path = os.path.join(UPSTREAM_DIR, JARS_DIR, version.filename()) + + if version.uses_installer(): + installer_info_path = ( + UPSTREAM_DIR + "/forge/installer_info/%s.json" % version.long_version + ) + profile_path = ( + UPSTREAM_DIR + + "/forge/installer_manifests/%s.json" % version.long_version + ) + version_file_path = ( + UPSTREAM_DIR + "/forge/version_manifests/%s.json" % version.long_version + ) + + installer_refresh_required = not os.path.isfile( + profile_path + ) or not os.path.isfile(installer_info_path) + + if installer_refresh_required: + # grab the installer if it's not there + if not os.path.isfile(jar_path): + eprint("Downloading %s" % version.url()) + rfile = sess.get(version.url(), stream=True) + rfile.raise_for_status() + with open(jar_path, "wb") as f: + for chunk in rfile.iter_content(chunk_size=128): + f.write(chunk) + + eprint("Processing %s" % version.url()) + # harvestables from the installer + if not os.path.isfile(profile_path): + print(jar_path) + with zipfile.ZipFile(jar_path) as jar: + with suppress(KeyError): + with jar.open("version.json") as profile_zip_entry: + version_data = profile_zip_entry.read() + + # Process: does it parse? + MojangVersion.parse_raw(version_data) + + with open(version_file_path, "wb") as versionJsonFile: + versionJsonFile.write(version_data) + versionJsonFile.close() + + with jar.open("install_profile.json") as profile_zip_entry: + install_profile_data = profile_zip_entry.read() + + # Process: does it parse? + is_parsable = False + exception = None + try: + ForgeInstallerProfile.parse_raw(install_profile_data) + is_parsable = True + except ValidationError as err: + exception = err + try: + ForgeInstallerProfileV2.parse_raw(install_profile_data) + is_parsable = True + except ValidationError as err: + exception = err + + if not is_parsable: + if version.is_supported(): + raise exception + else: + eprint( + "Version %s is not supported and won't be generated later." + % version.long_version + ) + + with open(profile_path, "wb") as profileFile: + profileFile.write(install_profile_data) + profileFile.close() + + # installer info v1 + if not os.path.isfile(installer_info_path): + installer_info = InstallerInfo() + installer_info.sha1hash = filehash(jar_path, hashlib.sha1) + installer_info.sha256hash = filehash(jar_path, hashlib.sha256) + installer_info.size = os.path.getsize(jar_path) + installer_info.write(installer_info_path) + else: + # ignore the two versions without install manifests and jar mod class files + # TODO: fix those versions? + if version.mc_version_sane == "1.6.1": + continue + + # only gather legacy info if it's missing + if not os.path.isfile(LEGACYINFO_PATH): + # grab the jar/zip if it's not there + if not os.path.isfile(jar_path): + rfile = sess.get(version.url(), stream=True) + rfile.raise_for_status() + with open(jar_path, "wb") as f: + for chunk in rfile.iter_content(chunk_size=128): + f.write(chunk) + # find the latest timestamp in the zip file + tstamp = datetime.fromtimestamp(0) + with zipfile.ZipFile(jar_path) as jar: + for info in jar.infolist(): + tstamp_new = datetime(*info.date_time) + if tstamp_new > tstamp: + tstamp = tstamp_new + legacy_info = ForgeLegacyInfo() + legacy_info.release_time = tstamp + legacy_info.sha1 = filehash(jar_path, hashlib.sha1) + legacy_info.sha256 = filehash(jar_path, hashlib.sha256) + legacy_info.size = os.path.getsize(jar_path) + legacy_info_list.number[key] = legacy_info + + # only write legacy info if it's missing + if not os.path.isfile(LEGACYINFO_PATH): + legacy_info_list.write(LEGACYINFO_PATH) + + +if __name__ == "__main__": + main() diff --git a/meta/run/update_liteloader.py b/meta/run/update_liteloader.py new file mode 100755 index 0000000000..383644754d --- /dev/null +++ b/meta/run/update_liteloader.py @@ -0,0 +1,37 @@ +import json +import os + +from meta.common import upstream_path, ensure_upstream_dir, default_session +from meta.common.liteloader import VERSIONS_FILE, BASE_DIR +from meta.model.liteloader import LiteloaderIndex + +UPSTREAM_DIR = upstream_path() + +ensure_upstream_dir(BASE_DIR) + +sess = default_session() + + +def main(): + # get the remote version list + r = sess.get("http://dl.liteloader.com/versions/versions.json") + r.raise_for_status() + + # make sure it's JSON + main_json = r.json() + + # make sure we understand the schema + remote_versions = LiteloaderIndex.parse_obj(main_json) + parsed = remote_versions.json() + original = json.dumps(main_json, sort_keys=True, indent=4) + assert parsed == original + + print("Successfully parsed index") + print(f"Last updated {remote_versions.meta.updated}") + + # save the json it to file + remote_versions.write(os.path.join(UPSTREAM_DIR, VERSIONS_FILE)) + + +if __name__ == "__main__": + main() diff --git a/meta/run/update_mojang.py b/meta/run/update_mojang.py new file mode 100755 index 0000000000..52921f3e8a --- /dev/null +++ b/meta/run/update_mojang.py @@ -0,0 +1,161 @@ +import json +import os +import zipfile + +from meta.common import upstream_path, ensure_upstream_dir, default_session +from meta.common.http import download_binary_file +from meta.common.mojang import ( + BASE_DIR, + VERSION_MANIFEST_FILE, + VERSIONS_DIR, + ASSETS_DIR, + STATIC_EXPERIMENTS_FILE, + STATIC_OLD_SNAPSHOTS_FILE, +) +from meta.model.mojang import ( + MojangIndexWrap, + MojangIndex, + ExperimentIndex, + ExperimentIndexWrap, + OldSnapshotIndexWrap, + OldSnapshotIndex, +) + +UPSTREAM_DIR = upstream_path() + +ensure_upstream_dir(BASE_DIR) +ensure_upstream_dir(VERSIONS_DIR) +ensure_upstream_dir(ASSETS_DIR) + +sess = default_session() + + +def fetch_zipped_version(path, url): + zip_path = f"{path}.zip" + download_binary_file(sess, zip_path, url) + with zipfile.ZipFile(zip_path) as z: + for info in z.infolist(): + if info.filename.endswith(".json"): + print(f"Found {info.filename} as version json") + version_json = json.load(z.open(info)) + break + + assert version_json + + with open(path, "w", encoding="utf-8") as f: + json.dump(version_json, f, sort_keys=True, indent=4) + + return version_json + + +def fetch_modified_version(path, version): + r = sess.get(version.url) + r.raise_for_status() + version_json = r.json() + + version_json["releaseTime"] = version_json["releaseTime"] + "T00:00:00+02:00" + version_json["time"] = version_json["releaseTime"] + + downloads = { + "client": {"url": version.jar, "sha1": version.sha1, "size": version.size} + } + + version_json["downloads"] = downloads + version_json["type"] = "old_snapshot" + + with open(path, "w", encoding="utf-8") as f: + json.dump(version_json, f, sort_keys=True, indent=4) + + return version_json + + +def fetch_version(path, url): + r = sess.get(url) + r.raise_for_status() + version_json = r.json() + + with open(path, "w", encoding="utf-8") as f: + json.dump(version_json, f, sort_keys=True, indent=4) + + return version_json + + +def main(): + # get the remote version list + r = sess.get("https://piston-meta.mojang.com/mc/game/version_manifest_v2.json") + r.raise_for_status() + + remote_versions = MojangIndexWrap(MojangIndex(**r.json())) + remote_ids = set(remote_versions.versions.keys()) + + version_manifest_path = os.path.join(UPSTREAM_DIR, VERSION_MANIFEST_FILE) + + if os.path.exists(version_manifest_path): + # get the local version list + current_versions = MojangIndexWrap( + MojangIndex.parse_file(version_manifest_path) + ) + local_ids = set(current_versions.versions.keys()) + + # versions not present locally but present remotely are new + pending_ids = remote_ids.difference(local_ids) + + for x in local_ids: + remote_version = remote_versions.versions[x] + local_version = current_versions.versions[x] + if remote_version.time > local_version.time: + pending_ids.add(x) + else: + pending_ids = remote_ids + + for x in pending_ids: + version = remote_versions.versions[x] + print( + "Updating " + + version.id + + " to timestamp " + + version.release_time.strftime("%s") + ) + fetch_version( + os.path.join(UPSTREAM_DIR, VERSIONS_DIR, f"{x}.json"), version.url + ) + + # deal with experimental snapshots separately + if os.path.exists(STATIC_EXPERIMENTS_FILE): + experiments = ExperimentIndexWrap( + ExperimentIndex.parse_file(STATIC_EXPERIMENTS_FILE) + ) + experiment_ids = set(experiments.versions.keys()) + + for x in experiment_ids: + version = experiments.versions[x] + experiment_path = os.path.join(UPSTREAM_DIR, VERSIONS_DIR, f"{x}.json") + + print("Updating experiment " + version.id) + if not os.path.isfile(experiment_path): + fetch_zipped_version(experiment_path, version.url) + else: + print("Already have experiment " + version.id) + + # deal with old snapshots + if os.path.exists(STATIC_OLD_SNAPSHOTS_FILE): + old_snapshots = OldSnapshotIndexWrap( + OldSnapshotIndex.parse_file(STATIC_OLD_SNAPSHOTS_FILE) + ) + old_snapshots_ids = set(old_snapshots.versions.keys()) + + for x in old_snapshots_ids: + version = old_snapshots.versions[x] + old_snapshots_path = os.path.join(UPSTREAM_DIR, VERSIONS_DIR, f"{x}.json") + + print("Updating old snapshot " + version.id) + if not os.path.isfile(old_snapshots_path): + fetch_modified_version(old_snapshots_path, version) + else: + print("Already have old snapshot " + version.id) + + remote_versions.index.write(version_manifest_path) + + +if __name__ == "__main__": + main() diff --git a/meta/run/update_neoforge.py b/meta/run/update_neoforge.py new file mode 100644 index 0000000000..826981aed1 --- /dev/null +++ b/meta/run/update_neoforge.py @@ -0,0 +1,319 @@ +""" + Get the source files necessary for generating Forge versions +""" + +import copy +import hashlib +import json +import os +import re +import sys +import zipfile +from contextlib import suppress +from datetime import datetime +from pathlib import Path +from pprint import pprint +import urllib.parse + +from pydantic import ValidationError + +from meta.common import upstream_path, ensure_upstream_dir, default_session +from meta.common.neoforge import ( + JARS_DIR, + INSTALLER_INFO_DIR, + INSTALLER_MANIFEST_DIR, + VERSION_MANIFEST_DIR, + FILE_MANIFEST_DIR, +) +from meta.model.neoforge import ( + NeoForgeFile, + NeoForgeEntry, + NeoForgeMCVersionInfo, + DerivedNeoForgeIndex, + NeoForgeVersion, + NeoForgeInstallerProfileV2, + InstallerInfo, +) +from meta.model.mojang import MojangVersion + +UPSTREAM_DIR = upstream_path() + +ensure_upstream_dir(JARS_DIR) +ensure_upstream_dir(INSTALLER_INFO_DIR) +ensure_upstream_dir(INSTALLER_MANIFEST_DIR) +ensure_upstream_dir(VERSION_MANIFEST_DIR) +ensure_upstream_dir(FILE_MANIFEST_DIR) + +sess = default_session() + + +def eprint(*args, **kwargs): + print(*args, file=sys.stderr, **kwargs) + + +def filehash(filename, hashtype, blocksize=65536): + hashtype = hashtype() + with open(filename, "rb") as f: + for block in iter(lambda: f.read(blocksize), b""): + hashtype.update(block) + return hashtype.hexdigest() + + +def find_nth(haystack, needle, n): + start = haystack.find(needle) + while start >= 0 and n > 1: + start = haystack.find(needle, start + len(needle)) + n -= 1 + return start + + +def get_single_forge_files_manifest(longversion, artifact: str): + print(f"Getting NeoForge manifest for {longversion}") + path_thing = UPSTREAM_DIR + "/neoforge/files_manifests/%s.json" % longversion + files_manifest_file = Path(path_thing) + from_file = False + if files_manifest_file.is_file(): + with open(path_thing, "r") as f: + files_json = json.load(f) + from_file = True + else: + file_url = ( + f"https://maven.neoforged.net/api/maven/details/releases/net%2Fneoforged%2F{artifact}%2F" + + urllib.parse.quote(longversion) + ) + r = sess.get(file_url) + r.raise_for_status() + files_json = r.json() + + ret_dict = dict() + + for file in files_json.get("files"): + assert type(file) == dict + name = file["name"] + prefix = f"{artifact}-{longversion}" + assert name.startswith( + prefix + ), f"{longversion} classifier {name} doesn't start with {prefix}" + file_name = name[len(prefix) :] + if file_name.startswith("-"): + file_name = file_name[1:] + if file_name.startswith("."): + continue + + classifier, ext = os.path.splitext(file_name) + + if ext in [".md5", ".sha1", ".sha256", ".sha512"]: + continue + + # assert len(extensionObj.items()) == 1 + file_obj = NeoForgeFile( + artifact=artifact, classifier=classifier, extension=ext[1:] + ) + ret_dict[classifier] = file_obj + + if not from_file: + Path(path_thing).parent.mkdir(parents=True, exist_ok=True) + with open(path_thing, "w", encoding="utf-8") as f: + json.dump(files_json, f, sort_keys=True, indent=4) + + return ret_dict + + +def main(): + # get the remote version list fragments + r = sess.get( + "https://maven.neoforged.net/api/maven/versions/releases/net%2Fneoforged%2Fforge" + ) + r.raise_for_status() + main_json = r.json()["versions"] + assert type(main_json) == list + + # get the new remote version list fragments + r = sess.get( + "https://maven.neoforged.net/api/maven/versions/releases/net%2Fneoforged%2Fneoforge" + ) + r.raise_for_status() + new_main_json = r.json()["versions"] + assert type(new_main_json) == list + + main_json += new_main_json + + new_index = DerivedNeoForgeIndex() + + version_expression = re.compile( + r"^(?P[0-9a-zA-Z_\.]+)-(?P[0-9\.]+\.(?P[0-9]+))(-(?P[a-zA-Z0-9\.]+))?$" + ) + neoforge_version_re = re.compile( + r"^(?P\d+).(?P\d+).(?P\d+)(?:-(?P\w+))?$" + ) + + print("") + print("Processing versions:") + for long_version in main_json: + assert type(long_version) == str + + match = version_expression.match(long_version) + if match: + mc_version = match.group("mc") + build = int(match.group("build")) + version = match.group("ver") + branch = match.group("branch") + artifact = "forge" + + match_nf = neoforge_version_re.match(long_version) + if match_nf: + mc_version = f"1.{match_nf.group('mcminor')}.{match_nf.group('mcpatch')}" + build = int(match_nf.group("number")) + version = match_nf.group("number") + branch = match_nf.group("tag") + match = match_nf + artifact = "neoforge" + + assert match, f"{long_version} doesn't match version regex" + try: + files = get_single_forge_files_manifest(long_version, artifact) + except: + continue + + # TODO: what *is* recommended? + is_recommended = False + + entry = NeoForgeEntry( + artifact=artifact, + long_version=long_version, + mc_version=mc_version, + version=version, + build=build, + branch=branch, + # NOTE: we add this later after the fact. The forge promotions file lies about these. + latest=False, + recommended=is_recommended, + files=files, + ) + new_index.versions[long_version] = entry + if not new_index.by_mc_version: + new_index.by_mc_version = dict() + if mc_version not in new_index.by_mc_version: + new_index.by_mc_version.setdefault(mc_version, NeoForgeMCVersionInfo()) + new_index.by_mc_version[mc_version].versions.append(long_version) + # NOTE: we add this later after the fact. The forge promotions file lies about these. + # if entry.latest: + # new_index.by_mc_version[mc_version].latest = long_version + if entry.recommended: + new_index.by_mc_version[mc_version].recommended = long_version + + print("") + print("Dumping index files...") + + with open( + UPSTREAM_DIR + "/neoforge/maven-metadata.json", "w", encoding="utf-8" + ) as f: + json.dump(main_json, f, sort_keys=True, indent=4) + + new_index.write(UPSTREAM_DIR + "/neoforge/derived_index.json") + + print("Grabbing installers and dumping installer profiles...") + # get the installer jars - if needed - and get the installer profiles out of them + for key, entry in new_index.versions.items(): + eprint("Updating NeoForge %s" % key) + if entry.mc_version is None: + eprint("Skipping %d with invalid MC version" % entry.build) + continue + + version = NeoForgeVersion(entry) + if version.url() is None: + eprint("Skipping %d with no valid files" % version.build) + continue + if not version.uses_installer(): + eprint(f"version {version.long_version} does not use installer") + continue + + jar_path = os.path.join(UPSTREAM_DIR, JARS_DIR, version.filename()) + + installer_info_path = ( + UPSTREAM_DIR + "/neoforge/installer_info/%s.json" % version.long_version + ) + profile_path = ( + UPSTREAM_DIR + + "/neoforge/installer_manifests/%s.json" % version.long_version + ) + version_file_path = ( + UPSTREAM_DIR + "/neoforge/version_manifests/%s.json" % version.long_version + ) + + installer_refresh_required = not os.path.isfile( + profile_path + ) or not os.path.isfile(installer_info_path) + + if installer_refresh_required: + # grab the installer if it's not there + if not os.path.isfile(jar_path): + eprint("Downloading %s" % version.url()) + try: + rfile = sess.get(version.url(), stream=True) + rfile.raise_for_status() + Path(jar_path).parent.mkdir(parents=True, exist_ok=True) + with open(jar_path, "wb") as f: + for chunk in rfile.iter_content(chunk_size=128): + f.write(chunk) + except Exception as e: + eprint("Failed to download %s" % version.url()) + eprint("Error is %s" % e) + continue + + eprint("Processing %s" % version.url()) + # harvestables from the installer + if not os.path.isfile(profile_path): + print(jar_path) + with zipfile.ZipFile(jar_path) as jar: + with suppress(KeyError): + with jar.open("version.json") as profile_zip_entry: + version_data = profile_zip_entry.read() + + # Process: does it parse? + MojangVersion.parse_raw(version_data) + + Path(version_file_path).parent.mkdir( + parents=True, exist_ok=True + ) + with open(version_file_path, "wb") as versionJsonFile: + versionJsonFile.write(version_data) + versionJsonFile.close() + + with jar.open("install_profile.json") as profile_zip_entry: + install_profile_data = profile_zip_entry.read() + + # Process: does it parse? + is_parsable = False + exception = None + try: + NeoForgeInstallerProfileV2.parse_raw(install_profile_data) + is_parsable = True + except ValidationError as err: + exception = err + + if not is_parsable: + if version.is_supported(): + raise exception + else: + eprint( + "Version %s is not supported and won't be generated later." + % version.long_version + ) + + Path(profile_path).parent.mkdir(parents=True, exist_ok=True) + with open(profile_path, "wb") as profileFile: + profileFile.write(install_profile_data) + profileFile.close() + + # installer info v1 + if not os.path.isfile(installer_info_path): + installer_info = InstallerInfo() + installer_info.sha1hash = filehash(jar_path, hashlib.sha1) + installer_info.sha256hash = filehash(jar_path, hashlib.sha256) + installer_info.size = os.path.getsize(jar_path) + installer_info.write(installer_info_path) + + +if __name__ == "__main__": + main() diff --git a/meta/run/update_quilt.py b/meta/run/update_quilt.py new file mode 100755 index 0000000000..5eaa8ed0d0 --- /dev/null +++ b/meta/run/update_quilt.py @@ -0,0 +1,122 @@ +import json +import os +import zipfile +from datetime import datetime + +import requests + +from meta.common import ( + upstream_path, + ensure_upstream_dir, + transform_maven_key, + default_session, +) +from meta.common.quilt import JARS_DIR, INSTALLER_INFO_DIR, META_DIR, USE_QUILT_MAPPINGS +from meta.common.fabric import DATETIME_FORMAT_HTTP +from meta.model.fabric import FabricJarInfo + +UPSTREAM_DIR = upstream_path() + +ensure_upstream_dir(JARS_DIR) +ensure_upstream_dir(INSTALLER_INFO_DIR) +ensure_upstream_dir(META_DIR) + +sess = default_session() + + +def filehash(filename, hashtype, blocksize=65536): + h = hashtype() + with open(filename, "rb") as f: + for block in iter(lambda: f.read(blocksize), b""): + h.update(block) + return h.hexdigest() + + +def get_maven_url(maven_key, server, ext): + parts = maven_key.split(":", 3) + maven_ver_url = ( + server + parts[0].replace(".", "/") + "/" + parts[1] + "/" + parts[2] + "/" + ) + maven_url = maven_ver_url + parts[1] + "-" + parts[2] + ext + return maven_url + + +def get_json_file(path, url): + with open(path, "w", encoding="utf-8") as f: + r = sess.get(url) + r.raise_for_status() + print(f"QUILT DEBUG {r.headers}") + version_json = r.json() + json.dump(version_json, f, sort_keys=True, indent=4) + return version_json + + +def head_file(url): + r = sess.head(url) + r.raise_for_status() + return r.headers + + +def get_binary_file(path, url): + with open(path, "wb") as f: + r = sess.get(url) + r.raise_for_status() + for chunk in r.iter_content(chunk_size=128): + f.write(chunk) + + +def compute_jar_file(path, url): + # NOTE: Quilt Meta does not make any guarantees about Last-Modified. + # Always download the JAR file instead + jar_path = path + ".jar" + get_binary_file(jar_path, url) + tstamp = datetime.fromtimestamp(0) + with zipfile.ZipFile(jar_path) as jar: + allinfo = jar.infolist() + for info in allinfo: + tstamp_new = datetime(*info.date_time) + if tstamp_new > tstamp: + tstamp = tstamp_new + + data = FabricJarInfo(release_time=tstamp) + data.write(path + ".json") + + +def main(): + # get the version list for each component we are interested in + components = ["loader"] + if USE_QUILT_MAPPINGS: + components.append("hashed") + for component in components: + index = get_json_file( + os.path.join(UPSTREAM_DIR, META_DIR, f"{component}.json"), + "https://meta.quiltmc.org/v3/versions/" + component, + ) + for it in index: + print(f"Processing {component} {it['version']} ") + jar_maven_url = get_maven_url( + it["maven"], "https://maven.quiltmc.org/repository/release/", ".jar" + ) + compute_jar_file( + os.path.join(UPSTREAM_DIR, JARS_DIR, transform_maven_key(it["maven"])), + jar_maven_url, + ) + + # for each loader, download installer JSON file from maven + with open( + os.path.join(UPSTREAM_DIR, META_DIR, "loader.json"), "r", encoding="utf-8" + ) as loaderVersionIndexFile: + loader_version_index = json.load(loaderVersionIndexFile) + for it in loader_version_index: + print(f"Downloading JAR info for loader {it['version']} ") + maven_url = get_maven_url( + it["maven"], "https://maven.quiltmc.org/repository/release/", ".json" + ) + get_json_file( + os.path.join(UPSTREAM_DIR, INSTALLER_INFO_DIR, f"{it['version']}.json"), + maven_url, + ) + + +if __name__ == "__main__": + main() -- cgit 0.0.5-2-1-g0f52