What makes a good dummy entity
In vanilla Minecraft commands, creators traditionally summon armor stands with invisibility effects to mark locations or run commands at specific coordinates. In an add-on, this is bad practice. Vanilla armor stands run full entity physics, check for armor slot interactions, push against other entities, and render shadows even when invisible. Having dozens of them in a chunk degrades tick performance.
A proper custom dummy entity avoids this overhead by omitting AI goals, movement components, and standard damage sensors. By stripping the behavior file down to the bare minimum—collision, physics, pushability, and a damage sensor—you get an entity that sits at an exact coordinate, cannot be moved by water or pistons, cannot be hit by players, and costs almost nothing to keep loaded.
Core behavior components
The behavior pack definition controls how the entity interacts with the physical world. To make the entity completely inert, you need to explicitly disable gravity, collision, and damage. Leaving a component out is sometimes enough, but certain behaviors—like gravity or taking void damage—require explicit components with false values to turn off completely.
Notice that the Collision Box is set to zero width and height. While you can set tiny numbers like 0.01 if you need to click the entity during debugging, setting both to 0.0 ensures players can walk and mine right through the exact pixel the dummy occupies without their crosshair ever registering an entity.
| Component | What it does | Notes |
|---|---|---|
| minecraft:collision_box | Sets the physical hitbox size | Setting width and height to 0.0 prevents players from punching or targeting the entity. |
| minecraft:physics | Controls gravity and block collision | Set both properties to false so the entity floats in mid-air and can sit inside solid blocks. |
| minecraft:pushable | Controls entity and piston pushing | Both flags must be false so mobs walking past or moving pistons do not shift the marker. |
| minecraft:damage_sensor | Filters incoming damage | Catching "all" causes with deals_damage set to false makes it immune to explosions, swords, and the /kill command. |
| minecraft:fire_immune | Prevents burning | Stops the burning visual flame overlay from appearing if the marker is placed inside lava or fire. |
{
"format_version": "1.20.40",
"minecraft:entity": {
"description": {
"identifier": "wiki:marker",
"is_spawnable": false,
"is_summonable": true,
"is_experimental": false
},
"components": {
"minecraft:collision_box": {
"width": 0.0,
"height": 0.0
},
"minecraft:physics": {
"has_gravity": false,
"has_collision": false
},
"minecraft:pushable": {
"is_pushable": false,
"is_pushable_by_piston": false
},
"minecraft:damage_sensor": {
"triggers": [
{
"cause": "all",
"deals_damage": false
}
]
},
"minecraft:knockback_resistance": {
"value": 1.0
},
"minecraft:fire_immune": {}
}
}
}Resource pack setup for invisibility
Even if an entity has no behavior, Bedrock requires a resource pack client entity definition if you want it to exist cleanly without content log warnings. However, you do not want the game to waste rendering power drawing a transparent texture every frame. The cleanest way to make a dummy entity invisible is to give it an empty geometry and omit the render controllers entirely.
First, define a minimal client entity file. Notice that it points to a custom empty geometry, does not list any textures or materials, and leaves the render_controllers array out. Because there is no render controller, the game skips the entity during the geometry draw pass. We also Omit the shadow_radius property or set it to 0.0 so no dark circle appears on the ground beneath the marker.
{
"format_version": "1.10.0",
"minecraft:client_entity": {
"description": {
"identifier": "wiki:marker",
"geometry": {
"default": "geometry.wiki.empty"
}
}
}
}The empty geometry file
To satisfy the geometry reference in the client entity file, create a single empty model inside your resource pack's models folder. You can reuse this one empty geometry across every dummy entity, projectile, or invisible trigger in your add-on.
This model contains a valid description header with bounds set to zero and no bones array. It parses cleanly in all modern versions without throwing missing geometry errors.
{
"format_version": "1.12.0",
"minecraft:geometry": [
{
"description": {
"identifier": "geometry.wiki.empty",
"texture_width": 16,
"texture_height": 16,
"visible_bounds_width": 0,
"visible_bounds_height": 0,
"visible_bounds_offset": [0, 0, 0]
}
}
]
}Persistence and clean removal
By default, custom entities that do not have despawn rules will stay in the world, though it is good practice to include the "minecraft:persistent": {} component if your marker is meant to stay loaded permanently across chunk unloads, such as an anchor for a custom machine block.
Because the damage sensor blocks all damage—including the /kill command—you cannot remove this dummy entity with a standard /kill @e[type=wiki:marker] command. Instead, create a component group containing the "minecraft:instant_despawn": {} component, and wire up an entity event to add that group. When you want to delete the marker via commands or script, trigger the despawn event using /event entity @e[type=wiki:marker] wiki:despawn. In the Script API, you can also call the entity.remove() method directly, which bypasses the damage sensor entirely.
{
"format_version": "1.20.40",
"minecraft:entity": {
"description": {
"identifier": "wiki:marker",
"is_spawnable": false,
"is_summonable": true
},
"component_groups": {
"wiki:despawn_group": {
"minecraft:instant_despawn": {}
}
},
"components": {
"minecraft:persistent": {}
},
"events": {
"wiki:despawn": {
"add": {
"component_groups": [
"wiki:despawn_group"
]
}
}
}
}
}Which versions this applies to
Applies to Bedrock Edition 1.16.0 and newer (example uses format_version 1.20.40). No experimental toggles are required.
When it does not work
| What you see | Why | The fix |
|---|---|---|
| The entity renders as a floating white or magenta-and-black checkered cube. | You included a render controller in the client entity file, or you referenced a geometry identifier that does not exist in your RP/models/entity/ folder. | Remove the "render_controllers" array from RP/entity/marker.entity.json and ensure "geometry.wiki.empty" is properly defined. |
| Running /kill @e[type=wiki:marker] outputs "No targets matched selector" or simply fails to kill the entity. | The "minecraft:damage_sensor" component is set to block "all" damage causes, which includes void damage dealt by the /kill command. | Use an event that adds "minecraft:instant_despawn" and trigger it with the /event command, or use the /tp command to send the entity into unloaded chunks if it is not persistent. |
| Players cannot place blocks or hit mobs when standing near the dummy entity. | The "minecraft:collision_box" width and height were left at default values instead of 0.0, so the invisible hitbox is intercepting the player's cursor. | Set both "width" and "height" inside "minecraft:collision_box" to 0.0. |
Reference, straight from the game files
Read out of the game itself, so the ids match the version you are building for.
