Seeking works from paused state

Read keyframe directly in SVD_Seek_f instead of deferring to
SVD_PlaybackFrame (which is blocked when paused). Both svdemo_seek
and svdemo_seekexact now work regardless of pause state.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
serge_shubin 2026-03-24 20:35:14 +08:00
parent d0a4310bad
commit 0ebcc76135

View file

@ -1087,8 +1087,13 @@ void SVD_Seek_f( void ) {
demo.seeked = qtrue; demo.seeked = qtrue;
demo.endOfDemo = qfalse; demo.endOfDemo = qfalse;
// reset client snapshot timing so SV_SendClientMessages doesn't // read the keyframe directly (works even when paused)
// skip sending (nextSnapshotTime was in the future, now svs.time is past) svs.snapFlagServerBit &= ~SNAPFLAG_RESET_ENTITIES;
if ( !SVD_ReadFrame( demo.playFile ) ) {
demo.endOfDemo = qtrue;
}
// reset client snapshot timing
{ {
int j; int j;
for ( j = 0; j < sv_maxclients->integer; j++ ) { for ( j = 0; j < sv_maxclients->integer; j++ ) {
@ -1098,7 +1103,7 @@ void SVD_Seek_f( void ) {
} }
} }
// ensure one frame runs on next SV_Frame // ensure one frame runs on next SV_Frame (for G_RunFrame + snapshot)
sv.timeResidual = 1000 / sv_fps->integer; sv.timeResidual = 1000 / sv_fps->integer;
Com_Printf( "Seeked to time %d.\n", svs.time ); Com_Printf( "Seeked to time %d.\n", svs.time );