From 6db028af75ca2e87f01551090f1fff75a4879343 Mon Sep 17 00:00:00 2001 From: FruitieX Date: Tue, 16 Nov 2010 17:17:06 +0200 Subject: [PATCH] more fixes around ending/starting rounds... --- qcsrc/server/arena.qc | 48 +++++++++++++-------- qcsrc/server/cl_player.qc | 9 ++++ qcsrc/server/mutators/gamemode_freezetag.qc | 6 +-- 3 files changed, 42 insertions(+), 21 deletions(-) diff --git a/qcsrc/server/arena.qc b/qcsrc/server/arena.qc index b732c2f85..543a69d74 100644 --- a/qcsrc/server/arena.qc +++ b/qcsrc/server/arena.qc @@ -217,8 +217,9 @@ void Arena_Warmup() || (bluespawned >= 1 && yellowspawned >= 1) || (bluespawned >= 1 && pinkspawned >= 1) || (yellowspawned >= 1 && pinkspawned >= 1))) - { + { // no teams, or only one team has players warmup = time + cvar("g_freezetag_warmup"); + return; } f = ceil(warmup - time); @@ -285,16 +286,13 @@ void Arena_Warmup() if(self.classname == "player" && self.health > 0 && self.movetype == MOVETYPE_NONE) self.movetype = MOVETYPE_WALK; } -/** - * This function finds out whether an arena round is over 1 player is left. - * It determines the last player who's still alive and saves it's entity reference - * in the global variable 'champion'. Then the new enemy/enemies are put into the server. - * - * Gets called in StartFrame() - */ -void Spawnqueue_Check() + +void count_spawned_players() { - // check the amount of spawned players in each team + // TODO fix "*spawned" name, it should rather be "*players" or so + // not doing this not to prevent merge hell with Tag + + // count amount of players in each team redspawned = bluespawned = yellowspawned = pinkspawned = 0; FOR_EACH_PLAYER(self) { if (self.team == COLOR_TEAM1) redspawned += 1; @@ -302,18 +300,17 @@ void Spawnqueue_Check() else if (self.team == COLOR_TEAM3) yellowspawned += 1; else if (self.team == COLOR_TEAM4) pinkspawned += 1; } +} - if(g_ca) // we want to perform this before the return block below... +void count_alive_players() +{ + redalive = bluealive = yellowalive = pinkalive = 0; + if(g_ca) { - // this is STUPID to perform again, but has to be done so that we can give instant feedback when a round ends - // and so the code won't start searching for a champion using find() before all players are actually REMOVED - redalive = 0; bluealive = 0; FOR_EACH_PLAYER(self) { if (self.team == COLOR_TEAM1 && self.health >= 1) redalive += 1; else if (self.team == COLOR_TEAM2 && self.health >= 1) bluealive += 1; } - // as if the above stuff wasn't stupid enough, let's run it a third time! :D - // (so that we can send redalive/bluealive as a stat) FOR_EACH_PLAYER(self) { self.redalive_stat = redalive; self.bluealive_stat = bluealive; @@ -321,7 +318,7 @@ void Spawnqueue_Check() } else if(g_freezetag) { - redalive = bluealive = yellowalive = pinkalive = 0; + // count amount of alive players in each team FOR_EACH_PLAYER(self) { if (self.team == COLOR_TEAM1 && self.freezetag_frozen == 0 && self.health >= 1) redalive += 1; else if (self.team == COLOR_TEAM2 && self.freezetag_frozen == 0 && self.health >= 1) bluealive += 1; @@ -335,6 +332,23 @@ void Spawnqueue_Check() self.pinkalive_stat = pinkalive; } } + +} + +/** + * This function finds out whether an arena round is over 1 player is left. + * It determines the last player who's still alive and saves it's entity reference + * in the global variable 'champion'. Then the new enemy/enemies are put into the server. + * + * Gets called in StartFrame() + */ +void Spawnqueue_Check() +{ + count_spawned_players(); + if(g_ca || g_freezetag) // we want to perform this before the return block below (CA)... + { + count_alive_players(); + } if(time < warmup + 1 || inWarmupStage) return; diff --git a/qcsrc/server/cl_player.qc b/qcsrc/server/cl_player.qc index 8d4bdf666..9d5f724a5 100644 --- a/qcsrc/server/cl_player.qc +++ b/qcsrc/server/cl_player.qc @@ -386,6 +386,7 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float } void ClientKill_Now_TeamChange(); +void freezetag_CheckWinner(); void PlayerDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) { @@ -610,6 +611,14 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht race_PreDie(); DropAllRunes(self); + if(deathtype == DEATH_HURTTRIGGER) + { + PutClientInServer(); + count_alive_players(); // re-count players + freezetag_CheckWinner(); + return; + } + frag_attacker = attacker; frag_inflictor = inflictor; frag_target = self; diff --git a/qcsrc/server/mutators/gamemode_freezetag.qc b/qcsrc/server/mutators/gamemode_freezetag.qc index 1e034b9ff..bcb7e3e25 100644 --- a/qcsrc/server/mutators/gamemode_freezetag.qc +++ b/qcsrc/server/mutators/gamemode_freezetag.qc @@ -1,12 +1,12 @@ void freezetag_Initialize() { precache_model("models/ice/ice.md3"); - next_round = time + 5; + warmup = time + cvar("g_freezetag_warmup"); } void freezetag_CheckWinner() { - if(next_round) + if(next_round || (time > warmup - cvar("g_freezetag_warmup") && time < warmup)) return; // already waiting for next round to start if((redalive >= 1 && bluealive >= 1) // counted in arena.qc @@ -78,8 +78,6 @@ void freezetag_Freeze() if(self.waypointsprite_attached) { WaypointSprite_UpdateTeamRadar(self.waypointsprite_attached, RADARICON_WAYPOINT, '0.25 0.90 1'); - //WaypointSprite_UpdateMaxHealth(self.waypointsprite_attached, ITEM_RESPAWN_TICKS + 1); - //WaypointSprite_UpdateBuildFinished(self.waypointsprite_attached, time + ITEM_RESPAWN_TICKS); } } -- 2.39.2