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

1.1       root        1: #include "g_local.h"
                      2: 
                      3: 
                      4: qboolean       Pickup_Weapon (edict_t *ent, edict_t *other);
                      5: void           Use_Weapon (edict_t *ent, gitem_t *inv);
                      6: void           Drop_Weapon (edict_t *ent, gitem_t *inv);
                      7: 
                      8: void Weapon_Blaster (edict_t *ent);
                      9: void Weapon_Shotgun (edict_t *ent);
                     10: void Weapon_SuperShotgun (edict_t *ent);
                     11: void Weapon_Machinegun (edict_t *ent);
                     12: void Weapon_Chaingun (edict_t *ent);
                     13: void Weapon_HyperBlaster (edict_t *ent);
                     14: void Weapon_RocketLauncher (edict_t *ent);
                     15: void Weapon_Grenade (edict_t *ent);
                     16: void Weapon_GrenadeLauncher (edict_t *ent);
                     17: void Weapon_Railgun (edict_t *ent);
                     18: void Weapon_BFG (edict_t *ent);
                     19: 
                     20: //=========
                     21: //Rogue Weapons
                     22: void Weapon_ChainFist (edict_t *ent);
                     23: void Weapon_Disintegrator (edict_t *ent);
                     24: void Weapon_ETF_Rifle (edict_t *ent);
                     25: void Weapon_Heatbeam (edict_t *ent);
                     26: void Weapon_Prox (edict_t *ent);
                     27: void Weapon_Tesla (edict_t *ent);
                     28: void Weapon_ProxLauncher (edict_t *ent);
                     29: //void Weapon_Nuke (edict_t *ent);
                     30: //Rogue Weapons
                     31: //=========
                     32: 
                     33: gitem_armor_t jacketarmor_info = { 25,  50, .30, .00, ARMOR_JACKET};
                     34: gitem_armor_t combatarmor_info = { 50, 100, .60, .30, ARMOR_COMBAT};
                     35: gitem_armor_t bodyarmor_info   = {100, 200, .80, .60, ARMOR_BODY};
                     36: 
                     37: static int     jacket_armor_index;
                     38: static int     combat_armor_index;
                     39: static int     body_armor_index;
                     40: static int     power_screen_index;
                     41: static int     power_shield_index;
                     42: 
                     43: #define HEALTH_IGNORE_MAX      1
                     44: #define HEALTH_TIMED           2
                     45: 
                     46: void Use_Quad (edict_t *ent, gitem_t *item);
                     47: static int     quad_drop_timeout_hack;
                     48: 
                     49: //======================================================================
                     50: 
                     51: /*
                     52: ===============
                     53: GetItemByIndex
                     54: ===============
                     55: */
                     56: gitem_t        *GetItemByIndex (int index)
                     57: {
                     58:        if (index == 0 || index >= game.num_items)
                     59:                return NULL;
                     60: 
                     61:        return &itemlist[index];
                     62: }
                     63: 
                     64: 
                     65: /*
                     66: ===============
                     67: FindItemByClassname
                     68: 
                     69: ===============
                     70: */
                     71: gitem_t        *FindItemByClassname (char *classname)
                     72: {
                     73:        int             i;
                     74:        gitem_t *it;
                     75: 
                     76:        it = itemlist;
                     77:        for (i=0 ; i<game.num_items ; i++, it++)
                     78:        {
                     79:                if (!it->classname)
                     80:                        continue;
                     81:                if (!Q_stricmp(it->classname, classname))
                     82:                        return it;
                     83:        }
                     84: 
                     85:        return NULL;
                     86: }
                     87: 
                     88: /*
                     89: ===============
                     90: FindItem
                     91: 
                     92: ===============
                     93: */
                     94: gitem_t        *FindItem (char *pickup_name)
                     95: {
                     96:        int             i;
                     97:        gitem_t *it;
                     98: 
                     99:        it = itemlist;
                    100:        for (i=0 ; i<game.num_items ; i++, it++)
                    101:        {
                    102:                if (!it->pickup_name)
                    103:                        continue;
                    104:                if (!Q_stricmp(it->pickup_name, pickup_name))
                    105:                        return it;
                    106:        }
                    107: 
                    108:        return NULL;
                    109: }
                    110: 
                    111: //======================================================================
                    112: 
                    113: void DoRespawn (edict_t *ent)
                    114: {
                    115:        if (ent->team)
                    116:        {
                    117:                edict_t *master;
                    118:                int     count;
                    119:                int choice;
                    120: 
                    121:                master = ent->teammaster;
                    122: 
                    123:                for (count = 0, ent = master; ent; ent = ent->chain, count++)
                    124:                        ;
                    125: 
                    126:                choice = rand() % count;
                    127: 
                    128:                for (count = 0, ent = master; count < choice; ent = ent->chain, count++)
                    129:                        ;
                    130:        }
                    131: 
                    132: //=====
                    133: //ROGUE
                    134:        if(randomrespawn && randomrespawn->value)
                    135:        {
                    136:                edict_t *newEnt;
                    137: 
                    138:                newEnt = DoRandomRespawn (ent);
                    139:                
                    140:                // if we've changed entities, then do some sleight of hand.
                    141:                // otherwise, the old entity will respawn
                    142:                if(newEnt)
                    143:                {
                    144:                        G_FreeEdict (ent);
                    145:                        ent = newEnt;
                    146:                }
                    147:        }
                    148: //ROGUE
                    149: //=====
                    150: 
                    151:        ent->svflags &= ~SVF_NOCLIENT;
                    152:        ent->solid = SOLID_TRIGGER;
                    153:        gi.linkentity (ent);
                    154: 
                    155:        // send an effect
                    156:        ent->s.event = EV_ITEM_RESPAWN;
                    157: }
                    158: 
                    159: void SetRespawn (edict_t *ent, float delay)
                    160: {
                    161:        ent->flags |= FL_RESPAWN;
                    162:        ent->svflags |= SVF_NOCLIENT;
                    163:        ent->solid = SOLID_NOT;
                    164:        ent->nextthink = level.time + delay;
                    165:        ent->think = DoRespawn;
                    166:        gi.linkentity (ent);
                    167: }
                    168: 
                    169: 
                    170: //======================================================================
                    171: 
                    172: qboolean Pickup_Powerup (edict_t *ent, edict_t *other)
                    173: {
                    174:        int             quantity;
                    175: 
                    176:        quantity = other->client->pers.inventory[ITEM_INDEX(ent->item)];
                    177:        if ((skill->value == 1 && quantity >= 2) || (skill->value >= 2 && quantity >= 1))
                    178:                return false;
                    179: 
                    180:        if ((coop->value) && (ent->item->flags & IT_STAY_COOP) && (quantity > 0))
                    181:                return false;
                    182: 
                    183:        other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
                    184: 
                    185:        if (deathmatch->value)
                    186:        {
                    187:                if (!(ent->spawnflags & DROPPED_ITEM) )
                    188:                        SetRespawn (ent, ent->item->quantity);
                    189:                if (((int)dmflags->value & DF_INSTANT_ITEMS) || ((ent->item->use == Use_Quad) && (ent->spawnflags & DROPPED_PLAYER_ITEM)))
                    190:                {
                    191:                        if ((ent->item->use == Use_Quad) && (ent->spawnflags & DROPPED_PLAYER_ITEM))
                    192:                                quad_drop_timeout_hack = (ent->nextthink - level.time) / FRAMETIME;
                    193: //PGM
                    194:                        if(ent->item->use)
                    195:                                ent->item->use (other, ent->item);
                    196:                        else
                    197:                                gi.dprintf("Powerup has no use function!\n");
                    198: //PGM
                    199:                }
                    200:        }
                    201: 
                    202:        return true;
                    203: }
                    204: 
                    205: void Drop_General (edict_t *ent, gitem_t *item)
                    206: {
                    207:        Drop_Item (ent, item);
                    208:        ent->client->pers.inventory[ITEM_INDEX(item)]--;
                    209:        ValidateSelectedItem (ent);
                    210: }
                    211: 
                    212: 
                    213: //======================================================================
                    214: 
                    215: qboolean Pickup_Adrenaline (edict_t *ent, edict_t *other)
                    216: {
                    217:        if (!deathmatch->value)
                    218:                other->max_health += 1;
                    219: 
                    220:        if (other->health < other->max_health)
                    221:                other->health = other->max_health;
                    222: 
                    223:        if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
                    224:                SetRespawn (ent, ent->item->quantity);
                    225: 
                    226:        return true;
                    227: }
                    228: 
                    229: qboolean Pickup_AncientHead (edict_t *ent, edict_t *other)
                    230: {
                    231:        other->max_health += 2;
                    232: 
                    233:        if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
                    234:                SetRespawn (ent, ent->item->quantity);
                    235: 
                    236:        return true;
                    237: }
                    238: 
                    239: qboolean Pickup_Bandolier (edict_t *ent, edict_t *other)
                    240: {
                    241:        gitem_t *item;
                    242:        int             index;
                    243: 
                    244:        if (other->client->pers.max_bullets < 250)
                    245:                other->client->pers.max_bullets = 250;
                    246:        if (other->client->pers.max_shells < 150)
                    247:                other->client->pers.max_shells = 150;
                    248:        if (other->client->pers.max_cells < 250)
                    249:                other->client->pers.max_cells = 250;
                    250:        if (other->client->pers.max_slugs < 75)
                    251:                other->client->pers.max_slugs = 75;
                    252:        //PMM
                    253:        if (other->client->pers.max_flechettes < 250)
                    254:                other->client->pers.max_flechettes = 250;
                    255: #ifndef KILL_DISRUPTOR
                    256:        if (other->client->pers.max_rounds < 150)
                    257:                other->client->pers.max_rounds = 150;
                    258: #endif
                    259:        //pmm
                    260: 
                    261:        item = FindItem("Bullets");
                    262:        if (item)
                    263:        {
                    264:                index = ITEM_INDEX(item);
                    265:                other->client->pers.inventory[index] += item->quantity;
                    266:                if (other->client->pers.inventory[index] > other->client->pers.max_bullets)
                    267:                        other->client->pers.inventory[index] = other->client->pers.max_bullets;
                    268:        }
                    269: 
                    270:        item = FindItem("Shells");
                    271:        if (item)
                    272:        {
                    273:                index = ITEM_INDEX(item);
                    274:                other->client->pers.inventory[index] += item->quantity;
                    275:                if (other->client->pers.inventory[index] > other->client->pers.max_shells)
                    276:                        other->client->pers.inventory[index] = other->client->pers.max_shells;
                    277:        }
                    278: 
                    279:        if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
                    280:                SetRespawn (ent, ent->item->quantity);
                    281: 
                    282:        return true;
                    283: }
                    284: 
                    285: qboolean Pickup_Pack (edict_t *ent, edict_t *other)
                    286: {
                    287:        gitem_t *item;
                    288:        int             index;
                    289: 
                    290:        if (other->client->pers.max_bullets < 300)
                    291:                other->client->pers.max_bullets = 300;
                    292:        if (other->client->pers.max_shells < 200)
                    293:                other->client->pers.max_shells = 200;
                    294:        if (other->client->pers.max_rockets < 100)
                    295:                other->client->pers.max_rockets = 100;
                    296:        if (other->client->pers.max_grenades < 100)
                    297:                other->client->pers.max_grenades = 100;
                    298:        if (other->client->pers.max_cells < 300)
                    299:                other->client->pers.max_cells = 300;
                    300:        if (other->client->pers.max_slugs < 100)
                    301:                other->client->pers.max_slugs = 100;
                    302:        //PMM
                    303:        if (other->client->pers.max_flechettes < 200)
                    304:                other->client->pers.max_flechettes = 200;
                    305: #ifndef KILL_DISRUPTOR
                    306:        if (other->client->pers.max_rounds < 200)
                    307:                other->client->pers.max_rounds = 200;
                    308: #endif
                    309:        //pmm
                    310: 
                    311:        item = FindItem("Bullets");
                    312:        if (item)
                    313:        {
                    314:                index = ITEM_INDEX(item);
                    315:                other->client->pers.inventory[index] += item->quantity;
                    316:                if (other->client->pers.inventory[index] > other->client->pers.max_bullets)
                    317:                        other->client->pers.inventory[index] = other->client->pers.max_bullets;
                    318:        }
                    319: 
                    320:        item = FindItem("Shells");
                    321:        if (item)
                    322:        {
                    323:                index = ITEM_INDEX(item);
                    324:                other->client->pers.inventory[index] += item->quantity;
                    325:                if (other->client->pers.inventory[index] > other->client->pers.max_shells)
                    326:                        other->client->pers.inventory[index] = other->client->pers.max_shells;
                    327:        }
                    328: 
                    329:        item = FindItem("Cells");
                    330:        if (item)
                    331:        {
                    332:                index = ITEM_INDEX(item);
                    333:                other->client->pers.inventory[index] += item->quantity;
                    334:                if (other->client->pers.inventory[index] > other->client->pers.max_cells)
                    335:                        other->client->pers.inventory[index] = other->client->pers.max_cells;
                    336:        }
                    337: 
                    338:        item = FindItem("Grenades");
                    339:        if (item)
                    340:        {
                    341:                index = ITEM_INDEX(item);
                    342:                other->client->pers.inventory[index] += item->quantity;
                    343:                if (other->client->pers.inventory[index] > other->client->pers.max_grenades)
                    344:                        other->client->pers.inventory[index] = other->client->pers.max_grenades;
                    345:        }
                    346: 
                    347:        item = FindItem("Rockets");
                    348:        if (item)
                    349:        {
                    350:                index = ITEM_INDEX(item);
                    351:                other->client->pers.inventory[index] += item->quantity;
                    352:                if (other->client->pers.inventory[index] > other->client->pers.max_rockets)
                    353:                        other->client->pers.inventory[index] = other->client->pers.max_rockets;
                    354:        }
                    355: 
                    356:        item = FindItem("Slugs");
                    357:        if (item)
                    358:        {
                    359:                index = ITEM_INDEX(item);
                    360:                other->client->pers.inventory[index] += item->quantity;
                    361:                if (other->client->pers.inventory[index] > other->client->pers.max_slugs)
                    362:                        other->client->pers.inventory[index] = other->client->pers.max_slugs;
                    363:        }
                    364: //PMM
                    365:        item = FindItem("Flechettes");
                    366:        if (item)
                    367:        {
                    368:                index = ITEM_INDEX(item);
                    369:                other->client->pers.inventory[index] += item->quantity;
                    370:                if (other->client->pers.inventory[index] > other->client->pers.max_flechettes)
                    371:                        other->client->pers.inventory[index] = other->client->pers.max_flechettes;
                    372:        }
                    373: #ifndef KILL_DISRUPTOR
                    374:        item = FindItem("Rounds");
                    375:        if (item)
                    376:        {
                    377:                index = ITEM_INDEX(item);
                    378:                other->client->pers.inventory[index] += item->quantity;
                    379:                if (other->client->pers.inventory[index] > other->client->pers.max_rounds)
                    380:                        other->client->pers.inventory[index] = other->client->pers.max_rounds;
                    381:        }
                    382: #endif
                    383: //pmm
                    384:        if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
                    385:                SetRespawn (ent, ent->item->quantity);
                    386: 
                    387:        return true;
                    388: }
                    389: // ================
                    390: // PMM
                    391: qboolean Pickup_Nuke (edict_t *ent, edict_t *other)
                    392: {
                    393:        int             quantity;
                    394: 
                    395: //     if (!deathmatch->value)
                    396: //             return;
                    397:        quantity = other->client->pers.inventory[ITEM_INDEX(ent->item)];
                    398: //     if ((skill->value == 1 && quantity >= 2) || (skill->value >= 2 && quantity >= 1))
                    399: //             return false;
                    400: 
                    401:        if (quantity >= 1)
                    402:                return false;
                    403: 
                    404:        if ((coop->value) && (ent->item->flags & IT_STAY_COOP) && (quantity > 0))
                    405:                return false;
                    406: 
                    407:        other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
                    408: 
                    409:        if (deathmatch->value)
                    410:        {
                    411:                if (!(ent->spawnflags & DROPPED_ITEM) )
                    412:                        SetRespawn (ent, ent->item->quantity);
                    413:        }
                    414: 
                    415:        return true;
                    416: }
                    417: 
                    418: // ================
                    419: // PGM
                    420: void Use_IR (edict_t *ent, gitem_t *item)
                    421: {
                    422:        ent->client->pers.inventory[ITEM_INDEX(item)]--;
                    423:        ValidateSelectedItem (ent);
                    424: 
                    425:        if (ent->client->ir_framenum > level.framenum)
                    426:                ent->client->ir_framenum += 600;
                    427:        else
                    428:                ent->client->ir_framenum = level.framenum + 600;
                    429: 
                    430: //     FIXME - SOUND!
                    431: //     gi.sound(ent, CHAN_ITEM, gi.soundindex("items/damage.wav"), 1, ATTN_NORM, 0);
                    432: }
                    433: 
                    434: void Use_Double (edict_t *ent, gitem_t *item)
                    435: {
                    436:        ent->client->pers.inventory[ITEM_INDEX(item)]--;
                    437:        ValidateSelectedItem (ent);
                    438: 
                    439:        if (ent->client->double_framenum > level.framenum)
                    440:                ent->client->double_framenum += 300;
                    441:        else
                    442:                ent->client->double_framenum = level.framenum + 300;
                    443: 
                    444:        gi.sound(ent, CHAN_ITEM, gi.soundindex("items/damage.wav"), 1, ATTN_NORM, 0);
                    445: }
                    446: 
                    447: void Use_Torch (edict_t *ent, gitem_t *item)
                    448: {
                    449:        ent->client->torch_framenum = level.framenum + 600;
                    450: }
                    451: 
                    452: void Use_Compass (edict_t *ent, gitem_t *item)
                    453: {
                    454:        int ang;
                    455: 
                    456:        ang = (int)(ent->client->v_angle[1]);
                    457:        if(ang<0)
                    458:                ang += 360;
                    459: 
                    460:        gi.cprintf(ent, PRINT_HIGH, "Origin: %0.0f,%0.0f,%0.0f    Dir: %d\n", ent->s.origin[0], ent->s.origin[1],
                    461:                                ent->s.origin[2], ang);
                    462: }
                    463: 
                    464: void Use_Nuke (edict_t *ent, gitem_t *item)
                    465: {
                    466:        vec3_t  forward, right, start;
                    467:        float   speed;
                    468: 
                    469:        ent->client->pers.inventory[ITEM_INDEX(item)]--;
                    470:        ValidateSelectedItem (ent);
                    471: 
                    472:        AngleVectors (ent->client->v_angle, forward, right, NULL);
                    473: 
                    474:        VectorCopy (ent->s.origin, start);
                    475:        speed = 100;
                    476:        fire_nuke (ent, start, forward, speed);
                    477: }
                    478: 
                    479: void Use_Doppleganger (edict_t *ent, gitem_t *item)
                    480: {
                    481:        vec3_t          forward, right;
                    482:        vec3_t          createPt, spawnPt;
                    483:        vec3_t          ang;
                    484: 
                    485:        VectorClear(ang);
                    486:        ang[YAW] = ent->client->v_angle[YAW];
                    487:        AngleVectors (ang, forward, right, NULL);
                    488: 
                    489:        VectorMA(ent->s.origin, 48, forward, createPt);
                    490: 
                    491:        if(!FindSpawnPoint(createPt, ent->mins, ent->maxs, spawnPt, 32))
                    492:                return;
                    493: 
                    494:        if(!CheckGroundSpawnPoint(spawnPt, ent->mins, ent->maxs, 64, -1))
                    495:                return;
                    496: 
                    497:        ent->client->pers.inventory[ITEM_INDEX(item)]--;
                    498:        ValidateSelectedItem (ent);
                    499: 
                    500:        SpawnGrow_Spawn (spawnPt, 0);
                    501:        fire_doppleganger (ent, spawnPt, forward);
                    502: }
                    503: 
                    504: qboolean Pickup_Doppleganger (edict_t *ent, edict_t *other)
                    505: {
                    506:        int             quantity;
                    507: 
                    508:        if(!(deathmatch->value))                // item is DM only
                    509:                return false;
                    510: 
                    511:        quantity = other->client->pers.inventory[ITEM_INDEX(ent->item)];
                    512:        if (quantity >= 1)              // FIXME - apply max to dopplegangers
                    513:                return false;
                    514: 
                    515:        other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
                    516: 
                    517:        if (!(ent->spawnflags & DROPPED_ITEM) )
                    518:                SetRespawn (ent, ent->item->quantity);
                    519: 
                    520:        return true;
                    521: }
                    522: 
                    523: 
                    524: qboolean Pickup_Sphere (edict_t *ent, edict_t *other)
                    525: {
                    526:        int             quantity;
                    527: 
                    528:        if(other->client && other->client->owned_sphere)
                    529:        {
                    530: //             gi.cprintf(other, PRINT_HIGH, "Only one sphere to a customer!\n");
                    531:                return false;
                    532:        }
                    533: 
                    534:        quantity = other->client->pers.inventory[ITEM_INDEX(ent->item)];
                    535:        if ((skill->value == 1 && quantity >= 2) || (skill->value >= 2 && quantity >= 1))
                    536:                return false;
                    537: 
                    538:        if ((coop->value) && (ent->item->flags & IT_STAY_COOP) && (quantity > 0))
                    539:                return false;
                    540: 
                    541:        other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
                    542: 
                    543:        if (deathmatch->value)
                    544:        {
                    545:                if (!(ent->spawnflags & DROPPED_ITEM) )
                    546:                        SetRespawn (ent, ent->item->quantity);
                    547:                if (((int)dmflags->value & DF_INSTANT_ITEMS))
                    548:                {
                    549: //PGM
                    550:                        if(ent->item->use)
                    551:                                ent->item->use (other, ent->item);
                    552:                        else
                    553:                                gi.dprintf("Powerup has no use function!\n");
                    554: //PGM
                    555:                }
                    556:        }
                    557: 
                    558:        return true;
                    559: }
                    560: 
                    561: void Use_Defender (edict_t *ent, gitem_t *item)
                    562: {
                    563:        if(ent->client && ent->client->owned_sphere)
                    564:        {
                    565:                gi.cprintf(ent, PRINT_HIGH, "Only one sphere at a time!\n");
                    566:                return;
                    567:        }
                    568: 
                    569:        ent->client->pers.inventory[ITEM_INDEX(item)]--;
                    570:        ValidateSelectedItem (ent);
                    571: 
                    572:        Defender_Launch (ent);
                    573: }
                    574: 
                    575: void Use_Hunter (edict_t *ent, gitem_t *item)
                    576: {
                    577:        if(ent->client && ent->client->owned_sphere)
                    578:        {
                    579:                gi.cprintf(ent, PRINT_HIGH, "Only one sphere at a time!\n");
                    580:                return;
                    581:        }
                    582: 
                    583:        ent->client->pers.inventory[ITEM_INDEX(item)]--;
                    584:        ValidateSelectedItem (ent);
                    585: 
                    586:        Hunter_Launch (ent);
                    587: }
                    588: 
                    589: void Use_Vengeance (edict_t *ent, gitem_t *item)
                    590: {
                    591:        if(ent->client && ent->client->owned_sphere)
                    592:        {
                    593:                gi.cprintf(ent, PRINT_HIGH, "Only one sphere at a time!\n");
                    594:                return;
                    595:        }
                    596: 
                    597:        ent->client->pers.inventory[ITEM_INDEX(item)]--;
                    598:        ValidateSelectedItem (ent);
                    599: 
                    600:        Vengeance_Launch (ent);
                    601: }
                    602: 
                    603: // PGM
                    604: // ================
                    605: 
                    606: 
                    607: //======================================================================
                    608: 
                    609: void Use_Quad (edict_t *ent, gitem_t *item)
                    610: {
                    611:        int             timeout;
                    612: 
                    613:        ent->client->pers.inventory[ITEM_INDEX(item)]--;
                    614:        ValidateSelectedItem (ent);
                    615: 
                    616:        if (quad_drop_timeout_hack)
                    617:        {
                    618:                timeout = quad_drop_timeout_hack;
                    619:                quad_drop_timeout_hack = 0;
                    620:        }
                    621:        else
                    622:        {
                    623:                timeout = 300;
                    624:        }
                    625: 
                    626:        if (ent->client->quad_framenum > level.framenum)
                    627:                ent->client->quad_framenum += timeout;
                    628:        else
                    629:                ent->client->quad_framenum = level.framenum + timeout;
                    630: 
                    631:        gi.sound(ent, CHAN_ITEM, gi.soundindex("items/damage.wav"), 1, ATTN_NORM, 0);
                    632: }
                    633: 
                    634: //======================================================================
                    635: 
                    636: void Use_Breather (edict_t *ent, gitem_t *item)
                    637: {
                    638:        ent->client->pers.inventory[ITEM_INDEX(item)]--;
                    639:        ValidateSelectedItem (ent);
                    640: 
                    641:        if (ent->client->breather_framenum > level.framenum)
                    642:                ent->client->breather_framenum += 300;
                    643:        else
                    644:                ent->client->breather_framenum = level.framenum + 300;
                    645: 
                    646: //     gi.sound(ent, CHAN_ITEM, gi.soundindex("items/damage.wav"), 1, ATTN_NORM, 0);
                    647: }
                    648: 
                    649: //======================================================================
                    650: 
                    651: void Use_Envirosuit (edict_t *ent, gitem_t *item)
                    652: {
                    653:        ent->client->pers.inventory[ITEM_INDEX(item)]--;
                    654:        ValidateSelectedItem (ent);
                    655: 
                    656:        if (ent->client->enviro_framenum > level.framenum)
                    657:                ent->client->enviro_framenum += 300;
                    658:        else
                    659:                ent->client->enviro_framenum = level.framenum + 300;
                    660: 
                    661: //     gi.sound(ent, CHAN_ITEM, gi.soundindex("items/damage.wav"), 1, ATTN_NORM, 0);
                    662: }
                    663: 
                    664: //======================================================================
                    665: 
                    666: void   Use_Invulnerability (edict_t *ent, gitem_t *item)
                    667: {
                    668:        ent->client->pers.inventory[ITEM_INDEX(item)]--;
                    669:        ValidateSelectedItem (ent);
                    670: 
                    671:        if (ent->client->invincible_framenum > level.framenum)
                    672:                ent->client->invincible_framenum += 300;
                    673:        else
                    674:                ent->client->invincible_framenum = level.framenum + 300;
                    675: 
                    676:        gi.sound(ent, CHAN_ITEM, gi.soundindex("items/protect.wav"), 1, ATTN_NORM, 0);
                    677: }
                    678: 
                    679: //======================================================================
                    680: 
                    681: void   Use_Silencer (edict_t *ent, gitem_t *item)
                    682: {
                    683:        ent->client->pers.inventory[ITEM_INDEX(item)]--;
                    684:        ValidateSelectedItem (ent);
                    685:        ent->client->silencer_shots += 30;
                    686: 
                    687: //     gi.sound(ent, CHAN_ITEM, gi.soundindex("items/damage.wav"), 1, ATTN_NORM, 0);
                    688: }
                    689: 
                    690: //======================================================================
                    691: 
                    692: qboolean Pickup_Key (edict_t *ent, edict_t *other)
                    693: {
                    694:        if (coop->value)
                    695:        {
                    696:                if (strcmp(ent->classname, "key_power_cube") == 0)
                    697:                {
                    698:                        if (other->client->pers.power_cubes & ((ent->spawnflags & 0x0000ff00)>> 8))
                    699:                                return false;
                    700:                        other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
                    701:                        other->client->pers.power_cubes |= ((ent->spawnflags & 0x0000ff00) >> 8);
                    702:                }
                    703:                else
                    704:                {
                    705:                        if (other->client->pers.inventory[ITEM_INDEX(ent->item)])
                    706:                                return false;
                    707:                        other->client->pers.inventory[ITEM_INDEX(ent->item)] = 1;
                    708:                }
                    709:                return true;
                    710:        }
                    711:        other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
                    712:        return true;
                    713: }
                    714: 
                    715: //======================================================================
                    716: 
                    717: qboolean Add_Ammo (edict_t *ent, gitem_t *item, int count)
                    718: {
                    719:        int                     index;
                    720:        int                     max;
                    721: 
                    722:        if (!ent->client)
                    723:                return false;
                    724: 
                    725:        if (item->tag == AMMO_BULLETS)
                    726:                max = ent->client->pers.max_bullets;
                    727:        else if (item->tag == AMMO_SHELLS)
                    728:                max = ent->client->pers.max_shells;
                    729:        else if (item->tag == AMMO_ROCKETS)
                    730:                max = ent->client->pers.max_rockets;
                    731:        else if (item->tag == AMMO_GRENADES)
                    732:                max = ent->client->pers.max_grenades;
                    733:        else if (item->tag == AMMO_CELLS)
                    734:                max = ent->client->pers.max_cells;
                    735:        else if (item->tag == AMMO_SLUGS)
                    736:                max = ent->client->pers.max_slugs;
                    737: // ROGUE
                    738: //     else if (item->tag == AMMO_MINES)
                    739: //             max = ent->client->pers.max_mines;
                    740:        else if (item->tag == AMMO_FLECHETTES)
                    741:                max = ent->client->pers.max_flechettes;
                    742:        else if (item->tag == AMMO_PROX)
                    743:                max = ent->client->pers.max_prox;
                    744:        else if (item->tag == AMMO_TESLA)
                    745:                max = ent->client->pers.max_tesla;
                    746: #ifndef KILL_DISRUPTOR
                    747:        else if (item->tag == AMMO_DISRUPTOR)
                    748:                max = ent->client->pers.max_rounds;
                    749: #endif
                    750: // ROGUE
                    751:        else
                    752:        {
                    753:                gi.dprintf("undefined ammo type\n");
                    754:                return false;
                    755:        }
                    756: 
                    757:        index = ITEM_INDEX(item);
                    758: 
                    759:        if (ent->client->pers.inventory[index] == max)
                    760:                return false;
                    761: 
                    762:        ent->client->pers.inventory[index] += count;
                    763: 
                    764:        if (ent->client->pers.inventory[index] > max)
                    765:                ent->client->pers.inventory[index] = max;
                    766: 
                    767:        return true;
                    768: }
                    769: 
                    770: qboolean Pickup_Ammo (edict_t *ent, edict_t *other)
                    771: {
                    772:        int                     oldcount;
                    773:        int                     count;
                    774:        qboolean        weapon;
                    775: 
                    776:        weapon = (ent->item->flags & IT_WEAPON);
                    777:        if ( (weapon) && ( (int)dmflags->value & DF_INFINITE_AMMO ) )
                    778:                count = 1000;
                    779:        else if (ent->count)
                    780:                count = ent->count;
                    781:        else
                    782:                count = ent->item->quantity;
                    783: 
                    784:        oldcount = other->client->pers.inventory[ITEM_INDEX(ent->item)];
                    785: 
                    786:        if (!Add_Ammo (other, ent->item, count))
                    787:                return false;
                    788: 
                    789:        if (weapon && !oldcount)
                    790:        {
                    791:                if (other->client->pers.weapon != ent->item && ( !deathmatch->value || other->client->pers.weapon == FindItem("blaster") ) )
                    792:                        other->client->newweapon = ent->item;
                    793:        }
                    794: 
                    795:        if (!(ent->spawnflags & (DROPPED_ITEM | DROPPED_PLAYER_ITEM)) && (deathmatch->value))
                    796:                SetRespawn (ent, 30);
                    797:        return true;
                    798: }
                    799: 
                    800: void Drop_Ammo (edict_t *ent, gitem_t *item)
                    801: {
                    802:        edict_t *dropped;
                    803:        int             index;
                    804: 
                    805:        index = ITEM_INDEX(item);
                    806:        dropped = Drop_Item (ent, item);
                    807:        if (ent->client->pers.inventory[index] >= item->quantity)
                    808:                dropped->count = item->quantity;
                    809:        else
                    810:                dropped->count = ent->client->pers.inventory[index];
                    811: 
                    812:        if (ent->client->pers.weapon && 
                    813:                ent->client->pers.weapon->tag == AMMO_GRENADES &&
                    814:                item->tag == AMMO_GRENADES &&
                    815:                ent->client->pers.inventory[index] - dropped->count <= 0) {
                    816:                gi.cprintf (ent, PRINT_HIGH, "Can't drop current weapon\n");
                    817:                G_FreeEdict(dropped);
                    818:                return;
                    819:        }
                    820: 
                    821:        ent->client->pers.inventory[index] -= dropped->count;
                    822:        ValidateSelectedItem (ent);
                    823: }
                    824: 
                    825: 
                    826: //======================================================================
                    827: 
                    828: void MegaHealth_think (edict_t *self)
                    829: {
                    830:        if (self->owner->health > self->owner->max_health)
                    831:        {
                    832:                self->nextthink = level.time + 1;
                    833:                self->owner->health -= 1;
                    834:                return;
                    835:        }
                    836: 
                    837:        if (!(self->spawnflags & DROPPED_ITEM) && (deathmatch->value))
                    838:                SetRespawn (self, 20);
                    839:        else
                    840:                G_FreeEdict (self);
                    841: }
                    842: 
                    843: qboolean Pickup_Health (edict_t *ent, edict_t *other)
                    844: {
                    845:        if (!(ent->style & HEALTH_IGNORE_MAX))
                    846:                if (other->health >= other->max_health)
                    847:                        return false;
                    848: 
                    849:        other->health += ent->count;
                    850: 
                    851:        if (!(ent->style & HEALTH_IGNORE_MAX))
                    852:        {
                    853:                if (other->health > other->max_health)
                    854:                        other->health = other->max_health;
                    855:        }
                    856: 
                    857:        if (ent->style & HEALTH_TIMED)
                    858:        {
                    859:                ent->think = MegaHealth_think;
                    860:                ent->nextthink = level.time + 5;
                    861:                ent->owner = other;
                    862:                ent->flags |= FL_RESPAWN;
                    863:                ent->svflags |= SVF_NOCLIENT;
                    864:                ent->solid = SOLID_NOT;
                    865:        }
                    866:        else
                    867:        {
                    868:                if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
                    869:                        SetRespawn (ent, 30);
                    870:        }
                    871: 
                    872:        return true;
                    873: }
                    874: 
                    875: //======================================================================
                    876: 
                    877: int ArmorIndex (edict_t *ent)
                    878: {
                    879:        if (!ent->client)
                    880:                return 0;
                    881: 
                    882:        if (ent->client->pers.inventory[jacket_armor_index] > 0)
                    883:                return jacket_armor_index;
                    884: 
                    885:        if (ent->client->pers.inventory[combat_armor_index] > 0)
                    886:                return combat_armor_index;
                    887: 
                    888:        if (ent->client->pers.inventory[body_armor_index] > 0)
                    889:                return body_armor_index;
                    890: 
                    891:        return 0;
                    892: }
                    893: 
                    894: qboolean Pickup_Armor (edict_t *ent, edict_t *other)
                    895: {
                    896:        int                             old_armor_index;
                    897:        gitem_armor_t   *oldinfo;
                    898:        gitem_armor_t   *newinfo;
                    899:        int                             newcount;
                    900:        float                   salvage;
                    901:        int                             salvagecount;
                    902: 
                    903:        // get info on new armor
                    904:        newinfo = (gitem_armor_t *)ent->item->info;
                    905: 
                    906:        old_armor_index = ArmorIndex (other);
                    907: 
                    908:        // handle armor shards specially
                    909:        if (ent->item->tag == ARMOR_SHARD)
                    910:        {
                    911:                if (!old_armor_index)
                    912:                        other->client->pers.inventory[jacket_armor_index] = 2;
                    913:                else
                    914:                        other->client->pers.inventory[old_armor_index] += 2;
                    915:        }
                    916: 
                    917:        // if player has no armor, just use it
                    918:        else if (!old_armor_index)
                    919:        {
                    920:                other->client->pers.inventory[ITEM_INDEX(ent->item)] = newinfo->base_count;
                    921:        }
                    922: 
                    923:        // use the better armor
                    924:        else
                    925:        {
                    926:                // get info on old armor
                    927:                if (old_armor_index == jacket_armor_index)
                    928:                        oldinfo = &jacketarmor_info;
                    929:                else if (old_armor_index == combat_armor_index)
                    930:                        oldinfo = &combatarmor_info;
                    931:                else // (old_armor_index == body_armor_index)
                    932:                        oldinfo = &bodyarmor_info;
                    933: 
                    934:                if (newinfo->normal_protection > oldinfo->normal_protection)
                    935:                {
                    936:                        // calc new armor values
                    937:                        salvage = oldinfo->normal_protection / newinfo->normal_protection;
                    938:                        salvagecount = salvage * other->client->pers.inventory[old_armor_index];
                    939:                        newcount = newinfo->base_count + salvagecount;
                    940:                        if (newcount > newinfo->max_count)
                    941:                                newcount = newinfo->max_count;
                    942: 
                    943:                        // zero count of old armor so it goes away
                    944:                        other->client->pers.inventory[old_armor_index] = 0;
                    945: 
                    946:                        // change armor to new item with computed value
                    947:                        other->client->pers.inventory[ITEM_INDEX(ent->item)] = newcount;
                    948:                }
                    949:                else
                    950:                {
                    951:                        // calc new armor values
                    952:                        salvage = newinfo->normal_protection / oldinfo->normal_protection;
                    953:                        salvagecount = salvage * newinfo->base_count;
                    954:                        newcount = other->client->pers.inventory[old_armor_index] + salvagecount;
                    955:                        if (newcount > oldinfo->max_count)
                    956:                                newcount = oldinfo->max_count;
                    957: 
                    958:                        // if we're already maxed out then we don't need the new armor
                    959:                        if (other->client->pers.inventory[old_armor_index] >= newcount)
                    960:                                return false;
                    961: 
                    962:                        // update current armor value
                    963:                        other->client->pers.inventory[old_armor_index] = newcount;
                    964:                }
                    965:        }
                    966: 
                    967:        if (!(ent->spawnflags & DROPPED_ITEM) && (deathmatch->value))
                    968:                SetRespawn (ent, 20);
                    969: 
                    970:        return true;
                    971: }
                    972: 
                    973: //======================================================================
                    974: 
                    975: int PowerArmorType (edict_t *ent)
                    976: {
                    977:        if (!ent->client)
                    978:                return POWER_ARMOR_NONE;
                    979: 
                    980:        if (!(ent->flags & FL_POWER_ARMOR))
                    981:                return POWER_ARMOR_NONE;
                    982: 
                    983:        if (ent->client->pers.inventory[power_shield_index] > 0)
                    984:                return POWER_ARMOR_SHIELD;
                    985: 
                    986:        if (ent->client->pers.inventory[power_screen_index] > 0)
                    987:                return POWER_ARMOR_SCREEN;
                    988: 
                    989:        return POWER_ARMOR_NONE;
                    990: }
                    991: 
                    992: void Use_PowerArmor (edict_t *ent, gitem_t *item)
                    993: {
                    994:        int             index;
                    995: 
                    996:        if (ent->flags & FL_POWER_ARMOR)
                    997:        {
                    998:                ent->flags &= ~FL_POWER_ARMOR;
                    999:                gi.sound(ent, CHAN_AUTO, gi.soundindex("misc/power2.wav"), 1, ATTN_NORM, 0);
                   1000:        }
                   1001:        else
                   1002:        {
                   1003:                index = ITEM_INDEX(FindItem("cells"));
                   1004:                if (!ent->client->pers.inventory[index])
                   1005:                {
                   1006:                        gi.cprintf (ent, PRINT_HIGH, "No cells for power armor.\n");
                   1007:                        return;
                   1008:                }
                   1009:                ent->flags |= FL_POWER_ARMOR;
                   1010:                gi.sound(ent, CHAN_AUTO, gi.soundindex("misc/power1.wav"), 1, ATTN_NORM, 0);
                   1011:        }
                   1012: }
                   1013: 
                   1014: qboolean Pickup_PowerArmor (edict_t *ent, edict_t *other)
                   1015: {
                   1016:        int             quantity;
                   1017: 
                   1018:        quantity = other->client->pers.inventory[ITEM_INDEX(ent->item)];
                   1019: 
                   1020:        other->client->pers.inventory[ITEM_INDEX(ent->item)]++;
                   1021: 
                   1022:        if (deathmatch->value)
                   1023:        {
                   1024:                if (!(ent->spawnflags & DROPPED_ITEM) )
                   1025:                        SetRespawn (ent, ent->item->quantity);
                   1026:                // auto-use for DM only if we didn't already have one
                   1027:                if (!quantity)
                   1028:                        ent->item->use (other, ent->item);
                   1029:        }
                   1030: 
                   1031:        return true;
                   1032: }
                   1033: 
                   1034: void Drop_PowerArmor (edict_t *ent, gitem_t *item)
                   1035: {
                   1036:        if ((ent->flags & FL_POWER_ARMOR) && (ent->client->pers.inventory[ITEM_INDEX(item)] == 1))
                   1037:                Use_PowerArmor (ent, item);
                   1038:        Drop_General (ent, item);
                   1039: }
                   1040: 
                   1041: //======================================================================
                   1042: 
                   1043: /*
                   1044: ===============
                   1045: Touch_Item
                   1046: ===============
                   1047: */
                   1048: void Touch_Item (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf)
                   1049: {
                   1050:        qboolean        taken;
                   1051: 
                   1052:        if (!other->client)
                   1053:                return;
                   1054:        if (other->health < 1)
                   1055:                return;         // dead people can't pickup
                   1056:        if (!ent->item->pickup)
                   1057:                return;         // not a grabbable item?
                   1058: 
                   1059:        taken = ent->item->pickup(ent, other);
                   1060: 
                   1061:        if (taken)
                   1062:        {
                   1063:                // flash the screen
                   1064:                other->client->bonus_alpha = 0.25;      
                   1065: 
                   1066:                // show icon and name on status bar
                   1067:                other->client->ps.stats[STAT_PICKUP_ICON] = gi.imageindex(ent->item->icon);
                   1068:                other->client->ps.stats[STAT_PICKUP_STRING] = CS_ITEMS+ITEM_INDEX(ent->item);
                   1069:                other->client->pickup_msg_time = level.time + 3.0;
                   1070: 
                   1071:                // change selected item
                   1072:                if (ent->item->use)
                   1073:                        other->client->pers.selected_item = other->client->ps.stats[STAT_SELECTED_ITEM] = ITEM_INDEX(ent->item);
                   1074: 
                   1075:                if (ent->item->pickup == Pickup_Health)
                   1076:                {
                   1077:                        if (ent->count == 2)
                   1078:                                gi.sound(other, CHAN_ITEM, gi.soundindex("items/s_health.wav"), 1, ATTN_NORM, 0);
                   1079:                        else if (ent->count == 10)
                   1080:                                gi.sound(other, CHAN_ITEM, gi.soundindex("items/n_health.wav"), 1, ATTN_NORM, 0);
                   1081:                        else if (ent->count == 25)
                   1082:                                gi.sound(other, CHAN_ITEM, gi.soundindex("items/l_health.wav"), 1, ATTN_NORM, 0);
                   1083:                        else // (ent->count == 100)
                   1084:                                gi.sound(other, CHAN_ITEM, gi.soundindex("items/m_health.wav"), 1, ATTN_NORM, 0);
                   1085:                }
                   1086:                else if (ent->item->pickup_sound)
                   1087:                {
                   1088:                        gi.sound(other, CHAN_ITEM, gi.soundindex(ent->item->pickup_sound), 1, ATTN_NORM, 0);
                   1089:                }
                   1090:        }
                   1091: 
                   1092:        if (!(ent->spawnflags & ITEM_TARGETS_USED))
                   1093:        {
                   1094:                G_UseTargets (ent, other);
                   1095:                ent->spawnflags |= ITEM_TARGETS_USED;
                   1096:        }
                   1097: 
                   1098:        if (!taken)
                   1099:                return;
                   1100: 
                   1101:        if (!((coop->value) &&  (ent->item->flags & IT_STAY_COOP)) || (ent->spawnflags & (DROPPED_ITEM | DROPPED_PLAYER_ITEM)))
                   1102:        {
                   1103:                if (ent->flags & FL_RESPAWN)
                   1104:                        ent->flags &= ~FL_RESPAWN;
                   1105:                else
                   1106:                        G_FreeEdict (ent);
                   1107:        }
                   1108: }
                   1109: 
                   1110: //======================================================================
                   1111: 
                   1112: static void drop_temp_touch (edict_t *ent, edict_t *other, cplane_t *plane, csurface_t *surf)
                   1113: {
                   1114:        if (other == ent->owner)
                   1115:                return;
                   1116: 
                   1117:        Touch_Item (ent, other, plane, surf);
                   1118: }
                   1119: 
                   1120: static void drop_make_touchable (edict_t *ent)
                   1121: {
                   1122:        ent->touch = Touch_Item;
                   1123:        if (deathmatch->value)
                   1124:        {
                   1125:                ent->nextthink = level.time + 29;
                   1126:                ent->think = G_FreeEdict;
                   1127:        }
                   1128: }
                   1129: 
                   1130: edict_t *Drop_Item (edict_t *ent, gitem_t *item)
                   1131: {
                   1132:        edict_t *dropped;
                   1133:        vec3_t  forward, right;
                   1134:        vec3_t  offset;
                   1135: 
                   1136:        dropped = G_Spawn();
                   1137: 
                   1138:        dropped->classname = item->classname;
                   1139:        dropped->item = item;
                   1140:        dropped->spawnflags = DROPPED_ITEM;
                   1141:        dropped->s.effects = item->world_model_flags;
                   1142:        dropped->s.renderfx = RF_GLOW | RF_IR_VISIBLE;          // PGM
                   1143:        VectorSet (dropped->mins, -15, -15, -15);
                   1144:        VectorSet (dropped->maxs, 15, 15, 15);
                   1145:        gi.setmodel (dropped, dropped->item->world_model);
                   1146:        dropped->solid = SOLID_TRIGGER;
                   1147:        dropped->movetype = MOVETYPE_TOSS;  
                   1148:        dropped->touch = drop_temp_touch;
                   1149:        dropped->owner = ent;
                   1150: 
                   1151:        if (ent->client)
                   1152:        {
                   1153:                trace_t trace;
                   1154: 
                   1155:                AngleVectors (ent->client->v_angle, forward, right, NULL);
                   1156:                VectorSet(offset, 24, 0, -16);
                   1157:                G_ProjectSource (ent->s.origin, offset, forward, right, dropped->s.origin);
                   1158:                trace = gi.trace (ent->s.origin, dropped->mins, dropped->maxs,
                   1159:                        dropped->s.origin, ent, CONTENTS_SOLID);
                   1160:                VectorCopy (trace.endpos, dropped->s.origin);
                   1161:        }
                   1162:        else
                   1163:        {
                   1164:                AngleVectors (ent->s.angles, forward, right, NULL);
                   1165:                VectorCopy (ent->s.origin, dropped->s.origin);
                   1166:        }
                   1167: 
                   1168:        VectorScale (forward, 100, dropped->velocity);
                   1169:        dropped->velocity[2] = 300;
                   1170: 
                   1171:        dropped->think = drop_make_touchable;
                   1172:        dropped->nextthink = level.time + 1;
                   1173: 
                   1174:        gi.linkentity (dropped);
                   1175: 
                   1176:        return dropped;
                   1177: }
                   1178: 
                   1179: void Use_Item (edict_t *ent, edict_t *other, edict_t *activator)
                   1180: {
                   1181:        ent->svflags &= ~SVF_NOCLIENT;
                   1182:        ent->use = NULL;
                   1183: 
                   1184:        if (ent->spawnflags & ITEM_NO_TOUCH)
                   1185:        {
                   1186:                ent->solid = SOLID_BBOX;
                   1187:                ent->touch = NULL;
                   1188:        }
                   1189:        else
                   1190:        {
                   1191:                ent->solid = SOLID_TRIGGER;
                   1192:                ent->touch = Touch_Item;
                   1193:        }
                   1194: 
                   1195:        gi.linkentity (ent);
                   1196: }
                   1197: 
                   1198: //======================================================================
                   1199: 
                   1200: /*
                   1201: ================
                   1202: droptofloor
                   1203: ================
                   1204: */
                   1205: void droptofloor (edict_t *ent)
                   1206: {
                   1207:        trace_t         tr;
                   1208:        vec3_t          dest;
                   1209:        float           *v;
                   1210: 
                   1211:        v = tv(-15,-15,-15);
                   1212:        VectorCopy (v, ent->mins);
                   1213:        v = tv(15,15,15);
                   1214:        VectorCopy (v, ent->maxs);
                   1215: 
                   1216:        if (ent->model)
                   1217:                gi.setmodel (ent, ent->model);
                   1218:        else if (ent->item->world_model)        // PGM we shouldn't need this check, but paranoia...
                   1219:                gi.setmodel (ent, ent->item->world_model);
                   1220:        ent->solid = SOLID_TRIGGER;
                   1221:        ent->movetype = MOVETYPE_TOSS;  
                   1222:        ent->touch = Touch_Item;
                   1223: 
                   1224:        v = tv(0,0,-128);
                   1225:        VectorAdd (ent->s.origin, v, dest);
                   1226: 
                   1227:        tr = gi.trace (ent->s.origin, ent->mins, ent->maxs, dest, ent, MASK_SOLID);
                   1228:        if (tr.startsolid)
                   1229:        {
                   1230:                gi.dprintf ("droptofloor: %s startsolid at %s\n", ent->classname, vtos(ent->s.origin));
                   1231:                G_FreeEdict (ent);
                   1232:                return;
                   1233:        }
                   1234: 
                   1235:        VectorCopy (tr.endpos, ent->s.origin);
                   1236: 
                   1237:        if (ent->team)
                   1238:        {
                   1239:                ent->flags &= ~FL_TEAMSLAVE;
                   1240:                ent->chain = ent->teamchain;
                   1241:                ent->teamchain = NULL;
                   1242: 
                   1243:                ent->svflags |= SVF_NOCLIENT;
                   1244:                ent->solid = SOLID_NOT;
                   1245:                if (ent == ent->teammaster)
                   1246:                {
                   1247:                        ent->nextthink = level.time + FRAMETIME;
                   1248:                        ent->think = DoRespawn;
                   1249:                }
                   1250:        }
                   1251: 
                   1252:        if (ent->spawnflags & ITEM_NO_TOUCH)
                   1253:        {
                   1254:                ent->solid = SOLID_BBOX;
                   1255:                ent->touch = NULL;
                   1256:                ent->s.effects &= ~EF_ROTATE;
                   1257:                ent->s.renderfx &= ~RF_GLOW;
                   1258:        }
                   1259: 
                   1260:        if (ent->spawnflags & ITEM_TRIGGER_SPAWN)
                   1261:        {
                   1262:                ent->svflags |= SVF_NOCLIENT;
                   1263:                ent->solid = SOLID_NOT;
                   1264:                ent->use = Use_Item;
                   1265:        }
                   1266: 
                   1267:        gi.linkentity (ent);
                   1268: }
                   1269: 
                   1270: 
                   1271: /*
                   1272: ===============
                   1273: PrecacheItem
                   1274: 
                   1275: Precaches all data needed for a given item.
                   1276: This will be called for each item spawned in a level,
                   1277: and for each item in each client's inventory.
                   1278: ===============
                   1279: */
                   1280: void PrecacheItem (gitem_t *it)
                   1281: {
                   1282:        char    *s, *start;
                   1283:        char    data[MAX_QPATH];
                   1284:        int             len;
                   1285:        gitem_t *ammo;
                   1286: 
                   1287:        if (!it)
                   1288:                return;
                   1289: 
                   1290:        if (it->pickup_sound)
                   1291:                gi.soundindex (it->pickup_sound);
                   1292:        if (it->world_model)
                   1293:                gi.modelindex (it->world_model);
                   1294:        if (it->view_model)
                   1295:                gi.modelindex (it->view_model);
                   1296:        if (it->icon)
                   1297:                gi.imageindex (it->icon);
                   1298: 
                   1299:        // parse everything for its ammo
                   1300:        if (it->ammo && it->ammo[0])
                   1301:        {
                   1302:                ammo = FindItem (it->ammo);
                   1303:                if (ammo != it)
                   1304:                        PrecacheItem (ammo);
                   1305:        }
                   1306: 
                   1307:        // parse the space seperated precache string for other items
                   1308:        s = it->precaches;
                   1309:        if (!s || !s[0])
                   1310:                return;
                   1311: 
                   1312:        while (*s)
                   1313:        {
                   1314:                start = s;
                   1315:                while (*s && *s != ' ')
                   1316:                        s++;
                   1317: 
                   1318:                len = s-start;
                   1319:                if (len >= MAX_QPATH || len < 5)
                   1320:                        gi.error ("PrecacheItem: %s has bad precache string", it->classname);
                   1321:                memcpy (data, start, len);
                   1322:                data[len] = 0;
                   1323:                if (*s)
                   1324:                        s++;
                   1325: 
                   1326:                // determine type based on extension
                   1327:                if (!strcmp(data+len-3, "md2"))
                   1328:                        gi.modelindex (data);
                   1329:                else if (!strcmp(data+len-3, "sp2"))
                   1330:                        gi.modelindex (data);
                   1331:                else if (!strcmp(data+len-3, "wav"))
                   1332:                        gi.soundindex (data);
                   1333:                if (!strcmp(data+len-3, "pcx"))
                   1334:                        gi.imageindex (data);
                   1335:        }
                   1336: }
                   1337: 
                   1338: 
                   1339: //=================
                   1340: // Item_TriggeredSpawn - create the item marked for spawn creation
                   1341: //=================
                   1342: void Item_TriggeredSpawn (edict_t *self, edict_t *other, edict_t *activator)
                   1343: {
                   1344: //     self->nextthink = level.time + 2 * FRAMETIME;    // items start after other solids
                   1345: //     self->think = droptofloor;
                   1346:        self->svflags &= ~SVF_NOCLIENT;
                   1347:        self->use = NULL;
                   1348:        if(strcmp(self->classname, "key_power_cube"))   // leave them be on key_power_cube..
                   1349:                self->spawnflags = 0;
                   1350:        droptofloor (self);
                   1351: }
                   1352: 
                   1353: //=================
                   1354: // SetTriggeredSpawn - set up an item to spawn in later.
                   1355: //=================
                   1356: void SetTriggeredSpawn (edict_t *ent)
                   1357: {
                   1358:        // don't do anything on key_power_cubes.
                   1359:        if(!strcmp(ent->classname, "key_power_cube"))
                   1360:                return;
                   1361: 
                   1362:        ent->think = NULL;
                   1363:        ent->nextthink = 0;
                   1364:        ent->use = Item_TriggeredSpawn;
                   1365:        ent->svflags |= SVF_NOCLIENT;
                   1366:        ent->solid = SOLID_NOT;
                   1367: }
                   1368: 
                   1369: /*
                   1370: ============
                   1371: SpawnItem
                   1372: 
                   1373: Sets the clipping size and plants the object on the floor.
                   1374: 
                   1375: Items can't be immediately dropped to floor, because they might
                   1376: be on an entity that hasn't spawned yet.
                   1377: ============
                   1378: */
                   1379: void SpawnItem (edict_t *ent, gitem_t *item)
                   1380: {
                   1381: #if KILL_DISRUPTOR
                   1382:        if ((!strcmp(ent->classname, "ammo_disruptor")) || (!strcmp(ent->classname, "weapon_disintegrator")))
                   1383:        {
                   1384:                G_FreeEdict (ent);
                   1385:                return;
                   1386:        }
                   1387: #endif
                   1388: 
                   1389: // PGM - since the item may be freed by the following rules, go ahead
                   1390: //              and move the precache until AFTER the following rules have been checked.
                   1391: //              keep an eye on this.
                   1392: //     PrecacheItem (item);
                   1393: 
                   1394:        if (ent->spawnflags > 1)                // PGM
                   1395:        {
                   1396:                if (strcmp(ent->classname, "key_power_cube") != 0)
                   1397:                {
                   1398:                        ent->spawnflags = 0;
                   1399:                        gi.dprintf("%s at %s has invalid spawnflags set\n", ent->classname, vtos(ent->s.origin));
                   1400:                }
                   1401:        }
                   1402: 
                   1403:        // some items will be prevented in deathmatch
                   1404:        if (deathmatch->value)
                   1405:        {
                   1406:                if ( (int)dmflags->value & DF_NO_ARMOR )
                   1407:                {
                   1408:                        if (item->pickup == Pickup_Armor || item->pickup == Pickup_PowerArmor)
                   1409:                        {
                   1410:                                G_FreeEdict (ent);
                   1411:                                return;
                   1412:                        }
                   1413:                }
                   1414:                if ( (int)dmflags->value & DF_NO_ITEMS )
                   1415:                {
                   1416:                        if (item->pickup == Pickup_Powerup)
                   1417:                        {
                   1418:                                G_FreeEdict (ent);
                   1419:                                return;
                   1420:                        }
                   1421:                }
                   1422:                if ( (int)dmflags->value & DF_NO_HEALTH )
                   1423:                {
                   1424:                        if (item->pickup == Pickup_Health || item->pickup == Pickup_Adrenaline || item->pickup == Pickup_AncientHead)
                   1425:                        {
                   1426:                                G_FreeEdict (ent);
                   1427:                                return;
                   1428:                        }
                   1429:                }
                   1430:                if ( (int)dmflags->value & DF_INFINITE_AMMO )
                   1431:                {
                   1432:                        if ( (item->flags == IT_AMMO) || (strcmp(ent->classname, "weapon_bfg") == 0) )
                   1433:                        {
                   1434:                                G_FreeEdict (ent);
                   1435:                                return;
                   1436:                        }
                   1437:                }
                   1438: 
                   1439: //==========
                   1440: //ROGUE
                   1441:                if ( (int)dmflags->value & DF_NO_MINES )
                   1442:                {
                   1443:                        if ( !strcmp(ent->classname, "ammo_prox") || 
                   1444:                                 !strcmp(ent->classname, "ammo_tesla") )
                   1445:                        {
                   1446:                                G_FreeEdict (ent);
                   1447:                                return;
                   1448:                        }
                   1449:                }
                   1450:                if ( (int)dmflags->value & DF_NO_NUKES )
                   1451:                {
                   1452:                        if ( !strcmp(ent->classname, "ammo_nuke") )
                   1453:                        {
                   1454:                                G_FreeEdict (ent);
                   1455:                                return;
                   1456:                        }
                   1457:                }
                   1458: //ROGUE
                   1459: //==========
                   1460: 
                   1461:        }
                   1462: //==========
                   1463: //ROGUE
                   1464: // DM only items
                   1465:        if (!deathmatch->value)
                   1466:        {
                   1467:                if (item->pickup == Pickup_Doppleganger || item->pickup == Pickup_Nuke)
                   1468:                {
                   1469:                        G_FreeEdict (ent);
                   1470:                        return;
                   1471:                }
                   1472:                if ((item->use == Use_Vengeance) || (item->use == Use_Hunter))
                   1473:                {
                   1474:                        G_FreeEdict (ent);
                   1475:                        return;
                   1476:                }
                   1477:        }
                   1478: //ROGUE
                   1479: //==========
                   1480: 
                   1481: //PGM 
                   1482:        PrecacheItem (item);            
                   1483: //PGM
                   1484: 
                   1485:        if (coop->value && (strcmp(ent->classname, "key_power_cube") == 0))
                   1486:        {
                   1487:                ent->spawnflags |= (1 << (8 + level.power_cubes));
                   1488:                level.power_cubes++;
                   1489:        }
                   1490: 
                   1491:        // don't let them drop items that stay in a coop game
                   1492:        if ((coop->value) && (item->flags & IT_STAY_COOP))
                   1493:        {
                   1494:                item->drop = NULL;
                   1495:        }
                   1496: 
                   1497:        ent->item = item;
                   1498:        ent->nextthink = level.time + 2 * FRAMETIME;    // items start after other solids
                   1499:        ent->think = droptofloor;
                   1500:        ent->s.effects = item->world_model_flags;
                   1501:        ent->s.renderfx = RF_GLOW;
                   1502:        if (ent->model)
                   1503:                gi.modelindex (ent->model);
                   1504: 
                   1505:        if (ent->spawnflags & 1)
                   1506:                SetTriggeredSpawn (ent);
                   1507: }
                   1508: 
                   1509: //======================================================================
                   1510: 
                   1511: gitem_t        itemlist[] = 
                   1512: {
                   1513:        {
                   1514:                NULL
                   1515:        },      // leave index 0 alone
                   1516: 
                   1517:        //
                   1518:        // ARMOR
                   1519:        //
                   1520: 
                   1521: /*QUAKED item_armor_body (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   1522: */
                   1523:        {
                   1524:                "item_armor_body", 
                   1525:                Pickup_Armor,
                   1526:                NULL,
                   1527:                NULL,
                   1528:                NULL,
                   1529:                "misc/ar1_pkup.wav",
                   1530:                "models/items/armor/body/tris.md2", EF_ROTATE,
                   1531:                NULL,
                   1532: /* icon */             "i_bodyarmor",
                   1533: /* pickup */   "Body Armor",
                   1534: /* width */            3,
                   1535:                0,
                   1536:                NULL,
                   1537:                IT_ARMOR,
                   1538:                0,
                   1539:                &bodyarmor_info,
                   1540:                ARMOR_BODY,
                   1541: /* precache */ ""
                   1542:        },
                   1543: 
                   1544: /*QUAKED item_armor_combat (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   1545: */
                   1546:        {
                   1547:                "item_armor_combat", 
                   1548:                Pickup_Armor,
                   1549:                NULL,
                   1550:                NULL,
                   1551:                NULL,
                   1552:                "misc/ar1_pkup.wav",
                   1553:                "models/items/armor/combat/tris.md2", EF_ROTATE,
                   1554:                NULL,
                   1555: /* icon */             "i_combatarmor",
                   1556: /* pickup */   "Combat Armor",
                   1557: /* width */            3,
                   1558:                0,
                   1559:                NULL,
                   1560:                IT_ARMOR,
                   1561:                0,
                   1562:                &combatarmor_info,
                   1563:                ARMOR_COMBAT,
                   1564: /* precache */ ""
                   1565:        },
                   1566: 
                   1567: /*QUAKED item_armor_jacket (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   1568: */
                   1569:        {
                   1570:                "item_armor_jacket", 
                   1571:                Pickup_Armor,
                   1572:                NULL,
                   1573:                NULL,
                   1574:                NULL,
                   1575:                "misc/ar1_pkup.wav",
                   1576:                "models/items/armor/jacket/tris.md2", EF_ROTATE,
                   1577:                NULL,
                   1578: /* icon */             "i_jacketarmor",
                   1579: /* pickup */   "Jacket Armor",
                   1580: /* width */            3,
                   1581:                0,
                   1582:                NULL,
                   1583:                IT_ARMOR,
                   1584:                0,
                   1585:                &jacketarmor_info,
                   1586:                ARMOR_JACKET,
                   1587: /* precache */ ""
                   1588:        },
                   1589: 
                   1590: /*QUAKED item_armor_shard (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   1591: */
                   1592:        {
                   1593:                "item_armor_shard", 
                   1594:                Pickup_Armor,
                   1595:                NULL,
                   1596:                NULL,
                   1597:                NULL,
                   1598:                "misc/ar2_pkup.wav",
                   1599:                "models/items/armor/shard/tris.md2", EF_ROTATE,
                   1600:                NULL,
                   1601: /* icon */             "i_jacketarmor",
                   1602: /* pickup */   "Armor Shard",
                   1603: /* width */            3,
                   1604:                0,
                   1605:                NULL,
                   1606:                IT_ARMOR,
                   1607:                0,
                   1608:                NULL,
                   1609:                ARMOR_SHARD,
                   1610: /* precache */ ""
                   1611:        },
                   1612: 
                   1613: 
                   1614: /*QUAKED item_power_screen (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   1615: */
                   1616:        {
                   1617:                "item_power_screen", 
                   1618:                Pickup_PowerArmor,
                   1619:                Use_PowerArmor,
                   1620:                Drop_PowerArmor,
                   1621:                NULL,
                   1622:                "misc/ar3_pkup.wav",
                   1623:                "models/items/armor/screen/tris.md2", EF_ROTATE,
                   1624:                NULL,
                   1625: /* icon */             "i_powerscreen",
                   1626: /* pickup */   "Power Screen",
                   1627: /* width */            0,
                   1628:                60,
                   1629:                NULL,
                   1630:                IT_ARMOR,
                   1631:                0,
                   1632:                NULL,
                   1633:                0,
                   1634: /* precache */ ""
                   1635:        },
                   1636: 
                   1637: /*QUAKED item_power_shield (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   1638: */
                   1639:        {
                   1640:                "item_power_shield",
                   1641:                Pickup_PowerArmor,
                   1642:                Use_PowerArmor,
                   1643:                Drop_PowerArmor,
                   1644:                NULL,
                   1645:                "misc/ar3_pkup.wav",
                   1646:                "models/items/armor/shield/tris.md2", EF_ROTATE,
                   1647:                NULL,
                   1648: /* icon */             "i_powershield",
                   1649: /* pickup */   "Power Shield",
                   1650: /* width */            0,
                   1651:                60,
                   1652:                NULL,
                   1653:                IT_ARMOR,
                   1654:                0,
                   1655:                NULL,
                   1656:                0,
                   1657: /* precache */ "misc/power2.wav misc/power1.wav"
                   1658:        },
                   1659: 
                   1660: 
                   1661:        //
                   1662:        // WEAPONS 
                   1663:        //
                   1664: 
                   1665: /* weapon_blaster (.3 .3 1) (-16 -16 -16) (16 16 16)
                   1666: always owned, never in the world
                   1667: */
                   1668:        {
                   1669:                "weapon_blaster", 
                   1670:                NULL,
                   1671:                Use_Weapon,
                   1672:                NULL,
                   1673:                Weapon_Blaster,
                   1674:                "misc/w_pkup.wav",
                   1675:                NULL, 0,
                   1676:                "models/weapons/v_blast/tris.md2",
                   1677: /* icon */             "w_blaster",
                   1678: /* pickup */   "Blaster",
                   1679:                0,
                   1680:                0,
                   1681:                NULL,
                   1682:                IT_WEAPON|IT_STAY_COOP,
                   1683:                WEAP_BLASTER,
                   1684:                NULL,
                   1685:                0,
                   1686: /* precache */ "weapons/blastf1a.wav misc/lasfly.wav"
                   1687:        },
                   1688: 
                   1689: /*QUAKED weapon_shotgun (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   1690: */
                   1691:        {
                   1692:                "weapon_shotgun", 
                   1693:                Pickup_Weapon,
                   1694:                Use_Weapon,
                   1695:                Drop_Weapon,
                   1696:                Weapon_Shotgun,
                   1697:                "misc/w_pkup.wav",
                   1698:                "models/weapons/g_shotg/tris.md2", EF_ROTATE,
                   1699:                "models/weapons/v_shotg/tris.md2",
                   1700: /* icon */             "w_shotgun",
                   1701: /* pickup */   "Shotgun",
                   1702:                0,
                   1703:                1,
                   1704:                "Shells",
                   1705:                IT_WEAPON|IT_STAY_COOP,
                   1706:                WEAP_SHOTGUN,
                   1707:                NULL,
                   1708:                0,
                   1709: /* precache */ "weapons/shotgf1b.wav weapons/shotgr1b.wav"
                   1710:        },
                   1711: 
                   1712: /*QUAKED weapon_supershotgun (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   1713: */
                   1714:        {
                   1715:                "weapon_supershotgun", 
                   1716:                Pickup_Weapon,
                   1717:                Use_Weapon,
                   1718:                Drop_Weapon,
                   1719:                Weapon_SuperShotgun,
                   1720:                "misc/w_pkup.wav",
                   1721:                "models/weapons/g_shotg2/tris.md2", EF_ROTATE,
                   1722:                "models/weapons/v_shotg2/tris.md2",
                   1723: /* icon */             "w_sshotgun",
                   1724: /* pickup */   "Super Shotgun",
                   1725:                0,
                   1726:                2,
                   1727:                "Shells",
                   1728:                IT_WEAPON|IT_STAY_COOP,
                   1729:                WEAP_SUPERSHOTGUN,
                   1730:                NULL,
                   1731:                0,
                   1732: /* precache */ "weapons/sshotf1b.wav"
                   1733:        },
                   1734: 
                   1735: /*QUAKED weapon_machinegun (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   1736: */
                   1737:        {
                   1738:                "weapon_machinegun", 
                   1739:                Pickup_Weapon,
                   1740:                Use_Weapon,
                   1741:                Drop_Weapon,
                   1742:                Weapon_Machinegun,
                   1743:                "misc/w_pkup.wav",
                   1744:                "models/weapons/g_machn/tris.md2", EF_ROTATE,
                   1745:                "models/weapons/v_machn/tris.md2",
                   1746: /* icon */             "w_machinegun",
                   1747: /* pickup */   "Machinegun",
                   1748:                0,
                   1749:                1,
                   1750:                "Bullets",
                   1751:                IT_WEAPON|IT_STAY_COOP,
                   1752:                WEAP_MACHINEGUN,
                   1753:                NULL,
                   1754:                0,
                   1755: /* precache */ "weapons/machgf1b.wav weapons/machgf2b.wav weapons/machgf3b.wav weapons/machgf4b.wav weapons/machgf5b.wav"
                   1756:        },
                   1757: 
                   1758: /*QUAKED weapon_chaingun (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   1759: */
                   1760:        {
                   1761:                "weapon_chaingun", 
                   1762:                Pickup_Weapon,
                   1763:                Use_Weapon,
                   1764:                Drop_Weapon,
                   1765:                Weapon_Chaingun,
                   1766:                "misc/w_pkup.wav",
                   1767:                "models/weapons/g_chain/tris.md2", EF_ROTATE,
                   1768:                "models/weapons/v_chain/tris.md2",
                   1769: /* icon */             "w_chaingun",
                   1770: /* pickup */   "Chaingun",
                   1771:                0,
                   1772:                1,
                   1773:                "Bullets",
                   1774:                IT_WEAPON|IT_STAY_COOP,
                   1775:                WEAP_CHAINGUN,
                   1776:                NULL,
                   1777:                0,
                   1778: /* precache */ "weapons/chngnu1a.wav weapons/chngnl1a.wav weapons/machgf3b.wav` weapons/chngnd1a.wav"
                   1779:        },
                   1780: 
                   1781:        // ROGUE
                   1782: /*QUAKED weapon_nailgun (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   1783: */
                   1784: /*QUAKED weapon_etf_rifle (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   1785: */
                   1786:        {
                   1787:                "weapon_etf_rifle",                                                                     // classname
                   1788:                Pickup_Weapon,                                                                          // pickup function
                   1789:                Use_Weapon,                                                                                     // use function
                   1790:                Drop_Weapon,                                                                            // drop function
                   1791:                Weapon_ETF_Rifle,                                                                       // weapon think function
                   1792:                "misc/w_pkup.wav",                                                                      // pick up sound
                   1793:                "models/weapons/g_etf_rifle/tris.md2", EF_ROTATE,               // world model, world model flags
                   1794:                "models/weapons/v_etf_rifle/tris.md2",                                  // view model
                   1795:                "w_etf_rifle",                                                                          // icon
                   1796:                "ETF Rifle",                                                                            // name printed when picked up 
                   1797:                0,                                                                                                      // number of digits for statusbar
                   1798:                1,                                                                                                      // amount used / contained
                   1799:                "Flechettes",                                                                           // ammo type used 
                   1800:                IT_WEAPON,                                                                                      // inventory flags
                   1801:                WEAP_ETFRIFLE,                                                                          // visible weapon
                   1802:                NULL,                                                                                           // info (void *)
                   1803:                0,                                                                                                      // tag
                   1804:                "weapons/nail1.wav models/proj/flechette/tris.md2",     // precaches
                   1805:        },
                   1806: 
                   1807:        // rogue
                   1808: /*QUAKED ammo_grenades (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   1809: */
                   1810:        {
                   1811:                "ammo_grenades",
                   1812:                Pickup_Ammo,
                   1813:                Use_Weapon,
                   1814:                Drop_Ammo,
                   1815:                Weapon_Grenade,
                   1816:                "misc/am_pkup.wav",
                   1817:                "models/items/ammo/grenades/medium/tris.md2", 0,
                   1818:                "models/weapons/v_handgr/tris.md2",
                   1819: /* icon */             "a_grenades",
                   1820: /* pickup */   "Grenades",
                   1821: /* width */            3,
                   1822:                5,
                   1823:                "grenades",
                   1824:                IT_AMMO|IT_WEAPON,
                   1825:                WEAP_GRENADES,
                   1826:                NULL,
                   1827:                AMMO_GRENADES,
                   1828: /* precache */ "weapons/hgrent1a.wav weapons/hgrena1b.wav weapons/hgrenc1b.wav weapons/hgrenb1a.wav weapons/hgrenb2a.wav "
                   1829:        },
                   1830: 
                   1831: /*QUAKED weapon_grenadelauncher (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   1832: */
                   1833:        {
                   1834:                "weapon_grenadelauncher",
                   1835:                Pickup_Weapon,
                   1836:                Use_Weapon,
                   1837:                Drop_Weapon,
                   1838:                Weapon_GrenadeLauncher,
                   1839:                "misc/w_pkup.wav",
                   1840:                "models/weapons/g_launch/tris.md2", EF_ROTATE,
                   1841:                "models/weapons/v_launch/tris.md2",
                   1842: /* icon */             "w_glauncher",
                   1843: /* pickup */   "Grenade Launcher",
                   1844:                0,
                   1845:                1,
                   1846:                "Grenades",
                   1847:                IT_WEAPON|IT_STAY_COOP,
                   1848:                WEAP_GRENADELAUNCHER,
                   1849:                NULL,
                   1850:                0,
                   1851: /* precache */ "models/objects/grenade/tris.md2 weapons/grenlf1a.wav weapons/grenlr1b.wav weapons/grenlb1b.wav"
                   1852:        },
                   1853: 
                   1854:        // ROGUE
                   1855: /*QUAKED weapon_proxlauncher (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   1856: */
                   1857:        {
                   1858:                "weapon_proxlauncher",                                                          // classname
                   1859:                Pickup_Weapon,                                                                          // pickup
                   1860:                Use_Weapon,                                                                                     // use
                   1861:                Drop_Weapon,                                                                            // drop
                   1862:                Weapon_ProxLauncher,                                                            // weapon think
                   1863:                "misc/w_pkup.wav",                                                                      // pick up sound
                   1864:                "models/weapons/g_plaunch/tris.md2", EF_ROTATE,         // world model, world model flags
                   1865:                "models/weapons/v_plaunch/tris.md2",                            // view model
                   1866:                "w_proxlaunch",                                                                         // icon
                   1867:                "Prox Launcher",                                                                        // name printed when picked up
                   1868:                0,                                                                                                      // number of digits for statusbar
                   1869:                1,                                                                                                      // amount used
                   1870:                "prox",                                                                                         // ammo type used
                   1871:                IT_WEAPON,                                                                                      // inventory flags
                   1872:                WEAP_PROXLAUNCH,                                                                        // visible weapon
                   1873:                NULL,                                                                                           // info (void *)
                   1874:                AMMO_PROX,                                                                                      // tag
                   1875:                "weapons/grenlf1a.wav weapons/grenlr1b.wav weapons/grenlb1b.wav weapons/proxwarn.wav",
                   1876:        },
                   1877:        // rogue
                   1878: 
                   1879: /*QUAKED weapon_rocketlauncher (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   1880: */
                   1881:        {
                   1882:                "weapon_rocketlauncher",
                   1883:                Pickup_Weapon,
                   1884:                Use_Weapon,
                   1885:                Drop_Weapon,
                   1886:                Weapon_RocketLauncher,
                   1887:                "misc/w_pkup.wav",
                   1888:                "models/weapons/g_rocket/tris.md2", EF_ROTATE,
                   1889:                "models/weapons/v_rocket/tris.md2",
                   1890: /* icon */             "w_rlauncher",
                   1891: /* pickup */   "Rocket Launcher",
                   1892:                0,
                   1893:                1,
                   1894:                "Rockets",
                   1895:                IT_WEAPON|IT_STAY_COOP,
                   1896:                WEAP_ROCKETLAUNCHER,
                   1897:                NULL,
                   1898:                0,
                   1899: /* precache */ "models/objects/rocket/tris.md2 weapons/rockfly.wav weapons/rocklf1a.wav weapons/rocklr1b.wav models/objects/debris2/tris.md2"
                   1900:        },
                   1901: 
                   1902: /*QUAKED weapon_hyperblaster (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   1903: */
                   1904:        {
                   1905:                "weapon_hyperblaster", 
                   1906:                Pickup_Weapon,
                   1907:                Use_Weapon,
                   1908:                Drop_Weapon,
                   1909:                Weapon_HyperBlaster,
                   1910:                "misc/w_pkup.wav",
                   1911:                "models/weapons/g_hyperb/tris.md2", EF_ROTATE,
                   1912:                "models/weapons/v_hyperb/tris.md2",
                   1913: /* icon */             "w_hyperblaster",
                   1914: /* pickup */   "HyperBlaster",
                   1915:                0,
                   1916:                1,
                   1917:                "Cells",
                   1918:                IT_WEAPON|IT_STAY_COOP,
                   1919:                WEAP_HYPERBLASTER,
                   1920:                NULL,
                   1921:                0,
                   1922: /* precache */ "weapons/hyprbu1a.wav weapons/hyprbl1a.wav weapons/hyprbf1a.wav weapons/hyprbd1a.wav misc/lasfly.wav"
                   1923:        },
                   1924: 
                   1925:        // ROGUE
                   1926: /*QUAKED weapon_heatbeam (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   1927: */ 
                   1928: /*QUAKED weapon_plasmabeam (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   1929: */ 
                   1930:        {
                   1931:                "weapon_plasmabeam",                                                            // classname
                   1932:                Pickup_Weapon,                                                                          // pickup function
                   1933:                Use_Weapon,                                                                                     // use function
                   1934:                Drop_Weapon,                                                                            // drop function
                   1935:                Weapon_Heatbeam,                                                                        // weapon think function
                   1936:                "misc/w_pkup.wav",                                                                      // pick up sound
                   1937:                "models/weapons/g_beamer/tris.md2", EF_ROTATE,          // world model, world model flags
                   1938:                "models/weapons/v_beamer/tris.md2",                                     // view model
                   1939:                "w_heatbeam",                                                                                   // icon
                   1940:                "Plasma Beam",                                                                                  // name printed when picked up 
                   1941:                0,                                                                                                      // number of digits for statusbar
                   1942:                // FIXME - if this changes, change it in NoAmmoWeaponChange as well
                   1943:                2,                                                                                                      // amount used / contained
                   1944:                "Cells",                                                                                        // ammo type used 
                   1945:                IT_WEAPON,                                                                                      // inventory flags
                   1946:                WEAP_PLASMA,                                                                            // visible weapon
                   1947:                NULL,                                                                                           // info (void *)
                   1948:                0,                                                                                                      // tag
                   1949:                "models/weapons/v_beamer2/tris.md2 weapons/bfg__l1a.wav",               // precaches
                   1950:        },
                   1951:        //rogue
                   1952: /*QUAKED weapon_railgun (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   1953: */
                   1954:        {
                   1955:                "weapon_railgun", 
                   1956:                Pickup_Weapon,
                   1957:                Use_Weapon,
                   1958:                Drop_Weapon,
                   1959:                Weapon_Railgun,
                   1960:                "misc/w_pkup.wav",
                   1961:                "models/weapons/g_rail/tris.md2", EF_ROTATE,
                   1962:                "models/weapons/v_rail/tris.md2",
                   1963: /* icon */             "w_railgun",
                   1964: /* pickup */   "Railgun",
                   1965:                0,
                   1966:                1,
                   1967:                "Slugs",
                   1968:                IT_WEAPON|IT_STAY_COOP,
                   1969:                WEAP_RAILGUN,
                   1970:                NULL,
                   1971:                0,
                   1972: /* precache */ "weapons/rg_hum.wav"
                   1973:        },
                   1974: 
                   1975: /*QUAKED weapon_bfg (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   1976: */
                   1977:        {
                   1978:                "weapon_bfg",
                   1979:                Pickup_Weapon,
                   1980:                Use_Weapon,
                   1981:                Drop_Weapon,
                   1982:                Weapon_BFG,
                   1983:                "misc/w_pkup.wav",
                   1984:                "models/weapons/g_bfg/tris.md2", EF_ROTATE,
                   1985:                "models/weapons/v_bfg/tris.md2",
                   1986: /* icon */             "w_bfg",
                   1987: /* pickup */   "BFG10K",
                   1988:                0,
                   1989:                50,
                   1990:                "Cells",
                   1991:                IT_WEAPON|IT_STAY_COOP,
                   1992:                WEAP_BFG,
                   1993:                NULL,
                   1994:                0,
                   1995: /* precache */ "sprites/s_bfg1.sp2 sprites/s_bfg2.sp2 sprites/s_bfg3.sp2 weapons/bfg__f1y.wav weapons/bfg__l1a.wav weapons/bfg__x1b.wav weapons/bfg_hum.wav"
                   1996:        },
                   1997: 
                   1998: // =========================
                   1999: // ROGUE WEAPONS
                   2000: /*QUAKED weapon_chainfist (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2001: */
                   2002:        {
                   2003:                "weapon_chainfist",                                                                     // classname
                   2004:                Pickup_Weapon,                                                                          // pickup function
                   2005:                Use_Weapon,                                                                                     // use function
                   2006:                Drop_Weapon,                                                                            // drop function
                   2007:                Weapon_ChainFist,                                                                       // weapon think function
                   2008:                "misc/w_pkup.wav",                                                                      // pick up sound
                   2009:                "models/weapons/g_chainf/tris.md2", EF_ROTATE,          // world model, world model flags
                   2010:                "models/weapons/v_chainf/tris.md2",                                     // view model
                   2011:                "w_chainfist",                                                                          // icon
                   2012:                "Chainfist",                                                                            // name printed when picked up 
                   2013:                0,                                                                                                      // number of digits for statusbar
                   2014:                0,                                                                                                      // amount used / contained
                   2015:                NULL,                                                                                           // ammo type used 
                   2016:                IT_WEAPON | IT_MELEE,                                                           // inventory flags
                   2017:                WEAP_CHAINFIST,                                                                         // visible weapon
                   2018:                NULL,                                                                                           // info (void *)
                   2019:                1,                                                                                                      // tag
                   2020:                "weapons/sawidle.wav weapons/sawhit.wav",                       // precaches
                   2021:        },
                   2022: 
                   2023: /*QUAKED weapon_disintegrator (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2024: */
                   2025:        {
                   2026:                "weapon_disintegrator",                                                         // classname
                   2027:                Pickup_Weapon,                                                                          // pickup function
                   2028:                Use_Weapon,                                                                                     // use function
                   2029:                Drop_Weapon,                                                                            // drop function
                   2030:                Weapon_Disintegrator,                                                           // weapon think function
                   2031:                "misc/w_pkup.wav",                                                                      // pick up sound
                   2032:                "models/weapons/g_dist/tris.md2", EF_ROTATE,            // world model, world model flags
                   2033:                "models/weapons/v_dist/tris.md2",                                       // view model
                   2034:                "w_disintegrator",                                                                      // icon
                   2035:                "Disruptor",                                                                            // name printed when picked up 
                   2036:                0,                                                                                                      // number of digits for statusbar
                   2037:                1,                                                                                                      // amount used / contained
                   2038:                "Rounds",                                                                                       // ammo type used 
                   2039: #ifdef KILL_DISRUPTOR
                   2040:                IT_NOT_GIVEABLE,
                   2041: #else
                   2042:                IT_WEAPON,                                                                                      // inventory flags
                   2043: #endif
                   2044:                WEAP_DISRUPTOR,                                                                         // visible weapon
                   2045:                NULL,                                                                                           // info (void *)
                   2046:                1,                                                                                                      // tag
                   2047:                "models/items/spawngro/tris.md2 models/proj/disintegrator/tris.md2 weapons/disrupt.wav weapons/disint2.wav weapons/disrupthit.wav",     // precaches
                   2048:        },
                   2049: 
                   2050: // ROGUE WEAPONS
                   2051: // =========================
                   2052: 
                   2053: 
                   2054:        //
                   2055:        // AMMO ITEMS
                   2056:        //
                   2057: 
                   2058: /*QUAKED ammo_shells (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2059: */
                   2060:        {
                   2061:                "ammo_shells",
                   2062:                Pickup_Ammo,
                   2063:                NULL,
                   2064:                Drop_Ammo,
                   2065:                NULL,
                   2066:                "misc/am_pkup.wav",
                   2067:                "models/items/ammo/shells/medium/tris.md2", 0,
                   2068:                NULL,
                   2069: /* icon */             "a_shells",
                   2070: /* pickup */   "Shells",
                   2071: /* width */            3,
                   2072:                10,
                   2073:                NULL,
                   2074:                IT_AMMO,
                   2075:                0,
                   2076:                NULL,
                   2077:                AMMO_SHELLS,
                   2078: /* precache */ ""
                   2079:        },
                   2080: 
                   2081: /*QUAKED ammo_bullets (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2082: */
                   2083:        {
                   2084:                "ammo_bullets",
                   2085:                Pickup_Ammo,
                   2086:                NULL,
                   2087:                Drop_Ammo,
                   2088:                NULL,
                   2089:                "misc/am_pkup.wav",
                   2090:                "models/items/ammo/bullets/medium/tris.md2", 0,
                   2091:                NULL,
                   2092: /* icon */             "a_bullets",
                   2093: /* pickup */   "Bullets",
                   2094: /* width */            3,
                   2095:                50,
                   2096:                NULL,
                   2097:                IT_AMMO,
                   2098:                0,
                   2099:                NULL,
                   2100:                AMMO_BULLETS,
                   2101: /* precache */ ""
                   2102:        },
                   2103: 
                   2104: /*QUAKED ammo_cells (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2105: */
                   2106:        {
                   2107:                "ammo_cells",
                   2108:                Pickup_Ammo,
                   2109:                NULL,
                   2110:                Drop_Ammo,
                   2111:                NULL,
                   2112:                "misc/am_pkup.wav",
                   2113:                "models/items/ammo/cells/medium/tris.md2", 0,
                   2114:                NULL,
                   2115: /* icon */             "a_cells",
                   2116: /* pickup */   "Cells",
                   2117: /* width */            3,
                   2118:                50,
                   2119:                NULL,
                   2120:                IT_AMMO,
                   2121:                0,
                   2122:                NULL,
                   2123:                AMMO_CELLS,
                   2124: /* precache */ ""
                   2125:        },
                   2126: 
                   2127: /*QUAKED ammo_rockets (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2128: */
                   2129:        {
                   2130:                "ammo_rockets",
                   2131:                Pickup_Ammo,
                   2132:                NULL,
                   2133:                Drop_Ammo,
                   2134:                NULL,
                   2135:                "misc/am_pkup.wav",
                   2136:                "models/items/ammo/rockets/medium/tris.md2", 0,
                   2137:                NULL,
                   2138: /* icon */             "a_rockets",
                   2139: /* pickup */   "Rockets",
                   2140: /* width */            3,
                   2141:                5,
                   2142:                NULL,
                   2143:                IT_AMMO,
                   2144:                0,
                   2145:                NULL,
                   2146:                AMMO_ROCKETS,
                   2147: /* precache */ ""
                   2148:        },
                   2149: 
                   2150: /*QUAKED ammo_slugs (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2151: */
                   2152:        {
                   2153:                "ammo_slugs",
                   2154:                Pickup_Ammo,
                   2155:                NULL,
                   2156:                Drop_Ammo,
                   2157:                NULL,
                   2158:                "misc/am_pkup.wav",
                   2159:                "models/items/ammo/slugs/medium/tris.md2", 0,
                   2160:                NULL,
                   2161: /* icon */             "a_slugs",
                   2162: /* pickup */   "Slugs",
                   2163: /* width */            3,
                   2164:                10,
                   2165:                NULL,
                   2166:                IT_AMMO,
                   2167:                0,
                   2168:                NULL,
                   2169:                AMMO_SLUGS,
                   2170: /* precache */ ""
                   2171:        },
                   2172: 
                   2173: // =======================================
                   2174: // ROGUE AMMO
                   2175: 
                   2176: /*QUAKED ammo_nails (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2177: */
                   2178: /*QUAKED ammo_flechettes (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2179: */
                   2180:        {
                   2181:                "ammo_flechettes",
                   2182:                Pickup_Ammo,
                   2183:                NULL,
                   2184:                Drop_Ammo,
                   2185:                NULL,
                   2186:                "misc/am_pkup.wav",
                   2187:                "models/ammo/am_flechette/tris.md2", 0,
                   2188:                NULL,
                   2189:                "a_flechettes",         //FIXME
                   2190:                "Flechettes",
                   2191:                3,
                   2192:                50,
                   2193:                NULL,
                   2194:                IT_AMMO,
                   2195:                0,
                   2196:                NULL,
                   2197:                AMMO_FLECHETTES
                   2198:        },
                   2199: /*QUAKED ammo_prox (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2200: */
                   2201:        {
                   2202:                "ammo_prox",
                   2203:                Pickup_Ammo,
                   2204:                NULL,                   // Use_Weapon,
                   2205:                Drop_Ammo,
                   2206:                NULL,                   // Weapon_Prox,
                   2207:                "misc/am_pkup.wav",
                   2208:                "models/ammo/am_prox/tris.md2", 0,
                   2209:                NULL,           // "models/weapons/v_prox/tris.md2",
                   2210:                "a_prox",
                   2211:                "prox",         // FIXME 
                   2212:                3,
                   2213:                5,
                   2214:                "prox",
                   2215:                IT_AMMO,                // IT_AMMO | IT_WEAPON,
                   2216:                0,
                   2217:                NULL,
                   2218:                AMMO_PROX,
                   2219:                "models/weapons/g_prox/tris.md2 weapons/proxwarn.wav"
                   2220:        },
                   2221: 
                   2222: /*QUAKED ammo_tesla (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2223: */
                   2224:        {
                   2225:                "ammo_tesla",
                   2226:                Pickup_Ammo,
                   2227:                Use_Weapon,                                             // PGM
                   2228:                Drop_Ammo,
                   2229:                Weapon_Tesla,                                   // PGM
                   2230:                "misc/am_pkup.wav",
                   2231: //             "models/weapons/g_tesla/tris.md2", 0,
                   2232:                "models/ammo/am_tesl/tris.md2", 0,
                   2233:                "models/weapons/v_tesla/tris.md2",
                   2234:                "a_tesla",
                   2235:                "Tesla",
                   2236:                3,
                   2237:                5,
                   2238:                "Tesla",                                                                                                // PGM
                   2239:                IT_AMMO | IT_WEAPON,                                            // inventory flags
                   2240:                0,
                   2241:                NULL,                                                                           // info (void *)
                   2242:                AMMO_TESLA,                                                                     // tag
                   2243:                "models/weapons/v_tesla2/tris.md2 weapons/hgrenb1a.wav weapons/hgrenb2a.wav models/weapons/g_tesla/tris.md2"                    // precache
                   2244:        },
                   2245: 
                   2246: /*QUAKED ammo_nuke (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2247: */
                   2248:        {
                   2249:                "ammo_nuke",
                   2250:                Pickup_Nuke,
                   2251:                Use_Nuke,                                               // PMM
                   2252:                Drop_Ammo,
                   2253:                NULL,                                                   // PMM
                   2254:                "misc/am_pkup.wav",
                   2255:                "models/weapons/g_nuke/tris.md2", EF_ROTATE,
                   2256:                NULL,
                   2257: /* icon */             "p_nuke",
                   2258: /* pickup */   "Nuke",
                   2259: /* width */            3,
                   2260:                300, /* quantity (used for respawn time) */
                   2261:                "Nuke",
                   2262:                IT_POWERUP,     
                   2263:                0,
                   2264:                NULL,
                   2265:                0,
                   2266:                "weapons/nukewarn2.wav world/rumble.wav"
                   2267:        },
                   2268: 
                   2269: /*QUAKED ammo_disruptor (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2270: */
                   2271:        {
                   2272:                "ammo_disruptor",
                   2273:                Pickup_Ammo,
                   2274:                NULL,
                   2275:                Drop_Ammo,
                   2276:                NULL,
                   2277:                "misc/am_pkup.wav",
                   2278:                "models/ammo/am_disr/tris.md2", 0,
                   2279:                NULL,
                   2280:                "a_disruptor",
                   2281:                "Rounds",               // FIXME 
                   2282:                3,
                   2283:                15,
                   2284:                NULL,
                   2285: #ifdef KILL_DISRUPTOR
                   2286:                IT_NOT_GIVEABLE,
                   2287: #else
                   2288:                IT_AMMO,                                                                                        // inventory flags
                   2289: #endif
                   2290:                0,
                   2291:                NULL,
                   2292: #ifdef KILL_DISRUPTOR
                   2293:                0,
                   2294: #else
                   2295:                AMMO_DISRUPTOR,
                   2296: #endif
                   2297:        },
                   2298: // ROGUE AMMO
                   2299: // =======================================
                   2300: 
                   2301:        //
                   2302:        // POWERUP ITEMS
                   2303:        //
                   2304: /*QUAKED item_quad (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2305: */
                   2306:        {
                   2307:                "item_quad", 
                   2308:                Pickup_Powerup,
                   2309:                Use_Quad,
                   2310:                Drop_General,
                   2311:                NULL,
                   2312:                "items/pkup.wav",
                   2313:                "models/items/quaddama/tris.md2", EF_ROTATE,
                   2314:                NULL,
                   2315: /* icon */             "p_quad",
                   2316: /* pickup */   "Quad Damage",
                   2317: /* width */            2,
                   2318:                60,
                   2319:                NULL,
                   2320:                IT_POWERUP,
                   2321:                0,
                   2322:                NULL,
                   2323:                0,
                   2324: /* precache */ "items/damage.wav items/damage2.wav items/damage3.wav"
                   2325:        },
                   2326: 
                   2327: /*QUAKED item_invulnerability (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2328: */
                   2329:        {
                   2330:                "item_invulnerability",
                   2331:                Pickup_Powerup,
                   2332:                Use_Invulnerability,
                   2333:                Drop_General,
                   2334:                NULL,
                   2335:                "items/pkup.wav",
                   2336:                "models/items/invulner/tris.md2", EF_ROTATE,
                   2337:                NULL,
                   2338: /* icon */             "p_invulnerability",
                   2339: /* pickup */   "Invulnerability",
                   2340: /* width */            2,
                   2341:                300,
                   2342:                NULL,
                   2343:                IT_POWERUP,
                   2344:                0,
                   2345:                NULL,
                   2346:                0,
                   2347: /* precache */ "items/protect.wav items/protect2.wav items/protect4.wav"
                   2348:        },
                   2349: 
                   2350: /*QUAKED item_silencer (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2351: */
                   2352:        {
                   2353:                "item_silencer",
                   2354:                Pickup_Powerup,
                   2355:                Use_Silencer,
                   2356:                Drop_General,
                   2357:                NULL,
                   2358:                "items/pkup.wav",
                   2359:                "models/items/silencer/tris.md2", EF_ROTATE,
                   2360:                NULL,
                   2361: /* icon */             "p_silencer",
                   2362: /* pickup */   "Silencer",
                   2363: /* width */            2,
                   2364:                60,
                   2365:                NULL,
                   2366:                IT_POWERUP,
                   2367:                0,
                   2368:                NULL,
                   2369:                0,
                   2370: /* precache */ ""
                   2371:        },
                   2372: 
                   2373: /*QUAKED item_breather (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2374: */
                   2375:        {
                   2376:                "item_breather",
                   2377:                Pickup_Powerup,
                   2378:                Use_Breather,
                   2379:                Drop_General,
                   2380:                NULL,
                   2381:                "items/pkup.wav",
                   2382:                "models/items/breather/tris.md2", EF_ROTATE,
                   2383:                NULL,
                   2384: /* icon */             "p_rebreather",
                   2385: /* pickup */   "Rebreather",
                   2386: /* width */            2,
                   2387:                60,
                   2388:                NULL,
                   2389:                IT_STAY_COOP|IT_POWERUP,
                   2390:                0,
                   2391:                NULL,
                   2392:                0,
                   2393: /* precache */ "items/airout.wav"
                   2394:        },
                   2395: 
                   2396: /*QUAKED item_enviro (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2397: */
                   2398:        {
                   2399:                "item_enviro",
                   2400:                Pickup_Powerup,
                   2401:                Use_Envirosuit,
                   2402:                Drop_General,
                   2403:                NULL,
                   2404:                "items/pkup.wav",
                   2405:                "models/items/enviro/tris.md2", EF_ROTATE,
                   2406:                NULL,
                   2407: /* icon */             "p_envirosuit",
                   2408: /* pickup */   "Environment Suit",
                   2409: /* width */            2,
                   2410:                60,
                   2411:                NULL,
                   2412:                IT_STAY_COOP|IT_POWERUP,
                   2413:                0,
                   2414:                NULL,
                   2415:                0,
                   2416: /* precache */ "items/airout.wav"
                   2417:        },
                   2418: 
                   2419: /*QUAKED item_ancient_head (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2420: Special item that gives +2 to maximum health
                   2421: */
                   2422:        {
                   2423:                "item_ancient_head",
                   2424:                Pickup_AncientHead,
                   2425:                NULL,
                   2426:                NULL,
                   2427:                NULL,
                   2428:                "items/pkup.wav",
                   2429:                "models/items/c_head/tris.md2", EF_ROTATE,
                   2430:                NULL,
                   2431: /* icon */             "i_fixme",
                   2432: /* pickup */   "Ancient Head",
                   2433: /* width */            2,
                   2434:                60,
                   2435:                NULL,
                   2436:                0,
                   2437:                0,
                   2438:                NULL,
                   2439:                0,
                   2440: /* precache */ ""
                   2441:        },
                   2442: 
                   2443: /*QUAKED item_adrenaline (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2444: gives +1 to maximum health
                   2445: */
                   2446:        {
                   2447:                "item_adrenaline",
                   2448:                Pickup_Adrenaline,
                   2449:                NULL,
                   2450:                NULL,
                   2451:                NULL,
                   2452:                "items/pkup.wav",
                   2453:                "models/items/adrenal/tris.md2", EF_ROTATE,
                   2454:                NULL,
                   2455: /* icon */             "p_adrenaline",
                   2456: /* pickup */   "Adrenaline",
                   2457: /* width */            2,
                   2458:                60,
                   2459:                NULL,
                   2460:                0,
                   2461:                0,
                   2462:                NULL,
                   2463:                0,
                   2464: /* precache */ ""
                   2465:        },
                   2466: 
                   2467: /*QUAKED item_bandolier (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2468: */
                   2469:        {
                   2470:                "item_bandolier",
                   2471:                Pickup_Bandolier,
                   2472:                NULL,
                   2473:                NULL,
                   2474:                NULL,
                   2475:                "items/pkup.wav",
                   2476:                "models/items/band/tris.md2", EF_ROTATE,
                   2477:                NULL,
                   2478: /* icon */             "p_bandolier",
                   2479: /* pickup */   "Bandolier",
                   2480: /* width */            2,
                   2481:                60,
                   2482:                NULL,
                   2483:                0,
                   2484:                0,
                   2485:                NULL,
                   2486:                0,
                   2487: /* precache */ ""
                   2488:        },
                   2489: 
                   2490: /*QUAKED item_pack (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2491: */
                   2492:        {
                   2493:                "item_pack",
                   2494:                Pickup_Pack,
                   2495:                NULL,
                   2496:                NULL,
                   2497:                NULL,
                   2498:                "items/pkup.wav",
                   2499:                "models/items/pack/tris.md2", EF_ROTATE,
                   2500:                NULL,
                   2501: /* icon */             "i_pack",
                   2502: /* pickup */   "Ammo Pack",
                   2503: /* width */            2,
                   2504:                180,
                   2505:                NULL,
                   2506:                0,
                   2507:                0,
                   2508:                NULL,
                   2509:                0,
                   2510: /* precache */ ""
                   2511:        },
                   2512: 
                   2513: // ======================================
                   2514: // PGM
                   2515: 
                   2516: /*QUAKED item_ir_goggles (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2517: gives +1 to maximum health
                   2518: */
                   2519:        {
                   2520:                "item_ir_goggles",
                   2521:                Pickup_Powerup,
                   2522:                Use_IR,
                   2523:                Drop_General,
                   2524:                NULL,
                   2525:                "items/pkup.wav",
                   2526:                "models/items/goggles/tris.md2", EF_ROTATE,
                   2527:                NULL,
                   2528: /* icon */             "p_ir",
                   2529: /* pickup */   "IR Goggles",
                   2530: /* width */            2,
                   2531:                60,
                   2532:                NULL,
                   2533:                IT_POWERUP,
                   2534:                0,
                   2535:                NULL,
                   2536:                0,
                   2537: /* precache */ ""
                   2538:        },
                   2539: 
                   2540: /*QUAKED item_double (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2541: */
                   2542:        {
                   2543:                "item_double", 
                   2544:                Pickup_Powerup,
                   2545:                Use_Double,
                   2546:                Drop_General,
                   2547:                NULL,
                   2548:                "items/pkup.wav",
                   2549:                "models/items/ddamage/tris.md2", EF_ROTATE,
                   2550:                NULL,
                   2551: /* icon */             "p_double",
                   2552: /* pickup */   "Double Damage",
                   2553: /* width */            2,
                   2554:                60,
                   2555:                NULL,
                   2556:                IT_POWERUP,
                   2557:                0,
                   2558:                NULL,
                   2559:                0,
                   2560: /* precache */ "items/damage.wav items/damage2.wav items/damage3.wav"
                   2561:        },
                   2562: 
                   2563: /*QUAKED item_torch (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2564: */
                   2565:        {
                   2566:                "item_torch", 
                   2567:                Pickup_Powerup,
                   2568:                Use_Torch,
                   2569:                Drop_General,
                   2570:                NULL,
                   2571:                "items/pkup.wav",
                   2572:                "models/objects/fire/tris.md2", EF_ROTATE,
                   2573:                NULL,
                   2574: /* icon */             "p_torch",
                   2575: /* pickup */   "torch",
                   2576: /* width */            2,
                   2577:                60,
                   2578:                NULL,
                   2579:                IT_POWERUP,
                   2580:                0,
                   2581:                NULL,
                   2582:                0,
                   2583:        },
                   2584: 
                   2585: /*QUAKED item_compass (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2586: */
                   2587:        {
                   2588:                "item_compass", 
                   2589:                Pickup_Powerup,
                   2590:                Use_Compass,
                   2591:                NULL,
                   2592:                NULL,
                   2593:                "items/pkup.wav",
                   2594:                "models/objects/fire/tris.md2", EF_ROTATE,
                   2595:                NULL,
                   2596: /* icon */             "p_compass",
                   2597: /* pickup */   "compass",
                   2598: /* width */            2,
                   2599:                60,
                   2600:                NULL,
                   2601:                IT_POWERUP,
                   2602:                0,
                   2603:                NULL,
                   2604:                0,
                   2605:        },
                   2606: 
                   2607: /*QUAKED item_sphere_vengeance (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2608: */
                   2609:        {
                   2610:                "item_sphere_vengeance", 
                   2611:                Pickup_Sphere,
                   2612:                Use_Vengeance,
                   2613:                NULL,
                   2614:                NULL,
                   2615:                "items/pkup.wav",
                   2616:                "models/items/vengnce/tris.md2", EF_ROTATE,
                   2617:                NULL,
                   2618: /* icon */             "p_vengeance",
                   2619: /* pickup */   "vengeance sphere",
                   2620: /* width */            2,
                   2621:                60,
                   2622:                NULL,
                   2623:                IT_POWERUP,
                   2624:                0,
                   2625:                NULL,
                   2626:                0,
                   2627:                "powerup/vsphere.wav"           //precache
                   2628:        },
                   2629: 
                   2630: /*QUAKED item_sphere_hunter (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2631: */
                   2632:        {
                   2633:                "item_sphere_hunter", 
                   2634:                Pickup_Sphere,
                   2635:                Use_Hunter,
                   2636:                NULL,
                   2637:                NULL,
                   2638:                "items/pkup.wav",
                   2639:                "models/items/hunter/tris.md2", EF_ROTATE,
                   2640:                NULL,
                   2641: /* icon */             "p_hunter",
                   2642: /* pickup */   "hunter sphere",
                   2643: /* width */            2,
                   2644:                60,
                   2645:                NULL,
                   2646:                IT_POWERUP,
                   2647:                0,
                   2648:                NULL,
                   2649:                0,
                   2650:                "powerup/hsphere.wav"           //precache
                   2651:        },
                   2652: 
                   2653: /*QUAKED item_sphere_defender (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2654: */
                   2655:        {
                   2656:                "item_sphere_defender", 
                   2657:                Pickup_Sphere,
                   2658:                Use_Defender,
                   2659:                NULL,
                   2660:                NULL,
                   2661:                "items/pkup.wav",
                   2662:                "models/items/defender/tris.md2", EF_ROTATE,
                   2663:                NULL,
                   2664: /* icon */             "p_defender",
                   2665: /* pickup */   "defender sphere",
                   2666: /* width */            2,
                   2667:                60,                                                                                                     // respawn time
                   2668:                NULL,                                                                                           // ammo type used
                   2669:                IT_POWERUP,                                                                                     // inventory flags
                   2670:                0,
                   2671:                NULL,                                                                                           // info (void *)
                   2672:                0,                                                                                                      // tag
                   2673:                "models/proj/laser2/tris.md2 models/items/shell/tris.md2 powerup/dsphere.wav"           // precache
                   2674:        },
                   2675: 
                   2676: /*QUAKED item_doppleganger (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2677: */
                   2678:        {
                   2679:                "item_doppleganger",                                                            // classname
                   2680:                Pickup_Doppleganger,                                                            // pickup function
                   2681:                Use_Doppleganger,                                                                       // use function
                   2682:                Drop_General,                                                                           // drop function
                   2683:                NULL,                                                                                           // weapon think function
                   2684:                "items/pkup.wav",                                                                       // pick up sound
                   2685:                "models/items/dopple/tris.md2",                                         // world model
                   2686:                EF_ROTATE,                                                                                      // world model flags
                   2687:                NULL,                                                                                           // view model
                   2688:                "p_doppleganger",                                                                       // icon
                   2689:                "Doppleganger",                                                                         // name printed when picked up 
                   2690:                0,                                                                                                      // number of digits for statusbar
                   2691:                90,                                                                                                     // respawn time
                   2692:                NULL,                                                                                           // ammo type used 
                   2693:                IT_POWERUP,                                                                                     // inventory flags
                   2694:                0,
                   2695:                NULL,                                                                                           // info (void *)
                   2696:                0,                                                                                                      // tag
                   2697:                "models/objects/dopplebase/tris.md2 models/items/spawngro2/tris.md2 models/items/hunter/tris.md2 models/items/vengnce/tris.md2",                // precaches
                   2698:        },
                   2699: 
                   2700:        {
                   2701: //             "dm_tag_token",                                                                         // classname
                   2702:                NULL,                                                                                           // classname
                   2703:                Tag_PickupToken,                                                                        // pickup function
                   2704:                NULL,                                                                                           // use function
                   2705:                NULL,                                                                                           // drop function
                   2706:                NULL,                                                                                           // weapon think function
                   2707:                "items/pkup.wav",                                                                       // pick up sound
                   2708:                "models/items/tagtoken/tris.md2",                                       // world model
                   2709:                EF_ROTATE | EF_TAGTRAIL,                                                        // world model flags
                   2710:                NULL,                                                                                           // view model
                   2711:                "i_fixme",                                                                                      // icon
                   2712:                "Tag Token",                                                                            // name printed when picked up 
                   2713:                0,                                                                                                      // number of digits for statusbar
                   2714:                0,                                                                                                      // amount used / contained
                   2715:                NULL,                                                                                           // ammo type used 
                   2716:                IT_POWERUP | IT_NOT_GIVEABLE,                                           // inventory flags
                   2717:                0,
                   2718:                NULL,                                                                                           // info (void *)
                   2719:                1,                                                                                                      // tag
                   2720:                NULL,                                                                                           // precaches
                   2721:        },
                   2722: 
                   2723: // PGM
                   2724: // ======================================
                   2725: 
                   2726: 
                   2727:        //
                   2728:        // KEYS
                   2729:        //
                   2730: /*QUAKED key_data_cd (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2731: key for computer centers
                   2732: */
                   2733:        {
                   2734:                "key_data_cd",
                   2735:                Pickup_Key,
                   2736:                NULL,
                   2737:                Drop_General,
                   2738:                NULL,
                   2739:                "items/pkup.wav",
                   2740:                "models/items/keys/data_cd/tris.md2", EF_ROTATE,
                   2741:                NULL,
                   2742:                "k_datacd",
                   2743:                "Data CD",
                   2744:                2,
                   2745:                0,
                   2746:                NULL,
                   2747:                IT_STAY_COOP|IT_KEY,
                   2748:                0,
                   2749:                NULL,
                   2750:                0,
                   2751: /* precache */ ""
                   2752:        },
                   2753: 
                   2754: /*QUAKED key_power_cube (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN NO_TOUCH
                   2755: warehouse circuits
                   2756: */
                   2757:        {
                   2758:                "key_power_cube",
                   2759:                Pickup_Key,
                   2760:                NULL,
                   2761:                Drop_General,
                   2762:                NULL,
                   2763:                "items/pkup.wav",
                   2764:                "models/items/keys/power/tris.md2", EF_ROTATE,
                   2765:                NULL,
                   2766:                "k_powercube",
                   2767:                "Power Cube",
                   2768:                2,
                   2769:                0,
                   2770:                NULL,
                   2771:                IT_STAY_COOP|IT_KEY,
                   2772:                0,
                   2773:                NULL,
                   2774:                0,
                   2775: /* precache */ ""
                   2776:        },
                   2777: 
                   2778: /*QUAKED key_pyramid (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2779: key for the entrance of jail3
                   2780: */
                   2781:        {
                   2782:                "key_pyramid",
                   2783:                Pickup_Key,
                   2784:                NULL,
                   2785:                Drop_General,
                   2786:                NULL,
                   2787:                "items/pkup.wav",
                   2788:                "models/items/keys/pyramid/tris.md2", EF_ROTATE,
                   2789:                NULL,
                   2790:                "k_pyramid",
                   2791:                "Pyramid Key",
                   2792:                2,
                   2793:                0,
                   2794:                NULL,
                   2795:                IT_STAY_COOP|IT_KEY,
                   2796:                0,
                   2797:                NULL,
                   2798:                0,
                   2799: /* precache */ ""
                   2800:        },
                   2801: 
                   2802: /*QUAKED key_data_spinner (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2803: key for the city computer
                   2804: */
                   2805:        {
                   2806:                "key_data_spinner",
                   2807:                Pickup_Key,
                   2808:                NULL,
                   2809:                Drop_General,
                   2810:                NULL,
                   2811:                "items/pkup.wav",
                   2812:                "models/items/keys/spinner/tris.md2", EF_ROTATE,
                   2813:                NULL,
                   2814:                "k_dataspin",
                   2815:                "Data Spinner",
                   2816:                2,
                   2817:                0,
                   2818:                NULL,
                   2819:                IT_STAY_COOP|IT_KEY,
                   2820:                0,
                   2821:                NULL,
                   2822:                0,
                   2823: /* precache */ ""
                   2824:        },
                   2825: 
                   2826: /*QUAKED key_pass (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2827: security pass for the security level
                   2828: */
                   2829:        {
                   2830:                "key_pass",
                   2831:                Pickup_Key,
                   2832:                NULL,
                   2833:                Drop_General,
                   2834:                NULL,
                   2835:                "items/pkup.wav",
                   2836:                "models/items/keys/pass/tris.md2", EF_ROTATE,
                   2837:                NULL,
                   2838:                "k_security",
                   2839:                "Security Pass",
                   2840:                2,
                   2841:                0,
                   2842:                NULL,
                   2843:                IT_STAY_COOP|IT_KEY,
                   2844:                0,
                   2845:                NULL,
                   2846:                0,
                   2847: /* precache */ ""
                   2848:        },
                   2849: 
                   2850: /*QUAKED key_blue_key (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2851: normal door key - blue
                   2852: */
                   2853:        {
                   2854:                "key_blue_key",
                   2855:                Pickup_Key,
                   2856:                NULL,
                   2857:                Drop_General,
                   2858:                NULL,
                   2859:                "items/pkup.wav",
                   2860:                "models/items/keys/key/tris.md2", EF_ROTATE,
                   2861:                NULL,
                   2862:                "k_bluekey",
                   2863:                "Blue Key",
                   2864:                2,
                   2865:                0,
                   2866:                NULL,
                   2867:                IT_STAY_COOP|IT_KEY,
                   2868:                0,
                   2869:                NULL,
                   2870:                0,
                   2871: /* precache */ ""
                   2872:        },
                   2873: 
                   2874: /*QUAKED key_red_key (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2875: normal door key - red
                   2876: */
                   2877:        {
                   2878:                "key_red_key",
                   2879:                Pickup_Key,
                   2880:                NULL,
                   2881:                Drop_General,
                   2882:                NULL,
                   2883:                "items/pkup.wav",
                   2884:                "models/items/keys/red_key/tris.md2", EF_ROTATE,
                   2885:                NULL,
                   2886:                "k_redkey",
                   2887:                "Red Key",
                   2888:                2,
                   2889:                0,
                   2890:                NULL,
                   2891:                IT_STAY_COOP|IT_KEY,
                   2892:                0,
                   2893:                NULL,
                   2894:                0,
                   2895: /* precache */ ""
                   2896:        },
                   2897: 
                   2898: /*QUAKED key_commander_head (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2899: tank commander's head
                   2900: */
                   2901:        {
                   2902:                "key_commander_head",
                   2903:                Pickup_Key,
                   2904:                NULL,
                   2905:                Drop_General,
                   2906:                NULL,
                   2907:                "items/pkup.wav",
                   2908:                "models/monsters/commandr/head/tris.md2", EF_GIB,
                   2909:                NULL,
                   2910: /* icon */             "k_comhead",
                   2911: /* pickup */   "Commander's Head",
                   2912: /* width */            2,
                   2913:                0,
                   2914:                NULL,
                   2915:                IT_STAY_COOP|IT_KEY,
                   2916:                0,
                   2917:                NULL,
                   2918:                0,
                   2919: /* precache */ ""
                   2920:        },
                   2921: 
                   2922: /*QUAKED key_airstrike_target (0 .5 .8) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2923: tank commander's head
                   2924: */
                   2925:        {
                   2926:                "key_airstrike_target",
                   2927:                Pickup_Key,
                   2928:                NULL,
                   2929:                Drop_General,
                   2930:                NULL,
                   2931:                "items/pkup.wav",
                   2932:                "models/items/keys/target/tris.md2", EF_ROTATE,
                   2933:                NULL,
                   2934: /* icon */             "i_airstrike",
                   2935: /* pickup */   "Airstrike Marker",
                   2936: /* width */            2,
                   2937:                0,
                   2938:                NULL,
                   2939:                IT_STAY_COOP|IT_KEY,
                   2940:                0,
                   2941:                NULL,
                   2942:                0,
                   2943: /* precache */ ""
                   2944:        },
                   2945: 
                   2946: // ======================================
                   2947: // PGM
                   2948: 
                   2949: /*QUAKED key_nuke_container (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2950: */
                   2951:        {
                   2952:                "key_nuke_container",                                                           // classname
                   2953:                Pickup_Key,                                                                                     // pickup function
                   2954:                NULL,                                                                                           // use function
                   2955:                Drop_General,                                                                           // drop function
                   2956:                NULL,                                                                                           // weapon think function
                   2957:                "items/pkup.wav",                                                                       // pick up sound
                   2958:                "models/weapons/g_nuke/tris.md2",                                       // world model
                   2959:                EF_ROTATE,                                                                                      // world model flags
                   2960:                NULL,                                                                                           // view model
                   2961:                "i_fixme",                                                                                      // icon
                   2962:                "Antimatter Container",                                                         // name printed when picked up 
                   2963:                2,                                                                                                      // number of digits for statusbar
                   2964:                0,                                                                                                      // respawn time
                   2965:                NULL,                                                                                           // ammo type used 
                   2966:                IT_STAY_COOP|IT_KEY,                                                            // inventory flags
                   2967:                0,
                   2968:                NULL,                                                                                           // info (void *)
                   2969:                0,                                                                                                      // tag
                   2970:                NULL,                                                                                           // precaches
                   2971:        },
                   2972: 
                   2973: /*QUAKED key_nuke (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   2974: */
                   2975:        {
                   2976:                "key_nuke",                                                                                     // classname
                   2977:                Pickup_Key,                                                                                     // pickup function
                   2978:                NULL,                                                                                           // use function
                   2979:                Drop_General,                                                                           // drop function
                   2980:                NULL,                                                                                           // weapon think function
                   2981:                "items/pkup.wav",                                                                       // pick up sound
                   2982:                "models/weapons/g_nuke/tris.md2",                                       // world model
                   2983:                EF_ROTATE,                                                                                      // world model flags
                   2984:                NULL,                                                                                           // view model
                   2985:                "i_fixme",                                                                                      // icon
                   2986:                "Antimatter Bomb",                                                                      // name printed when picked up 
                   2987:                2,                                                                                                      // number of digits for statusbar
                   2988:                0,                                                                                                      // respawn time
                   2989:                NULL,                                                                                           // ammo type used 
                   2990:                IT_STAY_COOP|IT_KEY,                                                            // inventory flags
                   2991:                0,
                   2992:                NULL,                                                                                           // info (void *)
                   2993:                0,                                                                                                      // tag
                   2994:                NULL,                                                                                           // precaches
                   2995:        },
                   2996: 
                   2997: // PGM
                   2998: // ======================================
                   2999: 
                   3000:        {
                   3001:                NULL,
                   3002:                Pickup_Health,
                   3003:                NULL,
                   3004:                NULL,
                   3005:                NULL,
                   3006:                "items/pkup.wav",
                   3007:                NULL, 0,
                   3008:                NULL,
                   3009: /* icon */             "i_health",
                   3010: /* pickup */   "Health",
                   3011: /* width */            3,
                   3012:                0,
                   3013:                NULL,
                   3014:                0,
                   3015:                0,
                   3016:                NULL,
                   3017:                0,
                   3018: /* precache */ "items/s_health.wav items/n_health.wav items/l_health.wav items/m_health.wav"
                   3019:        },
                   3020: 
                   3021:        // end of list marker
                   3022:        {NULL}
                   3023: };
                   3024: 
                   3025: 
                   3026: /*QUAKED item_health (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   3027: */
                   3028: void SP_item_health (edict_t *self)
                   3029: {
                   3030:        if ( deathmatch->value && ((int)dmflags->value & DF_NO_HEALTH) )
                   3031:        {
                   3032:                G_FreeEdict (self);
                   3033:                return;
                   3034:        }
                   3035: 
                   3036:        self->model = "models/items/healing/medium/tris.md2";
                   3037:        self->count = 10;
                   3038:        SpawnItem (self, FindItem ("Health"));
                   3039:        gi.soundindex ("items/n_health.wav");
                   3040: }
                   3041: 
                   3042: /*QUAKED item_health_small (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   3043: */
                   3044: void SP_item_health_small (edict_t *self)
                   3045: {
                   3046:        if ( deathmatch->value && ((int)dmflags->value & DF_NO_HEALTH) )
                   3047:        {
                   3048:                G_FreeEdict (self);
                   3049:                return;
                   3050:        }
                   3051: 
                   3052:        self->model = "models/items/healing/stimpack/tris.md2";
                   3053:        self->count = 2;
                   3054:        SpawnItem (self, FindItem ("Health"));
                   3055:        self->style = HEALTH_IGNORE_MAX;
                   3056:        gi.soundindex ("items/s_health.wav");
                   3057: }
                   3058: 
                   3059: /*QUAKED item_health_large (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   3060: */
                   3061: void SP_item_health_large (edict_t *self)
                   3062: {
                   3063:        if ( deathmatch->value && ((int)dmflags->value & DF_NO_HEALTH) )
                   3064:        {
                   3065:                G_FreeEdict (self);
                   3066:                return;
                   3067:        }
                   3068: 
                   3069:        self->model = "models/items/healing/large/tris.md2";
                   3070:        self->count = 25;
                   3071:        SpawnItem (self, FindItem ("Health"));
                   3072:        gi.soundindex ("items/l_health.wav");
                   3073: }
                   3074: 
                   3075: /*QUAKED item_health_mega (.3 .3 1) (-16 -16 -16) (16 16 16) TRIGGER_SPAWN
                   3076: */
                   3077: void SP_item_health_mega (edict_t *self)
                   3078: {
                   3079:        if ( deathmatch->value && ((int)dmflags->value & DF_NO_HEALTH) )
                   3080:        {
                   3081:                G_FreeEdict (self);
                   3082:                return;
                   3083:        }
                   3084: 
                   3085:        self->model = "models/items/mega_h/tris.md2";
                   3086:        self->count = 100;
                   3087:        SpawnItem (self, FindItem ("Health"));
                   3088:        gi.soundindex ("items/m_health.wav");
                   3089:        self->style = HEALTH_IGNORE_MAX|HEALTH_TIMED;
                   3090: }
                   3091: 
                   3092: 
                   3093: void InitItems (void)
                   3094: {
                   3095:        game.num_items = sizeof(itemlist)/sizeof(itemlist[0]) - 1;
                   3096: }
                   3097: 
                   3098: 
                   3099: 
                   3100: /*
                   3101: ===============
                   3102: SetItemNames
                   3103: 
                   3104: Called by worldspawn
                   3105: ===============
                   3106: */
                   3107: void SetItemNames (void)
                   3108: {
                   3109:        int             i;
                   3110:        gitem_t *it;
                   3111: 
                   3112:        for (i=0 ; i<game.num_items ; i++)
                   3113:        {
                   3114:                it = &itemlist[i];
                   3115:                gi.configstring (CS_ITEMS+i, it->pickup_name);
                   3116:        }
                   3117: 
                   3118:        jacket_armor_index = ITEM_INDEX(FindItem("Jacket Armor"));
                   3119:        combat_armor_index = ITEM_INDEX(FindItem("Combat Armor"));
                   3120:        body_armor_index   = ITEM_INDEX(FindItem("Body Armor"));
                   3121:        power_screen_index = ITEM_INDEX(FindItem("Power Screen"));
                   3122:        power_shield_index = ITEM_INDEX(FindItem("Power Shield"));
                   3123: }
                   3124: 
                   3125: 
                   3126: //===============
                   3127: //ROGUE
                   3128: void SP_xatrix_item (edict_t *self)
                   3129: {
                   3130:        gitem_t *item;
                   3131:        int             i;
                   3132:        char    *spawnClass;
                   3133: 
                   3134:        if(!self->classname)
                   3135:                return;
                   3136: 
                   3137:        if(!strcmp(self->classname, "ammo_magslug"))
                   3138:                spawnClass = "ammo_flechettes";
                   3139:        else if(!strcmp(self->classname, "ammo_trap"))
                   3140:                spawnClass = "weapon_proxlauncher";
                   3141:        else if(!strcmp(self->classname, "item_quadfire"))
                   3142:        {
                   3143:                float   chance;
                   3144: 
                   3145:                chance = random();
                   3146:                if(chance < 0.2)
                   3147:                        spawnClass = "item_sphere_hunter";
                   3148:                else if (chance < 0.6)
                   3149:                        spawnClass = "item_sphere_vengeance";
                   3150:                else
                   3151:                        spawnClass = "item_sphere_defender";
                   3152:        }
                   3153:        else if(!strcmp(self->classname, "weapon_boomer"))
                   3154:                spawnClass = "weapon_etf_rifle";
                   3155:        else if(!strcmp(self->classname, "weapon_phalanx"))
                   3156:                spawnClass = "weapon_heatbeam";
                   3157: 
                   3158: 
                   3159:        // check item spawn functions
                   3160:        for (i=0,item=itemlist ; i<game.num_items ; i++,item++)
                   3161:        {
                   3162:                if (!item->classname)
                   3163:                        continue;
                   3164:                if (!strcmp(item->classname, spawnClass))
                   3165:                {       // found it
                   3166:                        SpawnItem (self, item);
                   3167:                        return;
                   3168:                }
                   3169:        }
                   3170: }
                   3171: //ROGUE
                   3172: //===============

unix.superglobalmegacorp.com

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