// invalid aim dir (can happen when bot overlaps target)
if(!v) return;
+ float skill_save = skill;
+ // allow turning in a more natural way when bot is walking
+ if (!this.bot_aimtarg)
+ skill = max(4, skill);
+
// get the desired angles to aim at
//dprint(" at:", vtos(v));
v = normalize(v);
blendrate = autocvar_bot_ai_aimskill_blendrate;
r = max(fixedrate, blendrate);
//this.v_angle = this.v_angle + diffang * bound(frametime, r * frametime * (2+skill*skill*0.05-random()*0.05*(10-skill)), 1);
- this.v_angle = this.v_angle + diffang * bound(delta_t, r * delta_t * (2 + ((skill + this.bot_mouseskill) ** 3) * 0.005 - random()), 1);
- this.v_angle += diffang * bound(0, (1 - autocvar_bot_ai_aimskill_mouse), 1);
+ r = bound(delta_t, r * delta_t * (2 + ((skill + this.bot_mouseskill) ** 3) * 0.005 - random()), 1);
+ this.v_angle += diffang * (r + (1 - r) * bound(0, 1 - autocvar_bot_ai_aimskill_mouse, 1));
- //this.v_angle = this.v_angle + diffang * bound(0, r * frametime * (skill * 0.5 + 2), 1);
- //this.v_angle = this.v_angle + diffang * (1/ blendrate);
this.v_angle_z = 0;
this.v_angle_y = this.v_angle.y - floor(this.v_angle.y / 360) * 360;
//dprint(" turn:", vtos(this.v_angle));
//if (diffang_y >= 180)
// diffang_y = diffang_y - 360;
+ skill = skill_save;
+
//dprint("e ", vtos(diffang), " < ", ftos(maxfiredeviation), "\n");
+ if (maxfiredeviation <= 0)
+ return;
+
+ if (!autocvar_bot_ai_aimskill_firetolerance)
+ {
+ this.bot_firetimer = time + 0.2;
+ return;
+ }
+
// decide whether to fire this time
- if (maxfiredeviation != 0 && v * shotdir > cos(maxfiredeviation * DEG2RAD))
+ if (v * shotdir > cos(maxfiredeviation * DEG2RAD))
{
traceline(shotorg, shotorg + shotdir * 1000, false, NULL);
if (vdist(trace_endpos - shotorg, <, 500 + 500 * bound(0, skill + this.bot_aggresskill, 10))
}
//dprint(ftos(maxfiredeviation),"\n");
//dprint(" diff:", vtos(diffang), "\n");
-
- //return this.bot_canfire && (time < this.bot_firetimer);
}
vector bot_shotlead(vector targorigin, vector targvelocity, float shotspeed, float shotdelay)