From d140b8ba15a77f8e605ba8d188791273fc375bd1 Mon Sep 17 00:00:00 2001 From: terencehill Date: Sat, 10 Jun 2017 20:40:09 +0200 Subject: [PATCH] Partially fix navigation underwater by avoiding precision errors in the movement direction as now tracewalk requires to reach precisely the destination point. More fixing is still needed --- qcsrc/server/bot/default/navigation.qc | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/qcsrc/server/bot/default/navigation.qc b/qcsrc/server/bot/default/navigation.qc index 109da6770..48c36a035 100644 --- a/qcsrc/server/bot/default/navigation.qc +++ b/qcsrc/server/bot/default/navigation.qc @@ -148,24 +148,26 @@ bool tracewalk(entity e, vector start, vector m1, vector m2, vector end, float e { vector water_end = end; water_end.z = bound(end.z, org.z, end2.z); - vector water_dir; + vector move; if(swimming_outwater) { - water_dir = dir; if (stepdist > dist) stepdist = dist; dist -= stepdist; + move = org + dir * stepdist; } else { - water_dir = normalize(water_end - org); - vector ang = vectoangles(water_dir); - float c = cos(ang.x * DEG2RAD); - if (stepdist * c > dist) - stepdist = dist / c; - dist -= stepdist * c; + // can't use movement direction here to calculate move because of precision errors + // especially when direction has a high enough z value + //water_dir = normalize(water_end - org); + //move = org + water_dir * stepdist; + + if (stepdist > dist) + stepdist = dist; + move = org + (water_end - org) * (stepdist / dist); + dist = vlen(vec2(water_end - move)); } - vector move = org + water_dir * stepdist; tracebox(org, m1, m2, move, movemode, e); if (trace_fraction < 1) // cant swim in the current direction @@ -194,7 +196,6 @@ bool tracewalk(entity e, vector start, vector m1, vector m2, vector end, float e if(autocvar_bot_debug_tracewalk) debugnode(e, org); - //water_dir = dir; move = org + dir * stepdist; tracebox(org + stepheightvec, m1, m2, move + stepheightvec, movemode, e); -- 2.39.2