]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_parse.c
removed r_shadow_realtime_world_dlightshadows cvar, now the
[xonotic/darkplaces.git] / cl_parse.c
index 75f1e2b9654daa2d8f62f0aac48bbc3d988a2c72..5c80f8a7fd1e1d09c5be680f535eb18a7cdbb999 100644 (file)
@@ -172,7 +172,7 @@ cvar_t cl_sound_r_exp3 = {0, "cl_sound_r_exp3", "weapons/r_exp3.wav", "sound to
 cvar_t cl_serverextension_download = {0, "cl_serverextension_download", "0", "indicates whether the server supports the download command"};
 cvar_t cl_joinbeforedownloadsfinish = {CVAR_SAVE, "cl_joinbeforedownloadsfinish", "1", "if non-zero the game will begin after the map is loaded before other downloads finish"};
 cvar_t cl_nettimesyncfactor = {CVAR_SAVE, "cl_nettimesyncfactor", "0", "rate at which client time adapts to match server time, 1 = instantly, 0.125 = slowly, 0 = not at all (bounding still applies)"};
-cvar_t cl_nettimesyncboundmode = {CVAR_SAVE, "cl_nettimesyncboundmode", "4", "method of restricting client time to valid values, 0 = no correction, 1 = tight bounding (jerky with packet loss), 2 = loose bounding (corrects it if out of bounds), 3 = leniant bounding (ignores temporary errors due to varying framerate), 4 = slow adjustment method from Quake3"};
+cvar_t cl_nettimesyncboundmode = {CVAR_SAVE, "cl_nettimesyncboundmode", "6", "method of restricting client time to valid values, 0 = no correction, 1 = tight bounding (jerky with packet loss), 2 = loose bounding (corrects it if out of bounds), 3 = leniant bounding (ignores temporary errors due to varying framerate), 4 = slow adjustment method from Quake3, 5 = slighttly nicer version of Quake3 method, 6 = bounding + Quake3"};
 cvar_t cl_nettimesyncboundtolerance = {CVAR_SAVE, "cl_nettimesyncboundtolerance", "0.25", "how much error is tolerated by bounding check, as a fraction of frametime, 0.25 = up to 25% margin of error tolerated, 1 = use only new time, 0 = use only old time (same effect as setting cl_nettimesyncfactor to 1)"};
 cvar_t cl_iplog_name = {CVAR_SAVE, "cl_iplog_name", "darkplaces_iplog.txt", "name of iplog file containing player addresses for iplog_list command and automatic ip logging when parsing status command"};
 
@@ -329,13 +329,13 @@ void CL_ParseEntityLump(char *entdata)
        data = entdata;
        if (!data)
                return;
-       if (!COM_ParseTokenConsole(&data))
+       if (!COM_ParseToken_Simple(&data, false))
                return; // error
        if (com_token[0] != '{')
                return; // error
        while (1)
        {
-               if (!COM_ParseTokenConsole(&data))
+               if (!COM_ParseToken_Simple(&data, false))
                        return; // error
                if (com_token[0] == '}')
                        break; // end of worldspawn
@@ -345,7 +345,7 @@ void CL_ParseEntityLump(char *entdata)
                        strlcpy (key, com_token, sizeof (key));
                while (key[strlen(key)-1] == ' ') // remove trailing spaces
                        key[strlen(key)-1] = 0;
-               if (!COM_ParseTokenConsole(&data))
+               if (!COM_ParseToken_Simple(&data, false))
                        return; // error
                strlcpy (value, com_token, sizeof (value));
                if (!strcmp("sky", key))
@@ -479,7 +479,8 @@ static void QW_CL_RequestNextDownload(void)
 
                // touch all of the precached models that are still loaded so we can free
                // anything that isn't needed
-               Mod_ClearUsed();
+               if (!sv.active)
+                       Mod_ClearUsed();
                for (i = 1;i < MAX_MODELS && cl.model_name[i][0];i++)
                        Mod_FindName(cl.model_name[i]);
                // precache any models used by the client (this also marks them used)
@@ -1417,17 +1418,27 @@ void CL_ParseServerInfo (void)
                str = MSG_ReadString ();
                strlcpy (cl.levelname, str, sizeof(cl.levelname));
 
-               // get the movevars
-               cl.qw_movevars_gravity            = MSG_ReadFloat();
-               cl.qw_movevars_stopspeed          = MSG_ReadFloat();
-               cl.qw_movevars_maxspeed           = MSG_ReadFloat();
-               cl.qw_movevars_spectatormaxspeed  = MSG_ReadFloat();
-               cl.qw_movevars_accelerate         = MSG_ReadFloat();
-               cl.qw_movevars_airaccelerate      = MSG_ReadFloat();
-               cl.qw_movevars_wateraccelerate    = MSG_ReadFloat();
-               cl.qw_movevars_friction           = MSG_ReadFloat();
-               cl.qw_movevars_waterfriction      = MSG_ReadFloat();
-               cl.qw_movevars_entgravity         = MSG_ReadFloat();
+               // get the movevars that are defined in the qw protocol
+               cl.movevars_gravity            = MSG_ReadFloat();
+               cl.movevars_stopspeed          = MSG_ReadFloat();
+               cl.movevars_maxspeed           = MSG_ReadFloat();
+               cl.movevars_spectatormaxspeed  = MSG_ReadFloat();
+               cl.movevars_accelerate         = MSG_ReadFloat();
+               cl.movevars_airaccelerate      = MSG_ReadFloat();
+               cl.movevars_wateraccelerate    = MSG_ReadFloat();
+               cl.movevars_friction           = MSG_ReadFloat();
+               cl.movevars_waterfriction      = MSG_ReadFloat();
+               cl.movevars_entgravity         = MSG_ReadFloat();
+
+               // other movevars not in the protocol...
+               cl.movevars_wallfriction = 0;
+               cl.movevars_timescale = 1;
+               cl.movevars_jumpvelocity = 270;
+               cl.movevars_edgefriction = 2;
+               cl.movevars_maxairspeed = 30;
+               cl.movevars_stepheight = 18;
+               cl.movevars_airaccel_qw = 1;
+               cl.movevars_airaccel_sideways_friction = 0;
 
                // seperate the printfs so the server message can have a color
                Con_Printf("\n\n\35\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\36\37\n\n\2%s\n", str);
@@ -1503,7 +1514,8 @@ void CL_ParseServerInfo (void)
 
                // touch all of the precached models that are still loaded so we can free
                // anything that isn't needed
-               Mod_ClearUsed();
+               if (!sv.active)
+                       Mod_ClearUsed();
                for (i = 1;i < nummodels;i++)
                        Mod_FindName(cl.model_name[i]);
                // precache any models used by the client (this also marks them used)
@@ -1624,7 +1636,7 @@ void CL_MoveLerpEntityStates(entity_t *ent)
                ent->render.framelerp = 1;
                // reset various persistent stuff
                ent->persistent.muzzleflash = 0;
-               VectorCopy(ent->state_current.origin, ent->persistent.trail_origin);
+               ent->persistent.trail_allowed = false;
        }
        else if (DotProduct(odelta, odelta) > 1000*1000 || (cl.fixangle[0] && !cl.fixangle[1]))
        {
@@ -1637,6 +1649,7 @@ void CL_MoveLerpEntityStates(entity_t *ent)
                VectorCopy(ent->state_current.angles, ent->persistent.oldangles);
                VectorCopy(ent->state_current.origin, ent->persistent.neworigin);
                VectorCopy(ent->state_current.angles, ent->persistent.newangles);
+               ent->persistent.trail_allowed = false;
        }
        else if (ent->state_current.flags & RENDER_STEP)
        {
@@ -2820,12 +2833,13 @@ extern cvar_t slowmo;
 static void CL_NetworkTimeReceived(double newtime)
 {
        double timehigh;
-       cl.mtime[1] = max(cl.mtime[0], newtime - 0.1);
+       cl.mtime[1] = cl.mtime[0];
        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)
+       else if (cls.protocol != PROTOCOL_QUAKEWORLD && !cls.demoplayback)
        {
+               cl.mtime[1] = max(cl.mtime[1], cl.mtime[0] - 0.1);
                if (developer.integer >= 100 && vid_activewindow)
                {
                        if (cl.time < cl.mtime[1] - (cl.mtime[0] - cl.mtime[1]))
@@ -2854,9 +2868,23 @@ static void CL_NetworkTimeReceived(double newtime)
                        else if (fabs(cl.time - cl.mtime[1]) > 0.1)
                                cl.time += 0.5 * (cl.mtime[1] - cl.time); // fast
                        else if (cl.time > cl.mtime[1])
-                               cl.time -= 0.002 * slowmo.value; // fall into the past by 2ms
+                               cl.time -= 0.002 * cl.movevars_timescale; // fall into the past by 2ms
                        else
-                               cl.time += 0.001 * slowmo.value; // creep forward 1ms
+                               cl.time += 0.001 * cl.movevars_timescale; // creep forward 1ms
+               }
+               else if (cl_nettimesyncboundmode.integer == 5)
+               {
+                       if (fabs(cl.time - cl.mtime[1]) > 0.5)
+                               cl.time = cl.mtime[1]; // reset
+                       else if (fabs(cl.time - cl.mtime[1]) > 0.1)
+                               cl.time += 0.5 * (cl.mtime[1] - cl.time); // fast
+                       else
+                               cl.time = bound(cl.time - 0.002 * cl.movevars_timescale, cl.mtime[1], cl.time + 0.001 * cl.movevars_timescale);
+               }
+               else if (cl_nettimesyncboundmode.integer == 6)
+               {
+                       cl.time = bound(cl.mtime[1], cl.time, cl.mtime[0]);
+                       cl.time = bound(cl.time - 0.002 * cl.movevars_timescale, cl.mtime[1], cl.time + 0.001 * cl.movevars_timescale);
                }
        }
        // this packet probably contains a player entity update, so we will need
@@ -2889,6 +2917,7 @@ CL_ParseServerMessage
 =====================
 */
 int parsingerror = false;
+extern void CL_UpdateMoveVars(void);
 void CL_ParseServerMessage(void)
 {
        int                     cmd;
@@ -3238,11 +3267,13 @@ void CL_ParseServerMessage(void)
                                break;
 
                        case qw_svc_maxspeed:
-                               cl.qw_movevars_maxspeed = MSG_ReadFloat();
+                               cl.movevars_maxspeed = MSG_ReadFloat();
                                break;
 
                        case qw_svc_entgravity:
-                               cl.qw_movevars_entgravity = MSG_ReadFloat();
+                               cl.movevars_entgravity = MSG_ReadFloat();
+                               if (!cl.movevars_entgravity)
+                                       cl.movevars_entgravity = 1.0f;
                                break;
 
                        case qw_svc_setpause:
@@ -3692,6 +3723,8 @@ void CL_ParseServerMessage(void)
 
        EntityFrameQuake_ISeeDeadEntities();
 
+       CL_UpdateMoveVars();
+
        parsingerror = false;
 
        // LordHavoc: this was at the start of the function before cl_autodemo was