HomeJavaModsRestage
Restage
ModsJava

Restage

by Rampage99 · on CurseForge

A per-player stage system that locks recipes, dimensions, and items until unlock conditions are met. Free Minecraft Java mod for 1.21.1.

⬇ Download on CurseForge

The author built this one for Minecraft 1.21.1 on NeoForge. On other versions it may install and then do nothing.

alt text

Restage

Restage is a stage-based progression mod for Minecraft 1.21.1 (NeoForge) that lets pack authors gate recipes, dimensions, and item handling behind per-player stages. Stages are unlocked through configurable conditions — crafting, killing mobs, earning advancements, or manually submitting items — and the entire system is configurable live in-game through a polished ModernUI interface, no restart required.


Features at a glance


Rule types

Recipe Rules

Type What it blocks
Mod Rule All recipes belonging to a mod namespace, with optional exceptions
Recipe ID A single recipe by its full resource location
Regex Rule All recipes whose ID matches a regex pattern, with optional exceptions
Output Rule All recipes that produce a specific item

Dimension Rules

Block access to an entire dimension until the player holds the required stage.

Unlock Conditions

Type Trigger
Item Condition Player manually submits items (consumed on unlock)
Kill Condition Player kills N entities of a specific type
Craft Condition Player crafts N of a specific item
Advancement Condition Player earns a specific advancement

Item Restrictions

Restrict one or more interactions with items matched by item ID, item tag, or mod namespace:

Flag Description
Pickup Prevent picking up from the ground
Inventory Eject from inventory if present
Equip Prevent equipping in armour slots
Right-click Prevent right-click use
Left-click Prevent left-click use
Attack Prevent using as a melee weapon

Each restriction supports custom rich-text messages with per-segment colour picking for all three message slots (pickup, inventory, usage).


In-game configuration GUI

Open with the keybind (default: unbound) or /restage gui (requires permission level 2).

The GUI is built on ModernUI and requires no server restart — changes are saved and applied instantly across all connected players.

Main screen — lists every configured stage as a card showing rule/condition/restriction counts per category. Create, edit, or delete stages with inline confirmation dialogs.

Stage editor — sidebar with an editable stage name field and three category tabs (Rules · Conditions · Restrictions). The right panel lists all rules in the selected category with Edit and Delete per row.

Rule editor — sidebar type selector, autocomplete for all IDs (mod, item, recipe, entity, advancement, dimension, tag), optional exceptions list, count field for conditions, restriction flag checkboxes, and rich-text message composer.

All deletions require inline confirmation. Cancelling with unsaved changes prompts before discarding.


Commands

All commands require permission level 2 (operator), except reload which requires level 4.

/restage add <player> <stage>       — add a stage without the unlock animation
/restage grant <player> <stage>     — add a stage with the title/subtitle notification
/restage remove <player> <stage>    — remove a specific stage from a player
/restage removeall <player>         — remove all stages from a player
/restage info [player]              — show which stages a player currently holds
/restage list                       — list all players and their stages
/restage rules                      — dump currently loaded rules to chat
/restage gui                        — open the live configuration GUI
/restage reload                     — reload rules from config and re-sync all players

Tab-completion is available for stage names on all relevant commands.


KubeJS API

Restage exposes a full server-side KubeJS event for pack authors who prefer scripts over the GUI. Rules added via KubeJS are merged with GUI-configured rules at load time.

RestageEvents.addStageRules(event => {

    // Block all Thermal Expansion recipes until "thermal_unlock" stage
    event.addModRule("thermal_unlock", "thermal")

    // Block all Create recipes except the hand-crank
    event.addModRule("create_basic", "create", "create:hand_crank")

    // Block a single recipe by ID
    event.addIdRule("nether_access", "minecraft:nether_star")

    // Block all recipes matching a regex
    event.addRegexRule("end_stage", "minecraft:.*_sword")

    // Block all recipes that produce netherite ingots
    event.addOutputRule("netherite_tier", "minecraft:netherite_ingot")

    // Block the Nether dimension
    event.addDimensionRule("nether_access", "minecraft:the_nether")

    // Add a stage dependency fro another stage
    event.addStagePrerequisite("stage_b", "stage_a");

    // Unlock "nether_access" by submitting 3 blaze rods
    event.addItemCondition("nether_access", "minecraft:blaze_rod", 3)

    // Unlock "hunter" stage by killing 10 zombies
    event.addKillCondition("hunter", "minecraft:zombie", 10)

    // Unlock "crafter" stage by crafting 5 pistons
    event.addCraftCondition("crafter", "minecraft:piston", 5)

    // Unlock "explorer" stage via an advancement
    event.addAdvancementCondition("explorer", "minecraft:story/enter_the_nether")

    // Restrict netherite sword until "netherite_tier" stage
    let r = event.addItemRestriction("netherite_tier", "minecraft:netherite_sword")
    r.setCanPickedUp(false)
    r.setCanBeEquipped(false)
    r.setCanAttack(false)

    // Restrict all items in a tag
    event.addTagRestriction("end_stage", "minecraft:swords")

    // Restrict all items from a mod
    event.addModItemRestriction("thermal_unlock", "thermal")
})

The GUI automatically exports its current configuration to kubejs/server_scripts/restage_generated.js every time you save, so you can inspect or version-control the generated rules.


Configuration

config/restage-server.toml — server-side config with all rule lists and notification messages.

[stages]
  notifyOnBlock = true

  grantTitle    = "§a§lStage Unlocked!"
  grantSubtitle = "§f%s"
  grantChatMsg  = "§a[Stages] §fStage §e%s§f unlocked!"

  machineBlockedMsg = "§c[Stages] §fThis machine can't work: recipe blocked by a stage."
  craftBlockedMsg   = "§c[Stages] §fYou don't have stage §e%s§f to craft this."

  itemRestrictPickupMsg    = "§c[Stages] §fCan't pick up this item: stage §e%s§f required."
  itemRestrictInventoryMsg = "§c[Stages] §fItem removed from inventory: stage §e%s§f required."
  itemRestrictEquipMsg     = "§c[Stages] §fCan't equip this item: stage §e%s§f required."
  itemRestrictUseMsg       = "§c[Stages] §fCan't use this item: stage §e%s§f required."
  itemRestrictAttackMsg    = "§c[Stages] §fCan't attack with this item: stage §e%s§f required."

  uiOutputPath = "kubejs/server_scripts/restage_generated.js"

Dependencies

Mod Required Notes
NeoForge 21.1.x ✅ Required  
ModernUI ✅ Required Powers the in-game config GUI
KubeJS ⚪ Optional Enables the scripting API
JEI ⚪ Optional Recipe visibility integration
Create ⚪ Optional Machine stage enforcement

Roadmap

✅ Implemented (v1.0.x)

🔜 Planned


Restage is licensed All Rights Reserved. Issues and suggestions are welcome on the project page.

Verified by MCModsHub

These come from our own check of the pack file, not from the source page.

Explore more