Annotation of quakeworld/progs/items.qc, revision 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.