Promuj serwer
csb-round-timer-hud / addons / amxmodx / scripting / csb_round_timer_hud.sma
103 lines 2.6 KiB Pawn Raw Permalink History
/*
 * CSB Round Timer
 * Copyright (C) 2026 counter-strike-boost.com
 *
 * Draws a round countdown HUD computed from mp_roundtime and the time the round
 * actually started (freezetime is added on top so the count matches the real
 * clock). The timer turns red in the last 30 seconds and hides itself once the
 * bomb is planted, so the C4 countdown can take over the screen.
 *
 * 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 <https://www.gnu.org/licenses/> for details.
 */

#include <amxmodx>

new const PLUGIN[] = "CSB Round Timer"
new const VERSION[] = "1.0.0"
new const AUTHOR[]  = "counter-strike-boost.com"

new Float:g_fRoundStart
new bool:g_bBombPlanted
new g_iSync
new g_pEnabled, g_pRoundTime, g_pFreezeTime

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR)

    g_pEnabled     = register_cvar("csb_timer_enabled", "1")
    g_pRoundTime   = get_cvar_pointer("mp_roundtime")
    g_pFreezeTime  = get_cvar_pointer("mp_freezetime")

    g_iSync = CreateHudSyncObj()

    register_logevent("eventRoundStart", 2, "1=Round_Start")
    register_logevent("eventBombPlanted", 3, "2=Planted_The_Bomb")

    set_task(0.5, "taskTimer", 0, _, _, "b")
}

public eventRoundStart()
{
    g_fRoundStart  = get_gametime()
    g_bBombPlanted = false
}

public eventBombPlanted()
{
    g_bBombPlanted = true
}

Float:roundLenSecs()
{
    new Float:mins = 5.0

    if (g_pRoundTime)
        mins = get_pcvar_float(g_pRoundTime)

    if (mins <= 0.0)
        mins = 5.0

    new Float:freeze = 0.0

    if (g_pFreezeTime)
        freeze = get_pcvar_float(g_pFreezeTime)

    return mins * 60.0 + freeze
}

public taskTimer()
{
    if (!get_pcvar_num(g_pEnabled) || g_bBombPlanted)
        return

    if (g_fRoundStart <= 0.0)
        return

    new Float:remain = roundLenSecs() - (get_gametime() - g_fRoundStart)

    if (remain < 0.0)
        remain = 0.0

    new secs = floatround(remain, floatround_ceil)
    new mm = secs / 60
    new ss = secs % 60

    /* red in the final 30 seconds, otherwise a calm cyan */
    new r = 0, g = 200, b = 200

    if (secs <= 30)
    {
        r = 255
        g = 40
        b = 40
    }

    set_hudmessage(r, g, b, 0.44, 0.02, 0, 0.0, 0.6, 0.0, 0.0, -1)
    ShowSyncHudMsg(0, g_iSync, "%d:%02d", mm, ss)
}