/*
* CSB Admin List
* Copyright (C) 2026 counter-strike-boost.com
*
* Shows every connected admin with their access level and AFK state.
* Inspired by the classic "Admins List" plugin by Alka. This is an
* independent GPL re-implementation; no original code is reused.
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation, either version 3 of the License, or (at your option)
* any later version. It is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
* Public License for more details: .
*/
#include
#include
new const PLUGIN[] = "CSB Admin List"
new const VERSION[] = "1.0.0"
new const AUTHOR[] = "counter-strike-boost.com"
#define AFK_LIMIT 20 /* seconds without moving before we call it AFK */
new g_pEnabled, g_pHideFlag, g_pShowHidden
new g_iAdminFlags /* flags that make a player "an admin" */
new g_iAfkSeconds[33]
new Float:g_fLastOrigin[33][3]
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
g_pEnabled = register_cvar("csb_adminlist_enabled", "1")
g_pHideFlag = register_cvar("csb_adminlist_hideflag", "a")
g_pShowHidden = register_cvar("csb_adminlist_showhidden", "0")
register_clcmd("say /admins", "cmdAdmins")
register_clcmd("say_team /admins", "cmdAdmins")
register_clcmd("say /admin", "cmdAdmins")
/* any flag from a..t marks a real admin; z (ADMIN_USER) does not */
g_iAdminFlags = read_flags("abcdefghijklmnopqrst")
set_task(1.0, "taskAfkScan", 0, _, _, "b")
}
public client_connect(id)
{
g_iAfkSeconds[id] = 0
g_fLastOrigin[id][0] = 0.0
g_fLastOrigin[id][1] = 0.0
g_fLastOrigin[id][2] = 0.0
}
/* Track movement so we can flag AFK admins in the list. */
public taskAfkScan()
{
new players[32], num, id
get_players(players, num, "ch")
for (new i = 0; i < num; i++)
{
id = players[i]
if (!is_user_alive(id))
{
g_iAfkSeconds[id] = 0
continue
}
new Float:origin[3]
get_user_origin_f(id, origin)
if (floatabs(origin[0] - g_fLastOrigin[id][0]) < 2.0
&& floatabs(origin[1] - g_fLastOrigin[id][1]) < 2.0
&& floatabs(origin[2] - g_fLastOrigin[id][2]) < 2.0)
g_iAfkSeconds[id]++
else
g_iAfkSeconds[id] = 0
g_fLastOrigin[id][0] = origin[0]
g_fLastOrigin[id][1] = origin[1]
g_fLastOrigin[id][2] = origin[2]
}
}
/* get_user_origin returns integer cells; wrap it into floats for comparison */
get_user_origin_f(id, Float:out[3])
{
new iOrigin[3]
get_user_origin(id, iOrigin)
out[0] = float(iOrigin[0])
out[1] = float(iOrigin[1])
out[2] = float(iOrigin[2])
}
public cmdAdmins(id)
{
if (!get_pcvar_num(g_pEnabled))
{
client_print(id, print_chat, "[CSB] The admin list is disabled.")
return PLUGIN_HANDLED
}
new hideFlagStr[8], hideFlags, showHidden
get_pcvar_string(g_pHideFlag, hideFlagStr, charsmax(hideFlagStr))
hideFlags = read_flags(hideFlagStr)
showHidden = get_pcvar_num(g_pShowHidden)
/* a viewer who is an admin himself always sees hidden admins */
if (get_user_flags(id) & g_iAdminFlags)
showHidden = 1
new players[32], num, pid, listed = 0
get_players(players, num, "ch")
client_print_color(id, print_team_default, "^x04[CSB]^x01 Online admins:")
for (new i = 0; i < num; i++)
{
pid = players[i]
new flags = get_user_flags(pid)
if (!(flags & g_iAdminFlags))
continue
if ((flags & hideFlags) && hideFlags != 0 && !showHidden)
continue
new name[32], flagStr[27]
get_user_name(pid, name, charsmax(name))
get_flags(flags, flagStr, charsmax(flagStr))
new status[16]
if (!is_user_alive(pid))
copy(status, charsmax(status), "dead")
else if (g_iAfkSeconds[pid] >= AFK_LIMIT)
copy(status, charsmax(status), "AFK")
else
copy(status, charsmax(status), "active")
client_print_color(id, print_team_default,
"^x04*^x03 %s ^x01[flags: ^x04%s^x01] ^x01(%s)",
name, flagStr, status)
listed++
}
if (!listed)
client_print_color(id, print_team_default, "^x01 No admins are online right now.")
return PLUGIN_HANDLED
}