diff options
-rw-r--r-- | source/cl_demo.c | 4 | ||||
-rw-r--r-- | source/cl_ents.c | 3 | ||||
-rw-r--r-- | source/cl_local.h | 4 | ||||
-rw-r--r-- | source/cl_main.c | 27 | ||||
-rw-r--r-- | source/cl_parse.c | 4 | ||||
-rw-r--r-- | source/cl_tent.c | 22 | ||||
-rw-r--r-- | source/mvd_parse.c | 8 | ||||
-rw-r--r-- | source/snd_main.c | 6 | ||||
-rw-r--r-- | source/sv_send.c | 8 | ||||
-rw-r--r-- | wiki/doc/server.mdwn | 29 |
10 files changed, 62 insertions, 53 deletions
diff --git a/source/cl_demo.c b/source/cl_demo.c index f700326..ff09dc7 100644 --- a/source/cl_demo.c +++ b/source/cl_demo.c @@ -775,12 +775,12 @@ void CL_DemoFrame( void ) { if( com_timedemo->integer ) { CL_ParseNextDemoMessage(); - cl.time = cl.serverTime; + cl.time = cl.servertime; cls.timeDemoFrames++; return; } - while( cl.serverTime < cl.time ) { + while( cl.servertime < cl.time ) { CL_ParseNextDemoMessage(); if( cls.state != ca_active ) { break; diff --git a/source/cl_ents.c b/source/cl_ents.c index 117bd63..6477b51 100644 --- a/source/cl_ents.c +++ b/source/cl_ents.c @@ -96,6 +96,9 @@ void CL_DeltaFrame( void ) { entity_state_t *state; int i, j; + // set server time + cl.servertime = ( cl.frame.number - cl.serverdelta ) * cl.frametime; + VectorScale( cl.frame.ps.pmove.origin, 0.125f, cl.playerEntityOrigin ); CL_BuildSolidList(); diff --git a/source/cl_local.h b/source/cl_local.h index f9de445..2e4c4b7 100644 --- a/source/cl_local.h +++ b/source/cl_local.h @@ -122,7 +122,8 @@ typedef struct client_state_s { server_frame_t frames[UPDATE_BACKUP]; server_frame_t frame; // received from server server_frame_t oldframe; - int serverTime; + int servertime; + int serverdelta; frameflags_t frameflags; int lastframe; @@ -148,7 +149,6 @@ typedef struct client_state_s { int frametime; // fixed server frame time float framefrac; - refdef_t refdef; int lightlevel; diff --git a/source/cl_main.c b/source/cl_main.c index eab6301..ad40c38 100644 --- a/source/cl_main.c +++ b/source/cl_main.c @@ -989,6 +989,9 @@ static void CL_Changing_f( void ) { return; } + if ( cls.demorecording ) + CL_Stop_f(); + S_StopAllSounds(); Com_Printf( "Changing map...\n" ); @@ -2463,23 +2466,21 @@ CL_CheatsOK ================== */ qboolean CL_CheatsOK( void ) { - if ( cls.state < ca_connected ) { + if( cls.state < ca_connected || cls.demoplayback ) { return qtrue; } - if ( cls.demoplayback ) { - return qtrue; + if( !sv_running->integer ) { + return qfalse; } // developer option - if ( sv_running->integer ) { - if( sv_running->integer != ss_game || Cvar_VariableInteger( "cheats" ) ) { - return qtrue; - } + if( Cvar_VariableInteger( "cheats" ) ) { + return qtrue; } // single player can cheat - if ( atoi( cl.configstrings[ CS_MAXCLIENTS ] ) < 2 ) { + if( cls.state > ca_connected && cl.maxclients < 2 ) { return qtrue; } @@ -2504,16 +2505,16 @@ static void CL_SetClientTime( void ) { int prevtime; if( com_timedemo->integer ) { - cl.time = cl.serverTime; + cl.time = cl.servertime; cl.lerpfrac = 1.0f; return; } - prevtime = cl.serverTime - cl.frametime; - if( cl.time > cl.serverTime ) { + prevtime = cl.servertime - cl.frametime; + if( cl.time > cl.servertime ) { if( cl_showclamp->integer ) - Com_Printf( "high clamp %i\n", cl.time - cl.serverTime ); - cl.time = cl.serverTime; + Com_Printf( "high clamp %i\n", cl.time - cl.servertime ); + cl.time = cl.servertime; cl.lerpfrac = 1.0f; } else if( cl.time < prevtime ) { if( cl_showclamp->integer ) diff --git a/source/cl_parse.c b/source/cl_parse.c index 23f3098..788bf19 100644 --- a/source/cl_parse.c +++ b/source/cl_parse.c @@ -436,7 +436,8 @@ CL_SetActiveState ================ */ static void CL_SetActiveState( void ) { - cl.time = cl.serverTime; // set time, needed for demos + cl.serverdelta = cl.frame.number; + cl.time = cl.servertime = 0; // set time, needed for demos cls.state = ca_active; cl.oldframe.valid = qfalse; cl.frameflags = 0; @@ -654,7 +655,6 @@ static void CL_ParseFrame( int extrabits ) { cl.oldframe = cl.frame; cl.frame = frame; - cl.serverTime = frame.number * cl.frametime; // getting a valid frame message ends the connection process if( cls.state == ca_precached ) { diff --git a/source/cl_tent.c b/source/cl_tent.c index 96dbe94..a2c2a23 100644 --- a/source/cl_tent.c +++ b/source/cl_tent.c @@ -333,7 +333,7 @@ void CL_SmokeAndFlash(vec3_t origin) ex->type = ex_misc; ex->frames = 4; ex->ent.flags = RF_TRANSLUCENT; - ex->start = cl.serverTime - 100; + ex->start = cl.servertime - cl.frametime; ex->ent.model = cl_mod_smoke; ex = CL_AllocExplosion (); @@ -341,7 +341,7 @@ void CL_SmokeAndFlash(vec3_t origin) ex->type = ex_flash; ex->ent.flags = RF_FULLBRIGHT; ex->frames = 2; - ex->start = cl.serverTime - 100; + ex->start = cl.servertime - cl.frametime; ex->ent.model = cl_mod_flash; } @@ -714,7 +714,7 @@ static explosion_t *CL_RocketExplosion( vec3_t pos, qhandle_t hModel ) { VectorCopy (pos, ex->ent.origin); ex->type = ex_poly; ex->ent.flags = RF_FULLBRIGHT; - ex->start = cl.serverTime - 100; + ex->start = cl.servertime - cl.frametime; ex->light = 350; ex->lightcolor[0] = 1.0; ex->lightcolor[1] = 0.5; @@ -860,7 +860,7 @@ void CL_ParseTEnt (void) ex->type = ex_misc; ex->ent.flags = RF_FULLBRIGHT|RF_TRANSLUCENT; - ex->start = cl.serverTime - 100; + ex->start = cl.servertime - cl.frametime; ex->light = 150; ex->lightcolor[0] = 1; ex->lightcolor[1] = 1; @@ -884,7 +884,7 @@ void CL_ParseTEnt (void) VectorCopy (pos, ex->ent.origin); ex->type = ex_poly; ex->ent.flags = RF_FULLBRIGHT; - ex->start = cl.serverTime - 100; + ex->start = cl.servertime - cl.frametime; ex->light = 350; ex->lightcolor[0] = 1.0; ex->lightcolor[1] = 0.5; @@ -914,7 +914,7 @@ void CL_ParseTEnt (void) VectorCopy (pos, ex->ent.origin); ex->type = ex_poly; ex->ent.flags = RF_FULLBRIGHT; - ex->start = cl.serverTime - 100; + ex->start = cl.servertime - cl.frametime; ex->light = 350; ex->lightcolor[0] = 1.0; ex->lightcolor[1] = 0.5; @@ -936,7 +936,7 @@ void CL_ParseTEnt (void) VectorCopy (pos, ex->ent.origin); ex->type = ex_poly; ex->ent.flags = RF_FULLBRIGHT; - ex->start = cl.serverTime - 100; + ex->start = cl.servertime - cl.frametime; ex->light = 350; ex->lightcolor[0] = 1.0; ex->lightcolor[1] = 0.5; @@ -993,7 +993,7 @@ void CL_ParseTEnt (void) VectorCopy (pos, ex->ent.origin); ex->type = ex_poly; ex->ent.flags = RF_FULLBRIGHT; - ex->start = cl.serverTime - 100; + ex->start = cl.servertime - cl.frametime; ex->light = 350; ex->lightcolor[0] = 0.0; ex->lightcolor[1] = 1.0; @@ -1048,7 +1048,7 @@ void CL_ParseTEnt (void) // note to self // we need a better no draw flag ex->ent.flags = RF_BEAM; - ex->start = cl.serverTime - 0.1; + ex->start = cl.servertime - cl.frametime; ex->light = 100 + (rand()%75); ex->lightcolor[0] = 1.0; ex->lightcolor[1] = 1.0; @@ -1108,7 +1108,7 @@ void CL_ParseTEnt (void) else // flechette ex->ent.skinnum = 2; - ex->start = cl.serverTime - 100; + ex->start = cl.servertime - cl.frametime; ex->light = 150; // PMM if (type == TE_BLASTER2) @@ -1142,7 +1142,7 @@ void CL_ParseTEnt (void) VectorCopy (pos, ex->ent.origin); ex->type = ex_poly; ex->ent.flags = RF_FULLBRIGHT; - ex->start = cl.serverTime - 100; + ex->start = cl.servertime - cl.frametime; ex->light = 350; ex->lightcolor[0] = 1.0; ex->lightcolor[1] = 0.5; diff --git a/source/mvd_parse.c b/source/mvd_parse.c index 90ef3df..a9a0fc6 100644 --- a/source/mvd_parse.c +++ b/source/mvd_parse.c @@ -649,6 +649,14 @@ static void MVD_ParseConfigstring( mvd_t *mvd ) { if( p ) { *p = 0; } + LIST_FOR_EACH( udpClient_t, client, &mvd->udpClients, entry ) { + if( client->cl->state < cs_spawned ) { + continue; + } + if( client->target == player && client->layout_type == LAYOUT_FOLLOW ) { + client->layout_time = 0; + } + } } else if( index >= CS_GENERAL ) { // reset unicast versions of this string for( i = 0; i < mvd->maxclients; i++ ) { diff --git a/source/snd_main.c b/source/snd_main.c index ae32939..96a7a1c 100644 --- a/source/snd_main.c +++ b/source/snd_main.c @@ -784,13 +784,13 @@ void S_StartSound( const vec3_t origin, int entnum, int entchannel, qhandle_t hS ps->sfx = sfx; // drift s_beginofs - start = cl.serverTime * 0.001 * dma.speed + s_beginofs; + start = cl.servertime * 0.001 * dma.speed + s_beginofs; if( start < paintedtime ) { start = paintedtime; - s_beginofs = start - ( cl.serverTime * 0.001 * dma.speed ); + s_beginofs = start - ( cl.servertime * 0.001 * dma.speed ); } else if ( start > paintedtime + 0.3 * dma.speed ) { start = paintedtime + 0.1 * dma.speed; - s_beginofs = start - ( cl.serverTime * 0.001 * dma.speed ); + s_beginofs = start - ( cl.servertime * 0.001 * dma.speed ); } else { s_beginofs -= 10; } diff --git a/source/sv_send.c b/source/sv_send.c index 1177a92..c87a16c 100644 --- a/source/sv_send.c +++ b/source/sv_send.c @@ -80,10 +80,10 @@ static qboolean SV_RateDrop( client_t *client ) { return qfalse; } -void SV_CalcSendTime( client_t *client, int messageSize ) { +void SV_CalcSendTime( client_t *client, int size ) { int delta; - if( messageSize == -1 ) { + if( size == -1 ) { return; } @@ -93,9 +93,9 @@ void SV_CalcSendTime( client_t *client, int messageSize ) { return; } - client->message_size[sv.framenum % RATE_MESSAGES] = messageSize; + client->message_size[sv.framenum % RATE_MESSAGES] = size; - delta = messageSize * 1000 / client->rate; + delta = size * 1000 / client->rate; client->sendTime = svs.realtime + delta; } diff --git a/wiki/doc/server.mdwn b/wiki/doc/server.mdwn index 99326be..bd21b21 100644 --- a/wiki/doc/server.mdwn +++ b/wiki/doc/server.mdwn @@ -117,28 +117,25 @@ Higher values mean higher verbosity. Display some MVD client related development information. Higher values mean higher verbosity. -- `set mvd_pause 0` (boolean) -Pause MVD playback if non-zero. - - `set mvd_timeout 120` (float) Specifies MVD connection timeout value, in seconds. -- `set mvd_wait_enter 0.5` (float) -Inuse percentage of the input buffer when MVD state -machine transitions from running state into waiting state. +- `set mvd_wait_delay 20` (float) +Time, in seconds, for MVD client to buffer data right after initial +connection. This effectively specifies MVD stream delay seen by observers. -- `set mvd_wait_leave 2` (float) -Inuse percentage of the input buffer when MVD state -machine transitions from waiting state into running state. +- `set mvd_wait_percent 2` (float) +Inuse percentage of the input buffer when MVD state machine transitions +into running state to prevent buffer overrun. Hacks ---------- - `set sv_oldgame_hack 0` (boolean) -On Unix systems, enables "binary compatibility mode" so game libraries -built using old GCC versions may be loaded without recompilation. -If you have to use some closed source mod and your server segfaults -while loading a map, try toggling this variable. +On Unix systems, enables ABI compatibility mode which allows loading of +game libraries built using ancient GCC versions. If you happen to run closed +source game mod and your server crashes while loading a map, try enabling +this variable. - `set sv_bodyque_hack 0` (boolean) Attempts to prevent "flying bodies" effect introduced by some buggy @@ -147,8 +144,8 @@ slots for "body queue" and disables client side interpolation of those entities. Use this hack with caution as it may not be compatible with all mods and causes slightly higher bandwidth usage. -- `set sv_strafejump_hack 0` (boolean) -Enables FPS-independent strafe jumping mode for clients supporting R1Q2 +- `set sv_strafejump_hack 1` (boolean) +Enables FPS-independent strafe jumping mode for clients using R1Q2 and Q2PRO protocols. @@ -206,7 +203,7 @@ Anticheat Q2PRO server supports r1ch.net anticheat server interface, which means it is capable of serving clients supported by the proprietary client side anticheat -module (currently, these include Windows builds of R1Q2, EGL and AprQ2). +module (currently, these include Windows builds of R1Q2, EGL, AprQ2 and Q2PRO). See this [thread](http://www.r1ch.net/forum/index.php?topic=944.0) on r1ch.net forums for more information on how to setup your server to use anticheat |