]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qc
Resolve "CA uses LMS start values" and same for FT
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / gamemodes / gamemode / freezetag / sv_freezetag.qc
index 98b20f32adbfbb8faeb4f22af5b0813b924ed8a7..5a056e44b6e738afcfcf9be7f2d88f7f9ca0814c 100644 (file)
@@ -1,5 +1,6 @@
 #include "sv_freezetag.qh"
 
+#include <server/elimination.qh>
 #include <server/resources.qh>
 
 float autocvar_g_freezetag_frozen_maxtime;
@@ -113,6 +114,7 @@ bool freezetag_CheckWinner()
                Send_Notification(NOTIF_ALL, NULL, MSG_INFO, INFO_ROUND_OVER);
                FOREACH_CLIENT(IS_PLAYER(it), {
                        it.freezetag_frozen_timeout = 0;
+                       it.freezetag_revive_time = 0;
                        nades_Clear(it);
                });
                game_stopped = true;
@@ -140,6 +142,7 @@ bool freezetag_CheckWinner()
 
        FOREACH_CLIENT(IS_PLAYER(it), {
                it.freezetag_frozen_timeout = 0;
+               it.freezetag_revive_time = 0;
                nades_Clear(it);
        });
 
@@ -178,7 +181,7 @@ void freezetag_Add_Score(entity targ, entity attacker)
 {
        if(attacker == targ)
        {
-               // you froze your own dumb targ
+               // you froze your own dumb self
                // counted as "suicide" already
                GameRules_scoring_add(targ, SCORE, -1);
        }
@@ -437,6 +440,7 @@ MUTATOR_HOOKFUNCTION(ft, reset_map_players)
 {
        FOREACH_CLIENT(IS_PLAYER(it), {
                CS(it).killcount = 0;
+               it.freezetag_revive_time = 0;
                it.freezetag_frozen_timeout = -1;
                PutClientInServer(it);
                it.freezetag_frozen_timeout = 0;
@@ -470,7 +474,7 @@ MUTATOR_HOOKFUNCTION(ft, Damage_Calculate)
                && autocvar_g_freezetag_frozen_maxtime > 0 && autocvar_g_freezetag_revive_auto)
        {
                float t = 0;
-               if ((autocvar_g_freezetag_revive_auto_reducible > 0 || DIFF_TEAM(frag_attacker, frag_target))
+               if ((autocvar_g_freezetag_revive_auto_reducible < 0 || DIFF_TEAM(frag_attacker, frag_target))
                        && frag_target.freezetag_frozen_timeout > time)
                {
                        if (fabs(autocvar_g_freezetag_revive_auto_reducible) == 1)
@@ -514,6 +518,15 @@ MUTATOR_HOOKFUNCTION(ft, PlayerPreThink, CBC_ORDER_FIRST)
        int n = 0;
        vector revive_extra_size = '1 1 1' * autocvar_g_freezetag_revive_extra_size;
        FOREACH_CLIENT(IS_PLAYER(it) && IS_REVIVING(player, it, revive_extra_size), {
+               if (autocvar_g_freezetag_revive_time_to_score > 0 && STAT(FROZEN, player) == FROZEN_NORMAL)
+               {
+                       it.freezetag_revive_time += frametime / autocvar_g_freezetag_revive_time_to_score;
+                       while (it.freezetag_revive_time > 1)
+                       {
+                               GameRules_scoring_add(it, SCORE, +1);
+                               it.freezetag_revive_time -= 1;
+                       }
+               }
                if (reviving_players_last)
                        reviving_players_last.chain = it;
                reviving_players_last = it;
@@ -539,8 +552,11 @@ MUTATOR_HOOKFUNCTION(ft, PlayerPreThink, CBC_ORDER_FIRST)
 
        if (!n) // no teammate nearby
        {
+               float clearspeed = autocvar_g_freezetag_revive_clearspeed;
+               if (autocvar_g_freezetag_revive_time_to_score > 0)
+                       clearspeed = 0; // prevent stacking points by entering and exiting the revival zone many times
                if (STAT(FROZEN, player) == FROZEN_NORMAL)
-                       STAT(REVIVE_PROGRESS, player) = bound(base_progress, STAT(REVIVE_PROGRESS, player) - frametime * autocvar_g_freezetag_revive_clearspeed * (1 - base_progress), 1);
+                       STAT(REVIVE_PROGRESS, player) = bound(base_progress, STAT(REVIVE_PROGRESS, player) - frametime * clearspeed * (1 - base_progress), 1);
                else if (!STAT(FROZEN, player))
                        STAT(REVIVE_PROGRESS, player) = base_progress; // thawing nobody
        }
@@ -582,8 +598,20 @@ MUTATOR_HOOKFUNCTION(ft, PlayerPreThink, CBC_ORDER_FIRST)
 
        if (STAT(FROZEN, player) == FROZEN_NORMAL)
        {
-               WaypointSprite_UpdateMaxHealth(player.waypointsprite_attached, 1);
-               WaypointSprite_UpdateHealth(player.waypointsprite_attached, STAT(REVIVE_PROGRESS, player));
+               entity player_wp = player.waypointsprite_attached;
+               if (n > 0 || (n == 0 && STAT(REVIVE_PROGRESS, player) > 0.95))
+               {
+                       WaypointSprite_UpdateSprites(player_wp, WP_Reviving, WP_Null, WP_Null);
+                       WaypointSprite_UpdateTeamRadar(player_wp, RADARICON_WAYPOINT, WP_REVIVING_COLOR);
+               }
+               else
+               {
+                       WaypointSprite_UpdateSprites(player_wp, WP_Frozen, WP_Null, WP_Null);
+                       WaypointSprite_UpdateTeamRadar(player_wp, RADARICON_WAYPOINT, WP_FROZEN_COLOR);
+               }
+
+               WaypointSprite_UpdateMaxHealth(player_wp, 1);
+               WaypointSprite_UpdateHealth(player_wp, STAT(REVIVE_PROGRESS, player));
        }
 
        return true;
@@ -592,14 +620,14 @@ MUTATOR_HOOKFUNCTION(ft, PlayerPreThink, CBC_ORDER_FIRST)
 MUTATOR_HOOKFUNCTION(ft, SetStartItems)
 {
        start_items &= ~(IT_UNLIMITED_AMMO | IT_UNLIMITED_SUPERWEAPONS);
-       //start_health       = warmup_start_health       = cvar("g_lms_start_health");
-       //start_armorvalue   = warmup_start_armorvalue   = cvar("g_lms_start_armor");
-       start_ammo_shells  = warmup_start_ammo_shells  = cvar("g_lms_start_ammo_shells");
-       start_ammo_nails   = warmup_start_ammo_nails   = cvar("g_lms_start_ammo_nails");
-       start_ammo_rockets = warmup_start_ammo_rockets = cvar("g_lms_start_ammo_rockets");
-       start_ammo_cells   = warmup_start_ammo_cells   = cvar("g_lms_start_ammo_cells");
-       start_ammo_plasma  = warmup_start_ammo_plasma  = cvar("g_lms_start_ammo_plasma");
-       start_ammo_fuel    = warmup_start_ammo_fuel    = cvar("g_lms_start_ammo_fuel");
+       start_health       = warmup_start_health       = cvar("g_ft_start_health");
+       start_armorvalue   = warmup_start_armorvalue   = cvar("g_ft_start_armor");
+       start_ammo_shells  = warmup_start_ammo_shells  = cvar("g_ft_start_ammo_shells");
+       start_ammo_nails   = warmup_start_ammo_nails   = cvar("g_ft_start_ammo_nails");
+       start_ammo_rockets = warmup_start_ammo_rockets = cvar("g_ft_start_ammo_rockets");
+       start_ammo_cells   = warmup_start_ammo_cells   = cvar("g_ft_start_ammo_cells");
+       start_ammo_plasma  = warmup_start_ammo_plasma  = cvar("g_ft_start_ammo_plasma");
+       start_ammo_fuel    = warmup_start_ammo_fuel    = cvar("g_ft_start_ammo_fuel");
 }
 
 MUTATOR_HOOKFUNCTION(ft, HavocBot_ChooseRole)