New Chasecam


Posted by SKREAMZ (195.147.221.*) at 10:00 PM, 10/20/2001:

Title: new chase cam
Difficulty: easy
By: skreamz
Email: skreamz@yahoo.co.uk
Note: Please give credit where credit is due.
-----------------------------------------------

ok first replace all your g_chase.c code with this code

#include "g_local.h"

void UpdateChaseCam(edict_t *ent)
{
  vec3_t o, ownerv, goal;
  edict_t *targ;
  vec3_t forward, right;
  trace_t trace;
  int i;
  vec3_t oldgoal;
  vec3_t angles;

  // is our chase target gone?
  if (!ent->client->chase_target->inuse
    || ent->client->chase_target->client->resp.spectator) {
    edict_t *old = ent->client->chase_target;
    ChaseNext(ent);
    if (ent->client->chase_target == old) {
      ent->client->chase_target = NULL;
      ent->client->ps.pmove.pm_flags &= ~PMF_NO_PREDICTION;
      return;
    }
  }

  targ = ent->client->chase_target;

   if(ent->client->chase_mode == 1)
     {
      VectorCopy(targ->s.origin, ownerv);
      VectorCopy(ent->s.origin, oldgoal);

      ownerv[2] += targ->viewheight;

      VectorCopy(targ->client->v_angle, angles);

      if(angles[PITCH] > 56)
        angles[PITCH] = 56;

      AngleVectors (angles, forward, right, NULL);
      VectorNormalize(forward);
      VectorMA(ownerv, -30, forward, o);

      if(o[2] < targ->s.origin[2] + 20)
        o[2] = targ->s.origin[2] + 20;

      if(!targ->groundentity)
        o[2] += 16;

      trace = gi.trace(ownerv, vec3_origin, vec3_origin, o, targ, MASK_SOLID);

      VectorCopy(trace.endpos, goal);

      VectorMA(goal, 2, forward, goal);

      VectorCopy(goal, o);
      o[2] += 6;
      trace = gi.trace(goal, vec3_origin, vec3_origin, o, targ, MASK_SOLID);

      if(trace.fraction < 1)
           {
          VectorCopy(trace.endpos, goal);
          goal[2] -= 6;
          }

      VectorCopy(goal, o);
      o[2] -= 6;
      trace = gi.trace(goal, vec3_origin, vec3_origin, o, targ, MASK_SOLID);

      if(trace.fraction < 1)
           {
          VectorCopy(trace.endpos, goal);
          goal[2] += 6;
        }

      if(targ->deadflag)
        ent->client->ps.pmove.pm_type = PM_DEAD;
      else
        ent->client->ps.pmove.pm_type = PM_FREEZE;

      VectorCopy(goal, ent->s.origin);

      for(i=0 ; i<3 ; i++)
        ent->client->ps.pmove.delta_angles[i] = ANGLE2SHORT(targ->client->v_angle[i] - ent->client->resp.cmd_angles[i]);

      if(targ->deadflag)
           {
          ent->client->ps.viewangles[ROLL] = 40;
          ent->client->ps.viewangles[PITCH] = -15;
          ent->client->ps.viewangles[YAW] = targ->client->killer_yaw;
        }
         else
           {
          VectorCopy(targ->client->v_angle, ent->client->ps.viewangles);
          VectorCopy(targ->client->v_angle, ent->client->v_angle);
        }
     }
   else if(ent->client->chase_mode == 2)
     {

      ent->client->ps.fov = 90;

         if(ent->client->resp.cmd_angles[PITCH] > 89)
             ent->client->resp.cmd_angles[PITCH] = 89;

         if(ent->client->resp.cmd_angles[PITCH] < -89)
             ent->client->resp.cmd_angles[PITCH] = -89;

         VectorCopy(targ->s.origin, ownerv);

         ownerv[2] += targ->viewheight;

         VectorCopy(ent->client->ps.viewangles, angles);
         AngleVectors (angles, forward, right, NULL);
         VectorNormalize(forward);
         VectorMA(ownerv, -150, forward, o);

         if(!targ->groundentity)
           o[2] += 16;

         trace = gi.trace(ownerv, vec3_origin, vec3_origin, o, targ, MASK_SOLID);

         VectorCopy(trace.endpos, goal);

         VectorMA(goal, 2, forward, goal);

         VectorCopy(goal, o);
         o[2] += 6;

         trace = gi.trace(goal, vec3_origin, vec3_origin, o, targ, MASK_SOLID);

         if(trace.fraction < 1)
           {
          VectorCopy(trace.endpos, goal);
           goal[2] -= 6;
           }

         VectorCopy(goal, o);
         o[2] -= 6;

         trace = gi.trace(goal, vec3_origin, vec3_origin, o, targ, MASK_SOLID);

         if(trace.fraction < 1)
           {
              VectorCopy(trace.endpos, goal);
               goal[2] += 6;
            }

         if(targ->deadflag)
           ent->client->ps.pmove.pm_type = PM_DEAD;
         else
           ent->client->ps.pmove.pm_type = PM_FREEZE;

         VectorCopy(goal, ent->s.origin);

         for(i=0 ; i<3 ; i++)
             ent->client->ps.pmove.delta_angles[i] = ANGLE2SHORT(ent->client->v_angle[i] - ent->client->resp.cmd_angles[i]);

         VectorCopy(ent->client->resp.cmd_angles, ent->client->ps.viewangles);

      }
  else
     {
      VectorCopy(targ->s.origin, ownerv);
         VectorCopy(targ->client->v_angle, angles);

         AngleVectors (angles, forward, right, NULL);
         VectorNormalize(forward);
         VectorMA(ownerv, 16, forward, o);

         o[2] += targ->viewheight;

         VectorCopy(o, ent->s.origin);

         ent->client->ps.fov = targ->client->ps.fov;

         for(i=0 ; i<3 ; i++)
           ent->client->ps.pmove.delta_angles[i] = ANGLE2SHORT(targ->client->v_angle[i] - ent->client->resp.cmd_angles[i]);

         if(targ->deadflag)
           {
              ent->client->ps.viewangles[ROLL] = 40;
               ent->client->ps.viewangles[PITCH] = -15;
               ent->client->ps.viewangles[YAW] = targ->client->killer_yaw;
            }
        else
           {
              VectorAdd(targ->client->v_angle, targ->client->ps.kick_angles,angles);
          VectorCopy(angles, ent->client->ps.viewangles);
               VectorCopy(angles, ent->client->v_angle);
            }
      }

  ent->viewheight = 0;
  ent->client->ps.pmove.pm_flags |= PMF_NO_PREDICTION;
  gi.linkentity(ent);
}

void ChaseNext(edict_t *ent)
{
  int i;
  edict_t *e;

  if (!ent->client->chase_target)
    return;

   if(ent->client->chase_mode == 1)
     {
      ent->client->chase_mode = 2;
         return;
      }
   else if(ent->client->chase_mode == 2)
     {
      ent->client->chase_mode = 3;
         return;
      }

  i = ent->client->chase_target - g_edicts;
  do {
    i++;
    if (i > maxclients->value)
      i = 1;
    e = g_edicts + i;
    if (!e->inuse)
      continue;
    if (!e->client->resp.spectator)
      break;
  } while (e != ent->client->chase_target);

  ent->client->chase_target = e;
  ent->client->update_chase = true;
  ent->client->chase_mode = 1;
}

void ChasePrev(edict_t *ent)
{
  int i;
  edict_t *e;

  if (!ent->client->chase_target)
    return;

  i = ent->client->chase_target - g_edicts;
  do {
    i--;
    if (i < 1)
      i = maxclients->value;
    e = g_edicts + i;
    if (!e->inuse)
      continue;
    if (!e->client->resp.spectator)
      break;
  } while (e != ent->client->chase_target);

  ent->client->chase_target = e;
  ent->client->update_chase = true;
}

void GetChaseTarget(edict_t *ent)
{
  int i;
  edict_t *other;

  for (i = 1; i <= maxclients->value; i++) {
    other = g_edicts + i;
    if (other->inuse && !other->client->resp.spectator) {
      ent->client->chase_target = other;
      ent->client->update_chase = true;
      UpdateChaseCam(ent);
      return;
    }
  }
  gi_centerprintf(ent, "No other players to chase.");
}
 

next open up g_local.h and find your gclient_s struct and add this line


  int chase_mode;  
 

and thats it.

one thing i would like to say this is not all my code some came from the action src.