]> git.xonotic.org Git - xonotic/darkplaces.git/commitdiff
NudgeOutOfSolid: fix "random" failures on slightly inclined planes
authorbones_was_here <bones_was_here@xonotic.au>
Sat, 15 Jul 2023 12:27:42 +0000 (22:27 +1000)
committerbones_was_here <bones_was_here@xonotic.au>
Sat, 15 Jul 2023 12:27:42 +0000 (22:27 +1000)
History:
This epsilon value was first added to the nudge distance in
31e7715cffcebfd400b8473f3b2d3dc80937fc5a
and was replaced with bbox expansion in
25c09ca585e81bf9eb236a339ae5dcd64f63b679

With the expansion approach we need to compare to separation to make
"good location" detection reliable, partly to avoid float precision
problems, partly to avoid compatibility problems with normal TraceBox.
For example: we drop an entity to floor successfully with TraceBox, but
then NudgeOutOfSolid decides it's in solid.

Also updated the startsolid conditions to suit the 2-pass approach.

Signed-off-by: bones_was_here <bones_was_here@xonotic.au>
phys.c

diff --git a/phys.c b/phys.c
index 1e602a1ffbe72013669221e7c31bea1629f77cb8..bf6c525dd63a7c543e9f47d12d883ed63805c295 100644 (file)
--- a/phys.c
+++ b/phys.c
@@ -55,7 +55,10 @@ int PHYS_NudgeOutOfSolid(prvm_prog_t *prog, prvm_edict_t *ent)
                        else
                                stucktrace = CL_TraceBox(stuckorigin, stuckmins, stuckmaxs, stuckorigin, pass ? MOVE_WORLDONLY : MOVE_NOMONSTERS, ent, SV_GenericHitSuperContentsMask(ent), 0, 0, collision_extendmovelength.value, pass ? false : true, false, NULL, false);
 
-                       if (!stucktrace.bmodelstartsolid || stucktrace.startdepth >= 0)
+                       // Separation compared here to ensure a good location will be recognised reliably.
+                       if (-stucktrace.startdepth <= separation
+                       || (!stucktrace.bmodelstartsolid && !stucktrace.worldstartsolid)
+                       || (pass && !stucktrace.worldstartsolid))
                        {
                                // found a good location, use it
                                VectorCopy(stuckorigin, PRVM_serveredictvector(ent, origin));