Promoveaza serverul
csb-admin-list / addons / amxmodx / scripting / csb_admin_list.sma
158 lines 4.6 KiB Pawn Raw Permalink History
/*
 * 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: <https://www.gnu.org/licenses/>.
 */

#include <amxmodx>
#include <amxmisc>

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
}