A predicate with one condition has no wrapper, and that is a real shape change
One condition is the object itself. Two or more get wrapped in all_of or any_of. Plus the eight condition types, and why inverting is a wrapper rather than a flag.
A datapack predicate is a JSON file describing a condition, and its structure changes depending on how many conditions you have. That is the part that trips people copying an example and extending it.
One is not a list of one
| conditions | output shape |
|---|---|
| 0 | {} |
| 1 | the condition object itself |
| 2+ | { "condition": "minecraft:all_of", "terms": [ … ] } |
There is no wrapper around a single condition. Add a second and the whole file changes shape — the original condition becomes the first element of a terms array under a new root. Anything that reads or generates these has to handle both forms, and an example built from one condition does not show you the shape you will need the moment you add another.
any_of is the alternative combinator: all terms must pass, or any one of them.
Inverting is a wrapper too, not a flag
There is no "invert": true field. A negated condition is wrapped:
{ "condition": "minecraft:inverted", "term": { …the original condition… } }
Note term, singular — inverted takes exactly one, where all_of and any_of take a terms array. Two similar-looking keys with different shapes, and inversion applies per condition, so a predicate can mix inverted and plain terms freely inside one all_of.
The eight condition types
entity_properties random_chance
value_check random_chance_with_looting
weather_check time_check
location_check match_tool
random_chance_with_looting is the one worth pausing on: it takes a base chance and a looting_multiplier, so the probability scales with the killer's Looting level. That makes it meaningful only where a killer exists in context — it is a drop-rate condition, not a general-purpose random gate. Plain random_chance is the one to reach for everywhere else.
value_check compares a number against one of three sources: enchantment level, luck, or a custom expression you edit into the JSON by hand after copying.
The pickers are exactly the vanilla sets
Worth knowing when you are checking whether a biome or structure id is real: the builder's dropdowns are not a curated sample.
- 66 biomes — every biome in the game, with nothing missing and nothing invented
- 34 structures — likewise
- 18 block tags and 15 items, which are a working subset
That was verified against the game's own registry data rather than assumed, so if an id is absent from the biome or structure list, the id does not exist. For the block tags and items it is the opposite: absence means only that the picker does not list it, and typing the id yourself is fine.