Skip to main content
Version: 6.0.x

Stage Modes

A stage's mode decides how it opens — and, as a consequence, whether a Research Scroll exists for it at all. Leave the key out and the stage is default.

ModeScroll?Opens when
defaultyesa player researches it at a pedestal
autonothe player does something that trips a trigger
externalyesa command or a script says so — the pedestal refuses it
temporarynoa trigger fires; it then relocks itself after a timer

Picking between them is mostly a question of who is in control. default puts it in the player's hands, auto makes it a consequence of play, external keeps it with the pack author or a quest mod, and temporary is for anything that is supposed to end.

Mode and dependencies are separate things: dependencies say what has to be true before a stage may be researched, and only default and external stages have research to gate.

In the editor​

Stage Settings, the button on the stage's own screen. The mode is a dropdown, and picking one swaps the card underneath it for that mode's own settings — the trigger list for auto, the duration and cooldown for temporary, a note for external explaining that the pedestal will refuse it.

Triggers are added from a searchable list, with the combine mode (any or all) above them.

default​

The standard mode. A Research Scroll is generated for this stage and players unlock it by researching that scroll at a Research Pedestal.

{
"display_name": "Iron Age",
"mode": "default"
}

The "mode" key can be omitted entirely — default is the fallback for any stage that does not specify one.

auto​

No scroll is generated. The stage unlocks automatically when the player meets one or more trigger conditions defined in the "auto_trigger" block.

{
"display_name": "Nether Explorer",
"mode": "auto",
"auto_trigger": {
"mode": "any",
"triggers": [
{ "type": "dimension", "id": "minecraft:the_nether" },
{ "type": "advancement", "id": "minecraft:story/enter_the_nether" }
]
}
}

Combine mode​

The "mode" field inside "auto_trigger" controls how multiple triggers are evaluated:

ValueBehaviour
"any" (default)The stage unlocks when any one trigger fires
"all"The stage unlocks only after every trigger has fired

Trigger types​

Each entry in "triggers" requires a "type" field and type-specific parameters:

TypeParametersDescription
"item""id"Player picks up or crafts the item
"biome""id"Player enters the biome
"dimension""id"Player enters the dimension
"structure""id"Player enters the structure
"entity""id", "sub_mode"Player interacts with an entity
"block_place""id"Player places the block
"block_break""id"Player breaks the block
"advancement""id"Player earns the advancement
"playtime""days"Player has been online for N in-game days
"stat""category", "id", "count"A vanilla statistic reaches count
"xp_level""level"Player reaches the experience level
"effect""id"Player is given the status effect
"weather""state"The weather in the player's dimension
"day_count""days"The world reaches day N
"world_time""preset", "from", "to"The time of day

The "entity" trigger supports an optional "sub_mode" field to restrict which interaction counts:

sub_modeBehaviour
"any" (default)Either killing or interacting triggers the stage
"kill"Only killing the entity counts
"interact"Only right-clicking the entity counts

The "stat" trigger​

The generic one, and usually the one you want. "category" names which of the nine vanilla statistic types to read, and "id" is looked up in that category's registry:

categoryid comes fromExample
"custom"The custom-stat registryminecraft:fish_caught
"mined"Blocksminecraft:diamond_ore
"crafted"Itemsminecraft:bread
"used"Itemsminecraft:diamond_pickaxe
"broken"Itemsminecraft:iron_axe
"picked_up"Itemsminecraft:emerald
"dropped"Itemsminecraft:rotten_flesh
"killed"Entity typesminecraft:zombie
"killed_by"Entity typesminecraft:creeper

Because "custom" reaches the whole custom-stat registry, several things that look like they would need triggers of their own do not: fishing (minecraft:fish_caught), sleeping (minecraft:sleep_in_bed), distance walked (minecraft:walk_one_cm), time riding, damage dealt. Before asking for a new trigger type, check whether the game already counts it.

"count" is clamped to at least 1 — a threshold of 0 would be met by every player before they had done anything. A "category" this build does not know, or an "id" missing from its registry, never fires.

The "weather" trigger​

"state" is one of "clear", "rain" or "thunder".

"rain" matches a thunderstorm as well, because vanilla's own isRaining() does. Use "thunder" when you mean only the storm, and "clear" for dry weather.

The "world_time" trigger​

"preset" is one of "day", "sunset", "night", "sunrise" or "custom":

presetWindow (ticks)
"day"0 – 11999
"sunset"12000 – 12999
"night"13000 – 22999
"sunrise"23000 – 23999

With "custom", "from" and "to" are read instead, both clamped to 0 – 23999. "from" above "to" is a window running across midnight, not an empty one — 22000 to 2000 is the four hours around midnight. The named presets carry their own window, so they write no "from" or "to" into the file.

Examples​

"triggers": [
{ "type": "item", "id": "minecraft:diamond" },
{ "type": "biome", "id": "minecraft:jungle" },
{ "type": "entity", "id": "minecraft:villager", "sub_mode": "interact" },
{ "type": "playtime", "days": 3 },
{ "type": "stat", "category": "used", "id": "minecraft:diamond_pickaxe", "count": 50 },
{ "type": "xp_level", "level": 30 },
{ "type": "effect", "id": "minecraft:blindness" },
{ "type": "weather", "state": "thunder" },
{ "type": "day_count", "days": 7 },
{ "type": "world_time", "preset": "night" },
{ "type": "world_time", "preset": "custom", "from": 22000, "to": 2000 }
]

external​

A scroll is generated, but the Research Pedestal refuses to research it. The stage can only be unlocked by a server operator with /history global unlock <stage>, or by a script.

Use it when unlocking should stay entirely with the pack author — an FTB Quests reward, a custom event, a ceremony run by hand. The scroll still exists, so players can read what the stage holds back and see it in the Stage Graph; they simply cannot research their way in.

{
"display_name": "Prestige Unlock",
"mode": "external"
}

temporary​

Like auto, but the stage re-locks automatically after a configured duration. No scroll is generated.

Use it for anything that is meant to end: a trading window, a seasonal buff, a recurring event on a cooldown.

A running timer and the trigger count are runtime state, not file state, so there is no way to read them out of the stage file. /history temporary is what inspects and resets them — info, reset and setcount, for global and individual stages alike.

{
"display_name": "Harvest Festival",
"mode": "temporary",
"auto_trigger": {
"triggers": [
{ "type": "advancement", "id": "mypack:events/harvest_begins" }
]
},
"temporary": {
"duration": 3,
"duration_unit": "days",
"max_triggers": 0,
"cooldown": 12,
"cooldown_unit": "hours"
}
}

temporary options​

KeyTypeDefaultDescription
durationInteger1How long the stage stays unlocked after the trigger fires
duration_unitString"hours"Unit for duration: "seconds", "minutes", "hours", or "days"
max_triggersInteger1Maximum number of times the stage may unlock in total (see below)
cooldownInteger0Wait time after re-locking before the trigger is accepted again
cooldown_unitString"hours"Unit for cooldown: same options as duration_unit

max_triggers in detail​

  • 1 — the stage unlocks exactly once and stays locked permanently afterwards. The cooldown does not apply. A server operator can still unlock it manually via /history global unlock, but that does not start a new timer.
  • N > 1 — the stage may unlock up to N times total. After each re-lock, the cooldown must pass before the trigger is accepted again.
  • 0 — unlimited unlocks. After each re-lock, only the cooldown prevents immediate re-triggering. A cooldown of 0 means the stage can fire again right away.
Dying ends a running timer early

If a temporary individual stage also has lose_on_death, dying ends the timer and starts the cooldown as though it had expired on its own — it does not count against max_triggers any differently from a normal expiry.

See also​

  • Dependencies — what has to be done before a default or external stage may be researched.
  • Research Scrolls — the item default and external stages produce.
  • Commands — unlocking, relocking, and the temporary subcommands.
Something wrong or missing here? Ask on Discord · Open an issue