diff --git a/server/README.md b/server/README.md new file mode 100644 index 0000000..596622e --- /dev/null +++ b/server/README.md @@ -0,0 +1,62 @@ +# Reaper's Sky - Dedicated Server + +Everything needed to run the Reaper's Sky NeoForge **1.21.1** server (NeoForge +**21.1.248**) on Debian 13 (trixie). + +## Quick start (on the server box) + +```sh +sudo ./deploy.sh # installs Java 21 + curl/unzip, NeoForge, the 59 mods, config +./run.sh # start the server (run inside tmux/screen so it survives logout) +``` + +The first `./run.sh` generates the world. Wait for `Done (...)` in the console, +then connect with IP **`reaperofveriod.nl`** (port 25565). + +`deploy.sh` is idempotent — safe to re-run; it skips anything already in place +and verifies every mod by sha1 before installing. + +## What deploy.sh does + +| Step | Result | +|------|--------| +| System packages | `openjdk-21-jre-headless`, `curl`, `unzip` (needs root/`sudo`) | +| NeoForge server | Official installer from Maven → server files + `libraries/` | +| Mods | Downloads the 59 server-safe mods pinned in `mods.json`, sha1-verified | +| Config | `eula.txt` (EULA accepted), `server.properties` (IP, motd, 8 G) | +| Run script | `run.sh` with 8 GB + G1GC (`nogui`) | + +Install location defaults to `~/reaper-sky-server`. Override with `DIR=/path`, +memory with `MEMORY=6G`, etc.: + +```sh +sudo DIR=/srv/minecraft MEMORY=10G ./deploy.sh +``` + +## Keeping it running + +```sh +tmux new -s mc # new session +cd ~/reaper-sky-server && ./run.sh +# detach with Ctrl-b d, reattach later with: tmux attach -t mc +``` + +Stop the server cleanly with the console command `stop` (Ctrl-c also works). + +## Configuration notes + +- `server.properties` sets `online-mode=true` (Mojang authentication). Set it to + `false` in `~/reaper-sky-server/server.properties` to allow unauthenticated + clients, then restart. +- `difficulty=hard`, `spawn-protection=0`, `view-distance=10` are set for the + airship-focused, land-claim-friendly experience. +- The 19 client-only mods (Iris/shaders, Sodium, Minimap, Jade, JEI, etc.) are + intentionally excluded here — the server is pure gameplay logic. + +## Updating the pack + +1. Add/remove mods in the Prism instance `Reaper's Sky - dev`. +2. Rebuild + push the mrpack (see repo root `README.md`). +3. Re-run `server/build_mods.py` or regenerate `mods.json`, commit, push. +4. On the server: `git pull && sudo ./deploy.sh && ./run.sh` + (also remove any stale jars from `~/reaper-sky-server/mods/` first). \ No newline at end of file diff --git a/server/build_mods.py b/server/build_mods.py new file mode 100644 index 0000000..4cb5499 --- /dev/null +++ b/server/build_mods.py @@ -0,0 +1,92 @@ +#!/usr/bin/env python3 +"""Regenerate server/mods.json from the Prism instance's mods directory. + +For every .jar in the pack instance it: + - computes sha1 + - looks up the Modrinth download URL via the version_file API + (aero-shadow-fix is CurseForge-only, pinned manually) + - drops the 19 client-only mods +and writes the server manifest to mods.json. + +Usage: python3 build_mods.py +""" +import hashlib, json, os, subprocess, sys, time + +INSTANCE = os.path.expanduser( + "~/.local/share/PrismLauncher/instances/Reaper's Sky - dev/.minecraft/mods") +OUT = os.path.join(os.path.dirname(os.path.abspath(__file__)), "mods.json") +MC_VERSION = "1.21.1" +NEOFORGE_VERSION = "21.1.248" + +CLIENT_ONLY = { + "iris-neoforge-1.8.14-beta.1+mc1.21.1.jar", + "EuphoriaPatcher-1.9.3-r5.8.1-neoforge.jar", + "iris-flywheel-compat-NeoForge-2.3.1.jar", + "sodium-neoforge-0.8.12+mc1.21.1.jar", + "ImmediatelyFast-NeoForge-1.6.12+1.21.1.jar", + "entityculling-neoforge-1.10.5-mc1.21.1.jar", + "dynamic-fps-3.11.4+mc1.21.0-neoforge.jar", + "MouseTweaks-neoforge-mc1.21-2.26.1.jar", + "appleskin-neoforge-mc1.21-3.0.9.jar", + "Controlling-neoforge-1.21.1-19.0.5.jar", + "Searchables-neoforge-1.21.1-1.0.2.jar", + "skinlayers3d-neoforge-1.11.2-mc1.21.1.jar", + "xaerominimap-neoforge-1.21.1-26.4.2.jar", + "xaeroworldmap-neoforge-1.21.1-1.44.2.jar", + "Jade-1.21.1-NeoForge-15.10.6.jar", + "jade-sable-compat-1.3.0.jar", + "aero-shadow-fix.jar", + "aeronautics-propeller-blur-1.0a.jar", + "jei-1.21.1-neoforge-19.44.0.403.jar", +} + +CURSEFORGE_ONLY = { + "aero-shadow-fix.jar": "https://www.curseforge.com/api/v1/mods/1641969/files/8589529/download", +} + +UA = "opencode-pack-builder/1.0" + + +def sha1(path): + h = hashlib.sha1() + with open(path, "rb") as f: + for chunk in iter(lambda: f.read(65536), b""): + h.update(chunk) + return h.hexdigest() + + +def resolve(jar, digest): + if jar in CURSEFORGE_ONLY: + return CURSEFORGE_ONLY[jar] + r = subprocess.run( + ["curl", "-s", "--max-time", "20", "-H", f"User-Agent: {UA}", + f"https://api.modrinth.com/v2/version_file/{digest}?algorithm=sha1"], + capture_output=True, text=True) + try: + return json.loads(r.stdout)["files"][0]["url"] + except Exception: + return "" + + +def main(): + mods = [] + for jar in sorted(os.listdir(INSTANCE)): + if not jar.endswith(".jar"): + continue + if jar in CLIENT_ONLY: + print(f" skip (client-only): {jar}") + continue + digest = sha1(os.path.join(INSTANCE, jar)) + url = resolve(jar, digest) + if not url: + print(f" !! no URL for {jar} -- fix manually", file=sys.stderr) + mods.append({"file": jar, "url": url, "sha1": digest}) + time.sleep(0.1) + manifest = {"minecraft": MC_VERSION, "neoforge": NEOFORGE_VERSION, "mods": mods} + with open(OUT, "w") as f: + json.dump(manifest, f, indent=2) + print(f"Wrote {len(mods)} server mods to {OUT}") + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/server/deploy.sh b/server/deploy.sh new file mode 100755 index 0000000..7fb2cb3 --- /dev/null +++ b/server/deploy.sh @@ -0,0 +1,147 @@ +#!/usr/bin/env bash +# +# Reaper's Sky - dedicated server deploy script (Debian 13 / trixie) +# +# Installs everything needed to run the Reaper's Sky NeoForge 21.1.248 server: +# - OpenJDK 21 (JRE, headless) + curl/unzip +# - NeoForge 21.1.248 server via its official installer +# - the 59 server-safe mods (pinned in mods.json, verified by sha1) +# - eula.txt + server.properties (IP reaperofveriod.nl) +# - run.sh (8 GB, G1GC) +# +# Usage: sudo ./deploy.sh (installs packages, needs root/sudo) +# ./deploy.sh (idempotent; safe to re-run) +# +# Defaults: +# DIR = "$HOME/reaper-sky-server" +# MEMORY = 8G +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +NEOFORGE_VERSION="21.1.248" +MC_VERSION="1.21.1" +INSTALLER_URL="https://maven.neoforged.net/releases/net/neoforged/neoforge/${NEOFORGE_VERSION}/neoforge-${NEOFORGE_VERSION}-installer.jar" + +# --- config (override via env if you want) ------------------------------------ +SERVER_DIR="${DIR:-$HOME/reaper-sky-server}" +MEMORY="${MEMORY:-8G}" +SERVER_IP="${SERVER_IP:-reaperofveriod.nl}" +DEFAULT_MOTD="Reaper's Sky" +MOTD="${MOTD:-$DEFAULT_MOTD}" +MAX_PLAYERS="${MAX_PLAYERS:-10}" + +log() { printf '\033[1;34m[deploy]\033[0m %s\n' "$*"; } +die() { printf '\033[1;31m[deploy] ERROR:\033[0m %s\n' "$*" >&2; exit 1; } + +# --- 1. system packages (Debian 13 ships OpenJDK 21) -------------------------- +install_packages() { + if [ "$(id -u)" -ne 0 ]; then + if command -v sudo >/dev/null 2>&1; then SUDO="sudo"; else SUDO=""; fi + else + SUDO="" + fi + if command -v java >/dev/null 2>&1; then + log "Java already present: $(java -version 2>&1 | head -1)" + else + log "Installing openjdk-21-jre-headless, curl, unzip (apt)..." + ${SUDO:+sudo} apt-get update -qq + ${SUDO:+sudo} apt-get install -y -qq openjdk-21-jre-headless curl unzip + fi + java -version >/dev/null 2>&1 || die "Java 21 not available after install" +} + +# --- 2. NeoForge server -------------------------------------------------------- +install_neoforge() { + mkdir -p "$SERVER_DIR" + cd "$SERVER_DIR" + if [ -f "run.sh" ] && [ -d "libraries/net/neoforged/neoforge/$NEOFORGE_VERSION" ]; then + log "NeoForge $NEOFORGE_VERSION already installed." + return + fi + log "Downloading NeoForge $NEOFORGE_VERSION installer..." + curl -fL --retry 3 -o "neoforge-${NEOFORGE_VERSION}-installer.jar" "$INSTALLER_URL" + log "Running installer --installServer ..." + java -jar "neoforge-${NEOFORGE_VERSION}-installer.jar" --installServer + rm -f "neoforge-${NEOFORGE_VERSION}-installer.jar" + chmod +x run.sh +} + +# --- 3. server mods (verified by sha1) ----------------------------------------- +install_mods() { + [ -f "$SCRIPT_DIR/mods.json" ] || die "mods.json not found next to deploy.sh" + mkdir -p "$SERVER_DIR/mods" + cd "$SERVER_DIR/mods" + python3 - "$SCRIPT_DIR/mods.json" <<'PY' +import json, sys, hashlib, subprocess, os +manifest = json.load(open(sys.argv[1])) +for m in manifest["mods"]: + fname, url, want = m["file"], m["url"], m["sha1"] + tmp = fname + ".part" + if os.path.exists(fname): + h = hashlib.sha1() + with open(fname, "rb") as fh: + for b in iter(lambda: fh.read(65536), b""): + h.update(b) + if h.hexdigest() == want: + continue # already present & correct + subprocess.run(["curl", "-fL", "--retry", "3", "-o", tmp, url], check=True) + h = hashlib.sha1() + with open(tmp, "rb") as fh: + for b in iter(lambda: fh.read(65536), b""): + h.update(b) + if h.hexdigest() != want: + os.unlink(tmp) + raise SystemExit(f"sha1 mismatch for {fname}") + os.rename(tmp, fname) + print(f" + {fname}") +PY + log "Mods ready: $(ls -1 "$SERVER_DIR/mods"/*.jar | wc -l) jars installed." +} + +# --- 4. eula + server.properties ----------------------------------------------- +write_config() { + cd "$SERVER_DIR" + if [ ! -f eula.txt ]; then + printf 'eula=true\n' > eula.txt + log "Accepted Minecraft EULA (eula.txt)." + fi + cat > server.properties < "$SERVER_DIR/run.sh" <<'EOF' +#!/usr/bin/env bash +cd "$(dirname "$(readlink -f "$0")")" +exec java -XmsMEMORY -XmxMEMORY -XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 \ + @libraries/net/neoforged/neoforge/NEOFORGE_VERSION/unix_args.txt nogui +EOF + sed -i "s/MEMORY/$MEMORY/g; s/NEOFORGE_VERSION/$NEOFORGE_VERSION/g" "$SERVER_DIR/run.sh" + chmod +x "$SERVER_DIR/run.sh" + log "Wrote run.sh ($MEMORY RAM). Start with: cd $SERVER_DIR && ./run.sh" +} + +install_packages +install_neoforge +install_mods +write_config +write_run + +log "Done. Reaper's Sky server is at: $SERVER_DIR" +log "First boot generates the world. Run it with: cd $SERVER_DIR && ./run.sh" +log "Console: run inside tmux/screen so it keeps running when you disconnect." +log "To stop later: use the server console command stop" \ No newline at end of file diff --git a/server/mods.json b/server/mods.json new file mode 100644 index 0000000..fb07791 --- /dev/null +++ b/server/mods.json @@ -0,0 +1,301 @@ +{ + "minecraft": "1.21.1", + "neoforge": "21.1.248", + "mods": [ + { + "file": "Apotheosis-1.21.1-8.7.0.jar", + "url": "https://cdn.modrinth.com/data/rqFWfVlz/versions/wB4eASdJ/Apotheosis-1.21.1-8.7.0.jar", + "sha1": "5537a71726a0f6a4c74257f26eeeea060a7327c4" + }, + { + "file": "ApothicAttributes-1.21.1-2.10.1.jar", + "url": "https://cdn.modrinth.com/data/DGaH8Rh0/versions/Xtaunf84/ApothicAttributes-1.21.1-2.10.1.jar", + "sha1": "cdcf0c7a6398913efa76b5b4e41e4fb67033156e" + }, + { + "file": "ApothicEnchanting-1.21.1-1.6.1.jar", + "url": "https://cdn.modrinth.com/data/pL8MtgqY/versions/56c0M28v/ApothicEnchanting-1.21.1-1.6.1.jar", + "sha1": "1644e9da873f36cf9875e4ad351ef458756c347e" + }, + { + "file": "ApothicSpawners-1.21.1-1.4.0.jar", + "url": "https://cdn.modrinth.com/data/DfxVkOAO/versions/pWfxcfO2/ApothicSpawners-1.21.1-1.4.0.jar", + "sha1": "b3be29751daea738e691db8949cce079e5aae3be" + }, + { + "file": "Clumps-neoforge-1.21.1-19.0.0.1.jar", + "url": "https://cdn.modrinth.com/data/Wnxd13zP/versions/jo7lDoK4/Clumps-neoforge-1.21.1-19.0.0.1.jar", + "sha1": "fa2576297c7bd12b28aa7070e8141792bd66da4c" + }, + { + "file": "Design-n-Decor-1.21.1-2.2b.jar", + "url": "https://cdn.modrinth.com/data/x49wilh8/versions/uQsIRky8/Design-n-Decor-1.21.1-2.2b.jar", + "sha1": "ff5f0411a3d82e15d69b65617128f6d54e818e1b" + }, + { + "file": "ExplorersCompass-1.21.1-3.4.0-neoforge.jar", + "url": "https://cdn.modrinth.com/data/RV1qfVQ8/versions/hIJ2Ev1Q/ExplorersCompass-1.21.1-3.4.0-neoforge.jar", + "sha1": "9f62af344988a6e2d855b113e61cf0e1611c7e0f" + }, + { + "file": "FarmersDelight-1.21.1-1.3.3.jar", + "url": "https://cdn.modrinth.com/data/R2OftAxM/versions/wpkbWnVh/FarmersDelight-1.21.1-1.3.3.jar", + "sha1": "55ea87dec84a632690a748857db08a35941980b6" + }, + { + "file": "GlitchCore-neoforge-1.21.1-2.1.0.2.jar", + "url": "https://cdn.modrinth.com/data/s3dmwKy5/versions/S2TfWrZR/GlitchCore-neoforge-1.21.1-2.1.0.2.jar", + "sha1": "e3d4bb80a06f619be989ab529d0cd4e33e076943" + }, + { + "file": "NaturesCompass-1.21.1-3.4.0-neoforge.jar", + "url": "https://cdn.modrinth.com/data/fPetb5Kh/versions/nFniEtJV/NaturesCompass-1.21.1-3.4.0-neoforge.jar", + "sha1": "e19721873bebc4dbc1674bb101af39d0ea406b95" + }, + { + "file": "Patchouli-1.21.1-93-NEOFORGE.jar", + "url": "https://cdn.modrinth.com/data/nU0bVIaL/versions/BIogJv2D/Patchouli-1.21.1-93-NEOFORGE.jar", + "sha1": "5413bb9b8fc35ebe46b06b48bf9afafbd8471140" + }, + { + "file": "Placebo-1.21.1-9.9.2.jar", + "url": "https://cdn.modrinth.com/data/tCkE8p2N/versions/1Ypo4tf4/Placebo-1.21.1-9.9.2.jar", + "sha1": "d44335094cf2db64998cb3ee31e58d8c01e80b4a" + }, + { + "file": "Terralith_1.21.1_v2.6.2_Neoforge.jar", + "url": "https://cdn.modrinth.com/data/8oi3bsk5/versions/IY93YaEe/Terralith_1.21.1_v2.6.2_Neoforge.jar", + "sha1": "d4a9fe71b841f70edfb4b280f9bf5c58e4a28224" + }, + { + "file": "ToughAsNails-neoforge-1.21.1-10.1.0.13.jar", + "url": "https://cdn.modrinth.com/data/ge1sOdFH/versions/mboAbksk/ToughAsNails-neoforge-1.21.1-10.1.0.13.jar", + "sha1": "38046bbfcd35cb1eb2bd17d9a9c3428b9750a82a" + }, + { + "file": "WeightedInventory-1.21.1-2.2.0.jar", + "url": "https://cdn.modrinth.com/data/4hc3F83g/versions/qR45xqMV/WeightedInventory-1.21.1-2.2.0.jar", + "sha1": "8d4c5b5191b0ebf980a81b882a47435cbb6eae31" + }, + { + "file": "YungsApi-1.21.1-NeoForge-5.1.7.jar", + "url": "https://cdn.modrinth.com/data/Ua7DFN59/versions/8Zmd0JGx/YungsApi-1.21.1-NeoForge-5.1.7.jar", + "sha1": "1c2e7b0d294690f9ed5e6627ba28182605543654" + }, + { + "file": "YungsBetterDesertTemples-1.21.1-NeoForge-4.1.5.jar", + "url": "https://cdn.modrinth.com/data/XNlO7sBv/versions/GQ9iNWkI/YungsBetterDesertTemples-1.21.1-NeoForge-4.1.5.jar", + "sha1": "90529257dbd92558998c65178294bc7b2fd16a64" + }, + { + "file": "YungsBetterDungeons-1.21.1-NeoForge-5.1.4.jar", + "url": "https://cdn.modrinth.com/data/o1C1Dkj5/versions/D6aZn0Em/YungsBetterDungeons-1.21.1-NeoForge-5.1.4.jar", + "sha1": "73a660c13063450e555e5e2c015ae24d606b32b4" + }, + { + "file": "YungsBetterStrongholds-1.21.1-NeoForge-5.1.3.jar", + "url": "https://cdn.modrinth.com/data/kidLKymU/versions/8U0dIfSM/YungsBetterStrongholds-1.21.1-NeoForge-5.1.3.jar", + "sha1": "5d06a5850af7c577612d4592706a8e156bbe1cbf" + }, + { + "file": "aeronautics-covers-1.0.1.jar", + "url": "https://cdn.modrinth.com/data/eWrKPy9E/versions/R35biaZf/aeronauticscovers-1.21.1-NeoForge-1.0.1.jar", + "sha1": "c4404a98d85c75e5e80ace462c3ed1bdf0b1c93e" + }, + { + "file": "aeronautics-dyeable-components-1.0.4.jar", + "url": "https://cdn.modrinth.com/data/LBYQlFkX/versions/kOW3VwPl/dyeable-components-1.0.4%2Bmc1.21.1.jar", + "sha1": "caf60f71d89a3068cd07283f45bffc31704a7474" + }, + { + "file": "aeronautics-gadgets-and-gizmos-1.1.3.jar", + "url": "https://cdn.modrinth.com/data/Sza3GgEL/versions/vQlkDgnK/createthrusters-bundled-V1.1.3.jar", + "sha1": "d29df5e23a6aee1171b08b424d73c02d6fc3dd6e" + }, + { + "file": "aeronautics-portable-engine-liquid-fuel-2.0.0.jar", + "url": "https://cdn.modrinth.com/data/HLbPoouI/versions/L6KPVFxI/portable_engine_liquid_fuel-2.0.0-neoforge-1.21.1.jar", + "sha1": "f9602c7f9a8268507a835bfa47db1512d356dae7" + }, + { + "file": "aeroworks-1.4.2.jar", + "url": "https://cdn.modrinth.com/data/P26k79kP/versions/tQ0dgIjI/aeroworks-1.4.2.jar", + "sha1": "3aad876e7a97236925da6ec61c8f176394e61a99" + }, + { + "file": "ars_nouveau-1.21.1-5.13.0.jar", + "url": "https://cdn.modrinth.com/data/TKB6INcv/versions/ugLa4qlw/ars_nouveau-1.21.1-5.13.0.jar", + "sha1": "b8d71856fd76d89573e6976f2461ea7385a3fff7" + }, + { + "file": "balm-neoforge-1.21.1-21.0.65.jar", + "url": "https://cdn.modrinth.com/data/MBAkmtvl/versions/KgypwTqX/balm-neoforge-1.21.1-21.0.65.jar", + "sha1": "69e0b3b69dd23c132e85b7e82310f45ae96b263d" + }, + { + "file": "cable_facades-1.21.1-NeoForge-2.1.3.jar", + "url": "https://cdn.modrinth.com/data/twipgzWx/versions/fhYja6UD/cable_facades-1.21.1-NeoForge-2.1.3.jar", + "sha1": "52d5edbf92af50ab258565b51836c7e4ba9dc6e9" + }, + { + "file": "carryon-neoforge-1.21.1-2.2.6.13.jar", + "url": "https://cdn.modrinth.com/data/joEfVgkn/versions/PV8oLZ1q/carryon-neoforge-1.21.1-2.2.6.13.jar", + "sha1": "2ceb0d9284525b6cb2a214c88cf6511cab91f601" + }, + { + "file": "copycats-3.0.6+mc.1.21.1-neoforge.jar", + "url": "https://cdn.modrinth.com/data/UT2M39wf/versions/DVQFhrV3/copycats-3.0.6%2Bmc.1.21.1-neoforge.jar", + "sha1": "0e683c5d3db4942899453fd93054ac0a926c7ef8" + }, + { + "file": "corpse-neoforge-1.21.1-1.1.13.jar", + "url": "https://cdn.modrinth.com/data/WrpuIfhw/versions/Zwf8nv8y/corpse-neoforge-1.21.1-1.1.13.jar", + "sha1": "a735362c4e5ef705956f1fcbac01fb9f1aae5b8e" + }, + { + "file": "create-1.21.1-6.0.10.jar", + "url": "https://cdn.modrinth.com/data/LNytGWDc/versions/UjX6dr61/create-1.21.1-6.0.10.jar", + "sha1": "0e97e49837bed766e6f28a4c95b04885d6acc353" + }, + { + "file": "create-aeronautics-bundled-1.21.1-1.3.1.jar", + "url": "https://cdn.modrinth.com/data/oWaK0Q19/versions/Vzp221Un/create-aeronautics-bundled-1.21.1-1.3.1.jar", + "sha1": "15d273d891578d583aa142354b63ed70f87fee62" + }, + { + "file": "create-confectionery1.21.1_v1.1.3b.jar", + "url": "https://cdn.modrinth.com/data/WPE5gRs9/versions/ndnETBEN/create-confectionery1.21.1_v1.1.3b.jar", + "sha1": "47e235efa862c5cbea53fdf8346d4c499674defa" + }, + { + "file": "create-new-age-1.2.0+neoforge-mc1.21.1.jar", + "url": "https://cdn.modrinth.com/data/FTeXqI9v/versions/IwtuwMZy/create-new-age-1.2.0%2Bneoforge-mc1.21.1.jar", + "sha1": "849df57070ffa75c2446b9c460d03f6b49fa089e" + }, + { + "file": "create-simulated-thrusters-1.0.1.jar", + "url": "https://cdn.modrinth.com/data/EAUfbep8/versions/GFGgvio1/create_simulated_thrusters-1.21.1-NeoForge-1.0.1.jar", + "sha1": "bddb8bcbfe49231e196d1d40c8178aaf4dbebae5" + }, + { + "file": "create-the-air-war-4.67.jar", + "url": "https://cdn.modrinth.com/data/GMrNnOis/versions/JnF14u1u/create_the_air_wars-4.67.jar", + "sha1": "8e5ba8f70df9a64bb51b9bfe35a01476873f014d" + }, + { + "file": "create_connected-1.3.2-mc1.21.1.jar", + "url": "https://cdn.modrinth.com/data/Vg5TIO6d/versions/klOWKza5/create_connected-1.3.2-mc1.21.1.jar", + "sha1": "920de05b13c32fe1417d0aec0615057aa480cc8d" + }, + { + "file": "create_jetpack-forge-5.2.1.jar", + "url": "https://cdn.modrinth.com/data/UbFnAd4l/versions/sCwiqLqq/create_jetpack-forge-5.2.1.jar", + "sha1": "cbd949c62723d805c2ab019def6e6718c50037b8" + }, + { + "file": "createbigcannons-5.11.7+mc.1.21.1.jar", + "url": "https://cdn.modrinth.com/data/GWp4jCJj/versions/bOiDu0LS/createbigcannons-5.11.7%2Bmc.1.21.1.jar", + "sha1": "c90ee0b2142e2c58d233e150cb3a24c7cb07eb2d" + }, + { + "file": "createdieselgenerators-1.21.1-1.3.15.jar", + "url": "https://cdn.modrinth.com/data/ZM3tt6p1/versions/UoPH8lO1/createdieselgenerators-1.21.1-1.3.15.jar", + "sha1": "7f751dabfa83c141c1d13025cd16f06553ba459b" + }, + { + "file": "curios-neoforge-9.5.1+1.21.1.jar", + "url": "https://cdn.modrinth.com/data/vvuO3ImH/versions/yohfFbgD/curios-neoforge-9.5.1%2B1.21.1.jar", + "sha1": "418fcd42e3a7844c9bdc71c9b6401fdb3894e0c4" + }, + { + "file": "deployer-0.1.2.jar", + "url": "https://cdn.modrinth.com/data/OZhUIuou/versions/XrLW2FiE/deployer-0.1.2.jar", + "sha1": "c3d2d9baad2e714cb8bf8ae6df9bc9cac6e87c1c" + }, + { + "file": "ends_delight-2.6.1+neoforge.1.21.1.jar", + "url": "https://cdn.modrinth.com/data/yHN0njMr/versions/YTApg6Hl/ends_delight-2.6.1%2Bneoforge.1.21.1.jar", + "sha1": "0613a535d82b7a3d51d0caf0e04b082cb4c062e9" + }, + { + "file": "expandeddelight-0.1.4.jar", + "url": "https://cdn.modrinth.com/data/e9V6wFcR/versions/RTRYPIJp/expandeddelight-0.1.4.jar", + "sha1": "cf26fe18c3a9deec525fe0f0e7c2d3b9f4e9f484" + }, + { + "file": "ferritecore-7.0.3-neoforge.jar", + "url": "https://cdn.modrinth.com/data/uXXizFIs/versions/x7kQWVju/ferritecore-7.0.3-neoforge.jar", + "sha1": "9563692efb708b6b568df27a01ec52f6311928ef" + }, + { + "file": "geckolib-neoforge-1.21.1-4.9.2.jar", + "url": "https://cdn.modrinth.com/data/8BmcQJ2H/versions/tPkJmim6/geckolib-neoforge-1.21.1-4.9.2.jar", + "sha1": "14c64013cadee7d28f3685f94350f9a4d2ec6d86" + }, + { + "file": "irons_lib-1.21.1-2.1.0.jar", + "url": "https://cdn.modrinth.com/data/9nfaJPtX/versions/sQyzhxuH/irons_lib-1.21.1-2.1.0.jar", + "sha1": "70fba64d12b6ff9553580e52101d989c89297797" + }, + { + "file": "irons_spellbooks-1.21.1-3.16.3.jar", + "url": "https://cdn.modrinth.com/data/s4OWxYQQ/versions/slKLosTb/irons_spellbooks-1.21.1-3.16.3.jar", + "sha1": "e8832385c01db56b9fcb19c48fcedc76a3a70d92" + }, + { + "file": "kotlinforforge-5.12.0-all.jar", + "url": "https://cdn.modrinth.com/data/ordsPcFz/versions/uhJhCT7X/kotlinforforge-5.12.0-all.jar", + "sha1": "d10d062caf1aad9aec82d7852f2fee1781735c1f" + }, + { + "file": "lithium-neoforge-0.15.4+mc1.21.1.jar", + "url": "https://cdn.modrinth.com/data/gvQqBUqZ/versions/DDUrRVCA/lithium-neoforge-0.15.4%2Bmc1.21.1.jar", + "sha1": "97212e45c963730bbfc7c44780df99317814c21b" + }, + { + "file": "lithostitched-1.8.0+beta4-neoforge-21.1.jar", + "url": "https://cdn.modrinth.com/data/XaDC71GB/versions/81DDKTGJ/lithostitched-1.8.0%2Bbeta4-neoforge-21.1.jar", + "sha1": "0edda78ec8500143cca898881c476b2b04dac75a" + }, + { + "file": "modernfix-neoforge-5.27.20+mc1.21.1.jar", + "url": "https://cdn.modrinth.com/data/nmDcB62a/versions/VsJnrw8k/modernfix-neoforge-5.27.20%2Bmc1.21.1.jar", + "sha1": "bc1a70e72e7dba8a3ff41404765fdd03a7ac6575" + }, + { + "file": "player-animation-lib-forge-2.0.4+1.21.1.jar", + "url": "https://cdn.modrinth.com/data/gedNE4y2/versions/HJZB6bmA/player-animation-lib-forge-2.0.4%2B1.21.1.jar", + "sha1": "05be8ddcc78532b9a5520c718edc6c971cd0057c" + }, + { + "file": "railways-0.3.0-beta.2+neoforge-mc1.21.1.jar", + "url": "https://cdn.modrinth.com/data/L3Jv0QZI/versions/czVeSmZo/railways-0.3.0-beta.2%2Bneoforge-mc1.21.1.jar", + "sha1": "82a28ce51fdbc583477d7ae7c4c94cc6d23ec2b4" + }, + { + "file": "ritchiesprojectilelib-2.1.2+mc.1.21.1-neoforge.jar", + "url": "https://cdn.modrinth.com/data/B3pb093D/versions/hZ6B2Z0x/ritchiesprojectilelib-2.1.2%2Bmc.1.21.1-neoforge.jar", + "sha1": "ec2e4996f8bee8714173e603e379fef8a6901765" + }, + { + "file": "sable-neoforge-1.21.1-2.0.5.jar", + "url": "https://cdn.modrinth.com/data/T9PomCSv/versions/U678xqle/sable-neoforge-1.21.1-2.0.5.jar", + "sha1": "05f666e973d32baaaf405acb9bbed6615b909971" + }, + { + "file": "simulated-gauges-1.1.0.jar", + "url": "https://cdn.modrinth.com/data/AwDdvIWn/versions/LWK7hUmm/simulated_gauges-1.1.0.jar", + "sha1": "3588378ea8d5e424ecd00fdaa16a4e3355f09365" + }, + { + "file": "spark-1.10.124-neoforge.jar", + "url": "https://cdn.modrinth.com/data/l6YH9Als/versions/v5qtqRQi/spark-1.10.124-neoforge.jar", + "sha1": "9430cc2ab64ff89d698be593769fb9f9ee4efae6" + }, + { + "file": "waystones-neoforge-1.21.1-21.1.41.jar", + "url": "https://cdn.modrinth.com/data/LOpKHB2A/versions/fxszxKRW/waystones-neoforge-1.21.1-21.1.41.jar", + "sha1": "ce8f17600506c2a201c6eb5ff50e16d39f775ad6" + } + ] +} \ No newline at end of file