From 2f4fc11e35ef11e180666526c57750b292cc887a Mon Sep 17 00:00:00 2001 From: terencehill Date: Thu, 7 Feb 2013 18:25:01 +0100 Subject: [PATCH] Let CSQC handle countdown to round start by integrating it with the countdown to game start --- qcsrc/client/announcer.qc | 30 +++++++++++++++++++++++++----- qcsrc/common/constants.qh | 3 ++- qcsrc/server/cl_client.qc | 1 + qcsrc/server/defs.qh | 4 +++- qcsrc/server/g_world.qc | 1 + qcsrc/server/round_handler.qc | 31 +++++++++++-------------------- 6 files changed, 43 insertions(+), 27 deletions(-) diff --git a/qcsrc/client/announcer.qc b/qcsrc/client/announcer.qc index ec4cc78f6..fad42592e 100644 --- a/qcsrc/client/announcer.qc +++ b/qcsrc/client/announcer.qc @@ -22,23 +22,40 @@ void Announcer_Play(string announcement) void Announcer_Countdown() { float starttime = getstatf(STAT_GAMESTARTTIME); + float roundstarttime = getstatf(STAT_ROUNDSTARTTIME); + if(starttime <= time) // game start time has passed + announcer_5min = announcer_1min = FALSE; // reset maptime announcers now as well + if(roundstarttime == -1) + { + // stop countdown immediately + centerprint_generic(CPID_GAME_STARTING, "", 1, 0); + remove(self); + return; + } + if(roundstarttime >= starttime) + starttime = roundstarttime; + 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); Announcer_Play("begin"); - announcer_5min = announcer_1min = FALSE; // reset maptime announcers now as well remove(self); return; } else // countdown is still going { if (!spectatee_status) - centerprint_generic(CPID_GAME_STARTING, _("^1Game starts in %d seconds"), 1, countdown_rounded); + { + if(roundstarttime == starttime) + centerprint_generic(CPID_GAME_STARTING, _("^1Round starts in %d seconds"), 1, countdown_rounded); + else + centerprint_generic(CPID_GAME_STARTING, _("^1Game starts in %d seconds"), 1, countdown_rounded); + } if(countdown_rounded <= 3 && countdown_rounded >= 1) Announcer_Play(ftos(countdown_rounded)); @@ -57,12 +74,15 @@ void Announcer_Countdown() void Announcer_Gamestart() { float startTime = getstatf(STAT_GAMESTARTTIME); - + float roundstarttime = getstatf(STAT_ROUNDSTARTTIME); + if(roundstarttime > startTime) + startTime = roundstarttime; + 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; diff --git a/qcsrc/common/constants.qh b/qcsrc/common/constants.qh index 83063cf69..d84be976b 100644 --- a/qcsrc/common/constants.qh +++ b/qcsrc/common/constants.qh @@ -180,6 +180,7 @@ const float STAT_SECRETS_TOTAL = 70; const float STAT_SECRETS_FOUND = 71; const float STAT_RESPAWN_TIME = 72; +const float STAT_ROUNDSTARTTIME = 73; // mod stats (1xx) const float STAT_REDALIVE = 100; @@ -463,7 +464,7 @@ float CPID_CTF_CAPTURESHIELD = 2; float CPID_MINSTA_FINDAMMO = 3; float CPID_NIX_WPNCHANGE = 4; float CPID_DISCONNECT_IDLING = 5; -float CPID_ROUND_STARTING = 6; + float CPID_GAME_STARTING = 7; float CPID_TIMEOUT_COUNTDOWN = 8; float CPID_MOTD = 9; diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index 6493069fa..fc29da99e 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -2501,6 +2501,7 @@ void PlayerPreThink (void) WarpZone_PlayerPhysics_FixVAngle(); self.stat_game_starttime = game_starttime; + self.stat_round_starttime = round_starttime; self.stat_allow_oldnexbeam = autocvar_g_allow_oldnexbeam; self.stat_leadlimit = autocvar_leadlimit; diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh index 90701b588..991ad2147 100644 --- a/qcsrc/server/defs.qh +++ b/qcsrc/server/defs.qh @@ -500,8 +500,10 @@ string cvar_changes; string cvar_purechanges; float cvar_purechanges_count; -float game_starttime; //point in time when the countdown is over +float game_starttime; //point in time when the countdown to game start is over +float round_starttime; //point in time when the countdown to round start is over .float stat_game_starttime; +.float stat_round_starttime; .float stat_sv_airaccel_qw; .float stat_sv_airstrafeaccel_qw; diff --git a/qcsrc/server/g_world.qc b/qcsrc/server/g_world.qc index 4a575e75b..bbca5e600 100644 --- a/qcsrc/server/g_world.qc +++ b/qcsrc/server/g_world.qc @@ -784,6 +784,7 @@ void spawnfunc_worldspawn (void) addstat(STAT_SWITCHWEAPON, AS_INT, switchweapon); addstat(STAT_SWITCHINGWEAPON, AS_INT, switchingweapon); addstat(STAT_GAMESTARTTIME, AS_FLOAT, stat_game_starttime); + addstat(STAT_ROUNDSTARTTIME, AS_FLOAT, stat_round_starttime); addstat(STAT_ALLOW_OLDNEXBEAM, AS_INT, stat_allow_oldnexbeam); Nagger_Init(); diff --git a/qcsrc/server/round_handler.qc b/qcsrc/server/round_handler.qc index 96d3dc896..088384781 100644 --- a/qcsrc/server/round_handler.qc +++ b/qcsrc/server/round_handler.qc @@ -1,11 +1,10 @@ void round_handler_Think() { - entity e; float f; - if(time <= game_starttime) + if(time < game_starttime) { - round_handler_Reset(game_starttime + 1); + round_handler_Reset(game_starttime); return; } @@ -21,22 +20,18 @@ void round_handler_Think() reset_map(TRUE); self.wait = FALSE; self.cnt = self.count + 1; // init countdown + round_starttime = time + self.count; } if(self.cnt > 0) // countdown running { if(self.canRoundStart()) { + if(self.cnt == self.count + 1) + round_starttime = time + self.count; f = self.cnt - 1; - if(f == 5) Announce("prepareforbattle"); - else if(f == 3) Announce("3"); - else if(f == 2) Announce("2"); - else if(f == 1) Announce("1"); - else if(f == 0) + if(f == 0) { - Announce("begin"); - FOR_EACH_REALCLIENT(e) - Send_CSQC_Centerprint_Generic(e, CPID_ROUND_STARTING, "^1Begin!", 1, 0); self.cnt = 0; self.round_endtime = time + self.round_timelimit; self.nextthink = time; @@ -44,9 +39,6 @@ void round_handler_Think() self.roundStart(); return; } - - FOR_EACH_REALCLIENT(e) - Send_CSQC_Centerprint_Generic(e, CPID_ROUND_STARTING, "Round will start in %d", 1, f); self.cnt = self.cnt - 1; } else @@ -89,7 +81,10 @@ void round_handler_Spawn(float() canRoundStart_func, float() canRoundEnd_func, v round_handler.wait = FALSE; round_handler.cnt = round_handler.count + 1; round_handler.round_timelimit = the_round_timelimit; - round_handler.nextthink = max(time, game_starttime + 1); + // if round_handler spawns at time 1 gamestarttime isn't initialized yet + //round_handler.nextthink = max(time, game_starttime + 1); + round_handler.nextthink = time; + round_starttime = time + round_handler.count; } float round_handler_IsActive() @@ -119,16 +114,12 @@ float round_handler_GetTimeLeft() void round_handler_Reset(float next_think) { - entity e; round_handler.wait = FALSE; if(round_handler.count) if(round_handler.cnt < round_handler.count + 1) - { - FOR_EACH_REALCLIENT(e) - Send_CSQC_Centerprint_Generic_Expire(e, CPID_ROUND_STARTING); round_handler.cnt = round_handler.count + 1; - } round_handler.nextthink = next_think; + round_starttime = (next_think) ? (next_think + round_handler.count) : -1; } void round_handler_Remove() -- 2.39.2