Why Custom Component Names Fail
When you first start building complex state machines inside an entity behavior file, it is tempting to invent your own component names inside a component group, such as "custom:is_sleeping" or "my_pack:phase_two". If you try this, the game's JSON parser will immediately flag it as an unrecognized component and throw a content log error when the entity spawns.
To work around this restriction, creators use two patterns that are informally called dummy components. The first is an empty component group, which holds no components at all and only exists to be checked by filters inside the Behavior Pack. The second is a harmless vanilla component—such as "minecraft:variant" or "minecraft:is_baby"—placed inside a component group solely for its side effects, like exposing a Molang query to the Resource Pack or firing an event after a delay.
Empty Component Groups as Behavior Flags
If your state only needs to be read on the server side—for instance, within target selectors, environment sensors, or interaction filters—you do not need a component inside your component group at all. Bedrock allows you to define a component group as an empty JSON object {}.
When an event adds this empty group to the entity, nothing changes about the entity's physical behavior or attributes. However, the "is_family" filter cannot read component groups, so you must use the "has_component" filter? No—"has_component" checks for actual components. Instead, to check an empty component group or track a server-side state without changing behavior, the standard dummy component to put inside the group is "minecraft:type_family". By adding a custom family name to the entity when the group is active, any "is_family" filter in your entity file or command selectors can immediately detect the state.
{
"format_version": "1.20.0",
"minecraft:entity": {
"description": {
"identifier": "wiki:guard",
"is_spawnable": true,
"is_summonable": true
},
"component_groups": {
"wiki:state_alerted": {
"minecraft:type_family": {
"family": [ "guard", "mob", "alerted_state" ]
}
}
},
"components": {
"minecraft:type_family": {
"family": [ "guard", "mob" ]
},
"minecraft:environment_sensor": {
"triggers": [
{
"filters": {
"all_of": [
{ "test": "is_family", "subject": "self", "value": "alerted_state" },
{ "test": "is_daytime", "value": true }
]
},
"event": "wiki:calm_down"
}
]
}
},
"events": {
"wiki:become_alert": {
"add": {
"component_groups": [ "wiki:state_alerted" ]
}
},
"wiki:calm_down": {
"remove": {
"component_groups": [ "wiki:state_alerted" ]
}
}
}
}
}Syncing States to the Resource Pack
Behavior Pack components and family types are invisible to the client-side Resource Pack. If your custom entity needs to change its texture, geometry, or animation when it enters a specific behavior state, you can use a vanilla visual or data component that does nothing on its own unless your Resource Pack actively reads it.
Components like "minecraft:variant", "minecraft:mark_variant", and "minecraft:skin_id" accept any integer value. They have zero impact on AI or physics, making them ideal dummy data holders. Similarly, empty tag components like "minecraft:is_ignited", "minecraft:is_sheared", or "minecraft:is_saddled" act as instant boolean switches that you can read in animations and render controllers using their matching Molang queries.
| Behavior Component | Molang Query | Notes |
|---|---|---|
| minecraft:variant | query.variant | Holds an integer. Often used to switch textures or geometries in render controllers. |
| minecraft:mark_variant | query.mark_variant | A second independent integer slot, useful when query.variant is already taken. |
| minecraft:skin_id | query.skin_id | A third integer slot for syncing numbers from the Behavior Pack to the client. |
| minecraft:is_saddled | query.is_saddled | Boolean flag. Safe to use as a dummy switch if the entity does not use actual saddle mechanics. |
| minecraft:is_sheared | query.is_sheared | Boolean flag. Returns 1.0 when the component is present on the entity, 0.0 otherwise. |
| minecraft:is_ignited | query.is_ignited | Boolean flag originally for Creepers, completely inert on custom mobs. |
| minecraft:is_chested | query.is_chested | Boolean flag. Avoid if the entity has an inventory interaction that checks for chests. |
Dummy Components for Delays and Cooldowns
Another classic dummy pattern uses "minecraft:timer" not as part of the entity's permanent logic, but inside a temporary component group to act as a delay node between two events. When an event adds the timer group, the countdown begins. Once the time expires, the timer fires a follow-up event that removes its own component group and executes the next step in the sequence.
For this to work reliably as a one-shot delay, set "looping" to false and make sure the triggered event removes the component group containing the timer. If you do not remove the group, adding it again later will not restart the countdown.
{
"format_version": "1.20.0",
"minecraft:entity": {
"description": {
"identifier": "wiki:turret",
"is_spawnable": true,
"is_summonable": true
},
"component_groups": {
"wiki:overheated_delay": {
"minecraft:is_ignited": {},
"minecraft:timer": {
"looping": false,
"time": [ 5.0, 5.0 ],
"time_down_event": {
"event": "wiki:cool_down_complete",
"target": "self"
}
}
}
},
"components": {
"minecraft:health": {
"value": 20,
"max": 20
}
},
"events": {
"wiki:trigger_overheat": {
"add": {
"component_groups": [ "wiki:overheated_delay" ]
}
},
"wiki:cool_down_complete": {
"remove": {
"component_groups": [ "wiki:overheated_delay" ]
}
}
}
}
}When to Use Entity Properties Instead
In modern Bedrock development, the official replacement for integer and boolean dummy components is the Entity Properties system (declared under "properties" in the entity description and read via "query.property"). Entity properties let you define named booleans, integers, floats, and enums with custom names, and they optionally sync to the client for Resource Pack queries without hijacking "minecraft:variant" or "minecraft:is_saddled".
However, dummy components are still practical when you need to bundle a state flag directly inside a component group alongside AI goals, or when you want a "minecraft:timer" to clean itself up automatically when a state ends. Watch out for unwanted vanilla side effects when choosing a boolean component: for example, "minecraft:is_baby" looks like a convenient boolean flag, but it often alters hitbox scaling, movement speed, or head bone rendering in ways you did not ask for. Stick to truly inert tags like "minecraft:is_sheared" or "minecraft:is_ignited" if you only want a visual signal.
Which versions this applies to
Applies to all modern Bedrock versions (1.16.0 through 1.21+). No experimental toggles are required for vanilla dummy components or standard Entity Properties.
When it does not work
| What you see | Why | The fix |
|---|---|---|
| Content Log shows: "[Entities][error]-my_mob | minecraft:entity | components | custom:my_flag : Parse Error - component does not exist" | You wrote an invented component name inside "components" or "component_groups". Bedrock entities only accept hardcoded "minecraft:" component identifiers. | Replace the invented component with "minecraft:type_family" for server-side filtering, a harmless boolean component like "minecraft:is_ignited", or declare a proper Entity Property in the entity description. |
| Removing a component group does not reset "minecraft:variant" or "minecraft:type_family" back to its default state. | When a component group overrides a component that was already defined in the base "components" block, removing that group does not automatically restore the base component's original values. | Move the default "minecraft:variant" or "minecraft:type_family" into its own default component group (added on "minecraft:entity_spawned"), and swap between the two groups in your events. |
| Using "minecraft:is_baby" as a dummy flag causes the custom entity's head to grow or its shadow to shrink. | Several vanilla components carry hardcoded engine side effects in default render controllers and movement calculations. | Switch to a purely cosmetic tag component with no physics or scaling hooks, such as "minecraft:is_sheared" or "minecraft:mark_variant". |
Reference, straight from the game files
Read out of the game itself, so the ids match the version you are building for.
