]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Freezetag, warmup stage: automatically unfreeze frozen players after 5 seconds, other...
authorterencehill <piuntn@gmail.com>
Sat, 1 Dec 2012 12:42:45 +0000 (13:42 +0100)
committerterencehill <piuntn@gmail.com>
Sat, 1 Dec 2012 12:51:13 +0000 (13:51 +0100)
qcsrc/server/arena.qc
qcsrc/server/defs.qh
qcsrc/server/mutators/base.qh
qcsrc/server/mutators/gamemode_freezetag.qc

index 181b15d75c98bc4fe279d65a96e611aa83430a60..6f38c45698389c17a9c0528245cb64df45dab246 100644 (file)
@@ -42,15 +42,9 @@ void reset_map(float dorespawn)
                        warmup += autocvar_g_ca_warmup;
                allowed_to_spawn = 1;
        }
-       else if(g_freezetag)
-       {
-               redalive = bluealive = yellowalive = pinkalive = 0;
-               warmup = max(time, game_starttime);
-               if(autocvar_g_freezetag_warmup > 0)
-                       warmup += autocvar_g_freezetag_warmup;
-       }
        else if(g_race || g_cts)
                race_ReadyRestart();
+       else MUTATOR_CALLHOOK(reset_map_global);
 
        lms_lowest_lives = 999;
        lms_next_place = player_count;
@@ -85,6 +79,7 @@ void reset_map(float dorespawn)
        // Moving the player reset code here since the player-reset depends
        // on spawnpoint entities which have to be reset first --blub
        if(dorespawn)
+       if(!MUTATOR_CALLHOOK(reset_map_players))
        FOR_EACH_CLIENT(self) {
                if(self.flags & FL_CLIENT)                              // reset all players
                {
@@ -99,11 +94,6 @@ void reset_map(float dorespawn)
                                self.classname = "player";
                                PutClientInServer();
                        }
-                       else if(g_freezetag)
-                       {
-                               if(self.classname == "player")
-                                       PutClientInServer();
-                       }
                        else
                        {
                                /*
index 9068fa75bf53e95400df5e635e8551faa3ae3a2c..757a2a1d7e61317786eeef8f5065ff13c0457d44 100644 (file)
@@ -642,6 +642,7 @@ float serverflags;
 .float player_blocked;
 
 .float freezetag_frozen;
+.float freezetag_frozen_timeout;
 .float freezetag_revive_progress;
 
 .entity muzzle_flash;
index e276d555c96c80f767b972aee74552709c16b56d..1f42d30597128c458678b8c91d9959af58bd39bd 100644 (file)
@@ -48,6 +48,12 @@ MUTATOR_HOOKABLE(PlayerSpawn);
        entity spawn_spot; // spot that was used, or world
        // called when a player spawns as player, after shared setup, before his weapon is chosen (so items may be changed in here)
 
+MUTATOR_HOOKABLE(reset_map_global);
+       // called in reset_map
+
+MUTATOR_HOOKABLE(reset_map_players);
+       // called in reset_map
+
 MUTATOR_HOOKABLE(ClientDisconnect);
        // called when a player disconnects
 
index 06f1c2c39c7d45c2c11ddf1811128ee182e778e9..d35e8ec34c831780f990f91a37ee9feff5606b7d 100644 (file)
@@ -7,7 +7,7 @@ void freezetag_Initialize()
 
 void freezetag_CheckWinner()
 {
-       if(time <= game_starttime) // game didn't even start yet! nobody can win in that case.
+       if(time <= game_starttime || inWarmupStage)
                return;
 
        if(next_round || (time > warmup - autocvar_g_freezetag_warmup && time < warmup))
@@ -99,6 +99,8 @@ void freezetag_Freeze(entity attacker)
        self.freezetag_frozen = 1;
        self.freezetag_revive_progress = 0;
        self.health = 1;
+       if(inWarmupStage)
+               self.freezetag_frozen_timeout = time + 5;
 
        entity ice;
        ice = spawn();
@@ -142,6 +144,7 @@ void freezetag_Freeze(entity attacker)
 void freezetag_Unfreeze(entity attacker)
 {
        self.freezetag_frozen = 0;
+       self.freezetag_frozen_timeout = 0;
        self.freezetag_revive_progress = 0;
        self.health = autocvar_g_balance_health_start;
 
@@ -282,12 +285,12 @@ MUTATOR_HOOKFUNCTION(freezetag_RemovePlayer)
 
 MUTATOR_HOOKFUNCTION(freezetag_PlayerDies)
 {
-
        if(frag_deathtype == DEATH_HURTTRIGGER)
        {
                if(!self.freezetag_frozen)
                {
                        freezetag_remove_alive();
+                       freezetag_Freeze(world);
                        freezetag_CheckWinner();
                }
                PutClientInServer(); // respawn the player
@@ -325,11 +328,13 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerDies)
 
 MUTATOR_HOOKFUNCTION(freezetag_PlayerSpawn)
 {
-       freezetag_add_alive();
-       if(time <= game_starttime || total_players == 0)
+       if(self.freezetag_frozen) // stay frozen if respawning after death (DEATH_HURTTRIGGER)
                return 1;
 
-       freezetag_Unfreeze(world); // start by making sure that all ice blocks are removed
+       freezetag_add_alive();
+
+       if(time <= game_starttime || inWarmupStage || total_players == 0)
+               return 1;
 
        if(total_players == 1) // only one player active on server, start a new match immediately
        if(!next_round && warmup && (time < warmup - autocvar_g_freezetag_warmup || time > warmup)) // not awaiting next round
@@ -340,8 +345,7 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerSpawn)
 
        if(warmup && time > warmup) // spawn too late, freeze player
        {
-               if(!next_round) // no msg if player respawn after a death by DEATH_HURTTRIGGER
-                       centerprint(self, "^1Round already started, you spawn as frozen.");
+               centerprint(self, "^1Round already started, you spawn as frozen.");
                freezetag_Freeze(world);
                freezetag_remove_alive();
        }
@@ -349,6 +353,26 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerSpawn)
        return 1;
 }
 
+MUTATOR_HOOKFUNCTION(freezetag_reset_map_global)
+{
+       redalive = bluealive = yellowalive = pinkalive = 0;
+       warmup = max(time, game_starttime);
+       if(autocvar_g_freezetag_warmup > 0)
+               warmup += autocvar_g_freezetag_warmup;
+       return 1;
+}
+
+MUTATOR_HOOKFUNCTION(freezetag_reset_map_players)
+{
+       FOR_EACH_PLAYER(self)
+       {
+               if (self.freezetag_frozen)
+                       freezetag_Unfreeze(world);
+               PutClientInServer();
+       }
+       return 1;
+}
+
 MUTATOR_HOOKFUNCTION(freezetag_GiveFragsForKill)
 {
        frag_score = 0; // no frags counted in Freeze Tag
@@ -364,6 +388,12 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink)
                return 1;
        if(self.freezetag_frozen && !self.freezetag_revive_progress)
                self.health = 1;
+       if(self.freezetag_frozen_timeout && time >= self.freezetag_frozen_timeout)
+       {
+               freezetag_Unfreeze(world);
+               freezetag_add_alive();
+               return 1;
+       }
        if(next_round || (time > warmup - autocvar_g_freezetag_warmup && time < warmup))
                return 1; // already waiting for next round to start
 
@@ -500,6 +530,8 @@ MUTATOR_DEFINITION(gamemode_freezetag)
        MUTATOR_HOOK(ClientDisconnect, freezetag_RemovePlayer, CBC_ORDER_ANY);
        MUTATOR_HOOK(PlayerDies, freezetag_PlayerDies, CBC_ORDER_ANY);
        MUTATOR_HOOK(PlayerSpawn, freezetag_PlayerSpawn, CBC_ORDER_ANY);
+       MUTATOR_HOOK(reset_map_global, freezetag_reset_map_global, CBC_ORDER_ANY);
+       MUTATOR_HOOK(reset_map_players, freezetag_reset_map_players, CBC_ORDER_ANY);
        MUTATOR_HOOK(GiveFragsForKill, freezetag_GiveFragsForKill, CBC_ORDER_FIRST);
        MUTATOR_HOOK(PlayerPreThink, freezetag_PlayerPreThink, CBC_ORDER_FIRST);
        MUTATOR_HOOK(PlayerPhysics, freezetag_PlayerPhysics, CBC_ORDER_FIRST);