summaryrefslogtreecommitdiff
path: root/meta
diff options
context:
space:
mode:
authorSefa Eyeoglu <contact@scrumplex.net>2023-12-28 22:20:03 +0100
committerSefa Eyeoglu <contact@scrumplex.net>2024-04-24 16:56:23 +0200
commitbe4317cf9d982018b4ff86375d680826ffacb62f (patch)
tree0dfc5bdcfc5e151d1e7a96bb2f9d87b73f4e5235 /meta
parentb643707c30466c0718e1f693e8063a00f0c369b5 (diff)
downloadProject-Tick-be4317cf9d982018b4ff86375d680826ffacb62f.tar.gz
Project-Tick-be4317cf9d982018b4ff86375d680826ffacb62f.zip
refactor!: package using Nix
Signed-off-by: Sefa Eyeoglu <contact@scrumplex.net>
Diffstat (limited to 'meta')
-rw-r--r--meta/common/__init__.py23
-rw-r--r--meta/common/forge.py5
-rw-r--r--meta/common/mojang-library-patches.json2879
-rw-r--r--meta/common/mojang-minecraft-experiments.json104
-rw-r--r--meta/common/mojang-minecraft-legacy-override.json585
-rw-r--r--meta/common/mojang-minecraft-legacy-services.json218
-rw-r--r--meta/common/mojang-minecraft-old-snapshots.json604
-rw-r--r--meta/common/mojang.py16
-rw-r--r--meta/run/__init__.py1
-rwxr-xr-xmeta/run/generate_fabric.py143
-rwxr-xr-xmeta/run/generate_forge.py472
-rwxr-xr-xmeta/run/generate_liteloader.py118
-rwxr-xr-xmeta/run/generate_mojang.py576
-rw-r--r--meta/run/generate_neoforge.py181
-rwxr-xr-xmeta/run/generate_quilt.py161
-rwxr-xr-xmeta/run/index.py78
-rwxr-xr-xmeta/run/update_fabric.py130
-rwxr-xr-xmeta/run/update_forge.py397
-rwxr-xr-xmeta/run/update_liteloader.py37
-rwxr-xr-xmeta/run/update_mojang.py161
-rw-r--r--meta/run/update_neoforge.py319
-rwxr-xr-xmeta/run/update_quilt.py122
22 files changed, 7310 insertions, 20 deletions
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<mc>[^-]+)-(?P<promotion>(latest)|(recommended))(-(?P<branch>[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<mc>[0-9a-zA-Z_\\.]+)-(?P<ver>[0-9\\.]+\\.(?P<build>[0-9]+))(-(?P<branch>[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<mc>[0-9a-zA-Z_\.]+)-(?P<ver>[0-9\.]+\.(?P<build>[0-9]+))(-(?P<branch>[a-zA-Z0-9\.]+))?$"
+ )
+ neoforge_version_re = re.compile(
+ r"^(?P<mcminor>\d+).(?P<mcpatch>\d+).(?P<number>\d+)(?:-(?P<tag>\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()