X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fround_handler.qc;h=d5b0281338ac22f1999db48338432feb482f0af2;hb=263c592e468eeeffb2755d204b21eb13e398adac;hp=2bac357fba292ee5cc6f11538022c83ce893860c;hpb=0f6085c8ea46125d87ca81ec7f5e82f73c08f958;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/round_handler.qc b/qcsrc/server/round_handler.qc index 2bac357fb..d5b028133 100644 --- a/qcsrc/server/round_handler.qc +++ b/qcsrc/server/round_handler.qc @@ -1,11 +1,16 @@ +#include "round_handler.qh" +#include "_all.qh" + +#include "command/vote.qh" +#include "../common/util.qh" + 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; } @@ -18,32 +23,28 @@ void round_handler_Think() if(self.wait) { - reset_map(TRUE); - self.wait = FALSE; + self.wait = false; self.cnt = self.count + 1; // init countdown + round_starttime = time + self.count; + reset_map(true); } 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 = (self.round_timelimit) ? time + self.round_timelimit : 0; self.nextthink = time; + if(self.roundStart) + 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 @@ -57,7 +58,7 @@ void round_handler_Think() if(self.canRoundEnd()) { // schedule a new round - self.wait = TRUE; + self.wait = true; self.nextthink = time + self.delay; } else @@ -67,58 +68,50 @@ void round_handler_Think() } } -void round_handler_Spawn(float() canRoundStart_func, float() canRoundEnd_func, float the_delay, float the_count) +void round_handler_Init(float the_delay, float the_count, float the_round_timelimit) { - if(round_handler) - { - backtrace("Can't spawn round_handler again!"); - return; - } - round_handler = spawn(); - round_handler.classname = "round_handler"; - - round_handler.think = round_handler_Think; - round_handler.canRoundStart = canRoundStart_func; - round_handler.canRoundEnd = canRoundEnd_func; round_handler.delay = (the_delay > 0) ? the_delay : 0; round_handler.count = fabs(floor(the_count)); - round_handler.wait = FALSE; round_handler.cnt = round_handler.count + 1; - round_handler.nextthink = max(time, game_starttime + 1); + round_handler.round_timelimit = (the_round_timelimit > 0) ? the_round_timelimit : 0; } -float round_handler_IsActive() +// NOTE: this is only needed because if round_handler spawns at time 1 +// gamestarttime isn't initialized yet +void round_handler_FirstThink() { - return (round_handler != world); -} - -float round_handler_AwaitingNextRound() -{ - return (round_handler.wait); + round_starttime = max(time, game_starttime) + round_handler.count; + round_handler.think = round_handler_Think; + round_handler.nextthink = max(time, game_starttime); } -float round_handler_CountdownRunning() +void round_handler_Spawn(float() canRoundStart_func, float() canRoundEnd_func, void() roundStart_func) { - return (!round_handler.wait && round_handler.cnt); -} + if(round_handler) + { + backtrace("Can't spawn round_handler again!"); + return; + } + round_handler = spawn(); + round_handler.classname = "round_handler"; -float round_handler_IsRoundStarted() -{ - return (!round_handler.wait && !round_handler.cnt); + round_handler.think = round_handler_FirstThink; + round_handler.canRoundStart = canRoundStart_func; + round_handler.canRoundEnd = canRoundEnd_func; + round_handler.roundStart = roundStart_func; + round_handler.wait = false; + round_handler_Init(5, 5, 180); + round_handler.nextthink = time; } void round_handler_Reset(float next_think) { - entity e; - round_handler.wait = FALSE; + 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()