|
|
Here's a tutorial that will enable the bot model to "yaw" like a real player,
i.e : when an enemy is on a higher level on top of the bot, the gun model will
point at the enemy instead of just pointing straight forward. This was once a
feature that Steven Polge wanted to implement before he went to work for Epic.
Step 1 :
Open up the file ai.qc. Paste this function at the end of the file :
/*
===========
ChangePitch
CN_PATCH
Turns towards self.ideal_pitch at 6 degree
chunks. Used by Eliminator Bot.
Sets the global variable current_pitch
============
*/
void() ChangePitch =
{
local float ideal, move;
current_pitch = self.angles_x;
ideal = self.ideal_pitch;
// only allow movement to within 54 degrees
if (ideal > 54)
ideal = 54;
else if (ideal < -54)
ideal = -54;
if (current_pitch == ideal)
return;
move = ideal - current_pitch;
if (move > 0)
{
if (move > 6)
move = 6;
}
else
{
if (move < -6 )
move = -6;
}
current_pitch = current_pitch + move;
self.angles_x = current_pitch;
};
Step 2 :
Open up the file botthink.qc. Go to the function BotPostThink. Put in these
code right above that function :
// Code from Eliminator Bot by Cameron Newham
void() checkyaw =
{
local vector los;
local vector los_angles;
local float o_range;
local float missile_factor;
local vector spotty_squid; // adds a tiny random for stationary targets
local string st;
o_range = vlen(self.enemy.origin - self.origin);
if ((self.weapon == IT_ROCKET_LAUNCHER) ||
(self.weapon == IT_NAILGUN) ||
(self.weapon == IT_SUPER_NAILGUN))
missile_factor = o_range / (1900 + random() * 700); // add scatter
else if (self.weapon == IT_GRENADE_LAUNCHER)
missile_factor = o_range / (1000 + random() * 50); // add scatter
else
missile_factor = 0; //other weapons are instantaneous
// apply a small randomiser of the distance is large
if (o_range > 300)
spotty_squid = ('9 9 8') * (random() - 0.5);
else
spotty_squid = '0 0 0';
// Face bot towards the specified angles
los = self.enemy.origin - self.origin + self.enemy.velocity*missile_factor
+ spotty_squid;
los_angles = vectoangles (los);
self.ideal_pitch = los_angles_x;
if (self.ideal_pitch > 180)
self.ideal_pitch = self.ideal_pitch - 360; //stupid id mistake
ChangePitch();
};
Step 3 :
Now all we need to do is make a call to the function so place this piece of
code inside the BotPostThink function, below the "local float fraglimit;" :
checkyaw ();
There you go ! You're done , save the files and recompile. You'll only notice
the bot model yaw when you're an observer, a good map to see this happen is
on maps like dm4, dm6, etc. Have fun !
|