aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--code/client/cl_cgame.c2
-rw-r--r--code/client/cl_main.c30
-rw-r--r--code/client/cl_parse.c4
-rw-r--r--code/client/client.h1
-rw-r--r--code/server/sv_main.c2
-rw-r--r--code/server/sv_snapshot.c11
6 files changed, 35 insertions, 15 deletions
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;
}
}