V2.0 RELEASE
๐ Looking for Beta Testers! Found a bug? Report it on our Discord or GitHub โ every report helps shape the stable release.
๐ What is ProgressiveStages?
ProgressiveStages 2.0 is the most complete progression-control framework available for NeoForge 1.21.1. Built for modpack developers who want players to actually earn their way through content โ not skip straight to endgame on day one.
Lock items, blocks, fluids, recipes, crops, enchantments, dimensions, mobs, interactions, loot rolls, GUIs, pet interactions, structures, and 3D regions behind meaningful progression milestones. Players unlock stages through exploration, quests, advancements, boss kills, item pickups, or any combination of those events. No more sequence breaking. No more bypassing your carefully crafted progression curve.
If you've ever wanted Gamestages โ but on modern NeoForge, with depth, with team support, with EMI/JEI integration, and with the kind of safety nets that survive real modpacks โ this is it.
โจ What's new in 2.0?
2.0 is a ground-up rewrite of the locking model. Every category now uses the same unified prefix system, the same [unlocks] carve-out grammar, and the same per-stage [enforcement] exemptions. New surfaces, new triggers, and a completely rewritten config schema:
- ๐ Unified prefix system โ
id: / mod: / tag: / name: / # all work in every locked list, across every category.
- ๐
[[multi]] trigger requirements โ gate a stage behind a set of conditions ("own a stone sword AND a stone pickaxe AND a stone axe"). Mix item:, advancement:, dimension:, and boss: sub-triggers freely, with all_of or any_of semantics.
- ๐ Multi-stage gating โ the same content can be locked by multiple stages at once. Players must unlock every gating stage to use it.
- ๐
[crops] โ full crop-progression gating: planting, growth, bonemeal, harvest.
- ๐
[enchants] โ gate enchantments at the table, the anvil, villager trades, AND strip them from existing gear on inventory scan.
- ๐
[mobs] โ gate spawning of specific mobs (or whole mod namespaces, or tags). Includes dynamic replacement โ swap an unwanted spawn for a friendlier mob automatically.
- ๐
[pets] โ separately gate taming, breeding, commanding, and riding for animals.
- ๐
[screens] โ one list gates every GUI surface, including held-item GUIs (backpacks, portable workstations, held shulker boxes).
- ๐
[structures] โ gate entry to vanilla and modded structures, lock chests inside them, prevent block break/place/explosions/spawns inside the bounding box.
- ๐
[[regions]] โ define hand-authored 3D boxes per dimension with their own flags and debuffs.
- ๐
[loot] โ a single list filters chest, fishing, archeology, mob-drop, and block-drop rolls through a Global Loot Modifier. Lootr is supported out of the box.
- ๐
[curios] โ per-slot gating when Curios is installed.
- ๐
[[interactions]] โ fine-grained "item-on-block" / "item-on-entity" / "right-click-this-block" rules for Create-style and modded interactions.
- ๐ Native FTB Quests "Stage Required" field on every quest and chapter โ no workarounds.
- ๐
/stage progress command โ next shows what you can unlock right now (with per-trigger โ/โ), all shows the full roadmap, <stage> shows the breakdown for one specific stage.
- ๐ Creative-bypass popup so admins know when their actions are being skipped.
- ๐ Configurable messages โ every chat line, tooltip, and lock message supports
&-color codes and placeholders.
- ๐ Operator-only stage names โ non-op players see spoiler-free generic messages.
- ๐
[unlocks] carve-outs โ broad locks (mod:ae2, name:diamond) can carve out specific exceptions on a per-stage basis.
- ๐
[enforcement] per-stage exemptions โ let players stockpile raw materials before unlocking the use of them.
๐ The Comprehensive Locking System
Every category below uses the same unified prefix system. You can mix and match id: / mod: / tag: / name: entries in any list:
| Prefix |
Meaning |
Example |
id:<namespace:path> |
Exact registry ID |
id:minecraft:diamond |
| (no prefix) |
Implicit id: |
minecraft:diamond |
mod:<namespace> |
Entire mod namespace |
mod:ae2 |
tag:<namespace:path> |
A registry tag |
tag:minecraft:logs |
name:<substring> |
Case-insensitive substring of the full ID |
name:netherite |
#<namespace:path> |
Legacy tag shorthand |
#minecraft:crops |
What you can lock
- ๐ช Items โ use, pickup, hotbar, mouse-pickup, full-inventory removal, all independently toggleable.
- ๐ฆ Blocks โ placement and right-click interaction. State-aware (Visual Workbench-style shim systems are handled correctly).
- ๐งช Fluids โ bucket pickup, bucket placement, in-world flow, submersion (locked fluids apply Slowness II + Blindness), and recipe-viewer visibility.
- ๐ Recipes โ by recipe ID (
locked_ids) OR by output item (locked_items). Hide locked recipes from EMI/JEI entirely or show them with overlays.
- ๐พ Crops โ planting, growth, bonemeal, harvest. Growth uses nearest-player resolution so a single un-staged player doesn't slow the whole server.
- ๐ Dimensions โ pre-travel cancel + post-travel safety net + per-second tick check. Nature's Compass is gated automatically.
- โจ Enchantments โ at the table, the anvil, villager trades, AND stripped from inventory items on the periodic scan (catches loot, fishing, etc.). Curios slots are scrubbed too.
- ๐พ Entities (attack) โ
[entities] blocks attacking specific entity types.
- โ๏ธ Interactions โ
[[interactions]] lets you gate block_right_click, item_on_block, and item_on_entity events in fine detail.
- ๐ Loot rolls โ chest loot, fishing rolls, archeology, mob drops, block drops, Lootr per-player rolls โ all filtered through a single
[loot] list.
- ๐บ Mob spawning โ
locked_spawns cancels finalizeSpawn-based spawns. Dynamic replacement ([[mobs.replacements]]) lets you swap one mob for another at spawn time.
- ๐ถ Pets โ independently gate taming, breeding, commanding (sit/stand/follow), and riding.
- ๐ฅ๏ธ Screens (GUIs) โ one list, two surfaces: block GUIs (crafting tables, anvils, chests, modded machines) AND held-item GUIs (backpacks, portable workstations, held shulkers).
- ๐๏ธ Structures โ gate vanilla + modded structure entry. Chest-locking inside the bounding box is always on. Optional rule flags:
prevent_block_break, prevent_block_place, prevent_explosions, disable_mob_spawning.
- ๐ Regions โ hand-authored 3D boxes in a specific dimension with per-region flags: push players out + debuff, prevent break/place/explosions/spawns.
- ๐ Curios slots โ per-slot gating with automatic ejection + enchantment-strip when Curios is installed.
Whitelists win
Every category supports always_unlocked = [...] for exact-ID exceptions. Lock all of Mekanism but keep the Configurator usable:
[items]
locked = ["mod:mekanism"]
always_unlocked = ["mekanism:configurator"]
And per-stage [unlocks] carves out exceptions in even broader scopes โ see the docs for the full grammar.
โก Automatic Stage Triggers
Triggers live in one file (config/ProgressiveStages/triggers.toml). Stages grant themselves when players:
- ๐
Complete a specific advancement โ
[advancements]
- ๐ Pick up a target item โ
[items] (also scans inventory at login to catch players who already have it)
- ๐ Enter a dimension for the first time โ
[dimensions] (one-time, persisted per-world)
- ๐ Defeat a boss โ
[bosses] (one-time, persisted per-world)
๐ [[multi]] โ compound trigger requirements
The headline 2.0 trigger feature. Require MULTIPLE conditions before a stage is granted:
[[multi]]
stage = "stone_tools_master"
description = "Own a full set of stone tools"
all_of = [
"item:minecraft:stone_sword",
"item:minecraft:stone_pickaxe",
"item:minecraft:stone_axe",
]
Mix surfaces freely โ items, advancements, dimensions, bosses:
[[multi]]
stage = "endgame"
description = "Beat the major bosses + reach the End + survive once"
all_of = [
"boss:minecraft:ender_dragon",
"boss:minecraft:wither",
"dimension:minecraft:the_end",
"advancement:minecraft:adventure/totem_of_undying",
]
Use any_of instead of all_of for "satisfy any one route" gating. Per-player progress is persisted across restarts; retroactive credit on login is given for item / advancement / dimension surfaces (boss kills must be re-earned).
๐ Dependency Graph
Stages declare other stages as prerequisites โ single string or list. The dependency graph is an arbitrary DAG, validated at load time:
Linear progression โ the classic tier chain:
๐ชจ stone_age
โโโ โ๏ธ iron_age
โโโ ๐ diamond_age
โโโ ๐ฎ netherite_age
Branching paths โ tech and magic unlock separately:
๐ชจ stone_age
โโโ โ๏ธ iron_age
โ โโโ ๐ diamond_age
โ โโโ ๐ญ tech_age
โ โโโ โข๏ธ nuclear_age
โโโ ๐ magic_age
โโโ ๐ฎ arcane_age
โโโ ๐ฟ nature_age
Multi-dependency gates โ require multiple paths before unlocking endgame:
๐ชจ stone_age
โโโ โ๏ธ iron_age โโโโโโโโโโโโโโโโโโโ
โ โโโ ๐ diamond_age โโโโโโโโค
โ โผ
โโโ ๐ magic_age โโโโโโโโโโบ ๐ endgame_age
โโโ ๐ฎ arcane_age โโโโโโโโโ
(requires BOTH diamond_age AND arcane_age)
Parallel independent trees โ some stages have no dependencies at all:
๐ชจ stone_age ๐ฟ nature_age ๐บ๏ธ exploration_age
โโโ โ๏ธ iron_age โโโ ๐ฎ druid_age โโโ ๐ nether_age
โโโ ๐ diamond_age โโโ ๐ end_age
With linear_progression = true, granting a stage auto-grants every missing dependency up the chain. With it false, /stage grant warns about missing dependencies and requires a second confirmation to bypass.
๐ EMI & JEI Integration
The best visual lock experience available for 1.21.1:
- ๐ Lock-icon overlays on every locked item in the index and recipe viewer (size + position configurable)
- ๐ Translucent highlight overlay on locked recipe outputs (color configurable, ARGB hex)
- ๐ฌ Tooltips showing the required stage name โ or a generic "Progress further to unlock" line for non-op players (
reveal_stage_names_only_to_operators)
- ๐ป Hide locked items from the search index entirely (optional)
- โ Item-name masking โ locked items render as "Unknown Item" until unlocked
- โก Updates instantly when a stage is granted or revoked, when switching gamemodes, or when reloading the config โ no relog, no reload
- ๐ก๏ธ NBT-variant aware โ every variant of locked items (Mekanism Chemical Tanks, Meka-Suit pieces, items with stored energy/fluid/chemical data) is hidden together
๐ฅ Team Progression (FTB Teams)
- ๐ค Team-scoped stages โ the whole team progresses together
- ๐ Synchronized unlocks โ one member earns it, the whole team gets it
- ๐พ
persist_stages_on_leave โ keep a player's stages when they leave the team
- ๐ช Automatic fallback to solo mode when FTB Teams isn't installed
๐ FTB Quests Integration
Native, deep integration:
- โ
Stage Tasks โ quests require a stage before completing
- ๐ Stage Rewards โ quests grant stages directly
- ๐ ๐ Stage Required field on every Quest and Chapter โ hide quests or whole chapters until a stage is reached, built directly into the Visibility section of the properties UI
- ๐ Live re-checks โ granting/revoking a stage debounces a recheck for every affected player, budgeted per tick so heavy quest packs stay smooth
- ๐ช Soft-disable โ if an FTB API change breaks integration, locks and EMI/JEI keep working; the mod logs a clear error pointing at the exact failure
๐ ๏ธ Pack Developer Tools
- ๐ TOML-based config โ human-readable, fully commented, no JSON hell
- ๐ Auto-generated examples โ
stone_age, iron_age, diamond_age, plus triggers.toml on first launch. The diamond_age.toml template is the canonical 2.0 reference, with every category and field documented inline.
- ๐ Live reload โ
/progressivestages reload re-parses all stage TOMLs and re-syncs every online player, no restart required
- โ๏ธ Validation โ
/progressivestages validate parses every stage file with detailed error reporting and warns about dependency issues before your players find them
- ๐
/stage progress โ show players exactly what they can unlock next, the full roadmap, or the per-trigger breakdown for one specific stage
- ๐ฌ Unlock messages โ broadcast color-coded chat messages to every team member when a stage unlocks
- ๐ Configurable messages โ every player-facing string (tooltips, chat, command output, type labels, creative popup) is overridable in config
- ๐ Debug logging โ verbose stage-check / lock-query / team-operation output
โ๏ธ Highly Configurable
Toggle any enforcement type independently โ items, recipes, blocks, entities, dimensions, interactions, mobs, crops, pets, screens, loot, enchants, regions, structures.
- ๐ฏ Per-stage
[enforcement] exemptions โ let players stockpile raw diamonds before unlocking the use of diamonds:
[items]
locked = ["name:diamond"]
[enforcement]
allowed_pickup = ["minecraft:diamond"]
allowed_inventory = ["minecraft:diamond"]
- ๐จ EMI/JEI visuals โ icon size, position, overlay color, hide-vs-show
- ๐ Notification cooldowns โ no chat spam when touching locked items
- ๐ญ Mask locked item names โ keep content mysterious with "Unknown Item"
- ๐ Lock sound โ configurable sound + volume + pitch when an action is blocked
- ๐ฎ Operator-only stage names โ
reveal_stage_names_only_to_operators hides stage IDs from non-op players for spoiler-free progression
- ๐ โ ๏ธ Creative-bypass popup โ warn admins when entering creative that locks are being skipped
- ๐ Debug logging โ detailed enforcement traces
๐ป Commands
Player-facing
/stage list [player] โ list a player's stages
/stage check <player> <stage> โ boolean check
/stage info <stage> โ stage metadata: id, dependencies, description, lock count
/stage tree โ ASCII dependency tree of every loaded stage
- ๐
/stage progress โ what the caller can unlock right now
- ๐
/stage progress next [player] โ every reachable stage + per-trigger โ/โ breakdown
- ๐
/stage progress all [player] โ full roadmap, including unreachable stages
- ๐
/stage progress <stage> [player] โ per-trigger breakdown for one specific stage
Admin
/stage grant <player> <stage> โ grant a stage (prompts for confirmation if dependencies are missing)
/stage revoke <player> <stage> โ revoke a stage
/progressivestages reload โ reload every stage file + triggers.toml, re-sync online players
/progressivestages validate โ detailed parse + dependency check across every stage file
/progressivestages ftb status [player] โ diagnostics for the FTB Quests integration
/progressivestages trigger reset <player> <type> <key> โ clear a persisted trigger (dimension, boss, multi)
- ๐
/progressivestages multi list [player] โ every [[multi]] requirement and (with a player) their per-requirement progress
/progressivestages no-creative-popup โ per-player toggle for the creative-bypass popup
๐ Integrations
- FTB Teams โ team-shared stage state, automatic fallback to solo
- FTB Quests + FTB Library โ Stage Tasks, Stage Rewards, native Stage Required property, live rechecks
- EMI โ lock icons, highlights, tooltips, NBT-variant hiding
- JEI โ lock icons, highlights, tooltips
- Curios โ per-slot gating, ejection, enchantment strip
- KubeJS โ scriptable stage grants/queries
- Lootr โ per-player loot roll filtering via the published
ILootrFilterProvider ServiceLoader
- Mekanism โ NBT-variant hiding for Chemical Tanks, Meka-Suit pieces, energized items
- Nature's Compass โ auto-gated when any dimension is locked
- Create / Visual Workbench โ state-aware block gating so workbench shims classify correctly
๐ฆ Requirements
- NeoForge for Minecraft 1.21.1 โ required
- EMI or JEI โ optional, for recipe viewer integration
- FTB Quests + FTB Library โ optional, for quest integration
- FTB Teams โ optional, for team-shared progression
- Curios โ optional, for per-slot gating
๐ Documentation
The mod ships with an exhaustive DOCUMENTATION.md covering every TOML field, every config key, every command, every integration, and every troubleshooting tip. Read it on GitHub, or grab the file out of the jar.
๐ Found a bug? Have a feature request?
Open an issue on GitHub or drop it in our Discord. ProgressiveStages 2.0 is actively developed and every report gets looked at. We're building toward a stable 1.0 release and your feedback directly shapes what comes next.