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)
}
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;
}
}
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);
});
}
if(walkfromwp && (it.wpflags & WAYPOINTFLAG_NORELINK))
continue;
+ vector v2;
+ float v2_height;
if(it.wpisbox)
{
vector wm1 = it.origin + it.mins;
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;
// 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);
{
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;
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
// 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