Annotation of quake2/rogue/g_newtrig.c, revision 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.