Oof, okay try this:
In bot.qc, replace this:
Code: Select all
// DRS: Extra shizz here
float(float dist) DRS_GrenadeEnergy;
with this:
Code: Select all
// DRS: Extra shizz here
float(float num) mathlib_cos;
Next, In bot_misc.qc, delete DRS_GrenadeEnergy. In it's place put this:
Code: Select all
/*
-----------------------------------------
cosine
-----------------------------------------
*/
float(float num) mathlib_cos =
{
local vector ang,vf,vu,vr;
vf = v_forward;
vu = v_up;
vr = v_right;
ang = '0 1 0' * num;
makevectors(ang);
num = v_forward_x;
v_forward = vf;
v_up = vu;
v_right = vr;
return num;
};
Next in weapons.qc, within W_FireGrenade() change the if(self.v_angle_x) block to look like this:
Code: Select all
self.missile_speed = 600;
if (self.v_angle_x)
missile.velocity = v_forward*600 + v_up * 200 + crandom()*v_right*10 + crandom()*v_up*10;
else
{
missile.velocity = aim(self, 600);
missile.velocity = missile.velocity * 600;
missile.velocity_z = 200;
}
Next, in bot_fight.qc, within weapon_range, change the else if (wep == 16) // IT_GRENADE_LAUNCHER block to look like this:
Code: Select all
else if (wep == 16) // IT_GRENADE_LAUNCHER
returnvalue = '180 48 600';
Next, in bot_ai.qc, replace the bot_angle_set function with this:
Code: Select all
void() bot_angle_set =
{
local float h;
local vector view, voffset;
local vector offset, spot1, oldview;
local float offset_amt, dist1, dist2;
if (self.enemy && self.enemy != world)
{
if (self.enemy.items & 524288)
if (random() > 0.01)
return;
if (self.missile_speed == 0)
self.missile_speed = 10000;
if (self.enemy.solid == SOLID_BSP)
{
view = (((self.enemy.absmin + self.enemy.absmax) * 0.5) - self.origin);
}
else
{
view = self.enemy.origin;
// find lead point on target
// then traceline to it, if blocked before full dist,
// set targetpoint to stopped origin
// then trace again to check if there's a clear path to
// target, if not, just target enemy.origin.
// also, check to see if trace endpoint is within 140 qu
// of the bot, if so, aim at the enemy.origin, because
// we are looking at a wall, and that could hurt if it's a rocketlauncher
h = vlen(view - self.origin) / self.missile_speed; // need to get the speed of projectile
if (self.enemy.flags & FL_ONGROUND)
view = self.enemy.velocity * h; // Aim straight at enemy, not at his feet, that will be handled later
else
view = (self.enemy.velocity - (sv_gravity * '0 0 1') * h) * h; // hes in the air, lead accordingly
view = self.enemy.origin + view; // set our leadpoint
traceline(self.enemy.origin, view, FALSE, self); // trace from enemy.origin to lead aimpoint
view = trace_endpos; // set view origin to lead aimpoint
traceline(self.origin + self.view_ofs, view, FALSE, self); // do a trace to view from self.
spot1 = trace_endpos; // get trace_endpos
dist1 = vlen(spot1 - (self.origin + self.view_ofs)); // range from self to trace
dist2 = vlen(view - (self.origin + self.view_ofs)); // range from self to aimpoint
if((dist1 < 140) && (dist1 != dist2)) // too close, shoot at enemy.origin
view = self.enemy.origin;
else if(vlen(view - spot1) > 32 && trace_ent.takedamage == DAMAGE_NO)
view = self.enemy.origin; // something that can't be damaged in the way, just shoot at enemy.origin.
dist2 = vlen(view - (self.origin+self.view_ofs));
}
// DRS: Tweaked Supa Aimcode (wazat inspired) below
// DRS: FIXME: Change this so that it's not so consistent...
if(self.weapon != IT_GRENADE_LAUNCHER) // Grenade Launcher should not jitter
{
if(self.b_skill == 0)
offset_amt = 55; //110
else if (self.b_skill == 1)
offset_amt = 45; //80
else if (self.b_skill == 2)
offset_amt = 36; //60
else if (self.b_skill == 3)
offset_amt = 15; //0
offset_x = crandom() * offset_amt;
offset_y = crandom() * offset_amt;
offset_z = crandom() * offset_amt;
}
if(self.weapon == IT_GRENADE_LAUNCHER) // using grenades? Aim properly then!
{
oldview = view;
local float realrange, flitime;
local vector grndir;
grndir = normalize(view - (self.origin + self.view_ofs));//normalize(self.enemy.origin - self.origin);
realrange = dist2*mathlib_cos(grndir_x);
flitime = realrange / self.missile_speed;
view = view + '0 0 -20'; // aim at feet
grndir = normalize(view - (self.origin + self.view_ofs));//normalize(self.enemy.origin - self.origin);
grndir = grndir * 600;
grndir_z = grndir_z + (sv_gravity*flitime) * 0.3;
view = normalize(grndir);
}
else if(self.weapon == IT_ROCKET_LAUNCHER && (self.enemy.flags & FL_ONGROUND)) // Rocketlauncher? Aim at feet if they're on the ground!
{
oldview = view;
view = view + '0 0 -20'; // aim at feet
traceline(self.origin + self.view_ofs, view, TRUE, self);
if(vlen(view - trace_endpos) > 32)
view = oldview;
view = normalize((view + offset) - (self.origin + self.view_ofs));
}
else view = normalize((view + offset) - (self.origin + self.view_ofs));
view = vectoangles(view);
view_x = view_x * -1;
self.b_angle = view;
}
else if (self.target1)
{
view = realorigin(self.target1);
if (self.target1.flags & FL_ITEM)
view = view + '0 0 48';
view = view - (self.origin + self.view_ofs);
view = vectoangles(view);
view_x = view_x * -1;
self.b_angle = view;
}
else
self.b_angle_x = 0;
// HACK HACK HACK HACK
// The bot falls off ledges a lot because of "turning around"
// so let the bot use instant turn around when not hunting a player
if (self.b_skill == 3)
{
self.keys = self.keys & 63;
self.v_angle = self.b_angle;
while (self.v_angle_x < -180)
self.v_angle_x = self.v_angle_x + 360;
while (self.v_angle_x > 180)
self.v_angle_x = self.v_angle_x - 360;
}
else if ((self.enemy == world || self.enemy.movetype == MOVETYPE_PUSH) && self.target1.classname != "player")
{
self.keys = self.keys & 63;
self.v_angle = self.b_angle;
while (self.v_angle_x < -180)
self.v_angle_x = self.v_angle_x + 360;
while (self.v_angle_x > 180)
self.v_angle_x = self.v_angle_x - 360;
}
else if (self.b_skill < 1) // skill 2 handled in bot_phys
{
if (self.b_angle_x > 180)
self.b_angle_x = self.b_angle_x - 360;
self.keys = self.keys & 63;
if (angcomp(self.b_angle_y, self.v_angle_y) > 10)
self.keys = self.keys | KEY_LOOKLEFT;
else if (angcomp(self.b_angle_y, self.v_angle_y) < -10)
self.keys = self.keys | KEY_LOOKRIGHT;
if (angcomp(self.b_angle_x, self.v_angle_x) < -10)
self.keys = self.keys | KEY_LOOKUP;
else if (angcomp(self.b_angle_x, self.v_angle_x) > 10)
self.keys = self.keys | KEY_LOOKDOWN;
}
};
This should fix most aiming problems, bots should also lead players / bots with grenades now.
The only real problem with this code is that they seem to be a little
too deadly now.