]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/bot/default/aim.qc
Warn if there are too many parameters for a bot in bots.txt
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / bot / default / aim.qc
index 8cc2664d2479bca91d62854b1d86a410d4eb37d4..21506d07523e406f0a5591d84f4c302668321f15 100644 (file)
@@ -206,6 +206,11 @@ void bot_aimdir(entity this, vector v, float maxfiredeviation)
        // 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);
@@ -306,11 +311,9 @@ void bot_aimdir(entity this, vector v, float maxfiredeviation)
        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));
@@ -328,10 +331,21 @@ void bot_aimdir(entity this, vector v, float maxfiredeviation)
        //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))
@@ -342,8 +356,6 @@ void bot_aimdir(entity this, vector v, float maxfiredeviation)
        }
        //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)