2 Copyright (C) 1996-1997 Id Software, Inc.
4 This program is free software; you can redistribute it and/or
5 modify it under the terms of the GNU General Public License
6 as published by the Free Software Foundation; either version 2
7 of the License, or (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13 See the GNU General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
20 // cl_parse.c -- parse a message received from the server
30 "svc_version", // [long] server version
31 "svc_setview", // [short] entity number
32 "svc_sound", // <see code>
33 "svc_time", // [float] server time
34 "svc_print", // [string] null terminated string
35 "svc_stufftext", // [string] stuffed into client's console buffer
36 // the string should be \n terminated
37 "svc_setangle", // [vec3] set the view angle to this absolute value
39 "svc_serverinfo", // [long] version
40 // [string] signon string
41 // [string]..[0]model cache [string]...[0]sounds cache
42 // [string]..[0]item cache
43 "svc_lightstyle", // [byte] [string]
44 "svc_updatename", // [byte] [string]
45 "svc_updatefrags", // [byte] [short]
46 "svc_clientdata", // <shortbits + data>
47 "svc_stopsound", // <see code>
48 "svc_updatecolors", // [byte] [byte]
49 "svc_particle", // [vec3] <variable>
50 "svc_damage", // [byte] impact [byte] blood [vec3] from
53 "OBSOLETE svc_spawnbinary",
56 "svc_temp_entity", // <variable>
62 "svc_spawnstaticsound",
64 "svc_finale", // [string] music [string] text
65 "svc_cdtrack", // [byte] track [byte] looptrack
68 "svc_showlmp", // [string] iconlabel [string] lmpfile [byte] x [byte] y
69 "svc_hidelmp", // [string] iconlabel
70 "svc_skybox", // [string] skyname
83 "svc_farclip", // [coord] size
84 "svc_fog", // [byte] enable <optional past this point, only included if enable is true> [short * 4096] density [byte] red [byte] green [byte] blue
85 "svc_playerposition" // [float] x [float] y [float] z
88 //=============================================================================
90 qboolean Nehahrademcompatibility; // LordHavoc: to allow playback of the early Nehahra movie segments
91 qboolean dpprotocol; // LordHavoc: whether or not the current network stream is the enhanced DarkPlaces protocol
97 This error checks and tracks the total number of entities
100 entity_t *CL_EntityNum (int num)
102 if (num >= cl.num_entities)
104 if (num >= MAX_EDICTS)
105 Host_Error ("CL_EntityNum: %i is an invalid number",num);
106 while (cl.num_entities<=num)
108 cl_entities[cl.num_entities].colormap = 0; //vid.colormap;
113 return &cl_entities[num];
119 CL_ParseStartSoundPacket
122 void CL_ParseStartSoundPacket(void)
132 field_mask = MSG_ReadByte();
134 if (field_mask & SND_VOLUME)
135 volume = MSG_ReadByte ();
137 volume = DEFAULT_SOUND_PACKET_VOLUME;
139 if (field_mask & SND_ATTENUATION)
140 attenuation = MSG_ReadByte () / 64.0;
142 attenuation = DEFAULT_SOUND_PACKET_ATTENUATION;
144 channel = MSG_ReadShort ();
145 sound_num = MSG_ReadByte ();
150 if (ent > MAX_EDICTS)
151 Host_Error ("CL_ParseStartSoundPacket: ent = %i", ent);
153 for (i=0 ; i<3 ; i++)
154 pos[i] = MSG_ReadCoord ();
156 S_StartSound (ent, channel, cl.sound_precache[sound_num], pos, volume/255.0, attenuation);
163 When the client is taking a long time to load stuff, send keepalive messages
164 so the server doesn't disconnect.
167 void CL_KeepaliveMessage (void)
170 static float lastmsg;
176 return; // no need if server is local
177 if (cls.demoplayback)
180 // read messages from server, should just be nops
182 memcpy (olddata, net_message.data, net_message.cursize);
186 ret = CL_GetMessage ();
190 Host_Error ("CL_KeepaliveMessage: CL_GetMessage failed");
192 break; // nothing waiting
194 Host_Error ("CL_KeepaliveMessage: received a message");
197 if (MSG_ReadByte() != svc_nop)
198 Host_Error ("CL_KeepaliveMessage: datagram wasn't a nop");
204 memcpy (net_message.data, olddata, net_message.cursize);
207 time = Sys_FloatTime ();
208 if (time - lastmsg < 5)
213 Con_Printf ("--> client to server keepalive\n");
215 MSG_WriteByte (&cls.message, clc_nop);
216 NET_SendMessage (cls.netcon, &cls.message);
217 SZ_Clear (&cls.message);
220 extern qboolean isworldmodel;
221 extern char skyname[];
222 extern float fog_density;
223 extern float fog_red;
224 extern float fog_green;
225 extern float fog_blue;
226 extern void R_SetSkyBox (char *sky);
227 extern void FOG_clear();
228 extern cvar_t r_farclip;
230 void CL_ParseEntityLump(char *entdata)
233 char key[128], value[1024];
236 FOG_clear(); // LordHavoc: no fog until set
237 skyname[0] = 0; // LordHavoc: no enviroment mapped sky until set
238 r_farclip.value = 6144; // LordHavoc: default farclip distance
242 data = COM_Parse(data);
244 return; // valid exit
245 if (com_token[0] != '{')
249 data = COM_Parse(data);
252 if (com_token[0] == '}')
253 return; // since we're just parsing the first ent (worldspawn), exit
254 strcpy(key, com_token);
255 while (key[strlen(key)-1] == ' ') // remove trailing spaces
256 key[strlen(key)-1] = 0;
257 data = COM_Parse(data);
260 strcpy(value, com_token);
261 if (!strcmp("sky", key))
263 else if (!strcmp("skyname", key)) // non-standard, introduced by QuakeForge... sigh.
265 else if (!strcmp("qlsky", key)) // non-standard, introduced by QuakeLives (EEK)
267 else if (!strcmp("farclip", key))
269 r_farclip.value = atof(value);
270 if (r_farclip.value < 64)
271 r_farclip.value = 64;
273 else if (!strcmp("fog", key))
275 scanf(value, "%f %f %f %f", &fog_density, &fog_red, &fog_green, &fog_blue);
278 else if (!strcmp("fog_density", key))
279 fog_density = atof(value);
280 else if (!strcmp("fog_red", key))
281 fog_red = atof(value);
282 else if (!strcmp("fog_green", key))
283 fog_green = atof(value);
284 else if (!strcmp("fog_blue", key))
285 fog_blue = atof(value);
286 else if (!strcmp("wad", key)) // for HalfLife maps
289 for (i = 0;i < 128;i++)
290 if (value[i] != ';' && value[i] != '\\' && value[i] != '/' && value[i] != ':')
296 // ignore path - the \\ check is for HalfLife... stupid windoze 'programmers'...
297 if (value[i] == '\\' || value[i] == '/' || value[i] == ':')
299 else if (value[i] == ';' || value[i] == 0)
303 strcpy(wadname, "textures/");
304 strcat(wadname, &value[j]);
305 W_LoadTextureWadFile (wadname, FALSE);
321 extern cvar_t demo_nehahra;
322 void CL_ParseServerInfo (void)
326 int nummodels, numsounds;
327 char model_precache[MAX_MODELS][MAX_QPATH];
328 char sound_precache[MAX_SOUNDS][MAX_QPATH];
330 Con_DPrintf ("Serverinfo packet received.\n");
332 // wipe the client_state_t struct
336 // parse protocol version number
338 if (i != PROTOCOL_VERSION && i != 250)
340 Con_Printf ("Server returned version %i, not %i", i, PROTOCOL_VERSION);
343 Nehahrademcompatibility = false;
345 Nehahrademcompatibility = true;
346 if (cls.demoplayback && demo_nehahra.value)
347 Nehahrademcompatibility = true;
348 dpprotocol = i == DPPROTOCOL_VERSION;
351 cl.maxclients = MSG_ReadByte ();
352 if (cl.maxclients < 1 || cl.maxclients > MAX_SCOREBOARD)
354 Con_Printf("Bad maxclients (%u) from server\n", cl.maxclients);
357 cl.scores = Hunk_AllocName (cl.maxclients*sizeof(*cl.scores), "scores");
360 cl.gametype = MSG_ReadByte ();
362 // parse signon message
363 str = MSG_ReadString ();
364 strncpy (cl.levelname, str, sizeof(cl.levelname)-1);
366 // seperate the printfs so the server message can have a color
367 if (!Nehahrademcompatibility) // no messages when playing the Nehahra movie
369 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");
370 Con_Printf ("%c%s\n", 2, str);
374 // first we go through and touch all of the precache data that still
375 // happens to be in the cache, so precaching something else doesn't
376 // needlessly purge it
380 memset (cl.model_precache, 0, sizeof(cl.model_precache));
381 for (nummodels=1 ; ; nummodels++)
383 str = MSG_ReadString ();
386 if (nummodels==MAX_MODELS)
388 Con_Printf ("Server sent too many model precaches\n");
391 strcpy (model_precache[nummodels], str);
392 Mod_TouchModel (str);
396 memset (cl.sound_precache, 0, sizeof(cl.sound_precache));
397 for (numsounds=1 ; ; numsounds++)
399 str = MSG_ReadString ();
402 if (numsounds==MAX_SOUNDS)
404 Con_Printf ("Server sent too many sound precaches\n");
407 strcpy (sound_precache[numsounds], str);
412 // now we try to load everything else until a cache allocation fails
415 for (i=1 ; i<nummodels ; i++)
417 isworldmodel = i == 1; // LordHavoc: first model is the world model
418 cl.model_precache[i] = Mod_ForName (model_precache[i], false);
419 if (cl.model_precache[i] == NULL)
421 Con_Printf("Model %s not found\n", model_precache[i]);
424 CL_KeepaliveMessage ();
427 S_BeginPrecaching ();
428 for (i=1 ; i<numsounds ; i++)
430 cl.sound_precache[i] = S_PrecacheSound (sound_precache[i]);
431 CL_KeepaliveMessage ();
437 cl_entities[0].model = cl.worldmodel = cl.model_precache[1];
441 Hunk_Check (); // make sure nothing is hurt
443 noclip_anglehack = false; // noclip is turned off at start
451 Parse an entity update message from the server
452 If an entities model or origin changes from frame to frame, it must be
453 relinked. Other attributes can change without relinking.
458 void CL_ParseUpdate (int bits)
460 int i, modnum, num, skin, alpha, scale, glowsize, glowcolor, colormod;
464 entity_state_t *baseline;
466 if (cls.signon == SIGNONS - 1)
467 { // first update is the final signon stage
468 cls.signon = SIGNONS;
472 if (bits & U_MOREBITS)
477 if (bits & U_EXTEND1 && !Nehahrademcompatibility)
479 bits |= MSG_ReadByte() << 16;
480 if (bits & U_EXTEND2)
481 bits |= MSG_ReadByte() << 24;
484 if (bits & U_LONGENTITY)
485 num = MSG_ReadShort ();
487 num = MSG_ReadByte ();
489 ent = CL_EntityNum (num);
491 //for (i=0 ; i<16 ; i++)
495 forcelink = ent->msgtime != cl.mtime[1]; // no previous frame to lerp from
497 ent->msgtime = cl.mtime[0];
499 // LordHavoc: new protocol stuff
500 baseline = &ent->baseline;
502 baseline = &ent->deltabaseline;
504 modnum = bits & U_MODEL ? MSG_ReadByte() : baseline->modelindex;
505 if (modnum >= MAX_MODELS)
506 Host_Error ("CL_ParseModel: bad modnum");
507 ent->deltabaseline.modelindex = modnum;
509 model = cl.model_precache[modnum];
510 if (model != ent->model)
513 // automatic animation (torches, etc) can be either all together
516 ent->syncbase = model->synctype == ST_RAND ? (float)(rand()&0x7fff) / 0x7fff : 0.0;
518 forcelink = true; // hack to make null model players work
519 if (num > 0 && num <= cl.maxclients)
520 R_TranslatePlayerSkin(num - 1);
523 ent->frame = ((bits & U_FRAME) ? MSG_ReadByte() : (baseline->frame & 0xFF));
525 i = bits & U_COLORMAP ? MSG_ReadByte() : baseline->colormap;
526 ent->deltabaseline.colormap = i;
528 ent->colormap = 0; //vid.colormap;
531 if (i > cl.maxclients)
532 Host_Error ("i >= cl.maxclients");
533 ent->colormap = i; //vid.colormap; // cl.scores[i-1].translations;
536 skin = bits & U_SKIN ? MSG_ReadByte() : baseline->skin;
537 if (skin != ent->skinnum)
540 if (num > 0 && num <= cl.maxclients)
541 R_TranslatePlayerSkin(num - 1);
543 ent->deltabaseline.skin = skin;
545 ent->effects = ((bits & U_EFFECTS) ? MSG_ReadByte() : (baseline->effects & 0xFF));
547 // shift the known values for interpolation
548 VectorCopy (ent->msg_origins[0], ent->msg_origins[1]);
549 VectorCopy (ent->msg_angles[0], ent->msg_angles[1]);
550 VectorCopy (baseline->origin, ent->msg_origins[0]);
551 VectorCopy (baseline->angles, ent->msg_angles[0]);
553 if (bits & U_ORIGIN1) ent->msg_origins[0][0] = MSG_ReadCoord ();
554 if (bits & U_ANGLE1) ent->msg_angles[0][0] = MSG_ReadAngle();
555 if (bits & U_ORIGIN2) ent->msg_origins[0][1] = MSG_ReadCoord ();
556 if (bits & U_ANGLE2) ent->msg_angles[0][1] = MSG_ReadAngle();
557 if (bits & U_ORIGIN3) ent->msg_origins[0][2] = MSG_ReadCoord ();
558 if (bits & U_ANGLE3) ent->msg_angles[0][2] = MSG_ReadAngle();
560 VectorCopy(ent->msg_origins[0], ent->deltabaseline.origin);
561 VectorCopy(ent->msg_angles[0], ent->deltabaseline.angles);
563 alpha = bits & U_ALPHA ? MSG_ReadByte() : baseline->alpha;
564 scale = bits & U_SCALE ? MSG_ReadByte() : baseline->scale;
565 ent->effects |= ((bits & U_EFFECTS2) ? (MSG_ReadByte() << 8) : (baseline->effects & 0xFF00));
566 glowsize = bits & U_GLOWSIZE ? MSG_ReadByte() : baseline->glowsize;
567 glowcolor = bits & U_GLOWCOLOR ? MSG_ReadByte() : baseline->glowcolor;
568 colormod = bits & U_COLORMOD ? MSG_ReadByte() : baseline->colormod;
569 ent->frame |= ((bits & U_FRAME2) ? (MSG_ReadByte() << 8) : (baseline->frame & 0xFF00));
570 ent->deltabaseline.alpha = alpha;
571 ent->deltabaseline.scale = scale;
572 ent->deltabaseline.effects = ent->effects;
573 ent->deltabaseline.glowsize = glowsize;
574 ent->deltabaseline.glowcolor = glowcolor;
575 ent->deltabaseline.colormod = colormod;
576 ent->deltabaseline.frame = ent->frame;
577 ent->alpha = (float) alpha * (1.0 / 255.0);
578 ent->scale = (float) scale * (1.0 / 16.0);
579 ent->glowsize = glowsize * 4.0;
580 ent->glowcolor = glowcolor;
581 ent->colormod[0] = (float) ((colormod >> 5) & 7) * (1.0 / 7.0);
582 ent->colormod[1] = (float) ((colormod >> 2) & 7) * (1.0 / 7.0);
583 ent->colormod[2] = (float) (colormod & 3) * (1.0 / 3.0);
584 if (bits & U_EXTEND1 && Nehahrademcompatibility) // LordHavoc: to allow playback of the early Nehahra movie segments
587 ent->alpha = MSG_ReadFloat();
588 if (i == 2 && MSG_ReadFloat() != 0.0)
589 ent->effects |= EF_FULLBRIGHT;
594 //if ( bits & U_NOLERP )
595 // ent->forcelink = true;
596 //if (bits & U_STEP) // FIXME: implement clientside interpolation of monsters
599 { // didn't have an update last message
600 VectorCopy (ent->msg_origins[0], ent->msg_origins[1]);
601 VectorCopy (ent->msg_origins[0], ent->origin);
602 VectorCopy (ent->msg_angles[0], ent->msg_angles[1]);
603 VectorCopy (ent->msg_angles[0], ent->angles);
604 ent->forcelink = true;
613 void CL_ParseBaseline (entity_t *ent)
617 ent->baseline.modelindex = MSG_ReadByte ();
618 ent->baseline.frame = MSG_ReadByte ();
619 ent->baseline.colormap = MSG_ReadByte();
620 ent->baseline.skin = MSG_ReadByte();
621 for (i=0 ; i<3 ; i++)
623 ent->baseline.origin[i] = MSG_ReadCoord ();
624 ent->baseline.angles[i] = MSG_ReadAngle ();
626 ent->baseline.alpha = 255;
627 ent->baseline.scale = 16;
628 ent->baseline.glowsize = 0;
629 ent->baseline.glowcolor = 254;
630 ent->baseline.colormod = 255;
638 Server information pertaining to this client only
641 void CL_ParseClientdata (int bits)
645 if (bits & SU_VIEWHEIGHT)
646 cl.viewheight = MSG_ReadChar ();
648 cl.viewheight = DEFAULT_VIEWHEIGHT;
650 if (bits & SU_IDEALPITCH)
651 cl.idealpitch = MSG_ReadChar ();
655 VectorCopy (cl.mvelocity[0], cl.mvelocity[1]);
656 for (i=0 ; i<3 ; i++)
658 if (bits & (SU_PUNCH1<<i) )
659 cl.punchangle[i] = MSG_ReadChar();
661 cl.punchangle[i] = 0;
662 if (bits & (SU_VELOCITY1<<i) )
663 cl.mvelocity[0][i] = MSG_ReadChar()*16;
665 cl.mvelocity[0][i] = 0;
668 // [always sent] if (bits & SU_ITEMS)
674 for (j=0 ; j<32 ; j++)
675 if ( (i & (1<<j)) && !(cl.items & (1<<j)))
676 cl.item_gettime[j] = cl.time;
680 cl.onground = (bits & SU_ONGROUND) != 0;
681 cl.inwater = (bits & SU_INWATER) != 0;
683 if (bits & SU_WEAPONFRAME)
684 cl.stats[STAT_WEAPONFRAME] = MSG_ReadByte ();
686 cl.stats[STAT_WEAPONFRAME] = 0;
692 if (cl.stats[STAT_ARMOR] != i)
694 cl.stats[STAT_ARMOR] = i;
698 if (bits & SU_WEAPON)
702 if (cl.stats[STAT_WEAPON] != i)
704 cl.stats[STAT_WEAPON] = i;
708 i = MSG_ReadShort ();
709 if (cl.stats[STAT_HEALTH] != i)
711 cl.stats[STAT_HEALTH] = i;
716 if (cl.stats[STAT_AMMO] != i)
718 cl.stats[STAT_AMMO] = i;
722 for (i=0 ; i<4 ; i++)
725 if (cl.stats[STAT_SHELLS+i] != j)
727 cl.stats[STAT_SHELLS+i] = j;
736 if (cl.stats[STAT_ACTIVEWEAPON] != i)
738 cl.stats[STAT_ACTIVEWEAPON] = i;
744 if (cl.stats[STAT_ACTIVEWEAPON] != (1<<i))
746 cl.stats[STAT_ACTIVEWEAPON] = (1<<i);
753 =====================
755 =====================
757 void CL_ParseStatic (void)
763 if (i >= MAX_STATIC_ENTITIES)
764 Host_Error ("Too many static entities");
765 ent = &cl_static_entities[i];
767 CL_ParseBaseline (ent);
769 // copy it to the current state
770 ent->model = cl.model_precache[ent->baseline.modelindex];
771 ent->frame = ent->baseline.frame;
772 ent->colormap = 0; //vid.colormap;
773 ent->skinnum = ent->baseline.skin;
774 ent->effects = ent->baseline.effects;
779 ent->glowcolor = 254;
780 ent->colormod[0] = ent->colormod[1] = ent->colormod[2] = 1;
782 VectorCopy (ent->baseline.origin, ent->origin);
783 VectorCopy (ent->baseline.angles, ent->angles);
792 void CL_ParseStaticSound (void)
795 int sound_num, vol, atten;
798 for (i=0 ; i<3 ; i++)
799 org[i] = MSG_ReadCoord ();
800 sound_num = MSG_ReadByte ();
801 vol = MSG_ReadByte ();
802 atten = MSG_ReadByte ();
804 S_StaticSound (cl.sound_precache[sound_num], org, vol, atten);
808 #define SHOWNET(x) if(cl_shownet.value==2)Con_Printf ("%3i:%s\n", msg_readcount-1, x);
810 extern void SHOWLMP_decodehide();
811 extern void SHOWLMP_decodeshow();
812 extern void R_SetSkyBox(char* sky);
814 extern float fog_density;
815 extern float fog_red;
816 extern float fog_green;
817 extern float fog_blue;
820 =====================
821 CL_ParseServerMessage
822 =====================
824 void CL_ParseServerMessage (void)
830 // if recording demos, copy the message out
832 if (cl_shownet.value == 1)
833 Con_Printf ("%i ",net_message.cursize);
834 else if (cl_shownet.value == 2)
835 Con_Printf ("------------------\n");
837 cl.onground = false; // unless the server says otherwise
846 Host_Error ("CL_ParseServerMessage: Bad server message");
848 cmd = MSG_ReadByte ();
852 SHOWNET("END OF MESSAGE");
853 return; // end of message
856 // if the high bit of the command byte is set, it is a fast update
859 SHOWNET("fast update");
860 CL_ParseUpdate (cmd&127);
864 SHOWNET(svc_strings[cmd]);
870 Host_Error ("CL_ParseServerMessage: Illegible server message\n");
874 // Con_Printf ("svc_nop\n");
878 cl.mtime[1] = cl.mtime[0];
879 cl.mtime[0] = MSG_ReadFloat ();
883 i = MSG_ReadShort ();
884 CL_ParseClientdata (i);
889 if (i != PROTOCOL_VERSION && i != 250)
890 Host_Error ("CL_ParseServerMessage: Server is protocol %i instead of %i\n", i, PROTOCOL_VERSION);
891 Nehahrademcompatibility = i == 250;
895 Host_EndGame ("Server disconnected\n");
898 Con_Printf ("%s", MSG_ReadString ());
901 case svc_centerprint:
902 SCR_CenterPrint (MSG_ReadString ());
906 Cbuf_AddText (MSG_ReadString ());
914 CL_ParseServerInfo ();
915 vid.recalc_refdef = true; // leave intermission full screen
919 for (i=0 ; i<3 ; i++)
920 cl.viewangles[i] = MSG_ReadAngle ();
924 cl.viewentity = MSG_ReadShort ();
929 if (i >= MAX_LIGHTSTYLES)
930 Host_Error ("svc_lightstyle > MAX_LIGHTSTYLES");
931 strcpy (cl_lightstyle[i].map, MSG_ReadString());
932 cl_lightstyle[i].length = strlen(cl_lightstyle[i].map);
936 CL_ParseStartSoundPacket();
941 S_StopSound(i>>3, i&7);
947 if (i >= cl.maxclients)
948 Host_Error ("CL_ParseServerMessage: svc_updatename > MAX_SCOREBOARD");
949 strcpy (cl.scores[i].name, MSG_ReadString ());
952 case svc_updatefrags:
955 if (i >= cl.maxclients)
956 Host_Error ("CL_ParseServerMessage: svc_updatefrags > MAX_SCOREBOARD");
957 cl.scores[i].frags = MSG_ReadShort ();
960 case svc_updatecolors:
963 if (i >= cl.maxclients)
964 Host_Error ("CL_ParseServerMessage: svc_updatecolors > MAX_SCOREBOARD");
965 cl.scores[i].colors = MSG_ReadByte ();
966 R_TranslatePlayerSkin(i);
970 R_ParseParticleEffect ();
973 case svc_spawnbaseline:
974 i = MSG_ReadShort ();
975 // must use CL_EntityNum() to force cl.num_entities up
976 CL_ParseBaseline (CL_EntityNum(i));
978 case svc_spawnstatic:
981 case svc_temp_entity:
987 cl.paused = MSG_ReadByte ();
999 Host_Error ("Received signon %i when at %i", i, cls.signon);
1004 case svc_killedmonster:
1005 cl.stats[STAT_MONSTERS]++;
1008 case svc_foundsecret:
1009 cl.stats[STAT_SECRETS]++;
1012 case svc_updatestat:
1013 i = MSG_ReadByte ();
1014 if (i < 0 || i >= MAX_CL_STATS)
1015 Host_Error ("svc_updatestat: %i is invalid", i);
1016 cl.stats[i] = MSG_ReadLong ();;
1019 case svc_spawnstaticsound:
1020 CL_ParseStaticSound ();
1024 cl.cdtrack = MSG_ReadByte ();
1025 cl.looptrack = MSG_ReadByte ();
1026 if ( (cls.demoplayback || cls.demorecording) && (cls.forcetrack != -1) )
1027 CDAudio_Play ((byte)cls.forcetrack, true);
1029 CDAudio_Play ((byte)cl.cdtrack, true);
1032 case svc_intermission:
1033 cl.intermission = 1;
1034 cl.completed_time = cl.time;
1035 vid.recalc_refdef = true; // go to full screen
1039 cl.intermission = 2;
1040 cl.completed_time = cl.time;
1041 vid.recalc_refdef = true; // go to full screen
1042 SCR_CenterPrint (MSG_ReadString ());
1046 cl.intermission = 3;
1047 cl.completed_time = cl.time;
1048 vid.recalc_refdef = true; // go to full screen
1049 SCR_CenterPrint (MSG_ReadString ());
1052 case svc_sellscreen:
1053 Cmd_ExecuteString ("help", src_command);
1056 SHOWLMP_decodehide();
1059 SHOWLMP_decodeshow();
1061 // LordHavoc: extra worldspawn fields (fog, sky, farclip)
1063 R_SetSkyBox(MSG_ReadString());
1066 r_farclip.value = MSG_ReadCoord();
1071 fog_density = MSG_ReadShort() * (1.0f / 4096.0f);
1072 fog_red = MSG_ReadByte() * (1.0 / 255.0);
1073 fog_green = MSG_ReadByte() * (1.0 / 255.0);
1074 fog_blue = MSG_ReadByte() * (1.0 / 255.0);