OtherStages is a configurable stage-based progression system for Minecraft Forge 1.20.1.
It lets you lock content behind custom stages and unlock those stages through configurable progression rules. The same stage metadata also drives the in-game unlock overlay, item tooltips, and several warning systems.
display_name, description, icon, and color.AND / OR logic.otherstages:stage_analyzer item.machine_age, arcane_tier, or chapter_03.stage_info.json is required for every stage. The other JSON files are optional.order matters. If a player has a stage with a higher order, that player also satisfies restrictions from lower-order stages.order values unique and increasing if you want a clean linear progression.On first launch the mod creates config files in:
config/
otherstages-server.toml
otherstages/
stages/
<stage_name>/
stage_info.json
blocked_items.json
blocked_mobs.json
blocked_structures.json
blocked_dimensions.json
blocked_villager_trades.json
progression.json
generated/
config/otherstages/generated/ is used by the Stage Analyzer item.
This file defines the stage identity and the metadata shown to the player.
| Field | Required | Type | Notes |
|---|---|---|---|
display_name | No | string | Shown in commands, messages, and unlock overlay. Falls back to a formatted version of the folder name. |
description | No | string | Optional subtitle/description used by the unlock overlay and stage info output. |
color | No | string | Hex color in #RRGGBB format. Used to tint the unlock overlay. |
icon | No | string | Item ID such as minecraft:diamond_pickaxe. Used in the unlock overlay. |
order | No | integer | Controls progression hierarchy. Higher order means higher stage. |
If display_name or description starts with otherstages., it is treated as a translation key. Otherwise it is shown as plain text.
{
"display_name": "Machine Age",
"description": "Basic automation is now available.",
"color": "#4FC3F7",
"icon": "minecraft:observer",
"order": 3
}
Used to block direct item IDs, item namespaces, NBT variants, tags, menu-based access rules, and interaction-driven block targets tied to the same stage.
Supported keys:
blocked_itemsblocked_namespacesblocked_tagstagList as a legacy alias for blocked_tagsblocked_recipesblocked_menu_classesblocked_menu_packagesblocked_menu_typesblocked_block_idsblocked_block_classesblocked_block_entity_classesblocked_block_entity_packagesEach blocked_items entry supports:
itemnbtexact_matchExample:
{
"blocked_items": [
{ "item": "minecraft:diamond_pickaxe" },
{
"item": "minecraft:potion",
"nbt": { "Potion": "minecraft:strong_healing" },
"exact_match": false
}
],
"blocked_namespaces": [
"create"
],
"blocked_tags": [
"forge:tools/netherite"
],
"blocked_recipes": [
"minecraft:iron_pickaxe",
"minecraft:netherite_upgrade_smithing"
],
"blocked_menu_packages": [
"appeng",
"com.refinedmods.refinedstorage"
],
"blocked_menu_types": [
"minecraft:anvil",
"minecraft:smithing"
],
"blocked_block_ids": [
"create:mechanical_crafter"
],
"blocked_block_entity_packages": [
"com.simibubi.create.content.kinetics.crafter"
]
}
Namespace matches are exact. create blocks create:*, but it does not block createaddition:*.
blocked_recipes matches recipe ids and is currently enforced for the player crafting grid, crafting table, smithing menu, stonecutter, and manual ingredient insertion into furnace-like menus.
blocked_menu_classes matches an exact menu class name. blocked_menu_packages matches any menu class whose fully-qualified name starts with the configured prefix. blocked_menu_types matches the registered MenuType id when one exists.
blocked_block_ids matches the placed block id itself, such as create:mechanical_crafter. blocked_block_classes matches the runtime block class. blocked_block_entity_classes and blocked_block_entity_packages are for interaction-driven machines that expose a block entity but not a normal menu.
Active in-game effects of blocked item rules:
create:mechanical_crafter, even when they do not open a normal menu.OtherStages stays player-based. Automation from other mods can still create blocked items, but blocked players cannot keep them in directly usable slots, cannot use them manually, and cannot manually feed blocked recipe ingredients into many menu-driven machine screens.
Blocks natural spawning and nearby spawn attempts for the listed entities.
{
"blocked_mobs": [
"minecraft:enderman",
"minecraft:warden"
]
}
Blocks entering and interacting inside listed structures.
{
"blocked_structures": [
"minecraft:stronghold",
"minecraft:ancient_city"
]
}
Minecraft 1.20.1 uses separate IDs for many village variants, so include each variant you want to block.
Blocks travel to listed dimensions.
{
"blocked_dimensions": [
"minecraft:the_nether",
"minecraft:the_end"
]
}
If teleportOnInvalidDimension is enabled in otherstages-server.toml, players found inside a restricted dimension can be moved back to safety on login.
If a player's respawn point is set inside a blocked dimension, the respawn target is reset to the Overworld.
Blocks villager trades by profession and level.
Supported fields per entry:
professionlevelmin_levelmax_levelprofession accepts:
minecraft:librarian*anyExample:
{
"blocked_villager_trades": [
{
"profession": "*",
"min_level": 2,
"max_level": 5
},
{
"profession": "minecraft:cleric",
"level": 1
}
]
}
If a villager has both allowed and blocked trades, the trading screen opens with only the accessible offers. If nothing is accessible, the player receives a warning instead.
Defines how a player unlocks the stage.
Supported condition types:
advancementitem_countexperiencedimensionkill_countcraft_countftb_questandorExample:
{
"unlock_conditions": {
"type": "AND",
"conditions": [
{ "type": "advancement", "advancement": "minecraft:story/enter_the_nether" },
{ "type": "item_count", "item": "minecraft:blaze_rod", "count": 8, "consume": true },
{ "type": "dimension", "dimension": "minecraft:the_nether" }
]
},
"next_stage": "end_access"
}
next_stage is optional. It can be useful as documentation for your own stage chain, but the actual unlock logic is driven by unlock_conditions.
The mod reevaluates progression automatically when useful events happen, including:
You can also force a recheck with:
/otherstages check <player>
All commands are under /otherstages and require permission level 2.
/otherstages stage list
/otherstages stage <stage_name> info
/otherstages player <target> info
/otherstages player <target> add <stage>
/otherstages player <target> remove <stage>
/otherstages player <target> clear
/otherstages player <target> reset
reset now uses the defaultStartingStage value from config/otherstages-server.toml.
/otherstages check <player>
/otherstages reload
/otherstages cache clear
/otherstages cache info
cache info prints current item cache entries, tracked players, hits, misses, invalidations, and hit rate.
/otherstages debug item
/otherstages debug menu
/otherstages debug block
/otherstages debug stages
/otherstages dimension check <player> <dimension>
/otherstages dimension list <player>
debug menu prints the current open menu when one exists, or the last remembered non-player menu after you close it. It shows the class, package, registered menu type, whether the current player is blocked from it, the required stage when applicable, and copy-ready blocked_menu_* snippets. It also suggests which key is usually the best fit for the current screen.
debug block inspects the block you are looking at. It is useful for systems like Create where interaction can be block-driven instead of menu-driven. It now prints copy-ready blocked_block_* snippets and suggests the most stable key to use. If the block does not look menu-based, blocked_menu_* is probably not the right lever.
When a stage is granted, the client receives a stage unlock notification that uses:
display_namedescriptioniconcolorThis is the current generic overlay format. It does not depend on stage names like stone_age, iron_age, or diamond_age.
Blocked items add a tooltip line telling the player which stage is required.
If JEI or REI is installed, blocked items are hidden for each player according to that player's unlocked stages.
Main server config file:
config/otherstages-server.toml
Important options:
enableStageModeenableTooltipsenableWarningswarningDurationteleportOnInvalidDimensiondefaultStartingStageenableDebugLoggingcacheSizedefaultStartingStage is currently used by /otherstages player <target> reset. It is not automatically granted to every new player on first login in the current code path.
The mod includes the otherstages:stage_analyzer item.
Usage:
config/otherstages/generated/.blocked_items.json.The analyzer supports vanilla containers and many modded storage systems through direct support or reflective fallbacks.
If the clicked block is not a supported container, the analyzer falls back to a block inspection readout with the block ID and state properties.
stage_info.json is required for each stage.order means higher progression tier.order./otherstages reload after editing JSON files.
Complete stage-based progression system that blocks Minecraft content until specific conditions are met, featuring automatic configuration tools and advanced optimization.