No description
Find a file
2026-10-04 18:34:09 +01:00
lib AdminStealth 0.1.0: make CS2-SimpleAdmin's css_hide look like leaving, block status for players 2026-09-27 18:06:48 +01:00
.gitignore AdminStealth 0.1.0: make CS2-SimpleAdmin's css_hide look like leaving, block status for players 2026-09-27 18:06:48 +01:00
AdminStealth.cs AdminStealth 0.3.15: no reply to css_hide from players who may not hide 2026-10-03 00:22:12 +01:00
AdminStealth.csproj Build against CounterStrikeSharp 1.0.376 2026-09-27 18:16:48 +01:00
README.md AdminStealth 0.3.15: no reply to css_hide from players who may not hide 2026-10-03 00:22:12 +01:00
release.sh release.sh: read the Forgejo token from ../../.forgejo-token when FORGEJO_TOKEN isn't set 2026-10-04 18:34:09 +01:00

AdminStealth

A companion to CS2-SimpleAdmin's css_hide (!hide, @css/kick, or whatever an admin_overrides.json entry for css_hide says: reconnect re-hiding follows it too). SimpleAdmin's hide moves the admin off the scoreboard. This plugin makes it look like they left the server:

  • When an admin hides, every other player gets a player_disconnect event for them, sent to each client only. The server and other plugins never see it, so the admin stays connected.
  • While an admin is hidden, their team changes, their death and their real disconnect are not broadcast to clients.
  • Hiding lasts until the admin unhides. Hidden admins are saved by SteamID in configs/plugins/AdminStealth/hidden.json. When one reconnects, or on a map change (SimpleAdmin forgets hidden admins on both), their join isn't announced, the plugin runs css_hide for them again once SimpleAdmin has loaded their permissions, and tells them they're still hidden. After five tries (about 12 seconds) it gives up, forgets them and tells them they're visible.
  • 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 moves them to spectators and straight back to no team, as css_hide does (with sv_disable_teamselect_menu on around it), which closes it. The team events aren't broadcast; for about 0.15 s they're on the spectator list of anyone looking at the scoreboard.
  • Restoring runs css_hide at most once: it toggles, so a second run could unhide them.
  • Players who may not use css_hide (or its aliases) get no reply at all when they try it, from console or chat: not even CSS's missing-permission message.

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.

The plugin listens for css_hide under whatever aliases SimpleAdmin's configs/plugins/CS2-SimpleAdmin/Commands.json gives it (by default css_hide and css_stealth), so adding aliases there (e.g. css_invis) works here too after a restart.

WebPanelBridge leaves hidden admins out of css_webpanel_status, so simpleadmin-web doesn't show them either.

Built for CounterStrikeSharp 1.0.376 (net10.0) on Metamod:Source 2.0.0.1469, and needs CS2-SimpleAdmin 1.8.2b's shared API (CS2-SimpleAdminApi). lib/CS2-SimpleAdminApi.dll is a compile-time copy of the server's shared/ one and isn't shipped. Without SimpleAdmin loaded, only the status block works.

Limits

  • After a reconnect or map change, the admin is visible to SimpleAdmin (and so on the web panel) for the few seconds it takes to hide them again.
  • 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 (and WebPanelBridge) talking to the old instance until a server restart.

Install

Build with cd plugins/AdminStealth && ../../build.sh. Then copy the contents of compiled/AdminStealth/ to game/csgo/addons/counterstrikesharp/plugins/AdminStealth/ on the server.

Or install a release, which unpacks into game/csgo/:

tar -xzf AdminStealth-<tag>.tar.gz -C /srv/cs2/game/csgo

To publish one, commit, bump ModuleVersion, then run FORGEJO_TOKEN=... ./release.sh v<ModuleVersion>. It rebuilds the plugin from the committed source in the SDK container, tags HEAD, and uploads AdminStealth-<tag>.tar.gz to the git.zio.sh release. The plugin has no config. The release never includes hidden.json.