/*
* CSB Admin Announce
* Copyright (C) 2026 counter-strike-boost.com
*
* amx_csay / amx_hsay show an admin message as a coloured HUD message, and
* amx_tsay adds a short blue screen fade behind the same message. Position,
* colour and hold time are cvars, and an optional sound can be played to all.
*
* Inspired by the csay / hsay / tsay commands from the classic AMX Mod X Admin
* Commands plugin (AMX Mod X Development Team). Independent GPL re-implementation.
*
* 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
new const PLUGIN[] = "CSB Admin Announce"
new const VERSION[] = "1.0.0"
new const AUTHOR[] = "counter-strike-boost.com"
new g_pRed, g_pGreen, g_pBlue
new g_pX, g_pY, g_pHold
new g_pSound
new g_msgScreenFade
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
g_pRed = register_cvar("csb_announce_r", "0")
g_pGreen = register_cvar("csb_announce_g", "255")
g_pBlue = register_cvar("csb_announce_b", "100")
g_pX = register_cvar("csb_announce_x", "-1.0")
g_pY = register_cvar("csb_announce_y", "0.20")
g_pHold = register_cvar("csb_announce_hold", "6.0")
g_pSound = register_cvar("csb_announce_sound", "")
register_concmd("amx_csay", "cmdCsay", ADMIN_CHAT, " - centre HUD announcement")
register_concmd("amx_hsay", "cmdHsay", ADMIN_CHAT, " - HUD announcement (uses csb_announce_x/y)")
register_concmd("amx_tsay", "cmdTsay", ADMIN_CHAT, " - HUD announcement with a blue screen fade")
g_msgScreenFade = get_user_msgid("ScreenFade")
}
getMessage(id, out[], len)
{
read_args(out, len)
remove_quotes(out)
trim(out)
}
playSound()
{
new snd[64]
get_pcvar_string(g_pSound, snd, charsmax(snd))
if (snd[0])
client_cmd(0, "spk ^"%s^"", snd)
}
showHud(Float:x, Float:y, const msg[])
{
new r = get_pcvar_num(g_pRed)
new g = get_pcvar_num(g_pGreen)
new b = get_pcvar_num(g_pBlue)
new Float:hold = get_pcvar_float(g_pHold)
set_hudmessage(r, g, b, x, y, 0, 0.5, hold, 0.2, 0.2, -1)
show_hudmessage(0, "%s", msg)
}
announceLog(id, const kind[], const msg[])
{
new aname[32]
if (id)
get_user_name(id, aname, charsmax(aname))
else
copy(aname, charsmax(aname), "CONSOLE")
log_amx("[CSB Announce] %s (%s): %s", aname, kind, msg)
}
public cmdCsay(id, level, cid)
{
if (!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
new msg[192]
getMessage(id, msg, charsmax(msg))
if (!msg[0])
{
console_print(id, "[CSB] Usage: amx_csay ")
return PLUGIN_HANDLED
}
showHud(-1.0, 0.30, msg)
playSound()
announceLog(id, "csay", msg)
return PLUGIN_HANDLED
}
public cmdHsay(id, level, cid)
{
if (!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
new msg[192]
getMessage(id, msg, charsmax(msg))
if (!msg[0])
{
console_print(id, "[CSB] Usage: amx_hsay ")
return PLUGIN_HANDLED
}
showHud(get_pcvar_float(g_pX), get_pcvar_float(g_pY), msg)
playSound()
announceLog(id, "hsay", msg)
return PLUGIN_HANDLED
}
public cmdTsay(id, level, cid)
{
if (!cmd_access(id, level, cid, 2))
return PLUGIN_HANDLED
new msg[192]
getMessage(id, msg, charsmax(msg))
if (!msg[0])
{
console_print(id, "[CSB] Usage: amx_tsay ")
return PLUGIN_HANDLED
}
/* short blue screen fade behind the HUD text */
new players[32], num
get_players(players, num, "c")
for (new i = 0; i < num; i++)
{
message_begin(MSG_ONE, g_msgScreenFade, _, players[i])
write_short(1 << 10) /* fade duration */
write_short(1 << 10) /* hold time */
write_short(0x0004) /* FFADE_IN */
write_byte(0) /* r */
write_byte(0) /* g */
write_byte(120) /* b */
write_byte(80) /* alpha */
message_end()
}
showHud(get_pcvar_float(g_pX), get_pcvar_float(g_pY), msg)
playSound()
announceLog(id, "tsay", msg)
return PLUGIN_HANDLED
}