From 1323fc3523a1b30ca291dec8eac88788ef5104dd Mon Sep 17 00:00:00 2001 From: Oganesson897 <101081378+Oganesson897@users.noreply.github.com> Date: Sun, 19 Jan 2025 15:43:29 +0900 Subject: [PATCH 1/5] prism yes --- README.md | 3 ++ build/instance.py | 69 ++++++++++++++++++++++++++++++++++++ build/instance/mmc-pack.json | 37 +++++++++++++++++++ build/main.py | 22 ++++++++++-- 4 files changed, 128 insertions(+), 3 deletions(-) create mode 100644 build/instance.py create mode 100644 build/instance/mmc-pack.json diff --git a/README.md b/README.md index 8730e1bc7..96b65f4c3 100644 --- a/README.md +++ b/README.md @@ -86,4 +86,7 @@ Special thanks to our volunteers: ## Building the pack 1. Run `pip install requests` first to install required package. 2. Run `python build/main.py`. +> [!NOTE] +> Run `python build/main.py -i` or `python build/main.py --instance` to generate PrismLauncher instance for test +> `PrismLauncher -> Settings -> Launcher -> Features -> Folders -> Instance` can reset the instances folder 3. Check `buildOut` folder. diff --git a/build/instance.py b/build/instance.py new file mode 100644 index 000000000..4b58d22a5 --- /dev/null +++ b/build/instance.py @@ -0,0 +1,69 @@ +import os +import re +import shutil +import subprocess + +instance_dir = './buildOut/instances' + +def nextInstanceNum(): + all_items = os.listdir(instance_dir) + folders = [item for item in all_items if os.path.isdir(os.path.join(instance_dir, item))] + + if not folders: + return 1 + + pattern = re.compile(rf'^{re.escape('Test')}\s*(\d+)$') + + numbers = [] + for folder in folders: + match = pattern.match(folder) + if match: + numbers.append(int(match.group(1))) + + return max(numbers) + 1 + +def createConfiguration(name: str): + cfg = f''' + InstanceType=OneSix + JavaPath=Replace this with your java path + LogPrePostOutput=true + ManagedPack=false + ManagedPackID= + ManagedPackName= + ManagedPackType= + ManagedPackVersionID= + ManagedPackVersionName= + iconKey=default + lastLaunchTime=0 + lastTimePlayed=0 + name={name} + notes= + totalTimePlayed=0 + ''' + with open(f'{instance_dir}/{name}/instance.cfg', 'w', encoding='utf-8') as file: + file.write(cfg) + +def createMMCPackJson(name: str): + shutil.copy( + f'./build/instance/mmc-pack.json', + f'{instance_dir}/{name}/mmc-pack.json' + ) + + +def newInstance(number: int): + name = f'Test {number}' + os.makedirs(f'{instance_dir}/{name}') + + # Configurations + createConfiguration(name) + createMMCPackJson(name) + + minecraft = f'{instance_dir}/{name}/minecraft' + os.makedirs(minecraft) + + os.chdir('build/server') + subprocess.run(['java', '-jar', 'packwiz-installer-bootstrap.jar', '../../pack.toml'], check=True) + os.chdir('../..') + + for folder in ['config', 'groovy', 'journeymap', 'mods', 'resourcepacks', 'resources', 'structures']: + shutil.copytree(f'./build/server/{folder}', f'{instance_dir}/{name}/minecraft/{folder}') \ No newline at end of file diff --git a/build/instance/mmc-pack.json b/build/instance/mmc-pack.json new file mode 100644 index 000000000..3feb3d553 --- /dev/null +++ b/build/instance/mmc-pack.json @@ -0,0 +1,37 @@ +{ + "components": [ + { + "cachedName": "LWJGL 2", + "cachedVersion": "2.9.4-nightly-20150209", + "dependencyOnly": true, + "uid": "org.lwjgl", + "version": "2.9.4-nightly-20150209" + }, + { + "cachedName": "Minecraft", + "cachedRequires": [ + { + "suggests": "2.9.4-nightly-20150209", + "uid": "org.lwjgl" + } + ], + "cachedVersion": "1.12.2", + "important": true, + "uid": "net.minecraft", + "version": "1.12.2" + }, + { + "cachedName": "Forge", + "cachedRequires": [ + { + "equals": "1.12.2", + "uid": "net.minecraft" + } + ], + "cachedVersion": "14.23.5.2860", + "uid": "net.minecraftforge", + "version": "14.23.5.2860" + } + ], + "formatVersion": 1 +} diff --git a/build/main.py b/build/main.py index ff6cf7b95..e4c052cab 100644 --- a/build/main.py +++ b/build/main.py @@ -9,11 +9,9 @@ import subprocess import zipfile -import requests - # Used to run questbook.py import questbook - +import instance import download # used to map a projects classId on curseforge to a folder @@ -37,6 +35,8 @@ def parse_args(): help="makes a folder with all the files symlinked for development. probally only works on linux") parser.add_argument("-c", "--client", action="store_true", help="only builds the client pack") + parser.add_argument("-i", "--instance", action="store_true", + help="generate Prism(MMC) instance") parser.add_argument("--prefix", type=str, default="susy", @@ -72,11 +72,16 @@ def build(args): refresh() export_client_pack() # Client + if args.instance: + gen_prism_instance() + if args.client: + print("done") return export_modlist() export_server_pack() + print("done") def refresh(): subprocess.run([packwizName, 'refresh'], check=True) @@ -125,6 +130,17 @@ def export_modlist(): file.write(data) print("Modlist Export Done") +def gen_prism_instance(): + print('Generating PrismLauncher Instance') + instance_dir = './buildOut/instances' + if os.path.isdir(instance_dir): + print('Instance folder exist') + instance.newInstance(instance.nextInstanceNum()) + else: + print('Initial Instance') + os.mkdir(instance_dir) + instance.newInstance(1) + if __name__ == "__main__": build(parse_args()) From e043fd6af54512b368e1660312c4d2c8065a6020 Mon Sep 17 00:00:00 2001 From: Oganesson897 <101081378+Oganesson897@users.noreply.github.com> Date: Wed, 22 Jan 2025 18:06:26 +0900 Subject: [PATCH 2/5] fix: pattern error --- build/instance.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/build/instance.py b/build/instance.py index 4b58d22a5..af6f5302c 100644 --- a/build/instance.py +++ b/build/instance.py @@ -11,14 +11,11 @@ def nextInstanceNum(): if not folders: return 1 - - pattern = re.compile(rf'^{re.escape('Test')}\s*(\d+)$') numbers = [] for folder in folders: - match = pattern.match(folder) - if match: - numbers.append(int(match.group(1))) + if folder.startswith("Test"): + numbers.append(int(folder[-1])) return max(numbers) + 1 From ee045eea8ceb5243126753f061e10dd44510123f Mon Sep 17 00:00:00 2001 From: Oganesson897 <101081378+Oganesson897@users.noreply.github.com> Date: Wed, 22 Jan 2025 18:07:59 +0900 Subject: [PATCH 3/5] fix: null array --- build/instance.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/build/instance.py b/build/instance.py index af6f5302c..e3c8879bf 100644 --- a/build/instance.py +++ b/build/instance.py @@ -8,16 +8,13 @@ def nextInstanceNum(): all_items = os.listdir(instance_dir) folders = [item for item in all_items if os.path.isdir(os.path.join(instance_dir, item))] - - if not folders: - return 1 numbers = [] for folder in folders: if folder.startswith("Test"): numbers.append(int(folder[-1])) - return max(numbers) + 1 + return max(numbers, default=0) + 1 def createConfiguration(name: str): cfg = f''' From 2c354a36ffd8e8cd5635bf75c65eaa4c75a07881 Mon Sep 17 00:00:00 2001 From: Oganesson897 <101081378+Oganesson897@users.noreply.github.com> Date: Thu, 23 Jan 2025 13:06:11 +0900 Subject: [PATCH 4/5] feat: in-place instance only --- build/main.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/build/main.py b/build/main.py index e4c052cab..dd8ca48ea 100644 --- a/build/main.py +++ b/build/main.py @@ -70,10 +70,12 @@ def build(args): sys.exit(0) refresh() - export_client_pack() # Client if args.instance: gen_prism_instance() + return + + export_client_pack() # Client if args.client: print("done") From 8bfe6feafde629e71c76ece85fc5cb47ae2366a7 Mon Sep 17 00:00:00 2001 From: Oganesson897 <101081378+Oganesson897@users.noreply.github.com> Date: Fri, 24 Jan 2025 15:24:24 +0900 Subject: [PATCH 5/5] feat: work with modrinth --- build/main.py | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/build/main.py b/build/main.py index 64acca5f5..94230f051 100644 --- a/build/main.py +++ b/build/main.py @@ -14,12 +14,10 @@ import instance import download -# used to map a projects classId on curseforge to a folder -class_id_to_dir = { - 6: "mods", - 12: "resourcepacks", - -1: "other" -} +# put the modrinth mod's modname in this array +modrinth_files = [ + "" +] def parse_args(): @@ -91,6 +89,18 @@ def refresh(): def export_client_pack(): print("Client Pack Exporting") subprocess.run([packwizName, 'curseforge', 'export', '-o', 'client.zip'], check=True) + + def remove_folder_from_zip(zip_path, folder_name): + temp_zip_path = zip_path + "_temp" + with zipfile.ZipFile(zip_path, 'r') as zip_in: + with zipfile.ZipFile(temp_zip_path, 'w') as zip_out: + for entry in zip_in.infolist(): + if not entry.filename.startswith(folder_name + '/'): + zip_out.writestr(entry, zip_in.read(entry.filename)) + os.replace(temp_zip_path, zip_path) + + remove_folder_from_zip("client.zip", "mods") + shutil.copy('./client.zip', './buildOut/') os.remove('./client.zip') print("Client Pack Export Done") @@ -123,10 +133,11 @@ def export_server_pack(): def export_modlist(): print("Modlist Exporting") - result = subprocess.run([packwizName, 'list'], capture_output=True, encoding='utf-8').stdout.strip().split('\n') + result = subprocess.run([packwizName, 'list', '-s', 'client'], capture_output=True, encoding='utf-8').stdout.strip().split('\n') with open(basePath + "/buildOut/modlist.html", "w") as file: data = "

Modlist

" file.write(data)