]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'terencehill/freezetag_updates' into 'master'
authorterencehill <piuntn@gmail.com>
Mon, 24 May 2021 10:58:22 +0000 (10:58 +0000)
committerterencehill <piuntn@gmail.com>
Mon, 24 May 2021 10:58:22 +0000 (10:58 +0000)
Freezetag updates

See merge request xonotic/xonotic-data.pk3dir!896

1  2 
qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qc
qcsrc/server/world.qc

index d0d61cb2bd4337596ce944aa6f1022392c6c6f20,2b87c34533c320ac26e984a54007fbb62d84c630..11ddede9bae54f00de654056800560297f784b34
@@@ -384,10 -384,18 +384,18 @@@ MUTATOR_HOOKFUNCTION(ft, PlayerDies
                        freezetag_Add_Score(frag_target, frag_attacker);
                        freezetag_count_alive_players();
                        freezetag_LastPlayerForTeam_Notify(frag_target);
+                       frag_target.freezetag_frozen_timeout = -2; // freeze on respawn
                }
                else
+               {
+                       float t = frag_target.freezetag_frozen_timeout;
+                       float t2 = frag_target.freezetag_frozen_time;
                        Unfreeze(frag_target, false); // remove ice
-               frag_target.freezetag_frozen_timeout = -2; // freeze on respawn
+                       // keep timeout value so it can be restored when player will be refrozen on respawn
+                       // NOTE this can't be exactly -2 since game starts from time 2
+                       frag_target.freezetag_frozen_timeout = -t;
+                       frag_target.freezetag_frozen_time = t2;
+               }
                return true;
        }
  
@@@ -418,9 -426,16 +426,16 @@@ MUTATOR_HOOKFUNCTION(ft, PlayerSpawn
        if(player.freezetag_frozen_timeout == -1) // if PlayerSpawn is called by reset_map_players
                return true; // do nothing, round is starting right now
  
-       if(player.freezetag_frozen_timeout == -2) // player was dead
+       if(player.freezetag_frozen_timeout <= -2) // player was dead
        {
+               float t = player.freezetag_frozen_timeout;
+               float t2 = player.freezetag_frozen_time;
                freezetag_Freeze(player, NULL);
+               if (t < -2)
+               {
+                       player.freezetag_frozen_timeout = -t;
+                       player.freezetag_frozen_time = t2;
+               }
                return true;
        }
  
@@@ -478,7 -493,20 +493,20 @@@ MUTATOR_HOOKFUNCTION(ft, Damage_Calcula
                        && frag_target.freezetag_frozen_timeout > time)
                {
                        if (fabs(autocvar_g_freezetag_revive_auto_reducible) == 1)
-                               t = vlen(frag_force) * autocvar_g_freezetag_revive_auto_reducible_forcefactor;
+                       {
+                               float maxforce = autocvar_g_freezetag_revive_auto_reducible_maxforce;
+                               t = vlen(frag_force);
+                               // limit hit force considered at once, e.g when you have the Strength
+                               // powerup but also with weapons that fire multiple projectiles at once (crylink)
+                               if (frag_target.freezetag_frozen_force + t > maxforce)
+                               {
+                                       t = max(0, maxforce - frag_target.freezetag_frozen_force);
+                                       frag_target.freezetag_frozen_force = maxforce;
+                               }
+                               else
+                                       frag_target.freezetag_frozen_force += t;
+                               t *= autocvar_g_freezetag_revive_auto_reducible_forcefactor;
+                       }
                        frag_target.freezetag_frozen_timeout -= t;
                        if (frag_target.freezetag_frozen_timeout < time)
                                frag_target.freezetag_frozen_timeout = time;
@@@ -508,6 -536,8 +536,8 @@@ MUTATOR_HOOKFUNCTION(ft, PlayerPreThink
        //if(player.freezetag_frozen_timeout > 0 && time < player.freezetag_frozen_timeout)
                //player.iceblock.alpha = ICE_MIN_ALPHA + (ICE_MAX_ALPHA - ICE_MIN_ALPHA) * (player.freezetag_frozen_timeout - time) / (player.freezetag_frozen_timeout - player.freezetag_frozen_time);
  
+       player.freezetag_frozen_force = 0;
        if (!(frametime && IS_PLAYER(player)))
                return true;
  
        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 * clearspeed * (1 - base_progress), 1);
+               {
+                       if (autocvar_g_freezetag_revive_time_to_score > 0)
+                       {
+                               if (STAT(REVIVE_PROGRESS, player) > base_progress)
+                               {
+                                       // reduce auto-revival time based on manual revival progress
+                                       base_progress = STAT(REVIVE_PROGRESS, player);
+                                       player.freezetag_frozen_timeout = time + autocvar_g_freezetag_frozen_maxtime * (1 - STAT(REVIVE_PROGRESS, player));
+                               }
+                               // don't clear revive progress, it would allow stacking points
+                               // by entering and exiting the revival zone many times
+                               STAT(REVIVE_PROGRESS, player) = base_progress;
+                       }
+                       else
+                               STAT(REVIVE_PROGRESS, player) = bound(base_progress, STAT(REVIVE_PROGRESS, player) - frametime * clearspeed * (1 - base_progress), 1);
+               }
                else if (!STAT(FROZEN, player) && !player_is_reviving)
                        STAT(REVIVE_PROGRESS, player) = base_progress; // thawing nobody
        }
        else if (STAT(FROZEN, player) == FROZEN_NORMAL) // OK, there is at least one teammate reviving us
        {
-               STAT(REVIVE_PROGRESS, player) = bound(base_progress, STAT(REVIVE_PROGRESS, player) + frametime * max(1/60, autocvar_g_freezetag_revive_speed * (1 - base_progress)), 1);
+               float spd = autocvar_g_freezetag_revive_speed_t2s;
+               if (autocvar_g_freezetag_revive_time_to_score <= 0)
+                       spd = autocvar_g_freezetag_revive_speed * (1 - base_progress);
+               STAT(REVIVE_PROGRESS, player) = bound(base_progress, STAT(REVIVE_PROGRESS, player) + frametime * max(1/60, spd), 1);
  
                if(STAT(REVIVE_PROGRESS, player) >= 1)
                {
                        float frozen_time = time - player.freezetag_frozen_time;
                        Unfreeze(player, false);
                        SetResourceExplicit(player, RES_HEALTH, ((warmup_stage) ? warmup_start_health : start_health));
+                       player.spawnshieldtime = time + autocvar_g_freezetag_revive_spawnshield;
                        freezetag_count_alive_players();
  
                        if(n == -1)
                        for(entity it = revivers_first; it; it = it.chain)
                        {
                                GameRules_scoring_add(it, FREEZETAG_REVIVALS, +1);
-                               GameRules_scoring_add(it, SCORE, +1);
+                               if (autocvar_g_freezetag_revive_time_to_score <= 0)
+                                       GameRules_scoring_add(it, SCORE, +1);
                                nades_GiveBonus(it, autocvar_g_nades_bonus_score_low);
                        }
  
  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)
diff --combined qcsrc/server/world.qc
index dd8e86b78ddc62fd49e90d8f2c71807403044f14,083d8e39aaef2b137f716f6c503eb11cd1ec2f11..1165bd303f0e6fef0f903d4ca3ebb0c7188dea99
@@@ -408,7 -408,7 +408,7 @@@ void cvar_changes_init(
                BADPREFIX("skill_");
                BADPREFIX("sv_allow_");
                BADPREFIX("sv_cullentities_");
 -              BADPREFIX("sv_maxidle_");
 +              BADPREFIX("sv_maxidle");
                BADPREFIX("sv_minigames_");
                BADPREFIX("sv_radio_");
                BADPREFIX("sv_timeout_");
                BADCVAR("g_ctf_leaderboard");
                BADCVAR("g_domination_point_limit");
                BADCVAR("g_domination_teams_override");
+               BADCVAR("g_freezetag_revive_spawnshield");
                BADCVAR("g_freezetag_teams_override");
                BADCVAR("g_friendlyfire");
                BADCVAR("g_fullbrightitems");
                BADCVAR("sv_defaultplayercolors");
                BADCVAR("sv_defaultplayermodel");
                BADCVAR("sv_defaultplayerskin");
 -              BADCVAR("sv_maxidle");
                BADCVAR("sv_maxrate");
                BADCVAR("sv_motd");
                BADCVAR("sv_public");
@@@ -838,8 -840,7 +839,8 @@@ spawnfunc(worldspawn
        // character set: ASCII 33-126 without the following characters: : ; ' " \ $
        if(autocvar_sv_eventlog)
        {
 -              string s = sprintf("%s.%s.%06d", itos(autocvar_sv_eventlog_files_counter), strftime(false, "%s"), floor(random() * 1000000));
 +              string num = strftime_s(); // strftime(false, "%s") isn't reliable, see strftime_s description
 +              string s = sprintf("%s.%s.%06d", itos(autocvar_sv_eventlog_files_counter), num, floor(random() * 1000000));
                matchid = strzone(s);
  
                GameLogEcho(strcat(":gamestart:", GetGametype(), "_", GetMapname(), ":", s));