Condition Types
Conditions are Epiphany's condition types, used to determine under what player state a Module or Epiphany should auto-unlock.
INFO
This page is aimed at datapack authors, explaining the JSON fields of all built-in condition types. For registering new condition types, see Registering a New Condition.
Usage
Conditions are used in the condition field of Module / Epiphany JSON, selecting a specific type via dispatch codec:
"condition": {
"type": "epiphany:advancement", // ← type determines subsequent fields
"advancement": "minecraft:story/mine_stone"
}The type field corresponds to one of the 30 built-in types. type is the condition type's registry ID (epiphany:<key>); third-party mods can register new keys.
Graceful Degradation on Parse Failure
If type references an unregistered condition type, JSON parsing fails and the system automatically falls back to epiphany:always (always true). This means your datapack won't crash due to a typo, but the condition will silently become always-true. Please double-check your type names carefully.
Logical Operators
epiphany:always (Always True)
Always true — has no JSON body fields. This is the default fallback when dispatch parsing fails.
{ "type": "epiphany:always" }epiphany:never (Always False)
Always false. Useful for "this should never auto-unlock; only commands/API can unlock it."
{ "type": "epiphany:never" }epiphany:and (All Must Be True)
True when all child conditions are true.
| Field | Type | Required | Description |
|---|---|---|---|
conditions | list of Condition | ✅ | List of child conditions |
{
"type": "epiphany:and",
"conditions": [
{ "type": "epiphany:experience_level", "value": 30 },
{ "type": "epiphany:advancement", "advancement": "minecraft:story/mine_diamond" }
]
}epiphany:or (Any Must Be True)
True when any child condition is true.
| Field | Type | Required | Description |
|---|---|---|---|
conditions | list of Condition | ✅ | List of child conditions |
epiphany:not (Negation)
Negates a child condition.
| Field | Type | Required | Description |
|---|---|---|---|
condition | Condition | ✅ | The child condition to negate |
{
"type": "epiphany:not",
"condition": {
"type": "epiphany:dimension",
"dimension": "minecraft:the_nether"
}
}Conditions
epiphany:attribute (Attribute Comparison)
Evaluates the relationship between a player's current attribute value (base + all modifiers) and a given value.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
attribute | ResourceLocation | ✅ | — | Attribute id, e.g., minecraft:generic.max_health |
value | double | ✅ | — | Right-hand comparison value |
comparison | Comparison | >= | Comparison operator |
{
"type": "epiphany:attribute",
"attribute": "minecraft:generic.max_health",
"value": 30.0,
"comparison": ">="
}epiphany:effect (Has Status Effect)
Evaluates whether the player has a specified effect with an amplifier no less than the given minimum.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
effect | ResourceLocation | ✅ | — | Effect id, e.g., minecraft:regeneration |
min_amplifier | int | 0 | Minimum amplifier (level − 1) |
{ "type": "epiphany:effect", "effect": "minecraft:strength", "min_amplifier": 0 }epiphany:experience_level (Experience Level)
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
value | int | ✅ | — | Right-hand comparison value (player's experience level) |
comparison | Comparison | >= | Comparison operator |
epiphany:statistic (Statistic Value)
Checks a player's cumulative value in a vanilla statistic. Use this condition for custom statistics such as distance walked, or for typed statistics such as crafted, broken, used, mined, and killed.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
stat_type | ResourceLocation | — | Statistic category. Omit for a custom statistic; examples: minecraft:crafted, minecraft:broken, minecraft:used, minecraft:mined, minecraft:killed, minecraft:killed_by | |
stat | ResourceLocation | ✅ | — | Custom statistic id when stat_type is omitted; otherwise the category target id (item, block, or entity type) |
value | int | ✅ | — | Right-hand comparison value |
comparison | Comparison | >= | Comparison operator |
Custom Statistics
Omit stat_type for values in Minecraft's custom statistic registry, such as walk_one_cm, jump, or play_time:
{
"type": "epiphany:statistic",
"stat": "minecraft:walk_one_cm",
"comparison": ">=",
"value": 100000
}Typed Statistics
For statistics with a category and target, provide them separately. A value such as minecraft:crafted:minecraft:iron_pickaxe is not a valid ResourceLocation and must not be placed in stat.
{
"type": "epiphany:statistic",
"stat_type": "minecraft:crafted",
"stat": "minecraft:iron_pickaxe",
"comparison": ">=",
"value": 2
}For example, require the player to both craft and break two iron pickaxes:
{
"type": "epiphany:and",
"conditions": [
{
"type": "epiphany:statistic",
"stat_type": "minecraft:crafted",
"stat": "minecraft:iron_pickaxe",
"comparison": ">=",
"value": 2
},
{
"type": "epiphany:statistic",
"stat_type": "minecraft:broken",
"stat": "minecraft:iron_pickaxe",
"comparison": ">=",
"value": 2
}
]
}Unknown statistic categories or target IDs evaluate to false and produce a warning in the log.
epiphany:dimension (Current Dimension)
| Field | Type | Required | Description |
|---|---|---|---|
dimension | ResourceLocation | ✅ | Dimension id |
{ "type": "epiphany:dimension", "dimension": "minecraft:the_nether" }epiphany:biome (Current Biome)
Evaluates the player's current biome.
| Field | Type | Required | Description |
|---|---|---|---|
biome | String | ✅ | Biome id or "#tag" reference (e.g., minecraft:cherry_grove / "#minecraft:is_ocean") |
Auto-Unlock & Polling
This condition is evaluated by the 10-tick polling system and is immediately satisfied when the player enters the target biome.
epiphany:structure (Inside Structure)
Evaluates whether the player is inside a specified structure (requires the chunk to have generated the structure start).
| Field | Type | Required | Description |
|---|---|---|---|
structure | String | ✅ | Structure id or "#tag", e.g., minecraft:stronghold / "#minecraft:villages" |
epiphany:advancement (Advancement Earned)
| Field | Type | Required | Description |
|---|---|---|---|
advancement | ResourceLocation | ✅ | Advancement id, e.g., minecraft:story/mine_stone |
epiphany:item (Holds a Certain Item)
Evaluates whether the player has at least count of a specified item across their inventory + equipment + hotbar.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
item | String | ✅ | — | Item id or "#tag" |
count | int | 1 | Quantity |
epiphany:item_used (Has Used an Item)
Cumulative number of times the player has used this item.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
item | String | ✅ | — | Item id (note: only plain id; tags are not supported) |
count | int | 1 | Cumulative count |
epiphany:item_crafted (Items Crafted)
Checks the cumulative number of a specified item that the player has crafted, using the vanilla Stats.ITEM_CRAFTED statistic. Supports an item id or an item tag prefixed with #; tag conditions sum the crafted counts of every item in the tag.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
item | String | ✅ | — | Item id or "#tag" |
count | int | 1 | Minimum cumulative crafted count |
{ "type": "epiphany:item_crafted", "item": "minecraft:iron_pickaxe", "count": 2 }Auto-unlock is checked immediately when the player crafts an item; statistics earned before the condition was added also count.
epiphany:item_broken (Items Broken by Durability)
Checks the cumulative number of a specified item that the player has broken through durability loss, using the vanilla Stats.ITEM_BROKEN statistic. Supports an item id or an item tag prefixed with #; tag conditions sum the broken counts of every item in the tag.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
item | String | ✅ | — | Item id or "#tag" |
count | int | 1 | Minimum cumulative broken count |
{ "type": "epiphany:item_broken", "item": "#yourmod:durable_tools", "count": 3 }Auto-unlock is checked immediately when a player's item breaks. This condition does not count manually dropped, cleared, or otherwise removed items that did not break through durability loss.
epiphany:block_broken (Blocks Mined)
Cumulative number of times the player has mined this block.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
block | String | ✅ | — | Block id or "#tag" |
count | int | 1 | Cumulative count |
epiphany:kill_entity (Entities Killed)
Cumulative number of times the player has killed this entity type.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
entity | String | ✅ | — | Entity id or "#tag" |
count | int | 1 | Cumulative count |
FakePlayer Exclusion
Both kill_entity and block_broken exclude FakePlayers, so kills/mining contributed by automation mods (e.g., Create) are not counted in the statistics.
epiphany:aptitude (Aptitude Value)
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
value | long | ✅ | — | Right-hand comparison value |
comparison | Comparison | >= | Comparison operator |
epiphany:insight_points (Insight Points)
The player's current available Insight Points (not counting spent ones). Note: this is the current balance, not the cumulative total.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
value | int | ✅ | — | Right-hand comparison value |
comparison | Comparison | >= | Comparison operator |
epiphany:module_selected (Module Selected)
| Field | Type | Required | Description |
|---|---|---|---|
module | ResourceLocation | ✅ | Module id |
epiphany:module_completed (Module Completed)
| Field | Type | Required | Description |
|---|---|---|---|
module | ResourceLocation | ✅ | Module id |
epiphany:insight_selected (Insight Unlocked)
| Field | Type | Required | Description |
|---|---|---|---|
insight | ResourceLocation | ✅ | Insight id |
epiphany:epiphany_selected (Epiphany Activated)
| Field | Type | Required | Description |
|---|---|---|---|
epiphany | ResourceLocation | ✅ | Epiphany id |
FTB Quests Integration (Soft Dependency)
Soft Dependency
The following 4 types require FTB Quests to be installed to actually function. When absent, they always return false, but the datapack will still load.
Since FTBQ conditions are event-driven (isEventDriven() == true), auto-unlock skips polling evaluation for these types and only checks them when the corresponding FTBQ event fires.
epiphany:ftbq_quest (Quest Completed)
| Field | Type | Required | Description |
|---|---|---|---|
quest | String | ✅ | FTBQ quest hex string id |
epiphany:ftbq_chapter_started (Chapter Started)
| Field | Type | Required | Description |
|---|---|---|---|
chapter | String | ✅ | FTBQ chapter hex string id |
epiphany:ftbq_chapter_completed (Chapter Completed)
| Field | Type | Required | Description |
|---|---|---|---|
chapter | String | ✅ | FTBQ chapter hex string id |
epiphany:ftbq_tag (Has Tag Mark)
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
tag | String | ✅ | — | FTBQ tag string |
count | int | 1 | Minimum tag count required |
KubeJS Integration (Soft Dependency)
epiphany:kubejs_stage (Has Stage)
Evaluates whether the player has the specified KubeJS stage.
| Field | Type | Required | Description |
|---|---|---|---|
stage | String | ✅ | KubeJS stage name |
When KubeJS is not installed, this condition always returns false.
Comparison Operators
Comparison
Several condition types use comparison operators. Write the operator as a JSON string:
| Syntax | Meaning |
|---|---|
>= | Greater than or equal to (default) |
<= | Less than or equal to |
== | Equal to |
> | Greater than |
< | Less than |
Invalid Operators
An unrecognized operator silently falls back to >=.
Built-in Type Reference
| Type | Fields | Tag support | Event-driven | Soft dependency |
|---|---|---|---|---|
always / never | 0 | — | No | — |
and / or / not | 1 (child condition) | — | No | — |
attribute | 3 | — | No | — |
aptitude | 2 | — | No | — |
insight_points | 2 | — | No | — |
experience_level | 2 | — | No | — |
effect | 2 | — | No | — |
statistic | 3 | — | No | — |
dimension | 1 | — | No | — |
biome | 1 | Yes | No (polling) | — |
structure | 1 | Yes | No (polling) | — |
advancement | 1 | — | No | — |
item | 2 | Yes | No | — |
item_used | 2 | No | No | — |
item_crafted | 2 | Yes | Yes | — |
item_broken | 2 | Yes | Yes | — |
block_broken | 2 | Yes | No | — |
kill_entity | 2 | Yes | No | — |
module_selected / module_completed | 1 | — | No | — |
insight_selected | 1 | — | No | — |
epiphany_selected | 1 | — | No | — |
ftbq_quest / ftbq_chapter_started / ftbq_chapter_completed | 1 | — | Yes | FTB Quests |
ftbq_tag | 2 | — | Yes | FTB Quests |
kubejs_stage | 1 | — | No | KubeJS |