commit 17b7655ea1539c0b345aa0355cbc305cf076c653 Author: reaper Date: Thu Aug 20 19:15:51 2026 +0200 Add Create Aeronautics - Airship & Expansion v1.0.0 mrpack - 75 mods for MC 1.21.1 / NeoForge 21.1.248 - Includes flywheel:indirect backend fix + aero-shadow-fix + shader overrides - build_mrpack.py regenerates the pack from a live Prism instance - Prism: Add Instance -> Import from ZIP with the raw .mrpack URL diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7e105b4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +# Local machine paths (never commit the live instance or build dirs) +/.minecraft/ +*.tmp +__pycache__/ \ No newline at end of file diff --git a/Create-Aeronautics-Airship-Expansion-1.0.0.mrpack b/Create-Aeronautics-Airship-Expansion-1.0.0.mrpack new file mode 100644 index 0000000..77af6e7 Binary files /dev/null and b/Create-Aeronautics-Airship-Expansion-1.0.0.mrpack differ diff --git a/README.md b/README.md new file mode 100644 index 0000000..cd09ff0 --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +# Create Aeronautics - Airship & Expansion + +A curated Minecraft modpack about airships, exploration, and tech progression. +**Minecraft 1.21.1 / NeoForge 21.1.248** — 75 mods. + +## Install (Prism Launcher) — one link + +1. Open Prism Launcher → **Add Instance → Import from ZIP**. +2. Paste the raw URL to the `.mrpack` file in this repository + (e.g. `https://raw.githubusercontent.com///main/Create-Aeronautics-Airship-Expansion-1.0.0.mrpack`). +3. Import. Prism downloads all mods, applies configs/shaders/resource pack, and sets the instance up automatically. +4. (First launch) Allocate 8 GB RAM in **Settings → Java → Memory**. Requires Java 21. + +## What's inside + +| Area | Mods | +|------|------| +| **Core** | Create 6.0.10, Create Aeronautics 1.3.1 (+Sable 2.0.5), Flywheel (bundled) | +| **Airships / expansion** | 11 Aeronautics addons, aeroworks, create-simulated-thrusters, create-the-air-war, deployer, simulated-gauges | +| **Tech** | railways, create-new-age, createbigcannons, createdieselgenerators, copycats, create_connected, Design-n-Decor, create_jetpack | +| **Magic** | Iron's Spells 'n Spellbooks, Ars Nouveau, patchouli | +| **Exploration** | Terralith (lithostitched), YUNG's Better Strongholds/Desert Temples/Dungeons, Explorer's Compass, Nature's Compass, Xaero's minimap + world map, waystones | +| **Survival / QoL** | Tough As Nails, Farmer's Delight, Apotheosis (+ apothic modules), corpse, carry-on, JEI, appleskin, MouseTweaks, Controlling, Jade, WeightedInventory | +| **Performance** | Sodium, lithium, ferritecore, ImmediatelyFast, entityculling, dynamic-fps, modernfix, Clumps, spark | +| **Visuals** | Iris + EuphoriaPatcher + Complementary Reimagined (Euphoria-patched) shader, 3D Skin Layers, Fresh Animations (resource pack, enable in-game) | + +## Key config already applied + +- **Flywheel backend forced to `flywheel:indirect`** — fixes the Create throttle-lever + "ghost image" artifact under Iris shaders. +- **aero-shadow-fix** bundled — fixes the white balloon ghost. +- Iris is preset to load the included Complementary Reimagined shaderpack. +- `irisflw replaceCheckerboardTexture = true` for correct textures under shaders. + +## After import + +- Enable **Fresh Animations** in Options → Resource Packs (ships alongside 3D Skin Layers). +- If shaders look off, verify the Complementary pack is active in Options → Video Settings → Shader Packs. + +## Rebuilding the pack (maintainers) + +`python3 build_mrpack.py` regenerates the `.mrpack` from a live instance located at +`~/.local/share/PrismLauncher/instances/Create Aeronautics - Airship & Expansion/.minecraft`. +Set `MODS_DIR` / `OVERRIDES` at the top of the script to point at a different instance. + +## Known limitations + +- Create Aeronautics has *known* visual issues under Iris; the bundled config/mods + resolve the most visible ones (balloon + throttle lever). Occasional artifacts on + animated Create instances may still appear. +- Shader uniform warnings in the log (`_flw_cullData`, `flw_frustumPlanes`) from Veil + are cosmetic and do not affect rendering on the `indirect` backend. \ No newline at end of file diff --git a/build_mrpack.py b/build_mrpack.py new file mode 100755 index 0000000..39d061c --- /dev/null +++ b/build_mrpack.py @@ -0,0 +1,112 @@ +#!/usr/bin/env python3 +"""Rebuild the Create Aeronautics .mrpack from a live Prism instance. + +Resolves every mod jar in the instance's mods/ folder to its Modrinth version +by SHA-1 hash (falling back to a manual CurseForge entry for aero-shadow-fix), +then packs modrinth.index.json + overrides into a Prism-importable .mrpack. +""" +import hashlib, json, os, subprocess, sys, tempfile, zipfile, urllib.request + +USER_AGENT = "opencode-pack-builder/1.0" +INSTANCE = os.path.expanduser( + "~/.local/share/PrismLauncher/instances/" + "Create Aeronautics - Airship & Expansion/.minecraft" +) +MODS_DIR = os.path.join(INSTANCE, "mods") +OUT = os.path.join(os.path.dirname(os.path.abspath(__file__)), + "Create-Aeronautics-Airship-Expansion-1.0.0.mrpack") + +# (name in instance, override source path) — shipped as-is into .minecraft +OVERRIDES = [ + ("config/flywheel-client.toml", os.path.join(INSTANCE, "config/flywheel-client.toml")), + ("config/iris.properties", os.path.join(INSTANCE, "config/iris.properties")), + ("config/irisflw-client.toml", os.path.join(INSTANCE, "config/irisflw-client.toml")), + ("resourcepacks/FreshAnimations_v1.10.4.zip", os.path.join(INSTANCE, "resourcepacks/FreshAnimations_v1.10.4.zip")), + ("shaderpacks/ComplementaryReimagined_r5.8.1 + EuphoriaPatches_1.9.3", + os.path.join(INSTANCE, "shaderpacks/ComplementaryReimagined_r5.8.1 + EuphoriaPatches_1.9.3")), +] + +# CurseForge-only mod: project 1641969 (aero-shadow-fix), file 8589529. +CF_FILES = { + "aero-shadow-fix.jar": { + "url": "https://www.curseforge.com/api/v1/mods/1641969/files/8589529/download", + }, +} + +def sha1(path): + h = hashlib.sha1() + with open(path, "rb") as f: + for block in iter(lambda: f.read(65536), b""): + h.update(block) + return h.hexdigest() + +def resolve(sha): + url = f"https://api.modrinth.com/v2/version_file/{sha}?algorithm=sha1" + req = urllib.request.Request(url, headers={"User-Agent": USER_AGENT}) + with urllib.request.urlopen(req, timeout=20) as r: + d = json.load(r) + return d.get("id", ""), d.get("files", [{}])[0].get("url", "") + +def main(): + files = [] + for fname in sorted(os.listdir(MODS_DIR)): + if not fname.endswith(".jar"): + continue + path = os.path.join(MODS_DIR, fname) + fsize = os.path.getsize(path) + if fname in CF_FILES: + url = CF_FILES[fname]["url"] + else: + vid, url = resolve(sha1(path)) + if not url: + print(f"!! could not resolve {fname} — add to CF_FILES and rerun") + sys.exit(1) + files.append({ + "path": "mods/" + fname, + "hashes": {"sha1": sha1(path)}, + "env": {"client": "required", "server": "optional"}, + "downloads": [url], + "fileSize": fsize, + }) + + index = { + "formatVersion": 1, + "game": "minecraft", + "versionId": "1.0.0", + "name": "Create Aeronautics - Airship & Expansion", + "summary": "Airships, exploration & tech. 75 mods for Minecraft 1.21.1 / NeoForge.", + "files": files, + "dependencies": {"minecraft": "1.21.1", "neoforge": "21.1.248"}, + } + + with tempfile.TemporaryDirectory() as tmp: + with open(os.path.join(tmp, "modrinth.index.json"), "w") as f: + json.dump(index, f, indent=2) + ov = os.path.join(tmp, "overrides") + for name, src in OVERRIDES: + dst = os.path.join(ov, name) + if os.path.isdir(src): + os.makedirs(dst, exist_ok=True) + for root, _, fnames in os.walk(src): + for fn in fnames: + sp = os.path.join(root, fn) + dp = os.path.join(dst, os.path.relpath(sp, src)) + os.makedirs(os.path.dirname(dp), exist_ok=True) + with open(sp, "rb") as si, open(dp, "wb") as di: + di.write(si.read()) + else: + os.makedirs(os.path.dirname(dst), exist_ok=True) + with open(src, "rb") as si, open(dst, "wb") as di: + di.write(si.read()) + with zipfile.ZipFile(OUT, "w", zipfile.ZIP_DEFLATED) as z: + z.write(os.path.join(tmp, "modrinth.index.json"), "modrinth.index.json") + for root, _, fnames in os.walk(ov): + for fn in fnames: + sp = os.path.join(root, fn) + z.write(sp, os.path.relpath(sp, tmp)) + + print(f"Wrote {OUT} ({len(files)} mods, " + f"{os.path.getsize(OUT)//1024//1024} MB)") + +if __name__ == "__main__": + main() \ No newline at end of file