11 Commits
Author SHA1 Message Date
logan f949c169a2 feat(perf): add one-step tier setup script for existing players
Default Options only seeds configs when absent, so existing players never
got the tuned settings. build.py --ship now also writes the Deck/Mid/High
tier files to config/onion-perf/<tier>/, and onion-perf-setup.{sh,ps1,bat}
(installed into the instance folder) backs up and replaces the tier's
config files and merges only the tuned video keys into options.txt,
keeping keybinds, audio and vsync/max-FPS choices.

PLAYER-TUNING: point players at the script; bench B4 GC verdict (G1 for
everyone; ZGC/Shenandoah tested worse); 16 GB PCs 5-6 GB heap.
2026-10-18 15:31:20 -04:00
logan 217c346c02 revert(perf): remove Flerovium and the spawn tuning
Run 3 benches (analysis/client-perf/RESULTS-proxy.md): Flerovium's run-2
win did not reproduce (S1 slightly worse, S3 within noise), and the
moderate spawn tuning (d80f85b, 8e8483d) left total mob counts unchanged
across 4 runs per config. Owner approved removing both. The mods now
regenerate their default spawn configs.
2026-10-18 15:06:51 -04:00
logan 784136142a feat(perf): ship ModernFix dynamic_resources, add Flerovium and Iris Flywheel Compat
Bench (proxy 9900X/7800XT, see analysis/client-perf/RESULTS-proxy.md):
- ModernFix mixin.perf.dynamic_resources=true: startup -7.6 s, S1 p99
  9.11 -> 8.48 ms, S2 1% low 236 -> 264 fps (B6). Enforced packwiz file
  because ModernFix reads it before Default Options. Missing-texture check
  waived by owner; issues to be reported from play.
- Flerovium 1.1.2 (client): mob-pen S3 p99 ~0.9 ms better (B12b).
- Iris Flywheel Compat 2.4.0 (client): with a shaderpack, Create floor
  p99 13.3 -> 4.0 ms (Flywheel instancing kept under Iris) (B12b).
Deck tier already ships DH's LOW quality preset, so no DH change.
2026-10-18 10:16:45 -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 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 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 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 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 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 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