Progression Gates
A progression gate is a named milestone (for example
nerolandcore:reached_orbit). NeroQuests drives gates open as players complete
objectives, and every other Neroland mod simply asks "is this gate open?"
before unlocking content. Gate state is server-owned and synced to clients;
clients never mutate it.
Scopes
Every gate declares one scope. Resolution is automatic.
| Scope | Meaning |
|---|---|
| player (default) | Per-player arc |
| team | Shared by a vanilla scoreboard team (co-op) |
| server | One shared flag for the whole world |
A team gate falls back to per-player if the player has no team.
Gates are data
Each gate is one JSON file under data/<namespace>/neroland_gates/<path>.json.
The gate id is the file's namespace plus path.
| Field | Meaning |
|---|---|
scope | player, team, or server |
requires | List of gate ids that must already be open |
title | Display title |
A pack overrides a gate by shipping the same id, or adds its own gate with a new id. Later packs win.
The canonical arc
Core ships this default chain:
industrial_powerreached_orbitfirst_colonydeep_space
tryOpen only opens a gate when every gate in its requires list is
already open. The explicit open/close operations force the state regardless.
Every change fires a change event and re-syncs the affected players.
Material discovery milestones
Core also provides typed per-material milestones. Instead of merely opening a named gate, these record that a particular material identifier has been legitimately encountered through an owning-mod action, a planet visit, a server-observed player pickup, or an administrator action. Automation cannot create discovery by itself.
Definitions are datapack-driven under
data/<namespace>/neroland_material_milestones/<path>.json and use the same player/team/server scopes.
The built-in nerolandcore:material_discovered definition is the shared ecosystem default.
Privacy
Progression storage is POPIA/GDPR-minimal: a player row holds only a UUID plus gate or material ids. There are no names, locations, or discovery timestamps. Player material rows can be exported and all player progression rows are erased through Core's shared erasure hook. See Privacy and Data.
Commands
These are mainly for testing (op level 2 for open/close):
| Command | Effect |
|---|---|
/neroland gate list | List gates |
/neroland gate open <id> | Force a gate open |
/neroland gate close <id> | Force a gate closed |
A bare id like reached_orbit is treated as nerolandcore:reached_orbit.
For developers
The full progression API is documented in ../docs/PROGRESSION.md.