diff options
author | Andrey Nazarov <skuller@skuller.net> | 2008-08-28 17:35:47 +0000 |
---|---|---|
committer | Andrey Nazarov <skuller@skuller.net> | 2008-08-28 17:35:47 +0000 |
commit | 8d466c8c99a82c9fa87d2c8a932413da1ac89e04 (patch) | |
tree | 9954623456ae4dc245daa98f57f913f9892a742b /source/sv_main.c | |
parent | 651dbdd53d61b75108ffdc95f3efdb285adc7170 (diff) |
Removed unimplemented `sv_mvd_wait' cvar.
Bind server TCP socket with SO_REUSEADDR option, close it properly on shutdown.
Implemented server console logging over HTTP, accessible at `/console' URI.
Added `sv_console_auth' cvar controlling access to server console.
Never allow server realtime go back.
Spectator chat on GTV is no longer audible.
Moved POV name on the very top of the screen.
Diffstat (limited to 'source/sv_main.c')
-rw-r--r-- | source/sv_main.c | 45 |
1 files changed, 20 insertions, 25 deletions
diff --git a/source/sv_main.c b/source/sv_main.c index e3bf43e..46e5aaf 100644 --- a/source/sv_main.c +++ b/source/sv_main.c @@ -61,6 +61,7 @@ cvar_t *sv_novis; cvar_t *sv_http_enable; cvar_t *sv_http_maxclients; cvar_t *sv_http_minclients; +cvar_t *sv_console_auth; cvar_t *sv_maxclients; cvar_t *sv_reserved_slots; @@ -1244,9 +1245,7 @@ void SV_ProcessEvents( void ) { // process loopback packets while( NET_GetLoopPacket( NS_SERVER ) ) { - if( sv_running->integer ) { - SV_PacketEvent( NET_OK ); - } + SV_PacketEvent( NET_OK ); } #endif @@ -1416,7 +1415,7 @@ static void SV_RunGameFrame( void ) { // compression can get confused when a client // has the "current" frame sv.framenum++; - svs.time += 100; + sv.frametime = 0; if( svs.mvd.dummy ) { SV_MvdBeginFrame(); @@ -1425,7 +1424,8 @@ static void SV_RunGameFrame( void ) { ge->RunFrame(); if( msg_write.cursize ) { - Com_WPrintf( "Game DLL left %"PRIz" bytes in multicast buffer, cleared.\n", + Com_WPrintf( "Game DLL left %"PRIz" bytes " + "in multicast buffer, cleared.\n", msg_write.cursize ); SZ_Clear( &msg_write ); } @@ -1435,13 +1435,6 @@ static void SV_RunGameFrame( void ) { SV_MvdEndFrame(); } - // never get more than one tic behind - if( svs.time < svs.realtime ) { - if( sv_showclamp->integer ) - Com_Printf( "sv highclamp\n" ); - svs.realtime = svs.time; - } - #if USE_CLIENT if( host_speeds->integer ) time_after_game = Sys_Milliseconds(); @@ -1520,7 +1513,7 @@ SV_Frame ================== */ -void SV_Frame( int msec ) { +void SV_Frame( unsigned msec ) { int mvdconns; #if USE_CLIENT @@ -1573,16 +1566,12 @@ void SV_Frame( int msec ) { SV_SendAsyncPackets(); // move autonomous things around if enough time has passed - if( !com_timedemo->integer && svs.realtime < svs.time ) { - // never let the time get too far off - if( svs.time - svs.realtime > 100 ) { - if( sv_showclamp->integer ) - Com_Printf( "sv lowclamp\n" ); - svs.realtime = svs.time - 100; - } - if( dedicated->integer ) { - NET_Sleep( svs.time - svs.realtime ); - } + sv.frametime += msec; + if( !com_timedemo->integer && sv.frametime < 100 ) { +#if USE_CLIENT + if( dedicated->integer ) +#endif + NET_Sleep( 100 - sv.frametime ); return; } @@ -1593,7 +1582,7 @@ void SV_Frame( int msec ) { SV_GiveMsec(); // let everything in the world think and move - SV_RunGameFrame(); + SV_RunGameFrame(); // send messages back to the clients that had packets read this frame SV_SendClientMessages(); @@ -1796,6 +1785,7 @@ void SV_Init( void ) { sv_http_enable = Cvar_Get( "sv_http_enable", "0", CVAR_LATCH ); sv_http_maxclients = Cvar_Get( "sv_http_maxclients", "4", 0 ); sv_http_minclients = Cvar_Get( "sv_http_minclients", "4", 0 ); + sv_console_auth = Cvar_Get( "sv_console_auth", "", 0 ); allow_download = Cvar_Get( "allow_download", "1", CVAR_ARCHIVE ); allow_download_players = Cvar_Get( "allow_download_players", "0", CVAR_ARCHIVE ); @@ -1899,7 +1889,6 @@ static void SV_FinalMessage( const char *message, int cmd ) { LIST_FOR_EACH( tcpClient_t, t, &svs.mvd.clients, mvdEntry ) { SV_HttpWrite( t, &length, 2 ); SV_HttpFinish( t ); - NET_Run( &t->stream ); } // free any data dynamically allocated @@ -1910,12 +1899,15 @@ static void SV_FinalMessage( const char *message, int cmd ) { SV_RemoveClient( client ); } + // drop any TCP clients, flushing pending data LIST_FOR_EACH_SAFE( tcpClient_t, t, tnext, &svs.tcp_client_list, entry ) { SV_HttpDrop( t, NULL ); + NET_Run( &t->stream ); NET_Close( &t->stream ); Z_Free( t ); } + // free cached TCP client slots LIST_FOR_EACH_SAFE( tcpClient_t, t, tnext, &svs.tcp_client_pool, entry ) { Z_Free( t ); } @@ -1957,6 +1949,9 @@ void SV_Shutdown( const char *finalmsg, killtype_t type ) { SV_FinalMessage( finalmsg, svc_disconnect ); } + // close server TCP socket + NET_Listen( qfalse ); + SV_MasterShutdown(); SV_ShutdownGameProgs(); |