Call centerprint countdown only in the first tic, it will continue automatically...
authorterencehill <piuntn@gmail.com>
Sun, 15 May 2022 13:53:06 +0000 (15:53 +0200)
committerterencehill <piuntn@gmail.com>
Sun, 15 May 2022 23:19:41 +0000 (01:19 +0200)
qcsrc/client/announcer.qc

index e86702afa086a8314ee12ba92540f605929a6b7d..291e1c40a8075e02eb6bab4a26bf19b873c6d4cc 100644 (file)
@@ -53,6 +53,8 @@ void Announcer_ClearTitle()
 }
 
 bool prev_inround;
+float prev_starttime;
+float prev_roundstarttime;
 void Announcer_Countdown(entity this)
 {
        float starttime = STAT(GAMESTARTTIME);
@@ -70,6 +72,9 @@ void Announcer_Countdown(entity this)
        float countdown = (inround ? roundstarttime - time : starttime - time);
        float countdown_rounded = floor(0.5 + countdown);
 
+       if (starttime != prev_starttime || roundstarttime != prev_roundstarttime || prev_inround != inround)
+               this.skin = 0; // restart centerprint countdown
+
        if(countdown <= 0) // countdown has finished, starttime is now
        {
                Local_Notification(MSG_CENTER, CENTER_COUNTDOWN_BEGIN);
@@ -84,7 +89,8 @@ void Announcer_Countdown(entity this)
                if(inround)
                {
                        if(!prev_inround) Announcer_ClearTitle(); // clear title if we just started the match
-                       Local_Notification(MSG_CENTER, CENTER_COUNTDOWN_ROUNDSTART, STAT(ROUNDS_PLAYED) + 1, countdown_rounded);
+                       if (!this.skin) // first tic
+                               Local_Notification(MSG_CENTER, CENTER_COUNTDOWN_ROUNDSTART, STAT(ROUNDS_PLAYED) + 1, countdown_rounded);
                        Notification annce_num = Announcer_PickNumber(CNT_ROUNDSTART, countdown_rounded);
                        if(annce_num != NULL)
                                Local_Notification(MSG_ANNCE, annce_num);
@@ -92,15 +98,22 @@ void Announcer_Countdown(entity this)
                }
                else
                {
-                       Local_Notification(MSG_CENTER, CENTER_COUNTDOWN_GAMESTART, countdown_rounded);
+                       if (!this.skin) // first tic
+                               Local_Notification(MSG_CENTER, CENTER_COUNTDOWN_GAMESTART, countdown_rounded);
                        Notification annce_num = Announcer_PickNumber(CNT_GAMESTART, countdown_rounded);
                        if(!roundstarttime && annce_num != NULL) // Don't announce game start in round based modes
                                Local_Notification(MSG_ANNCE, annce_num);
                        this.nextthink = (starttime - (countdown - 1));
                }
+               // Don't call centerprint countdown in the remaining tics, it will continue automatically.
+               // It's an optimization but also fixes ^COUNT shown in the last tic because of high slowmo values (15+).
+               // Hopefully it fixes ^COUNT occasionally shown in online servers, probably due to lags.
+               this.skin = 1; // recycled field
        }
 
        prev_inround = inround;
+       prev_starttime = starttime;
+       prev_roundstarttime = roundstarttime;
 }
 
 /**