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.
Core rule
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.
What it does
For each mob listed in force_spawn_entities, at spawn time the mod:
- Verifies the block below the spawn position is solid (or a snow layer, for snow biomes).
- Verifies that block is NOT in
denied_blocks_below (lava, magma, fire, cactus, etc).
- If both checks pass: forces
SpawnHelper.canSpawn, SpawnRestriction.canSpawn and MobEntity.canSpawn to return true, bypassing vanilla's strict predicate.
- If the block below is denied: forces the call to return
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.
Spawn group override (new in 1.0.1)
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.
Full configuration
{
"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"
}
}
Root keys
- enabled: master switch.
false = mod does nothing.
- bypass_spawn_helper: toggle for the first vanilla gate (block / solid support / location).
- bypass_spawn_restriction: toggle for the second gate (light / biome predicate).
- bypass_mob_canspawn: toggle for
MobEntity.canSpawn, which vanilla hostile mobs use to enforce darkness. Required for hostile mobs to spawn on the surface.
- denied_blocks_below: list of block IDs that ALWAYS reject a forced spawn, even if vanilla would have allowed it. Anti-death net. Missing = use built-in defaults shown above.
- force_spawn_entities: plain list of entity IDs to force-spawn. Only these mobs are affected.
- spawn_group_override: map of entity ID to spawn group name. Reassigns the spawn group those entities report, so they are categorized correctly by vanilla and worldgen spawn-list builders. Only the listed entities are affected. Optional, empty by default.
- debug.*: see below.
Debug flags
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.
Typical setup
-
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.
Conflict and compatibility
- Pure Mixin HEAD inject, no access widener. Compatible with most Fabric performance mods (C2ME, Lithium, FerriteCore).
- Does not touch spawn weight or frequency; natural spawn rates are still governed by biome / datapack spawn entries (
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.
- Chunk-generation spawns use a different code path and do NOT produce a
SPAWN OK log, but the BYPASS log confirms the mixin fired. This is normal.
Legacy config
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.
Recommended for
- Modpacks combining mob mods with custom worldgen (Big Globe, Terralith, Biomes O' Plenty, etc.) where modded mobs refuse to spawn in the custom biomes.
- Adventure / RPG packs that need specific hostile mobs on the surface of biomes where vanilla darkness rules would normally block them.
- Fixing modded mobs that spawn far too rarely because the mod registered them under the wrong spawn group (for example a hostile mob registered as CREATURE).
- Anyone who wants the equivalent of
In Control! / "result":"allow" on Fabric, without writing Java patches.
Used in the Legends Reborn: Medieval modpack.