]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Fix linking to certain teleports and jumppads sometimes not working (e.g. beyond...
authorterencehill <piuntn@gmail.com>
Thu, 8 Jun 2017 14:46:43 +0000 (16:46 +0200)
committerterencehill <piuntn@gmail.com>
Thu, 8 Jun 2017 14:46:43 +0000 (16:46 +0200)
qcsrc/server/bot/default/navigation.qc
qcsrc/server/bot/default/navigation.qh
qcsrc/server/bot/default/waypoints.qc

index c12175c5901885df45acb9310e05c4cd602d3027..7bed55737dc8922eea58c2f07b907fdabe2a90a3 100644 (file)
@@ -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;
index e94c32a82fac9232b0def98574b6ecbc2e6fd3fd..91f043f7a2deed935f78c9d4743bf0b2541f1bca 100644 (file)
@@ -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);
index 1127a9d61873060c82fff14a983449d344ffc8b9..11d4c75deb61d22a9b1b8ddf4a3a58ad1e38d97f 100644 (file)
@@ -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