Server administration
The Players tab in Warden
The live roster in Warden β ping, health, life state, match β and the per-row admin actions: warn, kick, ban, grant rights, heal, freeze and move, plus why spectate cannot be adapted from a browser.
On this page7 sections
Manage connected players in Warden's Players tab. The live roster refreshes automatically and provides warnings, kicks, bans, in-game permissions, healing, freezing and movement controls.
This page covers the roster columns and the per-row actions. The whitelist and ban door list has its own tab and its own page β see Connection control. Managing operator accounts and roles is in Identity and ACL.
Permissions
Every action is gated separately, so a role can hold one without the others. A role
holding players.view sees the tab; each button appears only when the session's role
holds its permission, and the server enforces it again on every call.
| Permission | Allows |
|---|---|
players.view |
See the tab and the roster. |
players.warn |
Send an admin message to one player. |
players.kick |
Disconnect a player (they can rejoin). |
players.ban |
Ban a player's identity and disconnect them. |
players.heal |
Restore a player to full health, or revive them where they fell. |
players.freeze |
Hold a player's body still, and release it again. |
players.teleport |
Move a player to coordinates or to another player, and bring a player to another. |
acl.edit |
Grant or revoke in-game rights from a row (the Rights button). |
access.edit |
Add a player to the whitelist from a row (the Allow button). |
players.heal, players.freeze and players.teleport sit beside the moderation
four rather than inside them on purpose. Removing tonight's troublemaker and pinning
a player in place during a match are different authorities: a server can hand a
greeter role the whitelist Allow button and a game designer the freeze and move
buttons without either becoming a full moderator. The owner role (*) holds them all.
The roster columns
| Column | What it shows |
|---|---|
| ID | The player's numeric session id. Every action is keyed on it. |
| Name | The display name, with how long ago they connected. |
| Identity | The account GUID, shortened; click to copy the full value. |
| Ping | Round-trip time in milliseconds, coloured by health. A dash means the transport has no sample yet β never a misleading 0 ms. |
| Health | Current health as a percentage of their maximum, with armour beside it. A dash means the server holds no health record for this player. |
| State | alive is the quiet default and shows nothing; dead, loading, frozen, god, ghost, hidden, in vehicle, watching #N and not ready each show a chip. |
| Match | The routing bucket: lobby (bucket 0, the shared world) or #N (an isolated match β a Pursuit round, say). Two players in different buckets cannot see each other. |
| Rights | Their in-game role or grant count, from the ACL, and a listed chip when they are on an enabled whitelist. |
| Position | Their last known X, Y, Z. Past two seconds it is shown greyed with its age, because "one late tick" and "never reported" are different facts an operator must be able to tell apart. |
The roster deliberately carries no IP address. The server knows one, and the
Open77.players.endpoint read puts it behind the players.identity.sensitive manifest
capability precisely because an endpoint is the one field that can follow a player home.
A browser panel on a box an operator may share is not a stronger place to keep it than a
resource manifest, so it is not published here at all.
Heal
The Heal button restores a living player to full health and tells them an
administrator did it. On a dead player the button reads Revive instead and
brings them back where they fell at full health with a short grace window β a dead body
cannot be topped up, so the one action does the right one of the two and the toast says
which. Health writes go through the same stats authority Open77.players.setHealth
uses, so god mode and the life-phase interlocks still apply.
Every panel heal β and only a panel heal β raises the host-wide event
open77:admin:playerHealed(playerId, author). A resource calling Open77.players.heal
does not raise it: open77:admin: means "the operator's own surface did this", and
announcing every gameplay heal under that name would be a firehose and a lie. See
Admin events.
Freeze
Freeze holds a player's body still; the button then reads Thaw. A frozen player keeps their camera, chat, voice, menus and interaction prompts, and still takes damage β it is a primitive, not a policy. See Player freeze for exactly which inputs it blocks.
The hold is cooperative and keyed to the panel. A gamemode script may hold the same player at the same time, and Thaw drops only the panel's claim: if a script still holds them, they stay frozen and the toast says so, rather than letting an operator think they released somebody they did not. The panel's claim is released automatically on the player's death, respawn, bucket change and disconnect, the same as any other holder β a player can never be stranded frozen.
Move
Move opens a dialog with three modes:
- To coordinates β prefilled with the player's own position, so a small nudge is a small edit. Their routing bucket is left alone.
- To another player β the player is placed beside that player (offset to the side so two bodies never resolve inside each other) and into that player's routing bucket.
- Bring another player here β the inverse: pick somebody else, and they are moved beside this player, into this player's bucket.
The dialog warns before you click when the player to be moved is dead, still behind the readiness gate, or in a vehicle (a move is refused unless you tick Take them out of a vehicle first).
A move is the one admin action that is not instant. The server does not move the
body; it asks the owning client to, and the client fades the screen, teleports, then
watches the body settle on solid ground for three frames before answering β because a
direct write over any real distance can drop a player through world that has not streamed
in, whereupon the engine's fall-under-world failsafe silently returns them to the save's
spawn point kilometres away. So the panel waits for the client's answer and reports what
the body did: arrived, or a named refusal (player_in_vehicle,
player_not_alive, settle_timeout). A move whose client never answers in time is
reported as pending, not as a success β it may still land, and the panel does not
guess.
Bucket changes happen before the body moves, so an observer left behind never glimpses the destination; if the move is refused, the bucket is rolled back so the player is never left alone in a world nobody meant them to see.
Spectate is not available
txAdmin's player panel has a spectate button. Warden's does not, and it is not an
oversight. The platform has a spectate primitive (Open77.players.spectate), but it
needs a spectator who is a connected player: it ghosts that player, hides their body and
puts their client's camera on the target. A Warden session is a browser with no body to
ghost and no renderer to receive frames, and Cyberpunk 2.31 exposes no server-side view of
the world to stream to one. The Players tab therefore reports who a player is watching
(the watching #N chip) but offers no way to start one. An operator who wants to watch a
player joins the server and uses Open77.players.spectate from an in-game admin resource,
with a body.
Everything is audited
Every action writes one line to the audit trail (the Audit tab, permission
audit.view): the operator's panel username, the action (players.heal,
players.freeze, players.unfreeze, players.teleport, players.bring), the target and
the outcome. A refused action is recorded as failed with its reason, so the trail is a
true record of what an operator did and what actually happened β not only what they tried.
// For agents & LLMsthis page as Markdownllms.txtllms-full.txt
