]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/mutators/gamemode_freezetag.qc
Rename *spawned vars to *players as the TODO says, it makes sense
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / mutators / gamemode_freezetag.qc
index 410a33673c9b8c0aff3f18343ddefdb93f666487..488a4f124ae378b7b62965d25e5206df491316a9 100644 (file)
@@ -65,7 +65,10 @@ void freezetag_Ice_Think()
 
 void freezetag_Freeze(entity attacker)
 {
+       if(self.freezetag_frozen)
+               return;
        self.freezetag_frozen = 1;
+       self.freezetag_revive_progress = 0;
 
        entity ice;
        ice = spawn();
@@ -82,12 +85,10 @@ void freezetag_Freeze(entity attacker)
        freezetag_Ice_Think();
        self = oldself;
 
+       RemoveGrapplingHook(self);
+
        // add waypoint
-       WaypointSprite_Spawn("freezetag_frozen", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attached, TRUE);
-       if(self.waypointsprite_attached)
-       {
-               WaypointSprite_UpdateTeamRadar(self.waypointsprite_attached, RADARICON_WAYPOINT, '0.25 0.90 1');
-       }
+       WaypointSprite_Spawn("freezetag_frozen", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attached, TRUE, RADARICON_WAYPOINT, '0.25 0.90 1');
 
        if(attacker == self)
        {
@@ -111,6 +112,7 @@ void freezetag_Freeze(entity attacker)
 void freezetag_Unfreeze(entity attacker)
 {
        self.freezetag_frozen = 0;
+       self.freezetag_revive_progress = 0;
 
        // remove the ice block
        entity ice;
@@ -140,7 +142,7 @@ MUTATOR_HOOKFUNCTION(freezetag_RemovePlayer)
                --totalalive;
        }
 
-       if(totalspawned > 2) // only check for winners if we had more than two players (one of them left, don't let the other player win just because of that)
+       if(total_players > 2) // only check for winners if we had more than two players (one of them left, don't let the other player win just because of that)
                freezetag_CheckWinner();
 
        freezetag_Unfreeze(world);
@@ -192,7 +194,7 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerSpawn)
 {
     freezetag_Unfreeze(world); // start by making sure that all ice blocks are removed
 
-       if(totalspawned == 1 && time > game_starttime) // only one player active on server, start a new match immediately
+       if(total_players == 1 && time > game_starttime) // 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
        {
                next_round = time;
@@ -215,88 +217,86 @@ MUTATOR_HOOKFUNCTION(freezetag_GiveFragsForKill)
 
 MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink)
 {
-    vector revive_extra_size;
-    revive_extra_size = '1 1 1' * autocvar_g_freezetag_revive_extra_size;
+       float n;
+       vector revive_extra_size;
 
-    float teammate_nearby;
-    FOR_EACH_PLAYER(other) if(self != other)
-    {
-        if(other.freezetag_frozen == 0)
-        {
-            if(other.team == self.team)
-            {
-                teammate_nearby = boxesoverlap(self.absmin - revive_extra_size, self.absmax + revive_extra_size, other.absmin, other.absmax);
-                if(teammate_nearby)
-                    break;
-            }
-        }
-    }
+       revive_extra_size = '1 1 1' * autocvar_g_freezetag_revive_extra_size;
 
-    if(teammate_nearby && self.freezetag_frozen == 1) // OK, there is at least one teammate reviving us
-    {
-        if(self.freezetag_beginrevive_time == -9999) // initialize values if this is the first frame of revival
-        {
-            self.freezetag_beginrevive_time = time;
-            self.freezetag_revive_progress = 0;
-        }
-        else
-        {
-            self.freezetag_revive_progress = (time - self.freezetag_beginrevive_time) / autocvar_g_freezetag_revive_time;
-            if(time - self.freezetag_beginrevive_time >= autocvar_g_freezetag_revive_time)
-            {
-                freezetag_Unfreeze(self);
-               entity o;
-               o = other;
-               
-               // EVERY team mate nearby gets a point (even if multiple!)
-               float n;
-               FOR_EACH_PLAYER(other) if(self != other)
+       entity o;
+       o = world;
+       n = 0;
+       FOR_EACH_PLAYER(other) if(self != other)
+       {
+               if(other.freezetag_frozen == 0)
                {
-                       if(other.freezetag_frozen == 0)
+                       if(other.team == self.team)
                        {
-                               if(other.team == self.team)
+                               if(boxesoverlap(self.absmin - revive_extra_size, self.absmax + revive_extra_size, other.absmin, other.absmax))
+                               {
+                                       if(!o)
+                                               o = other;
+                                       ++n;
+                               }
+                       }
+               }
+       }
+
+       if(n && self.freezetag_frozen) // OK, there is at least one teammate reviving us
+       {
+               self.freezetag_revive_progress = bound(0, self.freezetag_revive_progress + frametime * autocvar_g_freezetag_revive_speed, 1);
+
+               if(self.freezetag_revive_progress >= 1)
+               {
+                       freezetag_Unfreeze(self);
+
+                       // EVERY team mate nearby gets a point (even if multiple!)
+                       FOR_EACH_PLAYER(other) if(self != other)
+                       {
+                               if(other.freezetag_frozen == 0)
                                {
-                                       teammate_nearby = boxesoverlap(self.absmin - revive_extra_size, self.absmax + revive_extra_size, other.absmin, other.absmax);
-                                       if(teammate_nearby)
+                                       if(other.team == self.team)
                                        {
-                                               PlayerScore_Add(other, SP_FREEZETAG_REVIVALS, +1);
-                                               PlayerScore_Add(other, SP_SCORE, +1);
-                                               ++n;
+                                               if(boxesoverlap(self.absmin - revive_extra_size, self.absmax + revive_extra_size, other.absmin, other.absmax))
+                                               {
+                                                       PlayerScore_Add(other, SP_FREEZETAG_REVIVALS, +1);
+                                                       PlayerScore_Add(other, SP_SCORE, +1);
+                                               }
                                        }
                                }
                        }
-               }
 
-               if(n > 1)
-                       centerprint(self, strcat("^5You were revived by ^7", o.netname, "^5 et al.\n"));
-               else
-                       centerprint(self, strcat("^5You were revived by ^7", o.netname, "^5.\n"));
-                centerprint(o, strcat("^5You revived ^7", self.netname, "^5.\n"));
-                bprint("^7", o.netname, "^5 revived ^7", self.netname, "^5.\n");
+                       if(n > 1)
+                               centerprint(self, strcat("^5You were revived by ^7", o.netname, "^5 et al.\n"));
+                       else
+                               centerprint(self, strcat("^5You were revived by ^7", o.netname, "^5.\n"));
+                       centerprint(o, strcat("^5You revived ^7", self.netname, "^5.\n"));
+                       if(n > 1)
+                               bprint("^7", o.netname, "^5 et al revived ^7", self.netname, "^5.\n");
+                       else
+                               bprint("^7", o.netname, "^5 revived ^7", self.netname, "^5.\n");
+               }
 
-                self.freezetag_beginrevive_time = -9999;
-                self.freezetag_revive_progress = 0;
-            }
-        }
-        // now find EVERY teammate within reviving radius, set their revive_progress values correct
-        FOR_EACH_PLAYER(other) if(self != other)
-        {
-            if(other.freezetag_frozen == 0)
-            {
-                if(other.team == self.team)
-                {
-                    teammate_nearby = boxesoverlap(self.absmin - revive_extra_size, self.absmax + revive_extra_size, other.absmin, other.absmax);
-                    if(teammate_nearby)
-                        other.freezetag_revive_progress = self.freezetag_revive_progress;
-                }
-            }
-        }
-    }
-    else if(!teammate_nearby) // only if no teammate is nearby will we reset
-    {
-        self.freezetag_beginrevive_time = -9999;
-        self.freezetag_revive_progress = 0;
-    }
+               // now find EVERY teammate within reviving radius, set their revive_progress values correct
+               FOR_EACH_PLAYER(other) if(self != other)
+               {
+                       if(other.freezetag_frozen == 0)
+                       {
+                               if(other.team == self.team)
+                               {
+                                       if(boxesoverlap(self.absmin - revive_extra_size, self.absmax + revive_extra_size, other.absmin, other.absmax))
+                                               other.freezetag_revive_progress = self.freezetag_revive_progress;
+                               }
+                       }
+               }
+       }
+       else if(!n && self.freezetag_frozen) // only if no teammate is nearby will we reset
+       {
+               self.freezetag_revive_progress = bound(0, self.freezetag_revive_progress - frametime * autocvar_g_freezetag_revive_clearspeed, 1);
+       }
+       else if(!n)
+       {
+               self.freezetag_revive_progress = 0; // thawing nobody
+       }
 
        return 1;
 }
@@ -324,6 +324,13 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerDamage_Calculate)
     return 1;
 }
 
+MUTATOR_HOOKFUNCTION(freezetag_ForbidThrowCurrentWeapon)
+{
+       if (self.freezetag_frozen)
+               return 1;
+       return 0;
+}
+
 MUTATOR_DEFINITION(gamemode_freezetag)
 {
        MUTATOR_HOOK(MakePlayerObserver, freezetag_RemovePlayer, CBC_ORDER_ANY);
@@ -334,6 +341,7 @@ MUTATOR_DEFINITION(gamemode_freezetag)
        MUTATOR_HOOK(PlayerPreThink, freezetag_PlayerPreThink, CBC_ORDER_FIRST);
        MUTATOR_HOOK(PlayerPhysics, freezetag_PlayerPhysics, CBC_ORDER_FIRST);
        MUTATOR_HOOK(PlayerDamage_Calculate, freezetag_PlayerDamage_Calculate, CBC_ORDER_ANY);
+       MUTATOR_HOOK(ForbidThrowCurrentWeapon, freezetag_ForbidThrowCurrentWeapon, CBC_ORDER_FIRST); //first, last or any? dunno.
 
        MUTATOR_ONADD
        {