]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/bot/default/havocbot/roles.qc
Optimize a few checks
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / bot / default / havocbot / roles.qc
index 6b9537651eb0a7ae7b931b30a8120425cf7b9fd2..675dd036b7e7151dfdf100c98de66b8a242ea0f3 100644 (file)
@@ -25,7 +25,8 @@ void havocbot_goalrating_waypoints(entity this, float ratingscale, vector org, f
        while(sradius > 100)
        {
                IL_EACH(g_waypoints, vdist(it.origin - org, <, sradius)
-                       && vdist(it.origin - org, >, max(100, sradius - range)),
+                       && 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;
@@ -43,7 +44,7 @@ void havocbot_goalrating_waypoints(entity this, float ratingscale, vector org, f
 
 void havocbot_goalrating_items(entity this, float ratingscale, vector org, float sradius)
 {
-       float rating, d, discard, friend_distance, enemy_distance;
+       float rating, discard, friend_distance, enemy_distance;
        vector o;
        ratingscale = ratingscale * 0.0001; // items are rated around 10000 already
 
@@ -53,9 +54,13 @@ void havocbot_goalrating_items(entity this, float ratingscale, vector org, float
 
                if(!it.solid)
                {
+                       if(!autocvar_bot_ai_timeitems)
+                               continue;
                        if(!it.scheduledrespawntime)
                                continue;
-                       if(it.respawntime < 30 || (it.respawntimejitter && !it.itemdef.instanceOfPowerup))
+                       if(it.respawntime < max(11, autocvar_bot_ai_timeitems_minrespawndelay))
+                               continue;
+                       if(it.respawntimejitter && !it.itemdef.instanceOfPowerup)
                                continue;
 
                        float t = 0;
@@ -76,10 +81,11 @@ void havocbot_goalrating_items(entity this, float ratingscale, vector org, float
                // Check if the item can be picked up safely
                if(it.classname == "droppedweapon")
                {
+                       if(!IS_ONGROUND(it))
+                               continue;
                        traceline(o, o + '0 0 -1500', true, NULL);
 
-                       d = pointcontents(trace_endpos + '0 0 1');
-                       if(d == CONTENT_WATER || d == CONTENT_SLIME || d == CONTENT_LAVA)
+                       if(Mod_Q1BSP_SuperContentsFromNativeContents(pointcontents(trace_endpos + '0 0 1')) & DPCONTENTS_LIQUIDSMASK)
                                continue;
                        // this tracebox_hits_trigger_hurt call isn't needed:
                        // dropped weapons are removed as soon as they fall on a trigger_hurt
@@ -90,8 +96,8 @@ void havocbot_goalrating_items(entity this, float ratingscale, vector org, float
                else
                {
                        // Ignore items under water
-                       traceline(it.origin + it.maxs, it.origin + it.maxs, MOVE_NORMAL, it);
-                       if(trace_dpstartcontents & DPCONTENTS_LIQUIDSMASK)
+                       // TODO: can't .waterlevel be used here?
+                       if(Mod_Q1BSP_SuperContentsFromNativeContents(pointcontents(it.origin + ((it.mins + it.maxs) * 0.5))) & DPCONTENTS_LIQUIDSMASK)
                                continue;
                }
 
@@ -103,17 +109,15 @@ void havocbot_goalrating_items(entity this, float ratingscale, vector org, float
                        entity picker = it;
                        FOREACH_CLIENT(IS_PLAYER(it) && it != this && !IS_DEAD(it),
                        {
-                               d = vlen(it.origin - o); // distance between player and item
-
                                if ( it.team == this.team )
                                {
                                        if ( !IS_REAL_CLIENT(it) || discard )
                                                continue;
 
-                                       if( d > friend_distance)
+                                       if( vdist(it.origin - o, >, friend_distance) )
                                                continue;
 
-                                       friend_distance = d;
+                                       friend_distance = vlen(it.origin - o); // distance between player and item
                                        discard = true;
 
                                        if (picker.health && it.health > this.health) continue;
@@ -133,8 +137,8 @@ void havocbot_goalrating_items(entity this, float ratingscale, vector org, float
                                {
                                        // If enemy only track distances
                                        // TODO: track only if visible ?
-                                       if( d < enemy_distance )
-                                               enemy_distance = d;
+                                       if( vdist(it.origin - o, <, enemy_distance) )
+                                               enemy_distance = vlen(it.origin - o); // distance between player and item
                                }
                        });
 
@@ -205,6 +209,9 @@ void havocbot_role_generic(entity this)
                havocbot_goalrating_enemyplayers(this, 20000, this.origin, 10000);
                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);
        }
 }