From 541b98edda232f9c1ccee209ae2b6db5d0863da8 Mon Sep 17 00:00:00 2001 From: Shpoike Date: Sun, 21 Jul 2024 01:18:21 +0100 Subject: [PATCH] Fix mvd ents spawning with the wrong entity in certain cases. --- engine/client/cl_demo.c | 5 ++++- engine/client/cl_pred.c | 21 +++++++++++---------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/engine/client/cl_demo.c b/engine/client/cl_demo.c index b302d476e..0ee3b3b55 100644 --- a/engine/client/cl_demo.c +++ b/engine/client/cl_demo.c @@ -533,6 +533,7 @@ qboolean CL_GetDemoMessage (void) int demopos = 0; int msglength; static float throttle; + static qboolean newseq; if (endofdemo) { @@ -783,6 +784,7 @@ readnext: { if ((msecsadded || cls.netchan.incoming_sequence < 2) && olddemotime != demotime) { + newseq = true; cls.netchan.frame_latency = 0; cls.netchan.last_received = realtime; // just to happy timeout check } @@ -995,8 +997,9 @@ readit: if (cls.demoplayback == DPB_MVD) { - if ((msecsadded || cls.netchan.incoming_sequence < 2) && olddemotime != demotime) + if (/*(msecsadded || cls.netchan.incoming_sequence < 2) && olddemotime != demotime ||*/ newseq) { + newseq = false; if (!(cls.fteprotocolextensions2 & PEXT2_REPLACEMENTDELTAS)) { cls.netchan.incoming_sequence++; diff --git a/engine/client/cl_pred.c b/engine/client/cl_pred.c index 19ca04095..7e9fe41c6 100644 --- a/engine/client/cl_pred.c +++ b/engine/client/cl_pred.c @@ -611,6 +611,7 @@ short LerpAngles16(short to, short from, float frac) void CL_CalcClientTime(void) { + extern cvar_t cl_demospeed; if (!cls.state) { if (!cl.implicitpause) @@ -649,6 +650,7 @@ void CL_CalcClientTime(void) else { //funky magic drift logic. we be behind the most recent frame in order to attempt to cover network congestions (which is apparently common in germany). float min, max; + float r; // oldst = cl.servertime; @@ -659,14 +661,13 @@ void CL_CalcClientTime(void) if (max < min) max = min; + if (cls.demoplayback && cl_demospeed.value > 0 && cls.state == ca_active) + r = cl_demospeed.value; + else + r = 1; + if (max) - { - extern cvar_t cl_demospeed; - if (cls.demoplayback && cl_demospeed.value > 0 && cls.state == ca_active) - cl.servertime += host_frametime*cl_demospeed.value; - else - cl.servertime += host_frametime; - } + cl.servertime += host_frametime*r; else cl.servertime = 0; @@ -681,7 +682,7 @@ void CL_CalcClientTime(void) } else { - cl.servertime -= 0.02*(max - cl.servertime); + cl.servertime -= 0.02*(max - cl.servertime)*r; if (cl.servertime < cl.time) cl.servertime = cl.time; } @@ -695,12 +696,12 @@ void CL_CalcClientTime(void) } else if (cl.servertime < min-0.3) { - cl.servertime += 0.02*(min - cl.servertime); + cl.servertime += 0.02*(min - cl.servertime)*r; // Con_Printf("running really slow\n"); } else { - cl.servertime += 0.01*(min - cl.servertime); + cl.servertime += 0.01*(min - cl.servertime)*r; // Con_Printf("running slow\n"); } }