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
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
# Local machine paths (never commit the live instance or build dirs)
|
||||
/.minecraft/
|
||||
*.tmp
|
||||
__pycache__/
|
||||
Binary file not shown.
@@ -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/<you>/<repo>/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.
|
||||
Executable
+112
@@ -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()
|
||||
Reference in New Issue
Block a user