diff --git a/engine/client/cl_game.c b/engine/client/cl_game.c index 272919d7..16390a65 100644 --- a/engine/client/cl_game.c +++ b/engine/client/cl_game.c @@ -3437,14 +3437,14 @@ void NetAPI_CancelRequest( int context ) nr->pfnFunc( &nr->resp ); } - memset( &clgame.net_requests[i], 0, sizeof( net_request_t )); - if( clgame.net_requests[i].resp.type == NETAPI_REQUEST_SERVERLIST && &clgame.net_requests[i] == clgame.master_request ) { if( clgame.request_type == NET_REQUEST_CLIENT ) clgame.request_type = NET_REQUEST_CANCEL; clgame.master_request = NULL; } + + memset( &clgame.net_requests[i], 0, sizeof( net_request_t )); break; } } diff --git a/engine/client/cl_main.c b/engine/client/cl_main.c index 653413f2..2a628f26 100644 --- a/engine/client/cl_main.c +++ b/engine/client/cl_main.c @@ -41,6 +41,8 @@ convar_t *cl_lightstyle_lerping; convar_t *cl_idealpitchscale; convar_t *cl_nosmooth; convar_t *cl_smoothtime; +convar_t *cl_clockreset; +convar_t *cl_fixtimerate; convar_t *cl_solid_players; convar_t *cl_draw_beams; convar_t *cl_updaterate; @@ -190,38 +192,32 @@ should be put at. */ static float CL_LerpPoint( void ) { - float f, frac; + float f, frac = 1.0f; f = cl_serverframetime(); - if( !f || SV_Active( )) + if( f == 0.0f || cls.timedemo ) { cl.time = cl.mtime[0]; + + // g-cont. probably this is redundant + if( cls.demoplayback ) + cl.oldtime = cl.mtime[0] - cl_clientframetime(); + return 1.0f; } - - if( f > 0.1f ) - { - // dropped packet, or start of demo - cl.mtime[1] = cl.mtime[0] - 0.1f; - f = 0.1f; + + if( cl_interp->value > 0.001f ) + { + // manual lerp value (goldsrc mode) + frac = ( cl.time - cl.mtime[0] ) / cl_interp->value; + } + else if( f > 0.001f ) + { + // automatic lerp (classic mode) + frac = ( cl.time - cl.mtime[1] ) / f; } - frac = ( cl.time - cl.mtime[1] ) / f; - - if( frac < 0 ) - { - if( frac < -0.01f ) - cl.time = cl.mtime[1]; - frac = 0.0f; - } - else if( frac > 1.0f ) - { - if( frac > 1.01f ) - cl.time = cl.mtime[0]; - frac = 1.0f; - } - return frac; } @@ -403,23 +399,7 @@ void CL_CreateCmd( void ) VectorCopy( cl.data.viewangles, cl.refdef.cl_viewangles ); cl.scr_fov = cl.data.fov; } -#if 0 - // allways dump the first ten messages, - // because it may contain leftover inputs - // from the last level - // disabled because it's invoke crash in HLFX 0.6 while we trying to playback a demo - if( ++cl.movemessages <= 10 ) - { - if( !cls.demoplayback ) - { - cl.refdef.cmd = &cl.commands[cls.netchan.outgoing_sequence & CL_UPDATE_MASK].cmd; - *cl.refdef.cmd = cmd; - } - CL_PopPMStates(); - return; - } -#endif // message we are constructing. i = cls.netchan.outgoing_sequence & CL_UPDATE_MASK; pcmd = &cl.commands[i]; @@ -1870,7 +1850,7 @@ void CL_InitLocal( void ) cl_nodelta = Cvar_Get ("cl_nodelta", "0", 0, "disable delta-compression for usercommnds" ); cl_idealpitchscale = Cvar_Get( "cl_idealpitchscale", "0.8", 0, "how much to look up/down slopes and stairs when not using freelook" ); cl_solid_players = Cvar_Get( "cl_solid_players", "1", 0, "Make all players not solid (can't traceline them)" ); - cl_interp = Cvar_Get( "ex_interp", "0.1", 0, "Interpolate object positions starting this many seconds in past" ); + cl_interp = Cvar_Get( "ex_interp", "0.1", CVAR_ARCHIVE, "Interpolate object positions starting this many seconds in past" ); cl_timeout = Cvar_Get( "cl_timeout", "60", 0, "connect timeout (in-seconds)" ); rcon_client_password = Cvar_Get( "rcon_password", "", 0, "remote control client password" ); @@ -1894,6 +1874,8 @@ void CL_InitLocal( void ) cl_lightstyle_lerping = Cvar_Get( "cl_lightstyle_lerping", "0", CVAR_ARCHIVE, "enables animated light lerping (perfomance option)" ); cl_showerror = Cvar_Get( "cl_showerror", "0", CVAR_ARCHIVE, "show prediction error" ); cl_bmodelinterp = Cvar_Get( "cl_bmodelinterp", "1", CVAR_ARCHIVE, "enable bmodel interpolation" ); + cl_clockreset = Cvar_Get( "cl_clockreset", "0.1", CVAR_ARCHIVE, "frametime delta maximum value before reset" ); + cl_fixtimerate = Cvar_Get( "cl_fixtimerate", "7.5", CVAR_ARCHIVE, "time in msec to client clock adjusting" ); Cvar_Get( "hud_scale", "0", CVAR_ARCHIVE|CVAR_LATCH, "scale hud at current resolution" ); Cvar_Get( "skin", "", CVAR_USERINFO, "player skin" ); // XDM 3.3 want this cvar @@ -1980,6 +1962,42 @@ void CL_SendCommand( void ) CL_CheckForResend (); } +/* +================== +CL_AdjustClock + +slowly adjuct client clock +to smooth lag effect +================== +*/ +void CL_AdjustClock( void ) +{ + if( cl.timedelta == 0.0f || !cl_fixtimerate->value ) + return; + + if( cl_fixtimerate->value < 0.0f ) + Cvar_SetFloat( "cl_fixtimerate", 7.5f ); + + if( fabs( cl.timedelta ) >= 0.001f ) + { + double msec, adjust, sign; + + msec = ( cl.timedelta * 1000.0 ); + sign = ( msec < 0 ) ? 1.0 : -1.0; + msec = fabs( msec ); + adjust = sign * ( cl_fixtimerate->value / 1000.0 ); + + if( fabs( adjust ) < fabs( cl.timedelta )) + { + cl.timedelta += adjust; + cl.time += adjust; + } + + if( cl.oldtime > cl.time ) + cl.oldtime = cl.time; + } +} + /* ================== CL_PrepareFrame @@ -2093,6 +2111,9 @@ void Host_ClientFrame( void ) CL_PredictMovement(); } + // adjust client time + CL_AdjustClock(); + // animate lightestyles CL_RunLightStyles(); diff --git a/engine/client/cl_parse.c b/engine/client/cl_parse.c index ea4213aa..ea0bdcc3 100644 --- a/engine/client/cl_parse.c +++ b/engine/client/cl_parse.c @@ -363,8 +363,28 @@ CL_ParseServerTime */ void CL_ParseServerTime( sizebuf_t *msg ) { + double dt; + cl.mtime[1] = cl.mtime[0]; cl.mtime[0] = MSG_ReadFloat( msg ); + + if( cl.maxclients == 1 ) + cl.time = cl.mtime[0]; + + dt = cl.time - cl.mtime[0]; + + if( fabs( dt ) > cl_clockreset->value ) // 0.1 by default + { + cl.time = cl.mtime[0]; + cl.timedelta = 0.0f; + } + else if( dt != 0.0 ) + { + cl.timedelta = dt; + } + + if( cl.oldtime > cl.time ) + cl.oldtime = cl.time; } /* diff --git a/engine/client/client.h b/engine/client/client.h index 722d7d5d..f3735f41 100644 --- a/engine/client/client.h +++ b/engine/client/client.h @@ -104,7 +104,7 @@ extern int CL_UPDATE_BACKUP; #define INVALID_HANDLE 0xFFFF // for XashXT cache system #define cl_serverframetime() (cl.mtime[0] - cl.mtime[1]) -#define cl_clientframetime() (host.frametime) +#define cl_clientframetime() (cl.time - cl.oldtime) typedef struct { @@ -171,6 +171,7 @@ typedef struct float lerpFrac; // interpolation value float lerpBack; // invert interpolation value + float timedelta; // floating delta between two updates ref_params_t refdef; // shared refdef char serverinfo[MAX_INFO_STRING]; @@ -183,7 +184,6 @@ typedef struct // server state information int playernum; int maxclients; - int movemessages; int num_custombeams; // server beams count char model_precache[MAX_MODELS][CS_SIZE]; @@ -578,6 +578,8 @@ extern convar_t *cl_lightstyle_lerping; extern convar_t *cl_draw_particles; extern convar_t *cl_levelshot_name; extern convar_t *cl_draw_beams; +extern convar_t *cl_clockreset; +extern convar_t *cl_fixtimerate; extern convar_t *gl_showtextures; extern convar_t *cl_bmodelinterp; extern convar_t *cl_lw; // local weapons diff --git a/engine/client/gl_studio.c b/engine/client/gl_studio.c index 2ea075de..0d70f20a 100644 --- a/engine/client/gl_studio.c +++ b/engine/client/gl_studio.c @@ -3343,7 +3343,7 @@ void R_DrawViewModel( void ) if( cl.thirdperson || cl.refdef.health <= 0 || cl.refdef.viewentity != ( cl.playernum + 1 )) return; - if( RI.params & RP_NONVIEWERREF ) + if( cl.refdef.nextView || RI.params & RP_NONVIEWERREF ) return; if( !Mod_Extradata( clgame.viewent.model )) diff --git a/engine/common/common.c b/engine/common/common.c index 0b5003e4..5a4a08f2 100644 --- a/engine/common/common.c +++ b/engine/common/common.c @@ -549,7 +549,7 @@ void Con_Printf( char *szFmt, ... ) static char buffer[16384]; // must support > 1k messages va_list args; - if( host.developer <= 0 ) + if( host.developer < D_INFO ) return; va_start( args, szFmt ); @@ -570,7 +570,7 @@ void Con_DPrintf( char *szFmt, ... ) static char buffer[16384]; // must support > 1k messages va_list args; - if( host.developer < D_INFO ) + if( host.developer < D_ERROR ) return; va_start( args, szFmt ); diff --git a/engine/common/common.h b/engine/common/common.h index 80a9d08f..dca0cb56 100644 --- a/engine/common/common.h +++ b/engine/common/common.h @@ -73,8 +73,8 @@ typedef struct enum { D_INFO = 1, // "-dev 1", shows various system messages - D_ERROR, // "-dev 2", shows critical warnings - D_WARN, // "-dev 3", shows not critical system warnings + D_WARN, // "-dev 2", shows not critical system warnings + D_ERROR, // "-dev 3", shows critical warnings D_REPORT, // "-dev 4", special case for game reports D_NOTE // "-dev 5", show system notifications for engine developers }; diff --git a/engine/common/filesystem.c b/engine/common/filesystem.c index 28defe34..8a429d40 100644 --- a/engine/common/filesystem.c +++ b/engine/common/filesystem.c @@ -1992,6 +1992,8 @@ Close a file */ int FS_Close( file_t *file ) { + if( !file ) return 0; + if( close( file->handle )) return EOF; @@ -2724,7 +2726,7 @@ qboolean FS_FileCopy( file_t *pOutput, file_t *pInput, int fileSize ) if(( readSize = FS_Read( pInput, buf, size )) < size ) { - MsgDev( D_ERROR, "FS_FileCopy: unexpected end of input file\n" ); + MsgDev( D_ERROR, "FS_FileCopy: unexpected end of input file (%d < %d)\n", readSize, size ); fileSize = 0; done = false; break; diff --git a/game_launch/game.cpp b/game_launch/game.cpp index a80b3132..cef6ad43 100644 --- a/game_launch/game.cpp +++ b/game_launch/game.cpp @@ -20,6 +20,7 @@ GNU General Public License for more details. #ifdef WIN32 // enable NVIDIA High Performance Graphics while using Integrated Graphics. __declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001; +__declspec(dllexport) DWORD AmdPowerXpressRequestHighPerformance = 1; #endif typedef void (*pfnChangeGame)( const char *progname );