SpawnForce is a lightweight Fabric mod that forces specific mobs to actually spawn when a datapack or worldgen mod asks for them. Many modded mobs (AdventureZ orcs/shamans/fungi, Soulslike Weaponry bosses, and similar) ship with strict vanilla spawn predicates (light, hardcoded biome lists, block type under feet) that silently refuse them in custom biomes even when the biome entry explicitly lists them. SpawnForce lets you whitelist entity IDs in a config file and bypasses those checks only for them, with a configurable anti-death list so forced mobs never spawn on lava or other killing blocks. Version 1.0.1 adds a second, independent tool: a per-mob spawn-group override that fixes modded mobs registered under the wrong category so they spawn at the right rate.
The mod only touches entity IDs you list. Any mob not in force_spawn_entities or spawn_group_override is completely ignored, no mixin side effect. No hidden global flag, no per-mob profile to maintain.
For each mob listed in force_spawn_entities, at spawn time the mod:
denied_blocks_below (lava, magma, fire, cactus, etc).SpawnHelper.canSpawn, SpawnRestriction.canSpawn and MobEntity.canSpawn to return true, bypassing vanilla's strict predicate.false, guaranteeing the mob never spawns on a killing block even if vanilla would have allowed it.The three bypass points are guarded independently by global toggles, so you can narrow the scope if a mod conflict appears.
Some mods register a hostile mob under the wrong spawn category. A common case: a mob that extends TameableEntity ends up classified as CREATURE instead of MONSTER. CREATURE mobs only spawn in the one-shot pass at chunk generation and sit under a low cap, so such a mob barely appears and never joins the continuous monster spawn cycle underground. The result is a biome that should be full of a given mob but only ever shows the few that happen to be real monsters.
spawn_group_override reassigns the spawn group an entity reports, so it gets categorized correctly by every spawn-list builder (vanilla and worldgen mods such as Big Globe). Move a mob to MONSTER and it spawns continuously in the dark, counts toward the monster cap, and despawns normally like any other hostile.
It is a map of entity ID to group name, so you choose the target group per mob. Only the entities you list are touched, every other mob keeps its original group.
"spawn_group_override": {
"soulsweapons:remnant": "MONSTER",
"soulsweapons:soulmass": "MONSTER"
}
Accepted group names, case-insensitive: MONSTER, CREATURE, AMBIENT, WATER_CREATURE, WATER_AMBIENT, UNDERGROUND_WATER_CREATURE, AXOLOTLS, MISC. An unknown name is logged and the entry is skipped, never a crash. This list is independent from force_spawn_entities: a mob can appear in either, both, or neither.
{
"enabled": true,
"bypass_spawn_helper": true,
"bypass_spawn_restriction": true,
"bypass_mob_canspawn": true,
"debug": {
"enabled": false,
"log_bypass": true,
"log_spawn_result": true,
"log_rejection": true,
"summary_interval_seconds": 10
},
"denied_blocks_below": [
"minecraft:magma_block",
"minecraft:lava",
"minecraft:fire",
"minecraft:soul_fire",
"minecraft:cactus",
"minecraft:sweet_berry_bush",
"minecraft:powder_snow",
"minecraft:campfire",
"minecraft:soul_campfire"
],
"force_spawn_entities": [
"adventurez:orc",
"adventurez:shaman",
"adventurez:red_fungus"
],
"spawn_group_override": {
"soulsweapons:remnant": "MONSTER"
}
}
false = mod does nothing.MobEntity.canSpawn, which vanilla hostile mobs use to enforce darkness. Required for hostile mobs to spawn on the surface.All under debug.*:
enabled: master toggle for all logs below. false = no logs.log_bypass: logs each bypass with entity, block below, biome, light level. Sampled (first 5 hits, then every 50) to avoid spam.log_spawn_result: logs SPAWN OK / SPAWN FAIL once the entity actually enters the world. Useful to confirm the mob reached the ground.log_rejection: logs REJECT entries when the anti-death list kicks in. Sampled (first 5, then every 200). Leave on during setup to see which blocks you might want to add to the deny list.summary_interval_seconds: reserved for future use.Drop the jar in mods/. Start the game once to generate config/spawnforce.json.
Add the entity IDs you want to force-spawn to force_spawn_entities, and any spawn-group fixes to spawn_group_override.
Restart. Check the log at startup for:
[SpawnForce] enabled=true bypass{helper=true,restriction=true,mobCanSpawn=true} debug{…} entries=N group_override=M denied_below=9 [SpawnForce] + mymod:some_mob [SpawnForce] * spawn_group_override mymod:some_mob -> MONSTER
Teleport to a biome that should spawn your mob. With debug.enabled=true you will see BYPASS and SPAWN OK lines confirming it works.
weight, minCount, maxCount).spawn_group_override changes how spawn-list builders categorize a mob, not where it is allowed; pair it with the biome/datapack spawn entries that place the mob.SPAWN OK log, but the BYPASS log confirms the mixin fired. This is normal.If the mod detects an old format (e.g. nested per-mob profiles with allowed_blocks_below, defaults, mob_cap, etc.), it logs a warning and ignores those blocks. Migrate manually to the flat format above.
Restart the game after editing.
In Control! / "result":"allow" on Fabric, without writing Java patches.Used in the Legends Reborn: Medieval modpack.