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.

ScopeMeaning
player (default)Per-player arc
teamShared by a vanilla scoreboard team (co-op)
serverOne 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.

FieldMeaning
scopeplayer, team, or server
requiresList of gate ids that must already be open
titleDisplay 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_power
  • reached_orbit
  • first_colony
  • deep_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):

CommandEffect
/neroland gate listList 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.

See also

Search across every Nero mod wiki.