How Bedrock Entity Collision Works
Every entity in Bedrock defines its physical footprint using the minecraft:collision_box component, which sets a width and a height in blocks. Under normal rules, this box only triggers soft pushing calculations defined by minecraft:pushable and minecraft:physics. If you turn pushing off, players simply walk straight through the entity as if it were a ghost.
True solid collision—where a player can jump onto the top of an entity and walk across it, or run into its side and stop dead—is hardcoded to specific vanilla mechanics. To get this behavior on a custom entity, you have to borrow one of two vanilla systems: the boat rideable overlap or the shulker runtime identifier.
| Component or Property | What it does | Notes |
|---|---|---|
| minecraft:collision_box | Sets the width and height of the entity hitbox. | Always has a square footprint on the X and Z axes. |
| minecraft:physics | Controls whether the entity has gravity and standard collision. | Setting has_collision to false disables all physical interaction. |
| minecraft:pushable | Determines if the entity can be pushed by mobs or pistons. | Disabling this stops movement, but does not make the hitbox solid. |
| runtime_identifier | Borrows hardcoded C++ behaviors from a vanilla entity. | Placed inside the description block of the entity file. |
The Boat Workaround for Movable Solid Entities
The cleanest way to make a custom entity solid without inheriting strange mob behaviors is to combine minecraft:Custom_entity with a boat-style setup. In Bedrock, an entity that has both minecraft:rideable and minecraft:item_controllable (or specific boat flags) gains a hard top and side collision surface for any entity not currently riding it. However, the most reliable variation of this is actually using the boat runtime identifier or configuring a dummy seat.
If you use runtime_identifier set to minecraft:boat, the game treats your entity's collision box as a hard physical box. Players can stand on top of it, and its width and height can be scaled freely using minecraft:collision_box. Because boats have hardcoded gravity and buoyancy, you will usually pair this with minecraft:physics and movement components to lock it in place if you are making static furniture.
{
"format_version": "1.20.0",
"minecraft:entity": {
"description": {
"identifier": "wiki:solid_crate",
"runtime_identifier": "minecraft:boat",
"is_spawnable": true,
"is_summonable": true
},
"components": {
"minecraft:collision_box": {
"width": 1.0,
"height": 1.0
},
"minecraft:physics": {
"has_gravity": false,
"has_collision": true
},
"minecraft:pushable": {
"is_pushable": false,
"is_pushable_by_piston": true
},
"minecraft:health": {
"value": 1,
"max": 1
}
}
}
}The Shulker Workaround for Grid-Snapped Entities
If you are creating a custom block entity—such as a complex machine or a chest mimic that needs to sit squarely on the block grid—you can set the runtime_identifier to minecraft:shulker. Shulkers are hardcoded to have a completely solid, block-like hitbox and will automatically snap their position to the nearest full block coordinates when spawned.
The shulker identifier comes with heavy side effects that you must strip away in your behavior file and resource pack. By default, a shulker-based entity will try to teleport when damaged or when the block beneath it breaks, and it will render a vanilla shulker head inside your custom model unless you override the base rendering controllers or hide the head bone in your geometry.
{
"format_version": "1.20.0",
"minecraft:entity": {
"description": {
"identifier": "wiki:solid_statue",
"runtime_identifier": "minecraft:shulker",
"is_spawnable": true,
"is_summonable": true
},
"components": {
"minecraft:collision_box": {
"width": 1.0,
"height": 1.0
},
"minecraft:physics": {
"has_gravity": false,
"has_collision": true
},
"minecraft:pushable": {
"is_pushable": false,
"is_pushable_by_piston": false
},
"minecraft:knockback_resistance": {
"value": 1.0
},
"minecraft:fire_immune": true
}
}
}Locking Position and Preventing Drift
A solid entity using the boat runtime identifier does not snap to the grid and can still be nudged slightly by explosions, fishing rods, or water currents even when minecraft:pushable is set to false. To make a boat-based solid entity stay completely still, set its knockback_resistance to 1.0 and disable gravity inside minecraft:physics.
If the entity still drifts when players repeatedly jump on its edges, add a minecraft:movement component with a value of 0.0. For entities that should never be moved under any circumstances, you can also attach them as a passenger to an invisible, immobile marker entity, though zeroing out movement and disabling gravity is enough for most furniture and decorative props.
Limitations of Solid Entity Hitboxes
Entity collision boxes in Bedrock are strictly axis-aligned cylinders or square prisms. You can only define one width and one height; there is no depth setting. A width of 2.0 creates a 2x2 footprint centered on the entity's pivot. When you rotate an entity in the world, its visual model rotates, but its collision box stays aligned to the north-south and east-west world grid.
If you need a rectangular solid surface—such as a long dining table or a bridge—you cannot do it with a single entity's collision box. Instead, make your main visual entity non-solid, and use the minecraft:addrider component or a script to spawn multiple invisible, 1x1 solid collider entities along the length of the model.
Which versions this applies to
Applies to format_version 1.16.0 through 1.21.x and newer. No experimental toggles are required, as runtime_identifier and collision components are part of the stable entity schema.
When it does not work
| What you see | Why | The fix |
|---|---|---|
| The entity has a solid hitbox, but a vanilla shulker head appears inside my custom model. | Using the minecraft:shulker runtime identifier attaches the hardcoded shulker head renderer when using default render controllers. | In your resource pack entity file (RP/entity/...), ensure you only reference your own custom geometry and render controller, and include an empty bone named 'head' scaled to zero in your geometry file so the hardcoded renderer has nothing visible to draw. |
| My boat-based solid entity drops oak planks and sticks when killed, ignoring my loot table. | In older format versions or when minecraft:loot is omitted, the minecraft:boat runtime identifier falls back to hardcoded boat drops on death. | Explicitly add the minecraft:loot component pointing to an empty loot table (or your custom drops), or despawn the entity cleanly using the minecraft:instant_despawn component triggered by a damage sensor. |
| Content Log shows: [Entities][error] ... runtime_identifier is not a valid property. | You placed runtime_identifier inside the 'components' block instead of the 'description' block. | Move runtime_identifier up into the 'description' object right below 'identifier'. |
| Players glitch and jitter when standing on top of a large solid entity. | The entity's collision_box width or height is larger than 4 blocks, where Bedrock's client-side movement prediction begins to desync from the server hitbox. | Keep individual solid collision boxes at or below 3 blocks in width, and tile multiple invisible collider entities if you need to cover a larger area. |
Reference, straight from the game files
Read out of the game itself, so the ids match the version you are building for.
