]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/bot/default/navigation.qc
Merge branch 'master' into marin-t/fix
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / bot / default / navigation.qc
index 6c5e2769b4c6e3d070e91b64258e1373adf2fe55..d63e158781ea6e2c6bdf83214484a5fc32aa3609 100644 (file)
@@ -742,6 +742,7 @@ bool tracewalk(entity e, vector start, vector m1, vector m2, vector end, float e
 // completely empty the goal stack, used when deciding where to go
 void navigation_clearroute(entity this)
 {
+       this.lastteleporttime = 0;
        this.goalcurrent_prev = this.goalcurrent;
        this.goalcurrent_distance_2d = FLOAT_MAX;
        this.goalcurrent_distance_z = FLOAT_MAX;
@@ -1331,10 +1332,10 @@ void navigation_routerating(entity this, entity e, float f, float rangebias)
                        t += xydistance / autocvar_g_jetpack_maxspeed_side;
                        fuel = t * autocvar_g_jetpack_fuel * 0.8;
 
-                       LOG_DEBUG("jetpack ai: required fuel ", ftos(fuel), ", have ", ftos(GetResourceAmount(this, RESOURCE_FUEL)));
+                       LOG_DEBUG("jetpack ai: required fuel ", ftos(fuel), ", have ", ftos(GetResource(this, RES_FUEL)));
 
                        // enough fuel ?
-                       if(GetResourceAmount(this, RESOURCE_FUEL) > fuel || (this.items & IT_UNLIMITED_WEAPON_AMMO))
+                       if(GetResource(this, RES_FUEL) > fuel || (this.items & IT_UNLIMITED_WEAPON_AMMO))
                        {
                                // Estimate cost
                                // (as onground costs calculation is mostly based on distances, here we do the same establishing some relationship
@@ -1611,11 +1612,12 @@ int navigation_poptouchedgoals(entity this)
                if (!this.goalcurrent.wpisbox // warpzone
                        && vlen2(this.origin - this.goalstack01.origin) < vlen2(this.origin - this.goalcurrent.origin))
                {
+                       // immediately remove origin and destination waypoints
                        navigation_poproute(this);
                        ++removed_goals;
                        navigation_poproute(this);
                        ++removed_goals;
-                       return removed_goals;
+                       this.lastteleporttime = 0;
                }
 
                // make sure jumppad is really hit, don't rely on distance based checks
@@ -1638,12 +1640,17 @@ int navigation_poptouchedgoals(entity this)
                                if (time - this.lastteleporttime < random() * max_delay)
                                        return removed_goals;
                        }
+                       else if (this.goalcurrent.wpisbox) // teleport
+                       {
+                               // immediately remove origin and destination waypoints
+                               navigation_poproute(this);
+                               ++removed_goals;
+                       }
                        navigation_poproute(this);
                        this.lastteleporttime = 0;
                        ++removed_goals;
                }
-               else
-                       return removed_goals;
+               return removed_goals;
        }
        else if (this.lastteleporttime > 0)
        {
@@ -1675,6 +1682,9 @@ int navigation_poptouchedgoals(entity this)
                        ++removed_goals;
                        return removed_goals;
                }
+               // reset of lastteleporttime can be overriden by a jumppad when it's set
+               // in more than one frame: make sure it's reset
+               this.lastteleporttime = 0;
        }
 
        // Loose goal touching check when running
@@ -1796,6 +1806,7 @@ void navigation_goalrating_start(entity this)
        navigation_clearroute(this);
        navigation_bestgoal = NULL;
        navigation_markroutes(this, wp);
+       this.goalstack31 = wp; // temporarly save the really close waypoint
 }
 
 // ends a goal selection session (updates goal stack to the best goal)
@@ -1804,8 +1815,14 @@ void navigation_goalrating_end(entity this)
        if(this.aistatus & AI_STATUS_STUCK)
                return;
 
+       entity wp = this.goalstack31; // save to wp as this.goalstack31 is set by navigation_routetogoal
+       this.goalstack31 = NULL;
+
        navigation_routetogoal(this, navigation_bestgoal, this.origin);
-       LOG_DEBUG("best goal ", this.goalcurrent.classname);
+       LOG_DEBUG("best goal ", navigation_bestgoal.classname);
+
+       if (wp && this.goalcurrent == wp)
+               navigation_poproute(this);
 
        // If the bot got stuck then try to reach the farthest waypoint
        if (!this.goalentity)
@@ -1886,7 +1903,7 @@ void navigation_unstuck(entity this)
        {
                // evaluate the next goal on the queue
                float d = vlen2(this.origin - bot_waypoint_queue_goal.origin);
-               LOG_DEBUG(this.netname, " evaluating ", bot_waypoint_queue_goal.classname, " with distance ", ftos(d));
+               LOG_DEBUG(this.netname, " evaluating ", bot_waypoint_queue_goal.classname, " with squared distance ", ftos(d));
                set_tracewalk_dest(bot_waypoint_queue_goal, this.origin, false);
                if (tracewalk(this, this.origin, STAT(PL_MIN, this), STAT(PL_MAX, this),
                        tracewalk_dest, tracewalk_dest_height, bot_navigation_movemode))