diff --git a/code/server/sv_netdemo.c b/code/server/sv_netdemo.c index 037d5a7..aa8362a 100644 --- a/code/server/sv_netdemo.c +++ b/code/server/sv_netdemo.c @@ -663,12 +663,16 @@ static qboolean SVD_ReadFrame( fileHandle_t f ) { demo.playPrevEntities[entNum].es = newEs; demo.playPrevEntities[entNum].active = qtrue; - // apply to server entity (entity linking done in G_RunFrame - // which has BG_EvaluateTrajectory for computing currentOrigin) + // apply to server entity and link for PVS. + // use trBase as initial origin — G_RunFrame will refine with + // BG_EvaluateTrajectory for moving entities (rockets etc). ent = SV_GentityNum( entNum ); ent->s = newEs; ent->s.number = entNum; ent->r.svFlags = demo.playPrevEntities[entNum].svFlags; + VectorCopy( newEs.pos.trBase, ent->r.currentOrigin ); + ent->r.linked = qtrue; + SV_LinkEntity( ent ); if ( entNum + 1 > sv.num_entities ) { sv.num_entities = entNum + 1; @@ -908,7 +912,10 @@ void SVD_Pause_f( void ) { if ( !demo.paused ) { // resuming — toggle SERVERCOUNT to reset client snapshot timing // (drifted during pause from identical serverTimes). + // also reset entities so fast-moving objects (rockets) snap to + // position instead of interpolating through the pause gap. svs.snapFlagServerBit ^= SNAPFLAG_SERVERCOUNT; + svs.snapFlagServerBit |= SNAPFLAG_RESET_ENTITIES; } Com_Printf( "Demo playback %s.\n", demo.paused ? "paused" : "resumed" ); }