/* * CSB Halftime Swap * Copyright (C) 2026 counter-strike-boost.com * * At the configured round (for MR15 that is round 16) both teams change sides * with cs_set_user_team, the stored team scores are swapped and pushed to the * scoreboard, every player's money is reset to the half-time start value, and the * round restarts after a short HUD countdown. Per-player frags are left untouched * so individual stats carry across the swap. * * 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 Halftime Swap" new const VERSION[] = "1.0.0" new const AUTHOR[] = "counter-strike-boost.com" new g_pEnabled, g_pRound, g_pMoney, g_pCountdown new g_iRound new g_iScoreT, g_iScoreCT new bool:g_bSwapped new g_iSync new g_iTick public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) g_pEnabled = register_cvar("csb_half_enabled", "1") g_pRound = register_cvar("csb_half_round", "16") g_pMoney = register_cvar("csb_half_money", "800") g_pCountdown = register_cvar("csb_half_countdown", "5") register_logevent("eventRoundStart", 2, "1=Round_Start") register_event("TeamScore", "eventTeamScore", "a") g_iSync = CreateHudSyncObj() } public eventTeamScore() { new team[4], scoreStr[8] read_data(1, team, charsmax(team)) read_data(2, scoreStr, charsmax(scoreStr)) new score = str_to_num(scoreStr) if (team[0] == 'C' || team[0] == 'c') g_iScoreCT = score else g_iScoreT = score } public eventRoundStart() { if (!get_pcvar_num(g_pEnabled)) return g_iRound++ if (!g_bSwapped && g_iRound == get_pcvar_num(g_pRound)) doHalftime() } doHalftime() { g_bSwapped = true /* swap every player's side */ new players[32], num get_players(players, num, "c") new startMoney = get_pcvar_num(g_pMoney) for (new i = 0; i < num; i++) { new id = players[i] new CsTeams:t = cs_get_user_team(id) if (t == CS_TEAM_T) cs_set_user_team(id, CS_TEAM_CT) else if (t == CS_TEAM_CT) cs_set_user_team(id, CS_TEAM_T) cs_set_user_money(id, startMoney) } /* swap the stored scores and push them to the scoreboard */ new tmp = g_iScoreT g_iScoreT = g_iScoreCT g_iScoreCT = tmp pushScores() client_print(0, print_chat, "^x04[CSB]^x01 ^x03HALFTIME^x01 - teams have switched sides. Money reset to $%d.", startMoney) /* HUD countdown then restart */ g_iTick = get_pcvar_num(g_pCountdown) if (g_iTick < 1) g_iTick = 1 countdownTick() } countdownTick() { if (g_iTick <= 0) { server_cmd("sv_restart 1") return } set_hudmessage(255, 60, 60, -1.0, 0.35, 0, 0.0, 1.1, 0.0, 0.0, -1) ShowSyncHudMsg(0, g_iSync, "Second half starts in %d...", g_iTick) g_iTick-- set_task(1.0, "taskCountdown") } public taskCountdown() { countdownTick() } pushScores() { new msgid = get_user_msgid("TeamScore") message_begin(MSG_ALL, msgid) write_string("TERRORIST") write_short(g_iScoreT) message_end() message_begin(MSG_ALL, msgid) write_string("CT") write_short(g_iScoreCT) message_end() }