/*
* 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 for details.
*/
#include
#include
#include
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, " [reason] - give a player a warning")
register_concmd("amx_warns", "cmdWarns", ADMIN_KICK, " - 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
}