]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/bot/default/navigation.qc
Merge branch 'master' into terencehill/bot_waypoints
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / bot / default / navigation.qc
index 8b865fcf33e7ef895ed28e160a1e88dd4402c510..86f2feebdf718b4c36e4fcb0d578ebb8279fe4f9 100644 (file)
@@ -720,7 +720,7 @@ void navigation_poproute(entity this)
 // 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))
        {
@@ -729,12 +729,12 @@ float navigation_waypoint_will_link(vector v, vector org, entity ent, vector v2,
                {
                        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;
                        }
                }
@@ -745,6 +745,9 @@ float navigation_waypoint_will_link(vector v, vector org, entity ent, vector v2,
 // 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;
 
@@ -756,20 +759,18 @@ entity navigation_findnearestwaypoint_withdist_except(entity ent, float walkfrom
        });
 
        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(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)
        {
@@ -791,8 +792,12 @@ entity navigation_findnearestwaypoint_withdist_except(entity ent, float walkfrom
        {
                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;
@@ -815,10 +820,10 @@ entity navigation_findnearestwaypoint(entity ent, float walkfromwp)
 // 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);
@@ -1271,8 +1276,8 @@ bool navigation_routetogoal(entity this, entity e, vector startposition)
                return true;
 
        // if it can reach the goal there is nothing more to do
-       vector dest;
-       float 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;
@@ -1301,7 +1306,7 @@ bool navigation_routetogoal(entity this, entity e, vector startposition)
                {
                        if (this.goalentity.navigation_dynamicgoal || autocvar_g_waypointeditor)
                        {
-                               SET_TRACEWALK_DESTCOORDS(e, nearest_wp.enemy.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;