Wiki 9Minecraft Wiki 9Minecraft

Entity Dummy Components and Harmless Placeholders

Using inert vanilla components on custom entities as state flags, Molang hooks, and timer triggers.

5Sections
2Code examples
3Known errors

In Minecraft Bedrock add-on development, a dummy component refers to a real, vanilla entity component repurposed to act as an invisible state marker, a Molang query hook, or a delayed event trigger. Because Bedrock rejects completely invented component identifiers in the content log, creators rely on harmless built-in components or empty component groups when they need to track custom data or pass states from the Behavior Pack to the Resource Pack. Although modern Entity Properties have replaced many of these workarounds, dummy components remain widely used for quick timers, animation states, and maintaining older packs.

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.

BP/entities/guard.json
{
  "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 ComponentMolang QueryNotes
minecraft:variantquery.variantHolds an integer. Often used to switch textures or geometries in render controllers.
minecraft:mark_variantquery.mark_variantA second independent integer slot, useful when query.variant is already taken.
minecraft:skin_idquery.skin_idA third integer slot for syncing numbers from the Behavior Pack to the client.
minecraft:is_saddledquery.is_saddledBoolean flag. Safe to use as a dummy switch if the entity does not use actual saddle mechanics.
minecraft:is_shearedquery.is_shearedBoolean flag. Returns 1.0 when the component is present on the entity, 0.0 otherwise.
minecraft:is_ignitedquery.is_ignitedBoolean flag originally for Creepers, completely inert on custom mobs.
minecraft:is_chestedquery.is_chestedBoolean 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.

BP/entities/turret.json
{
  "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 seeWhyThe 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.