Toggle snapFlagServerBit on map_restart during demo playback

Record a per-frame restart flag (1 byte) set by SVD_ResetDeltaState
when map_restart occurs. During playback, toggle svs.snapFlagServerBit
so the client treats the next snapshot as a fresh baseline — no
interpolation of entities from pre-restart positions.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
serge_shubin 2026-03-23 06:03:45 +08:00
parent cc081ddee4
commit 479443513a

View file

@ -93,6 +93,7 @@ typedef struct {
// buffered server commands for current frame // buffered server commands for current frame
char serverCmds[SVD_MAX_SERVERCMDS][SVD_MAX_SERVERCMD_LEN]; char serverCmds[SVD_MAX_SERVERCMDS][SVD_MAX_SERVERCMD_LEN];
int numServerCmds; int numServerCmds;
qboolean mapRestarted; // set by SVD_ResetDeltaState, written as frame flag
// playback // playback
fileHandle_t playFile; fileHandle_t playFile;
@ -245,6 +246,16 @@ static void SVD_WriteFrame( fileHandle_t f ) {
SVD_WriteInt( f, svs.time ); SVD_WriteInt( f, svs.time );
SVD_WriteShort( f, (short)sv.num_entities ); 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 // delta-compress all entities into a message buffer
MSG_Init( &msg, msgBuf, sizeof(msgBuf) ); 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.prevEntities, 0, sizeof(demo.prevEntities) );
Com_Memset( demo.prevPlayers, 0, sizeof(demo.prevPlayers) ); Com_Memset( demo.prevPlayers, 0, sizeof(demo.prevPlayers) );
demo.mapRestarted = qtrue; // signal next frame to write restart marker
} }
void SVD_RecordFrame( void ) { void SVD_RecordFrame( void ) {
@ -642,6 +654,17 @@ static qboolean SVD_ReadFrame( fileHandle_t f ) {
svs.time = serverTime; svs.time = serverTime;
numEnts = SVD_ReadShort( f ); 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) // read entity message (optionally LZ4 compressed)
blockLen = SVD_ReadBlock( f, msgBuf, sizeof(msgBuf) ); blockLen = SVD_ReadBlock( f, msgBuf, sizeof(msgBuf) );
if ( blockLen <= 0 ) { if ( blockLen <= 0 ) {