]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Improve detection of item's nearest waypoint by using item's height in the tracewalk...
authorterencehill <piuntn@gmail.com>
Mon, 21 Aug 2017 16:40:29 +0000 (18:40 +0200)
committerterencehill <piuntn@gmail.com>
Tue, 22 Aug 2017 10:17:06 +0000 (12:17 +0200)
qcsrc/server/bot/default/navigation.qc
qcsrc/server/bot/default/navigation.qh
qcsrc/server/bot/default/waypoints.qc

index b0a5ccbb9d3da0a835cfadcff5eaec6e9627d248..0777f2cb63a457675fdc92ce4471d9b76b212232 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,14 +759,6 @@ 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);
 
@@ -791,8 +786,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;
index a826715a86a9e46bc57b130a4a47c96960a72ffd..ea913456d33eac5db852b53c339a80d95b89350f 100644 (file)
@@ -161,4 +161,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, 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);
index d4ef6d14d0ca576376fc86a987677e3f86d4be5e..d56b0da44e58e914128f85a31971efaefc534fa6 100644 (file)
@@ -1278,7 +1278,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, wp.origin, 0, walkfromwp, 1050))
+               if(navigation_waypoint_will_link(wp.origin, porg, p, porg, 0, wp.origin, 0, walkfromwp, 1050))
                {
                        // we may find a better one
                        maxdist = vlen(wp.origin - porg);
@@ -1294,8 +1294,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, wp.origin, 0, walkfromwp, 1050))
-                       if(navigation_waypoint_will_link(it.origin, porg, p, it.origin, 0, walkfromwp, 1050))
+                       if(navigation_waypoint_will_link(wp.origin, it.origin, p, it.origin, 0, wp.origin, 0, walkfromwp, 1050))
+                       if(navigation_waypoint_will_link(it.origin, porg, p, porg, 0, it.origin, 0, walkfromwp, 1050))
                        {
                                bestdist = d;
                                p.(fld) = it;
@@ -1349,7 +1349,7 @@ float botframe_autowaypoints_fix_from(entity p, float walkfromwp, entity wp, .en
 
                if(wp)
                {
-                       if(!navigation_waypoint_will_link(wp.origin, o, p, wp.origin, 0, walkfromwp, 1050))
+                       if(!navigation_waypoint_will_link(wp.origin, o, p, o, 0, wp.origin, 0, walkfromwp, 1050))
                        {
                                // we cannot walk from wp.origin to o
                                // get closer to tmax
@@ -1375,7 +1375,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, o, 0, walkfromwp, 1050))
+               if(navigation_waypoint_will_link(o, porg, p, porg, 0, o, 0, walkfromwp, 1050))
                        break;
 
                // o is no good, we need to get closer to the player