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