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

1.1       root        1: #include "g_local.h"
                      2: 
                      3: //==========================================================
                      4: 
                      5: /*QUAKED target_steam (1 0 0) (-8 -8 -8) (8 8 8)
                      6: Creates a steam effect (particles w/ velocity in a line).
                      7: 
                      8:   speed = velocity of particles (default 50)
                      9:   count = number of particles (default 32)
                     10:   sounds = color of particles (default 8 for steam)
                     11:      the color range is from this color to this color + 6
                     12:   wait = seconds to run before stopping (overrides default
                     13:      value derived from func_timer)
                     14: 
                     15:   best way to use this is to tie it to a func_timer that "pokes"
                     16:   it every second (or however long you set the wait time, above)
                     17: 
                     18:   note that the width of the base is proportional to the speed
                     19:   good colors to use:
                     20:   6-9 - varying whites (darker to brighter)
                     21:   224 - sparks
                     22:   176 - blue water
                     23:   80  - brown water
                     24:   208 - slime
                     25:   232 - blood
                     26: */
                     27: 
                     28: void use_target_steam (edict_t *self, edict_t *other, edict_t *activator)
                     29: {
                     30:        // FIXME - this needs to be a global
                     31:        static int      nextid;
                     32:        vec3_t          point;
                     33: 
                     34:        if (nextid > 20000)
                     35:                nextid = nextid %20000;
                     36: 
                     37:        nextid++;
                     38:        
                     39:        // automagically set wait from func_timer unless they set it already, or
                     40:        // default to 1000 if not called by a func_timer (eek!)
                     41:        if (!self->wait)
                     42:                if (other)
                     43:                        self->wait = other->wait * 1000;
                     44:                else
                     45:                        self->wait = 1000;
                     46: 
                     47:        if (self->enemy)
                     48:        {
                     49:                VectorMA (self->enemy->absmin, 0.5, self->enemy->size, point);
                     50:                VectorSubtract (point, self->s.origin, self->movedir);
                     51:                VectorNormalize (self->movedir);
                     52:        }
                     53: 
                     54:        VectorMA (self->s.origin, self->plat2flags*0.5, self->movedir, point);
                     55:        if (self->wait > 100)
                     56:        {
                     57:                gi.WriteByte (svc_temp_entity);
                     58:                gi.WriteByte (TE_STEAM);
                     59:                gi.WriteShort (nextid);
                     60:                gi.WriteByte (self->count);
                     61:                gi.WritePosition (self->s.origin);
                     62:                gi.WriteDir (self->movedir);
                     63:                gi.WriteByte (self->sounds&0xff);
                     64:                gi.WriteShort ( (short int)(self->plat2flags) );
                     65:                gi.WriteLong ( (int)(self->wait) );
                     66:                gi.multicast (self->s.origin, MULTICAST_PVS);
                     67:        }
                     68:        else
                     69:        {
                     70:                gi.WriteByte (svc_temp_entity);
                     71:                gi.WriteByte (TE_STEAM);
                     72:                gi.WriteShort ((short int)-1);
                     73:                gi.WriteByte (self->count);
                     74:                gi.WritePosition (self->s.origin);
                     75:                gi.WriteDir (self->movedir);
                     76:                gi.WriteByte (self->sounds&0xff);
                     77:                gi.WriteShort ( (short int)(self->plat2flags) );
                     78:                gi.multicast (self->s.origin, MULTICAST_PVS);
                     79:        }
                     80: }
                     81: 
                     82: void target_steam_start (edict_t *self)
                     83: {
                     84:        edict_t *ent;
                     85: 
                     86:        self->use = use_target_steam;
                     87: 
                     88:        if (self->target)
                     89:        {
                     90:                ent = G_Find (NULL, FOFS(targetname), self->target);
                     91:                if (!ent)
                     92:                        gi.dprintf ("%s at %s: %s is a bad target\n", self->classname, vtos(self->s.origin), self->target);
                     93:                self->enemy = ent;
                     94:        }
                     95:        else
                     96:        {
                     97:                G_SetMovedir (self->s.angles, self->movedir);
                     98:        }
                     99: 
                    100:        if (!self->count)
                    101:                self->count = 32;
                    102:        if (!self->plat2flags)
                    103:                self->plat2flags = 75;
                    104:        if (!self->sounds)
                    105:                self->sounds = 8;
                    106:        if (self->wait)
                    107:                self->wait *= 1000;  // we want it in milliseconds, not seconds
                    108: 
                    109:        // paranoia is good
                    110:        self->sounds &= 0xff;
                    111:        self->count &= 0xff;
                    112: 
                    113:        self->svflags = SVF_NOCLIENT;
                    114: 
                    115:        gi.linkentity (self);
                    116: }
                    117: 
                    118: void SP_target_steam (edict_t *self)
                    119: {
                    120:        self->plat2flags = self->speed;
                    121: 
                    122:        if (self->target)
                    123:        {
                    124:                self->think = target_steam_start;
                    125:                self->nextthink = level.time + 1;
                    126:        }
                    127:        else
                    128:                target_steam_start (self);
                    129: }
                    130: 
                    131: 
                    132: //==========================================================
                    133: // target_anger
                    134: //==========================================================
                    135: 
                    136: void target_anger_use (edict_t *self, edict_t *other, edict_t *activator)
                    137: {
                    138:        edict_t         *target;
                    139:        edict_t         *t;
                    140: 
                    141:        t = NULL;
                    142:        target = G_Find (t, FOFS(targetname), self->killtarget);
                    143: 
                    144:        if (target && self->target)
                    145:        {
                    146:                // Make whatever a "good guy" so the monster will try to kill it!
                    147:                target->monsterinfo.aiflags |= AI_GOOD_GUY;
                    148:                target->svflags |= SVF_MONSTER;
                    149:                target->health = 300;
                    150: 
                    151:                t = NULL;
                    152:                while ((t = G_Find (t, FOFS(targetname), self->target)))
                    153:                {
                    154:                        if (t == self)
                    155:                        {
                    156:                                gi.dprintf ("WARNING: entity used itself.\n");
                    157:                        }
                    158:                        else
                    159:                        {
                    160:                                if (t->use)
                    161:                                {
                    162:                                        if (t->health < 0)
                    163:                                        {
                    164:                                                if ((g_showlogic) && (g_showlogic->value))
                    165:                                                        gi.dprintf ("target_anger with dead monster!\n");
                    166:                                                return;
                    167:                                        }
                    168:                                        t->enemy = target;
                    169:                                        t->monsterinfo.aiflags |= AI_TARGET_ANGER;
                    170:                                        FoundTarget (t);
                    171:                                }
                    172:                        }
                    173:                        if (!self->inuse)
                    174:                        {
                    175:                                gi.dprintf("entity was removed while using targets\n");
                    176:                                return;
                    177:                        }
                    178:                }
                    179:        }
                    180: 
                    181: }
                    182: 
                    183: /*QUAKED target_anger (1 0 0) (-8 -8 -8) (8 8 8)
                    184: This trigger will cause an entity to be angry at another entity when a player touches it. Target the
                    185: entity you want to anger, and killtarget the entity you want it to be angry at.
                    186: 
                    187: target - entity to piss off
                    188: killtarget - entity to be pissed off at
                    189: */
                    190: void SP_target_anger (edict_t *self)
                    191: {      
                    192:        if (!self->target)
                    193:        {
                    194:                gi.dprintf("target_anger without target!\n");
                    195:                G_FreeEdict (self);
                    196:                return;
                    197:        }
                    198:        if (!self->killtarget)
                    199:        {
                    200:                gi.dprintf("target_anger without killtarget!\n");
                    201:                G_FreeEdict (self);
                    202:                return;
                    203:        }
                    204: 
                    205:        self->use = target_anger_use;
                    206:        self->svflags = SVF_NOCLIENT;
                    207: }
                    208: 
                    209: // ================
                    210: // target_spawn
                    211: // ================
                    212: /*
                    213: extern edict_t *CreateMonster(vec3_t origin, vec3_t angles, char *classname);
                    214: 
                    215: void target_spawn_use (edict_t *self, edict_t *other, edict_t *activator)
                    216: {
                    217:        edict_t         *newEnt;
                    218: 
                    219:        newEnt = CreateMonster (self->s.origin, self->s.angles, "monster_infantry");
                    220:        if(newEnt)
                    221:                newEnt->enemy = other;
                    222: }
                    223: */
                    224: 
                    225: /*Q U AKED target_spawn (1 0 0) (-32 -32 -24) (32 32 72) 
                    226: */
                    227: /*
                    228: void SP_target_spawn (edict_t *self)
                    229: {
                    230:        self->use = target_spawn_use;
                    231:        self->svflags = SVF_NOCLIENT;
                    232: }
                    233: */
                    234: 
                    235: // ***********************************
                    236: // target_killplayers
                    237: // ***********************************
                    238: 
                    239: void target_killplayers_use (edict_t *self, edict_t *other, edict_t *activator)
                    240: {
                    241:        int             i;
                    242:        edict_t *ent, *player;
                    243: 
                    244:        // kill the players
                    245:        for (i=0 ; i<game.maxclients ; i++)
                    246:        {
                    247:                player = &g_edicts[1+i];
                    248:                if (!player->inuse)
                    249:                        continue;
                    250: 
                    251:                // nail it
                    252:                T_Damage (player, self, self, vec3_origin, self->s.origin, vec3_origin, 100000, 0, DAMAGE_NO_PROTECTION, MOD_TELEFRAG);
                    253:        }
                    254: 
                    255:        // kill any visible monsters
                    256:        for (ent = g_edicts; ent < &g_edicts[globals.num_edicts] ; ent++)
                    257:        {
                    258:                if (!ent->inuse)
                    259:                        continue;
                    260:                if (ent->health < 1)
                    261:                        continue;
                    262:                if (!ent->takedamage)
                    263:                        continue;
                    264:                
                    265:                for(i=0;i<game.maxclients ; i++)
                    266:                {
                    267:                        player = &g_edicts[1+i];
                    268:                        if(!player->inuse)
                    269:                                continue;
                    270:                        
                    271:                        if(visible(player, ent))
                    272:                        {
                    273:                                T_Damage (ent, self, self, vec3_origin, ent->s.origin, vec3_origin, 
                    274:                                                        ent->health, 0, DAMAGE_NO_PROTECTION, MOD_TELEFRAG);
                    275:                                break;
                    276:                        }
                    277:                }
                    278:        }
                    279: 
                    280: }
                    281: 
                    282: /*QUAKED target_killplayers (1 0 0) (-8 -8 -8) (8 8 8)
                    283: When triggered, this will kill all the players on the map.
                    284: */
                    285: void SP_target_killplayers (edict_t *self)
                    286: {
                    287:        self->use = target_killplayers_use;
                    288:        self->svflags = SVF_NOCLIENT;
                    289: }
                    290: 
                    291: /*QUAKED target_blacklight (1 0 1) (-16 -16 -24) (16 16 24) 
                    292: Pulsing black light with sphere in the center
                    293: */
                    294: void blacklight_think (edict_t *self)
                    295: {
                    296:        self->s.angles[0] = rand()%360;
                    297:        self->s.angles[1] = rand()%360;
                    298:        self->s.angles[2] = rand()%360;
                    299:        self->nextthink = level.time + 0.1;
                    300: }
                    301: 
                    302: void SP_target_blacklight(edict_t *ent)
                    303: {
                    304:        if (deathmatch->value)
                    305:        {       // auto-remove for deathmatch
                    306:                G_FreeEdict (ent);
                    307:                return;
                    308:        }
                    309: 
                    310:        VectorClear (ent->mins);
                    311:        VectorClear (ent->maxs);
                    312: 
                    313:        ent->s.effects |= (EF_TRACKERTRAIL|EF_TRACKER);
                    314:        ent->think = blacklight_think;
                    315:        ent->s.modelindex = gi.modelindex ("models/items/spawngro2/tris.md2");
                    316:        ent->s.frame = 1;
                    317:        ent->nextthink = level.time + 0.1;
                    318:        gi.linkentity (ent);
                    319: }
                    320: 
                    321: /*QUAKED target_orb (1 0 1) (-16 -16 -24) (16 16 24) 
                    322: Translucent pulsing orb with speckles
                    323: */
                    324: void orb_think (edict_t *self)
                    325: {
                    326:        self->s.angles[0] = rand()%360;
                    327:        self->s.angles[1] = rand()%360;
                    328:        self->s.angles[2] = rand()%360;
                    329: //     self->s.effects |= (EF_TRACKERTRAIL|EF_DOUBLE);
                    330:        self->nextthink = level.time + 0.1;
                    331: }
                    332: 
                    333: void SP_target_orb(edict_t *ent)
                    334: {
                    335:        if (deathmatch->value)
                    336:        {       // auto-remove for deathmatch
                    337:                G_FreeEdict (ent);
                    338:                return;
                    339:        }
                    340: 
                    341:        VectorClear (ent->mins);
                    342:        VectorClear (ent->maxs);
                    343: 
                    344: //     ent->s.effects |= EF_TRACKERTRAIL;
                    345:        ent->think = orb_think;
                    346:        ent->nextthink = level.time + 0.1;
                    347:        ent->s.modelindex = gi.modelindex ("models/items/spawngro2/tris.md2");
                    348:        ent->s.frame = 2;
                    349:        ent->s.effects |= EF_SPHERETRANS;
                    350:        gi.linkentity (ent);
                    351: }
                    352: 

unix.superglobalmegacorp.com

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