diff options
author | Andrey Nazarov <skuller@skuller.net> | 2008-05-20 20:43:18 +0000 |
---|---|---|
committer | Andrey Nazarov <skuller@skuller.net> | 2008-05-20 20:43:18 +0000 |
commit | ea1ed930673bb4063bb210a6b1a34364a9093d77 (patch) | |
tree | cb79a0b0871e6addeff6cfcdb599a52c6f618e60 /source/cl_parse.c | |
parent | cb43ed08c3cf6410fe4ce22dac3d07952db92893 (diff) |
Updated menu scripts syntax.
Updated client docs.
Diffstat (limited to 'source/cl_parse.c')
-rw-r--r-- | source/cl_parse.c | 1734 |
1 files changed, 858 insertions, 876 deletions
diff --git a/source/cl_parse.c b/source/cl_parse.c index abbe8b5..20df0b3 100644 --- a/source/cl_parse.c +++ b/source/cl_parse.c @@ -24,12 +24,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. //============================================================================= -static const char validExts[][4] = { - "pcx", "wal", "tga", "jpg", "png", - "md2", "md3", "sp2", "wav", "dm2", - "bsp", "txt", "loc", "ent", "" -}; - /* =============== CL_CheckOrDownloadFile @@ -39,84 +33,87 @@ to start a download from the server. =============== */ qboolean CL_CheckOrDownloadFile( const char *path ) { - fileHandle_t f; - int i, length; - char filename[MAX_QPATH]; - char *ext; - - Q_strncpyz( filename, path, sizeof( filename ) ); - Q_strlwr( filename ); - - length = strlen( filename ); - if( !length - || !Q_ispath( filename[0] ) - || !Q_ispath( filename[ length - 1 ] ) - || strchr( filename, '\\' ) - || strchr( filename, ':' ) - || !strchr( filename, '/' ) - || strstr( filename, ".." ) ) - { - Com_WPrintf( "Refusing to download file with invalid path.\n" ); - return qtrue; - } - - // a trivial attempt to prevent malicious server from - // uploading trojan executables to the win32 client - ext = COM_FileExtension( filename ); + static const char validExts[][4] = { + "pcx", "wal", "tga", "jpg", "png", + "md2", "md3", "sp2", "wav", "dm2", + "bsp", "txt", "loc", "ent", "" + }; + fileHandle_t f; + int i, length; + char filename[MAX_QPATH]; + char *ext; + + Q_strncpyz( filename, path, sizeof( filename ) ); + Q_strlwr( filename ); + + length = strlen( filename ); + if( !length + || !Q_ispath( filename[0] ) + || !Q_ispath( filename[ length - 1 ] ) + || strchr( filename, '\\' ) + || strchr( filename, ':' ) + || !strchr( filename, '/' ) + || strstr( filename, ".." ) ) + { + Com_WPrintf( "Refusing to download file with invalid path.\n" ); + return qtrue; + } + + // a trivial attempt to prevent malicious server from + // uploading trojan executables to the win32 client + ext = COM_FileExtension( filename ); if( *ext != '.' ) { - Com_WPrintf( "Refusing to download file without extension.\n" ); + Com_WPrintf( "Refusing to download file without extension.\n" ); return qtrue; } for( i = 0; validExts[i][0]; i++ ) { - if( !strcmp( ext + 1, validExts[i] ) ) { + if( !strcmp( ext + 1, validExts[i] ) ) { break; } - } + } if( !validExts[i][0] ) { - Com_WPrintf( "Refusing to download file with invalid extension.\n" ); - return qtrue; + Com_WPrintf( "Refusing to download file with invalid extension.\n" ); + return qtrue; } - if( FS_LoadFile( filename, NULL ) != INVALID_LENGTH ) { - // it exists, no need to download - return qtrue; - } + if( FS_LoadFile( filename, NULL ) != INVALID_LENGTH ) { + // it exists, no need to download + return qtrue; + } - strcpy( cls.downloadname, filename ); + strcpy( cls.download.name, filename ); - // download to a temp name, and only rename - // to the real name when done, so if interrupted - // a runt file wont be left - COM_StripExtension( cls.downloadname, cls.downloadtempname, MAX_QPATH ); - - if( strlen( cls.downloadtempname ) >= MAX_QPATH - 5 ) { - strcpy( cls.downloadtempname + MAX_QPATH - 5, ".tmp" ); - } else { - strcat( cls.downloadtempname, ".tmp" ); - } + // download to a temp name, and only rename + // to the real name when done, so if interrupted + // a runt file wont be left + COM_StripExtension( cls.download.name, cls.download.temp, MAX_QPATH ); + + if( strlen( cls.download.temp ) >= MAX_QPATH - 5 ) { + strcpy( cls.download.temp + MAX_QPATH - 5, ".tmp" ); + } else { + strcat( cls.download.temp, ".tmp" ); + } //ZOID - // check to see if we already have a tmp for this file, if so, try to resume - // open the file if not opened yet - length = FS_FOpenFile( cls.downloadtempname, &f, FS_MODE_RDWR ); - if( length < 0 && f ) { - Com_WPrintf( "Couldn't determine size of %s\n", cls.downloadtempname ); - FS_FCloseFile( f ); - f = 0; - } - if( f ) { // it exists - cls.download = f; - // give the server an offset to start the download - Com_Printf( "Resuming %s\n", cls.downloadname ); - CL_ClientCommand( va( "download \"%s\" %i", cls.downloadname, length ) ); - } else { - Com_Printf( "Downloading %s\n", cls.downloadname ); - CL_ClientCommand( va( "download \"%s\"", cls.downloadname ) ); - } - - cls.downloadnumber++; - - return qfalse; + // check to see if we already have a tmp for this file, if so, try to resume + // open the file if not opened yet + length = FS_FOpenFile( cls.download.temp, &f, FS_MODE_RDWR ); + if( length < 0 && f ) { + Com_WPrintf( "Couldn't determine size of %s\n", cls.download.temp ); + FS_FCloseFile( f ); + f = 0; + } + if( f ) { // it exists + cls.download.file = f; + // give the server an offset to start the download + Com_Printf( "Resuming %s\n", cls.download.name ); + CL_ClientCommand( va( "download \"%s\" %i", cls.download.name, length ) ); + } else { + Com_Printf( "Downloading %s\n", cls.download.name ); + CL_ClientCommand( va( "download \"%s\"", cls.download.name ) ); + } + + return qfalse; } /* @@ -127,40 +124,40 @@ Request a download from the server =============== */ void CL_Download_f( void ) { - char *path; + char *path; - if( cls.state < ca_connected ) { - Com_Printf( "Must be connected to a server.\n" ); - return; - } + if( cls.state < ca_connected ) { + Com_Printf( "Must be connected to a server.\n" ); + return; + } - if( Cmd_Argc() != 2 ) { - Com_Printf( "Usage: download <filename>\n" ); - return; - } + if( Cmd_Argc() != 2 ) { + Com_Printf( "Usage: download <filename>\n" ); + return; + } - path = Cmd_Argv( 1 ); + path = Cmd_Argv( 1 ); - if( !allow_download->integer ) { - Com_Printf( "Couldn't download '%s', " + if( !allow_download->integer ) { + Com_Printf( "Couldn't download '%s', " "downloading is locally disabled.\n", path ); - return; - } - - if( cls.downloadtempname[0] ) { - Com_Printf( "Already downloading.\n" ); - if( cls.serverProtocol == PROTOCOL_VERSION_Q2PRO ) { - Com_Printf( "Try using 'stopdl' command to abort the download.\n" ); - } - return; - } - - if( FS_LoadFile( path, NULL ) != INVALID_LENGTH ) { - Com_Printf( "File '%s' already exists.\n", path ); - return; - } - - CL_CheckOrDownloadFile( path ); + return; + } + + if( cls.download.temp[0] ) { + Com_Printf( "Already downloading.\n" ); + if( cls.serverProtocol == PROTOCOL_VERSION_Q2PRO ) { + Com_Printf( "Try using 'stopdl' command to abort the download.\n" ); + } + return; + } + + if( FS_LoadFile( path, NULL ) != INVALID_LENGTH ) { + Com_Printf( "File '%s' already exists.\n", path ); + return; + } + + CL_CheckOrDownloadFile( path ); } @@ -172,84 +169,73 @@ A download message has been received from the server ===================== */ static void CL_ParseDownload( void ) { - int size, percent; + int size, percent; - if( !cls.downloadtempname[0] ) { - Com_Error( ERR_DROP, "Server sending download, but " + if( !cls.download.temp[0] ) { + Com_Error( ERR_DROP, "Server sending download, but " "no download was requested" ); - } - - // read the data - size = MSG_ReadShort(); - percent = MSG_ReadByte(); - if( size == -1 ) { - if( !percent ) { - Com_Printf( "Server was unable to send this file.\n" ); - } else { - Com_Printf( "Server stopped the download.\n" ); - } - if( cls.download ) { - // if here, we tried to resume a file but the server said no - FS_FCloseFile( cls.download ); - cls.download = 0; - } - cls.downloadtempname[0] = 0; - cls.downloadname[0] = 0; - CL_RequestNextDownload(); - return; - } - - if( size < 0 ) { - Com_Error( ERR_DROP, "CL_ParseDownload: bad size: %d", size ); - } - - if( msg_read.readcount + size > msg_read.cursize ) { - Com_Error( ERR_DROP, "CL_ParseDownload: read past end of message" ); - } - - // open the file if not opened yet - if( !cls.download ) { - FS_FOpenFile( cls.downloadtempname, &cls.download, FS_MODE_WRITE ); - if( !cls.download ) { - msg_read.readcount += size; - Com_WPrintf( "Failed to open '%s' for writing\n", - cls.downloadtempname ); - cls.downloadtempname[0] = 0; - cls.downloadname[0] = 0; - CL_RequestNextDownload(); - return; - } - } - - FS_Write( msg_read.data + msg_read.readcount, size, cls.download ); - msg_read.readcount += size; - - if( percent != 100 ) { - // request next block - // change display routines by zoid - cls.downloadpercent = percent; - - CL_ClientCommand( "nextdl" ); - } else { - FS_FCloseFile( cls.download ); - - // rename the temp file to it's final name - if( !FS_RenameFile( cls.downloadtempname, cls.downloadname ) ) { - Com_WPrintf( "Failed to rename %s to %s\n", - cls.downloadtempname, cls.downloadname ); - } - - Com_Printf( "Downloaded successfully.\n" ); - - cls.downloadtempname[0] = 0; - cls.downloadname[0] = 0; - - cls.download = 0; - cls.downloadpercent = 0; - - // get another file if needed - CL_RequestNextDownload(); - } + } + + // read the data + size = MSG_ReadShort(); + percent = MSG_ReadByte(); + if( size == -1 ) { + if( !percent ) { + Com_Printf( "Server was unable to send this file.\n" ); + } else { + Com_Printf( "Server stopped the download.\n" ); + } + if( cls.download.file ) { + // if here, we tried to resume a file but the server said no + FS_FCloseFile( cls.download.file ); + } + goto another; + } + + if( size < 0 ) { + Com_Error( ERR_DROP, "CL_ParseDownload: bad size: %d", size ); + } + + if( msg_read.readcount + size > msg_read.cursize ) { + Com_Error( ERR_DROP, "CL_ParseDownload: read past end of message" ); + } + + // open the file if not opened yet + if( !cls.download.file ) { + FS_FOpenFile( cls.download.temp, &cls.download.file, FS_MODE_WRITE ); + if( !cls.download.file ) { + msg_read.readcount += size; + Com_WPrintf( "Failed to open '%s' for writing\n", + cls.download.temp ); + goto another; + } + } + + FS_Write( msg_read.data + msg_read.readcount, size, cls.download.file ); + msg_read.readcount += size; + + if( percent != 100 ) { + // request next block + // change display routines by zoid + cls.download.percent = percent; + + CL_ClientCommand( "nextdl" ); + } else { + FS_FCloseFile( cls.download.file ); + + // rename the temp file to it's final name + if( !FS_RenameFile( cls.download.temp, cls.download.name ) ) { + Com_WPrintf( "Failed to rename %s to %s\n", + cls.download.temp, cls.download.name ); + } + + Com_Printf( "Downloaded successfully.\n" ); + +another: + // get another file if needed + memset( &cls.download, 0, sizeof( cls.download ) ); + CL_RequestNextDownload(); + } } /* @@ -271,21 +257,21 @@ static inline void CL_ParseDeltaEntity( server_frame_t *frame, entity_state_t *old, int bits ) { - entity_state_t *state; + entity_state_t *state; - if( frame->numEntities == MAX_PACKET_ENTITIES ) { - Com_Error( ERR_DROP, "%s: MAX_PACKET_ENTITIES exceeded", __func__ ); - } + if( frame->numEntities == MAX_PACKET_ENTITIES ) { + Com_Error( ERR_DROP, "%s: MAX_PACKET_ENTITIES exceeded", __func__ ); + } - state = &cl.entityStates[cl.numEntityStates & PARSE_ENTITIES_MASK]; - cl.numEntityStates++; - frame->numEntities++; + state = &cl.entityStates[cl.numEntityStates & PARSE_ENTITIES_MASK]; + cl.numEntityStates++; + frame->numEntities++; - if( cl_shownet->integer > 2 ) { - MSG_ShowDeltaEntityBits( bits ); - } + if( cl_shownet->integer > 2 ) { + MSG_ShowDeltaEntityBits( bits ); + } - MSG_ParseDeltaEntity( old, state, newnum, bits ); + MSG_ParseDeltaEntity( old, state, newnum, bits ); } /* @@ -296,140 +282,140 @@ CL_ParsePacketEntities static void CL_ParsePacketEntities( server_frame_t *oldframe, server_frame_t *frame ) { - int newnum; - int bits; - entity_state_t *oldstate; - int oldindex, oldnum; - int i; - - frame->firstEntity = cl.numEntityStates; - frame->numEntities = 0; - - // delta from the entities present in oldframe - oldindex = 0; - oldstate = NULL; - if( !oldframe ) { - oldnum = 99999; - } else { - if( oldindex >= oldframe->numEntities ) { - oldnum = 99999; - } else { - i = oldframe->firstEntity + oldindex; - oldstate = &cl.entityStates[i & PARSE_ENTITIES_MASK]; - oldnum = oldstate->number; - } - } - - while( 1 ) { - newnum = MSG_ParseEntityBits( &bits ); - if( newnum < 0 || newnum >= MAX_EDICTS ) { - Com_Error( ERR_DROP, "%s: bad number: %d", __func__, newnum ); - } - - if( msg_read.readcount > msg_read.cursize ) { - Com_Error( ERR_DROP, "%s: read past end of message", __func__ ); - } - - if( !newnum ) { - break; - } - - while( oldnum < newnum ) { - // one or more entities from the old packet are unchanged - if( cl_shownet->integer > 2 ) { - Com_Printf( " unchanged: %i\n", oldnum ); - } - CL_ParseDeltaEntity( frame, oldnum, oldstate, 0 ); - - oldindex++; - - if( oldindex >= oldframe->numEntities ) { - oldnum = 99999; - } else { - i = oldframe->firstEntity + oldindex; - oldstate = &cl.entityStates[i & PARSE_ENTITIES_MASK]; - oldnum = oldstate->number; - } - } - - if( bits & U_REMOVE ) { - // the entity present in oldframe is not in the current frame - if( cl_shownet->integer > 2 ) { - Com_Printf( " remove: %i\n", newnum ); - } - if( oldnum != newnum ) { - Com_DPrintf( "U_REMOVE: oldnum != newnum\n" ); - } - if( !oldframe ) { - Com_Error( ERR_DROP, "U_REMOVE: NULL oldframe" ); - } - - oldindex++; - - if( oldindex >= oldframe->numEntities ) { - oldnum = 99999; - } else { - i = oldframe->firstEntity + oldindex; - oldstate = &cl.entityStates[i & PARSE_ENTITIES_MASK]; - oldnum = oldstate->number; - } - continue; - } - - if( oldnum == newnum ) { - // delta from previous state - if( cl_shownet->integer > 2 ) { - Com_Printf( " delta: %i ", newnum ); - } - CL_ParseDeltaEntity( frame, newnum, oldstate, bits ); - if( cl_shownet->integer > 2 ) { - Com_Printf( "\n" ); - } - - oldindex++; - - if( oldindex >= oldframe->numEntities ) { - oldnum = 99999; - } else { - i = oldframe->firstEntity + oldindex; - oldstate = &cl.entityStates[i & PARSE_ENTITIES_MASK]; - oldnum = oldstate->number; - } - continue; - } - - if( oldnum > newnum ) { - // delta from baseline - if( cl_shownet->integer > 2 ) { - Com_Printf( " baseline: %i ", newnum ); - } - CL_ParseDeltaEntity( frame, newnum, &cl.baselines[newnum], bits ); - if( cl_shownet->integer > 2 ) { - Com_Printf( "\n" ); - } - continue; - } - - } - - // any remaining entities in the old frame are copied over - while( oldnum != 99999 ) { - // one or more entities from the old packet are unchanged - if( cl_shownet->integer > 2 ) { - Com_Printf( " unchanged: %i\n", oldnum ); - } - CL_ParseDeltaEntity( frame, oldnum, oldstate, 0 ); - - oldindex++; - - if( oldindex >= oldframe->numEntities ) { - oldnum = 99999; - } else { - i = oldframe->firstEntity + oldindex; - oldstate = &cl.entityStates[i & PARSE_ENTITIES_MASK]; - oldnum = oldstate->number; - } - } + int newnum; + int bits; + entity_state_t *oldstate; + int oldindex, oldnum; + int i; + + frame->firstEntity = cl.numEntityStates; + frame->numEntities = 0; + + // delta from the entities present in oldframe + oldindex = 0; + oldstate = NULL; + if( !oldframe ) { + oldnum = 99999; + } else { + if( oldindex >= oldframe->numEntities ) { + oldnum = 99999; + } else { + i = oldframe->firstEntity + oldindex; + oldstate = &cl.entityStates[i & PARSE_ENTITIES_MASK]; + oldnum = oldstate->number; + } + } + + while( 1 ) { + newnum = MSG_ParseEntityBits( &bits ); + if( newnum < 0 || newnum >= MAX_EDICTS ) { + Com_Error( ERR_DROP, "%s: bad number: %d", __func__, newnum ); + } + + if( msg_read.readcount > msg_read.cursize ) { + Com_Error( ERR_DROP, "%s: read past end of message", __func__ ); + } + + if( !newnum ) { + break; + } + + while( oldnum < newnum ) { + // one or more entities from the old packet are unchanged + if( cl_shownet->integer > 2 ) { + Com_Printf( " unchanged: %i\n", oldnum ); + } + CL_ParseDeltaEntity( frame, oldnum, oldstate, 0 ); + + oldindex++; + + if( oldindex >= oldframe->numEntities ) { + oldnum = 99999; + } else { + i = oldframe->firstEntity + oldindex; + oldstate = &cl.entityStates[i & PARSE_ENTITIES_MASK]; + oldnum = oldstate->number; + } + } + + if( bits & U_REMOVE ) { + // the entity present in oldframe is not in the current frame + if( cl_shownet->integer > 2 ) { + Com_Printf( " remove: %i\n", newnum ); + } + if( oldnum != newnum ) { + Com_DPrintf( "U_REMOVE: oldnum != newnum\n" ); + } + if( !oldframe ) { + Com_Error( ERR_DROP, "U_REMOVE: NULL oldframe" ); + } + + oldindex++; + + if( oldindex >= oldframe->numEntities ) { + oldnum = 99999; + } else { + i = oldframe->firstEntity + oldindex; + oldstate = &cl.entityStates[i & PARSE_ENTITIES_MASK]; + oldnum = oldstate->number; + } + continue; + } + + if( oldnum == newnum ) { + // delta from previous state + if( cl_shownet->integer > 2 ) { + Com_Printf( " delta: %i ", newnum ); + } + CL_ParseDeltaEntity( frame, newnum, oldstate, bits ); + if( cl_shownet->integer > 2 ) { + Com_Printf( "\n" ); + } + + oldindex++; + + if( oldindex >= oldframe->numEntities ) { + oldnum = 99999; + } else { + i = oldframe->firstEntity + oldindex; + oldstate = &cl.entityStates[i & PARSE_ENTITIES_MASK]; + oldnum = oldstate->number; + } + continue; + } + + if( oldnum > newnum ) { + // delta from baseline + if( cl_shownet->integer > 2 ) { + Com_Printf( " baseline: %i ", newnum ); + } + CL_ParseDeltaEntity( frame, newnum, &cl.baselines[newnum], bits ); + if( cl_shownet->integer > 2 ) { + Com_Printf( "\n" ); + } + continue; + } + + } + + // any remaining entities in the old frame are copied over + while( oldnum != 99999 ) { + // one or more entities from the old packet are unchanged + if( cl_shownet->integer > 2 ) { + Com_Printf( " unchanged: %i\n", oldnum ); + } + CL_ParseDeltaEntity( frame, oldnum, oldstate, 0 ); + + oldindex++; + + if( oldindex >= oldframe->numEntities ) { + oldnum = 99999; + } else { + i = oldframe->firstEntity + oldindex; + oldstate = &cl.entityStates[i & PARSE_ENTITIES_MASK]; + oldnum = oldstate->number; + } + } } /* @@ -439,30 +425,30 @@ CL_SetActiveState */ static void CL_SetActiveState( void ) { cl.serverdelta = cl.frame.number; - cl.time = cl.servertime = 0; // set time, needed for demos - cls.state = ca_active; - cl.oldframe.valid = qfalse; + cl.time = cl.servertime = 0; // set time, needed for demos + cls.state = ca_active; + cl.oldframe.valid = qfalse; cl.frameflags = 0; cl.putaway = qfalse; if( cls.netchan ) { cl.initialSeq = cls.netchan->outgoing_sequence; } - if( !cls.demoplayback ) { + if( !cls.demo.playback ) { VectorScale( cl.frame.ps.pmove.origin, 0.125f, cl.predicted_origin ); - VectorCopy( cl.frame.ps.viewangles, cl.predicted_angles ); - } - - SCR_LagClear(); + VectorCopy( cl.frame.ps.viewangles, cl.predicted_angles ); + } + + SCR_LagClear(); #if USE_CHATHUD - SCR_ClearChatHUD_f(); + SCR_ClearChatHUD_f(); #endif - SCR_EndLoadingPlaque (); // get rid of loading plaque - Con_Close(); // close console + SCR_EndLoadingPlaque (); // get rid of loading plaque + Con_Close(); // close console EXEC_TRIGGER( cl_beginmapcmd ); - Cvar_Set( "cl_paused", "0" ); + Cvar_Set( "cl_paused", "0" ); } /* @@ -471,202 +457,202 @@ CL_ParseFrame ================ */ static void CL_ParseFrame( int extrabits ) { - uint32_t bits, extraflags; - int currentframe, deltaframe, + uint32_t bits, extraflags; + int currentframe, deltaframe, delta, surpressed; - server_frame_t frame, *oldframe; - player_state_t *from; - int length; - - memset( &frame, 0, sizeof( frame ) ); + server_frame_t frame, *oldframe; + player_state_t *from; + int length; + + memset( &frame, 0, sizeof( frame ) ); cl.frameflags = 0; surpressed = 0; - extraflags = 0; - if( cls.serverProtocol > PROTOCOL_VERSION_DEFAULT ) { - bits = MSG_ReadLong(); + extraflags = 0; + if( cls.serverProtocol > PROTOCOL_VERSION_DEFAULT ) { + bits = MSG_ReadLong(); - currentframe = bits & FRAMENUM_MASK; - delta = bits >> FRAMENUM_BITS; + currentframe = bits & FRAMENUM_MASK; + delta = bits >> FRAMENUM_BITS; - if( delta == 31 ) { - deltaframe = -1; - } else { - deltaframe = currentframe - delta; - } + if( delta == 31 ) { + deltaframe = -1; + } else { + deltaframe = currentframe - delta; + } - bits = MSG_ReadByte(); + bits = MSG_ReadByte(); - surpressed = bits & SURPRESSCOUNT_MASK; - if( cls.serverProtocol == PROTOCOL_VERSION_Q2PRO ) { + surpressed = bits & SURPRESSCOUNT_MASK; + if( cls.serverProtocol == PROTOCOL_VERSION_Q2PRO ) { cl.frameflags |= surpressed; } else if( surpressed ) { cl.frameflags |= FF_SURPRESSED; } - extraflags = ( extrabits << 4 ) | ( bits >> SURPRESSCOUNT_BITS ); - } else { - currentframe = MSG_ReadLong(); - deltaframe = MSG_ReadLong(); - - // BIG HACK to let old demos continue to work - if( cls.serverProtocol != PROTOCOL_VERSION_OLD ) { - surpressed = MSG_ReadByte(); + extraflags = ( extrabits << 4 ) | ( bits >> SURPRESSCOUNT_BITS ); + } else { + currentframe = MSG_ReadLong(); + deltaframe = MSG_ReadLong(); + + // BIG HACK to let old demos continue to work + if( cls.serverProtocol != PROTOCOL_VERSION_OLD ) { + surpressed = MSG_ReadByte(); if( surpressed ) { cl.frameflags |= FF_SURPRESSED; } - } - } + } + } - frame.number = currentframe; - frame.delta = deltaframe; + frame.number = currentframe; + frame.delta = deltaframe; if( cls.netchan && cls.netchan->dropped ) { cl.frameflags |= FF_SERVERDROP; } - /* If the frame is delta compressed from data that we - * no longer have available, we must suck up the rest of - * the frame, but not use it, then ask for a non-compressed - * message */ - if( deltaframe > 0 ) { - oldframe = &cl.frames[deltaframe & UPDATE_MASK]; - from = &oldframe->ps; - if( deltaframe == currentframe ) { + /* If the frame is delta compressed from data that we + * no longer have available, we must suck up the rest of + * the frame, but not use it, then ask for a non-compressed + * message */ + if( deltaframe > 0 ) { + oldframe = &cl.frames[deltaframe & UPDATE_MASK]; + from = &oldframe->ps; + if( deltaframe == currentframe ) { // old buggy q2 servers still cause this on map change - Com_DPrintf( "%s: delta from current frame\n", __func__ ); + Com_DPrintf( "%s: delta from current frame\n", __func__ ); cl.frameflags |= FF_BADFRAME; - } else if( oldframe->number != deltaframe ) { - // The frame that the server did the delta from - // is too old, so we can't reconstruct it properly. - Com_DPrintf( "%s: delta frame was never received or too old\n", __func__ ); + } else if( oldframe->number != deltaframe ) { + // The frame that the server did the delta from + // is too old, so we can't reconstruct it properly. + Com_DPrintf( "%s: delta frame was never received or too old\n", __func__ ); cl.frameflags |= FF_OLDFRAME; - } else if( !oldframe->valid ) { - // should never happen - Com_DPrintf( "%s: delta from invalid frame\n", __func__ ); + } else if( !oldframe->valid ) { + // should never happen + Com_DPrintf( "%s: delta from invalid frame\n", __func__ ); cl.frameflags |= FF_BADFRAME; - } else if( cl.numEntityStates - oldframe->firstEntity > - MAX_PARSE_ENTITIES - MAX_PACKET_ENTITIES ) - { - Com_DPrintf( "%s: delta entities too old\n", __func__ ); + } else if( cl.numEntityStates - oldframe->firstEntity > + MAX_PARSE_ENTITIES - MAX_PACKET_ENTITIES ) + { + Com_DPrintf( "%s: delta entities too old\n", __func__ ); cl.frameflags |= FF_OLDENT; - } else { - frame.valid = qtrue; // valid delta parse - } - if( !frame.valid && cl.frame.valid && cls.demoplayback ) { + } else { + frame.valid = qtrue; // valid delta parse + } + if( !frame.valid && cl.frame.valid && cls.demo.playback ) { Com_DPrintf( "%s: recovering broken demo\n", __func__ ); oldframe = &cl.frame; from = &oldframe->ps; frame.valid = qtrue; } - } else { - oldframe = NULL; - from = NULL; - frame.valid = qtrue; // uncompressed frame + } else { + oldframe = NULL; + from = NULL; + frame.valid = qtrue; // uncompressed frame //if( !cls.demowaiting ) { cl.frameflags |= FF_NODELTA; //} - //cls.demowaiting = qfalse; // we can start recording now - } - - // read areabits - length = MSG_ReadByte(); - if( length ) { - if( length < 0 || msg_read.readcount + length > msg_read.cursize ) { - Com_Error( ERR_DROP, "%s: read past end of message", __func__ ); - } - if( length > sizeof( frame.areabits ) ) { - Com_Error( ERR_DROP, "%s: invalid areabits length", __func__ ); - } - MSG_ReadData( frame.areabits, length ); - frame.areabytes = length; - } else { - frame.areabytes = 0; - } - - if( cls.serverProtocol <= PROTOCOL_VERSION_DEFAULT ) { - if( MSG_ReadByte() != svc_playerinfo ) { - Com_Error( ERR_DROP, "%s: not playerinfo", __func__ ); - } - } - - if( cl_shownet->integer > 2 ) { - Com_Printf( "%3"PRIz":playerinfo\n", msg_read.readcount - 1 ); - } - - // parse playerstate - bits = MSG_ReadShort(); - if( cls.serverProtocol > PROTOCOL_VERSION_DEFAULT ) { - MSG_ParseDeltaPlayerstate_Enhanced( from, &frame.ps, bits, extraflags ); - if( cl_shownet->integer > 2 ) { - MSG_ShowDeltaPlayerstateBits_Enhanced( bits ); - Com_Printf( "\n" ); - } - if( cls.serverProtocol == PROTOCOL_VERSION_Q2PRO ) { + //cls.demowaiting = qfalse; // we can start recording now + } + + // read areabits + length = MSG_ReadByte(); + if( length ) { + if( length < 0 || msg_read.readcount + length > msg_read.cursize ) { + Com_Error( ERR_DROP, "%s: read past end of message", __func__ ); + } + if( length > sizeof( frame.areabits ) ) { + Com_Error( ERR_DROP, "%s: invalid areabits length", __func__ ); + } + MSG_ReadData( frame.areabits, length ); + frame.areabytes = length; + } else { + frame.areabytes = 0; + } + + if( cls.serverProtocol <= PROTOCOL_VERSION_DEFAULT ) { + if( MSG_ReadByte() != svc_playerinfo ) { + Com_Error( ERR_DROP, "%s: not playerinfo", __func__ ); + } + } + + if( cl_shownet->integer > 2 ) { + Com_Printf( "%3"PRIz":playerinfo\n", msg_read.readcount - 1 ); + } + + // parse playerstate + bits = MSG_ReadShort(); + if( cls.serverProtocol > PROTOCOL_VERSION_DEFAULT ) { + MSG_ParseDeltaPlayerstate_Enhanced( from, &frame.ps, bits, extraflags ); + if( cl_shownet->integer > 2 ) { + MSG_ShowDeltaPlayerstateBits_Enhanced( bits ); + Com_Printf( "\n" ); + } + if( cls.serverProtocol == PROTOCOL_VERSION_Q2PRO ) { // parse clientNum - if( extraflags & EPS_CLIENTNUM ) { - frame.clientNum = MSG_ReadByte(); - } else if( oldframe ) { + if( extraflags & EPS_CLIENTNUM ) { + frame.clientNum = MSG_ReadByte(); + } else if( oldframe ) { frame.clientNum = oldframe->clientNum; } } else { - frame.clientNum = cl.clientNum; + frame.clientNum = cl.clientNum; } - } else { - MSG_ParseDeltaPlayerstate_Default( from, &frame.ps, bits ); - if( cl_shownet->integer > 2 ) { - MSG_ShowDeltaPlayerstateBits_Default( bits ); - Com_Printf( "\n" ); - } - frame.clientNum = cl.clientNum; - } - if( !frame.ps.fov ) { + } else { + MSG_ParseDeltaPlayerstate_Default( from, &frame.ps, bits ); + if( cl_shownet->integer > 2 ) { + MSG_ShowDeltaPlayerstateBits_Default( bits ); + Com_Printf( "\n" ); + } + frame.clientNum = cl.clientNum; + } + if( !frame.ps.fov ) { // fail out early to prevent spurious errors later Com_Error( ERR_DROP, "%s: bad fov", __func__ ); } - // parse packetentities - if( cls.serverProtocol <= PROTOCOL_VERSION_DEFAULT ) { - if( MSG_ReadByte() != svc_packetentities ) { - Com_Error( ERR_DROP, "%s: not packetentities", __func__ ); - } - } + // parse packetentities + if( cls.serverProtocol <= PROTOCOL_VERSION_DEFAULT ) { + if( MSG_ReadByte() != svc_packetentities ) { + Com_Error( ERR_DROP, "%s: not packetentities", __func__ ); + } + } - if( cl_shownet->integer > 2 ) { - Com_Printf( "%3"PRIz":packetentities\n", msg_read.readcount - 1 ); - } + if( cl_shownet->integer > 2 ) { + Com_Printf( "%3"PRIz":packetentities\n", msg_read.readcount - 1 ); + } - CL_ParsePacketEntities( oldframe, &frame ); + CL_ParsePacketEntities( oldframe, &frame ); - // save the frame off in the backup array for later delta comparisons - cl.frames[currentframe & UPDATE_MASK] = frame; + // save the frame off in the backup array for later delta comparisons + cl.frames[currentframe & UPDATE_MASK] = frame; - if( cl_shownet->integer > 2 ) { + if( cl_shownet->integer > 2 ) { int rtt = 0; - if( cls.netchan ) { + if( cls.netchan ) { int seq = cls.netchan->incoming_acknowledged & CMD_MASK; - rtt = cls.realtime - cl.history[seq].sent; - } - Com_Printf( "%3"PRIz":frame:%d delta:%d rtt:%d\n", - msg_read.readcount - 1, frame.number, frame.delta, rtt ); - } + rtt = cls.realtime - cl.history[seq].sent; + } + Com_Printf( "%3"PRIz":frame:%d delta:%d rtt:%d\n", + msg_read.readcount - 1, frame.number, frame.delta, rtt ); + } - if( !frame.valid ) { - cl.frame.valid = qfalse; - return; // do not change anything - } + if( !frame.valid ) { + cl.frame.valid = qfalse; + return; // do not change anything + } - cl.oldframe = cl.frame; - cl.frame = frame; + cl.oldframe = cl.frame; + cl.frame = frame; - // getting a valid frame message ends the connection process - if( cls.state == ca_precached ) { - CL_SetActiveState(); - } + // getting a valid frame message ends the connection process + if( cls.state == ca_precached ) { + CL_SetActiveState(); + } - CL_DeltaFrame(); + CL_DeltaFrame(); - CL_CheckPredictionError(); + CL_CheckPredictionError(); } @@ -679,7 +665,7 @@ static void CL_ParseFrame( int extrabits ) { */ static void CL_ConfigString( int index, const char *string, size_t length ) { - size_t maxlength; + size_t maxlength; if( index >= CS_STATUSBAR && index < CS_AIRACCEL ) { maxlength = MAX_QPATH * ( CS_AIRACCEL - index ); @@ -687,15 +673,15 @@ static void CL_ConfigString( int index, const char *string, size_t length ) { maxlength = MAX_QPATH; } if( length >= maxlength ) { - Com_Error( ERR_DROP, "%s: index %d overflowed", __func__, index ); + Com_Error( ERR_DROP, "%s: index %d overflowed", __func__, index ); } - memcpy( cl.configstrings[index], string, length + 1 ); + memcpy( cl.configstrings[index], string, length + 1 ); - // do something apropriate + // do something apropriate - if( index == CS_MAXCLIENTS ) { - cl.maxclients = atoi( string ); + if( index == CS_MAXCLIENTS ) { + cl.maxclients = atoi( string ); return; } if( index == CS_MODELS + 1 ) { @@ -706,34 +692,34 @@ static void CL_ConfigString( int index, const char *string, size_t length ) { cl.mapname[length - 9] = 0; // cut off ".bsp" return; } - if (index >= CS_LIGHTS && index < CS_LIGHTS+MAX_LIGHTSTYLES) { - CL_SetLightstyle( index - CS_LIGHTS, string, length ); + if (index >= CS_LIGHTS && index < CS_LIGHTS+MAX_LIGHTSTYLES) { + CL_SetLightstyle( index - CS_LIGHTS, string, length ); return; } - if( cls.state < ca_precached ) { + if( cls.state < ca_precached ) { return; } - if (index >= CS_MODELS && index < CS_MODELS+MAX_MODELS) { + if (index >= CS_MODELS && index < CS_MODELS+MAX_MODELS) { cl.model_draw[index-CS_MODELS] = ref.RegisterModel (string); if (*string == '*') cl.model_clip[index-CS_MODELS] = CM_InlineModel (&cl.cm, string); else cl.model_clip[index-CS_MODELS] = 0; - } else if (index >= CS_SOUNDS && index < CS_SOUNDS+MAX_MODELS) { - cl.sound_precache[index-CS_SOUNDS] = S_RegisterSound (string); - } else if (index >= CS_IMAGES && index < CS_IMAGES+MAX_MODELS) { - cl.image_precache[index-CS_IMAGES] = ref.RegisterPic (string); - } else if (index >= CS_PLAYERSKINS && index < CS_PLAYERSKINS+MAX_CLIENTS) { + } else if (index >= CS_SOUNDS && index < CS_SOUNDS+MAX_MODELS) { + cl.sound_precache[index-CS_SOUNDS] = S_RegisterSound (string); + } else if (index >= CS_IMAGES && index < CS_IMAGES+MAX_MODELS) { + cl.image_precache[index-CS_IMAGES] = ref.RegisterPic (string); + } else if (index >= CS_PLAYERSKINS && index < CS_PLAYERSKINS+MAX_CLIENTS) { CL_LoadClientinfo( &cl.clientinfo[index - CS_PLAYERSKINS], string ); - } else if( index == CS_AIRACCEL && !cl.pmp.qwmod ) { - cl.pmp.airaccelerate = atoi( string ) ? qtrue : qfalse; - } + } else if( index == CS_AIRACCEL && !cl.pmp.qwmod ) { + cl.pmp.airaccelerate = atoi( string ) ? qtrue : qfalse; + } } static void CL_ParseGamestate( void ) { - int index, bits; + int index, bits; char *string; size_t length; @@ -771,26 +757,26 @@ CL_ParseServerData ================== */ static void CL_ParseServerData( void ) { - char *str; - int i, protocol, attractloop; + char *str; + int i, protocol, attractloop; - Cbuf_Execute(); // make sure any stuffed commands are done - + Cbuf_Execute(); // make sure any stuffed commands are done + // wipe the client_state_t struct - CL_ClearState(); + CL_ClearState(); // parse protocol version number - protocol = MSG_ReadLong(); - cl.servercount = MSG_ReadLong(); - attractloop = MSG_ReadByte(); + protocol = MSG_ReadLong(); + cl.servercount = MSG_ReadLong(); + attractloop = MSG_ReadByte(); - Com_DPrintf( "Serverdata packet received (protocol=%d, servercount=%d, attractloop=%d)\n", - protocol, cl.servercount, attractloop ); + Com_DPrintf( "Serverdata packet received (protocol=%d, servercount=%d, attractloop=%d)\n", + protocol, cl.servercount, attractloop ); // check protocol - if( cls.serverProtocol != protocol ) { - if( !cls.demoplayback ) { - Com_Error( ERR_DROP, "Requested protocol version %d, but server returned %d.", + if( cls.serverProtocol != protocol ) { + if( !cls.demo.playback ) { + Com_Error( ERR_DROP, "Requested protocol version %d, but server returned %d.", cls.serverProtocol, protocol ); } @@ -800,38 +786,38 @@ static void CL_ParseServerData( void ) { } else if( protocol < PROTOCOL_VERSION_DEFAULT || protocol > PROTOCOL_VERSION_Q2PRO ) { Com_Error( ERR_DROP, "Demo uses unsupported protocol version %d.", protocol ); } - cls.serverProtocol = protocol; - } - - // game directory - str = MSG_ReadString(); - Q_strncpyz( cl.gamedir, str, sizeof( cl.gamedir ) ); + cls.serverProtocol = protocol; + } - // never allow demos to change gamedir - // do not set gamedir if connected to local sever, - // since it was already done by SV_InitGame - if( !cls.demoplayback && !sv_running->integer ) { - Cvar_UserSet( "game", cl.gamedir ); - if( FS_NeedRestart() ) { - CL_RestartFilesystem(); - } - } + // game directory + str = MSG_ReadString(); + Q_strncpyz( cl.gamedir, str, sizeof( cl.gamedir ) ); + + // never allow demos to change gamedir + // do not set gamedir if connected to local sever, + // since it was already done by SV_InitGame + if( !cls.demo.playback && !sv_running->integer ) { + Cvar_UserSet( "game", cl.gamedir ); + if( FS_NeedRestart() ) { + CL_RestartFilesystem(); + } + } - // parse player entity number - cl.clientNum = MSG_ReadShort(); + // parse player entity number + cl.clientNum = MSG_ReadShort(); - // get the full level name - str = MSG_ReadString(); + // get the full level name + str = MSG_ReadString(); // setup default pmove parameters - cl.pmp.speedMultiplier = 1; - cl.pmp.maxspeed = 300; -// cl.pmp.upspeed = 350; - cl.pmp.friction = 6; - cl.pmp.waterfriction = 1; + cl.pmp.speedMultiplier = 1; + cl.pmp.maxspeed = 300; +// cl.pmp.upspeed = 350; + cl.pmp.friction = 6; + cl.pmp.waterfriction = 1; cl.pmp.flyfriction = 9; - cl.pmp.airaccelerate = 0; - cl.gametype = GT_DEATHMATCH; + cl.pmp.airaccelerate = 0; + cl.gametype = GT_DEATHMATCH; #ifdef PMOVE_HACK cl.pmp.highprec = qtrue; #endif @@ -840,61 +826,61 @@ static void CL_ParseServerData( void ) { cl.frametime = 100; cl.framefrac = 0.01f; - if( cls.serverProtocol == PROTOCOL_VERSION_R1Q2 ) { - i = MSG_ReadByte(); - if( i ) { - Com_Error( ERR_DROP, "'Enhanced' R1Q2 servers are not supported" ); - } - i = MSG_ReadShort(); - if( !R1Q2_SUPPORTED( i ) ) { - Com_Error( ERR_DROP, "Unsupported R1Q2 protocol version %d.\n" + if( cls.serverProtocol == PROTOCOL_VERSION_R1Q2 ) { + i = MSG_ReadByte(); + if( i ) { + Com_Error( ERR_DROP, "'Enhanced' R1Q2 servers are not supported" ); + } + i = MSG_ReadShort(); + if( !R1Q2_SUPPORTED( i ) ) { + Com_Error( ERR_DROP, "Unsupported R1Q2 protocol version %d.\n" "Current client version is %d.", i, PROTOCOL_VERSION_R1Q2_CURRENT ); - } + } cls.protocolVersion = i; - i = MSG_ReadByte(); - if( i ) { // seems to be no longer used - Com_DPrintf( "R1Q2 advancedDeltas enabled\n" ); - } - cl.pmp.strafeHack = MSG_ReadByte(); - if( cl.pmp.strafeHack ) { - Com_DPrintf( "R1Q2 strafeHack enabled\n" ); - } - cl.pmp.speedMultiplier = 2; - } else if( cls.serverProtocol == PROTOCOL_VERSION_Q2PRO ) { - i = MSG_ReadShort(); - if( !Q2PRO_SUPPORTED( i ) ) { - Com_Error( ERR_DROP, "Unsupported Q2PRO protocol version %d.\n" + i = MSG_ReadByte(); + if( i ) { // seems to be no longer used + Com_DPrintf( "R1Q2 advancedDeltas enabled\n" ); + } + cl.pmp.strafeHack = MSG_ReadByte(); + if( cl.pmp.strafeHack ) { + Com_DPrintf( "R1Q2 strafeHack enabled\n" ); + } + cl.pmp.speedMultiplier = 2; + } else if( cls.serverProtocol == PROTOCOL_VERSION_Q2PRO ) { + i = MSG_ReadShort(); + if( !Q2PRO_SUPPORTED( i ) ) { + Com_Error( ERR_DROP, "Unsupported Q2PRO protocol version %d.\n" "Current client version is %d.", i, PROTOCOL_VERSION_Q2PRO_CURRENT ); - } + } cls.protocolVersion = i; - cl.gametype = MSG_ReadByte(); - cl.pmp.strafeHack = MSG_ReadByte(); - cl.pmp.qwmod = MSG_ReadByte(); //atu QWMod - cl.pmp.speedMultiplier = 2; + cl.gametype = MSG_ReadByte(); + cl.pmp.strafeHack = MSG_ReadByte(); + cl.pmp.qwmod = MSG_ReadByte(); //atu QWMod + cl.pmp.speedMultiplier = 2; cl.pmp.flyfix = qtrue; cl.pmp.flyfriction = 4; - if( cl.pmp.strafeHack ) { - Com_DPrintf( "Q2PRO strafeHack enabled\n" ); - } - if( cl.pmp.qwmod ) { - Com_DPrintf( "Q2PRO QWMod enabled\n" ); - - cl.pmp.maxspeed = 320; - //cl.pmp.upspeed = ((cl.pmp.qwmod == 2) ? 310 : 350); - cl.pmp.friction = 4; - cl.pmp.waterfriction = 4; - cl.pmp.airaccelerate = qtrue; - } - } - - if( cl.clientNum == -1 ) { - // tell the server to advance to the next map / cinematic - CL_ClientCommand( va( "nextserver %i\n", cl.servercount ) ); - } else { - // seperate the printfs so the server message can have a color - 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" ); - Con_Printf( S_COLOR_ALT "%s\n\n", str ); + if( cl.pmp.strafeHack ) { + Com_DPrintf( "Q2PRO strafeHack enabled\n" ); + } + if( cl.pmp.qwmod ) { + Com_DPrintf( "Q2PRO QWMod enabled\n" ); + + cl.pmp.maxspeed = 320; + //cl.pmp.upspeed = ((cl.pmp.qwmod == 2) ? 310 : 350); + cl.pmp.friction = 4; + cl.pmp.waterfriction = 4; + cl.pmp.airaccelerate = qtrue; + } + } + + if( cl.clientNum == -1 ) { + // tell the server to advance to the next map / cinematic + CL_ClientCommand( va( "nextserver %i\n", cl.servercount ) ); + } else { + // seperate the printfs so the server message can have a color + 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" ); + Con_Printf( S_COLOR_ALT "%s\n\n", str ); Sys_Printf( "\n\n%s\n", str ); @@ -902,7 +888,7 @@ static void CL_ParseServerData( void ) { if( cl.clientNum < 0 || cl.clientNum >= MAX_CLIENTS ) { cl.clientNum = CLIENTNUM_NONE; } - } + } } @@ -912,14 +898,14 @@ CL_ParseBaseline ================== */ static void CL_ParseBaseline( void ) { - int bits; - int newnum; - - newnum = MSG_ParseEntityBits( &bits ); - if( newnum < 1 || newnum >= MAX_EDICTS ) { - Com_Error( ERR_DROP, "CL_ParseBaseline: bad entity number %i", newnum ); - } - MSG_ParseDeltaEntity( NULL, &cl.baselines[newnum], newnum, bits ); + int bits; + int newnum; + + newnum = MSG_ParseEntityBits( &bits ); + if( newnum < 1 || newnum >= MAX_EDICTS ) { + Com_Error( ERR_DROP, "CL_ParseBaseline: bad entity number %i", newnum ); + } + MSG_ParseDeltaEntity( NULL, &cl.baselines[newnum], newnum, bits ); } /* @@ -929,22 +915,22 @@ CL_LoadClientinfo ================ */ void CL_LoadClientinfo( clientinfo_t *ci, const char *s ) { - int i; - char *t; - char model_name[MAX_QPATH]; - char skin_name[MAX_QPATH]; - char model_filename[MAX_QPATH]; - char skin_filename[MAX_QPATH]; - char weapon_filename[MAX_QPATH]; - char icon_filename[MAX_QPATH]; - - // isolate the player's name - strcpy( ci->name, s ); - t = strchr( s, '\\' ); - if( t ) { - ci->name[ t - s ] = 0; - s = t + 1; - } + int i; + char *t; + char model_name[MAX_QPATH]; + char skin_name[MAX_QPATH]; + char model_filename[MAX_QPATH]; + char skin_filename[MAX_QPATH]; + char weapon_filename[MAX_QPATH]; + char icon_filename[MAX_QPATH]; + + // isolate the player's name + strcpy( ci->name, s ); + t = strchr( s, '\\' ); + if( t ) { + ci->name[ t - s ] = 0; + s = t + 1; + } strcpy( model_name, s ); @@ -1040,15 +1026,15 @@ void CL_LoadClientinfo( clientinfo_t *ci, const char *s ) { strcpy( ci->model_name, model_name ); strcpy( ci->skin_name, skin_name ); - // must have loaded all data types to be valid - if( !ci->skin || !ci->icon || !ci->model || !ci->weaponmodel[0] ) { - ci->skin = 0; - ci->icon = 0; - ci->model = 0; - ci->weaponmodel[0] = 0; + // must have loaded all data types to be valid + if( !ci->skin || !ci->icon || !ci->model || !ci->weaponmodel[0] ) { + ci->skin = 0; + ci->icon = 0; + ci->model = 0; + ci->weaponmodel[0] = 0; ci->model_name[0] = 0; ci->skin_name[0] = 0; - } + } } @@ -1058,21 +1044,21 @@ CL_ParseConfigString ================ */ static void CL_ParseConfigString (void) { - int i; - char *s; + int i; + char *s; size_t length; - i = MSG_ReadShort (); - if (i < 0 || i >= MAX_CONFIGSTRINGS) - Com_Error( ERR_DROP, "%s: bad index: %d", __func__, i ); + i = MSG_ReadShort (); + if (i < 0 || i >= MAX_CONFIGSTRINGS) + Com_Error( ERR_DROP, "%s: bad index: %d", __func__, i ); - s = MSG_ReadStringLength( &length ); + s = MSG_ReadStringLength( &length ); - if( cl_shownet->integer > 2 ) { - Com_Printf( " %i \"%s\"\n", i, Q_FormatString( s ) ); - } + if( cl_shownet->integer > 2 ) { + Com_Printf( " %i \"%s\"\n", i, Q_FormatString( s ) ); + } - if( cls.demorecording && cls.demopaused ) { + if( cls.demo.recording && cls.demo.paused ) { Q_SetBit( cl.dcs, i ); } @@ -1095,73 +1081,73 @@ CL_ParseStartSoundPacket */ static void CL_ParseStartSoundPacket( void ) { vec3_t pos_v; - float *pos; - int channel, ent; - int sound_num; - float volume; - float attenuation; - int flags; - float ofs; - - flags = MSG_ReadByte(); - sound_num = MSG_ReadByte(); - if( sound_num == -1 ) { - Com_Error( ERR_DROP, "%s: read past end of message", __func__ ); - } + float *pos; + int channel, ent; + int sound_num; + float volume; + float attenuation; + int flags; + float ofs; + + flags = MSG_ReadByte(); + sound_num = MSG_ReadByte(); + if( sound_num == -1 ) { + Com_Error( ERR_DROP, "%s: read past end of message", __func__ ); + } if( flags & SND_VOLUME ) - volume = MSG_ReadByte() / 255.0; - else - volume = DEFAULT_SOUND_PACKET_VOLUME; - + volume = MSG_ReadByte() / 255.0; + else + volume = DEFAULT_SOUND_PACKET_VOLUME; + if( flags & SND_ATTENUATION ) - attenuation = MSG_ReadByte() / 64.0; - else - attenuation = DEFAULT_SOUND_PACKET_ATTENUATION; + attenuation = MSG_ReadByte() / 64.0; + else + attenuation = DEFAULT_SOUND_PACKET_ATTENUATION; if( flags & SND_OFFSET ) - ofs = MSG_ReadByte() / 1000.0; - else - ofs = 0; - - if( flags & SND_ENT ) { - // entity relative - channel = MSG_ReadShort(); - ent = channel >> 3; - if( ent < 0 || ent >= MAX_EDICTS ) - Com_Error( ERR_DROP, "%s: bad ent: %d", __func__, ent ); - channel &= 7; - } else { - ent = 0; - channel = 0; - } - - if( flags & SND_POS ) { - // positioned in space - MSG_ReadPos( pos_v ); - pos = pos_v; - } else { - if( !( flags & SND_ENT ) ) { - Com_Error( ERR_DROP, "%s: neither SND_ENT nor SND_POS set", __func__ ); - } + ofs = MSG_ReadByte() / 1000.0; + else + ofs = 0; + + if( flags & SND_ENT ) { + // entity relative + channel = MSG_ReadShort(); + ent = channel >> 3; + if( ent < 0 || ent >= MAX_EDICTS ) + Com_Error( ERR_DROP, "%s: bad ent: %d", __func__, ent ); + channel &= 7; + } else { + ent = 0; + channel = 0; + } + + if( flags & SND_POS ) { + // positioned in space + MSG_ReadPos( pos_v ); + pos = pos_v; + } else { + if( !( flags & SND_ENT ) ) { + Com_Error( ERR_DROP, "%s: neither SND_ENT nor SND_POS set", __func__ ); + } if( cl_entities[ent].serverframe != cl.frame.number ) { if( cl_entities[ent].serverframe ) { - Com_DPrintf( "BUG: sound on entity %d last seen %d frames ago\n", + Com_DPrintf( "SERVER BUG: sound on entity %d last seen %d frames ago\n", ent, cl.frame.number - cl_entities[ent].serverframe ); } else { - Com_DPrintf( "BUG: sound on entity %d we have never seen\n", ent ); + Com_DPrintf( "SERVER BUG: sound on entity %d we have never seen\n", ent ); } } - // use entity number - pos = NULL; - } + // use entity number + pos = NULL; + } - if( cl_shownet->integer > 2 ) { - Com_Printf( " %s\n", cl.configstrings[CS_SOUNDS+sound_num] ); - } + if( cl_shownet->integer > 2 ) { + Com_Printf( " %s\n", cl.configstrings[CS_SOUNDS+sound_num] ); + } - if( cl.sound_precache[sound_num] ) { - S_StartSound( pos, ent, channel, cl.sound_precache[sound_num], + if( cl.sound_precache[sound_num] ) { + S_StartSound( pos, ent, channel, cl.sound_precache[sound_num], volume, attenuation, ofs ); } } @@ -1172,30 +1158,28 @@ CL_ParseReconnect ===================== */ static void CL_ParseReconnect( void ) { - if( cls.demoplayback ) { - return; - } + if( cls.demo.playback ) { + return; + } S_StopAllSounds(); - if ( cls.demorecording ) + if( cls.demo.recording ) CL_Stop_f(); - Com_Printf( "Server disconnected, reconnecting\n" ); - if( cls.download ) { - FS_FCloseFile( cls.download ); - cls.download = 0; - } + Com_Printf( "Server disconnected, reconnecting\n" ); - EXEC_TRIGGER( cl_changemapcmd ); + if( cls.download.file ) { + FS_FCloseFile( cls.download.file ); + } + memset( &cls.download, 0, sizeof( cls.download ) ); - cls.downloadtempname[0] = 0; - cls.downloadname[0] = 0; + EXEC_TRIGGER( cl_changemapcmd ); - CL_ClearState(); - cls.state = ca_challenging; + CL_ClearState(); + cls.state = ca_challenging; cls.connect_time = cls.realtime - CONNECT_DELAY; - cls.connect_count = 0; + cls.connect_count = 0; } #if USE_AUTOREPLY @@ -1207,10 +1191,6 @@ CL_CheckForVersion static void CL_CheckForVersion( const char *string ) { char *p; - if( cls.demoplayback ) { - return; - } - p = strstr( string, ": " ); if( !p ) { return; @@ -1236,29 +1216,31 @@ CL_ParsePrint ===================== */ static void CL_ParsePrint( void ) { - int level; - char *string; + int level; + char *string; - level = MSG_ReadByte(); - string = MSG_ReadString(); + level = MSG_ReadByte(); + string = MSG_ReadString(); - if( cl_shownet->integer > 2 ) { - Com_Printf( " %i \"%s\"\n", level, Q_FormatString( string ) ); - } + if( cl_shownet->integer > 2 ) { + Com_Printf( " %i \"%s\"\n", level, Q_FormatString( string ) ); + } - if( level != PRINT_CHAT ) { - Com_Printf( "%s", string ); - return; - } + if( level != PRINT_CHAT ) { + Com_Printf( "%s", string ); + return; + } #if USE_AUTOREPLY - CL_CheckForVersion( string ); + if( !cls.demo.playback ) { + CL_CheckForVersion( string ); + } #endif - // disable notify - if( !cl_chat_notify->integer ) { - Con_SkipNotify( qtrue ); - } + // disable notify + if( !cl_chat_notify->integer ) { + Con_SkipNotify( qtrue ); + } // filter text if( cl_chat_filter->integer ) { @@ -1266,19 +1248,19 @@ static void CL_ParsePrint( void ) { string[len] = '\n'; } - Com_Printf( S_COLOR_ALT "%s", string ); + Com_Printf( S_COLOR_ALT "%s", string ); - Con_SkipNotify( qfalse ); + Con_SkipNotify( qfalse ); #if USE_CHATHUD - SCR_AddToChatHUD( string ); + SCR_AddToChatHUD( string ); #endif // play sound - if( cl_chat_sound->string[0] ) { - S_StartLocalSound_( cl_chat_sound->string ); - } - + if( cl_chat_sound->string[0] ) { + S_StartLocalSound_( cl_chat_sound->string ); + } + } /* @@ -1287,13 +1269,13 @@ CL_ParseCenterPrint ===================== */ static void CL_ParseCenterPrint( void ) { - char *s; + char *s; - s = MSG_ReadString(); + s = MSG_ReadString(); - if( cl_shownet->integer > 2 ) { - Com_Printf( " \"%s\"\n", Q_FormatString( s ) ); - } + if( cl_shownet->integer > 2 ) { + Com_Printf( " \"%s\"\n", Q_FormatString( s ) ); + } SCR_CenterPrint( s ); } @@ -1304,29 +1286,29 @@ CL_ParseStuffText ===================== */ static void CL_ParseStuffText( void ) { - char *s, *p; + char *s, *p; - s = MSG_ReadString(); + s = MSG_ReadString(); - //if( cl_shownet->integer > 2 ) { - // Com_Printf( " \"%s\"\n", Q_FormatString( s ) ); - //} + //if( cl_shownet->integer > 2 ) { + // Com_Printf( " \"%s\"\n", Q_FormatString( s ) ); + //} // FIXME: this is uuugly... - if( cls.demoplayback && + if( cls.demo.playback && strcmp( s, "precache\n" ) && strcmp( s, "changing\n" ) && ( strncmp( s, "play ", 5 ) || !( p = strchr( s, '\n' ) ) || p[1] || strchr( s, ';' ) || strchr( s, '$' ) ) && strcmp( s, "reconnect\n" ) ) { - Com_DPrintf( "ignored stufftext: %s\n", s ); - return; - } + Com_DPrintf( "ignored stufftext: %s\n", s ); + return; + } - Com_DPrintf( "stufftext: %s\n", Q_FormatString( s ) ); + Com_DPrintf( "stufftext: %s\n", Q_FormatString( s ) ); - Cbuf_AddText( s ); + Cbuf_AddText( s ); } /* @@ -1335,15 +1317,15 @@ CL_ParseLayout ===================== */ static void CL_ParseLayout( void ) { - char *s; + char *s; - s = MSG_ReadString(); + s = MSG_ReadString(); - if( cl_shownet->integer > 2 ) { - Com_Printf( " \"%s\"\n", Q_FormatString( s ) ); - } + if( cl_shownet->integer > 2 ) { + Com_Printf( " \"%s\"\n", Q_FormatString( s ) ); + } - Q_strncpyz( cl.layout, s, sizeof( cl.layout ) ); + Q_strncpyz( cl.layout, s, sizeof( cl.layout ) ); cl.putaway = qfalse; } @@ -1353,32 +1335,32 @@ CL_ParseInventory ================ */ static void CL_ParseInventory( void ) { - int i; + int i; - for( i = 0; i < MAX_ITEMS; i++ ) { - cl.inventory[i] = MSG_ReadShort(); - } + for( i = 0; i < MAX_ITEMS; i++ ) { + cl.inventory[i] = MSG_ReadShort(); + } cl.putaway = qfalse; } static void CL_ParseZPacket( void ) { #if USE_ZLIB - sizebuf_t temp; - byte buffer[MAX_MSGLEN]; - unsigned inlen, outlen; + sizebuf_t temp; + byte buffer[MAX_MSGLEN]; + unsigned inlen, outlen; - if( msg_read.data != msg_read_buffer ) { - Com_Error( ERR_DROP, "%s: recursively entered", __func__ ); - } + if( msg_read.data != msg_read_buffer ) { + Com_Error( ERR_DROP, "%s: recursively entered", __func__ ); + } - inlen = MSG_ReadShort(); + inlen = MSG_ReadShort(); if( msg_read.readcount + inlen > msg_read.cursize ) { - Com_Error( ERR_DROP, "%s: read past end of message", __func__ ); + Com_Error( ERR_DROP, "%s: read past end of message", __func__ ); } - outlen = MSG_ReadShort(); + outlen = MSG_ReadShort(); if( outlen > MAX_MSGLEN ) { - Com_Error( ERR_DROP, "%s: invalid output length", __func__ ); + Com_Error( ERR_DROP, "%s: invalid output length", __func__ ); } inflateReset( &cls.z ); @@ -1387,30 +1369,30 @@ static void CL_ParseZPacket( void ) { cls.z.avail_in = inlen; cls.z.next_out = buffer; cls.z.avail_out = outlen; - if( inflate( &cls.z, Z_FINISH ) != Z_STREAM_END ) { - Com_Error( ERR_DROP, "%s: inflate() failed: %s", __func__, cls.z.msg ); + if( inflate( &cls.z, Z_FINISH ) != Z_STREAM_END ) { + Com_Error( ERR_DROP, "%s: inflate() failed: %s", __func__, cls.z.msg ); } - msg_read.readcount += inlen; + msg_read.readcount += inlen; - temp = msg_read; + temp = msg_read; SZ_Init( &msg_read, buffer, outlen ); msg_read.cursize = outlen; CL_ParseServerMessage(); - msg_read = temp; + msg_read = temp; #else - Com_Error( ERR_DROP, "Compressed server packet received, " + Com_Error( ERR_DROP, "Compressed server packet received, " "but no zlib support linked in." ); #endif } static void CL_ParseSetting( void ) { - uint32_t index, value; + uint32_t index, value; - index = MSG_ReadLong(); - value = MSG_ReadLong(); + index = MSG_ReadLong(); + value = MSG_ReadLong(); switch( index ) { case SVS_FPS: @@ -1431,147 +1413,147 @@ CL_ParseServerMessage ===================== */ void CL_ParseServerMessage( void ) { - int cmd, extrabits; - size_t readcount; + int cmd, extrabits; + size_t readcount; - if( cl_shownet->integer == 1 ) { - Com_Printf( "%"PRIz" ", msg_read.cursize ); - } else if( cl_shownet->integer > 1 ) { - Com_Printf( "------------------\n" ); - } + if( cl_shownet->integer == 1 ) { + Com_Printf( "%"PRIz" ", msg_read.cursize ); + } else if( cl_shownet->integer > 1 ) { + Com_Printf( "------------------\n" ); + } // // parse the message // - while( 1 ) { - if( msg_read.readcount > msg_read.cursize ) { - Com_Error( ERR_DROP, "%s: read past end of server message", __func__ ); - } + while( 1 ) { + if( msg_read.readcount > msg_read.cursize ) { + Com_Error( ERR_DROP, "%s: read past end of server message", __func__ ); + } readcount = msg_read.readcount; - if( ( cmd = MSG_ReadByte() ) == -1 ) { - if( cl_shownet->integer > 1 ) { - Com_Printf( "%3"PRIz":END OF MESSAGE\n", msg_read.readcount - 1 ); - } - break; - } - - extrabits = cmd >> SVCMD_BITS; - cmd &= SVCMD_MASK; - - if( cl_shownet->integer > 1 ) { - MSG_ShowSVC( cmd ); - } - - // other commands - switch( cmd ) { - default: + if( ( cmd = MSG_ReadByte() ) == -1 ) { + if( cl_shownet->integer > 1 ) { + Com_Printf( "%3"PRIz":END OF MESSAGE\n", msg_read.readcount - 1 ); + } + break; + } + + extrabits = cmd >> SVCMD_BITS; + cmd &= SVCMD_MASK; + + if( cl_shownet->integer > 1 ) { + MSG_ShowSVC( cmd ); + } + + // other commands + switch( cmd ) { + default: badbyte: - Com_Error( ERR_DROP, "%s: illegible server message: %d", __func__, cmd ); - break; - - case svc_nop: - break; - - case svc_disconnect: - Com_Error( ERR_DISCONNECT, "Server disconnected" ); - break; - - case svc_reconnect: - CL_ParseReconnect(); - return; - - case svc_print: - CL_ParsePrint(); - break; - - case svc_centerprint: - CL_ParseCenterPrint(); - break; - - case svc_stufftext: - CL_ParseStuffText(); - break; - - case svc_serverdata: - CL_ParseServerData(); - break; - - case svc_configstring: - CL_ParseConfigString(); - break; - - case svc_sound: - CL_ParseStartSoundPacket(); - break; - - case svc_spawnbaseline: - CL_ParseBaseline(); - break; - - case svc_temp_entity: - CL_ParseTEnt(); - break; - - case svc_muzzleflash: - CL_ParseMuzzleFlash(); - break; - - case svc_muzzleflash2: - CL_ParseMuzzleFlash2(); - break; - - case svc_download: - CL_ParseDownload(); - continue; - - case svc_frame: - CL_ParseFrame( extrabits ); - continue; - - case svc_inventory: - CL_ParseInventory(); - break; - - case svc_layout: - CL_ParseLayout(); - break; - - case svc_zpacket: + Com_Error( ERR_DROP, "%s: illegible server message: %d", __func__, cmd ); + break; + + case svc_nop: + break; + + case svc_disconnect: + Com_Error( ERR_DISCONNECT, "Server disconnected" ); + break; + + case svc_reconnect: + CL_ParseReconnect(); + return; + + case svc_print: + CL_ParsePrint(); + break; + + case svc_centerprint: + CL_ParseCenterPrint(); + break; + + case svc_stufftext: + CL_ParseStuffText(); + break; + + case svc_serverdata: + CL_ParseServerData(); + break; + + case svc_configstring: + CL_ParseConfigString(); + break; + + case svc_sound: + CL_ParseStartSoundPacket(); + break; + + case svc_spawnbaseline: + CL_ParseBaseline(); + break; + + case svc_temp_entity: + CL_ParseTEnt(); + break; + + case svc_muzzleflash: + CL_ParseMuzzleFlash(); + break; + + case svc_muzzleflash2: + CL_ParseMuzzleFlash2(); + break; + + case svc_download: + CL_ParseDownload(); + continue; + + case svc_frame: + CL_ParseFrame( extrabits ); + continue; + + case svc_inventory: + CL_ParseInventory(); + break; + + case svc_layout: + CL_ParseLayout(); + break; + + case svc_zpacket: if( cls.serverProtocol < PROTOCOL_VERSION_R1Q2 ) { goto badbyte; } - CL_ParseZPacket(); - continue; + CL_ParseZPacket(); + continue; - case svc_gamestate: + case svc_gamestate: if( cls.serverProtocol != PROTOCOL_VERSION_Q2PRO ) { goto badbyte; } - CL_ParseGamestate(); - continue; + CL_ParseGamestate(); + continue; - case svc_setting: + case svc_setting: if( cls.serverProtocol < PROTOCOL_VERSION_R1Q2 ) { goto badbyte; } - CL_ParseSetting(); - continue; - } + CL_ParseSetting(); + continue; + } // copy protocol invariant stuff - if( cls.demorecording && !cls.demopaused ) { - SZ_Write( &cls.demobuff, msg_read.data + readcount, + if( cls.demo.recording && !cls.demo.paused ) { + SZ_Write( &cls.demo.buffer, msg_read.data + readcount, msg_read.readcount - readcount ); } - } + } // // if recording demos, write the message out // - if( cls.demorecording && !cls.demopaused ) { - CL_WriteDemoMessage( &cls.demobuff ); + if( cls.demo.recording && !cls.demo.paused ) { + CL_WriteDemoMessage( &cls.demo.buffer ); } } |