]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
strafehud: don't put the slick detector into "always on" state when friction is zero...
authorJuhu <5894800-Juhu_@users.noreply.gitlab.com>
Mon, 22 Mar 2021 12:22:52 +0000 (13:22 +0100)
committerJuhu <5894800-Juhu_@users.noreply.gitlab.com>
Mon, 22 Mar 2021 12:25:25 +0000 (13:25 +0100)
qcsrc/client/hud/panel/strafehud.qc

index 6b5386d703d96c6b98f67abee655b788ca3a6263..ab5f75830a77a5410d56a101f10f5ce456eaf573 100644 (file)
@@ -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