diff --git a/code/server/sv_init.c b/code/server/sv_init.c index b3d0c4d..e07731e 100644 --- a/code/server/sv_init.c +++ b/code/server/sv_init.c @@ -667,6 +667,14 @@ void SV_Shutdown( char *finalmsg ) { Com_Printf( "----- Server Shutdown -----\n" ); + // clean up any active demo recording/playback + if ( SVD_IsRecording() ) { + SVD_StopRecord_f(); + } + if ( SVD_IsPlaying() ) { + SVD_StopPlay_f(); + } + if ( svs.clients && !com_errorEntered ) { SV_FinalMessage( finalmsg ); } diff --git a/code/server/sv_netdemo.c b/code/server/sv_netdemo.c index 31cb12a..2796848 100644 --- a/code/server/sv_netdemo.c +++ b/code/server/sv_netdemo.c @@ -735,11 +735,10 @@ void SVD_Play_f( void ) { demo.needConfigstrings = qtrue; } -void SVD_StopPlay_f( void ) { +static void SVD_CleanupPlayback( void ) { int i; if ( !demo.playing ) { - Com_Printf( "Not playing a server demo.\n" ); return; } @@ -751,9 +750,25 @@ void SVD_StopPlay_f( void ) { Z_Free( demo.savedConfigstrings[i] ); } } - memset( &demo, 0, sizeof(demo) ); + // free zombie client slots + for ( i = 0; i < demo.playMaxClients; i++ ) { + if ( svs.clients[i].state == CS_ZOMBIE ) { + svs.clients[i].state = CS_FREE; + } + } + + memset( &demo, 0, sizeof(demo) ); Cvar_Set( "sv_demoplaying", "0" ); +} + +void SVD_StopPlay_f( void ) { + if ( !demo.playing ) { + Com_Printf( "Not playing a server demo.\n" ); + return; + } + + SVD_CleanupPlayback(); Com_Printf( "Server demo playback stopped.\n" ); } @@ -773,8 +788,8 @@ qboolean SVD_PlaybackFrame( void ) { } if ( !SVD_ReadFrame( demo.playFile ) ) { - demo.endOfDemo = qtrue; Com_Printf( "Server demo playback finished.\n" ); + SVD_CleanupPlayback(); return qfalse; }