]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_parse.c
Added the global float "intermission" to CSQC defs (in clprogdefs.h). Intermission...
[xonotic/darkplaces.git] / cl_parse.c
index 4341a3cb7920a8cc8e99c060d7c6188c1a7dddd4..b304a756c59486dadec924d0ca0d4545bca33e3e 100644 (file)
@@ -1396,7 +1396,10 @@ void CL_ParseServerInfo (void)
 
        // if server is active, we already began a loading plaque
        if (!sv.active)
+       {
                SCR_BeginLoadingPlaque();
+               S_StopAllSounds();
+       }
 
        // check memory integrity
        Mem_CheckSentinelsGlobal();
@@ -1583,6 +1586,7 @@ void CL_ParseServerInfo (void)
                cl.downloadcsqc = true;
                cl.loadbegun = false;
                cl.loadfinished = false;
+               cl.loadcsqc = true;
        }
 
        // check memory integrity
@@ -1666,7 +1670,7 @@ void CL_MoveLerpEntityStates(entity_t *ent)
                VectorCopy(ent->state_current.origin, ent->persistent.neworigin);
                VectorCopy(ent->state_current.angles, ent->persistent.newangles);
                // reset animation interpolation as well
-               ent->render.frame = ent->render.frame1 = ent->render.frame2 = ent->state_current.frame;
+               ent->render.frame1 = ent->render.frame2 = ent->state_current.frame;
                ent->render.frame1time = ent->render.frame2time = cl.time;
                ent->render.framelerp = 1;
                // reset various persistent stuff
@@ -1895,7 +1899,7 @@ void CL_ParseStatic (int large)
 
 // copy it to the current state
        ent->render.model = cl.model_precache[ent->state_baseline.modelindex];
-       ent->render.frame = ent->render.frame1 = ent->render.frame2 = ent->state_baseline.frame;
+       ent->render.frame1 = ent->render.frame2 = ent->state_baseline.frame;
        ent->render.framelerp = 0;
        // make torchs play out of sync
        ent->render.frame1time = ent->render.frame2time = lhrandom(-10, -1);
@@ -2884,7 +2888,15 @@ static void CL_NetworkTimeReceived(double newtime)
        cl.mtime[0] = newtime;
        if (cls.timedemo || (cl.islocalgame && !sv_fixedframeratesingleplayer.integer) || cl.mtime[1] == cl.mtime[0] || cls.signon < SIGNONS)
                cl.time = cl.mtime[1] = newtime;
-       else if (cls.protocol != PROTOCOL_QUAKEWORLD && !cls.demoplayback)
+       else if (cls.demoplayback)
+       {       
+               // when time falls behind during demo playback it means the cl.mtime[1] was altered
+               // due to a large time gap, so treat it as an instant change in time
+               // (this can also happen during heavy packet loss in the demo)
+               if (cl.time < newtime - 0.1)
+                       cl.mtime[1] = cl.time = newtime;
+       }
+       else if (cls.protocol != PROTOCOL_QUAKEWORLD)
        {
                cl.mtime[1] = max(cl.mtime[1], cl.mtime[0] - 0.1);
                if (developer.integer >= 100 && vid_activewindow)
@@ -3687,12 +3699,14 @@ void CL_ParseServerMessage(void)
                                if(!cl.intermission)
                                        cl.completed_time = cl.time;
                                cl.intermission = 1;
+                               CL_VM_UpdateIntermissionState(cl.intermission);
                                break;
 
                        case svc_finale:
                                if(!cl.intermission)
                                        cl.completed_time = cl.time;
                                cl.intermission = 2;
+                               CL_VM_UpdateIntermissionState(cl.intermission);
                                SCR_CenterPrint(MSG_ReadString ());
                                break;
 
@@ -3700,6 +3714,7 @@ void CL_ParseServerMessage(void)
                                if(!cl.intermission)
                                        cl.completed_time = cl.time;
                                cl.intermission = 3;
+                               CL_VM_UpdateIntermissionState(cl.intermission);
                                SCR_CenterPrint(MSG_ReadString ());
                                break;