Annotation of quakeworld/progs/client.qc, revision 1.1

1.1     ! root        1: 
        !             2: // prototypes
        !             3: void () W_WeaponFrame;
        !             4: void() W_SetCurrentAmmo;
        !             5: void() player_pain;
        !             6: void() player_stand1;
        !             7: void (vector org) spawn_tfog;
        !             8: void (vector org, entity death_owner) spawn_tdeath;
        !             9: 
        !            10: float   modelindex_eyes, modelindex_player;
        !            11: 
        !            12: /*
        !            13: =============================================================================
        !            14: 
        !            15:                                LEVEL CHANGING / INTERMISSION
        !            16: 
        !            17: =============================================================================
        !            18: */
        !            19: 
        !            20: string nextmap;
        !            21: 
        !            22: float   intermission_running;
        !            23: float   intermission_exittime;
        !            24: 
        !            25: /*QUAKED info_intermission (1 0.5 0.5) (-16 -16 -16) (16 16 16)
        !            26: This is the camera point for the intermission.
        !            27: Use mangle instead of angle, so you can set pitch or roll as well as yaw.  'pitch roll yaw'
        !            28: */
        !            29: void() info_intermission =
        !            30: {
        !            31:        self.angles = self.mangle;      // so C can get at it
        !            32: };
        !            33: 
        !            34: 
        !            35: 
        !            36: void() SetChangeParms =
        !            37: {
        !            38:        if (self.health <= 0)
        !            39:        {
        !            40:                SetNewParms ();
        !            41:                return;
        !            42:        }
        !            43:  
        !            44: // remove items
        !            45:        self.items = self.items - (self.items & 
        !            46:        (IT_KEY1 | IT_KEY2 | IT_INVISIBILITY | IT_INVULNERABILITY | IT_SUIT | IT_QUAD) );
        !            47:        
        !            48: // cap super health
        !            49:        if (self.health > 100)
        !            50:                self.health = 100;
        !            51:        if (self.health < 50)
        !            52:                self.health = 50;
        !            53:        parm1 = self.items;
        !            54:        parm2 = self.health;
        !            55:        parm3 = self.armorvalue;
        !            56:        if (self.ammo_shells < 25)
        !            57:                parm4 = 25;
        !            58:        else
        !            59:                parm4 = self.ammo_shells;
        !            60:        parm5 = self.ammo_nails;
        !            61:        parm6 = self.ammo_rockets;
        !            62:        parm7 = self.ammo_cells;
        !            63:        parm8 = self.weapon;
        !            64:        parm9 = self.armortype * 100;
        !            65: };
        !            66: 
        !            67: void() SetNewParms =
        !            68: {
        !            69:        parm1 = IT_SHOTGUN | IT_AXE;
        !            70:        parm2 = 100;
        !            71:        parm3 = 0;
        !            72:        parm4 = 25;
        !            73:        parm5 = 0;
        !            74:        parm6 = 0;
        !            75:        parm7 = 0;
        !            76:        parm8 = 1;
        !            77:        parm9 = 0;
        !            78: };
        !            79: 
        !            80: void() DecodeLevelParms =
        !            81: {
        !            82:        if (serverflags)
        !            83:        {
        !            84:                if (world.model == "maps/start.bsp")
        !            85:                        SetNewParms ();         // take away all stuff on starting new episode
        !            86:        }
        !            87:        
        !            88:        self.items = parm1;
        !            89:        self.health = parm2;
        !            90:        self.armorvalue = parm3;
        !            91:        self.ammo_shells = parm4;
        !            92:        self.ammo_nails = parm5;
        !            93:        self.ammo_rockets = parm6;
        !            94:        self.ammo_cells = parm7;
        !            95:        self.weapon = parm8;
        !            96:        self.armortype = parm9 * 0.01;
        !            97: };
        !            98: 
        !            99: /*
        !           100: ============
        !           101: FindIntermission
        !           102: 
        !           103: Returns the entity to view from
        !           104: ============
        !           105: */
        !           106: entity() FindIntermission =
        !           107: {
        !           108:        local   entity spot;
        !           109:        local   float cyc;
        !           110: 
        !           111: // look for info_intermission first
        !           112:        spot = find (world, classname, "info_intermission");
        !           113:        if (spot)
        !           114:        {       // pick a random one
        !           115:                cyc = random() * 4;
        !           116:                while (cyc > 1)
        !           117:                {
        !           118:                        spot = find (spot, classname, "info_intermission");
        !           119:                        if (!spot)
        !           120:                                spot = find (spot, classname, "info_intermission");
        !           121:                        cyc = cyc - 1;
        !           122:                }
        !           123:                return spot;
        !           124:        }
        !           125: 
        !           126: // then look for the start position
        !           127:        spot = find (world, classname, "info_player_start");
        !           128:        if (spot)
        !           129:                return spot;
        !           130:        
        !           131:        objerror ("FindIntermission: no spot");
        !           132: };
        !           133: 
        !           134: 
        !           135: void() GotoNextMap =
        !           136: {
        !           137:        local string newmap;
        !           138: 
        !           139: //ZOID: 12-13-96, samelevel is overloaded, only 1 works for same level
        !           140: 
        !           141:        if (cvar("samelevel") == 1)     // if samelevel is set, stay on same level
        !           142:                changelevel (mapname);
        !           143:        else {
        !           144:                // configurable map lists, see if the current map exists as a
        !           145:                // serverinfo/localinfo var
        !           146:                newmap = infokey(world, mapname);
        !           147:                if (newmap != "")
        !           148:                        changelevel (newmap);
        !           149:                else
        !           150:                        changelevel (nextmap);
        !           151:        }
        !           152: };
        !           153: 
        !           154: 
        !           155: 
        !           156: /*
        !           157: ============
        !           158: IntermissionThink
        !           159: 
        !           160: When the player presses attack or jump, change to the next level
        !           161: ============
        !           162: */
        !           163: void() IntermissionThink =
        !           164: {
        !           165:        if (time < intermission_exittime)
        !           166:                return;
        !           167: 
        !           168:        if (!self.button0 && !self.button1 && !self.button2)
        !           169:                return;
        !           170:        
        !           171:        GotoNextMap ();
        !           172: };
        !           173: 
        !           174: /*
        !           175: ============
        !           176: execute_changelevel
        !           177: 
        !           178: The global "nextmap" has been set previously.
        !           179: Take the players to the intermission spot
        !           180: ============
        !           181: */
        !           182: void() execute_changelevel =
        !           183: {
        !           184:        local entity    pos;
        !           185: 
        !           186:        intermission_running = 1;
        !           187:        
        !           188: // enforce a wait time before allowing changelevel
        !           189:        intermission_exittime = time + 5;
        !           190: 
        !           191:        pos = FindIntermission ();
        !           192: 
        !           193: // play intermission music
        !           194:        WriteByte (MSG_ALL, SVC_CDTRACK);
        !           195:        WriteByte (MSG_ALL, 3);
        !           196: 
        !           197:        WriteByte (MSG_ALL, SVC_INTERMISSION);
        !           198:        WriteCoord (MSG_ALL, pos.origin_x);
        !           199:        WriteCoord (MSG_ALL, pos.origin_y);
        !           200:        WriteCoord (MSG_ALL, pos.origin_z);
        !           201:        WriteAngle (MSG_ALL, pos.mangle_x);
        !           202:        WriteAngle (MSG_ALL, pos.mangle_y);
        !           203:        WriteAngle (MSG_ALL, pos.mangle_z);
        !           204:        
        !           205:        other = find (world, classname, "player");
        !           206:        while (other != world)
        !           207:        {
        !           208:                other.takedamage = DAMAGE_NO;
        !           209:                other.solid = SOLID_NOT;
        !           210:                other.movetype = MOVETYPE_NONE;
        !           211:                other.modelindex = 0;
        !           212:                other = find (other, classname, "player");
        !           213:        }       
        !           214: 
        !           215: };
        !           216: 
        !           217: 
        !           218: void() changelevel_touch =
        !           219: {
        !           220:        local entity    pos;
        !           221: 
        !           222:        if (other.classname != "player")
        !           223:                return;
        !           224: 
        !           225: // if "noexit" is set, blow up the player trying to leave
        !           226: //ZOID, 12-13-96, noexit isn't supported in QW.  Overload samelevel
        !           227: //      if ((cvar("noexit") == 1) || ((cvar("noexit") == 2) && (mapname != "start")))
        !           228:        if ((cvar("samelevel") == 2) || ((cvar("samelevel") == 3) && (mapname != "start")))
        !           229:        {
        !           230:                T_Damage (other, self, self, 50000);
        !           231:                return;
        !           232:        }
        !           233: 
        !           234:        bprint (PRINT_HIGH, other.netname);
        !           235:        bprint (PRINT_HIGH," exited the level\n");
        !           236:        
        !           237:        nextmap = self.map;
        !           238: 
        !           239:        SUB_UseTargets ();
        !           240: 
        !           241:        self.touch = SUB_Null;
        !           242: 
        !           243: // we can't move people right now, because touch functions are called
        !           244: // in the middle of C movement code, so set a think time to do it
        !           245:        self.think = execute_changelevel;
        !           246:        self.nextthink = time + 0.1;
        !           247: };
        !           248: 
        !           249: /*QUAKED trigger_changelevel (0.5 0.5 0.5) ? NO_INTERMISSION
        !           250: When the player touches this, he gets sent to the map listed in the "map" variable.  Unless the NO_INTERMISSION flag is set, the view will go to the info_intermission spot and display stats.
        !           251: */
        !           252: void() trigger_changelevel =
        !           253: {
        !           254:        if (!self.map)
        !           255:                objerror ("chagnelevel trigger doesn't have map");
        !           256:        
        !           257:        InitTrigger ();
        !           258:        self.touch = changelevel_touch;
        !           259: };
        !           260: 
        !           261: 
        !           262: /*
        !           263: =============================================================================
        !           264: 
        !           265:                                PLAYER GAME EDGE FUNCTIONS
        !           266: 
        !           267: =============================================================================
        !           268: */
        !           269: 
        !           270: void() set_suicide_frame;
        !           271: 
        !           272: // called by ClientKill and DeadThink
        !           273: void() respawn =
        !           274: {
        !           275:        // make a copy of the dead body for appearances sake
        !           276:        CopyToBodyQue (self);
        !           277:        // set default spawn parms
        !           278:        SetNewParms ();
        !           279:        // respawn              
        !           280:        PutClientInServer ();
        !           281: };
        !           282: 
        !           283: 
        !           284: /*
        !           285: ============
        !           286: ClientKill
        !           287: 
        !           288: Player entered the suicide command
        !           289: ============
        !           290: */
        !           291: void() ClientKill =
        !           292: {
        !           293:        bprint (PRINT_MEDIUM, self.netname);
        !           294:        bprint (PRINT_MEDIUM, " suicides\n");
        !           295:        set_suicide_frame ();
        !           296:        self.modelindex = modelindex_player;
        !           297:        logfrag (self, self);
        !           298:        self.frags = self.frags - 2;    // extra penalty
        !           299:        respawn ();
        !           300: };
        !           301: 
        !           302: float(vector v) CheckSpawnPoint =
        !           303: {
        !           304:        return FALSE;
        !           305: };
        !           306: 
        !           307: /*
        !           308: ============
        !           309: SelectSpawnPoint
        !           310: 
        !           311: Returns the entity to spawn at
        !           312: ============
        !           313: */
        !           314: entity() SelectSpawnPoint =
        !           315: {
        !           316:        local   entity spot, newspot, thing;
        !           317:        local   float   numspots, totalspots;
        !           318:        local   float   rnum, pcount;
        !           319:        local   float   rs;
        !           320:        local entity spots;
        !           321: 
        !           322:        numspots = 0;
        !           323:        totalspots = 0;
        !           324: 
        !           325: // testinfo_player_start is only found in regioned levels
        !           326:        spot = find (world, classname, "testplayerstart");
        !           327:        if (spot)
        !           328:                return spot;
        !           329:                
        !           330: // choose a info_player_deathmatch point
        !           331: 
        !           332: // ok, find all spots that don't have players nearby
        !           333: 
        !           334:        spots = world;
        !           335:        spot = find (world, classname, "info_player_deathmatch");       
        !           336:        while (spot)
        !           337:        {
        !           338:                totalspots = totalspots + 1;
        !           339: 
        !           340:                thing=findradius(spot.origin, 84);
        !           341:                pcount=0;               
        !           342:                while (thing)
        !           343:                {
        !           344:                        if (thing.classname == "player")
        !           345:                                pcount=pcount + 1;                      
        !           346:                        thing=thing.chain;      
        !           347:                }
        !           348:                if (pcount == 0) {
        !           349:                        spot.goalentity = spots;
        !           350:                        spots = spot;
        !           351:                        numspots = numspots + 1;
        !           352:                }
        !           353: 
        !           354:                // Get the next spot in the chain
        !           355:                spot = find (spot, classname, "info_player_deathmatch");                
        !           356:        }
        !           357:        totalspots=totalspots - 1;
        !           358:        if (!numspots) {
        !           359:                // ack, they are all full, just pick one at random
        !           360: //             bprint (PRINT_HIGH, "Ackk! All spots are full. Selecting random spawn spot\n");
        !           361:                totalspots = rint((random() * totalspots));
        !           362:                spot = find (world, classname, "info_player_deathmatch");       
        !           363:                while (totalspots > 0) {
        !           364:                        totalspots = totalspots - 1;
        !           365:                        spot = find (spot, classname, "info_player_deathmatch");
        !           366:                }
        !           367:                return spot;
        !           368:        }
        !           369:                
        !           370: // We now have the number of spots available on the map in numspots
        !           371: 
        !           372:        // Generate a random number between 1 and numspots
        !           373: 
        !           374:        numspots = numspots - 1;
        !           375:        
        !           376:        numspots = rint((random() * numspots ) );
        !           377: 
        !           378:        spot = spots;
        !           379:        while (numspots > 0) {
        !           380:                spot = spot.goalentity;
        !           381:                numspots = numspots - 1;
        !           382:        }
        !           383:        return spot;
        !           384: 
        !           385: };
        !           386: void() DecodeLevelParms;
        !           387: void() PlayerDie;
        !           388: 
        !           389: /*
        !           390: ===========
        !           391: ValidateUser
        !           392: 
        !           393: 
        !           394: ============
        !           395: */
        !           396: float(entity e) ValidateUser =
        !           397: {
        !           398: /*
        !           399:        local string    s;
        !           400:        local string    userclan;
        !           401:        local float     rank, rankmin, rankmax;
        !           402: 
        !           403: //
        !           404: // if the server has set "clan1" and "clan2", then it
        !           405: // is a clan match that will allow only those two clans in
        !           406: //
        !           407:        s = serverinfo("clan1");
        !           408:        if (s)
        !           409:        {
        !           410:                userclan = masterinfo(e,"clan");
        !           411:                if (s == userclan)
        !           412:                        return true;
        !           413:                s = serverinfo("clan2");
        !           414:                if (s == userclan)
        !           415:                        return true;
        !           416:                return false;
        !           417:        }
        !           418: 
        !           419: //
        !           420: // if the server has set "rankmin" and/or "rankmax" then
        !           421: // the users rank must be between those two values
        !           422: //
        !           423:        s = masterinfo (e, "rank");
        !           424:        rank = stof (s);
        !           425: 
        !           426:        s = serverinfo("rankmin");
        !           427:        if (s)
        !           428:        {
        !           429:                rankmin = stof (s);
        !           430:                if (rank < rankmin)
        !           431:                        return false;
        !           432:        }
        !           433:        s = serverinfo("rankmax");
        !           434:        if (s)
        !           435:        {
        !           436:                rankmax = stof (s);
        !           437:                if (rankmax < rank)
        !           438:                        return false;
        !           439:        }
        !           440: 
        !           441:        return true;
        !           442: */
        !           443: };
        !           444: 
        !           445: 
        !           446: /*
        !           447: ===========
        !           448: PutClientInServer
        !           449: 
        !           450: called each time a player enters a new level
        !           451: ============
        !           452: */
        !           453: void() PutClientInServer =
        !           454: {
        !           455:        local   entity spot;
        !           456:        local   string  s;
        !           457: 
        !           458:        self.classname = "player";
        !           459:        self.health = 100;
        !           460:        self.takedamage = DAMAGE_AIM;
        !           461:        self.solid = SOLID_SLIDEBOX;
        !           462:        self.movetype = MOVETYPE_WALK;
        !           463:        self.show_hostile = 0;
        !           464:        self.max_health = 100;
        !           465:        self.flags = FL_CLIENT;
        !           466:        self.air_finished = time + 12;
        !           467:        self.dmg = 2;                   // initial water damage
        !           468:        self.super_damage_finished = 0;
        !           469:        self.radsuit_finished = 0;
        !           470:        self.invisible_finished = 0;
        !           471:        self.invincible_finished = 0;
        !           472:        self.effects = 0;
        !           473:        self.invincible_time = 0;
        !           474: 
        !           475:        DecodeLevelParms ();
        !           476:        
        !           477:        W_SetCurrentAmmo ();
        !           478: 
        !           479:        self.attack_finished = time;
        !           480:        self.th_pain = player_pain;
        !           481:        self.th_die = PlayerDie;
        !           482:        
        !           483:        self.deadflag = DEAD_NO;
        !           484: // paustime is set by teleporters to keep the player from moving a while
        !           485:        self.pausetime = 0;
        !           486:        
        !           487:        spot = SelectSpawnPoint ();
        !           488: 
        !           489:        self.origin = spot.origin + '0 0 1';
        !           490:        self.angles = spot.angles;
        !           491:        self.fixangle = TRUE;           // turn this way immediately
        !           492: 
        !           493: // oh, this is a hack!
        !           494:        setmodel (self, "progs/eyes.mdl");
        !           495:        modelindex_eyes = self.modelindex;
        !           496: 
        !           497:        setmodel (self, "progs/player.mdl");
        !           498:        modelindex_player = self.modelindex;
        !           499: 
        !           500:        setsize (self, VEC_HULL_MIN, VEC_HULL_MAX);
        !           501:        
        !           502:        self.view_ofs = '0 0 22';
        !           503: 
        !           504: // Mod - Xian (May.20.97)
        !           505: // Bug where player would have velocity from their last kill
        !           506: 
        !           507:        self.velocity = '0 0 0';
        !           508: 
        !           509:        player_stand1 ();
        !           510:        
        !           511:        makevectors(self.angles);
        !           512:        spawn_tfog (self.origin + v_forward*20);
        !           513: 
        !           514:        spawn_tdeath (self.origin, self);
        !           515: 
        !           516:        // Set Rocket Jump Modifiers
        !           517:        if (stof(infokey(world, "rj")) != 0)
        !           518:        {                
        !           519:                rj = stof(infokey(world, "rj"));
        !           520:        }
        !           521: 
        !           522:        if (deathmatch == 4)
        !           523:        {
        !           524:                self.ammo_shells = 0;
        !           525:                if (stof(infokey(world, "axe")) == 0)
        !           526:                {
        !           527:                        self.ammo_nails = 255;
        !           528:                        self.ammo_shells = 255;
        !           529:                        self.ammo_rockets = 255;
        !           530:                        self.ammo_cells = 255;
        !           531:                        self.items = self.items | IT_NAILGUN;
        !           532:                        self.items = self.items | IT_SUPER_NAILGUN;
        !           533:                        self.items = self.items | IT_SUPER_SHOTGUN;
        !           534:                        self.items = self.items | IT_ROCKET_LAUNCHER;
        !           535: //             self.items = self.items | IT_GRENADE_LAUNCHER;
        !           536:                        self.items = self.items | IT_LIGHTNING;
        !           537:                }
        !           538:                self.items = self.items - (self.items & (IT_ARMOR1 | IT_ARMOR2 | IT_ARMOR3)) + IT_ARMOR3;
        !           539:                self.armorvalue = 200;
        !           540:                self.armortype = 0.8;
        !           541:                self.health = 250;
        !           542:                self.items = self.items | IT_INVULNERABILITY;
        !           543:                self.invincible_time = 1;
        !           544:                self.invincible_finished = time + 3;
        !           545:        }
        !           546: 
        !           547:        if (deathmatch == 5)
        !           548:        {
        !           549:                self.ammo_nails = 80;
        !           550:                self.ammo_shells = 30;
        !           551:                self.ammo_rockets = 10;
        !           552:                self.ammo_cells = 30;
        !           553:                self.items = self.items | IT_NAILGUN;
        !           554:                self.items = self.items | IT_SUPER_NAILGUN;
        !           555:                self.items = self.items | IT_SUPER_SHOTGUN;
        !           556:                self.items = self.items | IT_ROCKET_LAUNCHER;
        !           557:                self.items = self.items | IT_GRENADE_LAUNCHER;
        !           558:                self.items = self.items | IT_LIGHTNING;
        !           559:                self.items = self.items - (self.items & (IT_ARMOR1 | IT_ARMOR2 | IT_ARMOR3)) + IT_ARMOR3;
        !           560:                self.armorvalue = 200;
        !           561:                self.armortype = 0.8;
        !           562:                self.health = 200;
        !           563:                self.items = self.items | IT_INVULNERABILITY;
        !           564:                self.invincible_time = 1;
        !           565:                self.invincible_finished = time + 3;
        !           566:        }
        !           567: 
        !           568: 
        !           569: };
        !           570: 
        !           571: 
        !           572: /*
        !           573: =============================================================================
        !           574: 
        !           575:                                QUAKED FUNCTIONS
        !           576: 
        !           577: =============================================================================
        !           578: */
        !           579: 
        !           580: 
        !           581: /*QUAKED info_player_start (1 0 0) (-16 -16 -24) (16 16 24)
        !           582: The normal starting point for a level.
        !           583: */
        !           584: void() info_player_start =
        !           585: {
        !           586: };
        !           587: 
        !           588: 
        !           589: /*QUAKED info_player_start2 (1 0 0) (-16 -16 -24) (16 16 24)
        !           590: Only used on start map for the return point from an episode.
        !           591: */
        !           592: void() info_player_start2 =
        !           593: {
        !           594: };
        !           595: 
        !           596: /*QUAKED info_player_deathmatch (1 0 1) (-16 -16 -24) (16 16 24)
        !           597: potential spawning position for deathmatch games
        !           598: */
        !           599: void() info_player_deathmatch =
        !           600: {
        !           601: };
        !           602: 
        !           603: /*QUAKED info_player_coop (1 0 1) (-16 -16 -24) (16 16 24)
        !           604: potential spawning position for coop games
        !           605: */
        !           606: void() info_player_coop =
        !           607: {
        !           608: };
        !           609: 
        !           610: /*
        !           611: ===============================================================================
        !           612: 
        !           613: RULES
        !           614: 
        !           615: ===============================================================================
        !           616: */
        !           617: 
        !           618: /*
        !           619: go to the next level for deathmatch
        !           620: */
        !           621: void() NextLevel =
        !           622: {
        !           623:        local entity o;
        !           624:        local string newmap;
        !           625: 
        !           626:        if (nextmap != "")
        !           627:                return; // already done
        !           628: 
        !           629:        if (mapname == "start")
        !           630:        {
        !           631:                if (!cvar("registered"))
        !           632:                {
        !           633:                        mapname = "e1m1";
        !           634:                }
        !           635:                else if (!(serverflags & 1))
        !           636:                {
        !           637:                        mapname = "e1m1";
        !           638:                        serverflags = serverflags | 1;
        !           639:                }
        !           640:                else if (!(serverflags & 2))
        !           641:                {
        !           642:                        mapname = "e2m1";
        !           643:                        serverflags = serverflags | 2;
        !           644:                }
        !           645:                else if (!(serverflags & 4))
        !           646:                {
        !           647:                        mapname = "e3m1";
        !           648:                        serverflags = serverflags | 4;
        !           649:                }
        !           650:                else if (!(serverflags & 8))
        !           651:                {
        !           652:                        mapname = "e4m1";
        !           653:                        serverflags = serverflags - 7;
        !           654:                }
        !           655:  
        !           656:                o = spawn();
        !           657:                o.map = mapname;
        !           658:        }
        !           659:        else
        !           660:        {
        !           661:                // find a trigger changelevel
        !           662:                o = find(world, classname, "trigger_changelevel");
        !           663:                if (!o || mapname == "start")
        !           664:                {       // go back to same map if no trigger_changelevel
        !           665:                        o = spawn();
        !           666:                        o.map = mapname;
        !           667:                }
        !           668:        }
        !           669: 
        !           670:        nextmap = o.map;
        !           671: 
        !           672:        if (o.nextthink < time)
        !           673:        {
        !           674:                o.think = execute_changelevel;
        !           675:                o.nextthink = time + 0.1;
        !           676:        }
        !           677: };
        !           678: 
        !           679: /*
        !           680: ============
        !           681: CheckRules
        !           682: 
        !           683: Exit deathmatch games upon conditions
        !           684: ============
        !           685: */
        !           686: void() CheckRules =
        !           687: {       
        !           688:        if (timelimit && time >= timelimit)
        !           689:                NextLevel ();
        !           690:        
        !           691:        if (fraglimit && self.frags >= fraglimit)
        !           692:                NextLevel ();
        !           693: };
        !           694: 
        !           695: //============================================================================
        !           696: 
        !           697: void() PlayerDeathThink =
        !           698: {
        !           699:        local entity    old_self;
        !           700:        local float             forward;
        !           701: 
        !           702:        if ((self.flags & FL_ONGROUND))
        !           703:        {
        !           704:                forward = vlen (self.velocity);
        !           705:                forward = forward - 20;
        !           706:                if (forward <= 0)
        !           707:                        self.velocity = '0 0 0';
        !           708:                else    
        !           709:                        self.velocity = forward * normalize(self.velocity);
        !           710:        }
        !           711: 
        !           712: // wait for all buttons released
        !           713:        if (self.deadflag == DEAD_DEAD)
        !           714:        {
        !           715:                if (self.button2 || self.button1 || self.button0)
        !           716:                        return;
        !           717:                self.deadflag = DEAD_RESPAWNABLE;
        !           718:                return;
        !           719:        }
        !           720: 
        !           721: // wait for any button down
        !           722:        if (!self.button2 && !self.button1 && !self.button0)
        !           723:                return;
        !           724: 
        !           725:        self.button0 = 0;
        !           726:        self.button1 = 0;
        !           727:        self.button2 = 0;
        !           728:        respawn();
        !           729: };
        !           730: 
        !           731: 
        !           732: void() PlayerJump =
        !           733: {
        !           734:        local vector start, end;
        !           735: 
        !           736:        if (self.flags & FL_WATERJUMP)
        !           737:                return;
        !           738:        
        !           739:        if (self.waterlevel >= 2)
        !           740:        {
        !           741: // play swiming sound
        !           742:                if (self.swim_flag < time)
        !           743:                {
        !           744:                        self.swim_flag = time + 1;
        !           745:                        if (random() < 0.5)
        !           746:                                sound (self, CHAN_BODY, "misc/water1.wav", 1, ATTN_NORM);
        !           747:                        else
        !           748:                                sound (self, CHAN_BODY, "misc/water2.wav", 1, ATTN_NORM);
        !           749:                }
        !           750: 
        !           751:                return;
        !           752:        }
        !           753: 
        !           754:        if (!(self.flags & FL_ONGROUND))
        !           755:                return;
        !           756: 
        !           757:        if ( !(self.flags & FL_JUMPRELEASED) )
        !           758:                return;         // don't pogo stick
        !           759: 
        !           760:        self.flags = self.flags - (self.flags & FL_JUMPRELEASED);       
        !           761:        self.button2 = 0;
        !           762: 
        !           763: // player jumping sound
        !           764:        sound (self, CHAN_BODY, "player/plyrjmp8.wav", 1, ATTN_NORM);
        !           765: };
        !           766: 
        !           767: 
        !           768: /*
        !           769: ===========
        !           770: WaterMove
        !           771: 
        !           772: ============
        !           773: */
        !           774: .float  dmgtime;
        !           775: 
        !           776: void() WaterMove =
        !           777: {
        !           778: //dprint (ftos(self.waterlevel));
        !           779:        if (self.movetype == MOVETYPE_NOCLIP)
        !           780:                return;
        !           781:        if (self.health < 0)
        !           782:                return;
        !           783: 
        !           784:        if (self.waterlevel != 3)
        !           785:        {
        !           786:                if (self.air_finished < time)
        !           787:                        sound (self, CHAN_VOICE, "player/gasp2.wav", 1, ATTN_NORM);
        !           788:                else if (self.air_finished < time + 9)
        !           789:                        sound (self, CHAN_VOICE, "player/gasp1.wav", 1, ATTN_NORM);
        !           790:                self.air_finished = time + 12;
        !           791:                self.dmg = 2;
        !           792:        }
        !           793:        else if (self.air_finished < time)
        !           794:        {       // drown!
        !           795:                if (self.pain_finished < time)
        !           796:                {
        !           797:                        self.dmg = self.dmg + 2;
        !           798:                        if (self.dmg > 15)
        !           799:                                self.dmg = 10;
        !           800:                        T_Damage (self, world, world, self.dmg);
        !           801:                        self.pain_finished = time + 1;
        !           802:                }
        !           803:        }
        !           804:        
        !           805:        if (!self.waterlevel)
        !           806:        {
        !           807:                if (self.flags & FL_INWATER)
        !           808:                {       
        !           809:                        // play leave water sound
        !           810:                        sound (self, CHAN_BODY, "misc/outwater.wav", 1, ATTN_NORM);
        !           811:                        self.flags = self.flags - FL_INWATER;
        !           812:                }
        !           813:                return;
        !           814:        }
        !           815: 
        !           816:        if (self.watertype == CONTENT_LAVA)
        !           817:        {       // do damage
        !           818:                if (self.dmgtime < time)
        !           819:                {
        !           820:                        if (self.radsuit_finished > time)
        !           821:                                self.dmgtime = time + 1;
        !           822:                        else
        !           823:                                self.dmgtime = time + 0.2;
        !           824: 
        !           825:                        T_Damage (self, world, world, 10*self.waterlevel);
        !           826:                }
        !           827:        }
        !           828:        else if (self.watertype == CONTENT_SLIME)
        !           829:        {       // do damage
        !           830:                if (self.dmgtime < time && self.radsuit_finished < time)
        !           831:                {
        !           832:                        self.dmgtime = time + 1;
        !           833:                        T_Damage (self, world, world, 4*self.waterlevel);
        !           834:                }
        !           835:        }
        !           836:        
        !           837:        if ( !(self.flags & FL_INWATER) )
        !           838:        {       
        !           839: 
        !           840: // player enter water sound
        !           841: 
        !           842:                if (self.watertype == CONTENT_LAVA)
        !           843:                        sound (self, CHAN_BODY, "player/inlava.wav", 1, ATTN_NORM);
        !           844:                if (self.watertype == CONTENT_WATER)
        !           845:                        sound (self, CHAN_BODY, "player/inh2o.wav", 1, ATTN_NORM);
        !           846:                if (self.watertype == CONTENT_SLIME)
        !           847:                        sound (self, CHAN_BODY, "player/slimbrn2.wav", 1, ATTN_NORM);
        !           848: 
        !           849:                self.flags = self.flags + FL_INWATER;
        !           850:                self.dmgtime = 0;
        !           851:        }       
        !           852: };
        !           853: 
        !           854: void() CheckWaterJump =
        !           855: {
        !           856:        local vector start, end;
        !           857: 
        !           858: // check for a jump-out-of-water
        !           859:        makevectors (self.angles);
        !           860:        start = self.origin;
        !           861:        start_z = start_z + 8; 
        !           862:        v_forward_z = 0;
        !           863:        normalize(v_forward);
        !           864:        end = start + v_forward*24;
        !           865:        traceline (start, end, TRUE, self);
        !           866:        if (trace_fraction < 1)
        !           867:        {       // solid at waist
        !           868:                start_z = start_z + self.maxs_z - 8;
        !           869:                end = start + v_forward*24;
        !           870:                self.movedir = trace_plane_normal * -50;
        !           871:                traceline (start, end, TRUE, self);
        !           872:                if (trace_fraction == 1)
        !           873:                {       // open at eye level
        !           874:                        self.flags = self.flags | FL_WATERJUMP;
        !           875:                        self.velocity_z = 225;
        !           876:                        self.flags = self.flags - (self.flags & FL_JUMPRELEASED);
        !           877:                        self.teleport_time = time + 2;  // safety net
        !           878:                        return;
        !           879:                }
        !           880:        }
        !           881: };
        !           882: 
        !           883: /*
        !           884: ================
        !           885: PlayerPreThink
        !           886: 
        !           887: Called every frame before physics are run
        !           888: ================
        !           889: */
        !           890: void() PlayerPreThink =
        !           891: {
        !           892:        local   float   mspeed, aspeed;
        !           893:        local   float   r;
        !           894: 
        !           895:        if (intermission_running)
        !           896:        {
        !           897:                IntermissionThink ();   // otherwise a button could be missed between
        !           898:                return;                                 // the think tics
        !           899:        }
        !           900: 
        !           901:        if (self.view_ofs == '0 0 0')
        !           902:                return;         // intermission or finale
        !           903: 
        !           904:        makevectors (self.v_angle);             // is this still used
        !           905: 
        !           906:         self.deathtype = "";
        !           907: 
        !           908:        CheckRules ();
        !           909:        WaterMove ();
        !           910: /*
        !           911:        if (self.waterlevel == 2)
        !           912:                CheckWaterJump ();
        !           913: */
        !           914: 
        !           915:        if (self.deadflag >= DEAD_DEAD)
        !           916:        {
        !           917:                PlayerDeathThink ();
        !           918:                return;
        !           919:        }
        !           920:        
        !           921:        if (self.deadflag == DEAD_DYING)
        !           922:                return; // dying, so do nothing
        !           923: 
        !           924:        if (self.button2)
        !           925:        {
        !           926:                PlayerJump ();
        !           927:        }
        !           928:        else
        !           929:                self.flags = self.flags | FL_JUMPRELEASED;
        !           930: 
        !           931: // teleporters can force a non-moving pause time        
        !           932:        if (time < self.pausetime)
        !           933:                self.velocity = '0 0 0';
        !           934: 
        !           935:        if(time > self.attack_finished && self.currentammo == 0 && self.weapon != IT_AXE)
        !           936:        {
        !           937:                self.weapon = W_BestWeapon ();
        !           938:                W_SetCurrentAmmo ();
        !           939:        }
        !           940: };
        !           941:        
        !           942: /*
        !           943: ================
        !           944: CheckPowerups
        !           945: 
        !           946: Check for turning off powerups
        !           947: ================
        !           948: */
        !           949: void() CheckPowerups =
        !           950: {
        !           951:        if (self.health <= 0)
        !           952:                return;
        !           953: 
        !           954: // invisibility
        !           955:        if (self.invisible_finished)
        !           956:        {
        !           957: // sound and screen flash when items starts to run out
        !           958:                if (self.invisible_sound < time)
        !           959:                {
        !           960:                        sound (self, CHAN_AUTO, "items/inv3.wav", 0.5, ATTN_IDLE);
        !           961:                        self.invisible_sound = time + ((random() * 3) + 1);
        !           962:                }
        !           963: 
        !           964: 
        !           965:                if (self.invisible_finished < time + 3)
        !           966:                {
        !           967:                        if (self.invisible_time == 1)
        !           968:                        {
        !           969:                                sprint (self, PRINT_HIGH, "Ring of Shadows magic is fading\n");
        !           970:                                stuffcmd (self, "bf\n");
        !           971:                                sound (self, CHAN_AUTO, "items/inv2.wav", 1, ATTN_NORM);
        !           972:                                self.invisible_time = time + 1;
        !           973:                        }
        !           974:                        
        !           975:                        if (self.invisible_time < time)
        !           976:                        {
        !           977:                                self.invisible_time = time + 1;
        !           978:                                stuffcmd (self, "bf\n");
        !           979:                        }
        !           980:                }
        !           981: 
        !           982:                if (self.invisible_finished < time)
        !           983:                {       // just stopped
        !           984:                        self.items = self.items - IT_INVISIBILITY;
        !           985:                        self.invisible_finished = 0;
        !           986:                        self.invisible_time = 0;
        !           987:                }
        !           988:                
        !           989:        // use the eyes
        !           990:                self.frame = 0;
        !           991:                self.modelindex = modelindex_eyes;
        !           992:        }
        !           993:        else
        !           994:                self.modelindex = modelindex_player;    // don't use eyes
        !           995: 
        !           996: // invincibility
        !           997:        if (self.invincible_finished)
        !           998:        {
        !           999: // sound and screen flash when items starts to run out
        !          1000:                if (self.invincible_finished < time + 3)
        !          1001:                {
        !          1002:                        if (self.invincible_time == 1)
        !          1003:                        {
        !          1004:                                sprint (self, PRINT_HIGH, "Protection is almost burned out\n");
        !          1005:                                stuffcmd (self, "bf\n");
        !          1006:                                sound (self, CHAN_AUTO, "items/protect2.wav", 1, ATTN_NORM);
        !          1007:                                self.invincible_time = time + 1;
        !          1008:                        }
        !          1009:                        
        !          1010:                        if (self.invincible_time < time)
        !          1011:                        {
        !          1012:                                self.invincible_time = time + 1;
        !          1013:                                stuffcmd (self, "bf\n");
        !          1014:                        }
        !          1015:                }
        !          1016:                
        !          1017:                if (self.invincible_finished < time)
        !          1018:                {       // just stopped
        !          1019:                        self.items = self.items - IT_INVULNERABILITY;
        !          1020:                        self.invincible_time = 0;
        !          1021:                        self.invincible_finished = 0;
        !          1022:                }
        !          1023:                if (self.invincible_finished > time)
        !          1024:                {
        !          1025:                        self.effects = self.effects | EF_DIMLIGHT;
        !          1026:                        self.effects = self.effects | EF_RED;
        !          1027:                }
        !          1028:                else
        !          1029:                {
        !          1030:                        self.effects = self.effects - (self.effects & EF_DIMLIGHT);
        !          1031:                        self.effects = self.effects - (self.effects & EF_RED);
        !          1032:                }
        !          1033:        }
        !          1034: 
        !          1035: // super damage
        !          1036:        if (self.super_damage_finished)
        !          1037:        {
        !          1038: 
        !          1039: // sound and screen flash when items starts to run out
        !          1040: 
        !          1041:                if (self.super_damage_finished < time + 3)
        !          1042:                {
        !          1043:                        if (self.super_time == 1)
        !          1044:                        {
        !          1045:                                if (deathmatch == 4)
        !          1046:                                        sprint (self, PRINT_HIGH, "OctaPower is wearing off\n");
        !          1047:                                else
        !          1048:                                        sprint (self, PRINT_HIGH, "Quad Damage is wearing off\n");
        !          1049:                                stuffcmd (self, "bf\n");
        !          1050:                                sound (self, CHAN_AUTO, "items/damage2.wav", 1, ATTN_NORM);
        !          1051:                                self.super_time = time + 1;
        !          1052:                        }         
        !          1053:                        
        !          1054:                        if (self.super_time < time)
        !          1055:                        {
        !          1056:                                self.super_time = time + 1;
        !          1057:                                stuffcmd (self, "bf\n");
        !          1058:                        }
        !          1059:                }
        !          1060: 
        !          1061:                if (self.super_damage_finished < time)
        !          1062:                {       // just stopped
        !          1063:                        self.items = self.items - IT_QUAD;
        !          1064:                        if (deathmatch == 4)
        !          1065:                        {
        !          1066:                                self.ammo_cells = 255;
        !          1067:                                self.armorvalue = 1;
        !          1068:                                self.armortype = 0.8;
        !          1069:                                self.health = 100;
        !          1070:                        }
        !          1071:                        self.super_damage_finished = 0;
        !          1072:                        self.super_time = 0;
        !          1073:                }
        !          1074:                if (self.super_damage_finished > time)
        !          1075:                {
        !          1076:                        self.effects = self.effects | EF_DIMLIGHT;
        !          1077:                        self.effects = self.effects | EF_BLUE;
        !          1078:                }
        !          1079:                else
        !          1080:                {
        !          1081:                        self.effects = self.effects - (self.effects & EF_DIMLIGHT);
        !          1082:                        self.effects = self.effects - (self.effects & EF_BLUE);
        !          1083:                }
        !          1084:        }       
        !          1085: 
        !          1086: // suit 
        !          1087:        if (self.radsuit_finished)
        !          1088:        {
        !          1089:                self.air_finished = time + 12;          // don't drown
        !          1090: 
        !          1091: // sound and screen flash when items starts to run out
        !          1092:                if (self.radsuit_finished < time + 3)
        !          1093:                {
        !          1094:                        if (self.rad_time == 1)
        !          1095:                        {
        !          1096:                                sprint (self, PRINT_HIGH, "Air supply in Biosuit expiring\n");
        !          1097:                                stuffcmd (self, "bf\n");
        !          1098:                                sound (self, CHAN_AUTO, "items/suit2.wav", 1, ATTN_NORM);
        !          1099:                                self.rad_time = time + 1;
        !          1100:                        }
        !          1101:                        
        !          1102:                        if (self.rad_time < time)
        !          1103:                        {
        !          1104:                                self.rad_time = time + 1;
        !          1105:                                stuffcmd (self, "bf\n");
        !          1106:                        }
        !          1107:                }
        !          1108: 
        !          1109:                if (self.radsuit_finished < time)
        !          1110:                {       // just stopped
        !          1111:                        self.items = self.items - IT_SUIT;
        !          1112:                        self.rad_time = 0;
        !          1113:                        self.radsuit_finished = 0;
        !          1114:                }
        !          1115:        }       
        !          1116: 
        !          1117: };
        !          1118: 
        !          1119: 
        !          1120: /*
        !          1121: ================
        !          1122: PlayerPostThink
        !          1123: 
        !          1124: Called every frame after physics are run
        !          1125: ================
        !          1126: */
        !          1127: void() PlayerPostThink =
        !          1128: {
        !          1129:        local   float   mspeed, aspeed;
        !          1130:        local   float   r;
        !          1131: 
        !          1132: //dprint ("post think\n");
        !          1133:        if (self.view_ofs == '0 0 0')
        !          1134:                return;         // intermission or finale
        !          1135:        if (self.deadflag)
        !          1136:                return;
        !          1137: 
        !          1138: // check to see if player landed and play landing sound 
        !          1139:        if ((self.jump_flag < -300) && (self.flags & FL_ONGROUND) )
        !          1140:        {
        !          1141:                if (self.watertype == CONTENT_WATER)
        !          1142:                        sound (self, CHAN_BODY, "player/h2ojump.wav", 1, ATTN_NORM);
        !          1143:                else if (self.jump_flag < -650)
        !          1144:                {
        !          1145:                        self.deathtype = "falling";
        !          1146:                        T_Damage (self, world, world, 5); 
        !          1147:                        sound (self, CHAN_VOICE, "player/land2.wav", 1, ATTN_NORM);
        !          1148:                }
        !          1149:                else
        !          1150:                        sound (self, CHAN_VOICE, "player/land.wav", 1, ATTN_NORM);
        !          1151:        }
        !          1152: 
        !          1153:        self.jump_flag = self.velocity_z;
        !          1154: 
        !          1155:        CheckPowerups ();
        !          1156: 
        !          1157:        W_WeaponFrame ();
        !          1158: 
        !          1159: };
        !          1160: 
        !          1161: 
        !          1162: /*
        !          1163: ===========
        !          1164: ClientConnect
        !          1165: 
        !          1166: called when a player connects to a server
        !          1167: ============
        !          1168: */
        !          1169: void() ClientConnect =
        !          1170: {
        !          1171:        bprint (PRINT_HIGH, self.netname);
        !          1172:        bprint (PRINT_HIGH, " entered the game\n");
        !          1173:        
        !          1174: // a client connecting during an intermission can cause problems
        !          1175:        if (intermission_running)
        !          1176:                GotoNextMap ();
        !          1177: };
        !          1178: 
        !          1179: 
        !          1180: /*
        !          1181: ===========
        !          1182: ClientDisconnect
        !          1183: 
        !          1184: called when a player disconnects from a server
        !          1185: ============
        !          1186: */
        !          1187: void() ClientDisconnect =
        !          1188: {
        !          1189:        // let everyone else know
        !          1190:        bprint (PRINT_HIGH, self.netname);
        !          1191:                bprint (PRINT_HIGH, " left the game with ");
        !          1192:                bprint (PRINT_HIGH, ftos(self.frags));
        !          1193:                bprint (PRINT_HIGH, " frags\n");
        !          1194:        sound (self, CHAN_BODY, "player/tornoff2.wav", 1, ATTN_NONE);
        !          1195:        set_suicide_frame ();
        !          1196: };
        !          1197: 
        !          1198: /*
        !          1199: ===========
        !          1200: ClientObituary
        !          1201: 
        !          1202: called when a player dies
        !          1203: ============
        !          1204: */
        !          1205: 
        !          1206: void(entity targ, entity attacker) ClientObituary =
        !          1207: {
        !          1208:        local   float rnum;
        !          1209:        local   string deathstring, deathstring2;
        !          1210:        local   string s;
        !          1211:        local   string  attackerteam, targteam;
        !          1212: 
        !          1213:        rnum = random();
        !          1214:        //ZOID 12-13-96: self.team doesn't work in QW.  Use keys
        !          1215:        attackerteam = infokey(attacker, "team");
        !          1216:        targteam = infokey(targ, "team");
        !          1217: 
        !          1218:        if (targ.classname == "player")
        !          1219:        {
        !          1220: 
        !          1221:                if (deathmatch > 3)     
        !          1222:                {
        !          1223:                        if (targ.deathtype == "selfwater")
        !          1224:                        {
        !          1225:                                bprint (PRINT_MEDIUM, targ.netname);
        !          1226:                                bprint (PRINT_MEDIUM," electrocutes himself.\n ");
        !          1227:                                targ.frags = targ.frags - 1;
        !          1228:                                return;
        !          1229:                        }
        !          1230:                }
        !          1231: 
        !          1232:                if (attacker.classname == "teledeath")
        !          1233:                {
        !          1234:                        bprint (PRINT_MEDIUM,targ.netname);
        !          1235:                        bprint (PRINT_MEDIUM," was telefragged by ");
        !          1236:                        bprint (PRINT_MEDIUM,attacker.owner.netname);
        !          1237:                        bprint (PRINT_MEDIUM,"\n");
        !          1238:                        logfrag (attacker.owner, targ);
        !          1239: 
        !          1240:                        attacker.owner.frags = attacker.owner.frags + 1;
        !          1241:                        return;
        !          1242:                }
        !          1243: 
        !          1244:                if (attacker.classname == "teledeath2")
        !          1245:                {
        !          1246:                        bprint (PRINT_MEDIUM,"Satan's power deflects ");
        !          1247:                        bprint (PRINT_MEDIUM,targ.netname);
        !          1248:                        bprint (PRINT_MEDIUM,"'s telefrag\n");
        !          1249: 
        !          1250:                        targ.frags = targ.frags - 1;
        !          1251:                        logfrag (targ, targ);
        !          1252:                        return;
        !          1253:                }
        !          1254: 
        !          1255:                // double 666 telefrag (can happen often in deathmatch 4)
        !          1256:                if (attacker.classname == "teledeath3") 
        !          1257:                {
        !          1258:                        bprint (PRINT_MEDIUM,targ.netname);
        !          1259:                        bprint (PRINT_MEDIUM," was telefragged by ");
        !          1260:                        bprint (PRINT_MEDIUM,attacker.owner.netname);
        !          1261:                        bprint (PRINT_MEDIUM, "'s Satan's power\n");
        !          1262:                        targ.frags = targ.frags - 1;
        !          1263:                        logfrag (targ, targ);
        !          1264:                        return;
        !          1265:                }
        !          1266:        
        !          1267: 
        !          1268:                if (targ.deathtype == "squish")
        !          1269:                {
        !          1270:                        if (teamplay && targteam == attackerteam && attackerteam != "" && targ != attacker)
        !          1271:                        {
        !          1272:                                logfrag (attacker, attacker);
        !          1273:                                attacker.frags = attacker.frags - 1; 
        !          1274:                                bprint (PRINT_MEDIUM,attacker.netname);
        !          1275:                                bprint (PRINT_MEDIUM," squished a teammate\n");
        !          1276:                                return;
        !          1277:                        }
        !          1278:                        else if (attacker.classname == "player" && attacker != targ)
        !          1279:                        {
        !          1280:                                bprint (PRINT_MEDIUM, attacker.netname);
        !          1281:                                bprint (PRINT_MEDIUM," squishes ");
        !          1282:                                bprint (PRINT_MEDIUM,targ.netname);
        !          1283:                                bprint (PRINT_MEDIUM,"\n");
        !          1284:                                logfrag (attacker, targ);
        !          1285:                                attacker.frags = attacker.frags + 1;
        !          1286:                                return;
        !          1287:                        }
        !          1288:                        else
        !          1289:                        {
        !          1290:                                logfrag (targ, targ);
        !          1291:                                targ.frags = targ.frags - 1;            // killed self
        !          1292:                                bprint (PRINT_MEDIUM,targ.netname);
        !          1293:                                bprint (PRINT_MEDIUM," was squished\n");
        !          1294:                                return;
        !          1295:                        }
        !          1296:                }
        !          1297: 
        !          1298:                if (attacker.classname == "player")
        !          1299:                {
        !          1300:                        if (targ == attacker)
        !          1301:                        {
        !          1302:                                // killed self
        !          1303:                                logfrag (attacker, attacker);
        !          1304:                                attacker.frags = attacker.frags - 1;
        !          1305:                                bprint (PRINT_MEDIUM,targ.netname);
        !          1306:                                if (targ.deathtype == "grenade")
        !          1307:                                        bprint (PRINT_MEDIUM," tries to put the pin back in\n");
        !          1308:                                else if (targ.deathtype == "rocket")
        !          1309:                                        bprint (PRINT_MEDIUM," becomes bored with life\n");
        !          1310:                                else if (targ.weapon == 64 && targ.waterlevel > 1)
        !          1311:                                {
        !          1312:                                        if (targ.watertype == CONTENT_SLIME)
        !          1313:                                                bprint (PRINT_MEDIUM," discharges into the slime\n");
        !          1314:                                        else if (targ.watertype == CONTENT_LAVA)
        !          1315:                                                bprint (PRINT_MEDIUM," discharges into the lava\n");
        !          1316:                                        else
        !          1317:                                                bprint (PRINT_MEDIUM," discharges into the water.\n");
        !          1318:                                }
        !          1319:                                else
        !          1320:                                        bprint (PRINT_MEDIUM," becomes bored with life\n");
        !          1321:                                return;
        !          1322:                        }
        !          1323:                        else if ( (teamplay == 2) && (targteam == attackerteam) &&
        !          1324:                                (attackerteam != "") )
        !          1325:                        {
        !          1326:                                if (rnum < 0.25)
        !          1327:                                        deathstring = " mows down a teammate\n";
        !          1328:                                else if (rnum < 0.50)
        !          1329:                                        deathstring = " checks his glasses\n";
        !          1330:                                else if (rnum < 0.75)
        !          1331:                                        deathstring = " gets a frag for the other team\n";
        !          1332:                                else
        !          1333:                                        deathstring = " loses another friend\n";
        !          1334:                                bprint (PRINT_MEDIUM, attacker.netname);
        !          1335:                                bprint (PRINT_MEDIUM, deathstring);
        !          1336:                                attacker.frags = attacker.frags - 1;
        !          1337:                                //ZOID 12-13-96:  killing a teammate logs as suicide
        !          1338:                                logfrag (attacker, attacker);
        !          1339:                                return;
        !          1340:                        }
        !          1341:                        else
        !          1342:                        {
        !          1343:                                logfrag (attacker, targ);
        !          1344:                                attacker.frags = attacker.frags + 1;
        !          1345: 
        !          1346:                                rnum = attacker.weapon;
        !          1347:                                if (targ.deathtype == "nail")
        !          1348:                                {
        !          1349:                                        deathstring = " was nailed by ";
        !          1350:                                        deathstring2 = "\n";
        !          1351:                                }
        !          1352:                                else if (targ.deathtype == "supernail")
        !          1353:                                {
        !          1354:                                        deathstring = " was punctured by ";
        !          1355:                                        deathstring2 = "\n";
        !          1356:                                }
        !          1357:                                else if (targ.deathtype == "grenade")
        !          1358:                                {
        !          1359:                                        deathstring = " eats ";
        !          1360:                                        deathstring2 = "'s pineapple\n";
        !          1361:                                        if (targ.health < -40)
        !          1362:                                        {
        !          1363:                                                deathstring = " was gibbed by ";
        !          1364:                                                deathstring2 = "'s grenade\n";
        !          1365:                                        }
        !          1366:                                }
        !          1367:                                else if (targ.deathtype == "rocket")
        !          1368:                                {
        !          1369:                                        if (attacker.super_damage_finished > 0 && targ.health < -40)
        !          1370:                                        {
        !          1371:                                                rnum = random();
        !          1372:                                                if (rnum < 0.3)
        !          1373:                                                        deathstring = " was brutalized by ";
        !          1374:                                                else if (rnum < 0.6)
        !          1375:                                                        deathstring = " was smeared by ";
        !          1376:                                                else
        !          1377:                                                {
        !          1378:                                                        bprint (PRINT_MEDIUM, attacker.netname);
        !          1379:                                                        bprint (PRINT_MEDIUM, " rips ");
        !          1380:                                                        bprint (PRINT_MEDIUM, targ.netname);
        !          1381:                                                        bprint (PRINT_MEDIUM, " a new one\n");
        !          1382:                                                        return;
        !          1383:                                                }
        !          1384:                                                deathstring2 = "'s quad rocket\n";
        !          1385:                                        }
        !          1386:                                        else
        !          1387:                                        {
        !          1388:                                                deathstring = " rides ";
        !          1389:                                                deathstring2 = "'s rocket\n";
        !          1390:                                                if (targ.health < -40)
        !          1391:                                                {
        !          1392:                                                        deathstring = " was gibbed by ";
        !          1393:                                                        deathstring2 = "'s rocket\n" ;
        !          1394:                                                }
        !          1395:                                        }
        !          1396:                                }
        !          1397:                                else if (rnum == IT_AXE)
        !          1398:                                {
        !          1399:                                        deathstring = " was ax-murdered by ";
        !          1400:                                        deathstring2 = "\n";
        !          1401:                                }
        !          1402:                                else if (rnum == IT_SHOTGUN)
        !          1403:                                {
        !          1404:                                        deathstring = " chewed on ";
        !          1405:                                        deathstring2 = "'s boomstick\n";
        !          1406:                                }
        !          1407:                                else if (rnum == IT_SUPER_SHOTGUN)
        !          1408:                                {
        !          1409:                                        deathstring = " ate 2 loads of ";
        !          1410:                                        deathstring2 = "'s buckshot\n";
        !          1411:                                }
        !          1412:                                else if (rnum == IT_LIGHTNING)
        !          1413:                                {
        !          1414:                                        deathstring = " accepts ";
        !          1415:                                        if (attacker.waterlevel > 1)
        !          1416:                                                deathstring2 = "'s discharge\n";
        !          1417:                                        else
        !          1418:                                                deathstring2 = "'s shaft\n";
        !          1419:                                }
        !          1420:                                bprint (PRINT_MEDIUM,targ.netname);
        !          1421:                                bprint (PRINT_MEDIUM,deathstring);
        !          1422:                                bprint (PRINT_MEDIUM,attacker.netname);
        !          1423:                                bprint (PRINT_MEDIUM,deathstring2);
        !          1424:                        }
        !          1425:                        return;
        !          1426:                }
        !          1427:                else
        !          1428:                {
        !          1429:                        logfrag (targ, targ);
        !          1430:                        targ.frags = targ.frags - 1;            // killed self
        !          1431:                        rnum = targ.watertype;
        !          1432: 
        !          1433:                        bprint (PRINT_MEDIUM,targ.netname);
        !          1434:                        if (rnum == -3)
        !          1435:                        {
        !          1436:                                if (random() < 0.5)
        !          1437:                                        bprint (PRINT_MEDIUM," sleeps with the fishes\n");
        !          1438:                                else
        !          1439:                                        bprint (PRINT_MEDIUM," sucks it down\n");
        !          1440:                                return;
        !          1441:                        }
        !          1442:                        else if (rnum == -4)
        !          1443:                        {
        !          1444:                                if (random() < 0.5)
        !          1445:                                        bprint (PRINT_MEDIUM," gulped a load of slime\n");
        !          1446:                                else
        !          1447:                                        bprint (PRINT_MEDIUM," can't exist on slime alone\n");
        !          1448:                                return;
        !          1449:                        }
        !          1450:                        else if (rnum == -5)
        !          1451:                        {
        !          1452:                                if (targ.health < -15)
        !          1453:                                {
        !          1454:                                        bprint (PRINT_MEDIUM," burst into flames\n");
        !          1455:                                        return;
        !          1456:                                }
        !          1457:                                if (random() < 0.5)
        !          1458:                                        bprint (PRINT_MEDIUM," turned into hot slag\n");
        !          1459:                                else
        !          1460:                                        bprint (PRINT_MEDIUM," visits the Volcano God\n");
        !          1461:                                return;
        !          1462:                        }
        !          1463: 
        !          1464:                        if (attacker.classname == "explo_box")
        !          1465:                        {
        !          1466:                                bprint (PRINT_MEDIUM," blew up\n");
        !          1467:                                return;
        !          1468:                        }
        !          1469:                        if (targ.deathtype == "falling")
        !          1470:                        {
        !          1471:                                bprint (PRINT_MEDIUM," fell to his death\n");
        !          1472:                                return;
        !          1473:                        }
        !          1474:                        if (targ.deathtype == "nail" || targ.deathtype == "supernail")
        !          1475:                        {
        !          1476:                                bprint (PRINT_MEDIUM," was spiked\n");
        !          1477:                                return;
        !          1478:                        }
        !          1479:                        if (targ.deathtype == "laser")
        !          1480:                        {
        !          1481:                                bprint (PRINT_MEDIUM," was zapped\n");
        !          1482:                                return;
        !          1483:                        }
        !          1484:                        if (attacker.classname == "fireball")
        !          1485:                        {
        !          1486:                                bprint (PRINT_MEDIUM," ate a lavaball\n");
        !          1487:                                return;
        !          1488:                        }
        !          1489:                        if (attacker.classname == "trigger_changelevel")
        !          1490:                        {
        !          1491:                                bprint (PRINT_MEDIUM," tried to leave\n");
        !          1492:                                return;
        !          1493:                        }
        !          1494: 
        !          1495:                        bprint (PRINT_MEDIUM," died\n");
        !          1496:                }
        !          1497:        }
        !          1498: };

unix.superglobalmegacorp.com

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