The bug
All mobs require two non-full blocks to be spawned naturally even if the mob is only one block tall.
How to reproduce
- Create a Superflat world with the following preset
minecraft:stone,minecraft:air,minecraft:stone,minecraft:stone_slab
- Use for example the /say command to list all entities
/say @e[type=!player]
→ No entity is listed
- Replace some blocks with non-full cube blocks like slabs
/fill ~ ~-1 ~ ~170 ~-1 ~170 stone_slab
Note how the available space is still one air block, but now the block above it is a non-full block (stone slab)
- Use the /say command again
/say @e[type=!player]
→ Bats and spiders are listed
Code analysis
Based on 1.11.2 decompiled using MCP 9.35 rc1
The method net.minecraft.world.WorldEntitySpawner.canCreatureTypeSpawnAtLocation(SpawnPlacementType, World, BlockPos) tests for all mobs for two non-full cube blocks, regardless of the mob size. The same applies to water mobs in this method as well.