]> 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 9974a30b37097d342a8a910d6ccd01da16346073..b304a756c59486dadec924d0ca0d4545bca33e3e 100644 (file)
@@ -979,6 +979,7 @@ void CL_BeginDownloads(qboolean aborteddownload)
                 && (FS_CRCFile(csqc_progname.string, &progsize) != csqc_progcrc.integer || ((int)progsize != csqc_progsize.integer && csqc_progsize.integer != -1))
                 && !FS_FileExists(va("dlcache/%s.%i.%i", csqc_progname.string, csqc_progsize.integer, csqc_progcrc.integer)))
                {
+                       Con_Printf("Downloading new CSQC code to dlcache/%s.%i.%i\n", csqc_progname.string, csqc_progsize.integer, csqc_progcrc.integer);
                        Cmd_ForwardStringToServer(va("download %s", csqc_progname.string));
                        return;
                }
@@ -1395,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();
@@ -1582,6 +1586,7 @@ void CL_ParseServerInfo (void)
                cl.downloadcsqc = true;
                cl.loadbegun = false;
                cl.loadfinished = false;
+               cl.loadcsqc = true;
        }
 
        // check memory integrity
@@ -1665,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
@@ -1894,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);
@@ -2883,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)
@@ -3686,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;
 
@@ -3699,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;