1cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich/*
2cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichCopyright (C) 1996-1997 Id Software, Inc.
3cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
4cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is free software; you can redistribute it and/or
5cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichmodify it under the terms of the GNU General Public License
6cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichas published by the Free Software Foundation; either version 2
7cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichof the License, or (at your option) any later version.
8cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
9cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichThis program is distributed in the hope that it will be useful,
10cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichbut WITHOUT ANY WARRANTY; without even the implied warranty of
11cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
12cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
13cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichSee the GNU General Public License for more details.
14cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
15cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichYou should have received a copy of the GNU General Public License
16cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichalong with this program; if not, write to the Free Software
17cabb5dd768714a7df34469a096b5e1aa815a2c22Jack PalevichFoundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
18cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich
19cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich*/
209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// cl_parse.c  -- parse a message received from the server
219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#include "quakedef.h"
239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
24cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevichconst char *svc_strings[] =
259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_bad",
279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_nop",
289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_disconnect",
299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_updatestat",
309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_version",		// [long] server version
319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_setview",		// [short] entity number
329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_sound",			// <see code>
339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_time",			// [float] server time
349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_print",			// [string] null terminated string
359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_stufftext",		// [string] stuffed into client's console buffer
369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						// the string should be \n terminated
379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_setangle",		// [vec3] set the view angle to this absolute value
389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_serverinfo",		// [long] version
409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						// [string] signon string
419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						// [string]..[0]model cache [string]...[0]sounds cache
429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream						// [string]..[0]item cache
439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_lightstyle",		// [byte] [string]
449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_updatename",		// [byte] [string]
459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_updatefrags",	// [byte] [short]
469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_clientdata",		// <shortbits + data>
479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_stopsound",		// <see code>
489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_updatecolors",	// [byte] [byte]
499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_particle",		// [vec3] <variable>
509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_damage",			// [byte] impact [byte] blood [vec3] from
519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_spawnstatic",
539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"OBSOLETE svc_spawnbinary",
549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_spawnbaseline",
559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_temp_entity",		// <variable>
579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_setpause",
589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_signonnum",
599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_centerprint",
609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_killedmonster",
619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_foundsecret",
629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_spawnstaticsound",
639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_intermission",
649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_finale",			// [string] music [string] text
659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_cdtrack",			// [byte] track [byte] looptrack
669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_sellscreen",
679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	"svc_cutscene"
689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream};
699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//=============================================================================
719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream===============
749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_EntityNum
759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamThis error checks and tracks the total number of entities
779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream===============
789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamentity_t	*CL_EntityNum (int num)
809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (num >= cl.num_entities)
829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (num >= MAX_EDICTS)
849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Host_Error ("CL_EntityNum: %i is an invalid number",num);
859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		while (cl.num_entities<=num)
869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cl_entities[cl.num_entities].colormap = vid.colormap;
889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cl.num_entities++;
899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	return &cl_entities[num];
939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_ParseStartSoundPacket
999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
1009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
1019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_ParseStartSoundPacket(void)
1029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    vec3_t  pos;
1049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    int 	channel, ent;
1059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    int 	sound_num;
1069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    int 	volume;
1079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    int 	field_mask;
1089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    float 	attenuation;
1099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream 	int		i;
1109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    field_mask = MSG_ReadByte();
1129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    if (field_mask & SND_VOLUME)
1149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		volume = MSG_ReadByte ();
1159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
1169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		volume = DEFAULT_SOUND_PACKET_VOLUME;
1179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    if (field_mask & SND_ATTENUATION)
1199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		attenuation = MSG_ReadByte () / 64.0;
1209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
1219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		attenuation = DEFAULT_SOUND_PACKET_ATTENUATION;
1229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	channel = MSG_ReadShort ();
1249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	sound_num = MSG_ReadByte ();
1259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ent = channel >> 3;
1279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	channel &= 7;
1289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (ent > MAX_EDICTS)
1309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Host_Error ("CL_ParseStartSoundPacket: ent = %i", ent);
1319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<3 ; i++)
1339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		pos[i] = MSG_ReadCoord ();
1349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream    S_StartSound (ent, channel, cl.sound_precache[sound_num], pos, volume/255.0, attenuation);
1369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
1399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
1409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_KeepaliveMessage
1419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamWhen the client is taking a long time to load stuff, send keepalive messages
1439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamso the server doesn't disconnect.
1449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
1459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
1469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_KeepaliveMessage (void)
1479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
1489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	float	time;
1499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	static float lastmsg;
1509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		ret;
1519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	sizebuf_t	old;
1529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte		olddata[8192];
1539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (sv.active)
1559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;		// no need if server is local
1569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cls.demoplayback)
1579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
1589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// read messages from server, should just be nops
1609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	old = net_message;
1619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	memcpy (olddata, net_message.data, net_message.cursize);
1629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	do
1649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
1659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ret = CL_GetMessage ();
1669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		switch (ret)
1679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
1689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		default:
1699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Host_Error ("CL_KeepaliveMessage: CL_GetMessage failed");
1709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case 0:
1719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;	// nothing waiting
1729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case 1:
1739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Host_Error ("CL_KeepaliveMessage: received a message");
1749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
1759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case 2:
1769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (MSG_ReadByte() != svc_nop)
1779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				Host_Error ("CL_KeepaliveMessage: datagram wasn't a nop");
1789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
1799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
1809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	} while (ret);
1819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	net_message = old;
1839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	memcpy (net_message.data, olddata, net_message.cursize);
1849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// check time
1869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	time = Sys_FloatTime ();
1879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (time - lastmsg < 5)
1889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
1899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	lastmsg = time;
1909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// write out a nop
1929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Printf ("--> client to server keepalive\n");
1939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	MSG_WriteByte (&cls.message, clc_nop);
1959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	NET_SendMessage (cls.netcon, &cls.message);
1969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	SZ_Clear (&cls.message);
1979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
1989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
1999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
2009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
2019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_ParseServerInfo
2029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
2039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
2049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_ParseServerInfo (void)
2059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
2069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	*str;
2079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i;
2089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		nummodels, numsounds;
2099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	model_precache[MAX_MODELS][MAX_QPATH];
2109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	char	sound_precache[MAX_SOUNDS][MAX_QPATH];
2119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_DPrintf ("Serverinfo packet received.\n");
2139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
2149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// wipe the client_state_t struct
2159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
2169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_ClearState ();
2179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// parse protocol version number
2199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	i = MSG_ReadLong ();
2209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (i != PROTOCOL_VERSION)
2219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("Server returned version %i, not %i", i, PROTOCOL_VERSION);
2239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
2249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// parse maxclients
2279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cl.maxclients = MSG_ReadByte ();
2289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cl.maxclients < 1 || cl.maxclients > MAX_SCOREBOARD)
2299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf("Bad maxclients (%u) from server\n", cl.maxclients);
2319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		return;
2329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
233cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich	cl.scores = (scoreboard_t*) Hunk_AllocName (cl.maxclients*sizeof(*cl.scores), "scores");
2349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// parse gametype
2369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cl.gametype = MSG_ReadByte ();
2379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// parse signon message
2399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	str = MSG_ReadString ();
2409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	strncpy (cl.levelname, str, sizeof(cl.levelname)-1);
2419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// seperate the printfs so the server message can have a color
2439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	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");
2449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Con_Printf ("%c%s\n", 2, str);
2459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
2479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// first we go through and touch all of the precache data that still
2489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// happens to be in the cache, so precaching something else doesn't
2499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// needlessly purge it
2509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
2519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// precache models
2539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	memset (cl.model_precache, 0, sizeof(cl.model_precache));
2549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (nummodels=1 ; ; nummodels++)
2559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		str = MSG_ReadString ();
2579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!str[0])
2589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
2599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (nummodels==MAX_MODELS)
2609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
2619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_Printf ("Server sent too many model precaches\n");
2629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return;
2639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
2649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		strcpy (model_precache[nummodels], str);
2659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Mod_TouchModel (str);
2669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// precache sounds
2699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	memset (cl.sound_precache, 0, sizeof(cl.sound_precache));
2709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (numsounds=1 ; ; numsounds++)
2719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		str = MSG_ReadString ();
2739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (!str[0])
2749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
2759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (numsounds==MAX_SOUNDS)
2769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
2779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_Printf ("Server sent too many sound precaches\n");
2789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return;
2799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
2809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		strcpy (sound_precache[numsounds], str);
2819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		S_TouchSound (str);
2829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
2859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// now we try to load everything else until a cache allocation fails
2869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
2879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=1 ; i<nummodels ; i++)
2899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
2909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cl.model_precache[i] = Mod_ForName (model_precache[i], false);
2919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (cl.model_precache[i] == NULL)
2929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
2939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_Printf("Model %s not found\n", model_precache[i]);
2949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return;
2959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
2969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		CL_KeepaliveMessage ();
2979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
2989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
2999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	S_BeginPrecaching ();
3009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=1 ; i<numsounds ; i++)
3019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cl.sound_precache[i] = S_PrecacheSound (sound_precache[i]);
3039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		CL_KeepaliveMessage ();
3049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	S_EndPrecaching ();
3069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// local state
3099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cl_entities[0].model = cl.worldmodel = cl.model_precache[1];
3109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_NewMap ();
3129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	Hunk_Check ();		// make sure nothing is hurt
3149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	noclip_anglehack = false;		// noclip is turned off at start
3169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
3179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
3209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
3219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_ParseUpdate
3229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamParse an entity update message from the server
3249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamIf an entities model or origin changes from frame to frame, it must be
3259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamrelinked.  Other attributes can change without relinking.
3269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
3279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
3289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamint	bitcounts[16];
3299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_ParseUpdate (int bits)
3319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
3329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			i;
3339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	model_t		*model;
3349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			modnum;
3359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	qboolean	forcelink;
3369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	entity_t	*ent;
3379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			num;
3389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			skin;
3399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cls.signon == SIGNONS - 1)
3419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{	// first update is the final signon stage
3429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cls.signon = SIGNONS;
3439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		CL_SignonReply ();
3449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & U_MOREBITS)
3479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		i = MSG_ReadByte ();
3499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		bits |= (i<<8);
3509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & U_LONGENTITY)
3539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		num = MSG_ReadShort ();
3549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
3559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		num = MSG_ReadByte ();
3569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ent = CL_EntityNum (num);
3589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamfor (i=0 ; i<16 ; i++)
3609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamif (bits&(1<<i))
3619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	bitcounts[i]++;
3629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (ent->msgtime != cl.mtime[1])
3649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		forcelink = true;	// no previous frame to lerp from
3659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
3669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		forcelink = false;
3679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ent->msgtime = cl.mtime[0];
3699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & U_MODEL)
3719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		modnum = MSG_ReadByte ();
3739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (modnum >= MAX_MODELS)
3749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Host_Error ("CL_ParseModel: bad modnum");
3759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
3779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		modnum = ent->baseline.modelindex;
3789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
3799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	model = cl.model_precache[modnum];
3809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (model != ent->model)
3819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
3829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->model = model;
3839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// automatic animation (torches, etc) can be either all together
3849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// or randomized
3859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (model)
3869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
3879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (model->synctype == ST_RAND)
3889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				ent->syncbase = (float)(rand()&0x7fff) / 0x7fff;
3899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			else
3909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				ent->syncbase = 0.0;
3919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
3929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
3939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			forcelink = true;	// hack to make null model players work
3949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifdef GLQUAKE
3959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (num > 0 && num <= cl.maxclients)
3969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			R_TranslatePlayerSkin (num - 1);
3979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
3989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
3999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & U_FRAME)
4019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->frame = MSG_ReadByte ();
4029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
4039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->frame = ent->baseline.frame;
4049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & U_COLORMAP)
4069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		i = MSG_ReadByte();
4079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
4089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		i = ent->baseline.colormap;
4099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (!i)
4109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->colormap = vid.colormap;
4119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
4129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
4139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (i > cl.maxclients)
4149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Sys_Error ("i >= cl.maxclients");
4159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->colormap = cl.scores[i-1].translations;
4169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
4179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifdef GLQUAKE
4199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & U_SKIN)
4209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		skin = MSG_ReadByte();
4219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
4229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		skin = ent->baseline.skin;
4239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (skin != ent->skinnum) {
4249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->skinnum = skin;
4259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (num > 0 && num <= cl.maxclients)
4269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			R_TranslatePlayerSkin (num - 1);
4279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
4289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#else
4309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & U_SKIN)
4329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->skinnum = MSG_ReadByte();
4339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
4349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->skinnum = ent->baseline.skin;
4359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
4369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & U_EFFECTS)
4389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->effects = MSG_ReadByte();
4399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
4409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->effects = ent->baseline.effects;
4419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// shift the known values for interpolation
4439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VectorCopy (ent->msg_origins[0], ent->msg_origins[1]);
4449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VectorCopy (ent->msg_angles[0], ent->msg_angles[1]);
4459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & U_ORIGIN1)
4479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->msg_origins[0][0] = MSG_ReadCoord ();
4489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
4499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->msg_origins[0][0] = ent->baseline.origin[0];
4509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & U_ANGLE1)
4519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->msg_angles[0][0] = MSG_ReadAngle();
4529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
4539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->msg_angles[0][0] = ent->baseline.angles[0];
4549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & U_ORIGIN2)
4569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->msg_origins[0][1] = MSG_ReadCoord ();
4579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
4589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->msg_origins[0][1] = ent->baseline.origin[1];
4599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & U_ANGLE2)
4609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->msg_angles[0][1] = MSG_ReadAngle();
4619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
4629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->msg_angles[0][1] = ent->baseline.angles[1];
4639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & U_ORIGIN3)
4659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->msg_origins[0][2] = MSG_ReadCoord ();
4669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
4679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->msg_origins[0][2] = ent->baseline.origin[2];
4689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & U_ANGLE3)
4699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->msg_angles[0][2] = MSG_ReadAngle();
4709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
4719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->msg_angles[0][2] = ent->baseline.angles[2];
4729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ( bits & U_NOLERP )
4749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->forcelink = true;
4759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if ( forcelink )
4779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{	// didn't have an update last message
4789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		VectorCopy (ent->msg_origins[0], ent->msg_origins[1]);
4799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		VectorCopy (ent->msg_origins[0], ent->origin);
4809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		VectorCopy (ent->msg_angles[0], ent->msg_angles[1]);
4819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		VectorCopy (ent->msg_angles[0], ent->angles);
4829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->forcelink = true;
4839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
4849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
4859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
4879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
4889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_ParseBaseline
4899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
4909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
4919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_ParseBaseline (entity_t *ent)
4929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
4939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			i;
4949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
4959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ent->baseline.modelindex = MSG_ReadByte ();
4969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ent->baseline.frame = MSG_ReadByte ();
4979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ent->baseline.colormap = MSG_ReadByte();
4989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ent->baseline.skin = MSG_ReadByte();
4999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<3 ; i++)
5009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
5019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->baseline.origin[i] = MSG_ReadCoord ();
5029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		ent->baseline.angles[i] = MSG_ReadAngle ();
5039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
5049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
5059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
5089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
5099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_ParseClientdata
5109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamServer information pertaining to this client only
5129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream==================
5139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
5149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_ParseClientdata (int bits)
5159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
5169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i, j;
5179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & SU_VIEWHEIGHT)
5199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cl.viewheight = MSG_ReadChar ();
5209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
5219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cl.viewheight = DEFAULT_VIEWHEIGHT;
5229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & SU_IDEALPITCH)
5249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cl.idealpitch = MSG_ReadChar ();
5259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
5269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cl.idealpitch = 0;
5279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VectorCopy (cl.mvelocity[0], cl.mvelocity[1]);
5299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<3 ; i++)
5309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
5319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (bits & (SU_PUNCH1<<i) )
5329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cl.punchangle[i] = MSG_ReadChar();
5339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
5349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cl.punchangle[i] = 0;
5359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (bits & (SU_VELOCITY1<<i) )
5369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cl.mvelocity[0][i] = MSG_ReadChar()*16;
5379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
5389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cl.mvelocity[0][i] = 0;
5399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
5409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// [always sent]	if (bits & SU_ITEMS)
5429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		i = MSG_ReadLong ();
5439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cl.items != i)
5459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{	// set flash times
5469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sbar_Changed ();
5479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		for (j=0 ; j<32 ; j++)
5489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if ( (i & (1<<j)) && !(cl.items & (1<<j)))
5499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				cl.item_gettime[j] = cl.time;
5509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cl.items = i;
5519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
5529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cl.onground = (bits & SU_ONGROUND) != 0;
5549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cl.inwater = (bits & SU_INWATER) != 0;
5559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & SU_WEAPONFRAME)
5579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cl.stats[STAT_WEAPONFRAME] = MSG_ReadByte ();
5589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
5599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cl.stats[STAT_WEAPONFRAME] = 0;
5609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & SU_ARMOR)
5629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		i = MSG_ReadByte ();
5639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
5649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		i = 0;
5659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cl.stats[STAT_ARMOR] != i)
5669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
5679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cl.stats[STAT_ARMOR] = i;
5689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sbar_Changed ();
5699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
5709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (bits & SU_WEAPON)
5729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		i = MSG_ReadByte ();
5739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
5749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		i = 0;
5759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cl.stats[STAT_WEAPON] != i)
5769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
5779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cl.stats[STAT_WEAPON] = i;
5789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sbar_Changed ();
5799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
5809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	i = MSG_ReadShort ();
5829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cl.stats[STAT_HEALTH] != i)
5839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
5849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cl.stats[STAT_HEALTH] = i;
5859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sbar_Changed ();
5869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
5879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	i = MSG_ReadByte ();
5899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cl.stats[STAT_AMMO] != i)
5909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
5919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cl.stats[STAT_AMMO] = i;
5929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sbar_Changed ();
5939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
5949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
5959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<4 ; i++)
5969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
5979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		j = MSG_ReadByte ();
5989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (cl.stats[STAT_SHELLS+i] != j)
5999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
6009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cl.stats[STAT_SHELLS+i] = j;
6019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Sbar_Changed ();
6029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
6039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
6049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	i = MSG_ReadByte ();
6069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (standard_quake)
6089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
6099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (cl.stats[STAT_ACTIVEWEAPON] != i)
6109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
6119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cl.stats[STAT_ACTIVEWEAPON] = i;
6129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Sbar_Changed ();
6139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
6149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
6159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else
6169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
6179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (cl.stats[STAT_ACTIVEWEAPON] != (1<<i))
6189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
6199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cl.stats[STAT_ACTIVEWEAPON] = (1<<i);
6209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Sbar_Changed ();
6219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
6229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
6239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
6249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
6269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=====================
6279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_NewTranslation
6289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=====================
6299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
6309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_NewTranslation (int slot)
6319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
6329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i, j;
6339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		top, bottom;
6349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	byte	*dest, *source;
6359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (slot > cl.maxclients)
6379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Sys_Error ("CL_NewTranslation: slot > cl.maxclients");
6389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	dest = cl.scores[slot].translations;
6399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	source = vid.colormap;
6409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	memcpy (dest, vid.colormap, sizeof(cl.scores[slot].translations));
6419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	top = cl.scores[slot].colors & 0xf0;
6429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	bottom = (cl.scores[slot].colors &15)<<4;
6439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifdef GLQUAKE
6449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_TranslatePlayerSkin (slot);
6459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
6469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<VID_GRADES ; i++, dest += 256, source+=256)
6489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
6499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (top < 128)	// the artists made some backwards ranges.  sigh.
6509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			memcpy (dest + TOP_RANGE, source + top, 16);
6519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
6529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (j=0 ; j<16 ; j++)
6539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				dest[TOP_RANGE+j] = source[top+15-j];
6549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (bottom < 128)
6569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			memcpy (dest + BOTTOM_RANGE, source + bottom, 16);
6579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		else
6589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (j=0 ; j<16 ; j++)
6599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				dest[BOTTOM_RANGE+j] = source[bottom+15-j];
6609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
6619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
6629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
6649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=====================
6659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_ParseStatic
6669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=====================
6679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
6689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_ParseStatic (void)
6699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
6709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	entity_t *ent;
6719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int		i;
6729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	i = cl.num_statics;
6749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (i >= MAX_STATIC_ENTITIES)
6759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Host_Error ("Too many static entities");
6769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ent = &cl_static_entities[i];
6779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cl.num_statics++;
6789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	CL_ParseBaseline (ent);
6799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// copy it to the current state
6819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ent->model = cl.model_precache[ent->baseline.modelindex];
6829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ent->frame = ent->baseline.frame;
6839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ent->colormap = vid.colormap;
6849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ent->skinnum = ent->baseline.skin;
6859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	ent->effects = ent->baseline.effects;
6869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VectorCopy (ent->baseline.origin, ent->origin);
6889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	VectorCopy (ent->baseline.angles, ent->angles);
6899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	R_AddEfrags (ent);
6909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
6919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
6929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
6939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream===================
6949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_ParseStaticSound
6959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream===================
6969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
6979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_ParseStaticSound (void)
6989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
6999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vec3_t		org;
7009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			sound_num, vol, atten;
7019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			i;
7029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	for (i=0 ; i<3 ; i++)
7049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		org[i] = MSG_ReadCoord ();
7059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	sound_num = MSG_ReadByte ();
7069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	vol = MSG_ReadByte ();
7079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	atten = MSG_ReadByte ();
7089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	S_StaticSound (cl.sound_precache[sound_num], org, vol, atten);
7109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
7119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#define SHOWNET(x) if(cl_shownet.value==2)Con_Printf ("%3i:%s\n", msg_readcount-1, x);
7149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream/*
7169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=====================
7179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamCL_ParseServerMessage
7189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream=====================
7199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream*/
7209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstreamvoid CL_ParseServerMessage (void)
7219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream{
7229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			cmd;
7239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	int			i;
7249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
7269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// if recording demos, copy the message out
7279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
7289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	if (cl_shownet.value == 1)
7299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("%i ",net_message.cursize);
7309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	else if (cl_shownet.value == 2)
7319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		Con_Printf ("------------------\n");
7329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	cl.onground = false;	// unless the server says otherwise
7349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
7359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream// parse the message
7369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//
7379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	MSG_BeginReading ();
7389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	while (1)
7409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	{
7419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (msg_badread)
7429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Host_Error ("CL_ParseServerMessage: Bad server message");
7439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		cmd = MSG_ReadByte ();
7459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (cmd == -1)
7479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
7489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			SHOWNET("END OF MESSAGE");
7499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			return;		// end of message
7509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
7519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// if the high bit of the command byte is set, it is a fast update
7539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		if (cmd & 128)
7549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
7559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			SHOWNET("fast update");
7569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			CL_ParseUpdate (cmd&127);
7579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			continue;
7589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
7599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		SHOWNET(svc_strings[cmd]);
7619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	// other commands
7639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		switch (cmd)
7649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		{
7659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		default:
7669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Host_Error ("CL_ParseServerMessage: Illegible server message\n");
7679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
7689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_nop:
7709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream//			Con_Printf ("svc_nop\n");
7719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
7729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_time:
7749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cl.mtime[1] = cl.mtime[0];
7759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cl.mtime[0] = MSG_ReadFloat ();
7769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
7779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_clientdata:
7799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			i = MSG_ReadShort ();
7809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			CL_ParseClientdata (i);
7819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
7829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_version:
7849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			i = MSG_ReadLong ();
7859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (i != PROTOCOL_VERSION)
7869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				Host_Error ("CL_ParseServerMessage: Server is protocol %i instead of %i\n", i, PROTOCOL_VERSION);
7879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
7889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_disconnect:
7909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Host_EndGame ("Server disconnected\n");
7919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_print:
7939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Con_Printf ("%s", MSG_ReadString ());
7949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
7959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
7969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_centerprint:
7979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			SCR_CenterPrint (MSG_ReadString ());
7989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
7999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_stufftext:
8019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Cbuf_AddText (MSG_ReadString ());
8029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
8039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_damage:
8059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			V_ParseDamage ();
8069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
8079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_serverinfo:
8099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			CL_ParseServerInfo ();
8109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			vid.recalc_refdef = true;	// leave intermission full screen
8119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
8129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_setangle:
8149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			for (i=0 ; i<3 ; i++)
8159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				cl.viewangles[i] = MSG_ReadAngle ();
8169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
8179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_setview:
8199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cl.viewentity = MSG_ReadShort ();
8209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
8219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_lightstyle:
8239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			i = MSG_ReadByte ();
8249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (i >= MAX_LIGHTSTYLES)
8259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				Sys_Error ("svc_lightstyle > MAX_LIGHTSTYLES");
8269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Q_strcpy (cl_lightstyle[i].map,  MSG_ReadString());
8279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cl_lightstyle[i].length = Q_strlen(cl_lightstyle[i].map);
8289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
8299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_sound:
8319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			CL_ParseStartSoundPacket();
8329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
8339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_stopsound:
8359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			i = MSG_ReadShort();
8369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			S_StopSound(i>>3, i&7);
8379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
8389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8399fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_updatename:
8409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Sbar_Changed ();
8419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			i = MSG_ReadByte ();
8429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (i >= cl.maxclients)
8439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				Host_Error ("CL_ParseServerMessage: svc_updatename > MAX_SCOREBOARD");
8449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			strcpy (cl.scores[i].name, MSG_ReadString ());
8459fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
8469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_updatefrags:
8489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Sbar_Changed ();
8499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			i = MSG_ReadByte ();
8509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (i >= cl.maxclients)
8519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				Host_Error ("CL_ParseServerMessage: svc_updatefrags > MAX_SCOREBOARD");
8529fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cl.scores[i].frags = MSG_ReadShort ();
8539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
8549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_updatecolors:
8569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			Sbar_Changed ();
8579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			i = MSG_ReadByte ();
8589fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (i >= cl.maxclients)
8599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				Host_Error ("CL_ParseServerMessage: svc_updatecolors > MAX_SCOREBOARD");
8609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cl.scores[i].colors = MSG_ReadByte ();
8619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			CL_NewTranslation (i);
8629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
8639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8649fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_particle:
8659fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			R_ParseParticleEffect ();
8669fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
8679fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8689fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_spawnbaseline:
8699fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			i = MSG_ReadShort ();
8709fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			// must use CL_EntityNum() to force cl.num_entities up
8719fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			CL_ParseBaseline (CL_EntityNum(i));
8729fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
8739fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_spawnstatic:
8749fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			CL_ParseStatic ();
8759fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
8769fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_temp_entity:
8779fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			CL_ParseTEnt ();
8789fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
8799fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8809fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_setpause:
8819fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			{
8829fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				cl.paused = MSG_ReadByte ();
8839fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
8849fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				if (cl.paused)
8859fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
8869fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					CDAudio_Pause ();
8879fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifdef _WIN32
8889fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					VID_HandlePause (true);
8899fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
8909fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
8919fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				else
8929fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				{
8939fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					CDAudio_Resume ();
8949fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#ifdef _WIN32
8959fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream					VID_HandlePause (false);
8969fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream#endif
8979fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				}
8989fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			}
8999fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
9009fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9019fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_signonnum:
9029fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			i = MSG_ReadByte ();
9039fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (i <= cls.signon)
9049fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				Host_Error ("Received signon %i when at %i", i, cls.signon);
9059fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cls.signon = i;
9069fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			CL_SignonReply ();
9079fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
9089fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9099fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_killedmonster:
9109fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cl.stats[STAT_MONSTERS]++;
9119fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
9129fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9139fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_foundsecret:
9149fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cl.stats[STAT_SECRETS]++;
9159fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
9169fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9179fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_updatestat:
9189fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			i = MSG_ReadByte ();
9199fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if (i < 0 || i >= MAX_CL_STATS)
9209fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				Sys_Error ("svc_updatestat: %i is invalid", i);
9219fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cl.stats[i] = MSG_ReadLong ();;
9229fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
9239fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9249fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_spawnstaticsound:
9259fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			CL_ParseStaticSound ();
9269fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
9279fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9289fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_cdtrack:
9299fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cl.cdtrack = MSG_ReadByte ();
9309fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cl.looptrack = MSG_ReadByte ();
9319fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			if ( (cls.demoplayback || cls.demorecording) && (cls.forcetrack != -1) )
9329fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				CDAudio_Play ((byte)cls.forcetrack, true);
9339fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			else
9349fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream				CDAudio_Play ((byte)cl.cdtrack, true);
9359fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
9369fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9379fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_intermission:
9389fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cl.intermission = 1;
939cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			cl.completed_time = (int) cl.time;
9409fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			vid.recalc_refdef = true;	// go to full screen
9419fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
9429fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9439fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_finale:
9449fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cl.intermission = 2;
945cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			cl.completed_time = (int) cl.time;
9469fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			vid.recalc_refdef = true;	// go to full screen
9479fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			SCR_CenterPrint (MSG_ReadString ());
9489fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
9499fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9509fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_cutscene:
9519fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			cl.intermission = 3;
952cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			cl.completed_time = (int) cl.time;
9539fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			vid.recalc_refdef = true;	// go to full screen
9549fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			SCR_CenterPrint (MSG_ReadString ());
9559fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
9569fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
9579fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		case svc_sellscreen:
958cabb5dd768714a7df34469a096b5e1aa815a2c22Jack Palevich			Cmd_ExecuteString2 ("help", src_command);
9599fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream			break;
9609fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream		}
9619fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream	}
9629fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream}
9639fd67c44777b350dc56f3e70c88963b0d966ffc7quake upstream
964