AdminStealth 0.3.12: keep hidden admins off the team select screen

Hidden admins skip the team screen on reconnect (moved to spectators until re-hidden), never
receive the server's team menu message, and a pick from the screen M opens is answered by
telling only their client they joined spectators. The restore runs css_hide at most once, since
it toggles. Each command listener gets its own delegate: CSS keys listeners by handler, and
reusing one orphaned the first registration, which then swallowed its command.
This commit is contained in:
Astra 2026-09-28 11:23:10 +01:00
parent b60f508a7b
commit 33feda8179
2 changed files with 133 additions and 6 deletions

View file

@ -15,6 +15,17 @@ admin off the scoreboard. This plugin makes it look like they left the server:
- A hidden admin can't join a team or go to spectators (`jointeam` and `spectate` are blocked
with a chat message). If the game or another plugin puts them on a team anyway, which makes
SimpleAdmin unhide them, they're hidden again straight away.
- On reconnect or map change, a hidden admin is moved to spectators 0.1 s after connecting, so
the team select screen doesn't open, until the restore hides them again.
- The team select screen: the server's "team" menu message (`CS_UM_VGUIMenu`) is never sent to
a hidden admin. M opens it on the client regardless, and a player with no team can't close it
without picking, so a pick is answered by telling only that client it joined spectators
(with `sv_disable_teamselect_menu` on around it); nobody else sees a team change.
- Restoring runs `css_hide` at most once: it toggles, so a second run could unhide them.
Needs our SimpleAdmin fork (1.8.2b-zio2 or later), where moving to spectators doesn't unhide a
hidden admin. Never hot-reload CS2-SimpleAdmin while this runs: CSS keeps handing out the old
instance's API until the server restarts.
- `status` from a player's console is blocked and prints nothing. It still works from the server
console and RCON.
@ -37,8 +48,8 @@ the `status` block works.
- Unhiding doesn't announce the admin as joining again.
- The server browser and trackers get the player list from a separate server query, which this
doesn't touch, so they still list a hidden admin.
- Reloading CS2-SimpleAdmin on its own leaves this plugin listening to the old instance. Reload
AdminStealth after it.
- Reloading CS2-SimpleAdmin on its own leaves this plugin (and WebPanelBridge) talking to the old
instance until a server restart.
## Install