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.