From 73e2f771d1dbf196d3bd27a0c69ce1430753d13c Mon Sep 17 00:00:00 2001 From: stuin Date: Mon, 31 Mar 2025 16:21:37 -0700 Subject: [PATCH] Add neoforge support --- install.py | 2 + neoforge_install.py | 93 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 neoforge_install.py diff --git a/install.py b/install.py index 914bd58..34dae5d 100644 --- a/install.py +++ b/install.py @@ -18,6 +18,7 @@ import pathlib import forge_install +import neoforge_install import fabric_install import mod_download from zipfile import ZipFile @@ -211,6 +212,7 @@ def main(zipfile, # * manual flag: run automatically or show GUI modloaders = { 'forge': forge_install, + 'neoforge': neoforge_install, 'fabric': fabric_install } diff --git a/neoforge_install.py b/neoforge_install.py new file mode 100644 index 0000000..57d511a --- /dev/null +++ b/neoforge_install.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +import os +import re +import subprocess +import sys +import time +from util import * + +# https://files.minecraftforge.net/maven/net/minecraftforge/forge/1.12.2-14.23.5.2847/forge-1.12.2-14.23.5.2847-universal.jar + +def get_neoforge_url(mcver, mlver): + index_url = 'https://maven.neoforged.net/releases/net/neoforged/neoforge/index.html' + + outpath = '/tmp/neoforge-%s-index.html' % mcver + if not os.path.exists(outpath): + resp = download(index_url, outpath, False) + if resp != 200: + print("Got %d error trying to download NeoForge download index" % resp) + return "" + + with open(outpath, 'r') as f: + match = re.search(r"href=\".*(https://maven\.neoforged\.net/.*-%s-.*\.jar)\"" % mlver, f.read()) + if match: + url = match.group(1) + else: + print("Could not find NeoForge download URL for version %s (Minecraft version %s)" % (mlver, mcver)) + return "" + + return url + +def guess_neoforge_url(mcver, mlver): + neoforge_fullver = mlver + return 'https://maven.neoforged.net/releases/net/neoforged/neoforge/%s/neoforge-%s-installer.jar' % (neoforge_fullver, neoforge_fullver) + +def main(manifest, mcver, mlver, packname, mc_dir, manual): + url_providers = [guess_neoforge_url, get_neoforge_url] + + outpath = '/tmp/neoforge-%s-installer.jar' % (mcver + '-' + mlver) + + for provider in url_providers: + if os.path.exists(outpath): + break + url = provider(mcver, mlver) + + resp = download(url, outpath, True) + if resp != 200: + print("Got %d error trying to download NeoForge" % resp) + + if not os.path.exists(outpath): + print("Failed to download the NeoForge installer.") + sys.exit(2) + + # Run the Forge auto-install hack + if manual: + print("Using the manual installer!") + print("***** NEW: INSTALL TO THE MAIN .MINECRAFT DIRECTORY *****") + print("***** (Just hit 'OK' with the default settings) *****") + for i in range(20): + print("^ ", end="", flush=True) + time.sleep(0.05) + + subprocess.run(['java', '-jar', outpath]) + else: + compile_hack = False + if not os.path.exists('ForgeHack.class'): + compile_hack = True + else: + src_modtime = os.stat('ForgeHack.java').st_mtime + cls_modtime = os.stat('ForgeHack.class').st_mtime + if src_modtime > cls_modtime: + print("hack source file updated, recompiling") + compile_hack = True + + if compile_hack: + subprocess.run(['javac', 'ForgeHack.java']) + exit_code = subprocess.run(['java', 'ForgeHack', outpath, mc_dir]).returncode + if exit_code != 0: + print("Error running the auto-installer, try using --manual.") + sys.exit(3) + + ver_id = get_version_id(mcver, mlver) + if not os.path.exists(mc_dir + '/versions/' + ver_id): + print("NeoForge installation not found.") + if manual: + print("Make sure you browsed to the correct minecraft directory.") + print("Expected to find a directory named %s in %s" % (ver_id, mc_dir + '/versions')) + print("If a similarly named directory was created in the expected folder, please submit a") + print("bug report.") + sys.exit(3) + + +def get_version_id(mcver, mlver): + return "neoforge-%s" % mlver