Annotation of quakeworld/progs/items.qc, revision 1.1.1.1

1.1       root        1: void() W_SetCurrentAmmo;
                      2: /* ALL LIGHTS SHOULD BE 0 1 0 IN COLOR ALL OTHER ITEMS SHOULD
                      3: BE .8 .3 .4 IN COLOR */
                      4: 
                      5: 
                      6: void() SUB_regen =
                      7: {
                      8:        self.model = self.mdl;          // restore original model
                      9:        self.solid = SOLID_TRIGGER;     // allow it to be touched again
                     10:        sound (self, CHAN_VOICE, "items/itembk2.wav", 1, ATTN_NORM);    // play respawn sound
                     11:        setorigin (self, self.origin);
                     12: };
                     13: 
                     14: 
                     15: 
                     16: /*QUAKED noclass (0 0 0) (-8 -8 -8) (8 8 8)
                     17: prints a warning message when spawned
                     18: */
                     19: void() noclass =
                     20: {
                     21:        dprint ("noclass spawned at");
                     22:        dprint (vtos(self.origin));
                     23:        dprint ("\n");
                     24:        remove (self);
                     25: };
                     26: 
                     27: void() q_touch;
                     28: 
                     29: void() q_touch =
                     30: {
                     31: local entity    stemp;
                     32: local float     best;
                     33: local string    s;
                     34: 
                     35:        if (other.classname != "player")
                     36:                return;
                     37:        if (other.health <= 0)
                     38:                return;
                     39: 
                     40:        self.mdl = self.model;
                     41: 
                     42:        sound (other, CHAN_VOICE, self.noise, 1, ATTN_NORM);
                     43:        stuffcmd (other, "bf\n");
                     44:        self.solid = SOLID_NOT;
                     45:        other.items = other.items | IT_QUAD;
                     46:        self.model = string_null;
                     47:                if (deathmatch == 4)
                     48:                {
                     49:                        other.armortype = 0;
                     50:                        other.armorvalue = 0 * 0.01;
                     51:                        other.ammo_cells = 0;
                     52:                }
                     53: 
                     54: // do the apropriate action
                     55:        other.super_time = 1;
                     56:        other.super_damage_finished = self.cnt;
                     57: 
                     58:        s=ftos(rint(other.super_damage_finished - time));
                     59: 
                     60:        bprint (PRINT_LOW, other.netname);
                     61:        if (deathmatch == 4)
                     62:                bprint (PRINT_LOW, " recovered an OctaPower with ");
                     63:        else 
                     64:                bprint (PRINT_LOW, " recovered a Quad with ");
                     65:        bprint (PRINT_LOW, s);
                     66:        bprint (PRINT_LOW, " seconds remaining!\n");
                     67: 
                     68:        activator = other;
                     69:        SUB_UseTargets();                               // fire all targets / killtargets
                     70: };
                     71: 
                     72: 
                     73: void(float timeleft) DropQuad =
                     74: {
                     75:        local entity    item;
                     76: 
                     77:        item = spawn();
                     78:        item.origin = self.origin;
                     79:        
                     80:        item.velocity_z = 300;
                     81:        item.velocity_x = -100 + (random() * 200);
                     82:        item.velocity_y = -100 + (random() * 200);
                     83:        
                     84:        item.flags = FL_ITEM;
                     85:        item.solid = SOLID_TRIGGER;
                     86:        item.movetype = MOVETYPE_TOSS;
                     87:        item.noise = "items/damage.wav";
                     88:        setmodel (item, "progs/quaddama.mdl");
                     89:        setsize (item, '-16 -16 -24', '16 16 32');
                     90:        item.cnt = time + timeleft;
                     91:        item.touch = q_touch;
                     92:        item.nextthink = time + timeleft;    // remove it with the time left on it
                     93:        item.think = SUB_Remove;
                     94: };
                     95: 
                     96: 
                     97: void() r_touch;
                     98: 
                     99: void() r_touch =
                    100: {
                    101: local entity    stemp;
                    102: local float     best;
                    103: local string    s;
                    104: 
                    105:        if (other.classname != "player")
                    106:                return;
                    107:        if (other.health <= 0)
                    108:                return;
                    109: 
                    110:        self.mdl = self.model;
                    111: 
                    112:        sound (other, CHAN_VOICE, self.noise, 1, ATTN_NORM);
                    113:        stuffcmd (other, "bf\n");
                    114:        self.solid = SOLID_NOT;
                    115:        other.items = other.items | IT_INVISIBILITY;
                    116:        self.model = string_null;
                    117: 
                    118: // do the apropriate action
                    119:        other.invisible_time = 1;
                    120:        other.invisible_finished = self.cnt;
                    121:        s=ftos(rint(other.invisible_finished - time));
                    122:        bprint (PRINT_LOW, other.netname);
                    123:        bprint (PRINT_LOW, " recovered a Ring with ");
                    124:        bprint (PRINT_LOW, s);
                    125:        bprint (PRINT_LOW, " seconds remaining!\n");
                    126:       
                    127: 
                    128:        activator = other;
                    129:        SUB_UseTargets();                               // fire all targets / killtargets
                    130: };
                    131: 
                    132: 
                    133: void(float timeleft) DropRing =
                    134: {
                    135:        local entity    item;
                    136: 
                    137:        item = spawn();
                    138:        item.origin = self.origin;
                    139:        
                    140:        item.velocity_z = 300;
                    141:        item.velocity_x = -100 + (random() * 200);
                    142:        item.velocity_y = -100 + (random() * 200);
                    143:        
                    144:        item.flags = FL_ITEM;
                    145:        item.solid = SOLID_TRIGGER;
                    146:        item.movetype = MOVETYPE_TOSS;
                    147:        item.noise = "items/inv1.wav";
                    148:        setmodel (item, "progs/invisibl.mdl");
                    149:        setsize (item, '-16 -16 -24', '16 16 32');
                    150:        item.cnt = time + timeleft;
                    151:        item.touch = r_touch;
                    152:        item.nextthink = time + timeleft;    // remove after 30 seconds
                    153:        item.think = SUB_Remove;
                    154: };
                    155: 
                    156: /*
                    157: ============
                    158: PlaceItem
                    159: 
                    160: plants the object on the floor
                    161: ============
                    162: */
                    163: void() PlaceItem =
                    164: {
                    165:        local float     oldz;
                    166: 
                    167:        self.mdl = self.model;          // so it can be restored on respawn
                    168:        self.flags = FL_ITEM;           // make extra wide
                    169:        self.solid = SOLID_TRIGGER;
                    170:        self.movetype = MOVETYPE_TOSS;  
                    171:        self.velocity = '0 0 0';
                    172:        self.origin_z = self.origin_z + 6;
                    173:        oldz = self.origin_z;
                    174:        if (!droptofloor())
                    175:        {
                    176:                dprint ("Bonus item fell out of level at ");
                    177:                dprint (vtos(self.origin));
                    178:                dprint ("\n");
                    179:                remove(self);
                    180:                return;
                    181:        }
                    182: };
                    183: 
                    184: /*
                    185: ============
                    186: StartItem
                    187: 
                    188: Sets the clipping size and plants the object on the floor
                    189: ============
                    190: */
                    191: void() StartItem =
                    192: {
                    193:        self.nextthink = time + 0.2;    // items start after other solids
                    194:        self.think = PlaceItem;
                    195: };
                    196: 
                    197: /*
                    198: =========================================================================
                    199: 
                    200: HEALTH BOX
                    201: 
                    202: =========================================================================
                    203: */
                    204: //
                    205: // T_Heal: add health to an entity, limiting health to max_health
                    206: // "ignore" will ignore max_health limit
                    207: //
                    208: float (entity e, float healamount, float ignore) T_Heal =
                    209: {
                    210:        if (e.health <= 0)
                    211:                return 0;
                    212:        if ((!ignore) && (e.health >= other.max_health))
                    213:                return 0;
                    214:        healamount = ceil(healamount);
                    215: 
                    216:        e.health = e.health + healamount;
                    217:        if ((!ignore) && (e.health >= other.max_health))
                    218:                e.health = other.max_health;
                    219:                
                    220:        if (e.health > 250)
                    221:                e.health = 250;
                    222:        return 1;
                    223: };
                    224: 
                    225: /*QUAKED item_health (.3 .3 1) (0 0 0) (32 32 32) rotten megahealth
                    226: Health box. Normally gives 25 points.
                    227: Rotten box heals 5-10 points,
                    228: megahealth will add 100 health, then 
                    229: rot you down to your maximum health limit, 
                    230: one point per second.
                    231: */
                    232: 
                    233: float   H_ROTTEN = 1;
                    234: float   H_MEGA = 2;
                    235: .float  healamount, healtype;
                    236: void() health_touch;
                    237: void() item_megahealth_rot;
                    238: 
                    239: void() item_health =
                    240: {       
                    241:        self.touch = health_touch;
                    242: 
                    243:        if (self.spawnflags & H_ROTTEN)
                    244:        {
                    245:                precache_model("maps/b_bh10.bsp");
                    246: 
                    247:                precache_sound("items/r_item1.wav");
                    248:                setmodel(self, "maps/b_bh10.bsp");
                    249:                self.noise = "items/r_item1.wav";
                    250:                self.healamount = 15;
                    251:                self.healtype = 0;
                    252:        }
                    253:        else
                    254:        if (self.spawnflags & H_MEGA)
                    255:        {
                    256:                precache_model("maps/b_bh100.bsp");
                    257:                precache_sound("items/r_item2.wav");
                    258:                setmodel(self, "maps/b_bh100.bsp");
                    259:                self.noise = "items/r_item2.wav";
                    260:                self.healamount = 100;
                    261:                self.healtype = 2;
                    262:        }
                    263:        else
                    264:        {
                    265:                precache_model("maps/b_bh25.bsp");
                    266:                precache_sound("items/health1.wav");
                    267:                setmodel(self, "maps/b_bh25.bsp");
                    268:                self.noise = "items/health1.wav";
                    269:                self.healamount = 25;
                    270:                self.healtype = 1;
                    271:        }
                    272:        setsize (self, '0 0 0', '32 32 56');
                    273:        StartItem ();
                    274: };
                    275: 
                    276: 
                    277: void() health_touch =
                    278: {
                    279:        local   float amount;
                    280:        local   string  s;
                    281:        
                    282:        if (deathmatch == 4)
                    283:                if (other.invincible_time > 0)
                    284:                        return;
                    285: 
                    286:        if (other.classname != "player")
                    287:                return;
                    288:        
                    289:        if (self.healtype == 2) // Megahealth?  Ignore max_health...
                    290:        {
                    291:                if (other.health >= 250)
                    292:                        return;
                    293:                if (!T_Heal(other, self.healamount, 1))
                    294:                        return;
                    295:        }
                    296:        else
                    297:        {
                    298:                if (!T_Heal(other, self.healamount, 0))
                    299:                        return;
                    300:        }
                    301:        
                    302:        sprint(other, PRINT_LOW, "You receive ");
                    303:        s = ftos(self.healamount);
                    304:        sprint(other, PRINT_LOW, s);
                    305:        sprint(other, PRINT_LOW, " health\n");
                    306:        
                    307: // health touch sound
                    308:        sound(other, CHAN_ITEM, self.noise, 1, ATTN_NORM);
                    309: 
                    310:        stuffcmd (other, "bf\n");
                    311:        
                    312:        self.model = string_null;
                    313:        self.solid = SOLID_NOT;
                    314: 
                    315:        // Megahealth = rot down the player's super health
                    316:        if (self.healtype == 2)
                    317:        {
                    318:                other.items = other.items | IT_SUPERHEALTH;
                    319:                if (deathmatch != 4)
                    320:                {
                    321:                        self.nextthink = time + 5;
                    322:                        self.think = item_megahealth_rot;
                    323:                }
                    324:                self.owner = other;
                    325:        }
                    326:        else
                    327:        {
                    328:                if (deathmatch != 2)            // deathmatch 2 is the silly old rules
                    329:                {
                    330:                        self.nextthink = time + 20;
                    331:                        self.think = SUB_regen;
                    332:                }
                    333:        }
                    334:        
                    335:        activator = other;
                    336:        SUB_UseTargets();                               // fire all targets / killtargets
                    337: };      
                    338: 
                    339: void() item_megahealth_rot =
                    340: {
                    341:        other = self.owner;
                    342:        
                    343:        if (other.health > other.max_health)
                    344:        {
                    345:                other.health = other.health - 1;
                    346:                self.nextthink = time + 1;
                    347:                return;
                    348:        }
                    349: 
                    350: // it is possible for a player to die and respawn between rots, so don't
                    351: // just blindly subtract the flag off
                    352:        other.items = other.items - (other.items & IT_SUPERHEALTH);
                    353:        
                    354:        if (deathmatch != 2)    // deathmatch 2 is silly old rules
                    355:        {
                    356:                self.nextthink = time + 20;
                    357:                self.think = SUB_regen;
                    358:        }
                    359: };
                    360: 
                    361: /*
                    362: ===============================================================================
                    363: 
                    364: ARMOR
                    365: 
                    366: ===============================================================================
                    367: */
                    368: 
                    369: void() armor_touch;
                    370: 
                    371: void() armor_touch =
                    372: {
                    373:        local   float   type, value, bit;
                    374:        
                    375:        if (other.health <= 0)
                    376:                return;
                    377:        if (other.classname != "player")
                    378:                return;
                    379: 
                    380:        if (deathmatch == 4)
                    381:                if (other.invincible_time > 0)
                    382:                        return;
                    383: 
                    384:        if (self.classname == "item_armor1")
                    385:        {
                    386:                type = 0.3;
                    387:                value = 100;
                    388:                bit = IT_ARMOR1;
                    389:        }
                    390:        if (self.classname == "item_armor2")
                    391:        {
                    392:                type = 0.6;
                    393:                value = 150;
                    394:                bit = IT_ARMOR2;
                    395:        }
                    396:        if (self.classname == "item_armorInv")
                    397:        {
                    398:                type = 0.8;
                    399:                value = 200;
                    400:                bit = IT_ARMOR3;
                    401:        }
                    402:        if (other.armortype*other.armorvalue >= type*value)
                    403:                return;
                    404:                
                    405:        other.armortype = type;
                    406:        other.armorvalue = value;
                    407:        other.items = other.items - (other.items & (IT_ARMOR1 | IT_ARMOR2 | IT_ARMOR3)) + bit;
                    408: 
                    409:        self.solid = SOLID_NOT;
                    410:        self.model = string_null;
                    411:        if (deathmatch != 2)
                    412:                self.nextthink = time + 20;
                    413:        self.think = SUB_regen;
                    414: 
                    415:        sprint(other, PRINT_LOW, "You got armor\n");
                    416: // armor touch sound
                    417:        sound(other, CHAN_ITEM, "items/armor1.wav", 1, ATTN_NORM);
                    418:        stuffcmd (other, "bf\n");
                    419:        
                    420:        activator = other;
                    421:        SUB_UseTargets();                               // fire all targets / killtargets
                    422: };
                    423: 
                    424: 
                    425: /*QUAKED item_armor1 (0 .5 .8) (-16 -16 0) (16 16 32)
                    426: */
                    427: 
                    428: void() item_armor1 =
                    429: {
                    430:        self.touch = armor_touch;
                    431:        precache_model ("progs/armor.mdl");
                    432:        setmodel (self, "progs/armor.mdl");
                    433:        self.skin = 0;
                    434:        setsize (self, '-16 -16 0', '16 16 56');
                    435:        StartItem ();
                    436: };
                    437: 
                    438: /*QUAKED item_armor2 (0 .5 .8) (-16 -16 0) (16 16 32)
                    439: */
                    440: 
                    441: void() item_armor2 =
                    442: {
                    443:        self.touch = armor_touch;
                    444:        precache_model ("progs/armor.mdl");
                    445:        setmodel (self, "progs/armor.mdl");
                    446:        self.skin = 1;
                    447:        setsize (self, '-16 -16 0', '16 16 56');
                    448:        StartItem ();
                    449: };
                    450: 
                    451: /*QUAKED item_armorInv (0 .5 .8) (-16 -16 0) (16 16 32)
                    452: */
                    453: 
                    454: void() item_armorInv =
                    455: {
                    456:        self.touch = armor_touch;
                    457:        precache_model ("progs/armor.mdl");
                    458:        setmodel (self, "progs/armor.mdl");
                    459:        self.skin = 2;
                    460:        setsize (self, '-16 -16 0', '16 16 56');
                    461:        StartItem ();
                    462: };
                    463: 
                    464: /*
                    465: ===============================================================================
                    466: 
                    467: WEAPONS
                    468: 
                    469: ===============================================================================
                    470: */
                    471: 
                    472: void() bound_other_ammo =
                    473: {
                    474:        if (other.ammo_shells > 100)
                    475:                other.ammo_shells = 100;
                    476:        if (other.ammo_nails > 200)
                    477:                other.ammo_nails = 200;
                    478:        if (other.ammo_rockets > 100)
                    479:                other.ammo_rockets = 100;               
                    480:        if (other.ammo_cells > 100)
                    481:                other.ammo_cells = 100;         
                    482: };
                    483: 
                    484: 
                    485: float(float w) RankForWeapon =
                    486: {
                    487:        if (w == IT_LIGHTNING)
                    488:                return 1;
                    489:        if (w == IT_ROCKET_LAUNCHER)
                    490:                return 2;
                    491:        if (w == IT_SUPER_NAILGUN)
                    492:                return 3;
                    493:        if (w == IT_GRENADE_LAUNCHER)
                    494:                return 4;
                    495:        if (w == IT_SUPER_SHOTGUN)
                    496:                return 5;
                    497:        if (w == IT_NAILGUN)
                    498:                return 6;
                    499:        return 7;
                    500: };
                    501: 
                    502: float (float w) WeaponCode =
                    503: {
                    504:        if (w == IT_SUPER_SHOTGUN)
                    505:                return 3;
                    506:        if (w == IT_NAILGUN)
                    507:                return 4;
                    508:        if (w == IT_SUPER_NAILGUN)
                    509:                return 5;
                    510:        if (w == IT_GRENADE_LAUNCHER)
                    511:                return 6;
                    512:        if (w == IT_ROCKET_LAUNCHER)
                    513:                return 7;
                    514:        if (w == IT_LIGHTNING)
                    515:                return 8;
                    516:        return 1;
                    517: };
                    518: 
                    519: /*
                    520: =============
                    521: Deathmatch_Weapon
                    522: 
                    523: Deathmatch weapon change rules for picking up a weapon
                    524: 
                    525: .float          ammo_shells, ammo_nails, ammo_rockets, ammo_cells;
                    526: =============
                    527: */
                    528: void(float old, float new) Deathmatch_Weapon =
                    529: {
                    530:        local float or, nr;
                    531: 
                    532: // change self.weapon if desired
                    533:        or = RankForWeapon (self.weapon);
                    534:        nr = RankForWeapon (new);
                    535:        if ( nr < or )
                    536:                self.weapon = new;
                    537: };
                    538: 
                    539: /*
                    540: =============
                    541: weapon_touch
                    542: =============
                    543: */
                    544: float() W_BestWeapon;
                    545: 
                    546: void() weapon_touch =
                    547: {
                    548:        local   float   hadammo, best, new, old;
                    549:        local   entity  stemp;
                    550:        local   float   leave;
                    551: 
                    552:        // For client weapon_switch
                    553:        local   float   w_switch;
                    554: 
                    555:        if (!(other.flags & FL_CLIENT))
                    556:                return;
                    557: 
                    558:        if ((stof(infokey(other,"w_switch"))) == 0)
                    559:                w_switch = 8;
                    560:        else
                    561:                w_switch = stof(infokey(other,"w_switch"));
                    562:        
                    563: // if the player was using his best weapon, change up to the new one if better          
                    564:        stemp = self;
                    565:        self = other;
                    566:        best = W_BestWeapon();
                    567:        self = stemp;
                    568: 
                    569:        if (deathmatch == 2 || deathmatch == 3 || deathmatch == 5)
                    570:                leave = 1;
                    571:        else
                    572:                leave = 0;
                    573:        
                    574:        if (self.classname == "weapon_nailgun")
                    575:        {
                    576:                if (leave && (other.items & IT_NAILGUN) )
                    577:                        return;
                    578:                hadammo = other.ammo_nails;                     
                    579:                new = IT_NAILGUN;
                    580:                other.ammo_nails = other.ammo_nails + 30;
                    581:        }
                    582:        else if (self.classname == "weapon_supernailgun")
                    583:        {
                    584:                if (leave && (other.items & IT_SUPER_NAILGUN) )
                    585:                        return;
                    586:                hadammo = other.ammo_rockets;                   
                    587:                new = IT_SUPER_NAILGUN;
                    588:                other.ammo_nails = other.ammo_nails + 30;
                    589:        }
                    590:        else if (self.classname == "weapon_supershotgun")
                    591:        {
                    592:                if (leave && (other.items & IT_SUPER_SHOTGUN) )
                    593:                        return;
                    594:                hadammo = other.ammo_rockets;                   
                    595:                new = IT_SUPER_SHOTGUN;
                    596:                other.ammo_shells = other.ammo_shells + 5;
                    597:        }
                    598:        else if (self.classname == "weapon_rocketlauncher")
                    599:        {
                    600:                if (leave && (other.items & IT_ROCKET_LAUNCHER) )
                    601:                        return;
                    602:                hadammo = other.ammo_rockets;                   
                    603:                new = IT_ROCKET_LAUNCHER;
                    604:                other.ammo_rockets = other.ammo_rockets + 5;
                    605:        }
                    606:        else if (self.classname == "weapon_grenadelauncher")
                    607:        {
                    608:                if (leave && (other.items & IT_GRENADE_LAUNCHER) )
                    609:                        return;
                    610:                hadammo = other.ammo_rockets;                   
                    611:                new = IT_GRENADE_LAUNCHER;
                    612:                other.ammo_rockets = other.ammo_rockets + 5;
                    613:        }
                    614:        else if (self.classname == "weapon_lightning")
                    615:        {
                    616:                if (leave && (other.items & IT_LIGHTNING))
                    617:                        return;
                    618:                hadammo = other.ammo_rockets;                   
                    619:                new = IT_LIGHTNING;
                    620:                other.ammo_cells = other.ammo_cells + 15;
                    621:        }
                    622:        else
                    623:                objerror ("weapon_touch: unknown classname");
                    624: 
                    625:        sprint (other, PRINT_LOW, "You got the ");
                    626:        sprint (other, PRINT_LOW, self.netname);
                    627:        sprint (other, PRINT_LOW, "\n");
                    628: // weapon touch sound
                    629:        sound (other, CHAN_ITEM, "weapons/pkup.wav", 1, ATTN_NORM);
                    630:        stuffcmd (other, "bf\n");
                    631: 
                    632:        bound_other_ammo ();
                    633: 
                    634: // change to the weapon
                    635:        old = other.items;
                    636:        other.items = other.items | new;
                    637:        
                    638:        stemp = self;
                    639:        self = other;
                    640: 
                    641:        if ( WeaponCode(new) <= w_switch )
                    642:        {
                    643:                if (self.flags & FL_INWATER)
                    644:                {
                    645:                        if (new != IT_LIGHTNING)
                    646:                        {
                    647:                                Deathmatch_Weapon (old, new);
                    648:                        }
                    649:                }
                    650:                else
                    651:                {                
                    652:                        Deathmatch_Weapon (old, new);
                    653:                }
                    654:        }
                    655: 
                    656:        W_SetCurrentAmmo();
                    657: 
                    658:        self = stemp;
                    659: 
                    660:        if (leave)
                    661:                return;
                    662: 
                    663:        if (deathmatch!=3 || deathmatch !=5)
                    664:        {
                    665:        // remove it in single player, or setup for respawning in deathmatch
                    666:                self.model = string_null;
                    667:                self.solid = SOLID_NOT;
                    668:                if (deathmatch != 2)
                    669:                        self.nextthink = time + 30;
                    670:                self.think = SUB_regen;
                    671:        }
                    672:        activator = other;
                    673:        SUB_UseTargets();                               // fire all targets / killtargets
                    674: };
                    675: 
                    676: 
                    677: /*QUAKED weapon_supershotgun (0 .5 .8) (-16 -16 0) (16 16 32)
                    678: */
                    679: 
                    680: void() weapon_supershotgun =
                    681: {
                    682: if (deathmatch <= 3)
                    683: {
                    684:        precache_model ("progs/g_shot.mdl");
                    685:        setmodel (self, "progs/g_shot.mdl");
                    686:        self.weapon = IT_SUPER_SHOTGUN;
                    687:        self.netname = "Double-barrelled Shotgun";
                    688:        self.touch = weapon_touch;
                    689:        setsize (self, '-16 -16 0', '16 16 56');
                    690:        StartItem ();
                    691: }
                    692: };
                    693: 
                    694: /*QUAKED weapon_nailgun (0 .5 .8) (-16 -16 0) (16 16 32)
                    695: */
                    696: 
                    697: void() weapon_nailgun =
                    698: {
                    699: if (deathmatch <= 3)
                    700: {
                    701:        precache_model ("progs/g_nail.mdl");
                    702:        setmodel (self, "progs/g_nail.mdl");
                    703:        self.weapon = IT_NAILGUN;
                    704:        self.netname = "nailgun";
                    705:        self.touch = weapon_touch;
                    706:        setsize (self, '-16 -16 0', '16 16 56');
                    707:        StartItem ();
                    708: }
                    709: };
                    710: 
                    711: /*QUAKED weapon_supernailgun (0 .5 .8) (-16 -16 0) (16 16 32)
                    712: */
                    713: 
                    714: void() weapon_supernailgun =
                    715: {
                    716: if (deathmatch <= 3)
                    717: {
                    718:        precache_model ("progs/g_nail2.mdl");
                    719:        setmodel (self, "progs/g_nail2.mdl");
                    720:        self.weapon = IT_SUPER_NAILGUN;
                    721:        self.netname = "Super Nailgun";
                    722:        self.touch = weapon_touch;
                    723:        setsize (self, '-16 -16 0', '16 16 56');
                    724:        StartItem ();
                    725: }
                    726: };
                    727: 
                    728: /*QUAKED weapon_grenadelauncher (0 .5 .8) (-16 -16 0) (16 16 32)
                    729: */
                    730: 
                    731: void() weapon_grenadelauncher =
                    732: {
                    733: if (deathmatch <= 3)
                    734: {
                    735:        precache_model ("progs/g_rock.mdl");
                    736:        setmodel (self, "progs/g_rock.mdl");
                    737:        self.weapon = 3;
                    738:        self.netname = "Grenade Launcher";
                    739:        self.touch = weapon_touch;
                    740:        setsize (self, '-16 -16 0', '16 16 56');
                    741:        StartItem ();
                    742: }
                    743: };
                    744: 
                    745: /*QUAKED weapon_rocketlauncher (0 .5 .8) (-16 -16 0) (16 16 32)
                    746: */
                    747: 
                    748: void() weapon_rocketlauncher =
                    749: {
                    750: if (deathmatch <= 3)
                    751: {
                    752:        precache_model ("progs/g_rock2.mdl");
                    753:        setmodel (self, "progs/g_rock2.mdl");
                    754:        self.weapon = 3;
                    755:        self.netname = "Rocket Launcher";
                    756:        self.touch = weapon_touch;
                    757:        setsize (self, '-16 -16 0', '16 16 56');
                    758:        StartItem ();
                    759: }
                    760: };
                    761: 
                    762: 
                    763: /*QUAKED weapon_lightning (0 .5 .8) (-16 -16 0) (16 16 32)
                    764: */
                    765: 
                    766: void() weapon_lightning =
                    767: {
                    768: if (deathmatch <= 3)
                    769: {
                    770:        precache_model ("progs/g_light.mdl");
                    771:        setmodel (self, "progs/g_light.mdl");
                    772:        self.weapon = 3;
                    773:        self.netname = "Thunderbolt";
                    774:        self.touch = weapon_touch;
                    775:        setsize (self, '-16 -16 0', '16 16 56');
                    776:        StartItem ();
                    777: }
                    778: };
                    779: 
                    780: 
                    781: /*
                    782: ===============================================================================
                    783: 
                    784: AMMO
                    785: 
                    786: ===============================================================================
                    787: */
                    788: 
                    789: void() ammo_touch =
                    790: {
                    791: local entity    stemp;
                    792: local float             best;
                    793: 
                    794:        if (other.classname != "player")
                    795:                return;
                    796:        if (other.health <= 0)
                    797:                return;
                    798: 
                    799: // if the player was using his best weapon, change up to the new one if better          
                    800:        stemp = self;
                    801:        self = other;
                    802:        best = W_BestWeapon();
                    803:        self = stemp;
                    804: 
                    805: 
                    806: // shotgun
                    807:        if (self.weapon == 1)
                    808:        {
                    809:                if (other.ammo_shells >= 100)
                    810:                        return;
                    811:                other.ammo_shells = other.ammo_shells + self.aflag;
                    812:        }
                    813: 
                    814: // spikes
                    815:        if (self.weapon == 2)
                    816:        {
                    817:                if (other.ammo_nails >= 200)
                    818:                        return;
                    819:                other.ammo_nails = other.ammo_nails + self.aflag;
                    820:        }
                    821: 
                    822: //      rockets
                    823:        if (self.weapon == 3)
                    824:        {
                    825:                if (other.ammo_rockets >= 100)
                    826:                        return;
                    827:                other.ammo_rockets = other.ammo_rockets + self.aflag;
                    828:        }
                    829: 
                    830: //      cells
                    831:        if (self.weapon == 4)
                    832:        {
                    833:                if (other.ammo_cells >= 100)
                    834:                        return;
                    835:                other.ammo_cells = other.ammo_cells + self.aflag;
                    836:        }
                    837: 
                    838:        bound_other_ammo ();
                    839:        
                    840:        sprint (other, PRINT_LOW, "You got the ");
                    841:        sprint (other, PRINT_LOW, self.netname);
                    842:        sprint (other, PRINT_LOW, "\n");
                    843: // ammo touch sound
                    844:        sound (other, CHAN_ITEM, "weapons/lock4.wav", 1, ATTN_NORM);
                    845:        stuffcmd (other, "bf\n");
                    846: 
                    847: // change to a better weapon if appropriate
                    848: 
                    849:        if ( other.weapon == best )
                    850:        {
                    851:                stemp = self;
                    852:                self = other;
                    853:                self.weapon = W_BestWeapon();
                    854:                W_SetCurrentAmmo ();
                    855:                self = stemp;
                    856:        }
                    857: 
                    858: // if changed current ammo, update it
                    859:        stemp = self;
                    860:        self = other;
                    861:        W_SetCurrentAmmo();
                    862:        self = stemp;
                    863: 
                    864: // remove it in single player, or setup for respawning in deathmatch
                    865:        self.model = string_null;
                    866:        self.solid = SOLID_NOT;
                    867:        if (deathmatch != 2)
                    868:                self.nextthink = time + 30;
                    869: 
                    870: // Xian -- If playing in DM 3.0 mode, halve the time ammo respawns        
                    871: 
                    872:        if (deathmatch == 3 || deathmatch == 5)        
                    873:                self.nextthink = time + 15;
                    874: 
                    875:        self.think = SUB_regen;
                    876: 
                    877:        activator = other;
                    878:        SUB_UseTargets();                               // fire all targets / killtargets
                    879: };
                    880: 
                    881: 
                    882: 
                    883: 
                    884: float WEAPON_BIG2 = 1;
                    885: 
                    886: /*QUAKED item_shells (0 .5 .8) (0 0 0) (32 32 32) big
                    887: */
                    888: 
                    889: void() item_shells =
                    890: {
                    891:        if (deathmatch == 4)
                    892:                return;
                    893: 
                    894:        self.touch = ammo_touch;
                    895: 
                    896:        if (self.spawnflags & WEAPON_BIG2)
                    897:        {
                    898:                precache_model ("maps/b_shell1.bsp");
                    899:                setmodel (self, "maps/b_shell1.bsp");
                    900:                self.aflag = 40;
                    901:        }
                    902:        else
                    903:        {
                    904:                precache_model ("maps/b_shell0.bsp");
                    905:                setmodel (self, "maps/b_shell0.bsp");
                    906:                self.aflag = 20;
                    907:        }
                    908:        self.weapon = 1;
                    909:        self.netname = "shells";
                    910:        setsize (self, '0 0 0', '32 32 56');
                    911:        StartItem ();
                    912: };
                    913: 
                    914: /*QUAKED item_spikes (0 .5 .8) (0 0 0) (32 32 32) big
                    915: */
                    916: 
                    917: void() item_spikes =
                    918: {
                    919:        if (deathmatch == 4)
                    920:                return;
                    921: 
                    922:        self.touch = ammo_touch;
                    923: 
                    924:        if (self.spawnflags & WEAPON_BIG2)
                    925:        {
                    926:                precache_model ("maps/b_nail1.bsp");
                    927:                setmodel (self, "maps/b_nail1.bsp");
                    928:                self.aflag = 50;
                    929:        }
                    930:        else
                    931:        {
                    932:                precache_model ("maps/b_nail0.bsp");
                    933:                setmodel (self, "maps/b_nail0.bsp");
                    934:                self.aflag = 25;
                    935:        }
                    936:        self.weapon = 2;
                    937:        self.netname = "nails";
                    938:        setsize (self, '0 0 0', '32 32 56');
                    939:        StartItem ();
                    940: 
                    941: };
                    942: 
                    943: /*QUAKED item_rockets (0 .5 .8) (0 0 0) (32 32 32) big
                    944: */
                    945: 
                    946: void() item_rockets =
                    947: {
                    948:        if (deathmatch == 4)
                    949:                return;
                    950: 
                    951:        self.touch = ammo_touch;
                    952: 
                    953:        if (self.spawnflags & WEAPON_BIG2)
                    954:        {
                    955:                precache_model ("maps/b_rock1.bsp");
                    956:                setmodel (self, "maps/b_rock1.bsp");
                    957:                self.aflag = 10;
                    958:        }
                    959:        else
                    960:        {
                    961:                precache_model ("maps/b_rock0.bsp");
                    962:                setmodel (self, "maps/b_rock0.bsp");
                    963:                self.aflag = 5;
                    964:        }
                    965:        self.weapon = 3;
                    966:        self.netname = "rockets";
                    967:        setsize (self, '0 0 0', '32 32 56');
                    968:        StartItem ();
                    969: 
                    970: };
                    971: 
                    972: 
                    973: /*QUAKED item_cells (0 .5 .8) (0 0 0) (32 32 32) big
                    974: */
                    975: 
                    976: void() item_cells =
                    977: {
                    978:        if (deathmatch == 4)
                    979:                return;
                    980: 
                    981:        self.touch = ammo_touch;
                    982: 
                    983:        if (self.spawnflags & WEAPON_BIG2)
                    984:        {
                    985:                precache_model ("maps/b_batt1.bsp");
                    986:                setmodel (self, "maps/b_batt1.bsp");
                    987:                self.aflag = 12;
                    988:        }
                    989:        else
                    990:        {
                    991:                precache_model ("maps/b_batt0.bsp");
                    992:                setmodel (self, "maps/b_batt0.bsp");
                    993:                self.aflag = 6;
                    994:        }
                    995:        self.weapon = 4;
                    996:        self.netname = "cells";
                    997:        setsize (self, '0 0 0', '32 32 56');
                    998:        StartItem ();
                    999: 
                   1000: };
                   1001: 
                   1002: 
                   1003: /*QUAKED item_weapon (0 .5 .8) (0 0 0) (32 32 32) shotgun rocket spikes big
                   1004: DO NOT USE THIS!!!! IT WILL BE REMOVED!
                   1005: */
                   1006: 
                   1007: float WEAPON_SHOTGUN = 1;
                   1008: float WEAPON_ROCKET = 2;
                   1009: float WEAPON_SPIKES = 4;
                   1010: float WEAPON_BIG = 8;
                   1011: void() item_weapon =
                   1012: {
                   1013:        self.touch = ammo_touch;
                   1014: 
                   1015:        if (self.spawnflags & WEAPON_SHOTGUN)
                   1016:        {
                   1017:                if (self.spawnflags & WEAPON_BIG)
                   1018:                {
                   1019:                        precache_model ("maps/b_shell1.bsp");
                   1020:                        setmodel (self, "maps/b_shell1.bsp");
                   1021:                        self.aflag = 40;
                   1022:                }
                   1023:                else
                   1024:                {
                   1025:                        precache_model ("maps/b_shell0.bsp");
                   1026:                        setmodel (self, "maps/b_shell0.bsp");
                   1027:                        self.aflag = 20;
                   1028:                }
                   1029:                self.weapon = 1;
                   1030:                self.netname = "shells";
                   1031:        }
                   1032: 
                   1033:        if (self.spawnflags & WEAPON_SPIKES)
                   1034:        {
                   1035:                if (self.spawnflags & WEAPON_BIG)
                   1036:                {
                   1037:                        precache_model ("maps/b_nail1.bsp");
                   1038:                        setmodel (self, "maps/b_nail1.bsp");
                   1039:                        self.aflag = 40;
                   1040:                }
                   1041:                else
                   1042:                {
                   1043:                        precache_model ("maps/b_nail0.bsp");
                   1044:                        setmodel (self, "maps/b_nail0.bsp");
                   1045:                        self.aflag = 20;
                   1046:                }
                   1047:                self.weapon = 2;
                   1048:                self.netname = "spikes";
                   1049:        }
                   1050: 
                   1051:        if (self.spawnflags & WEAPON_ROCKET)
                   1052:        {
                   1053:                if (self.spawnflags & WEAPON_BIG)
                   1054:                {
                   1055:                        precache_model ("maps/b_rock1.bsp");
                   1056:                        setmodel (self, "maps/b_rock1.bsp");
                   1057:                        self.aflag = 10;
                   1058:                }
                   1059:                else
                   1060:                {
                   1061:                        precache_model ("maps/b_rock0.bsp");
                   1062:                        setmodel (self, "maps/b_rock0.bsp");
                   1063:                        self.aflag = 5;
                   1064:                }
                   1065:                self.weapon = 3;
                   1066:                self.netname = "rockets";
                   1067:        }
                   1068:        
                   1069:        setsize (self, '0 0 0', '32 32 56');
                   1070:        StartItem ();
                   1071: };
                   1072: 
                   1073: 
                   1074: /*
                   1075: ===============================================================================
                   1076: 
                   1077: KEYS
                   1078: 
                   1079: ===============================================================================
                   1080: */
                   1081: 
                   1082: void() key_touch =
                   1083: {
                   1084: local entity    stemp;
                   1085: local float             best;
                   1086: 
                   1087:        if (other.classname != "player")
                   1088:                return;
                   1089:        if (other.health <= 0)
                   1090:                return;
                   1091:        if (other.items & self.items)
                   1092:                return;
                   1093: 
                   1094:        sprint (other, PRINT_LOW, "You got the ");
                   1095:        sprint (other, PRINT_LOW, self.netname);
                   1096:        sprint (other,PRINT_LOW, "\n");
                   1097: 
                   1098:        sound (other, CHAN_ITEM, self.noise, 1, ATTN_NORM);
                   1099:        stuffcmd (other, "bf\n");
                   1100:        other.items = other.items | self.items;
                   1101: 
                   1102:        self.solid = SOLID_NOT;
                   1103:        self.model = string_null;
                   1104: 
                   1105:        activator = other;
                   1106:        SUB_UseTargets();                               // fire all targets / killtargets
                   1107: };
                   1108: 
                   1109: 
                   1110: void() key_setsounds =
                   1111: {
                   1112:        if (world.worldtype == 0)
                   1113:        {
                   1114:                precache_sound ("misc/medkey.wav");
                   1115:                self.noise = "misc/medkey.wav";
                   1116:        }
                   1117:        if (world.worldtype == 1)
                   1118:        {
                   1119:                precache_sound ("misc/runekey.wav");
                   1120:                self.noise = "misc/runekey.wav";
                   1121:        }
                   1122:        if (world.worldtype == 2)
                   1123:        {
                   1124:                precache_sound2 ("misc/basekey.wav");
                   1125:                self.noise = "misc/basekey.wav";
                   1126:        }
                   1127: };
                   1128: 
                   1129: /*QUAKED item_key1 (0 .5 .8) (-16 -16 -24) (16 16 32)
                   1130: SILVER key
                   1131: In order for keys to work
                   1132: you MUST set your maps
                   1133: worldtype to one of the
                   1134: following:
                   1135: 0: medieval
                   1136: 1: metal
                   1137: 2: base
                   1138: */
                   1139: 
                   1140: void() item_key1 =
                   1141: {
                   1142:        if (world.worldtype == 0)
                   1143:        {
                   1144:                precache_model ("progs/w_s_key.mdl");
                   1145:                setmodel (self, "progs/w_s_key.mdl");
                   1146:                self.netname = "silver key";
                   1147:        }
                   1148:        else if (world.worldtype == 1)
                   1149:        {
                   1150:                precache_model ("progs/m_s_key.mdl");
                   1151:                setmodel (self, "progs/m_s_key.mdl");
                   1152:                self.netname = "silver runekey";
                   1153:        }
                   1154:        else if (world.worldtype == 2)
                   1155:        {
                   1156:                precache_model2 ("progs/b_s_key.mdl");
                   1157:                setmodel (self, "progs/b_s_key.mdl");
                   1158:                self.netname = "silver keycard";
                   1159:        }
                   1160:        key_setsounds();
                   1161:        self.touch = key_touch;
                   1162:        self.items = IT_KEY1;
                   1163:        setsize (self, '-16 -16 -24', '16 16 32');
                   1164:        StartItem ();
                   1165: };
                   1166: 
                   1167: /*QUAKED item_key2 (0 .5 .8) (-16 -16 -24) (16 16 32)
                   1168: GOLD key
                   1169: In order for keys to work
                   1170: you MUST set your maps
                   1171: worldtype to one of the
                   1172: following:
                   1173: 0: medieval
                   1174: 1: metal
                   1175: 2: base
                   1176: */
                   1177: 
                   1178: void() item_key2 =
                   1179: {
                   1180:        if (world.worldtype == 0)
                   1181:        {
                   1182:                precache_model ("progs/w_g_key.mdl");
                   1183:                setmodel (self, "progs/w_g_key.mdl");
                   1184:                self.netname = "gold key";
                   1185:        }
                   1186:        if (world.worldtype == 1)
                   1187:        {
                   1188:                precache_model ("progs/m_g_key.mdl");
                   1189:                setmodel (self, "progs/m_g_key.mdl");
                   1190:                self.netname = "gold runekey";
                   1191:        }
                   1192:        if (world.worldtype == 2)
                   1193:        {
                   1194:                precache_model2 ("progs/b_g_key.mdl");
                   1195:                setmodel (self, "progs/b_g_key.mdl");
                   1196:                self.netname = "gold keycard";
                   1197:        }
                   1198:        key_setsounds();
                   1199:        self.touch = key_touch;
                   1200:        self.items = IT_KEY2;
                   1201:        setsize (self, '-16 -16 -24', '16 16 32');
                   1202:        StartItem ();
                   1203: };
                   1204: 
                   1205: 
                   1206: 
                   1207: /*
                   1208: ===============================================================================
                   1209: 
                   1210: END OF LEVEL RUNES
                   1211: 
                   1212: ===============================================================================
                   1213: */
                   1214: 
                   1215: void() sigil_touch =
                   1216: {
                   1217: local entity    stemp;
                   1218: local float             best;
                   1219: 
                   1220:        if (other.classname != "player")
                   1221:                return;
                   1222:        if (other.health <= 0)
                   1223:                return;
                   1224: 
                   1225:        centerprint (other, "You got the rune!");
                   1226: 
                   1227:        sound (other, CHAN_ITEM, self.noise, 1, ATTN_NORM);
                   1228:        stuffcmd (other, "bf\n");
                   1229:        self.solid = SOLID_NOT;
                   1230:        self.model = string_null;
                   1231:        serverflags = serverflags | (self.spawnflags & 15);
                   1232:        self.classname = "";            // so rune doors won't find it
                   1233:        
                   1234:        activator = other;
                   1235:        SUB_UseTargets();                               // fire all targets / killtargets
                   1236: };
                   1237: 
                   1238: 
                   1239: /*QUAKED item_sigil (0 .5 .8) (-16 -16 -24) (16 16 32) E1 E2 E3 E4
                   1240: End of level sigil, pick up to end episode and return to jrstart.
                   1241: */
                   1242: 
                   1243: void() item_sigil =
                   1244: {
                   1245:        if (!self.spawnflags)
                   1246:                objerror ("no spawnflags");
                   1247: 
                   1248:        precache_sound ("misc/runekey.wav");
                   1249:        self.noise = "misc/runekey.wav";
                   1250: 
                   1251:        if (self.spawnflags & 1)
                   1252:        {
                   1253:                precache_model ("progs/end1.mdl");
                   1254:                setmodel (self, "progs/end1.mdl");
                   1255:        }
                   1256:        if (self.spawnflags & 2)
                   1257:        {
                   1258:                precache_model2 ("progs/end2.mdl");
                   1259:                setmodel (self, "progs/end2.mdl");
                   1260:        }
                   1261:        if (self.spawnflags & 4)
                   1262:        {
                   1263:                precache_model2 ("progs/end3.mdl");
                   1264:                setmodel (self, "progs/end3.mdl");
                   1265:        }
                   1266:        if (self.spawnflags & 8)
                   1267:        {
                   1268:                precache_model2 ("progs/end4.mdl");
                   1269:                setmodel (self, "progs/end4.mdl");
                   1270:        }
                   1271:        
                   1272:        self.touch = sigil_touch;
                   1273:        setsize (self, '-16 -16 -24', '16 16 32');
                   1274:        StartItem ();
                   1275: };
                   1276: 
                   1277: /*
                   1278: ===============================================================================
                   1279: 
                   1280: POWERUPS
                   1281: 
                   1282: ===============================================================================
                   1283: */
                   1284: 
                   1285: void() powerup_touch;
                   1286: 
                   1287: 
                   1288: void() powerup_touch =
                   1289: {
                   1290: local entity    stemp;
                   1291: local float             best;
                   1292: 
                   1293:        if (other.classname != "player")
                   1294:                return;
                   1295:        if (other.health <= 0)
                   1296:                return;
                   1297: 
                   1298:        sprint (other, PRINT_LOW, "You got the ");
                   1299:        sprint (other,PRINT_LOW,  self.netname);
                   1300:        sprint (other,PRINT_LOW, "\n");
                   1301: 
                   1302:        self.mdl = self.model;
                   1303:        
                   1304:        if ((self.classname == "item_artifact_invulnerability") ||
                   1305:                (self.classname == "item_artifact_invisibility"))
                   1306:                self.nextthink = time + 60*5;
                   1307:        else
                   1308:                self.nextthink = time + 60;
                   1309:        
                   1310:        self.think = SUB_regen;
                   1311: 
                   1312:        sound (other, CHAN_VOICE, self.noise, 1, ATTN_NORM);
                   1313:        stuffcmd (other, "bf\n");
                   1314:        self.solid = SOLID_NOT;
                   1315:        other.items = other.items | self.items;
                   1316:        self.model = string_null;
                   1317: 
                   1318: // do the apropriate action
                   1319:        if (self.classname == "item_artifact_envirosuit")
                   1320:        {
                   1321:                other.rad_time = 1;
                   1322:                other.radsuit_finished = time + 30;
                   1323:        }
                   1324:        
                   1325:        if (self.classname == "item_artifact_invulnerability")
                   1326:        {
                   1327:                other.invincible_time = 1;
                   1328:                other.invincible_finished = time + 30;
                   1329:        }
                   1330:        
                   1331:        if (self.classname == "item_artifact_invisibility")
                   1332:        {
                   1333:                other.invisible_time = 1;
                   1334:                other.invisible_finished = time + 30;
                   1335:        }
                   1336: 
                   1337:        if (self.classname == "item_artifact_super_damage")
                   1338:        {
                   1339:                if (deathmatch == 4)
                   1340:                {
                   1341:                        other.armortype = 0;
                   1342:                        other.armorvalue = 0 * 0.01;
                   1343:                        other.ammo_cells = 0;
                   1344:                }
                   1345:                other.super_time = 1;
                   1346:                other.super_damage_finished = time + 30;
                   1347:        }       
                   1348: 
                   1349:        activator = other;
                   1350:        SUB_UseTargets();                               // fire all targets / killtargets
                   1351: };
                   1352: 
                   1353: 
                   1354: 
                   1355: /*QUAKED item_artifact_invulnerability (0 .5 .8) (-16 -16 -24) (16 16 32)
                   1356: Player is invulnerable for 30 seconds
                   1357: */
                   1358: void() item_artifact_invulnerability =
                   1359: {
                   1360:        self.touch = powerup_touch;
                   1361: 
                   1362:        precache_model ("progs/invulner.mdl");
                   1363:        precache_sound ("items/protect.wav");
                   1364:        precache_sound ("items/protect2.wav");
                   1365:        precache_sound ("items/protect3.wav");
                   1366:        self.noise = "items/protect.wav";
                   1367:        setmodel (self, "progs/invulner.mdl");
                   1368:        self.netname = "Pentagram of Protection";
                   1369:        self.effects = self.effects | EF_RED;
                   1370:        self.items = IT_INVULNERABILITY;
                   1371:        setsize (self, '-16 -16 -24', '16 16 32');
                   1372:        StartItem ();
                   1373: };
                   1374: 
                   1375: /*QUAKED item_artifact_envirosuit (0 .5 .8) (-16 -16 -24) (16 16 32)
                   1376: Player takes no damage from water or slime for 30 seconds
                   1377: */
                   1378: void() item_artifact_envirosuit =
                   1379: {
                   1380:        self.touch = powerup_touch;
                   1381: 
                   1382:        precache_model ("progs/suit.mdl");
                   1383:        precache_sound ("items/suit.wav");
                   1384:        precache_sound ("items/suit2.wav");
                   1385:        self.noise = "items/suit.wav";
                   1386:        setmodel (self, "progs/suit.mdl");
                   1387:        self.netname = "Biosuit";
                   1388:        self.items = IT_SUIT;
                   1389:        setsize (self, '-16 -16 -24', '16 16 32');
                   1390:        StartItem ();
                   1391: };
                   1392: 
                   1393: 
                   1394: /*QUAKED item_artifact_invisibility (0 .5 .8) (-16 -16 -24) (16 16 32)
                   1395: Player is invisible for 30 seconds
                   1396: */
                   1397: void() item_artifact_invisibility =
                   1398: {
                   1399:        self.touch = powerup_touch;
                   1400: 
                   1401:        precache_model ("progs/invisibl.mdl");
                   1402:        precache_sound ("items/inv1.wav");
                   1403:        precache_sound ("items/inv2.wav");
                   1404:        precache_sound ("items/inv3.wav");
                   1405:        self.noise = "items/inv1.wav";
                   1406:        setmodel (self, "progs/invisibl.mdl");
                   1407:        self.netname = "Ring of Shadows";
                   1408:        self.items = IT_INVISIBILITY;
                   1409:        setsize (self, '-16 -16 -24', '16 16 32');
                   1410:        StartItem ();
                   1411: };
                   1412: 
                   1413: 
                   1414: /*QUAKED item_artifact_super_damage (0 .5 .8) (-16 -16 -24) (16 16 32)
                   1415: The next attack from the player will do 4x damage
                   1416: */
                   1417: void() item_artifact_super_damage =
                   1418: {
                   1419:        self.touch = powerup_touch;
                   1420: 
                   1421:        precache_model ("progs/quaddama.mdl");
                   1422:        precache_sound ("items/damage.wav");
                   1423:        precache_sound ("items/damage2.wav");
                   1424:        precache_sound ("items/damage3.wav");
                   1425:        self.noise = "items/damage.wav";
                   1426:        setmodel (self, "progs/quaddama.mdl");
                   1427:        if (deathmatch == 4)
                   1428:                self.netname = "OctaPower";     
                   1429:        else
                   1430:                self.netname = "Quad Damage";
                   1431:        self.items = IT_QUAD;
                   1432:        self.effects = self.effects | EF_BLUE;
                   1433:        setsize (self, '-16 -16 -24', '16 16 32');
                   1434:        StartItem ();
                   1435: };
                   1436: 
                   1437: 
                   1438: 
                   1439: /*
                   1440: ===============================================================================
                   1441: 
                   1442: PLAYER BACKPACKS
                   1443: 
                   1444: ===============================================================================
                   1445: */
                   1446: 
                   1447: void() BackpackTouch =
                   1448: {
                   1449:        local string    s;
                   1450:        local   float   best, old, new;
                   1451:        local           entity  stemp;
                   1452:        local   float   acount;
                   1453:        local   float   b_switch;
                   1454: 
                   1455:        if (deathmatch == 4)
                   1456:                if (other.invincible_time > 0)
                   1457:                        return;
                   1458: 
                   1459:        if ((stof(infokey(other,"b_switch"))) == 0)
                   1460:                b_switch = 8;
                   1461:        else
                   1462:                b_switch = stof(infokey(other,"b_switch"));
                   1463:        
                   1464: 
                   1465:        if (other.classname != "player")
                   1466:                return;
                   1467:        if (other.health <= 0)
                   1468:                return;
                   1469:                
                   1470:        acount = 0;
                   1471:        sprint (other, PRINT_LOW, "You get ");
                   1472:  
                   1473:        if (deathmatch == 4)
                   1474:        {       
                   1475:                other.health = other.health + 10;
                   1476:                sprint (other, PRINT_LOW, "10 additional health\n");
                   1477:                if ((other.health > 250) && (other.health < 300))
                   1478:                        sound (other, CHAN_ITEM, "items/protect3.wav", 1, ATTN_NORM);
                   1479:                else
                   1480:                        sound (other, CHAN_ITEM, "weapons/lock4.wav", 1, ATTN_NORM);
                   1481:                stuffcmd (other, "bf\n");
                   1482:                remove(self);
                   1483: 
                   1484:                if (other.health >299)
                   1485:                {               
                   1486:                        if (other.invincible_time != 1)
                   1487:                        {                       
                   1488:                                other.invincible_time = 1;
                   1489:                                other.invincible_finished = time + 30;
                   1490:                                other.items = other.items | IT_INVULNERABILITY;
                   1491:                                
                   1492:                                other.super_time = 1;
                   1493:                                other.super_damage_finished = time + 30;
                   1494:                                other.items = other.items | IT_QUAD;
                   1495: 
                   1496:                                other.ammo_cells = 0;           
                   1497:                
                   1498:        
                   1499:                                sound (other, CHAN_VOICE, "boss1/sight1.wav", 1, ATTN_NORM);
                   1500:                                stuffcmd (other, "bf\n");               
                   1501:                                bprint (PRINT_HIGH, other.netname);
                   1502:                                bprint (PRINT_HIGH, " attains bonus powers!!!\n");
                   1503:                        }
                   1504:                }
                   1505:                self = other;
                   1506:                return;
                   1507:        }
                   1508:        if (self.items)
                   1509:                if ((other.items & self.items) == 0)
                   1510:                {
                   1511:                        acount = 1;
                   1512:                        sprint (other, PRINT_LOW, "the ");
                   1513:                        sprint (other, PRINT_LOW, self.netname);
                   1514:                }
                   1515:  
                   1516: // if the player was using his best weapon, change up to the new one if better          
                   1517:        stemp = self;
                   1518:        self = other;
                   1519:        best = W_BestWeapon();
                   1520:        self = stemp;
                   1521: 
                   1522: // change weapons
                   1523:        other.ammo_shells = other.ammo_shells + self.ammo_shells;
                   1524:        other.ammo_nails = other.ammo_nails + self.ammo_nails;
                   1525:        other.ammo_rockets = other.ammo_rockets + self.ammo_rockets;
                   1526:        other.ammo_cells = other.ammo_cells + self.ammo_cells;
                   1527: 
                   1528:        new = self.items;
                   1529:        if (!new)
                   1530:                new = other.weapon;
                   1531:        old = other.items;
                   1532:        other.items = other.items | self.items;
                   1533:        
                   1534:        bound_other_ammo ();
                   1535: 
                   1536:        if (self.ammo_shells)
                   1537:        {
                   1538:                if (acount)
                   1539:                        sprint(other, PRINT_LOW, ", ");
                   1540:                acount = 1;
                   1541:                s = ftos(self.ammo_shells);
                   1542:                sprint (other, PRINT_LOW, s);
                   1543:                sprint (other, PRINT_LOW, " shells");
                   1544:        }
                   1545:        if (self.ammo_nails)
                   1546:        {
                   1547:                if (acount)
                   1548:                        sprint(other, PRINT_LOW, ", ");
                   1549:                acount = 1;
                   1550:                s = ftos(self.ammo_nails);
                   1551:                sprint (other, PRINT_LOW, s);
                   1552:                sprint (other, PRINT_LOW, " nails");
                   1553:        }
                   1554:        if (self.ammo_rockets)
                   1555:        {
                   1556:                if (acount)
                   1557:                        sprint(other, PRINT_LOW, ", ");
                   1558:                acount = 1;
                   1559:                s = ftos(self.ammo_rockets);
                   1560:                sprint (other, PRINT_LOW, s);
                   1561:                sprint (other, PRINT_LOW, " rockets");
                   1562:        }
                   1563:        if (self.ammo_cells)
                   1564:        {
                   1565:                if (acount)
                   1566:                        sprint(other, PRINT_LOW, ", ");
                   1567:                acount = 1;
                   1568:                s = ftos(self.ammo_cells);
                   1569:                sprint (other, PRINT_LOW, s);
                   1570:                sprint (other,PRINT_LOW, " cells");
                   1571:        }
                   1572:        
                   1573:        if ( (deathmatch==3 || deathmatch == 5) & ( (WeaponCode(new)==6) || (WeaponCode(new)==7) ) & (other.ammo_rockets < 5) )
                   1574:                other.ammo_rockets = 5;
                   1575: 
                   1576:        sprint (other, PRINT_LOW, "\n");
                   1577: // backpack touch sound
                   1578:        sound (other, CHAN_ITEM, "weapons/lock4.wav", 1, ATTN_NORM);
                   1579:        stuffcmd (other, "bf\n");
                   1580: 
                   1581:        remove(self);
                   1582:        self = other;
                   1583:        
                   1584: // change to the weapon
                   1585:        
                   1586:        
                   1587:        if ( WeaponCode(new) <= b_switch )
                   1588:        {
                   1589:                if (self.flags & FL_INWATER)
                   1590:                {
                   1591:                        if (new != IT_LIGHTNING)
                   1592:                        {
                   1593:                                Deathmatch_Weapon (old, new);
                   1594:                        }
                   1595:                }
                   1596:                else
                   1597:                {                
                   1598:                        Deathmatch_Weapon (old, new);
                   1599:                }
                   1600:        }
                   1601: 
                   1602:        W_SetCurrentAmmo ();
                   1603: };
                   1604: 
                   1605: /*
                   1606: ===============
                   1607: DropBackpack
                   1608: ===============
                   1609: */
                   1610: void() DropBackpack =
                   1611: {
                   1612:        local entity    item;
                   1613: 
                   1614:        if (!(self.ammo_shells + self.ammo_nails + self.ammo_rockets + self.ammo_cells))
                   1615:                return; // nothing in it
                   1616: 
                   1617:        item = spawn();
                   1618:        item.origin = self.origin - '0 0 24';
                   1619:        
                   1620:        item.items = self.weapon;
                   1621:        if (item.items == IT_AXE)
                   1622:                item.netname = "Axe";
                   1623:        else if (item.items == IT_SHOTGUN)
                   1624:                item.netname = "Shotgun";
                   1625:        else if (item.items == IT_SUPER_SHOTGUN)
                   1626:                item.netname = "Double-barrelled Shotgun";
                   1627:        else if (item.items == IT_NAILGUN)
                   1628:                item.netname = "Nailgun";
                   1629:        else if (item.items == IT_SUPER_NAILGUN)
                   1630:                item.netname = "Super Nailgun";
                   1631:        else if (item.items == IT_GRENADE_LAUNCHER)
                   1632:                item.netname = "Grenade Launcher";
                   1633:        else if (item.items == IT_ROCKET_LAUNCHER)
                   1634:                item.netname = "Rocket Launcher";
                   1635:        else if (item.items == IT_LIGHTNING)
                   1636:                item.netname = "Thunderbolt";
                   1637:        else
                   1638:                item.netname = "";
                   1639: 
                   1640:        item.ammo_shells = self.ammo_shells;
                   1641:        item.ammo_nails = self.ammo_nails;
                   1642:        item.ammo_rockets = self.ammo_rockets;
                   1643:        item.ammo_cells = self.ammo_cells;
                   1644: 
                   1645:        item.velocity_z = 300;
                   1646:        item.velocity_x = -100 + (random() * 200);
                   1647:        item.velocity_y = -100 + (random() * 200);
                   1648:        
                   1649:        item.flags = FL_ITEM;
                   1650:        item.solid = SOLID_TRIGGER;
                   1651:        item.movetype = MOVETYPE_TOSS;
                   1652:        setmodel (item, "progs/backpack.mdl");
                   1653:        setsize (item, '-16 -16 0', '16 16 56');
                   1654:        item.touch = BackpackTouch;
                   1655:        
                   1656:        item.nextthink = time + 120;    // remove after 2 minutes
                   1657:        item.think = SUB_Remove;
                   1658: };
                   1659: 
                   1660: 

unix.superglobalmegacorp.com

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