From: Juhu <5894800-Juhu_@users.noreply.gitlab.com> Date: Sat, 10 Sep 2022 23:59:26 +0000 (+0200) Subject: apply bug fixes from strafehud to strafe efficiency code and weigh each tick dependin... X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=626c88936cd4e21d83b220f5b45bfd752b65e062;p=xonotic%2Fxonotic-data.pk3dir.git apply bug fixes from strafehud to strafe efficiency code and weigh each tick depending on frametime --- diff --git a/qcsrc/common/gamemodes/gamemode/cts/sv_cts.qc b/qcsrc/common/gamemodes/gamemode/cts/sv_cts.qc index 0f9014784..5508b7672 100644 --- a/qcsrc/common/gamemodes/gamemode/cts/sv_cts.qc +++ b/qcsrc/common/gamemodes/gamemode/cts/sv_cts.qc @@ -145,7 +145,7 @@ MUTATOR_HOOKFUNCTION(cts, PlayerPhysics) CS(player).movement_y = -M_SQRT1_2 * wishspeed; } } - player.strafe_efficiency_sum += calculate_strafe_efficiency(player, CS(player).movement); + player.strafe_efficiency_sum += calculate_strafe_efficiency(player, CS(player).movement, dt) * dt; if(!player.race_started) player.startspeed_recorded = false; if(player.race_started && !player.startspeed_recorded && player.race_checkpoint != 0 && player.race_oldcheckpoint == 0) { @@ -202,7 +202,7 @@ MUTATOR_HOOKFUNCTION(cts, ClientConnect) race_PreparePlayer(player); player.race_checkpoint = -1; - player.strafe_efficiency_sum = player.strafe_efficiency_tics = 0; + player.strafe_efficiency_sum = player.strafe_efficiency_time = 0; player.strafe_efficiency_best = -2; PlayerScore_Set(player, SP_CTS_STRAFE, -20000); player.startspeed_recorded = false; @@ -279,7 +279,7 @@ MUTATOR_HOOKFUNCTION(cts, PlayerDies) frag_target.respawn_flags |= RESPAWN_FORCE; race_AbandonRaceCheck(frag_target); - frag_target.strafe_efficiency_sum = frag_target.strafe_efficiency_tics = 0; + frag_target.strafe_efficiency_sum = frag_target.strafe_efficiency_time = 0; frag_target.startspeed_recorded = false; if(autocvar_g_cts_removeprojectiles) @@ -373,7 +373,7 @@ MUTATOR_HOOKFUNCTION(cts, ClientKill) MUTATOR_HOOKFUNCTION(cts, Race_FinalCheckpoint) { entity player = M_ARGV(0, entity); - float strafe_efficiency_average = player.strafe_efficiency_sum / player.strafe_efficiency_tics; + float strafe_efficiency_average = player.strafe_efficiency_sum / player.strafe_efficiency_time; if(player.strafe_efficiency_best < strafe_efficiency_average) { diff --git a/qcsrc/server/strafe.qc b/qcsrc/server/strafe.qc index a7d10a948..86e017eed 100644 --- a/qcsrc/server/strafe.qc +++ b/qcsrc/server/strafe.qc @@ -6,7 +6,7 @@ .float race_started; -float calculate_strafe_efficiency(entity strafeplayer, vector movement) +float calculate_strafe_efficiency(entity strafeplayer, vector movement, float dt) { if(strafeplayer) { @@ -15,15 +15,16 @@ float calculate_strafe_efficiency(entity strafeplayer, vector movement) bool strafekeys; bool swimming = strafeplayer.waterlevel >= WATERLEVEL_SWIMMING; float speed = vlen(vec2(strafeplayer.velocity)); - float crouch_mod = IS_DUCKED(strafeplayer) ? .5 : 1; + float maxspeed_mod = IS_DUCKED(strafeplayer) ? .5 : 1; float maxspeed_phys = onground ? PHYS_MAXSPEED(strafeplayer) : PHYS_MAXAIRSPEED(strafeplayer); - float maxspeed = maxspeed_phys * crouch_mod; + float maxspeed = maxspeed_phys * maxspeed_mod; + float movespeed; + float bestspeed; float maxaccel_phys = onground ? PHYS_ACCELERATE(strafeplayer) : PHYS_AIRACCELERATE(strafeplayer); - float maxaccel = maxaccel_phys * crouch_mod; + float maxaccel = maxaccel_phys; float vel_angle = vectoangles(strafeplayer.velocity).y - (vectoangles(strafeplayer.velocity).y > 180 ? 360 : 0); // change the range from 0° - 360° to -180° - 180° to match how view_angle represents angles float view_angle = PHYS_INPUT_ANGLES(strafeplayer).y; float angle; - int direction; int keys_fwd; float wishangle = 0; bool fwd = true; @@ -81,7 +82,27 @@ float calculate_strafe_efficiency(entity strafeplayer, vector movement) if(strafekeys && !onground && !swimming) { - maxspeed = PHYS_MAXAIRSTRAFESPEED(strafeplayer); // no modifiers here because they don't affect air strafing + if(PHYS_MAXAIRSTRAFESPEED(strafeplayer) != 0) + maxspeed = min(PHYS_MAXAIRSTRAFESPEED(strafeplayer), PHYS_MAXAIRSPEED(strafeplayer) * maxspeed_mod); + if(PHYS_AIRSTRAFEACCELERATE(strafeplayer) != 0) + maxaccel = PHYS_AIRSTRAFEACCELERATE(strafeplayer); + } + + movespeed = min(vlen(vec2(movement)), maxspeed); + + maxaccel *= dt * movespeed; + bestspeed = max(movespeed - maxaccel, 0); + + float strafespeed = speed; // speed minus friction + + if((strafespeed > 0) && onground){ + float strafefriction = IS_ONSLICK(strafeplayer) ? PHYS_FRICTION_SLICK(strafeplayer) : PHYS_FRICTION(strafeplayer); + float f = 1 - dt * strafefriction * max(PHYS_STOPSPEED(strafeplayer) / strafespeed, 1); + + if(f <= 0) + strafespeed = 0; + else + strafespeed *= f; } // get current strafing angle ranging from -180° to +180° @@ -147,10 +168,10 @@ float calculate_strafe_efficiency(entity strafeplayer, vector movement) { float efficiency = 0; float moveangle = angle + wishangle; - float bestangle = (speed > (maxspeed - maxaccel) ? acos((maxspeed - maxaccel) / speed) : 0) * RAD2DEG; // best angle to strafe at - float prebestangle = (speed > maxspeed ? acos(maxspeed / speed) : 0) * RAD2DEG; + float bestangle = (strafespeed > bestspeed ? acos(bestspeed / strafespeed) : 0) * RAD2DEG; // best angle to strafe at + float prebestangle = (strafespeed > movespeed ? acos(movespeed / strafespeed) : 0) * RAD2DEG; - ++strafeplayer.strafe_efficiency_tics; + strafeplayer.strafe_efficiency_time += dt; if(fabs(vlen(vec2(movement))) > 0) { if(fabs(moveangle) > 90) diff --git a/qcsrc/server/strafe.qh b/qcsrc/server/strafe.qh index fd309d5e2..ceecbb51b 100644 --- a/qcsrc/server/strafe.qh +++ b/qcsrc/server/strafe.qh @@ -1,7 +1,7 @@ #pragma once .float strafe_efficiency_sum; -.float strafe_efficiency_tics; +.float strafe_efficiency_time; .float strafe_efficiency_best; -float calculate_strafe_efficiency(entity, vector); +float calculate_strafe_efficiency(entity, vector, float);