diff options
author | Andrey Nazarov <skuller@skuller.net> | 2008-02-09 18:13:39 +0000 |
---|---|---|
committer | Andrey Nazarov <skuller@skuller.net> | 2008-02-09 18:13:39 +0000 |
commit | c367d212faf20a7a26430db1cb4436c5e3a0280f (patch) | |
tree | 2baeb068cd4b2aa1e45cbf9ba9c90726da9a7222 /source/cl_main.c | |
parent | a886b5ace3ea469279b6dbc341345e743f691a25 (diff) |
Initial client support for variable server FPS.
Added `cl_updaterate' variable.
Fixed 'jerking bodies' bug when playing MVD stream.
Fixed new entities warping when playing MVD stream.
Allow dummy MVD client to be kicked.
Never update layouts more than once per server frame for MVD observers.
Added support for scrolling MVD client list using `invnext' and `invprev'.
Fixed ref_soft compilation issue.
Removed `mvd_wait_enter' and `mvd_wait_leave' variables
in favor of `mvd_wait_delay' and `mvd_wait_percent'.
Enter waiting state after buffer underflow only.
Added `sv_locked' variable.
Kick clients updating their userinfo to invalid one.
Echo client name changes to the dedicated server console.
Allow truncated MVDs to be played back in a row.
Added `mvdpause' command.
Made `serverstatus' command to query current server if called without argument.
Enumerate clients in `serverstatus' command output.
Demo browser now caches MVDs correctly.
Allow `play' command to be used for playing MVDs too.
Diffstat (limited to 'source/cl_main.c')
-rw-r--r-- | source/cl_main.c | 116 |
1 files changed, 72 insertions, 44 deletions
diff --git a/source/cl_main.c b/source/cl_main.c index 87bfa9d..eab6301 100644 --- a/source/cl_main.c +++ b/source/cl_main.c @@ -76,7 +76,8 @@ cvar_t *cl_disconnectcmd; cvar_t *cl_changemapcmd; cvar_t *cl_beginmapcmd; -cvar_t *cl_gibs; +cvar_t *cl_gibs; +cvar_t *cl_updaterate; cvar_t *cl_protocol; @@ -152,11 +153,10 @@ CL_UpdateGunSetting static void CL_UpdateGunSetting( void ) { int nogun; - if ( cls.state < ca_connected || cls.state > ca_active ) { + if( cls.state < ca_connected ) { return; } - - if ( cls.serverProtocol < PROTOCOL_VERSION_R1Q2 ) { + if( cls.serverProtocol < PROTOCOL_VERSION_R1Q2 ) { return; } @@ -180,11 +180,11 @@ CL_UpdateGibSetting =================== */ static void CL_UpdateGibSetting( void ) { - if ( cls.state < ca_connected || cls.state > ca_active ) { + if( cls.state < ca_connected ) { return; } - if ( cls.serverProtocol != PROTOCOL_VERSION_Q2PRO ) { + if( cls.serverProtocol != PROTOCOL_VERSION_Q2PRO ) { return; } @@ -200,11 +200,10 @@ CL_UpdateFootstepsSetting =================== */ static void CL_UpdateFootstepsSetting( void ) { - if ( cls.state < ca_connected || cls.state > ca_active ) { + if( cls.state < ca_connected ) { return; } - - if ( cls.serverProtocol != PROTOCOL_VERSION_Q2PRO ) { + if( cls.serverProtocol != PROTOCOL_VERSION_Q2PRO ) { return; } @@ -220,11 +219,10 @@ CL_UpdatePredictSetting =================== */ static void CL_UpdatePredictSetting( void ) { - if ( cls.state < ca_connected || cls.state > ca_active ) { + if( cls.state < ca_connected ) { return; } - - if ( cls.serverProtocol != PROTOCOL_VERSION_Q2PRO ) { + if( cls.serverProtocol != PROTOCOL_VERSION_Q2PRO ) { return; } @@ -234,6 +232,20 @@ static void CL_UpdatePredictSetting( void ) { MSG_FlushTo( &cls.netchan->message ); } +static void CL_UpdateRateSetting( void ) { + if( cls.state < ca_connected ) { + return; + } + if( cls.serverProtocol != PROTOCOL_VERSION_R1Q2 ) { + return; + } + + MSG_WriteByte( clc_setting ); + MSG_WriteShort( CLS_FPS ); + MSG_WriteShort( cl_updaterate->integer ); + MSG_FlushTo( &cls.netchan->message ); +} + /* =================== CL_ClientCommand @@ -705,19 +717,21 @@ static void CL_ServerStatus_f( void ) { netadr_t adr; neterr_t ret; - if ( Cmd_Argc() < 2 ) { - Com_Printf( "Usage: %s <server>\n", Cmd_Argv( 0 ) ); - return; - } - - s = Cmd_Argv( 1 ); - if ( !NET_StringToAdr( s, &adr ) ) { - Com_Printf( "Bad address: %s\n", s ); - return; - } - - if ( !adr.port ) { - adr.port = BigShort( PORT_SERVER ); + if( Cmd_Argc() < 2 ) { + if( !cls.netchan ) { + Com_Printf( "Usage: %s [address]\n", Cmd_Argv( 0 ) ); + return; + } + adr = cls.netchan->remote_address; + } else { + s = Cmd_Argv( 1 ); + if( !NET_StringToAdr( s, &adr ) ) { + Com_Printf( "Bad address: %s\n", s ); + return; + } + if( !adr.port ) { + adr.port = BigShort( PORT_SERVER ); + } } CL_AddRequest( &adr, REQ_STATUS ); @@ -728,7 +742,6 @@ static void CL_ServerStatus_f( void ) { if( ret == NET_ERROR ) { Com_Printf( "%s to %s\n", NET_ErrorString(), NET_AdrToString( &adr ) ); } - } /* @@ -802,8 +815,9 @@ static qboolean CL_ServerStatusResponse( const char *status, void CL_DumpServerInfo( const serverStatus_t *status ) { char key[MAX_STRING_CHARS]; char value[MAX_STRING_CHARS]; - const playerStatus_t *player, *last; + const playerStatus_t *player; const char *infostring; + int i; Com_Printf( "Info response from %s:\n", NET_AdrToString( &net_from ) ); @@ -823,10 +837,9 @@ void CL_DumpServerInfo( const serverStatus_t *status ) { } } while( infostring ); - Com_Printf( "\nScore Ping Name\n" ); - last = status->players + status->numPlayers; - for( player = status->players; player != last; player++ ) { - Com_Printf( "%5i %4i %s\n", player->score, player->ping, + Com_Printf( "\nNum Score Ping Name\n" ); + for( i = 0, player = status->players; i < status->numPlayers; i++, player++ ) { + Com_Printf( "%3i %5i %4i %s\n", i + 1, player->score, player->ping, player->name ); } } @@ -1314,7 +1327,7 @@ static void CL_ConnectionlessPacket( void ) { } } - Com_Printf( "Connection to %s established (protocol %d).\n", + Com_Printf( "Connected to %s (protocol %d).\n", NET_AdrToString( &cls.serverAddress ), cls.serverProtocol ); if( cls.netchan ) { // this may happen after svc_reconnect @@ -1845,6 +1858,7 @@ void CL_RequestNextDownload ( void ) { CL_UpdateGibSetting(); CL_UpdateFootstepsSetting(); CL_UpdatePredictSetting(); + CL_UpdateRateSetting(); cls.state = ca_precached; } @@ -2260,6 +2274,10 @@ static void cl_predict_changed( cvar_t *self ) { CL_UpdatePredictSetting(); } +static void cl_updaterate_changed( cvar_t *self ) { + CL_UpdateRateSetting(); +} + static void CL_GetClientStatus( clientStatus_t *status ) { if( !status ) { Com_Error( ERR_DROP, "CL_GetClientStatus: NULL" ); @@ -2391,6 +2409,9 @@ static void CL_InitLocal ( void ) { cl_gibs = Cvar_Get( "cl_gibs", "1", 0 ); cl_gibs->changed = cl_gibs_changed; + cl_updaterate = Cvar_Get( "cl_updaterate", "0", 0 ); + cl_updaterate->changed = cl_updaterate_changed; + cl_chat_notify = Cvar_Get( "cl_chat_notify", "1", 0 ); cl_chat_sound = Cvar_Get( "cl_chat_sound", "misc/talk.wav", 0 ); cl_chat_filter = Cvar_Get( "cl_chat_filter", "0", 0 ); @@ -2480,26 +2501,33 @@ CL_SetClientTime ================== */ static void CL_SetClientTime( void ) { - if ( cl.time > cl.serverTime ) { - if ( cl_showclamp->integer ) + int prevtime; + + if( com_timedemo->integer ) { + cl.time = cl.serverTime; + cl.lerpfrac = 1.0f; + return; + } + + 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; cl.lerpfrac = 1.0f; - } else if ( cl.time < cl.serverTime - 100 ) { - if ( cl_showclamp->integer ) - Com_Printf( "low clamp %i\n", cl.time - cl.serverTime + 100 ); - cl.time = cl.serverTime - 100; + } else if( cl.time < prevtime ) { + if( cl_showclamp->integer ) + Com_Printf( "low clamp %i\n", prevtime - cl.time ); + cl.time = prevtime; cl.lerpfrac = 0; } else { - cl.lerpfrac = ( cl.time - cl.serverTime + 100 ) * 0.01f; + cl.lerpfrac = ( cl.time - prevtime ) * cl.framefrac; } - if ( com_timedemo->integer ) { - cl.lerpfrac = 1.0f; + if( cl_showclamp->integer == 2 ) { + Com_Printf( "time %i, lerpfrac %.3f\n", + cl.time, cl.lerpfrac ); } - - if ( cl_showclamp->integer == 2 ) - Com_Printf( "time %i, lerpfrac %.3f\n", cl.time, cl.lerpfrac ); } static void CL_MeasureStats( void ) { |