Staff Guide
Who counts as staff
Two ways, both checked server-side in server/warden.lua:
1. Ace — grant rm_phonograph.admin in server.cfg:
add_ace group.admin rm_phonograph.admin allow2. Identifier list — add character identifiers to Settings.access.admins in config/settings.lua.
Staff clear every access check: they may tune, pack and moderate any deck, and they are exempt from the play cooldown.
Commands
Every command re-checks staff status server-side, and all of them also work from the server console — except /decktp, which needs a ped to move.
| Command | What it does |
|---|---|
/decks | Lists every deck: id, cabinet, owner or (spot), coordinates, what's playing, and a — MUTED marker |
/deckstop <id> | Stops one deck outright — needle lifted, queue cleared |
/deckdel <id> | Deletes a player-placed deck from the map and database |
/decktp <id> | Teleports you to a deck — you arrive a step above the boards, not inside them |
/deckmute <id> | Mutes one deck: silences it now and refuses every play until unmuted |
/deckmute | Mutes every deck, server-wide |
/deckunmute <id> | Lifts one deck's mute |
/deckunmute | Lifts the server-wide mute and all per-deck mutes |
Deck ids
- Player-placed decks are numbers —
/deckstop 12 - Config spots are
s:plus their key —/deckstop s:valentine_saloon
/deckdel gives no item refund
Use pack for that. Config spots refuse deletion outright — remove them in config/spots.lua instead.
Mutes are not persistent
They live for the resource's lifetime. A restart clears them.
Discord audit
With webhooks enabled (see Configuration):
- decks channel — who placed or packed which cabinet, where.
- tracks channel — who played or queued what, on which deck, with the resolved song title and video thumbnail.
Identifiers appear alongside character names in every embed, so a log line is always enough to find the player.
Moderation model
Worth knowing when players ask "why can't I…":
- Every action is distance-checked on the server (
access.reachSpan). Clients cannot act on decks they aren't standing at. - Pickups are blocked while another player stands within
access.packBlockSpanmetres. The "no one was around" claim is judged by the server, not the client. - Records always come from the server's catalogue. A modified client cannot inject a URL through a record, and raw links pass length, scheme, whitespace and — optionally — domain checks before anything is broadcast.
Controlling what players can play
Three levers, from broadest to narrowest:
| Lever | Effect |
|---|---|
panel.urlBox = false | No raw links from anyone, staff included |
records.urlAccess | 'everyone', 'owners' (default) or 'staff' |
limits.domains | Allowlist of hosts, e.g. { 'youtube.com', 'youtu.be' } |
Setting urlAccess = 'owners' is the usual middle ground: players can play whatever they like on their own cabinet, while public saloon decks become records-only.
If you want the catalogue and nothing else, panel.urlBox = false is the switch — and it is enforced server-side rather than merely hidden, so a modified client gains nothing.