From 8642f4d6b281c4eee75b242a8ea94eb59cfd5ffc Mon Sep 17 00:00:00 2001 From: terencehill Date: Thu, 8 Jun 2017 16:46:43 +0200 Subject: [PATCH] Fix linking to certain teleports and jumppads sometimes not working (e.g. beyond a certain distance from final rage teleporter) --- qcsrc/server/bot/default/navigation.qc | 39 ++++++++++++++++++++------ qcsrc/server/bot/default/navigation.qh | 2 +- qcsrc/server/bot/default/waypoints.qc | 10 +++---- 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/qcsrc/server/bot/default/navigation.qc b/qcsrc/server/bot/default/navigation.qc index c12175c59..7bed55737 100644 --- a/qcsrc/server/bot/default/navigation.qc +++ b/qcsrc/server/bot/default/navigation.qc @@ -496,11 +496,12 @@ void navigation_poproute(entity this) this.goalstack31 = NULL; } -float navigation_waypoint_will_link(vector v, vector org, entity ent, float walkfromwp, float bestdist) +// walking to wp (walkfromwp == false) v2 and v2_height will be used as +// waypoint destination coordinates instead of v (only useful for box waypoints) +// for normal waypoints v2 == v and v2_height == 0 +float navigation_waypoint_will_link(vector v, vector org, entity ent, vector v2, float v2_height, float walkfromwp, float bestdist) { - float dist; - dist = vlen(v - org); - if (bestdist > dist) + if (vdist(v - org, <, bestdist)) { traceline(v, org, true, ent); if (trace_fraction == 1) @@ -512,7 +513,7 @@ float navigation_waypoint_will_link(vector v, vector org, entity ent, float walk } else { - if (tracewalk(ent, org, PL_MIN_CONST, PL_MAX_CONST, v, 0, bot_navigation_movemode)) + if (tracewalk(ent, org, PL_MIN_CONST, PL_MAX_CONST, v2, v2_height, bot_navigation_movemode)) return true; } } @@ -552,17 +553,27 @@ entity navigation_findnearestwaypoint_withdist_except(entity ent, float walkfrom if(walkfromwp && (it.wpflags & WAYPOINTFLAG_NORELINK)) continue; + vector v2; + float v2_height; if(it.wpisbox) { - vector wm1 = it.absmin; - vector wm2 = it.absmax; + vector wm1 = it.origin + it.mins; + vector wm2 = it.origin + it.maxs; v.x = bound(wm1_x, org.x, wm2_x); v.y = bound(wm1_y, org.y, wm2_y); v.z = bound(wm1_z, org.z, wm2_z); + v2.x = v.x; + v2.y = v.y; + v2.z = wm1.z; + v2_height = wm2.z - wm1.z; } else + { v = it.origin; - if(navigation_waypoint_will_link(v, org, ent, walkfromwp, 1050)) + v2 = v; + v2_height = 0; + } + if(navigation_waypoint_will_link(v, org, ent, v2, v2_height, walkfromwp, 1050)) navigation_item_addlink(it, ent); }); } @@ -573,6 +584,8 @@ entity navigation_findnearestwaypoint_withdist_except(entity ent, float walkfrom if(walkfromwp && (it.wpflags & WAYPOINTFLAG_NORELINK)) continue; + vector v2; + float v2_height; if(it.wpisbox) { vector wm1 = it.origin + it.mins; @@ -580,10 +593,18 @@ entity navigation_findnearestwaypoint_withdist_except(entity ent, float walkfrom v.x = bound(wm1_x, org.x, wm2_x); v.y = bound(wm1_y, org.y, wm2_y); v.z = bound(wm1_z, org.z, wm2_z); + v2.x = v.x; + v2.y = v.y; + v2.z = wm1.z; + v2_height = wm2.z - wm1.z; } else + { v = it.origin; - if(navigation_waypoint_will_link(v, org, ent, walkfromwp, bestdist)) + v2 = v; + v2_height = 0; + } + if(navigation_waypoint_will_link(v, org, ent, v2, v2_height, walkfromwp, bestdist)) { bestdist = vlen(v - org); best = it; diff --git a/qcsrc/server/bot/default/navigation.qh b/qcsrc/server/bot/default/navigation.qh index e94c32a82..91f043f7a 100644 --- a/qcsrc/server/bot/default/navigation.qh +++ b/qcsrc/server/bot/default/navigation.qh @@ -107,4 +107,4 @@ void navigation_unstuck(entity this); void botframe_updatedangerousobjects(float maxupdate); entity navigation_findnearestwaypoint(entity ent, float walkfromwp); -float navigation_waypoint_will_link(vector v, vector org, entity ent, float walkfromwp, float bestdist); +float navigation_waypoint_will_link(vector v, vector org, entity ent, vector v2, float v2_height, float walkfromwp, float bestdist); diff --git a/qcsrc/server/bot/default/waypoints.qc b/qcsrc/server/bot/default/waypoints.qc index 1127a9d61..11d4c75de 100644 --- a/qcsrc/server/bot/default/waypoints.qc +++ b/qcsrc/server/bot/default/waypoints.qc @@ -1248,7 +1248,7 @@ float botframe_autowaypoints_fix_from(entity p, float walkfromwp, entity wp, .en // if wp -> porg, then OK float maxdist; - if(navigation_waypoint_will_link(wp.origin, porg, p, walkfromwp, 1050)) + if(navigation_waypoint_will_link(wp.origin, porg, p, wp.origin, 0, walkfromwp, 1050)) { // we may find a better one maxdist = vlen(wp.origin - porg); @@ -1264,8 +1264,8 @@ float botframe_autowaypoints_fix_from(entity p, float walkfromwp, entity wp, .en { float d = vlen(wp.origin - it.origin) + vlen(it.origin - porg); if(d < bestdist) - if(navigation_waypoint_will_link(wp.origin, it.origin, p, walkfromwp, 1050)) - if(navigation_waypoint_will_link(it.origin, porg, p, walkfromwp, 1050)) + if(navigation_waypoint_will_link(wp.origin, it.origin, p, wp.origin, 0, walkfromwp, 1050)) + if(navigation_waypoint_will_link(it.origin, porg, p, it.origin, 0, walkfromwp, 1050)) { bestdist = d; p.(fld) = it; @@ -1319,7 +1319,7 @@ float botframe_autowaypoints_fix_from(entity p, float walkfromwp, entity wp, .en if(wp) { - if(!navigation_waypoint_will_link(wp.origin, o, p, walkfromwp, 1050)) + if(!navigation_waypoint_will_link(wp.origin, o, p, wp.origin, 0, walkfromwp, 1050)) { // we cannot walk from wp.origin to o // get closer to tmax @@ -1345,7 +1345,7 @@ float botframe_autowaypoints_fix_from(entity p, float walkfromwp, entity wp, .en // if we get here, o is valid regarding waypoints // check if o is connected right to the player // we break if it succeeds, as that means o is a good waypoint location - if(navigation_waypoint_will_link(o, porg, p, walkfromwp, 1050)) + if(navigation_waypoint_will_link(o, porg, p, o, 0, walkfromwp, 1050)) break; // o is no good, we need to get closer to the player -- 2.39.2