]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/bot/aim.qc
Merge remote branch 'origin/master' into terencehill/menu_tooltips_2
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / bot / aim.qc
index 9ef109e2b585e3c76053c7b183fbc49da22543ff..b678bf1b660de2a9920d29ebc5e8af7a2ef554ab 100644 (file)
@@ -1,4 +1,5 @@
 
+entity ka_ball;
 // traces multiple trajectories to find one that will impact the target
 // 'end' vector is the place it aims for,
 // returns TRUE only if it hit targ (don't target non-solid entities)
@@ -6,7 +7,7 @@
 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;
+       local 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
@@ -17,9 +18,10 @@ float findtrajectorywithleading(vector org, vector m1, vector m2, entity targ, f
        setsize(tracetossent, m1, m2);
        savesolid = targ.solid;
        targ.solid = SOLID_NOT;
-       shottime = ((vlen(targ.origin - org) / shotspeed) + shotdelay);
-       v = targ.velocity * shottime + targ.origin;
-       tracebox(targ.origin, targ.mins, targ.maxs, v, FALSE, targ);
+       o = (targ.absmin + targ.absmax) * 0.5;
+       shottime = ((vlen(o - org) / shotspeed) + shotdelay);
+       v = targ.velocity * shottime + o;
+       tracebox(o, targ.mins, targ.maxs, v, FALSE, targ);
        v = trace_endpos;
        end = v + (targ.mins + targ.maxs) * 0.5;
        if ((vlen(end - org) / shotspeed + 0.2) > maxtime)
@@ -104,7 +106,7 @@ float bot_shouldattack(entity e)
        {
                if (e == self)
                        return FALSE;
-               if (teams_matter)
+               if (teamplay)
                if (e.team != 0)
                        return FALSE;
        }
@@ -113,7 +115,13 @@ float bot_shouldattack(entity e)
                if(e.freezetag_frozen)
                        return FALSE;
 
-       if(teams_matter)
+       // If neither player has ball then don't attack unless the ball is on the
+       // ground.
+       if (g_keepaway)
+               if (!e.ballcarried && !self.ballcarried && ka_ball.owner)
+                       return FALSE;
+
+       if(teamplay)
        {
                if(e.team==0)
                        return FALSE;
@@ -312,7 +320,7 @@ vector bot_shotlead(vector targorigin, vector targvelocity, float shotspeed, flo
 
 float bot_aim(float shotspeed, float shotspeedupward, float maxshottime, float applygravity)
 {
-       local float f, r;
+       local float f, r, hf, distanceratio;
        local vector v;
        /*
        eprint(self);
@@ -322,6 +330,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)
@@ -338,15 +350,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
@@ -362,10 +377,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;
 };