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 ! |