]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/bot/default/havocbot/roles.qc
Merge branch 'master' into terencehill/bot_waypoints
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / bot / default / havocbot / roles.qc
index 2d5075f921a1d34ffa77e7cc1baa6e87704cd9f4..6d0b3c6a1cae803294d4adb588868ab6da8dba94 100644 (file)
@@ -1,5 +1,8 @@
 #include "roles.qh"
 
+#include <server/defs.qh>
+#include <server/miscfunctions.qh>
+#include <server/items.qh>
 #include "havocbot.qh"
 
 #include "../cvars.qh"
@@ -44,7 +47,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
 
@@ -79,15 +82,15 @@ void havocbot_goalrating_items(entity this, float ratingscale, vector org, float
                        continue;
 
                // Check if the item can be picked up safely
-               if(it.classname == "droppedweapon")
+               if(Item_IsLoot(it))
                {
                        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(IN_LAVA(trace_endpos + '0 0 1'))
                                continue;
+
                        // this tracebox_hits_trigger_hurt call isn't needed:
                        // dropped weapons are removed as soon as they fall on a trigger_hurt
                        // and can't be rated while they are in the air
@@ -96,9 +99,7 @@ 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)
+                       if(IN_LAVA(it.origin + (it.mins + it.maxs) * 0.5))
                                continue;
                }
 
@@ -110,17 +111,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;
@@ -140,8 +139,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
                                }
                        });
 
@@ -171,7 +170,7 @@ void havocbot_goalrating_enemyplayers(entity this, float ratingscale, vector org
        ratingscale = ratingscale * 0.00005; // enemies are rated around 20000 already
 
        float t;
-       FOREACH_CLIENT(IS_PLAYER(it) && bot_shouldattack(this, it), LAMBDA(
+       FOREACH_CLIENT(IS_PLAYER(it) && bot_shouldattack(this, it), {
                // TODO: Merge this logic with the bot_shouldattack function
                if(vdist(it.origin - org, <, 100) || vdist(it.origin - org, >, sradius))
                        continue;
@@ -194,7 +193,7 @@ void havocbot_goalrating_enemyplayers(entity this, float ratingscale, vector org
                ratingscale *= t;
                if (ratingscale > 0)
                        navigation_routerating(this, it, ratingscale * BOT_RATING_ENEMY, 2000);
-       ));
+       });
 }
 
 // legacy bot role for standard gamemodes