]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/bot/default/havocbot/roles.qc
Merge branch 'master' into martin-t/damagetext
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / bot / default / havocbot / roles.qc
index 5c25806365f367d1b3337cbae77b1231018282aa..5ddb0f74b576ab0bcd8107dad86e1af96a5f6a27 100644 (file)
 .void(entity this) havocbot_previous_role;
 .void(entity this) havocbot_role;
 
+void havocbot_goalrating_waypoints(entity this, float ratingscale, vector org, float sradius)
+{
+       // rate waypoints only if there's no alternative goal
+       if(navigation_bestgoal)
+               return;
+
+       float f;
+       float range = 500;
+       sradius = max(range, (0.5 + random() * 0.5) * sradius);
+       while(sradius > 100)
+       {
+               IL_EACH(g_waypoints, vdist(it.origin - org, <, sradius)
+                       && vdist(it.origin - org, >, max(100, sradius - range))
+                       && !(it.wpflags & WAYPOINTFLAG_TELEPORT),
+               {
+                       if(vdist(it.origin - this.wp_goal_prev0.origin, <, range * 1.5))
+                               f = 0.1;
+                       else if(vdist(it.origin - this.wp_goal_prev1.origin, <, range * 1.5))
+                               f = 0.1;
+                       else
+                               f = 0.5 + random() * 0.5;
+                       navigation_routerating(this, it, ratingscale * f, 2000);
+               });
+               if(navigation_bestgoal)
+                       break;
+               sradius -= range;
+       }
+};
+
 void havocbot_goalrating_items(entity this, float ratingscale, vector org, float sradius)
 {
        float rating, d, discard, friend_distance, enemy_distance;
@@ -135,8 +164,7 @@ void havocbot_goalrating_enemyplayers(entity this, float ratingscale, vector org
 
        ratingscale = ratingscale * 0.00005; // enemies are rated around 20000 already
 
-       int t;
-
+       float t;
        FOREACH_CLIENT(IS_PLAYER(it) && bot_shouldattack(this, it), LAMBDA(
                // TODO: Merge this logic with the bot_shouldattack function
                if(vdist(it.origin - org, <, 100) || vdist(it.origin - org, >, sradius))
@@ -149,25 +177,6 @@ void havocbot_goalrating_enemyplayers(entity this, float ratingscale, vector org
                        continue;
                */
 
-               if((it.flags & FL_INWATER) || (it.flags & FL_PARTIALGROUND))
-                       continue;
-
-               // not falling
-               if(!IS_ONGROUND(it))
-               {
-                       traceline(it.origin, it.origin + '0 0 -1500', true, NULL);
-                       t = pointcontents(trace_endpos + '0 0 1');
-                       if(t != CONTENT_SOLID )
-                       if(t == CONTENT_WATER || t == CONTENT_SLIME || t == CONTENT_LAVA)
-                               continue;
-                       if(tracebox_hits_trigger_hurt(it.origin, it.mins, it.maxs, trace_endpos))
-                               continue;
-               }
-
-               // TODO: rate waypoints near the targeted player at that moment, instead of the player itself
-               //               adding a player as a goal seems to be quite dangerous, especially on space maps
-               //               remove hack in navigation_poptouchedgoals() after performing this change
-
                t = ((this.health + this.armorvalue) - (it.health + it.armorvalue)) / 150;
                t = bound(0, 1 + t, 3);
                if (skill > 3)
@@ -195,8 +204,11 @@ void havocbot_role_generic(entity this)
                navigation_goalrating_start(this);
                havocbot_goalrating_items(this, 10000, this.origin, 10000);
                havocbot_goalrating_enemyplayers(this, 20000, this.origin, 10000);
-               //havocbot_goalrating_waypoints(1, this.origin, 1000);
+               havocbot_goalrating_waypoints(this, 1, this.origin, 3000);
                navigation_goalrating_end(this);
+
+               if(IS_PLAYER(this.goalentity))
+                       this.bot_strategytime = time + min(2, autocvar_bot_ai_strategyinterval);
        }
 }