Annotation of quake2/xatrix/g_chase.c, revision 1.1.1.1

1.1       root        1: #include "g_local.h"
                      2: 
                      3: void UpdateChaseCam(edict_t *ent)
                      4: {
                      5:        vec3_t o, ownerv, goal;
                      6:        edict_t *targ;
                      7:        vec3_t forward, right;
                      8:        trace_t trace;
                      9:        int i;
                     10:        vec3_t oldgoal;
                     11:        vec3_t angles;
                     12: 
                     13:        // is our chase target gone?
                     14:        if (!ent->client->chase_target->inuse
                     15:                || ent->client->chase_target->client->resp.spectator) {
                     16:                edict_t *old = ent->client->chase_target;
                     17:                ChaseNext(ent);
                     18:                if (ent->client->chase_target == old) {
                     19:                        ent->client->chase_target = NULL;
                     20:                        ent->client->ps.pmove.pm_flags &= ~PMF_NO_PREDICTION;
                     21:                        return;
                     22:                }
                     23:        }
                     24: 
                     25:        targ = ent->client->chase_target;
                     26: 
                     27:        VectorCopy(targ->s.origin, ownerv);
                     28:        VectorCopy(ent->s.origin, oldgoal);
                     29: 
                     30:        ownerv[2] += targ->viewheight;
                     31: 
                     32:        VectorCopy(targ->client->v_angle, angles);
                     33:        if (angles[PITCH] > 56)
                     34:                angles[PITCH] = 56;
                     35:        AngleVectors (angles, forward, right, NULL);
                     36:        VectorNormalize(forward);
                     37:        VectorMA(ownerv, -30, forward, o);
                     38: 
                     39:        if (o[2] < targ->s.origin[2] + 20)
                     40:                o[2] = targ->s.origin[2] + 20;
                     41: 
                     42:        // jump animation lifts
                     43:        if (!targ->groundentity)
                     44:                o[2] += 16;
                     45: 
                     46:        trace = gi.trace(ownerv, vec3_origin, vec3_origin, o, targ, MASK_SOLID);
                     47: 
                     48:        VectorCopy(trace.endpos, goal);
                     49: 
                     50:        VectorMA(goal, 2, forward, goal);
                     51: 
                     52:        // pad for floors and ceilings
                     53:        VectorCopy(goal, o);
                     54:        o[2] += 6;
                     55:        trace = gi.trace(goal, vec3_origin, vec3_origin, o, targ, MASK_SOLID);
                     56:        if (trace.fraction < 1) {
                     57:                VectorCopy(trace.endpos, goal);
                     58:                goal[2] -= 6;
                     59:        }
                     60: 
                     61:        VectorCopy(goal, o);
                     62:        o[2] -= 6;
                     63:        trace = gi.trace(goal, vec3_origin, vec3_origin, o, targ, MASK_SOLID);
                     64:        if (trace.fraction < 1) {
                     65:                VectorCopy(trace.endpos, goal);
                     66:                goal[2] += 6;
                     67:        }
                     68: 
                     69:        if (targ->deadflag)
                     70:                ent->client->ps.pmove.pm_type = PM_DEAD;
                     71:        else
                     72:                ent->client->ps.pmove.pm_type = PM_FREEZE;
                     73: 
                     74:        VectorCopy(goal, ent->s.origin);
                     75:        for (i=0 ; i<3 ; i++)
                     76:                ent->client->ps.pmove.delta_angles[i] = ANGLE2SHORT(targ->client->v_angle[i] - ent->client->resp.cmd_angles[i]);
                     77: 
                     78:        if (targ->deadflag) {
                     79:                ent->client->ps.viewangles[ROLL] = 40;
                     80:                ent->client->ps.viewangles[PITCH] = -15;
                     81:                ent->client->ps.viewangles[YAW] = targ->client->killer_yaw;
                     82:        } else {
                     83:                VectorCopy(targ->client->v_angle, ent->client->ps.viewangles);
                     84:                VectorCopy(targ->client->v_angle, ent->client->v_angle);
                     85:        }
                     86: 
                     87:        ent->viewheight = 0;
                     88:        ent->client->ps.pmove.pm_flags |= PMF_NO_PREDICTION;
                     89:        gi.linkentity(ent);
                     90: }
                     91: 
                     92: void ChaseNext(edict_t *ent)
                     93: {
                     94:        int i;
                     95:        edict_t *e;
                     96: 
                     97:        if (!ent->client->chase_target)
                     98:                return;
                     99: 
                    100:        i = ent->client->chase_target - g_edicts;
                    101:        do {
                    102:                i++;
                    103:                if (i > maxclients->value)
                    104:                        i = 1;
                    105:                e = g_edicts + i;
                    106:                if (!e->inuse)
                    107:                        continue;
                    108:                if (!e->client->resp.spectator)
                    109:                        break;
                    110:        } while (e != ent->client->chase_target);
                    111: 
                    112:        ent->client->chase_target = e;
                    113:        ent->client->update_chase = true;
                    114: }
                    115: 
                    116: void ChasePrev(edict_t *ent)
                    117: {
                    118:        int i;
                    119:        edict_t *e;
                    120: 
                    121:        if (!ent->client->chase_target)
                    122:                return;
                    123: 
                    124:        i = ent->client->chase_target - g_edicts;
                    125:        do {
                    126:                i--;
                    127:                if (i < 1)
                    128:                        i = maxclients->value;
                    129:                e = g_edicts + i;
                    130:                if (!e->inuse)
                    131:                        continue;
                    132:                if (!e->client->resp.spectator)
                    133:                        break;
                    134:        } while (e != ent->client->chase_target);
                    135: 
                    136:        ent->client->chase_target = e;
                    137:        ent->client->update_chase = true;
                    138: }
                    139: 
                    140: void GetChaseTarget(edict_t *ent)
                    141: {
                    142:        int i;
                    143:        edict_t *other;
                    144: 
                    145:        for (i = 1; i <= maxclients->value; i++) {
                    146:                other = g_edicts + i;
                    147:                if (other->inuse && !other->client->resp.spectator) {
                    148:                        ent->client->chase_target = other;
                    149:                        ent->client->update_chase = true;
                    150:                        UpdateChaseCam(ent);
                    151:                        return;
                    152:                }
                    153:        }
                    154:        gi.centerprintf(ent, "No other players to chase.");
                    155: }
                    156: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.