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:
parent
cc081ddee4
commit
479443513a
1 changed files with 23 additions and 0 deletions
|
|
@ -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 ) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue