From 0ff87300bd6f53fec5de8906e1b74088b43d290d Mon Sep 17 00:00:00 2001 From: Juhu <5894800-Juhu_@users.noreply.gitlab.com> Date: Mon, 22 Mar 2021 13:22:52 +0100 Subject: [PATCH] strafehud: don't put the slick detector into "always on" state when friction is zero, instead treat every brush as slick even if the surfaceflag is not set --- qcsrc/client/hud/panel/strafehud.qc | 51 +++++++++++++---------------- 1 file changed, 22 insertions(+), 29 deletions(-) diff --git a/qcsrc/client/hud/panel/strafehud.qc b/qcsrc/client/hud/panel/strafehud.qc index 6b5386d70..ab5f75830 100644 --- a/qcsrc/client/hud/panel/strafehud.qc +++ b/qcsrc/client/hud/panel/strafehud.qc @@ -596,43 +596,36 @@ void HUD_StrafeHUD() slickdetector_height = panel_size.y * bound(0, autocvar_hud_panel_strafehud_slickdetector_height, 0.5); if(autocvar_hud_panel_strafehud_slickdetector_range > 0 && autocvar_hud_panel_strafehud_slickdetector_alpha > 0 && slickdetector_height > 0 && panel_size.x > 0) // dunno if slick detection works in spectate { + float slicksteps = 90 / pow(2, bound(0, autocvar_hud_panel_strafehud_slickdetector_granularity, 4)); bool slickdetected = false; - if(PHYS_FRICTION(strafeplayer) != 0) - { - float slicksteps = 90 / pow(2, bound(0, autocvar_hud_panel_strafehud_slickdetector_granularity, 4)); - if(islocal) slickdetected = IS_ONSLICK(strafeplayer); // don't need to traceline if already touching slick + if(islocal) slickdetected = IS_ONSLICK(strafeplayer); // don't need to traceline if already touching slick - // traceline into every direction - trace_dphitq3surfaceflags = 0; - for(float i = 0; i < 360 && !slickdetected; i += slicksteps) + // traceline into every direction + trace_dphitq3surfaceflags = 0; + for(float i = 0; i < 360 && !slickdetected; i += slicksteps) + { + vector slickoffset; + float slickrotate; + slickoffset.z = -cos(i * DEG2RAD) * autocvar_hud_panel_strafehud_slickdetector_range; + slickrotate = sin(i * DEG2RAD) * autocvar_hud_panel_strafehud_slickdetector_range; + if(i != 0 && i != 180) { - vector slickoffset; - float slickrotate; - slickoffset.z = -cos(i * DEG2RAD) * autocvar_hud_panel_strafehud_slickdetector_range; - slickrotate = sin(i * DEG2RAD) * autocvar_hud_panel_strafehud_slickdetector_range; - if(i != 0 && i != 180) - { - for(float j = 0; j < 180 && !slickdetected; j += slicksteps) - { - slickoffset.x = sin(j * DEG2RAD) * slickrotate; - slickoffset.y = cos(j * DEG2RAD) * slickrotate; - - traceline(strafeplayer.origin, strafeplayer.origin + slickoffset, MOVE_WORLDONLY, NULL); - if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SLICK) slickdetected = true; - } - } - else + for(float j = 0; j < 180 && !slickdetected; j += slicksteps) { - slickoffset.x = slickoffset.y = 0; + slickoffset.x = sin(j * DEG2RAD) * slickrotate; + slickoffset.y = cos(j * DEG2RAD) * slickrotate; + traceline(strafeplayer.origin, strafeplayer.origin + slickoffset, MOVE_WORLDONLY, NULL); - if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SLICK) slickdetected = true; + if((PHYS_FRICTION(strafeplayer) == 0 && trace_fraction < 1) || trace_dphitq3surfaceflags & Q3SURFACEFLAG_SLICK) slickdetected = true; } } - } - else - { - slickdetected = true; + else + { + slickoffset.x = slickoffset.y = 0; + traceline(strafeplayer.origin, strafeplayer.origin + slickoffset, MOVE_WORLDONLY, NULL); + if((PHYS_FRICTION(strafeplayer) == 0 && trace_fraction < 1) || trace_dphitq3surfaceflags & Q3SURFACEFLAG_SLICK) slickdetected = true; + } } // if a traceline hit a slick surface -- 2.39.2