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 + code/server/sv_main.c | 2 +- code/server/sv_snapshot.c | 11 +++++------ 6 files changed, 35 insertions(+), 15 deletions(-) (limited to 'code') 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 diff --git a/code/server/sv_main.c b/code/server/sv_main.c index 152ecbd..b6f11b6 100644 --- a/code/server/sv_main.c +++ b/code/server/sv_main.c @@ -798,7 +798,7 @@ void SV_Frame( int msec ) { if ( sv_fps->integer < 1 ) { Cvar_Set( "sv_fps", "10" ); } - frameMsec = 1000 / sv_fps->integer ; + frameMsec = 1000 / sv_fps->integer * com_timescale->value; sv.timeResidual += msec; diff --git a/code/server/sv_snapshot.c b/code/server/sv_snapshot.c index 30001a1..da69850 100644 --- a/code/server/sv_snapshot.c +++ b/code/server/sv_snapshot.c @@ -587,12 +587,12 @@ void SV_SendMessageToClient( msg_t *msg, client_t *client ) { // TTimo - https://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=491 // added sv_lanForceRate check if ( client->netchan.remoteAddress.type == NA_LOOPBACK || (sv_lanForceRate->integer && Sys_IsLANAddress (client->netchan.remoteAddress)) ) { - client->nextSnapshotTime = svs.time + (1000/sv_fps->integer); + client->nextSnapshotTime = svs.time + (1000.0 / sv_fps->integer * com_timescale->value); return; } // normal rate / snapshotMsec calculation - rateMsec = SV_RateMsec( client, msg->cursize ); + rateMsec = SV_RateMsec(client, msg->cursize); if ( rateMsec < client->snapshotMsec ) { // never send more packets than this, no matter what the rate is at @@ -602,16 +602,15 @@ void SV_SendMessageToClient( msg_t *msg, client_t *client ) { client->rateDelayed = qtrue; } - client->nextSnapshotTime = svs.time + rateMsec; + client->nextSnapshotTime = svs.time + rateMsec * com_timescale->value; // don't pile up empty snapshots while connecting if ( client->state != CS_ACTIVE ) { // a gigantic connection message may have already put the nextSnapshotTime // more than a second away, so don't shorten it // do shorten if client is downloading - if ( !*client->downloadName && client->nextSnapshotTime < svs.time + 1000 ) { - client->nextSnapshotTime = svs.time + 1000; - } + if (!*client->downloadName && client->nextSnapshotTime < svs.time + 1000 * com_timescale->value) + client->nextSnapshotTime = svs.time + 1000 * com_timescale->value; } } -- cgit v1.2.3