]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
more fixes around ending/starting rounds...
authorFruitieX <fruitiex@gmail.com>
Tue, 16 Nov 2010 15:17:06 +0000 (17:17 +0200)
committerFruitieX <fruitiex@gmail.com>
Tue, 16 Nov 2010 15:17:06 +0000 (17:17 +0200)
qcsrc/server/arena.qc
qcsrc/server/cl_player.qc
qcsrc/server/mutators/gamemode_freezetag.qc

index b732c2f85aa18726d8a9b87099d735bbaca6105d..543a69d744484c061d0fd94939f833b693cf63e7 100644 (file)
@@ -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;
 
index 8d4bdf6663d8a8f9085cadd88117bcb74f5e3645..9d5f724a5033dde4bab9a4466c5090ad89179db3 100644 (file)
@@ -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;
index 1e034b9ff2c4e61e3f30cdf03e86c36caa03cdb5..bcb7e3e256ce8df0240af3d8188b47436a628ff6 100644 (file)
@@ -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);
        }
 }