Annotation of quake2/rogue/g_newtrig.c, revision 1.1.1.1

1.1       root        1: // g_newtrig.c
                      2: // pmack
                      3: // october 1997
                      4: 
                      5: #include "g_local.h"
                      6: 
                      7: #define TELEPORT_PLAYER_ONLY   1
                      8: #define TELEPORT_SILENT                        2
                      9: #define TELEPORT_CTF_ONLY              4
                     10: #define TELEPORT_START_ON              8
                     11: 
                     12: extern void TeleportEffect (vec3_t origin);
                     13: 
                     14: /*QUAKED info_teleport_destination (.5 .5 .5) (-16 -16 -24) (16 16 32)
                     15: Destination marker for a teleporter.
                     16: */
                     17: void SP_info_teleport_destination (edict_t *self)
                     18: {
                     19: }
                     20: 
                     21: /*QUAKED trigger_teleport (.5 .5 .5) ? player_only silent ctf_only start_on
                     22: Any object touching this will be transported to the corresponding 
                     23: info_teleport_destination entity. You must set the "target" field, 
                     24: and create an object with a "targetname" field that matches.
                     25: 
                     26: If the trigger_teleport has a targetname, it will only teleport 
                     27: entities when it has been fired.
                     28: 
                     29: player_only: only players are teleported
                     30: silent: <not used right now>
                     31: ctf_only: <not used right now>
                     32: start_on: when trigger has targetname, start active, deactivate when used.
                     33: */
                     34: void trigger_teleport_touch(edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
                     35: {
                     36:        edict_t *dest;
                     37:        int             i;
                     38: 
                     39:        if(/*(self->spawnflags & TELEPORT_PLAYER_ONLY) &&*/ !(other->client))
                     40:                return;
                     41: 
                     42:        if(self->delay)
                     43:                return;
                     44: 
                     45:        dest = G_Find (NULL, FOFS(targetname), self->target);
                     46:        if(!dest)
                     47:        {
                     48:                gi.dprintf("Teleport Destination not found!\n");
                     49:                return;
                     50:        }
                     51: 
                     52:        gi.WriteByte (svc_temp_entity);
                     53:        gi.WriteByte (TE_TELEPORT_EFFECT);
                     54:        gi.WritePosition (other->s.origin);
                     55:        gi.multicast (other->s.origin, MULTICAST_PVS);
                     56: 
                     57:        // unlink to make sure it can't possibly interfere with KillBox
                     58:        gi.unlinkentity (other);
                     59: 
                     60:        VectorCopy (dest->s.origin, other->s.origin);
                     61:        VectorCopy (dest->s.origin, other->s.old_origin);
                     62:        other->s.origin[2] += 10;
                     63: 
                     64:        // clear the velocity and hold them in place briefly
                     65:        VectorClear (other->velocity);
                     66:        if(other->client)
                     67:        {
                     68:                other->client->ps.pmove.pm_time = 160>>3;               // hold time
                     69:                other->client->ps.pmove.pm_flags |= PMF_TIME_TELEPORT;
                     70: 
                     71:                // draw the teleport splash at source and on the player
                     72: //             self->s.event = EV_PLAYER_TELEPORT;
                     73:                other->s.event = EV_PLAYER_TELEPORT;
                     74: 
                     75:                // set angles
                     76:                for (i=0 ; i<3 ; i++)
                     77:                        other->client->ps.pmove.delta_angles[i] = ANGLE2SHORT(dest->s.angles[i] - other->client->resp.cmd_angles[i]);
                     78: 
                     79:                VectorClear (other->client->ps.viewangles);
                     80:                VectorClear (other->client->v_angle);
                     81:        }
                     82: 
                     83: 
                     84:        VectorClear (other->s.angles);
                     85: 
                     86:        // kill anything at the destination
                     87:        KillBox (other);
                     88: 
                     89:        gi.linkentity (other);
                     90: }
                     91: 
                     92: void trigger_teleport_use (edict_t *self, edict_t *other, edict_t *activator)
                     93: {
                     94:        if(self->delay)
                     95:                self->delay = 0;
                     96:        else
                     97:                self->delay = 1;
                     98: }
                     99: 
                    100: void SP_trigger_teleport(edict_t *self)
                    101: {
                    102:        if (!self->wait)
                    103:                self->wait = 0.2;
                    104: 
                    105:        self->delay = 0;
                    106:                
                    107:        if (self->targetname)
                    108:        {
                    109:                self->use = trigger_teleport_use;
                    110:                if(!(self->spawnflags & TELEPORT_START_ON))
                    111:                        self->delay = 1;
                    112:        }
                    113: 
                    114:        self->touch = trigger_teleport_touch;
                    115: 
                    116:        self->solid = SOLID_TRIGGER;
                    117:        self->movetype = MOVETYPE_NONE;
                    118: //     self->flags |= FL_NOCLIENT;
                    119: 
                    120:        if (!VectorCompare(self->s.angles, vec3_origin))
                    121:                G_SetMovedir (self->s.angles, self->movedir);
                    122: 
                    123:        gi.setmodel (self, self->model);
                    124:        gi.linkentity (self);
                    125: }
                    126: 
                    127: // ***************************
                    128: // TRIGGER_DISGUISE
                    129: // ***************************
                    130: 
                    131: /*QUAKED trigger_disguise (.5 .5 .5) ? TOGGLE START_ON REMOVE
                    132: Anything passing through this trigger when it is active will
                    133: be marked as disguised.
                    134: 
                    135: TOGGLE - field is turned off and on when used.
                    136: START_ON - field is active when spawned.
                    137: REMOVE - field removes the disguise
                    138: */
                    139: 
                    140: void trigger_disguise_touch(edict_t *self, edict_t *other, cplane_t *plane, csurface_t *surf)
                    141: {
                    142:        if (other->client)
                    143:        {
                    144:                if(self->spawnflags & 4)
                    145:                        other->flags &= ~FL_DISGUISED;
                    146:                else
                    147:                        other->flags |= FL_DISGUISED;
                    148:        }
                    149: }
                    150: 
                    151: void trigger_disguise_use (edict_t *self, edict_t *other, edict_t *activator)
                    152: {
                    153:        if(self->solid == SOLID_NOT)
                    154:                self->solid = SOLID_TRIGGER;
                    155:        else
                    156:                self->solid = SOLID_NOT;
                    157: 
                    158:        gi.linkentity(self);
                    159: }
                    160: 
                    161: void SP_trigger_disguise (edict_t *self)
                    162: {
                    163:        if(self->spawnflags & 2)
                    164:                self->solid = SOLID_TRIGGER;
                    165:        else
                    166:                self->solid = SOLID_NOT;
                    167: 
                    168:        self->touch = trigger_disguise_touch;
                    169:        self->use = trigger_disguise_use;
                    170:        self->movetype = MOVETYPE_NONE;
                    171:        self->svflags = SVF_NOCLIENT;
                    172: 
                    173:        gi.setmodel (self, self->model);
                    174:        gi.linkentity(self);
                    175: 
                    176: }

unix.superglobalmegacorp.com

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