X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fbot%2Faim.qc;h=578306c4eb89c49c6e69707f07c6750273965601;hb=1617a82857a149add8665e9a8a3e216f91304d2c;hp=699748fdae58401b0fe3d9002977e88ac17f7993;hpb=b5a593d8425521092f05949c4143d86a25d49f4c;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/bot/aim.qc b/qcsrc/server/bot/aim.qc index 699748fda..578306c4e 100644 --- a/qcsrc/server/bot/aim.qc +++ b/qcsrc/server/bot/aim.qc @@ -6,8 +6,8 @@ entity ka_ball; float findtrajectorywithleading(vector org, vector m1, vector m2, entity targ, float shotspeed, float shotspeedupward, float maxtime, float shotdelay, entity ignore) { - local float c, savesolid, shottime; - local vector dir, end, v, o; + float c, savesolid, shottime; + vector dir, end, v, o; if (shotspeed < 1) return FALSE; // could cause division by zero if calculated if (targ.solid < SOLID_BBOX) // SOLID_NOT and SOLID_TRIGGER @@ -78,7 +78,7 @@ float findtrajectorywithleading(vector org, vector m1, vector m2, entity targ, f // leave a valid one even if it won't reach findtrajectory_velocity = normalize(end - org) * shotspeed + shotspeedupward * '0 0 1'; return FALSE; -}; +} void lag_update() { @@ -87,7 +87,7 @@ void lag_update() if (self.lag3_time) if (time > self.lag3_time) {self.lag_func(self.lag3_time, self.lag3_float1, self.lag3_float2, self.lag3_entity1, self.lag3_vec1, self.lag3_vec2, self.lag3_vec3, self.lag3_vec4);self.lag3_time = 0;} if (self.lag4_time) if (time > self.lag4_time) {self.lag_func(self.lag4_time, self.lag4_float1, self.lag4_float2, self.lag4_entity1, self.lag4_vec1, self.lag4_vec2, self.lag4_vec3, self.lag4_vec4);self.lag4_time = 0;} if (self.lag5_time) if (time > self.lag5_time) {self.lag_func(self.lag5_time, self.lag5_float1, self.lag5_float2, self.lag5_entity1, self.lag5_vec1, self.lag5_vec2, self.lag5_vec3, self.lag5_vec4);self.lag5_time = 0;} -}; +} float lag_additem(float t, float f1, float f2, entity e1, vector v1, vector v2, vector v3, vector v4) { @@ -98,7 +98,7 @@ float lag_additem(float t, float f1, float f2, entity e1, vector v1, vector v2, if (self.lag5_time == 0) {self.lag5_time = t;self.lag5_float1 = f1;self.lag5_float2 = f2;self.lag5_entity1 = e1;self.lag5_vec1 = v1;self.lag5_vec2 = v2;self.lag5_vec3 = v3;self.lag5_vec4 = v4;return TRUE;} // no room for it (what is the best thing to do here??) return FALSE; -}; +} float bot_shouldattack(entity e) { @@ -111,9 +111,8 @@ float bot_shouldattack(entity e) return FALSE; } - if(g_freezetag) - if(e.freezetag_frozen) - return FALSE; + if(e.freezetag_frozen) + return FALSE; // If neither player has ball then don't attack unless the ball is on the // ground. @@ -127,7 +126,7 @@ float bot_shouldattack(entity e) return FALSE; } else if(bot_ignore_bots) - if(clienttype(e) == CLIENTTYPE_BOT) + if(IS_BOT_CLIENT(e)) return FALSE; if (!e.takedamage) @@ -136,13 +135,15 @@ float bot_shouldattack(entity e) return FALSE; if (e.BUTTON_CHAT) return FALSE; - if(g_minstagib) - if(e.items & IT_STRENGTH) - return FALSE; if(e.flags & FL_NOTARGET) return FALSE; + + checkentity = e; + if(MUTATOR_CALLHOOK(BotShouldAttack)) + return FALSE; + return TRUE; -}; +} void bot_lagfunc(float t, float f1, float f2, entity e1, vector v1, vector v2, vector v3, vector v4) { @@ -165,12 +166,12 @@ void bot_lagfunc(float t, float f1, float f2, entity e1, vector v1, vector v2, v self.bot_canfire = (random() < 0.95); else self.bot_canfire = 1; -}; +} float bot_aimdir(vector v, float maxfiredeviation) { - local float dist, delta_t, blend; - local vector desiredang, diffang; + float dist, delta_t, blend; + vector desiredang, diffang; //dprint("aim ", self.netname, ": old:", vtos(self.v_angle)); // make sure v_angle is sane first @@ -271,7 +272,7 @@ float bot_aimdir(vector v, float maxfiredeviation) //diffang = diffang + randomvec() * (dist * 0.05 * (3.5 - bound(0, skill, 3))); // turn - local float r, fixedrate, blendrate; + float r, fixedrate, blendrate; fixedrate = autocvar_bot_ai_aimskill_fixedrate / bound(1,dist,1000); blendrate = autocvar_bot_ai_aimskill_blendrate; r = max(fixedrate, blendrate); @@ -310,18 +311,18 @@ float bot_aimdir(vector v, float maxfiredeviation) //dprint(" diff:", vtos(diffang), "\n"); return self.bot_canfire && (time < self.bot_firetimer); -}; +} vector bot_shotlead(vector targorigin, vector targvelocity, float shotspeed, float shotdelay) { // Try to add code here that predicts gravity effect here, no clue HOW to though ... well not yet atleast... return targorigin + targvelocity * (shotdelay + vlen(targorigin - shotorg) / shotspeed); -}; +} float bot_aim(float shotspeed, float shotspeedupward, float maxshottime, float applygravity) { - local float f, r; - local vector v; + float f, r, hf, distanceratio; + vector v; /* eprint(self); dprint("bot_aim(", ftos(shotspeed)); @@ -330,6 +331,10 @@ float bot_aim(float shotspeed, float shotspeedupward, float maxshottime, float a dprint(", ", ftos(applygravity)); dprint(");\n"); */ + + hf = self.dphitcontentsmask; + self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE; + shotspeed *= g_weaponspeedfactor; shotspeedupward *= g_weaponspeedfactor; if (!shotspeed) @@ -346,15 +351,18 @@ float bot_aim(float shotspeed, float shotspeedupward, float maxshottime, float a shotorg = self.origin + self.view_ofs; shotdir = v_forward; v = bot_shotlead(self.bot_aimtargorigin, self.bot_aimtargvelocity, shotspeed, self.bot_aimlatency); - local float distanceratio; - distanceratio =sqrt(bound(0,skill,10000))*0.3*(vlen(v-shotorg)-100)/autocvar_bot_ai_aimskill_firetolerance_distdegrees; + distanceratio = sqrt(bound(0,skill,10000))*0.3*(vlen(v-shotorg)-100)/autocvar_bot_ai_aimskill_firetolerance_distdegrees; distanceratio = bound(0,distanceratio,1); r = (autocvar_bot_ai_aimskill_firetolerance_maxdegrees-autocvar_bot_ai_aimskill_firetolerance_mindegrees) * (1-distanceratio) + autocvar_bot_ai_aimskill_firetolerance_mindegrees; if (applygravity && self.bot_aimtarg) { if (!findtrajectorywithleading(shotorg, '0 0 0', '0 0 0', self.bot_aimtarg, shotspeed, shotspeedupward, maxshottime, 0, self)) + { + self.dphitcontentsmask = hf; return FALSE; + } + f = bot_aimdir(findtrajectory_velocity - shotspeedupward * '0 0 1', r); } else @@ -370,10 +378,14 @@ float bot_aim(float shotspeed, float shotspeedupward, float maxshottime, float a if (trace_fraction < 1) if (trace_ent != self.enemy) if (!bot_shouldattack(trace_ent)) + { + self.dphitcontentsmask = hf; return FALSE; + } } //if (r > maxshottime * shotspeed) // return FALSE; + self.dphitcontentsmask = hf; return TRUE; -}; +}