diff --git a/code/server/sv_netdemo.c b/code/server/sv_netdemo.c index fc14425..71d39bd 100644 --- a/code/server/sv_netdemo.c +++ b/code/server/sv_netdemo.c @@ -93,6 +93,7 @@ typedef struct { // buffered server commands for current frame char serverCmds[SVD_MAX_SERVERCMDS][SVD_MAX_SERVERCMD_LEN]; int numServerCmds; + qboolean mapRestarted; // set by SVD_ResetDeltaState, written as frame flag // playback fileHandle_t playFile; @@ -245,6 +246,16 @@ static void SVD_WriteFrame( fileHandle_t f ) { SVD_WriteInt( f, svs.time ); SVD_WriteShort( f, (short)sv.num_entities ); + // frame flags: bit 0 = map restarted + { + byte frameFlags = 0; + if ( demo.mapRestarted ) { + frameFlags |= 1; + demo.mapRestarted = qfalse; + } + FS_Write( &frameFlags, 1, f ); + } + // delta-compress all entities into a message buffer MSG_Init( &msg, msgBuf, sizeof(msgBuf) ); @@ -536,6 +547,7 @@ void SVD_ResetDeltaState( void ) { } Com_Memset( demo.prevEntities, 0, sizeof(demo.prevEntities) ); Com_Memset( demo.prevPlayers, 0, sizeof(demo.prevPlayers) ); + demo.mapRestarted = qtrue; // signal next frame to write restart marker } void SVD_RecordFrame( void ) { @@ -642,6 +654,17 @@ static qboolean SVD_ReadFrame( fileHandle_t f ) { svs.time = serverTime; numEnts = SVD_ReadShort( f ); + // read frame flags + { + byte frameFlags; + FS_Read( &frameFlags, 1, f ); + if ( frameFlags & 1 ) { + // map was restarted — toggle server bit so client + // treats next snapshot as fresh (no interpolation) + svs.snapFlagServerBit ^= SNAPFLAG_SERVERCOUNT; + } + } + // read entity message (optionally LZ4 compressed) blockLen = SVD_ReadBlock( f, msgBuf, sizeof(msgBuf) ); if ( blockLen <= 0 ) {