From a8bbb659f695dd7e27f7d50b7f7b999bcd8b8b02 Mon Sep 17 00:00:00 2001 From: terencehill Date: Thu, 4 Feb 2021 12:44:12 +0100 Subject: [PATCH] Freezetag: limit hit force considered at once to reduce autorevive time, e.g. when you have the Strength powerup but also with weapons that fire multiple projectiles at once (crylink) --- gamemodes-server.cfg | 1 + .../gamemode/freezetag/sv_freezetag.qc | 17 ++++++++++++++++- .../gamemode/freezetag/sv_freezetag.qh | 2 ++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/gamemodes-server.cfg b/gamemodes-server.cfg index c0889f3ae..8e0978181 100644 --- a/gamemodes-server.cfg +++ b/gamemodes-server.cfg @@ -377,6 +377,7 @@ set g_freezetag_revive_auto 1 "automatically revive frozen players after some ti set g_freezetag_revive_auto_progress 1 "start the automatic reviving progress as soon as the player gets frozen" set g_freezetag_revive_auto_reducible 1 "reduce auto-revival time when frozen players are hit by enemies; set to -1 to reduce it even when they are hit by teammates" set g_freezetag_revive_auto_reducible_forcefactor 0.025 "hit force to time reduction conversion factor" +set g_freezetag_revive_auto_reducible_maxforce 400 "max force considered at once" set g_freezetag_revive_spawnshield 1 "apply spawnshield for this time in seconds after the player has been revived" set g_freezetag_frozen_maxtime 60 "frozen players will be automatically unfrozen after this time in seconds" set g_freezetag_teams_override 0 diff --git a/qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qc b/qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qc index a8f37678a..9bba0b3e5 100644 --- a/qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qc +++ b/qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qc @@ -493,7 +493,20 @@ MUTATOR_HOOKFUNCTION(ft, Damage_Calculate) && 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; @@ -524,6 +537,8 @@ MUTATOR_HOOKFUNCTION(ft, PlayerPreThink, CBC_ORDER_FIRST) //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; diff --git a/qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qh b/qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qh index 067d2d640..9296767cd 100644 --- a/qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qh +++ b/qcsrc/common/gamemodes/gamemode/freezetag/sv_freezetag.qh @@ -30,6 +30,7 @@ REGISTER_MUTATOR(ft, false) .float freezetag_revive_time; .float freezetag_frozen_time; .float freezetag_frozen_timeout; +.float freezetag_frozen_force; const float ICE_MAX_ALPHA = 1; const float ICE_MIN_ALPHA = 0.1; float freezetag_teams; @@ -38,6 +39,7 @@ bool autocvar_g_freezetag_revive_auto = 1; int autocvar_g_freezetag_revive_auto_progress = 1; int autocvar_g_freezetag_revive_auto_reducible; float autocvar_g_freezetag_revive_auto_reducible_forcefactor; +float autocvar_g_freezetag_revive_auto_reducible_maxforce; float autocvar_g_freezetag_revive_extra_size; float autocvar_g_freezetag_revive_speed; float autocvar_g_freezetag_revive_time_to_score = 1.5; -- 2.39.2