promotional bannermobile promotional banner

Restage

A per-player stage system that locks recipes, dimensions, and items until unlock conditions are met.

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

  • Recipe blocking — hide and block crafting by mod, recipe ID, regex pattern, or output item
  • Dimension blocking — prevent players from entering dimensions until a stage is unlocked
  • Automatic unlock conditions — kills, crafting, advancements
  • Manual unlock — require players to submit specific items in-game
  • Item restrictions — fine-grained control over pickup, inventory, equip, right-click, left-click, and attack per item, item tag, or mod
  • Custom coloured messages — per-rule rich-text feedback for every restriction action
  • In-game GUI — live configuration editor with no restart needed (opens with a keybind or /restage gui)
  • KubeJS API — full scripting API for pack authors who prefer code
  • JEI integration — blocked recipes are hidden or annotated in JEI
  • Create mod integration — basin, crushing wheel, deployer, mechanical press, millstone, and saw all respect recipe stages

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")

    // 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)

  • Per-player stage system with server-side persistence
  • Recipe blocking: mod, ID, regex, output-item
  • Dimension blocking
  • Unlock conditions: item submission, kill, craft, advancement
  • Item restrictions with 6 interaction flags and custom rich-text messages
  • Live in-game configuration GUI (ModernUI)
  • KubeJS scripting API with automatic JS export
  • JEI recipe visibility integration
  • Create mod machine integration (basin, crushing wheel, deployer, mechanical press, millstone, saw, furnace)
  • Full command suite with tab-completion

🔜 Planned

  • Stage prerequisites — require one or more stages before another can be unlocked, creating dependency chains and a proper progression tree
  • Stage groups (AND / OR logic) — define a stage that unlocks when any or all stages in a group are present, enabling branching progression
  • Global (server-wide) stages — stages shared by all players on the server, unlocked when any player meets the condition
  • Team / party stages — share progress with players in the same team or party; unlocking a stage for one member grants it to all
  • JSON import / export — export the full stage configuration to a portable JSON file and import it on another server or modpack
  • Visual progression map — in-game GUI panel showing a graphical tree of stages and their unlock dependencies
  • BossBar / ActionBar notifications — additional notification channels beyond chat and title/subtitle on stage unlock
  • Location-based conditions — unlock a stage by visiting a specific biome, structure, or coordinate range
  • WTHIT / The One Probe integration — show required stage when looking at a blocked machine or item

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

The Restage Team

profile avatar
  • 2
    Followers
  • 2
    Projects
  • 227
    Downloads

More from Rampage99