Forum

Problem with ChangePitch()

Discuss programming in the QuakeC language.

Moderator: InsideQC Admins

Problem with ChangePitch()

Postby Orion » Thu Dec 24, 2009 6:17 pm

Hi, I have a little problem with a ChangePitch() function I created, yes, Darkplaces has its own changepitch() builtin, but I made one to use with v_angle_x instead of angles_x.

Look:
Code: Select all
void() Bot_ChangePitch =
{
   local float ideal, move, current;
   
   current = anglemod(self.v_angle_x);
   ideal = self.idealpitch;
   
   if (current == ideal)
      return;
   
   move = ideal - current;
   if (ideal > current)
   {
      if (move > 180)
         move = move - 360;
   }
   else
   {
      if (move < -180)
         move = move + 360;
   }
   
   if (move > 0)
   {
      if (move > 14.4)
         move = 14.4;
   }
   else
   {
      if (move < -14.4)
         move = -14.4;
   }
   
   current = anglemod (current + move);
   self.v_angle_x = current;
};


The function is exactly like ChangeYaw(), but the problem is:

When I play with the bots they have trouble aiming upwards, but downwards they work OK.

When they try to aim upwards I see them upside down, and then not shooting.

Here's my bot_aim() code:

Code: Select all
void() bot_aim =
{
   local vector vel, spot, dir;
   local float go;
   
   if (self.weapon != IT_SHOTGUN && self.weapon != IT_SUPER_SHOTGUN && self.weapon != IT_LIGHTNING)
   {
      if (self.weapon == IT_GRENADE_LAUNCHER)
         go = vlen(self.enemy.origin - self.origin) / 800;
      else
         go = vlen(self.enemy.origin - self.origin) / 1000;
      
      vel = self.enemy.velocity;
      vel_z = 0;
      spot = self.enemy.origin + vel*go;
      
      traceline (self.origin, spot, FALSE, self);
      if (trace_fraction < 0.8)
         spot = self.enemy.origin;
         
      dir = normalize(spot - self.origin);
      dir = vectoangles(dir);
   }
   else
   {
      dir = self.enemy.origin - self.enemy.velocity*0.065;
      dir = normalize(dir - self.origin);
      dir = vectoangles(dir);
   }
   
   dir_x = dir_x * -1;
   while (dir_x > 180)
      dir_x = dir_x - 360;
   while (dir_x < -180)
      dir_x = dir_x + 360;
   
   self.idealpitch = dir_x;
   self.ideal_yaw = dir_y;
   
   if (self.turn_time < time)
   {
      Bot_ChangePitch ();
      Bot_ChangeYaw ();
      self.turn_time = time + 0.02;
   }
};


Any help appreciated.
User avatar
Orion
 
Posts: 476
Joined: Fri Jan 12, 2007 6:32 pm
Location: Brazil

Return to QuakeC Programming

Who is online

Users browsing this forum: No registered users and 1 guest