+ org = trace_endpos;
+ continue;
+ }
+
+ if (org.z <= move.z) // going horiz.
+ {
+ tracebox(trace_endpos, m1, m2, move, movemode, e);
+ org = trace_endpos;
+ nav_action = NAV_WALK;
+ continue;
+ }
+ }
+
+ if (org.z <= move.z) // going horiz.
+ {
+ org = trace_endpos;
+ nav_action = NAV_SWIM_ONWATER;
+ }
+ else // going down
+ {
+ org = trace_endpos;
+ if (SUBMERGED(org))
+ nav_action = NAV_SWIM_UNDERWATER;
+ else
+ nav_action = NAV_SWIM_ONWATER;
+ }
+ }
+ else if(nav_action == NAV_SWIM_UNDERWATER)
+ {
+ if (move.z >= org.z) // swimming upwards or horiz.
+ {
+ tracebox(org, m1, m2, move, movemode, e); // swim
+
+ bool stepswum = false;
+
+ // hit something
+ if (trace_fraction < 1)
+ {
+ // stepswim
+ vector stepswim_move = move + stepheightvec;
+ if (flatdist > 0 && stepswim_move.z > end2.z + stepheightvec.z) // don't allow stepswim to go higher than destination
+ stepswim_move.z = end2.z;
+
+ tracebox(org + stepheightvec, m1, m2, stepswim_move, movemode, e);
+
+ // hit something
+ if (trace_startsolid)
+ {
+ if(autocvar_bot_debug_tracewalk)
+ debugnodestatus(org, DEBUG_NODE_FAIL);
+
+ //print("tracewalk: ", vtos(start), " hit something when trying to reach ", vtos(end), "\n");
+ return false;
+ }
+
+ if (trace_fraction < 1)
+ {
+ float org_z_prev = org.z;
+ RESURFACE_LIMITED(org, end2.z);
+ if(org.z == org_z_prev)
+ {
+ if(autocvar_bot_debug_tracewalk)
+ debugnodestatus(org, DEBUG_NODE_FAIL);
+
+ //print("tracewalk: ", vtos(start), " can't reach ", vtos(end), "\n");
+ return false;
+ }
+ if(SUBMERGED(org))
+ nav_action = NAV_SWIM_UNDERWATER;
+ else
+ nav_action = NAV_SWIM_ONWATER;
+
+ // we didn't advance horiz. in this step, flatdist decrease should be reverted
+ // but we can't do it properly right now... apply this workaround instead
+ if (flatdist <= 0)
+ flatdist = 1;
+
+ continue;
+ }
+
+ //succesful stepswim
+
+ if (flatdist <= 0)