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