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

1.1       root        1: #include "g_local.h"
                      2: 
                      3: 
                      4: void UpdateChaseCam(edict_t *ent)
                      5: {
                      6:        vec3_t o, ownerv, goal;
                      7:        edict_t *targ;
                      8:        vec3_t forward, right;
                      9:        trace_t trace;
                     10:        int i;
                     11:        vec3_t oldgoal;
                     12:        vec3_t angles;
                     13: 
                     14:        // is our chase target gone?
                     15:        if (!ent->client->chase_target->inuse) {
                     16:                ent->client->chase_target = NULL;
                     17:                return;
                     18:        }
                     19: 
                     20:        targ = ent->client->chase_target;
                     21: 
                     22:        VectorCopy(targ->s.origin, ownerv);
                     23:        VectorCopy(ent->s.origin, oldgoal);
                     24: 
                     25:        ownerv[2] += targ->viewheight;
                     26: 
                     27:        VectorCopy(targ->client->v_angle, angles);
                     28:        if (angles[PITCH] > 56)
                     29:                angles[PITCH] = 56;
                     30:        AngleVectors (angles, forward, right, NULL);
                     31:        VectorNormalize(forward);
                     32:        VectorMA(ownerv, -30, forward, o);
                     33: 
                     34:        if (o[2] < targ->s.origin[2] + 20)
                     35:                o[2] = targ->s.origin[2] + 20;
                     36: 
                     37:        // jump animation lifts
                     38:        if (!targ->groundentity)
                     39:                o[2] += 16;
                     40: 
                     41:        trace = gi.trace(ownerv, vec3_origin, vec3_origin, o, targ, MASK_SOLID);
                     42: 
                     43:        VectorCopy(trace.endpos, goal);
                     44: 
                     45:        VectorMA(goal, 2, forward, goal);
                     46: 
                     47:        // pad for floors and ceilings
                     48:        VectorCopy(goal, o);
                     49:        o[2] += 6;
                     50:        trace = gi.trace(goal, vec3_origin, vec3_origin, o, targ, MASK_SOLID);
                     51:        if (trace.fraction < 1) {
                     52:                VectorCopy(trace.endpos, goal);
                     53:                goal[2] -= 6;
                     54:        }
                     55: 
                     56:        VectorCopy(goal, o);
                     57:        o[2] -= 6;
                     58:        trace = gi.trace(goal, vec3_origin, vec3_origin, o, targ, MASK_SOLID);
                     59:        if (trace.fraction < 1) {
                     60:                VectorCopy(trace.endpos, goal);
                     61:                goal[2] += 6;
                     62:        }
                     63: 
                     64:        ent->client->ps.pmove.pm_type = PM_FREEZE;
                     65: 
                     66:        VectorCopy(goal, ent->s.origin);
                     67:        for (i=0 ; i<3 ; i++)
                     68:                ent->client->ps.pmove.delta_angles[i] = ANGLE2SHORT(targ->client->v_angle[i] - ent->client->resp.cmd_angles[i]);
                     69: 
                     70:        VectorCopy(targ->client->v_angle, ent->client->ps.viewangles);
                     71:        VectorCopy(targ->client->v_angle, ent->client->v_angle);
                     72: 
                     73:        ent->viewheight = 0;
                     74:        ent->client->ps.pmove.pm_flags |= PMF_NO_PREDICTION;
                     75:        gi.linkentity(ent);
                     76: 
                     77:        if ((!ent->client->showscores && !ent->client->menu &&
                     78:                !ent->client->showinventory && !ent->client->showhelp &&
                     79:                !(level.framenum & 31)) || ent->client->update_chase) {
                     80:                char s[1024];
                     81: 
                     82:                ent->client->update_chase = false;
                     83:                sprintf(s, "xv 0 yb -68 string2 \"Chasing %s\"",
                     84:                        targ->client->pers.netname);
                     85:                gi.WriteByte (svc_layout);
                     86:                gi.WriteString (s);
                     87:                gi.unicast(ent, false);
                     88:        }
                     89: 
                     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->solid != SOLID_NOT)
                    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->solid != SOLID_NOT)
                    133:                        break;
                    134:        } while (e != ent->client->chase_target);
                    135: 
                    136:        ent->client->chase_target = e;
                    137:        ent->client->update_chase = true;
                    138: }

unix.superglobalmegacorp.com

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