diff options
author | Andrey Nazarov <skuller@skuller.net> | 2008-02-09 18:13:39 +0000 |
---|---|---|
committer | Andrey Nazarov <skuller@skuller.net> | 2008-02-09 18:13:39 +0000 |
commit | c367d212faf20a7a26430db1cb4436c5e3a0280f (patch) | |
tree | 2baeb068cd4b2aa1e45cbf9ba9c90726da9a7222 /source/cl_parse.c | |
parent | a886b5ace3ea469279b6dbc341345e743f691a25 (diff) |
Initial client support for variable server FPS.
Added `cl_updaterate' variable.
Fixed 'jerking bodies' bug when playing MVD stream.
Fixed new entities warping when playing MVD stream.
Allow dummy MVD client to be kicked.
Never update layouts more than once per server frame for MVD observers.
Added support for scrolling MVD client list using `invnext' and `invprev'.
Fixed ref_soft compilation issue.
Removed `mvd_wait_enter' and `mvd_wait_leave' variables
in favor of `mvd_wait_delay' and `mvd_wait_percent'.
Enter waiting state after buffer underflow only.
Added `sv_locked' variable.
Kick clients updating their userinfo to invalid one.
Echo client name changes to the dedicated server console.
Allow truncated MVDs to be played back in a row.
Added `mvdpause' command.
Made `serverstatus' command to query current server if called without argument.
Enumerate clients in `serverstatus' command output.
Demo browser now caches MVDs correctly.
Allow `play' command to be used for playing MVDs too.
Diffstat (limited to 'source/cl_parse.c')
-rw-r--r-- | source/cl_parse.c | 65 |
1 files changed, 52 insertions, 13 deletions
diff --git a/source/cl_parse.c b/source/cl_parse.c index 2a43e1c..23f3098 100644 --- a/source/cl_parse.c +++ b/source/cl_parse.c @@ -531,27 +531,27 @@ static void CL_ParseFrame( int extrabits ) { from = &oldframe->ps; if( deltaframe == currentframe ) { // old buggy q2 servers still cause this on map change - Com_DPrintf( "Delta from current frame.\n" ); + 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( "Delta frame was never received or too old.\n" ); + 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( "Delta from invalid frame.\n" ); + 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( "Delta entities too old.\n" ); + 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 ) { - Com_DPrintf( "Trying to recover from the broken demo recording.\n" ); + Com_DPrintf( "%s: recovering broken demo\n", __func__ ); oldframe = &cl.frame; from = &oldframe->ps; frame.valid = qtrue; @@ -570,10 +570,10 @@ static void CL_ParseFrame( int extrabits ) { length = MSG_ReadByte(); if( length ) { if( length < 0 || msg_read.readcount + length > msg_read.cursize ) { - Com_Error( ERR_DROP, "CL_ParseFrame: read past end of message" ); + Com_Error( ERR_DROP, "%s: read past end of message", __func__ ); } if( length > sizeof( frame.areabits ) ) { - Com_Error( ERR_DROP, "CL_ParseFrame: invalid areabits length" ); + Com_Error( ERR_DROP, "%s: invalid areabits length", __func__ ); } MSG_ReadData( frame.areabits, length ); frame.areabytes = length; @@ -583,7 +583,7 @@ static void CL_ParseFrame( int extrabits ) { if( cls.serverProtocol <= PROTOCOL_VERSION_DEFAULT ) { if( MSG_ReadByte() != svc_playerinfo ) { - Com_Error( ERR_DROP, "CL_ParseFrame: not playerinfo" ); + Com_Error( ERR_DROP, "%s: not playerinfo", __func__ ); } } @@ -618,13 +618,13 @@ static void CL_ParseFrame( int extrabits ) { } if( !frame.ps.fov ) { // fail out early to prevent spurious errors later - Com_Error( ERR_DROP, "CL_ParseFrame: bad fov" ); + 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, "CL_ParseFrame: not packetentities" ); + Com_Error( ERR_DROP, "%s: not packetentities", __func__ ); } } @@ -654,7 +654,7 @@ static void CL_ParseFrame( int extrabits ) { cl.oldframe = cl.frame; cl.frame = frame; - cl.serverTime = frame.number * 100; + cl.serverTime = frame.number * cl.frametime; // getting a valid frame message ends the connection process if( cls.state == ca_precached ) { @@ -842,6 +842,7 @@ static void CL_ParseServerData( void ) { // get the full level name str = MSG_ReadString(); + // setup default pmove parameters cl.pmp.speedMultiplier = 1; cl.pmp.maxspeed = 300; // cl.pmp.upspeed = 350; @@ -853,6 +854,11 @@ static void CL_ParseServerData( void ) { #ifdef PMOVE_HACK cl.pmp.highprec = qtrue; #endif + + // setup default frame times + cl.frametime = 100; + cl.framefrac = 0.01f; + if( cls.serverProtocol == PROTOCOL_VERSION_R1Q2 ) { i = MSG_ReadByte(); if( i ) { @@ -1421,6 +1427,25 @@ static void CL_ParseZPacket( void ) { #endif } +static void CL_ParseSetting( void ) { + uint32 index, value; + + index = MSG_ReadLong(); + value = MSG_ReadLong(); + + switch( index ) { + case SVS_FPS: + if( !value ) { + value = 10; + } + cl.frametime = 1000 / value; + cl.framefrac = value * 0.001f; + break; + default: + break; + } +} + /* ===================== CL_ParseServerMessage @@ -1441,7 +1466,7 @@ void CL_ParseServerMessage( void ) { // while( 1 ) { if( msg_read.readcount > msg_read.cursize ) { - Com_Error( ERR_DROP, "CL_ParseServerMessage: read past end of server message" ); + Com_Error( ERR_DROP, "%s: read past end of server message", __func__ ); } readcount = msg_read.readcount; @@ -1463,7 +1488,8 @@ void CL_ParseServerMessage( void ) { // other commands switch( cmd ) { default: - Com_Error( ERR_DROP, "CL_ParseServerMessage: illegible server message: %d", cmd ); + badbyte: + Com_Error( ERR_DROP, "%s: illegible server message: %d", __func__, cmd ); break; case svc_nop: @@ -1534,12 +1560,25 @@ void CL_ParseServerMessage( void ) { break; case svc_zpacket: + if( cls.serverProtocol < PROTOCOL_VERSION_R1Q2 ) { + goto badbyte; + } CL_ParseZPacket(); continue; case svc_gamestate: + if( cls.serverProtocol != PROTOCOL_VERSION_Q2PRO ) { + goto badbyte; + } CL_ParseGamestate(); continue; + + case svc_setting: + if( cls.serverProtocol < PROTOCOL_VERSION_R1Q2 ) { + goto badbyte; + } + CL_ParseSetting(); + continue; } // copy protocol invariant stuff |