X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fbot%2Fhavocbot%2Froles.qc;h=1e9231b6a12b853d211f69ee683ab2ae0b41c0e7;hb=3846c9bd40c2b3c1aa220c1eeef9198b1912aab4;hp=d2f6b900084fa685cfcf126bc54b2bb656d48d91;hpb=0e7ed909bffb4ff21f0c68d163edfc17487e380a;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/bot/havocbot/roles.qc b/qcsrc/server/bot/havocbot/roles.qc index d2f6b9000..4947c987e 100644 --- a/qcsrc/server/bot/havocbot/roles.qc +++ b/qcsrc/server/bot/havocbot/roles.qc @@ -7,15 +7,17 @@ void havocbot_goalrating_items(float ratingscale, vector org, float sradius) { - local entity head; - local entity player; - local float rating, d, discard, distance, friend_distance, enemy_distance; + entity head; + entity player; + float rating, d, discard, distance, friend_distance, enemy_distance; + vector o; ratingscale = ratingscale * 0.0001; // items are rated around 10000 already head = findchainfloat(bot_pickup, TRUE); while (head) { - distance = vlen(head.origin - org); + o = (head.absmin + head.absmax) * 0.5; + distance = vlen(o - org); friend_distance = 10000; enemy_distance = 10000; rating = 0; @@ -28,7 +30,7 @@ void havocbot_goalrating_items(float ratingscale, vector org, float sradius) // Check if the item can be picked up safely if(head.classname == "droppedweapon") { - traceline(head.origin, head.origin + '0 0 -1500', TRUE, world); + traceline(o, o + '0 0 -1500', TRUE, world); d = pointcontents(trace_endpos + '0 0 1'); if(d & CONTENT_WATER || d & CONTENT_SLIME || d & CONTENT_LAVA) @@ -53,7 +55,7 @@ void havocbot_goalrating_items(float ratingscale, vector org, float sradius) } } - if(teams_matter) + if(teamplay) { discard = FALSE; @@ -63,7 +65,7 @@ void havocbot_goalrating_items(float ratingscale, vector org, float sradius) if ( self == player || player.deadflag ) continue; - d = vlen(player.origin - head.origin); // distance between player and item + d = vlen(player.origin - o); // distance between player and item if ( player.team == self.team ) { @@ -112,7 +114,7 @@ void havocbot_goalrating_items(float ratingscale, vector org, float sradius) // Rate the item only if no one needs it, or if an enemy is closer to it if ( (enemy_distance < friend_distance && distance < enemy_distance) || - (friend_distance > cvar("bot_ai_friends_aware_pickup_radius") ) || !discard ) + (friend_distance > autocvar_bot_ai_friends_aware_pickup_radius ) || !discard ) rating = head.bot_pickupevalfunc(self, head); } @@ -127,11 +129,11 @@ void havocbot_goalrating_items(float ratingscale, vector org, float sradius) void havocbot_goalrating_controlpoints(float ratingscale, vector org, float sradius) { - local entity head; + entity head; head = findchain(classname, "dom_controlpoint"); while (head) { - if (vlen(head.origin - org) < sradius) + if (vlen(( ( head.absmin + head.absmax ) * 0.5 ) - org) < sradius) { if(head.cnt > -1) // this is just being fought for navigation_routerating(head, ratingscale, 5000); @@ -146,11 +148,11 @@ void havocbot_goalrating_controlpoints(float ratingscale, vector org, float srad void havocbot_goalrating_enemyplayers(float ratingscale, vector org, float sradius) { - local entity head; - local float t, noteam, distance; - noteam = ((self.team == 0) || !teams_matter); // fteqcc sucks + entity head; + float t, noteam, distance; + noteam = ((self.team == 0) || !teamplay); // fteqcc sucks - if (cvar("bot_nofire")) + if (autocvar_bot_nofire) return; // don't chase players if we're under water @@ -168,6 +170,9 @@ void havocbot_goalrating_enemyplayers(float ratingscale, vector org, float sradi if (distance < 100 || distance > sradius) continue; + if (head.freezetag_frozen) + continue; + if(g_minstagib) if(head.items & IT_STRENGTH) continue; @@ -194,6 +199,10 @@ void havocbot_goalrating_enemyplayers(float ratingscale, vector org, float sradi continue; } + // TODO: rate waypoints near the targetted 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 = (self.health + self.armorvalue ) / (head.health + head.armorvalue ); navigation_routerating(head, t * ratingscale, 2000); } @@ -212,7 +221,7 @@ void havocbot_role_dom() if (self.bot_strategytime < time) { - self.bot_strategytime = time + cvar("bot_ai_strategyinterval"); + self.bot_strategytime = time + autocvar_bot_ai_strategyinterval; navigation_goalrating_start(); havocbot_goalrating_controlpoints(10000, self.origin, 15000); havocbot_goalrating_items(8000, self.origin, 8000); @@ -231,7 +240,7 @@ void havocbot_role_dm() if (self.bot_strategytime < time) { - self.bot_strategytime = time + cvar("bot_ai_strategyinterval"); + self.bot_strategytime = time + autocvar_bot_ai_strategyinterval; navigation_goalrating_start(); havocbot_goalrating_items(10000, self.origin, 10000); havocbot_goalrating_enemyplayers(20000, self.origin, 10000); @@ -251,7 +260,7 @@ void havocbot_role_race() entity e; if (self.bot_strategytime < time) { - self.bot_strategytime = time + cvar("bot_ai_strategyinterval"); + self.bot_strategytime = time + autocvar_bot_ai_strategyinterval; navigation_goalrating_start(); /* havocbot_goalrating_items(100, self.origin, 10000); @@ -292,7 +301,6 @@ void havocbot_chooserole_dom() void havocbot_chooserole() { dprint("choosing a role...\n"); - navigation_clearroute(); self.bot_strategytime = 0; if (g_ctf) havocbot_chooserole_ctf(); @@ -304,6 +312,12 @@ void havocbot_chooserole() havocbot_chooserole_race(); else if (g_onslaught) havocbot_chooserole_ons(); + else if (g_keepaway) + havocbot_chooserole_ka(); + else if (g_freezetag) + havocbot_chooserole_ft(); + else if (g_assault) + havocbot_chooserole_ast(); else // assume anything else is deathmatch havocbot_chooserole_dm(); };