]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/announcer.qc
try to fix vehicle chase cam (untested)
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / announcer.qc
index 833eb8e129fadfe0c2bbca7e220a86acae7050b7..3e109e78052036fd77f33f88b5138e12844f4418 100644 (file)
-void serverAnnouncer()
+float previous_announcement_time;
+float previous_game_starttime;
+string previous_announcement;
+
+// remaining maptime announcer sounds, true when sound was already played
+float announcer_1min;
+float announcer_5min;
+
+void Announcer_Play(string announcement)
 {
-       // check for pending announcement, play it and remove it
-       if(announce_snd != "")
+       if((announcement != previous_announcement) || (time >= (previous_announcement_time + autocvar_cl_announcer_antispam)))
        {
-               sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/", announce_snd, ".wav"), VOL_BASEVOICE, ATTN_NONE);
-               strunzone(announce_snd);
-               announce_snd = "";
+               sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/", announcement, ".wav"), VOL_BASEVOICE, ATTN_NONE);
+
+               if(previous_announcement) { strunzone(previous_announcement); }
+               
+               previous_announcement = strzone(announcement);
+               previous_announcement_time = time;
        }
 }
 
-void restartAnnouncer_Think() {
-       float countdown_rounded, countdown;
-       countdown = getstatf(STAT_GAMESTARTTIME) - time;
-       countdown_rounded = floor(0.5 + countdown);
-       if(countdown <= 0) {
-               if (!spectatee_status) //do cprint only for players
+void Announcer_Countdown() 
+{
+       float starttime = getstatf(STAT_GAMESTARTTIME);
+       float countdown = (starttime - time);
+       float countdown_rounded = floor(0.5 + countdown);
+       
+       if(countdown <= 0) // countdown has finished, starttime is now
+       {
+               if (!spectatee_status) 
                        centerprint_generic(CPID_GAME_STARTING, _("^1Begin!"), 1, 0);
 
-               sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/begin.wav"), VOL_BASEVOICE, ATTN_NONE);
-               //reset maptime announcers now as well
-               announcer_5min = announcer_1min = FALSE;
-
+               Announcer_Play("begin");
+               announcer_5min = announcer_1min = FALSE; // reset maptime announcers now as well
                remove(self);
                return;
        }
-       else {
-               if (!spectatee_status) //do cprint only for players
+       else // countdown is still going
+       {
+               if (!spectatee_status)
                        centerprint_generic(CPID_GAME_STARTING, _("^1Game starts in %d seconds"), 1, countdown_rounded);
 
-               if(countdown_rounded <= 3 && countdown_rounded >= 1) {
-                       sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/", ftos(countdown_rounded), ".wav"), VOL_BASEVOICE, ATTN_NONE);
-               }
+               if(countdown_rounded <= 3 && countdown_rounded >= 1) 
+                       Announcer_Play(ftos(countdown_rounded));
 
-               self.nextthink = getstatf(STAT_GAMESTARTTIME) - (countdown - 1);
+               self.nextthink = (starttime - (countdown - 1));
        }
 }
 
 /**
- * Plays the 1minute or 5 minutes (of maptime) remaining sound, if client wants it
+ * Checks whether the server initiated a map restart (stat_game_starttime changed)
+ *
+ * TODO: Use a better solution where a common shared entitiy is used that contains
+ * timelimit, fraglimit and game_starttime! Requires engine changes (remove STAT_TIMELIMIT
+ * and STAT_FRAGLIMIT to be auto-sent)
  */
-void maptimeAnnouncer() {
-       float timelimit;
-       timelimit = getstatf(STAT_TIMELIMIT);
-       float timeleft;
-       timeleft = max(0, timelimit * 60 + getstatf(STAT_GAMESTARTTIME) - time);
-
-       float warmuplimit;
-       float warmuptimeleft;
-       if(warmup_stage) {
-               warmuplimit = autocvar_g_warmup_limit;
-               if(warmuplimit > 0) {
-                       warmuptimeleft = max(0, warmuplimit + getstatf(STAT_GAMESTARTTIME) - time); 
+void Announcer_Gamestart() 
+{
+       float startTime = getstatf(STAT_GAMESTARTTIME);
+       
+       if(previous_game_starttime != startTime) 
+       {
+               if((time + 5.0) < startTime) // if connecting to server while restart was active don't always play prepareforbattle
+                       Announcer_Play("prepareforbattle");
+               
+               if(time < startTime) 
+               {
+                       entity e;
+                       e = spawn();
+                       e.think = Announcer_Countdown;
+                       e.nextthink = startTime - floor(startTime - time); //synchronize nextthink to startTime
                }
        }
+       
+       previous_game_starttime = startTime;
+}
 
-       //5 minute check
-       if (autocvar_cl_sound_maptime_warning >= 2) {
-               //make sure that after connect (and e.g. 4 minutes left) we will not get a wrong sound
+
+// Plays the 1 minute or 5 minutes (of maptime) remaining sound, if client wants it
+void Announcer_Time() 
+{
+       float timelimit = getstatf(STAT_TIMELIMIT);
+       float timeleft = max(0, timelimit * 60 + getstatf(STAT_GAMESTARTTIME) - time);
+       float warmup_timeleft;
+       
+       if(warmup_stage) 
+               if(autocvar_g_warmup_limit > 0)
+                       warmup_timeleft = max(0, autocvar_g_warmup_limit + getstatf(STAT_GAMESTARTTIME) - time); 
+
+       // 5 minute check
+       if(autocvar_cl_announcer_maptime >= 2) 
+       {
+               // make sure that after connect (and e.g. 4 minutes left) we will not get a wrong sound
                if(announcer_5min)
                {
-                       if(((!warmup_stage || warmuplimit == 0) && timeleft > 300) || (warmup_stage && warmuplimit > 0 && warmuptimeleft > 300))
-                               announcer_5min = FALSE;
+                       if(((!warmup_stage || autocvar_g_warmup_limit == 0) && timeleft > 300) 
+                               || (warmup_stage && autocvar_g_warmup_limit > 0 && warmup_timeleft > 300))
+                                       announcer_5min = FALSE;
                }
-               else if (((!warmup_stage || warmuplimit == 0) && timelimit > 0 && timeleft < 300 && timeleft > 299) || (warmup_stage && warmuplimit > 0 && warmuptimeleft < 300 && warmuptimeleft > 299))
-                       //if we're in warmup mode, check whether there's a warmup timelimit
-                       if not (warmuplimit == -1 && warmup_stage) {
-                               announcer_5min = TRUE;
-                               sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/5minutesremain.wav"), VOL_BASEVOICE, ATTN_NONE);
+               else 
+               {
+                       if(((!warmup_stage || autocvar_g_warmup_limit == 0) && timelimit > 0 && timeleft < 300 && timeleft > 299) 
+                               || (warmup_stage && autocvar_g_warmup_limit > 0 && warmup_timeleft < 300 && warmup_timeleft > 299))
+                       {
+                               //if we're in warmup mode, check whether there's a warmup timelimit
+                               if not(autocvar_g_warmup_limit == -1 && warmup_stage) 
+                               {
+                                       announcer_5min = TRUE;
+                                       Announcer_Play("5minutesremain");
+                               }
                        }
+               }
        }
 
-       //1 minute check
-       if (autocvar_cl_sound_maptime_warning == 1 || autocvar_cl_sound_maptime_warning == 3) {
+       // 1 minute check
+       if((autocvar_cl_announcer_maptime == 1) || (autocvar_cl_announcer_maptime == 3))
+       {
                if (announcer_1min)
                {
-                       if(((!warmup_stage || warmuplimit == 0) && timeleft > 60) || (warmup_stage && warmuplimit > 0 && warmuptimeleft > 60))
-                               announcer_1min = FALSE;
+                       if(((!warmup_stage || autocvar_g_warmup_limit == 0) && timeleft > 60) 
+                               || (warmup_stage && autocvar_g_warmup_limit > 0 && warmup_timeleft > 60))
+                                       announcer_1min = FALSE;
                }
-               else if (((!warmup_stage || warmuplimit == 0) && timelimit > 0 && timeleft < 60) || (warmup_stage && warmuplimit > 0 && warmuptimeleft < 60))
-                       //if we're in warmup mode, check whether there's a warmup timelimit
-                       if not (warmuplimit == -1 && warmup_stage) {
+               else if(((!warmup_stage || autocvar_g_warmup_limit == 0) && timelimit > 0 && timeleft < 60) 
+                       || (warmup_stage && autocvar_g_warmup_limit > 0 && warmup_timeleft < 60))
+               {
+                       // if we're in warmup mode, check whether there's a warmup timelimit
+                       if not(autocvar_g_warmup_limit == -1 && warmup_stage) 
+                       {
                                announcer_1min = TRUE;
-                               sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/1minuteremains.wav"), VOL_BASEVOICE, ATTN_NONE);
+                               Announcer_Play("1minuteremains");
                        }
+               }
        }
 }
 
-/**
- * Announce carried items (e.g. flags in CTF).
- */
 float redflag_prev;
 float blueflag_prev;
 void carrierAnnouncer() {
@@ -118,11 +163,11 @@ void carrierAnnouncer() {
        {
                if (pickup) {
                        if (autocvar_cl_notify_carried_items & 2)
-                               centerprint(sprintf(_("You picked up the %s!"), item));
+                               centerprint_hud(sprintf(_("You picked up the %s!"), item));
                }
                else {
                        if (autocvar_cl_notify_carried_items & 1)
-                               centerprint(sprintf(_("You got the %s!"), item));
+                               centerprint_hud(sprintf(_("You got the %s!"), item));
                }
        }
 
@@ -130,11 +175,15 @@ void carrierAnnouncer() {
        redflag_prev = redflag;
 }
 
-/**
- * Add all future announcer sounds precaches here.
- * TODO: announcer queues
- */
-void Announcer_Precache () {
+void Announcer()
+{
+       Announcer_Gamestart();
+       Announcer_Time();
+       carrierAnnouncer();
+}
+
+void Announcer_Precache () 
+{
        precache_sound (strcat("announcer/", autocvar_cl_announcer, "/1minuteremains.wav"));
        precache_sound (strcat("announcer/", autocvar_cl_announcer, "/5minutesremain.wav"));
 
@@ -179,4 +228,4 @@ void Announcer_Precache () {
        precache_sound (strcat("announcer/", autocvar_cl_announcer, "/voteaccept.wav"));
        precache_sound (strcat("announcer/", autocvar_cl_announcer, "/votecall.wav"));
        precache_sound (strcat("announcer/", autocvar_cl_announcer, "/votefail.wav"));
-}
\ No newline at end of file
+}