Commit Graph
53 Commits
Author SHA1 Message Date
logan a84319bb2f fix(mods): add MidnightLib 1.10.0 to fix startup CME crash
Fright's Delight jar-in-jars MidnightLib 1.9.2, whose MidnightConfig.init
races during NeoForge parallel mod construction (ConcurrentModificationException).
The broken mod state left mod_resources unloaded, so WATUT's reloadShaders
mixin crashed on particle.json - WATUT was the victim, not the cause.
1.10.0 synchronizes the entries map (upstream 1fe69729); FML selects it over
the JiJ copy. Verified: 10/10 clean cold launches to world join.

Also adds analysis/state/ (Phase 2 state capture).
2026-10-15 17:07:52 -04:00
Onion Agent e5e369a693 chore(bench): add client bench harness and Phase 2 handoff
The client now boots cleanly on the bench machine (the CAC spawn-key
crash was fixed in 8e8483d). Add the harness used to drive bench scenes
and capture frametimes, the bench-world generation workflow, and a
self-contained handoff brief. All files live under analysis/ (packwizignored),
so nothing player-facing changes.

- harness/rcon.py: minimal RCON client for the temp worldgen server
- harness/run_scene.py: apply variant -> launch Prism under MangoHud ->
  xdotool scene commands -> p50/p95/p99/1%-low from the CSV
- HANDOFF.md: state, gotchas, next steps
- build.py: disable DH autoUpdater for bench variants (suppress modal)
2026-10-14 23:16:31 -04:00
logan 8e8483d072 fix(config): correct Critters and Companions spawn keys to snake_case
YACL serialises config with FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES
(and serializeNulls), so the camelCase keys biomeSpec, leafInsect, seaBunny,
stagBeetle, rolyPoly and stickBug were never read. Every SpawnEntry then
deserialised with biomeSpec = null, and CAC 2.7.0's SpawnEntry.isTag() calls
biomeSpec.startsWith("#") without a null check, crashing FMLCommonSetup on
both the dedicated server and the client.

Rename the keys; all tuned weights and biome specs are unchanged. Missing
keys still fall back to mod defaults (partial file). Refresh the index and
pack hashes.
2026-10-14 20:55:13 -04:00
logan 611a1a5952 docs: client-perf analysis, bench harness and work journal
Everything the next agent needs to run the Phase 2 optimisation loop on a
machine that can launch the client:

- analysis/client-perf/: LEVERS (ranked levers + corrections), BENCH-MATRIX
  (world, scenes, config IDs, blocks B0-B14 with decision rules),
  PLAYER-TUNING, SPAWN-TUNING, research briefs, the jar scanner and its
  output, observed default configs, and proposed-configs/ (build.py
  generates tiers and bench variants and fails on unknown keys;
  apply_variant.py applies a variant and merges options.txt).
- analysis/client-perf/bench/onion-bench/: bench-world datapack (scene
  teleports, Create grid, mob pen, sound storm, 120 s teleport tour).
- analysis/audit/: the static recipe/dependency audit, including gen_fixes.py,
  which generates the shipped Paxi datapack and was never tracked.
- phase0/: per-machine measurement harness (Steam Deck, 7700K/1060,
  6700K/1080 Ti).
- .pi/journal.md: running work log; read it first.

All of it is packwizignored, so nothing here ships to players.
2026-10-14 18:15:32 -04:00
logan d80f85b3f6 feat(config): moderate spawn tuning for Alex's Mobs, Fowl Play, Critters
Every visible entity multiplies the client render cost (vanilla, EMF/FA,
GeckoLib, ETF, dynamic lights) and the server tick. These cuts target only the
species that are heavy by weight x group size. Rare mobs keep their defaults.

- Alex's Mobs: halve 9 common weights (gazelle and capuchin herds, straddler,
  rocky roller, underminer, elephant, blobfish, mudskipper, caiman).
- Fowl Play: lower duck/goose/gull/sparrow weights and max group sizes
  (upstream #214, ~400 ducks on rivers, is still open in 1.2.3).
- Critters and Companions: about 40% off sea bunnies and the forest/lush bug
  rules. It does have a spawn config; configVersion 2 skips its v1->v2
  migration.

All three are partial files. NeoForge (TOML) and YACL 3.8.2 (JSON5) keep
defaults for missing keys. Shipped enforced from config/ because the server
reads them from this repo. Details and the B14 measurement plan:
analysis/client-perf/SPAWN-TUNING.md.
2026-10-14 18:14:50 -04:00
logan 5919955548 chore(analysis): archive finished reviews, drop stale duplicates
Move the completed 2026-09 candidate review (MODLIST-REVIEW/-GROUPS,
CANDIDATE-APPENDIX, PACK-CONTEXT), FINDINGS.md and the shipped FTB Chunks swap
write-up into analysis/archive/, with a README mapping their old paths. The
review's build pieces, subagent intermediates and Modrinth API dumps are
deleted: the assembled reports carry their content. MODLIST-GROUPS.md was a
byte-for-byte duplicate of analysis/groups-table.md.

Also: drop the now-pointless FINDINGS/MODLIST packwizignore lines (analysis/
covers the archive), and gitignore *.tar.gz so the 650 MB map-migration world
tarball can't be committed by accident.
2026-10-14 18:08:48 -04:00
logan a01bc3b2f1 feat(perf): ship client perf defaults via Default Options, add perf mods
Pack-side half of the client performance work (analysis/client-perf/).

- Add Default Options 21.1.8 (client). It copies config/defaultoptions/
  options.txt and extra/** into place only when the target is absent, so
  player changes are never clobbered. It is also client-only. packwiz
  `preserve` would also land these files in this repo's server config, which
  matters for DistantHorizons.toml [server]/[common] and SSRD's COMMON config.
- Seed provisional mid-tier defaults generated by
  analysis/client-perf/proposed-configs/build.py --ship: render distance 8,
  DH LOD radius 128 / SSAO off / 2 threads, EMF animation LOD 12, Flywheel
  TRI_LINEAR lighting, LambDynamicLights fast, SSRD 16 chunks, Sound Physics
  16 rays / 2 bounces plus per-tick caps on noisy Create sounds. All values
  are unmeasured; Phase 2 (BENCH-MATRIX.md) replaces them. ModernFix
  dynamic_resources is held back until bench block B6 passes.
- Add Sodium Extra 0.9.4, Reese's Sodium Options 2.2.4, BadOptimizations
  2.4.1 and Particle Core 0.3.3 (all client-side). Their declared ranges match
  the pins (Sodium 0.8.13, fzzy_config, Kotlin for Forge).
- Bump Puzzles Lib 21.1.62 -> 21.1.64 as a bugfix: 21.1.63 restores dropped
  access transformers. The event-cache change in 21.1.64 is Fabric-only.
2026-10-14 18:05:45 -04:00
logan aa1d2739f1 feat(mods): add Doggy Talents Next, drop Etched and Grassier Grass
Doggy Talents Next 1.19.1 (NeoForge 1.21.1) overhauls the wolf with a
talent/bond system and companion AI. Better Dogs X DTN 1.2.2 adds its
cosmetic skins; Modrinth only lists a 1.21 NeoForge build, but its
mods.toml declares neoforge >=20.5 and minecraft >=1.18.2, so it loads
on the pack's 21.1.251.

Remove Etched: a second disc/recording pipeline beside music-disc-maker,
duplicating blank discs, boomboxes and albums.

Remove Grassier Grass: its only open risk was shader compatibility with
the shipped Complementary Reimagined.
2026-10-13 18:32:01 -04:00
logan fc649b4ecd fix(pack): add Paxi datapack resolving cross-mod recipe collisions
A static audit of every jar found recipes that shadow each other, so one
output becomes uncraftable depending on load order. Paxi (whose only
dependency, YUNG's API, is already in the pack) loads a global datapack
above mod data to fix them:

- Potato: extradelight, moredelight and rusticdelight all cut a potato with
  a knife. Chain them instead (potato -> rustic slices -> extradelight
  sliced, slices -> moredelight diced) so each keeps its yield.
- Drop rustic potato slices from c:crops/potato (re-cut/stew dupe loop) and
  raw rustic coffee beans from c:crops/coffee/cooked.
- Bread slices, Twilight Forest knives, poisonous potato / rotten tomato /
  apple / cucumber / coffee crates: keep one recipe each.
- Handcrafted sheets shadowed Comforts sleeping bags, and its wood plate
  shadowed every Twilight Forest drying rack: give them distinct patterns.
- Fisherman's Haven worms can had two outputs: keep one, add conversions.
- Pin rustic's beef stew (extradelight disables it: load-order roulette)
  and gate Twilight Delight's Neapolitan-only ice creams.

The datapack is generated by analysis/audit/gen_fixes.py (not shipped).
.packwizignore re-includes it directory by directory because packwiz skips
ignored directories outright.
2026-10-06 23:42:42 -04:00
logan e7d6691466 feat(pack): ship offline usernamecache to clients for Jade
Jade resolves tamed-animal owner names client-side; its Mojang profile
lookup can't resolve offline-mode UUIDs and it falls back to NeoForge's
UsernameCache, which the client loads from <game>/usernamecache.json.
Ship that file (side = "client", installed at the game root) so migrated
owners stop showing as "???".

Maintain the mapping with tools/sync-usernamecache.py after new logins.
2026-10-06 23:28:00 -04:00
logan 0adfb6c656 feat(pack): add Icy's Better Horses and its Modonomicon dependency
Icy's Better Horses declares client_side/server_side as required, so it ships
to both sides. It hard-requires Modonomicon [1.120.4,) on BOTH sides, which the
pack was missing; GeckoLib [4.7.5,) is already present at 4.9.3, and
cloth-config (optional) is already present too.

Pinned to the NeoForge 1.21.1 builds: Modrinth lists two different files both
numbered 2.1.0.1 (Forge/1.20.1 and NeoForge/1.21.1), and resolving by version
number alone silently picks the wrong one.

Also ignore shaderpacks/*.zip and xaero-migration-kit/ in .packwizignore. The
former duplicated the existing .pw.toml metafiles and the latter is local
migration scratch that the file already says must never ship, but packwiz
refresh was indexing both into the pack.
2026-10-06 19:43:10 -04:00
logan e36bff8a4d chore(pack): pin Akashic Tome's whitelist to this pack's guidebooks
Enumerated every guidebook-type item across all 209 mods (30 items) and pinned
them explicitly in config/akashictome-common.toml.

Finding: no config was strictly required. Akashic Tome's "Whitelisted Names"
substring-matches the item's registry PATH (verified from AttachementRecipe
bytecode: getPath + toLowerCase + contains, with getHoverName and
getDescriptionId absent), and the shipped 15-entry default list already covers
every book in this pack. The explicit id list is what keeps the tome working
if that name list is ever trimmed.

All Patchouli books share the single item id patchouli:guide_book and cannot
be listed individually. They still morph under their real owning mod, because
Patchouli's ItemModBook overrides getCreatorModId to return the book's owner.

Also drops the shipped defaults' whitelist ids and mod aliases, which all
reference mods that are not installed.
2026-10-06 19:12:36 -04:00
logan 387ee1ef9b chore(pack): make config files opt-in and ship a PetProtect default
.packwizignore ignored config/ and defaultconfigs/ wholesale. They are now
ignored per-entry (config/*) with deliberately authored files re-included at
the bottom of the file, so one config can ship without any risk of pulling
every runtime-generated config into the index - which matters because this
repo doubles as a server directory.

Ships config/petprotect.json disabling BOTH pet damage and death protection.
PetProtect's isInvulnerableTo mixin gates on prevent_pet_damage alone, so
disabling prevent_pet_death by itself leaves pets invulnerable to nearly all
damage and Pet Cemetery's death -> collar -> respawn loop still never fires.
prevent_pet_attack remains true, so pets are not provoked into fights.

Without this file the two mods cancel each other: PetProtect's defaults keep
pets immortal, so Pet Cemetery is dead weight.

The config installs on clients as well as the server; that is harmless since
petprotect itself is side = "server", but packwiz has no per-file side flag
for non-metafile entries.
2026-10-06 18:27:42 -04:00
logan e371e51856 feat(pack): add gameplay, media and social mods
etched, findme, emojiful, what-are-they-up-to, akashic-tome, chalk-mod,
  mermod, too-many-bows, tarotcards-remastered, comforts, room-for-two,
  playerrevive, charta, minopp, waystones-teleport-pets

findme is side = "both" because its search-across-inventories feature is
server-backed; emojiful's jar self-declares CLIENT despite Modrinth
reporting server_side required, so the server copy is inert.

tarotcards-remastered, room-for-two and too-many-bows reuse identical
version_number strings across the 1.21.1 / 1.21.11 / 26.x builds; packwiz
resolved all three to the correct 1.21.1 filenames, but keep that in mind
when bumping them by hand.
2026-10-06 18:26:49 -04:00
logan b6ebdb850d feat(pack): add Farmer's Delight expansions, decoration and pet mods
Farmer's Delight addons (pack already ran FD 1.21.1-1.3.4 plus 7 Delights):
  extradelight, veggies-delight, fruits-delight, rustic-delight,
  more-delight, miners-delight, dungeons_delight, barbeques-delight-forge,
  frights-delight, overweight-farming, fishermans-haven

Decoration / worldgen:
  portfolio (jar, not the datapack - it ships the client textures),
  items-displayed-forge, sooty-chimneys, mystical-oak-tree

Mobs and pets:
  fowlplay, pet-cemetery, petprotect,
  friends-and-foes-flowery-mooblooms-forge

Deliberately excluded: expanded-delight (beta-only, built against the FD
1.2.4 line), hearth-and-harvest (no per-crop config, so its corn/peanut/
cotton/salt/blueberry duplicates could not be trimmed, and dropping it also
removes two cutting-board collisions).

petprotect is forced to side = "server": Modrinth marks it client_side
unsupported and its mixins cancel pet damage, so client-side installation
risks damage-prediction divergence. packwiz only special-cases client-only
mods, so this needs re-applying if the metafile is ever rewritten by
"packwiz update".
2026-10-06 18:26:30 -04:00
logan 455e398018 feat(pack): add 14 client-side mods and 12 supporting libraries
Client QoL / visual / audio:
  grassier-grass, perception, inventory-particles, fwa,
  advancement-plaques, keybind-atlas, held-item-tooltips, zume, sound,
  extreme_sound_muffler, now-playing, cat_jam, loot-journal,
  travelers-titles

Libraries:
  moonlight, shatterbyte-lib (OctoLib), runiclib, delight-lib,
  lodestonelib, mossylib, puzzles-lib, mru, fragmentum, smartbrainlib,
  blueprint, coroutil

perception and sound carry side = "client", so neither is installed on the
dedicated server.

Two of the libraries are dependencies that Modrinth metadata does not
declare, so packwiz cannot resolve them automatically: perception hard-links
OctoLib and dungeons_delight links runiclib. Adding them up front means the
later stages resolve without a missing-class crash.
2026-10-06 18:25:44 -04:00
logan 86b6620fba feat(pack): add Immersive Paintings
Drag-and-drop custom paintings that work on servers. NeoForge 1.21.1
build 0.7.9; required dependency Fzzy Config is already in the pack.
2026-10-06 14:55:43 -04:00
logan 07ec53727e feat(pack): add Music Disc Maker
Craft playable music discs from YouTube/Spotify/SoundCloud links.
NeoForge 1.21.1 build 3.0.5; no new dependencies.
2026-10-06 14:55:40 -04:00
logan 1108ed2abb Merge pull request 'feat(pack): add Mazes' (#1) from yonlu/onion-mc:add-mazes into main
Reviewed-on: logan/onion-mc#1
2026-10-04 19:27:58 +00:00
yonlu cb90f36e98 feat(pack): add Mazes
Mazes is a NeoForge 1.21.1 mod that adds a Maze Generator block: place it,
open the GUI, and it builds a flat, configurable maze on the block's own
level. The border is a subtractive cell mask cut out with pencil/rectangle
tools, so it can fill odd shapes and rooms instead of only a rectangle.

The mod is not on Modrinth or CurseForge, so the jar is hosted as a release
asset on yonlu/mazes and referenced with a packwiz url metafile. It targets
NeoForge 21.1.0+, so the pack's 21.1.251 is fine, and side is "both" because
it registers a block entity and network payloads.
2026-10-04 15:23:43 -04:00
logan 2fcb8b492e chore(pack): drop FTB Quests, FTB Teams and FTB XMod Compat
FTB Teams was the only thing holding FTB Quests down -- FTB Quests' 1.21.1
build requires it, and its bytecode references dev/ftb/mods/ftbteams in 14
classes including the event handler, so it breaks at runtime without it. With
quests unused, the whole block goes. XMod Compat only bridged
Quests/Chunks/Ranks, all of which are now gone.

FTB Library stays because FTB Backups 3 builds its config UI on it
(Panel/Theme/Widget/ConfigGroup/ConfigValue/SNBTCompoundTag, 13 classes, and
it does not bundle them despite declaring only neoforge). Architectury API
stays because FTB Library references it in 47 classes.

Verified before removing: FTB Library and FTB Backups 3 reference ftbteams,
ftbquests and ftbxmodcompat in zero classes each, and nothing else in the pack
references them.

CurseForge-sourced mods drop from 9 to 5; pack is 146 mods. OPAC's built-in
party system is now the only one, so primaryPartySystem should be left at its
default rather than pointed at ftbteams.
2026-10-01 01:21:24 -04:00
logan 769af6fa2d chore(tools): add FTB Chunks -> Xaero's map reveal migration tooling
The swap does not carry players' explored terrain across. FTB Chunks stores no
rendered map (its region zips hold chunks.dat plus five data PNGs, one of which
packs height into an image channel), and Xaero's region format is closed and now
version 6 with per-pixel NBT blobs, so the community converters no longer work.
Rather than convert pixels, prune a copy of the world save down to exactly the
chunks a player revealed and let Xaero's own generator map it.

Validated against real data: extracting the 167-region / 98,170-chunk mask
cross-checks clean against FTB's own pixel data, and Anvil pruning round-trips
byte-identically (15.7 MB -> 471 KB on a live region file, slot-to-chunk mapping
confirmed against 1024 chunk NBT headers).

Deferred for now: needs the world save and one singleplayer pass per player.
See analysis/FTB-XAERO-MAP-MIGRATION.md.
2026-09-30 22:04:56 -04:00
logan 1d02bf1cf6 feat(pack): replace FTB Chunks with Open Parties and Claims and Xaero's maps
FTB Chunks is the only mod in the FTB suite that nothing else depends on --
FTB Quests requires FTB Library and FTB Teams only, and ships no claim-chunk
task type -- so it can leave without touching quests. Open Parties and Claims
takes over claims and force-loading, and the Xaero's suite restores the
minimap, world map and waypoints that b0542f9 removed.

The three Xaero's entries are byte-identical to the ones b0542f9 deleted, so
this reverts the map half of that commit rather than integrating anything new.
Xaero's + OPAC is also the pairing both projects document: the world map
displays OPAC claims and lets you claim and forceload from the map screen.

Drops config/ftbchunks-client.snbt and the .packwizignore negation that
shipped it, since the FTB Chunks minimap it enabled no longer exists. Also
keeps authoring/review material and migration scratch out of the pack index.

Server-side follow-up (not shippable, lives in the world save): set
maxPlayerClaimForceloads to 25, point primaryPartySystem at FTB Teams, and
decide claims.forceload.offlineForceload.
2026-09-30 22:04:56 -04:00
logan 7e998fa39f feat(pack): add Quick Skin
Lets players change their skin in-game without leaving the server.
2026-09-29 20:38:45 -04:00
logan b7a7d5add3 chore(pack): drop Aeronautics Iris Fix
It is distributed via CurseForge metadata only, which packwiz cannot
fetch automatically and forces a manual download. Remove it so the pack
stays fully automatic; Iris Veil Compat retains the Create Aeronautics
visual fix for Veil under shaders.
2026-09-29 13:12:54 -04:00
logan c6eb2e3cd5 chore(pack): stop tracking C2ME runtime cache
cache/c2me-dfc is regenerated on every server start (the .class files
even swap contents between runs) and is already excluded from the pack
by .packwizignore. Drop it from git and add a .gitignore so it cannot
be committed again.
2026-09-29 13:11:35 -04:00
logan eeaca31162 feat(pack): make Distant Horizons mandatory for all clients
DH was optional (default on), which still lets launchers/exporters skip
it and left the server's LOD data unused. Drop the [option] block so it
is required and installed for every client.
2026-09-29 13:05:31 -04:00
logan b7fde64573 Merge branch 'mod-pack-additions' into main
Integrate Iris + shader packs, better-leaves bump, and fresh-animations
extensions alongside the server-side Clumps/C2ME/Noisium work on main.
index.toml and pack.toml regenerated with packwiz refresh.
2026-09-29 13:05:19 -04:00
logan c1fefd797e chore(pack): bump Motschen's Better Leaves to 9.6 2026-09-29 10:33:38 -04:00
logan b75ceb14c5 feat(pack): add Iris, shader packs, and new resource packs
- Add Iris Shaders 1.8.14-beta.1 (NeoForge) plus Iris Veil Compat and
  Aeronautics Iris Fix so Veil/Create Aeronautics visuals render
  correctly under shader packs.
- Add Fresh Animations: Extensions and Motschen's Better Leaves 8.0
  resource packs.
- Ship Complementary Reimagined and MakeUp - Ultra Fast shader packs
  to clients via shaderpacks/.
2026-09-29 03:11:47 -04:00
logan 25b3f78cdc chore(pack): untrack C2ME runtime cache
The previous commit accidentally captured cache/c2me-dfc (regenerated at runtime) and packwiz indexed it. Ignore cache/ and drop it from the index.
2026-09-29 03:00:50 -04:00
logan be07001d79 perf(pack): add Clumps for XP-orb merging
Reduces XP orb entity count, cutting entity packets sent to clients and server tick cost.
2026-09-29 03:00:10 -04:00
logan d6ba926b5f feat(pack): add C2ME-NeoForge (server-side chunk generation optimization)
Parallelizes chunk generation to speed up pregeneration and reduce worldgen lag. Server-side only (alpha build for NeoForge 1.21.1).
2026-09-28 20:41:32 -04:00
logan dcc44cdff3 feat(pack): add Noisium (server-side worldgen optimization)
Noisium speeds up chunk-generation noise, reducing worldgen lag spikes for clients. Server-side only; Chunk pregen (Chunky/DH) benefits too.
2026-09-28 19:50:48 -04:00
logan 9de35418fb feat(pack): enable Distant Horizons by default
The server generates and serves DH LODs, but DH was opted out by default,
so clients never received them. Default it on (still optional/opt-out) so
players get server-side distant terrain out of the box.
2026-09-28 19:26:53 -04:00
logan b0542f982e feat(pack): replace Xaero's map mods with the FTB Chunks minimap
Removes the Xaero mapping suite -- Xaero's World Map, Xaero's Minimap,
Xaero Train Map and the Waystones compatibility -- and enables the FTB
Chunks minimap, so FTB Chunks provides all mapping.

Xaero Train Map and the Waystones compat had to go with the maps: the
former declares a required dependency on xaeroworldmap, and the latter
references only xaero/common and xaero/minimap classes. Nothing in the
pack declared a dependency on xaeros-minimap.

The minimap needs an explicit config because FTB Chunks computes
minimap.enabled once as !hasOtherMinimapMod() and then persists the
result. With Xaero's Minimap installed that resolved to false and was
written into players' configs, where it sticks, so removing the other
minimap mod alone would not re-enable it. config/ftbchunks-client.snbt is
the location the mod itself documents for modpack defaults, and unlike
defaultconfigs/ it also overrides configs that already exist.

.packwizignore moves from excluding config/ wholesale to config/* plus a
negation, so this one modpack-default config ships while server config
stays untracked.
2026-09-28 18:50:14 -04:00
logan d75420ed0f chore(pack): mark Distant Horizons as an optional mod
Adds an [option] block so Distant Horizons is a user-toggleable mod instead
of always installed, matching how Controlify is already declared.

default = false expresses opt-in wherever the consuming exporter supports
it: modrinth/export.go reads only Optional, so in an mrpack the mod becomes
a toggle (that format has no off-by-default concept), while
curseforge/export.go reads Default and marks it optional-and-disabled.

Nothing in the pack depends on or conflicts with Distant Horizons, so no
other mod is left unsatisfied by it being skippable.
2026-09-28 17:15:45 -04:00
logan 22a7b73ad5 feat(pack): add Waystones and its compatibility addons
Adds Waystones plus two integrations that hook mods already in the pack:
Waystones: Sable (Create Aeronautics addon) and Xaero's Minimap & World
Map - Waystones Compatibility.

packwiz auto-resolved Balm as Waystones' required library; it was then
added explicitly as well, which was a no-op, so there is only one Balm
metafile.

Balm's Modrinth environment is client_or_server, which packwiz flags as
ambiguous ("one of these is unnecessary") and records as side = both.
That is the right call here: Balm is a library needed wherever Waystones
runs, and Waystones is client_and_server.

All four pinned versions are NeoForge 1.21.1 releases, and each jar's
sha512 was re-verified against its recorded hash.
2026-09-28 16:10:16 -04:00
logan 7cccd2d944 fix(pack): add missing baguettelib dependency for Gravestone x Curios compat
gravestonecurioscompat declares a mandatory baguettelib >=1.0.0 dependency,
which would prevent the server from loading.
2026-09-27 00:07:55 -04:00
logan 9f5b3ece71 feat(pack): add 18 requested mods plus four required libraries
Content and QoL: Emotecraft, Ping Wheel, Nature's Compass, Farmer's Cutting:
Twilight Forest, Ars Nouveau's Flavors & Delight, Ocean's Delight, End's
Delight, Twilight's Flavor & Delight, Legendary Tooltips, Dynamic FPS,
Subtle Effects, Enchantment Descriptions, Entity Culling, Xaero Train Map,
Jade Sable Compat, Sable: Physics Compat, Apothic Category Compat,
Gravestone x Curios API Compat.

packwiz auto-resolved four required libraries that were not in the pack:
Iceberg and Prism (Legendary Tooltips), Prickle and Bookshelf
(Enchantment Descriptions).

Each pinned version was confirmed to be a NeoForge 1.21.1 build and each
jar's sha512 re-verified against its recorded hash. Sides are derived from
Modrinth's environment metadata; packwiz maps server_only to both on
purpose because such mods also work in singleplayer, where the client is
the logical server (dedicated_server_only is what yields "server").

Farmer's Cutting: Twilight Forest is published as a mod as well as a
datapack, and the neoforge mod variant is what gets pinned.
2026-09-26 23:48:38 -04:00
logan 4b7515e987 feat(pack): add LambDynamicLights
Client-side NeoForge 1.21.1 dynamic lighting for held and placed light
sources. Modrinth reports server_side as unsupported, so packwiz writes
side = "client" and the jar stays off the server.

The Modrinth version metadata lists Fabric API as a required dependency,
but that entry is not loader-scoped. The NeoForge jar actually depends
only on its JarJar-bundled lambdynlights_runtime, so packwiz failing to
resolve Fabric API is expected and no fabric-api metafile is added.
2026-09-26 16:46:16 -04:00
logan 9a83536805 feat(pack): add Duper's Auto Walk
Client-side NeoForge 1.21.1 mod that walks the player forward on a
toggleable keybind. Modrinth reports server_side as unsupported, so
packwiz writes side = "client" and the jar stays off the server.
2026-09-26 16:42:44 -04:00
logan a4a4ce80d7 fix(pack): add missing fzzy_config dependency for Adorable Hamster Pets
adorablehamsterpets declares a mandatory fzzy_config >=0.7.6 dependency,
so the server crashed at mod loading without it.
2026-09-26 02:58:40 -04:00
logan 4643bf1735 chore(pack): source eight mods from the Modrinth CDN
Replaces CurseForge metadata downloads with direct Modrinth CDN URLs for
every mod in the pack that Modrinth actually hosts, so those jars no longer
need the CurseForge API to resolve: apotheosis, apothic-attributes,
apothic-combat, apothic-enchanting, apothic-spawners, architectury-api,
patchouli, placebo.

Each was matched to the Modrinth file whose sha1 is identical to the
CurseForge file already pinned in the pack, so no mod version changes.
Apothic Attributes is the one exception: the CurseForge and Modrinth jars
both report 1.21.1-2.10.1 but differ by a single build timestamp inside
META-INF/MANIFEST.MF, with every other archive entry byte-identical.

Nine mods stay on CurseForge because they have no Modrinth project at all:
AllTheLeaks, Collapsible Groups, The Twilight Forest, and the six FTB mods
(Backups 3, Chunks, Library, Quests, Teams, XMod Compat). FTB is
CurseForge-exclusive, as are the other three.

Download hashes move from sha1 to sha512, packwiz's format for Modrinth.
2026-09-26 02:42:20 -04:00
logan 36a59068b6 feat(pack): add critter, hamster, dragon, and Wings of Fire mods
Adds four NeoForge 1.21.1 creature/companion mods, all sourced from the
Modrinth CDN:

- Critters and Companions
- Adorable Hamster Pets
- Tiny Dragons
- Wings Of Fire!

"Wings Of Fire!" is published under the slug "wings-of-fire!" (the
exclamation mark is part of the name, not a typo), so its metadata file is
named wings-of-fire.pw.toml to keep the path free of zsh history-expansion
characters.
2026-09-26 02:42:20 -04:00
logan 59cef9e2f2 chore(pack): exclude server tooling from packwiz index
tools/ holds the RCON helper and graceful-restart script used to operate the
server; they are not pack content and must not be indexed for clients.
2026-09-24 17:09:51 -04:00
logan df2a4f4fcd fix(pack): exclude server config and runtime files from packwiz index
A packwiz refresh run in the server directory would have indexed
config/, kubejs/ and other runtime files into the pack index.
2026-09-24 15:33:13 -04:00
logan 435e30a556 added controller support 2026-09-23 19:46:15 -04:00
logan f99e3bee3e chore(pack): add .packwizignore for server-generated files
Keeps the NeoForge libraries, world data, jars and other runtime files
out of the pack index when running packwiz refresh in a server dir.
2026-09-23 16:39:56 -04:00
logan d7fe678408 fix(pack): refresh stale index hash for collapsible-groups metadata
The side change in 0095265 was not followed by packwiz refresh, leaving a
stale hash in index.toml that breaks packwiz-installer with 'Invalid mod
file hash'.
2026-09-23 16:39:56 -04:00