// 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 navigation_waypoint_will_link(vector v, vector org, entity ent, vector v2, float v2_height, vector o2, float o2_height, float walkfromwp, float bestdist)
{
if (vdist(v - org, <, bestdist))
{
{
if (walkfromwp)
{
- if (tracewalk(ent, v, PL_MIN_CONST, PL_MAX_CONST, org, 0, bot_navigation_movemode))
+ if (tracewalk(ent, v, PL_MIN_CONST, PL_MAX_CONST, v2, v2_height, bot_navigation_movemode))
return true;
}
else
{
- if (tracewalk(ent, org, PL_MIN_CONST, PL_MAX_CONST, v2, v2_height, bot_navigation_movemode))
+ if (tracewalk(ent, org, PL_MIN_CONST, PL_MAX_CONST, o2, o2_height, bot_navigation_movemode))
return true;
}
}
// find the spawnfunc_waypoint near a dynamic goal such as a dropped weapon
entity navigation_findnearestwaypoint_withdist_except(entity ent, float walkfromwp, float bestdist, entity except)
{
+ if(ent.tag_entity)
+ ent = ent.tag_entity;
+
vector pm1 = ent.origin + ent.mins;
vector pm2 = ent.origin + ent.maxs;
});
vector org = ent.origin;
- if(ent.size)
- {
- org += 0.5 * (ent.mins + ent.maxs);
- org.z = ent.origin.z + ent.mins.z - PL_MIN_CONST.z; // player height
- }
- // TODO possibly make other code have the same support for bboxes
- if(ent.tag_entity)
- org = org + ent.tag_entity.origin;
if (navigation_testtracewalk)
te_plasmaburn(org);
entity best = NULL;
- vector v, v2;
- float v2_height;
+ vector v = '0 0 0', v2 = '0 0 0';
+ float v2_height = 0;
- if(!autocvar_g_waypointeditor && !ent.navigation_dynamicgoal)
+ if(ent.size && !IS_PLAYER(ent))
+ {
+ org += 0.5 * (ent.mins + ent.maxs);
+ org.z = ent.origin.z + ent.mins.z - PL_MIN_CONST.z; // player height
+ }
+
+ if(!autocvar_g_waypointeditor && walkfromwp && !ent.navigation_dynamicgoal)
{
waypoint_clearlinks(ent); // initialize wpXXmincost fields
IL_EACH(g_waypoints, it != ent,
if(walkfromwp && (it.wpflags & WAYPOINTFLAG_NORELINK))
continue;
- SET_TRACEWALK_DESTCOORDS_2(it, org, v, v2, v2_height);
- if(navigation_waypoint_will_link(v, org, ent, v2, v2_height, walkfromwp, 1050))
+ SET_TRACEWALK_DESTCOORDS(it, org, v2, v2_height);
+ if(vdist(v2 - org, <, 1050))
+ if(tracewalk(ent, org, PL_MIN_CONST, PL_MAX_CONST, v2, v2_height, bot_navigation_movemode))
navigation_item_addlink(it, ent);
});
}
{
if(walkfromwp && (it.wpflags & WAYPOINTFLAG_NORELINK))
continue;
- SET_TRACEWALK_DESTCOORDS_2(it, org, v, v2, v2_height);
- if(navigation_waypoint_will_link(v, org, ent, v2, v2_height, walkfromwp, bestdist))
+ v = it.origin;
+ if(walkfromwp)
+ SET_TRACEWALK_DESTCOORDS(ent, v, v2, v2_height);
+ else
+ SET_TRACEWALK_DESTCOORDS(it, org, v2, v2_height);
+ if(navigation_waypoint_will_link(v, org, ent, v2, v2_height, v2, v2_height, walkfromwp, bestdist))
{
bestdist = vlen(v - org);
best = it;
// finds the waypoints near the bot initiating a navigation query
float navigation_markroutes_nearestwaypoints(entity this, float maxdist)
{
- vector v;
+ vector v = '0 0 0';
//navigation_testtracewalk = true;
int c = 0;
- float v_height;
+ float v_height = 0;
IL_EACH(g_waypoints, !it.wpconsidered,
{
SET_TRACEWALK_DESTCOORDS(it, this.origin, v, v_height);
return true;
// if it can reach the goal there is nothing more to do
- vector dest;
- float dest_height;
- SET_TRACEWALK_DESTCOORDS(e, e.origin, dest, dest_height);
+ vector dest = '0 0 0';
+ float dest_height = 0;
+ SET_TRACEWALK_DESTCOORDS(e, startposition, dest, dest_height);
if (tracewalk(this, startposition, STAT(PL_MIN, this), STAT(PL_MAX, this), dest, dest_height, bot_navigation_movemode))
return true;
e = nearest_wp.enemy;
else
{
- if (this.goalentity.navigation_dynamicgoal)
+ if (this.goalentity.navigation_dynamicgoal || autocvar_g_waypointeditor)
{
- SET_TRACEWALK_DESTCOORDS(e, e.origin, dest, dest_height);
+ SET_TRACEWALK_DESTCOORDS(this.goalentity, nearest_wp.enemy.origin, dest, dest_height);
+ if(vdist(dest - nearest_wp.enemy.origin, <, 1050))
if(tracewalk(this, nearest_wp.enemy.origin, STAT(PL_MIN, this), STAT(PL_MAX, this), dest, dest_height, bot_navigation_movemode))
e = nearest_wp.enemy;
}