From 30a33db828a79bd9984dc2ae950c16839b8f07dc Mon Sep 17 00:00:00 2001 From: thilo Date: Sat, 26 Aug 2006 01:45:27 +0000 Subject: - compensate sv_fps for timescale value. - Add a non-dirty-hack fix for client hanging when unpausing a game. git-svn-id: svn://svn.icculus.org/quake3/trunk@870 edf5b092-35ff-0310-97b2-ce42778d08ea --- code/client/cl_cgame.c | 2 +- code/client/cl_main.c | 30 +++++++++++++++++++++++------- code/client/cl_parse.c | 4 ++++ code/client/client.h | 1 + 4 files changed, 29 insertions(+), 8 deletions(-) (limited to 'code/client') diff --git a/code/client/cl_cgame.c b/code/client/cl_cgame.c index 10deeff..997a72c 100644 --- a/code/client/cl_cgame.c +++ b/code/client/cl_cgame.c @@ -941,7 +941,7 @@ void CL_SetCGameTime( void ) { } // allow pause in single player - if ( sv_paused->integer && cl_paused->integer && com_sv_running->integer ) { + if ( sv_paused->integer && CL_CheckPaused() && com_sv_running->integer ) { // paused return; } diff --git a/code/client/cl_main.c b/code/client/cl_main.c index 8c89d54..2df8cb1 100644 --- a/code/client/cl_main.c +++ b/code/client/cl_main.c @@ -1961,7 +1961,7 @@ void CL_CheckTimeout( void ) { // // check timeout // - if ( ( !cl_paused->integer || !sv_paused->integer ) + if ( ( !CL_CheckPaused() || !sv_paused->integer ) && cls.state >= CA_CONNECTED && cls.state != CA_CINEMATIC && cls.realtime - clc.lastPacketTime > cl_timeout->value*1000) { if (++cl.timeoutcount > 5) { // timeoutcount saves debugger @@ -1974,6 +1974,22 @@ void CL_CheckTimeout( void ) { } } +/* +================== +CL_CheckPaused +Check whether client has been paused. +================== +*/ +qboolean CL_CheckPaused(void) +{ + // if cl_paused->modified is set, the cvar has only been changed in + // this frame. Keep paused in this frame to ensure the server doesn't + // lag behind. + if(cl_paused->integer || cl_paused->modified) + return qtrue; + + return qfalse; +} //============================================================================ @@ -1985,19 +2001,19 @@ CL_CheckUserinfo */ void CL_CheckUserinfo( void ) { // don't add reliable commands when not yet connected - if ( cls.state < CA_CHALLENGING ) { + if(cls.state < CA_CHALLENGING) return; - } + // don't overflow the reliable command buffer when paused - if ( cl_paused->integer ) { + if(CL_CheckPaused()) return; - } + // send a reliable userinfo update if needed - if ( cvar_modifiedFlags & CVAR_USERINFO ) { + if(cvar_modifiedFlags & CVAR_USERINFO) + { cvar_modifiedFlags &= ~CVAR_USERINFO; CL_AddReliableCommand( va("userinfo \"%s\"", Cvar_InfoString( CVAR_USERINFO ) ) ); } - } /* diff --git a/code/client/cl_parse.c b/code/client/cl_parse.c index dd89074..d8ad6d7 100644 --- a/code/client/cl_parse.c +++ b/code/client/cl_parse.c @@ -219,6 +219,10 @@ void CL_ParseSnapshot( msg_t *msg ) { newSnap.serverTime = MSG_ReadLong( msg ); + // if we were just unpaused, we can only *now* really let the + // change come into effect or the client hangs. + cl_paused->modified = 0; + newSnap.messageNum = clc.serverMessageSequence; deltaNum = MSG_ReadByte( msg ); diff --git a/code/client/client.h b/code/client/client.h index 3643e4f..3a876d2 100644 --- a/code/client/client.h +++ b/code/client/client.h @@ -394,6 +394,7 @@ void CL_InitRef( void ); qboolean CL_CDKeyValidate( const char *key, const char *checksum ); int CL_ServerStatus( char *serverAddress, char *serverStatusString, int maxLen ); +qboolean CL_CheckPaused(void); // // cl_input -- cgit v1.2.3