/*
* CSB Round Summary
* Copyright (C) 2026 counter-strike-boost.com
*
* At the end of each round it prints a short summary in a HUD sync channel and in
* chat: which team won, the running score, the round MVP (most kills this round),
* the top damage dealer and how many players survived. Per-round kills and damage
* are tracked live (DeathMsg for kills, Ham_TakeDamage for damage) and reset when
* the next round starts.
*
* 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 Round Summary"
new const VERSION[] = "1.0.0"
new const AUTHOR[] = "counter-strike-boost.com"
new g_iKills[33]
new Float:g_fDamage[33]
new g_iScoreT, g_iScoreCT
new g_iSync
new g_pEnabled
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR)
g_pEnabled = register_cvar("csb_summary_enabled", "1")
g_iSync = CreateHudSyncObj()
RegisterHam(Ham_TakeDamage, "player", "hamTakeDamage", 0)
register_event("DeathMsg", "eventDeath", "a", "1>0")
register_logevent("eventRoundStart", 2, "1=Round_Start")
register_event("TextMsg", "eventTerWin", "a", "2Terrorists_Win")
register_event("TextMsg", "eventCtWin", "a", "2CTs_Win")
register_event("TextMsg", "eventDraw", "a", "2Round_Draw")
}
public hamTakeDamage(victim, inflictor, attacker, Float:damage, damagebits)
{
if (attacker < 1 || attacker > 32 || attacker == victim)
return HAM_IGNORED
if (damage > 0.0)
g_fDamage[attacker] += damage
return HAM_IGNORED
}
public eventDeath()
{
new killer = read_data(1)
if (killer >= 1 && killer <= 32)
g_iKills[killer]++
}
public eventRoundStart()
{
for (new i = 1; i <= 32; i++)
{
g_iKills[i] = 0
g_fDamage[i] = 0.0
}
}
public eventTerWin()
{
g_iScoreT++
showSummary("Terrorists")
}
public eventCtWin()
{
g_iScoreCT++
showSummary("Counter-Terrorists")
}
public eventDraw()
{
showSummary("Nobody (draw)")
}
showSummary(const winner[])
{
if (!get_pcvar_num(g_pEnabled))
return
new mvp = 0, mvpKills = 0
new dmgTop = 0
new Float:dmgTopVal = 0.0
new alive = 0
new players[32], num
get_players(players, num, "ch")
for (new i = 0; i < num; i++)
{
new pl = players[i]
if (g_iKills[pl] > mvpKills)
{
mvpKills = g_iKills[pl]
mvp = pl
}
if (g_fDamage[pl] > dmgTopVal)
{
dmgTopVal = g_fDamage[pl]
dmgTop = pl
}
if (is_user_alive(pl))
alive++
}
new mvpName[32], dmgName[32]
if (mvp)
get_user_name(mvp, mvpName, charsmax(mvpName))
else
copy(mvpName, charsmax(mvpName), "-")
if (dmgTop)
get_user_name(dmgTop, dmgName, charsmax(dmgName))
else
copy(dmgName, charsmax(dmgName), "-")
set_hudmessage(0, 220, 120, -1.0, 0.24, 0, 0.0, 5.0, 0.2, 0.4, -1)
ShowSyncHudMsg(0, g_iSync,
"%s win! T %d - %d CT^nMVP: %s (%d kills)^nTop damage: %s (%d)^nSurvivors: %d",
winner, g_iScoreT, g_iScoreCT,
mvpName, mvpKills,
dmgName, floatround(dmgTopVal),
alive)
client_print(0, print_chat,
"[CSB] %s win | Score T %d - %d CT | MVP: %s (%d) | Top dmg: %s (%d)",
winner, g_iScoreT, g_iScoreCT, mvpName, mvpKills, dmgName, floatround(dmgTopVal))
}