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.
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.
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.
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.
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.
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.
.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.
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.
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.