Annotation of quake1/cl_parse.c, revision 1.1

1.1     ! root        1: // cl_parse.c  -- parse a message received from the server
        !             2: 
        !             3: #include "quakedef.h"
        !             4: 
        !             5: char *svc_strings[] =
        !             6: {
        !             7:        "svc_bad",
        !             8:        "svc_nop",
        !             9:        "svc_disconnect",
        !            10:        "svc_updatestat",
        !            11:        "svc_version",          // [long] server version
        !            12:        "svc_setview",          // [short] entity number
        !            13:        "svc_sound",                    // <see code>
        !            14:        "svc_time",                     // [float] server time
        !            15:        "svc_print",                    // [string] null terminated string
        !            16:        "svc_stufftext",                // [string] stuffed into client's console buffer
        !            17:                                                // the string should be \n terminated
        !            18:        "svc_setangle",         // [vec3] set the view angle to this absolute value
        !            19:        
        !            20:        "svc_serverinfo",               // [long] version
        !            21:                                                // [string] signon string
        !            22:                                                // [string]..[0]model cache [string]...[0]sounds cache
        !            23:                                                // [string]..[0]item cache
        !            24:        "svc_lightstyle",               // [byte] [string]
        !            25:        "svc_updatename",               // [byte] [string]
        !            26:        "svc_updatefrags",      // [byte] [short]
        !            27:        "svc_clientdata",               // <shortbits + data>
        !            28:        "svc_stopsound",                // <see code>
        !            29:        "svc_updatecolors",     // [byte] [byte]
        !            30:        "svc_particle",         // [vec3] <variable>
        !            31:        "svc_damage",                   // [byte] impact [byte] blood [vec3] from
        !            32:        
        !            33:        "svc_spawnstatic",
        !            34:        "OBSOLETE svc_spawnbinary",
        !            35:        "svc_spawnbaseline",
        !            36:        
        !            37:        "svc_temp_entity",              // <variable>
        !            38:        "svc_setpause",
        !            39:        "svc_signonnum",
        !            40:        "svc_centerprint",
        !            41:        "svc_killedmonster",
        !            42:        "svc_foundsecret",
        !            43:        "svc_spawnstaticsound",
        !            44:        "svc_intermission"
        !            45: };
        !            46: 
        !            47: //=============================================================================
        !            48: 
        !            49: /*
        !            50: ===============
        !            51: CL_EntityNum
        !            52: 
        !            53: This error checks and tracks the total number of entities
        !            54: ===============
        !            55: */
        !            56: entity_t       *CL_EntityNum (int num)
        !            57: {
        !            58:        if (num >= cl.num_entities)
        !            59:        {
        !            60:                if (num >= MAX_EDICTS)
        !            61:                        Host_Error ("CL_EntityNum: %i is an invalid number",num);
        !            62:                while (cl.num_entities<=num)
        !            63:                {
        !            64:                        cl_entities[cl.num_entities].colormap = vid.colormap;
        !            65:                        cl.num_entities++;
        !            66:                }
        !            67:        }
        !            68:                
        !            69:        return &cl_entities[num];
        !            70: }
        !            71: 
        !            72: 
        !            73: /*
        !            74: ==================
        !            75: CL_ParseStartSoundPacket
        !            76: ==================
        !            77: */
        !            78: void CL_ParseStartSoundPacket(void)
        !            79: {
        !            80:     vec3_t  pos;
        !            81:     int        channel, ent;
        !            82:     int        sound_num;
        !            83:     int        volume;
        !            84:     int        field_mask;
        !            85:     float      attenuation;  
        !            86:        int             i;
        !            87:                   
        !            88:     field_mask = MSG_ReadByte(); 
        !            89: 
        !            90:     if (field_mask & SND_VOLUME)
        !            91:                volume = MSG_ReadByte ();
        !            92:        else
        !            93:                volume = DEFAULT_SOUND_PACKET_VOLUME;
        !            94:        
        !            95:     if (field_mask & SND_ATTENUATION)
        !            96:                attenuation = MSG_ReadByte () / 64.0;
        !            97:        else
        !            98:                attenuation = DEFAULT_SOUND_PACKET_ATTENUATION;
        !            99:        
        !           100:        channel = MSG_ReadShort ();
        !           101:        sound_num = MSG_ReadByte ();
        !           102: 
        !           103:        ent = channel >> 3;
        !           104:        channel &= 7;
        !           105: 
        !           106:        if (ent > MAX_EDICTS)
        !           107:                Host_Error ("CL_ParseStartSoundPacket: ent = %i", ent);
        !           108:        
        !           109:        for (i=0 ; i<3 ; i++)
        !           110:                pos[i] = MSG_ReadCoord ();
        !           111:  
        !           112:     S_StartSound (ent, channel, cl.sound_precache[sound_num], pos, volume/255.0, attenuation);
        !           113: }       
        !           114: 
        !           115: /*
        !           116: ==================
        !           117: CL_KeepaliveMessage
        !           118: 
        !           119: When the client is taking a long time to load stuff, send keepalive messages
        !           120: so the server doesn't disconnect.
        !           121: ==================
        !           122: */
        !           123: void CL_KeepaliveMessage (void)
        !           124: {
        !           125:        float   time;
        !           126:        static float lastmsg;
        !           127:        int             ret;
        !           128:        sizebuf_t       old;
        !           129:        byte            olddata[8192];
        !           130:        
        !           131:        if (sv.active)
        !           132:                return;         // no need if server is local
        !           133:        if (cls.demoplayback)
        !           134:                return;
        !           135: 
        !           136: // read messages from server, should just be nops
        !           137:        old = net_message;
        !           138:        memcpy (olddata, net_message.data, net_message.cursize);
        !           139:        
        !           140:        do
        !           141:        {
        !           142:                ret = CL_GetMessage ();
        !           143:                switch (ret)
        !           144:                {
        !           145:                default:
        !           146:                        Host_Error ("CL_KeepaliveMessage: CL_GetMessage failed");               
        !           147:                case 0:
        !           148:                        break;  // nothing waiting
        !           149:                case 1:
        !           150:                        Host_Error ("CL_KeepaliveMessage: received a message");
        !           151:                        break;
        !           152:                case 2:
        !           153:                        if (MSG_ReadByte() != svc_nop)
        !           154:                                Host_Error ("CL_KeepaliveMessage: datagram wasn't a nop");
        !           155:                        break;
        !           156:                }
        !           157:        } while (ret);
        !           158: 
        !           159:        net_message = old;
        !           160:        memcpy (net_message.data, olddata, net_message.cursize);
        !           161: 
        !           162: // check time
        !           163:        time = Sys_FloatTime ();
        !           164:        if (time - lastmsg < 5)
        !           165:                return;
        !           166:        lastmsg = time;
        !           167: 
        !           168: // write out a nop
        !           169:        Con_Printf ("--> client to server keepalive\n");
        !           170: 
        !           171:        MSG_WriteByte (&cls.message, clc_nop);
        !           172:        NET_SendMessage (cls.netcon, &cls.message);
        !           173:        SZ_Clear (&cls.message);
        !           174: }
        !           175: 
        !           176: /*
        !           177: ==================
        !           178: CL_ParseServerInfo
        !           179: ==================
        !           180: */
        !           181: void CL_ParseServerInfo (void)
        !           182: {
        !           183:        char    *str;
        !           184:        int             i;
        !           185:        int             nummodels, numsounds;
        !           186:        char    model_precache[MAX_MODELS][MAX_QPATH];
        !           187:        char    sound_precache[MAX_SOUNDS][MAX_QPATH];
        !           188:        
        !           189:        Con_DPrintf ("Serverinfo packet received.\n");
        !           190: //
        !           191: // wipe the client_state_t struct
        !           192: //
        !           193:        CL_ClearState ();
        !           194: 
        !           195: // parse protocol version number
        !           196:        i = MSG_ReadLong ();
        !           197:        if (i != PROTOCOL_VERSION)
        !           198:        {
        !           199:                Con_Printf ("Server returned version %i, not %i", i, PROTOCOL_VERSION);
        !           200:                return;
        !           201:        }
        !           202: 
        !           203: // parse maxclients
        !           204:        cl.maxclients = MSG_ReadByte ();
        !           205:        if (cl.maxclients < 1 || cl.maxclients > MAX_SCOREBOARD)
        !           206:        {
        !           207:                Con_Printf("Bad maxclients (%u) from server\n", cl.maxclients);
        !           208:                return;
        !           209:        }
        !           210:        cl.scores = Hunk_AllocName (cl.maxclients*sizeof(*cl.scores), "scores");
        !           211: 
        !           212: // parse gametype
        !           213:        cl.gametype = MSG_ReadByte ();
        !           214: 
        !           215: // parse signon message
        !           216:        str = MSG_ReadString ();
        !           217:        strncpy (cl.levelname, str, sizeof(cl.levelname)-1);
        !           218: 
        !           219: // seperate the printfs so the server message can have a color
        !           220:        Con_Printf("\n\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n\n");
        !           221:        Con_Printf ("%c%s\n", 2, str);
        !           222: 
        !           223: //
        !           224: // first we go through and touch all of the precache data that still
        !           225: // happens to be in the cache, so precaching something else doesn't
        !           226: // needlessly purge it
        !           227: //
        !           228: 
        !           229: // precache models
        !           230:        memset (cl.model_precache, 0, sizeof(cl.model_precache));
        !           231:        for (nummodels=1 ; ; nummodels++)
        !           232:        {
        !           233:                str = MSG_ReadString ();
        !           234:                if (!str[0])
        !           235:                        break;
        !           236:                if (nummodels==MAX_MODELS)
        !           237:                {
        !           238:                        Con_Printf ("Server sent too many model precaches\n");
        !           239:                        return;
        !           240:                }
        !           241:                strcpy (model_precache[nummodels], str);
        !           242:                Mod_TouchModel (str);
        !           243:        }
        !           244: 
        !           245: // precache sounds
        !           246:        memset (cl.sound_precache, 0, sizeof(cl.sound_precache));
        !           247:        for (numsounds=1 ; ; numsounds++)
        !           248:        {
        !           249:                str = MSG_ReadString ();
        !           250:                if (!str[0])
        !           251:                        break;
        !           252:                if (numsounds==MAX_SOUNDS)
        !           253:                {
        !           254:                        Con_Printf ("Server sent too many sound precaches\n");
        !           255:                        return;
        !           256:                }
        !           257:                strcpy (sound_precache[numsounds], str);
        !           258:                S_TouchSound (str);
        !           259:        }
        !           260: 
        !           261: //
        !           262: // now we try to load everything else until a cache allocation fails
        !           263: //
        !           264:        for (i=1 ; i<nummodels ; i++)
        !           265:        {
        !           266:                cl.model_precache[i] = Mod_ForName (model_precache[i], false);
        !           267:                if (cl.model_precache[i] == NULL)
        !           268:                {
        !           269:                        Con_Printf("Model %s not found\n", model_precache[i]);
        !           270:                        return;
        !           271:                }
        !           272:                CL_KeepaliveMessage ();
        !           273:        }
        !           274: 
        !           275:        for (i=1 ; i<numsounds ; i++)
        !           276:        {
        !           277:                cl.sound_precache[i] = S_PrecacheSound (sound_precache[i]);
        !           278:                CL_KeepaliveMessage ();
        !           279:        }
        !           280: 
        !           281: 
        !           282: // local state
        !           283:        cl_entities[0].model = cl.worldmodel = cl.model_precache[1];
        !           284:        
        !           285:        R_NewMap ();
        !           286: 
        !           287:        Hunk_Check ();          // make sure nothing is hurt
        !           288:        
        !           289:        noclip_anglehack = false;               // noclip is turned off at start        
        !           290: }
        !           291: 
        !           292: 
        !           293: /*
        !           294: ==================
        !           295: CL_ParseUpdate
        !           296: 
        !           297: Parse an entity update message from the server
        !           298: If an entities model or origin changes from frame to frame, it must be
        !           299: relinked.  Other attributes can change without relinking.
        !           300: ==================
        !           301: */
        !           302: int    bitcounts[16];
        !           303: 
        !           304: void CL_ParseUpdate (int bits)
        !           305: {
        !           306:        int                     i;
        !           307:        model_t         *model;
        !           308:        int                     modnum;
        !           309:        qboolean        forcelink;
        !           310:        entity_t        *ent;
        !           311:        int                     num;
        !           312: 
        !           313:        if (cls.signon == SIGNONS - 1)
        !           314:        {       // first update is the final signon stage
        !           315:                cls.signon = SIGNONS;
        !           316:                CL_SignonReply ();
        !           317:        }
        !           318: 
        !           319:        if (bits & U_MOREBITS)
        !           320:        {
        !           321:                i = MSG_ReadByte ();
        !           322:                bits |= (i<<8);
        !           323:        }
        !           324: 
        !           325:        if (bits & U_LONGENTITY)        
        !           326:                num = MSG_ReadShort ();
        !           327:        else
        !           328:                num = MSG_ReadByte ();
        !           329: 
        !           330:        ent = CL_EntityNum (num);
        !           331: 
        !           332: for (i=0 ; i<16 ; i++)
        !           333: if (bits&(1<<i))
        !           334:        bitcounts[i]++;
        !           335: 
        !           336:        if (ent->msgtime != cl.mtime[1])
        !           337:                forcelink = true;       // no previous frame to lerp from
        !           338:        else
        !           339:                forcelink = false;
        !           340: 
        !           341:        ent->msgtime = cl.mtime[0];
        !           342:        
        !           343:        if (bits & U_MODEL)
        !           344:        {
        !           345:                modnum = MSG_ReadByte ();
        !           346:                if (modnum >= MAX_MODELS)
        !           347:                        Host_Error ("CL_ParseModel: bad modnum");
        !           348:        }
        !           349:        else
        !           350:                modnum = ent->baseline.modelindex;
        !           351:                
        !           352:        model = cl.model_precache[modnum];
        !           353:        if (model != ent->model)
        !           354:        {
        !           355:                ent->model = model;
        !           356:        // automatic animation (torches, etc) can be either all together
        !           357:        // or randomized
        !           358:                if (model)
        !           359:                {
        !           360:                        if (model->synctype == ST_RAND)
        !           361:                                ent->syncbase = (float)(rand()&0x7fff) / 0x7fff;
        !           362:                        else
        !           363:                                ent->syncbase = 0.0;
        !           364:                }
        !           365:                else
        !           366:                        forcelink = true;       // hack to make null model players work
        !           367:        }
        !           368:        
        !           369:        if (bits & U_FRAME)
        !           370:                ent->frame = MSG_ReadByte ();
        !           371:        else
        !           372:                ent->frame = ent->baseline.frame;
        !           373: 
        !           374:        if (bits & U_COLORMAP)
        !           375:                i = MSG_ReadByte();
        !           376:        else
        !           377:                i = ent->baseline.colormap;
        !           378:        if (!i)
        !           379:                ent->colormap = vid.colormap;
        !           380:        else
        !           381:        {
        !           382:                if (i > cl.maxclients)
        !           383:                        Sys_Error ("i >= cl.maxclients");
        !           384:                ent->colormap = cl.scores[i-1].translations;
        !           385:        }
        !           386: 
        !           387:        if (bits & U_SKIN)
        !           388:                ent->skinnum = MSG_ReadByte();
        !           389:        else
        !           390:                ent->skinnum = ent->baseline.skin;
        !           391: 
        !           392:        if (bits & U_EFFECTS)
        !           393:                ent->effects = MSG_ReadByte();
        !           394:        else
        !           395:                ent->effects = ent->baseline.effects;
        !           396: 
        !           397: // shift the known values for interpolation
        !           398:        VectorCopy (ent->msg_origins[0], ent->msg_origins[1]);
        !           399:        VectorCopy (ent->msg_angles[0], ent->msg_angles[1]);
        !           400: 
        !           401:        if (bits & U_ORIGIN1)
        !           402:                ent->msg_origins[0][0] = MSG_ReadCoord ();
        !           403:        else
        !           404:                ent->msg_origins[0][0] = ent->baseline.origin[0];
        !           405:        if (bits & U_ANGLE1)
        !           406:                ent->msg_angles[0][0] = MSG_ReadAngle();
        !           407:        else
        !           408:                ent->msg_angles[0][0] = ent->baseline.angles[0];
        !           409: 
        !           410:        if (bits & U_ORIGIN2)
        !           411:                ent->msg_origins[0][1] = MSG_ReadCoord ();
        !           412:        else
        !           413:                ent->msg_origins[0][1] = ent->baseline.origin[1];
        !           414:        if (bits & U_ANGLE2)
        !           415:                ent->msg_angles[0][1] = MSG_ReadAngle();
        !           416:        else
        !           417:                ent->msg_angles[0][1] = ent->baseline.angles[1];
        !           418: 
        !           419:        if (bits & U_ORIGIN3)
        !           420:                ent->msg_origins[0][2] = MSG_ReadCoord ();
        !           421:        else
        !           422:                ent->msg_origins[0][2] = ent->baseline.origin[2];
        !           423:        if (bits & U_ANGLE3)
        !           424:                ent->msg_angles[0][2] = MSG_ReadAngle();
        !           425:        else
        !           426:                ent->msg_angles[0][2] = ent->baseline.angles[2];
        !           427: 
        !           428:        if ( bits & U_NOLERP )
        !           429:                ent->forcelink = true;
        !           430: 
        !           431:        if ( forcelink )
        !           432:        {       // didn't have an update last message
        !           433:                VectorCopy (ent->msg_origins[0], ent->msg_origins[1]);
        !           434:                VectorCopy (ent->msg_origins[0], ent->origin);
        !           435:                VectorCopy (ent->msg_angles[0], ent->msg_angles[1]);
        !           436:                VectorCopy (ent->msg_angles[0], ent->angles);
        !           437:                ent->forcelink = true;
        !           438:        }
        !           439: }
        !           440: 
        !           441: /*
        !           442: ==================
        !           443: CL_ParseBaseline
        !           444: ==================
        !           445: */
        !           446: void CL_ParseBaseline (entity_t *ent)
        !           447: {
        !           448:        int                     i;
        !           449:        
        !           450:        ent->baseline.modelindex = MSG_ReadByte ();
        !           451:        ent->baseline.frame = MSG_ReadByte ();
        !           452:        ent->baseline.colormap = MSG_ReadByte();
        !           453:        ent->baseline.skin = MSG_ReadByte();
        !           454:        for (i=0 ; i<3 ; i++)
        !           455:        {
        !           456:                ent->baseline.origin[i] = MSG_ReadCoord ();
        !           457:                ent->baseline.angles[i] = MSG_ReadAngle ();
        !           458:        }
        !           459: }
        !           460: 
        !           461: 
        !           462: /*
        !           463: ==================
        !           464: CL_ParseClientdata
        !           465: 
        !           466: Server information pertaining to this client only
        !           467: ==================
        !           468: */
        !           469: void CL_ParseClientdata (int bits)
        !           470: {
        !           471:        int             i, j;
        !           472:        
        !           473:        if (bits & SU_VIEWHEIGHT)
        !           474:                cl.viewheight = MSG_ReadChar ();
        !           475:        else
        !           476:                cl.viewheight = DEFAULT_VIEWHEIGHT;
        !           477: 
        !           478:        if (bits & SU_IDEALPITCH)
        !           479:                cl.idealpitch = MSG_ReadChar ();
        !           480:        else
        !           481:                cl.idealpitch = 0;
        !           482:        
        !           483:        VectorCopy (cl.mvelocity[0], cl.mvelocity[1]);
        !           484:        for (i=0 ; i<3 ; i++)
        !           485:        {
        !           486:                if (bits & (SU_PUNCH1<<i) )
        !           487:                        cl.punchangle[i] = MSG_ReadChar();
        !           488:                else
        !           489:                        cl.punchangle[i] = 0;
        !           490:                if (bits & (SU_VELOCITY1<<i) )
        !           491:                        cl.mvelocity[0][i] = MSG_ReadChar()*16;
        !           492:                else
        !           493:                        cl.mvelocity[0][i] = 0;
        !           494:        }
        !           495: 
        !           496:        if (bits & SU_ITEMS)
        !           497:                i = MSG_ReadLong ();
        !           498:        else
        !           499:                i = DEFAULT_ITEMS;
        !           500:        if (cl.items != i)
        !           501:        {       // set flash times
        !           502:                Sbar_Changed ();
        !           503:                for (j=0 ; j<32 ; j++)
        !           504:                        if ( (i & (1<<j)) && !(cl.items & (1<<j)))
        !           505:                                cl.item_gettime[j] = cl.time;
        !           506:                cl.items = i;
        !           507:        }
        !           508:                
        !           509:        cl.onground = (bits & SU_ONGROUND) != 0;
        !           510:        cl.inwater = (bits & SU_INWATER) != 0;
        !           511: 
        !           512:        if (bits & SU_WEAPONFRAME)
        !           513:                cl.stats[STAT_WEAPONFRAME] = MSG_ReadByte ();
        !           514:        else
        !           515:                cl.stats[STAT_WEAPONFRAME] = 0;
        !           516: 
        !           517:        if (bits & SU_ARMOR)
        !           518:                i = MSG_ReadByte ();
        !           519:        else
        !           520:                i = 0;
        !           521:        if (cl.stats[STAT_ARMOR] != i)
        !           522:        {
        !           523:                cl.stats[STAT_ARMOR] = i;
        !           524:                Sbar_Changed ();
        !           525:        }
        !           526: 
        !           527:        if (bits & SU_WEAPON)
        !           528:                i = MSG_ReadByte ();
        !           529:        else
        !           530:                i = 0;
        !           531:        if (cl.stats[STAT_WEAPON] != i)
        !           532:        {
        !           533:                cl.stats[STAT_WEAPON] = i;
        !           534:                Sbar_Changed ();
        !           535:        }
        !           536:        
        !           537:        i = MSG_ReadShort ();
        !           538:        if (cl.stats[STAT_HEALTH] != i)
        !           539:        {
        !           540:                cl.stats[STAT_HEALTH] = i;
        !           541:                Sbar_Changed ();
        !           542:        }
        !           543: 
        !           544:        i = MSG_ReadByte ();
        !           545:        if (cl.stats[STAT_AMMO] != i)
        !           546:        {
        !           547:                cl.stats[STAT_AMMO] = i;
        !           548:                Sbar_Changed ();
        !           549:        }
        !           550: 
        !           551:        for (i=0 ; i<4 ; i++)
        !           552:        {
        !           553:                j = MSG_ReadByte ();
        !           554:                if (cl.stats[STAT_SHELLS+i] != j)
        !           555:                {
        !           556:                        cl.stats[STAT_SHELLS+i] = j;
        !           557:                        Sbar_Changed ();
        !           558:                }
        !           559:        }
        !           560: 
        !           561:        i = MSG_ReadByte ();
        !           562:        if (cl.stats[STAT_ACTIVEWEAPON] != i)
        !           563:        {
        !           564:                cl.stats[STAT_ACTIVEWEAPON] = i;
        !           565:                Sbar_Changed ();
        !           566:        }
        !           567: 
        !           568: }
        !           569: 
        !           570: /*
        !           571: =====================
        !           572: CL_NewTranslation
        !           573: =====================
        !           574: */
        !           575: void CL_NewTranslation (int slot)
        !           576: {
        !           577:        int             i, j;
        !           578:        int             top, bottom;
        !           579:        byte    *dest, *source;
        !           580:        
        !           581:        if (slot > cl.maxclients)
        !           582:                Sys_Error ("CL_NewTranslation: slot > cl.maxclients");
        !           583:        dest = cl.scores[slot].translations;
        !           584:        source = vid.colormap;
        !           585:        memcpy (dest, vid.colormap, sizeof(cl.scores[slot].translations));
        !           586:        top = cl.scores[slot].colors & 0xf0;
        !           587:        bottom = (cl.scores[slot].colors &15)<<4;
        !           588: 
        !           589:        for (i=0 ; i<VID_GRADES ; i++, dest += 256, source+=256)
        !           590:        {
        !           591:                if (top < 128)  // the artists made some backwards ranges.  sigh.
        !           592:                        memcpy (dest + TOP_RANGE, source + top, 16);
        !           593:                else
        !           594:                        for (j=0 ; j<16 ; j++)
        !           595:                                dest[TOP_RANGE+j] = source[top+15-j];
        !           596:                                
        !           597:                if (bottom < 128)
        !           598:                        memcpy (dest + BOTTOM_RANGE, source + bottom, 16);
        !           599:                else
        !           600:                        for (j=0 ; j<16 ; j++)
        !           601:                                dest[BOTTOM_RANGE+j] = source[bottom+15-j];             
        !           602:        }
        !           603: }
        !           604: 
        !           605: /*
        !           606: =====================
        !           607: CL_ParseStatic
        !           608: =====================
        !           609: */
        !           610: void CL_ParseStatic (void)
        !           611: {
        !           612:        entity_t *ent;
        !           613:        int             i;
        !           614:                
        !           615:        i = cl.num_statics;
        !           616:        if (i >= MAX_STATIC_ENTITIES)
        !           617:                Host_Error ("Too many static entities");
        !           618:        ent = &cl_static_entities[i];
        !           619:        cl.num_statics++;
        !           620:        CL_ParseBaseline (ent);
        !           621: 
        !           622: // copy it to the current state
        !           623:        ent->model = cl.model_precache[ent->baseline.modelindex];
        !           624:        ent->frame = ent->baseline.frame;
        !           625:        ent->colormap = vid.colormap;
        !           626:        ent->skinnum = ent->baseline.skin;
        !           627:        ent->effects = ent->baseline.effects;
        !           628: 
        !           629:        VectorCopy (ent->baseline.origin, ent->origin);
        !           630:        VectorCopy (ent->baseline.angles, ent->angles); 
        !           631:        R_AddEfrags (ent);
        !           632: }
        !           633: 
        !           634: /*
        !           635: ===================
        !           636: CL_ParseStaticSound
        !           637: ===================
        !           638: */
        !           639: void CL_ParseStaticSound (void)
        !           640: {
        !           641:        vec3_t          org;
        !           642:        int                     sound_num, vol, atten;
        !           643:        int                     i;
        !           644:        
        !           645:        for (i=0 ; i<3 ; i++)
        !           646:                org[i] = MSG_ReadCoord ();
        !           647:        sound_num = MSG_ReadByte ();
        !           648:        vol = MSG_ReadByte ();
        !           649:        atten = MSG_ReadByte ();
        !           650:        
        !           651:        S_StaticSound (cl.sound_precache[sound_num], org, vol, atten);
        !           652: }
        !           653: 
        !           654: 
        !           655: #define SHOWNET(x) if(cl_shownet.value==2)Con_Printf ("%3i:%s\n", msg_readcount-1, x);
        !           656: 
        !           657: /*
        !           658: =====================
        !           659: CL_ParseServerMessage
        !           660: =====================
        !           661: */
        !           662: void CL_ParseServerMessage (void)
        !           663: {
        !           664:        int                     cmd;
        !           665:        int                     i;
        !           666:        
        !           667: //
        !           668: // if recording demos, copy the message out
        !           669: //
        !           670:        if (cl_shownet.value == 1)
        !           671:                Con_Printf ("%i ",net_message.cursize);
        !           672:        else if (cl_shownet.value == 2)
        !           673:                Con_Printf ("------------------\n");
        !           674:        
        !           675:        cl.onground = false;    // unless the server says otherwise     
        !           676: //
        !           677: // parse the message
        !           678: //
        !           679:        MSG_BeginReading ();
        !           680:        
        !           681:        while (1)
        !           682:        {
        !           683:                if (msg_badread)
        !           684:                        Host_Error ("CL_ParseServerMessage: Bad server message");
        !           685: 
        !           686:                cmd = MSG_ReadByte ();
        !           687: 
        !           688:                if (cmd == -1)
        !           689:                {
        !           690:                        SHOWNET("END OF MESSAGE");
        !           691:                        return;         // end of message
        !           692:                }
        !           693: 
        !           694:        // if the high bit of the command byte is set, it is a fast update
        !           695:                if (cmd & 128)
        !           696:                {
        !           697:                        SHOWNET("fast update");
        !           698:                        CL_ParseUpdate (cmd&127);
        !           699:                        continue;
        !           700:                }
        !           701: 
        !           702:                SHOWNET(svc_strings[cmd]);
        !           703:        
        !           704:        // other commands
        !           705:                switch (cmd)
        !           706:                {
        !           707:                default:
        !           708:                        Host_Error ("CL_ParseServerMessage: Illegible server message\n");
        !           709:                        break;
        !           710:                        
        !           711:                case svc_nop:
        !           712: //                     Con_Printf ("svc_nop\n");
        !           713:                        break;
        !           714:                        
        !           715:                case svc_time:
        !           716:                        cl.mtime[1] = cl.mtime[0];
        !           717:                        cl.mtime[0] = MSG_ReadFloat ();                 
        !           718:                        break;
        !           719:                        
        !           720:                case svc_clientdata:
        !           721:                        i = MSG_ReadShort ();
        !           722:                        CL_ParseClientdata (i);
        !           723:                        break;
        !           724:                
        !           725:                case svc_version:
        !           726:                        i = MSG_ReadLong ();
        !           727:                        if (i != PROTOCOL_VERSION)
        !           728:                                Host_Error ("CL_ParseServerMessage: Server is protocol %i instead of %i\n", i, PROTOCOL_VERSION);
        !           729:                        break;
        !           730:                        
        !           731:                case svc_disconnect:
        !           732:                        Host_EndGame ("Server disconnected\n");
        !           733: 
        !           734:                case svc_print:
        !           735:                        Con_Printf ("%s", MSG_ReadString ());
        !           736:                        break;
        !           737:                        
        !           738:                case svc_centerprint:
        !           739:                        SCR_CenterPrint (MSG_ReadString ());
        !           740:                        break;
        !           741:                        
        !           742:                case svc_stufftext:
        !           743:                        Cbuf_AddText (MSG_ReadString ());
        !           744:                        break;
        !           745:                        
        !           746:                case svc_damage:
        !           747:                        V_ParseDamage ();
        !           748:                        break;
        !           749:                        
        !           750:                case svc_serverinfo:
        !           751:                        CL_ParseServerInfo ();
        !           752:                        vid.recalc_refdef = true;       // leave intermission full screen
        !           753:                        break;
        !           754:                        
        !           755:                case svc_setangle:
        !           756:                        for (i=0 ; i<3 ; i++)
        !           757:                                cl.viewangles[i] = MSG_ReadAngle ();
        !           758:                        break;
        !           759:                        
        !           760:                case svc_setview:
        !           761:                        cl.viewentity = MSG_ReadShort ();
        !           762:                        break;
        !           763:                                        
        !           764:                case svc_lightstyle:
        !           765:                        i = MSG_ReadByte ();
        !           766:                        if (i >= MAX_LIGHTSTYLES)
        !           767:                                Sys_Error ("svc_lightstyle > MAX_LIGHTSTYLES");
        !           768:                        Q_strcpy (cl_lightstyle[i].map,  MSG_ReadString());
        !           769:                        cl_lightstyle[i].length = Q_strlen(cl_lightstyle[i].map);
        !           770:                        break;
        !           771:                        
        !           772:                case svc_sound:
        !           773:                        CL_ParseStartSoundPacket();
        !           774:                        break;
        !           775:                        
        !           776:                case svc_stopsound:
        !           777:                        i = MSG_ReadShort();
        !           778:                        S_StopSound(i>>3, i&7);
        !           779:                        break;
        !           780:                
        !           781:                case svc_updatename:
        !           782:                        Sbar_Changed ();
        !           783:                        i = MSG_ReadByte ();
        !           784:                        if (i >= cl.maxclients)
        !           785:                                Host_Error ("CL_ParseServerMessage: svc_updatename > MAX_SCOREBOARD");
        !           786:                        strcpy (cl.scores[i].name, MSG_ReadString ());
        !           787:                        break;
        !           788:                        
        !           789:                case svc_updatefrags:
        !           790:                        Sbar_Changed ();
        !           791:                        i = MSG_ReadByte ();
        !           792:                        if (i >= cl.maxclients)
        !           793:                                Host_Error ("CL_ParseServerMessage: svc_updatefrags > MAX_SCOREBOARD");
        !           794:                        cl.scores[i].frags = MSG_ReadShort ();
        !           795:                        break;                  
        !           796: 
        !           797:                case svc_updatecolors:
        !           798:                        Sbar_Changed ();
        !           799:                        i = MSG_ReadByte ();
        !           800:                        if (i >= cl.maxclients)
        !           801:                                Host_Error ("CL_ParseServerMessage: svc_updatecolors > MAX_SCOREBOARD");
        !           802:                        cl.scores[i].colors = MSG_ReadByte ();
        !           803:                        CL_NewTranslation (i);
        !           804:                        break;
        !           805:                        
        !           806:                case svc_particle:
        !           807:                        R_ParseParticleEffect ();
        !           808:                        break;
        !           809: 
        !           810:                case svc_spawnbaseline:
        !           811:                        i = MSG_ReadShort ();
        !           812:                        // must use CL_EntityNum() to force cl.num_entities up
        !           813:                        CL_ParseBaseline (CL_EntityNum(i));
        !           814:                        break;
        !           815:                case svc_spawnstatic:
        !           816:                        CL_ParseStatic ();
        !           817:                        break;                  
        !           818:                case svc_temp_entity:
        !           819:                        CL_ParseTEnt ();
        !           820:                        break;
        !           821: 
        !           822:                case svc_setpause:
        !           823:                        cl.paused = MSG_ReadByte ();
        !           824:                        if (cl.paused)
        !           825:                                CDAudio_Stop();
        !           826:                        else
        !           827:                                CDAudio_Resume();
        !           828:                        break;
        !           829:                        
        !           830:                case svc_signonnum:
        !           831:                        i = MSG_ReadByte ();
        !           832:                        if (i <= cls.signon)
        !           833:                                Host_Error ("Received signon %i when at %i", i, cls.signon);
        !           834:                        cls.signon = i;
        !           835:                        CL_SignonReply ();
        !           836:                        break;
        !           837: 
        !           838:                case svc_killedmonster:
        !           839:                        cl.stats[STAT_MONSTERS]++;
        !           840:                        break;
        !           841: 
        !           842:                case svc_foundsecret:
        !           843:                        cl.stats[STAT_SECRETS]++;
        !           844:                        break;
        !           845: 
        !           846:                case svc_updatestat:
        !           847:                        i = MSG_ReadByte ();
        !           848:                        if (i < 0 || i >= MAX_CL_STATS)
        !           849:                                Sys_Error ("svc_updatestat: %i is invalid", i);
        !           850:                        cl.stats[i] = MSG_ReadLong ();;
        !           851:                        break;
        !           852:                        
        !           853:                case svc_spawnstaticsound:
        !           854:                        CL_ParseStaticSound ();
        !           855:                        break;
        !           856: 
        !           857:                case svc_cdtrack:
        !           858:                        cl.cdtrack = MSG_ReadByte ();
        !           859:                        cl.looptrack = MSG_ReadByte ();
        !           860:                        if ( (cls.demoplayback || cls.demorecording) && (cls.forcetrack != -1) )
        !           861:                                CDAudio_Play ((byte)cls.forcetrack, true);
        !           862:                        else
        !           863:                                CDAudio_Play ((byte)cl.cdtrack, true);
        !           864:                        break;
        !           865: 
        !           866:                case svc_intermission:
        !           867:                        cl.intermission = 1;
        !           868:                        cl.completed_time = cl.time;
        !           869:                        vid.recalc_refdef = true;       // go to full screen
        !           870:                        break;
        !           871: 
        !           872:                case svc_finale:
        !           873:                        cl.intermission = 2;
        !           874:                        cl.completed_time = cl.time;
        !           875:                        vid.recalc_refdef = true;       // go to full screen
        !           876:                        SCR_CenterPrint (MSG_ReadString ());                    
        !           877:                        break;
        !           878:                        
        !           879:                case svc_sellscreen:
        !           880:                        Cmd_ExecuteString ("help", src_command);
        !           881:                        break;
        !           882:                }
        !           883:        }
        !           884: }
        !           885: 

unix.superglobalmegacorp.com

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