/* * 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 }