X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fbot%2Fdefault%2Fhavocbot%2Froles.qc;h=d33aadfac8ad3567b1a1543acfd6f6e4e0e11892;hb=678127044857fb9b89f06faf7a3313bdeb43205c;hp=5ddb0f74b576ab0bcd8107dad86e1af96a5f6a27;hpb=3ee342eac91e8a0cc50f5e7517bb4c4d640a4774;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/bot/default/havocbot/roles.qc b/qcsrc/server/bot/default/havocbot/roles.qc index 5ddb0f74b..d33aadfac 100644 --- a/qcsrc/server/bot/default/havocbot/roles.qc +++ b/qcsrc/server/bot/default/havocbot/roles.qc @@ -1,5 +1,7 @@ #include "roles.qh" +#include +#include #include "havocbot.qh" #include "../cvars.qh" @@ -44,7 +46,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 @@ -54,9 +56,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; @@ -77,11 +83,13 @@ 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(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 @@ -90,9 +98,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; } @@ -104,17 +110,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; @@ -134,8 +138,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 } }); @@ -165,7 +169,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; @@ -188,7 +192,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