Romania XPlayZM.CSBlackDevil.COM # Zombie Plague UltimateX [ Respawn + FDL + VIP 22-12PM + POINTS] ® 13/32
Unknown ❤ RESPAWN.ZAFEST.RO | VIP FREE | FREE FOR ALL ❤ 0/32
France EMIRATES.KiNGS 亗 GAMEAREA ||͇̿P͇̿U͇̿B͇̿L͇̿I͇̿C͇̿| ✪ 32/32
United Kingdom BALKAN.KiNGS.EU ||͇̿P͇̿U͇̿B͇̿L͇̿I͇̿C͇̿| ✪ 11/32
Server bewerben
csb-warn-system / addons / amxmodx / scripting / csb_warn_system.sma
199 lines 5.5 KiB Pawn Raw Permalink History
/*
 * CSB Warn System
 * Copyright (C) 2026 counter-strike-boost.com
 *
 * amx_warn records a warning against a player's SteamID in nVault. Reaching a
 * cvar-defined count kicks the player; a higher count bans them for a set time
 * with the engine banid command. Warnings expire after N days, and say /warns
 * (or amx_warns) shows a player's current count.
 *
 * 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 <https://www.gnu.org/licenses/> for details.
 */

#include <amxmodx>
#include <amxmisc>
#include <nvault>

new const PLUGIN[] = "CSB Warn System"
new const VERSION[] = "1.0.0"
new const AUTHOR[]  = "counter-strike-boost.com"

#define NO_VAULT (-1)

new g_iVault = NO_VAULT
new g_pEnabled, g_pKickAt, g_pBanAt, g_pBanTime, g_pExpireDays

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)

    g_pEnabled    = register_cvar("csb_warn_enabled", "1")
    g_pKickAt     = register_cvar("csb_warn_kick", "3")
    g_pBanAt      = register_cvar("csb_warn_ban", "5")
    g_pBanTime    = register_cvar("csb_warn_bantime", "60")
    g_pExpireDays = register_cvar("csb_warn_expire", "7")

    register_concmd("amx_warn", "cmdWarn", ADMIN_KICK, "<target> [reason] - give a player a warning")
    register_concmd("amx_warns", "cmdWarns", ADMIN_KICK, "<target> - show a player's warning count")

    register_clcmd("say /warns", "cmdMyWarns")
    register_clcmd("say_team /warns", "cmdMyWarns")
}

public plugin_cfg()
{
    g_iVault = nvault_open("csb_warns")

    if (g_iVault == NO_VAULT)
        log_amx("[CSB Warn] could not open nVault 'csb_warns' - warnings disabled.")
}

public plugin_end()
{
    if (g_iVault != NO_VAULT)
        nvault_close(g_iVault)
}

/* returns the current, non-expired warning count for a SteamID */
loadWarns(const authid[])
{
    if (g_iVault == NO_VAULT)
        return 0

    new value[32]

    if (!nvault_get(g_iVault, authid, value, charsmax(value)))
        return 0

    new countStr[16], timeStr[16]
    strtok(value, countStr, charsmax(countStr), timeStr, charsmax(timeStr), ' ')

    new count = str_to_num(countStr)
    new last  = str_to_num(timeStr)

    new expireDays = get_pcvar_num(g_pExpireDays)

    if (expireDays > 0 && last > 0)
    {
        new age = get_systime() - last

        if (age > expireDays * 86400)
            return 0
    }

    return count
}

saveWarns(const authid[], count)
{
    if (g_iVault == NO_VAULT)
        return

    new value[32]
    formatex(value, charsmax(value), "%d %d", count, get_systime())
    nvault_pset(g_iVault, authid, value)
}

public cmdWarn(id, level, cid)
{
    if (!cmd_access(id, level, cid, 1))
        return PLUGIN_HANDLED

    if (!get_pcvar_num(g_pEnabled))
    {
        console_print(id, "[CSB] Warnings are disabled.")
        return PLUGIN_HANDLED
    }

    new arg[32]
    read_argv(1, arg, charsmax(arg))

    new target = cmd_target(id, arg, CMDTARGET_OBEY_IMMUNITY)

    if (!target)
        return PLUGIN_HANDLED

    new reason[64]
    read_argv(2, reason, charsmax(reason))
    trim(reason)

    if (!reason[0])
        copy(reason, charsmax(reason), "No reason given")

    new authid[35], tname[32]
    get_user_authid(target, authid, charsmax(authid))
    get_user_name(target, tname, charsmax(tname))

    new count = loadWarns(authid) + 1
    saveWarns(authid, count)

    new aname[32]
    if (id)
        get_user_name(id, aname, charsmax(aname))
    else
        copy(aname, charsmax(aname), "CONSOLE")

    new kickAt = get_pcvar_num(g_pKickAt)
    new banAt  = get_pcvar_num(g_pBanAt)

    client_print(0, print_chat, "^x04[CSB]^x03 %s^x01 warned^x03 %s^x01 (%d/%d): %s",
        aname, tname, count, banAt, reason)
    log_amx("[CSB Warn] %s warned %s <%s> (%d) - %s", aname, tname, authid, count, reason)

    if (banAt > 0 && count >= banAt)
    {
        new banMin = get_pcvar_num(g_pBanTime)
        client_print(0, print_chat, "[CSB] %s reached %d warnings and was banned for %d minutes.", tname, count, banMin)
        server_cmd("banid %d #%d kick", banMin, get_user_userid(target))
        server_cmd("writeid")
        return PLUGIN_HANDLED
    }

    if (kickAt > 0 && count >= kickAt)
    {
        client_print(0, print_chat, "[CSB] %s reached %d warnings and was kicked.", tname, count)
        server_cmd("kick #%d ^"Too many warnings^"", get_user_userid(target))
    }

    return PLUGIN_HANDLED
}

public cmdWarns(id, level, cid)
{
    if (!cmd_access(id, level, cid, 1))
        return PLUGIN_HANDLED

    new arg[32]
    read_argv(1, arg, charsmax(arg))

    new target = cmd_target(id, arg, CMDTARGET_ALLOW_SELF)

    if (!target)
        return PLUGIN_HANDLED

    new authid[35], tname[32]
    get_user_authid(target, authid, charsmax(authid))
    get_user_name(target, tname, charsmax(tname))

    new count = loadWarns(authid)

    console_print(id, "[CSB] %s has %d active warning(s) (ban at %d).", tname, count, get_pcvar_num(g_pBanAt))
    return PLUGIN_HANDLED
}

public cmdMyWarns(id)
{
    new authid[35]
    get_user_authid(id, authid, charsmax(authid))

    new count = loadWarns(authid)

    client_print(id, print_chat, "[CSB] You have %d active warning(s). Ban at %d, kick at %d.",
        count, get_pcvar_num(g_pBanAt), get_pcvar_num(g_pKickAt))
    return PLUGIN_HANDLED
}