]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_main.c
fixed a crash with r_lerpsprites 0 mode
[xonotic/darkplaces.git] / cl_main.c
index 88b134c839f363fd6e8380127db88f3f5a9fc2fc..2ea477a3c4dc75bc501978c69e704975239f5856 100644 (file)
--- a/cl_main.c
+++ b/cl_main.c
@@ -222,11 +222,13 @@ void CL_EstablishConnection(const char *host)
 
        // clear menu's connect error message
        m_return_reason[0] = 0;
+       cls.demonum = -1;
 
        // stop demo loop in case this fails
-       cls.demonum = -1;
        CL_Disconnect();
-
+       NetConn_ClientFrame();
+       NetConn_ServerFrame();
+       
        if (LHNETADDRESS_FromString(&cls.connect_address, host, 26000) && (cls.connect_mysocket = NetConn_ChooseClientSocketForAddress(&cls.connect_address)))
        {
                cls.connect_trying = true;
@@ -244,6 +246,11 @@ void CL_EstablishConnection(const char *host)
                        NetConn_ServerFrame();
                }
        }
+       else
+       {
+               Con_Printf("Unable to find a suitable network socket to connect to server.\n");
+               strcpy(m_return_reason, "No network");
+       }
 }
 
 /*
@@ -263,10 +270,9 @@ static void CL_PrintEntities_f(void)
                        continue;
 
                if (ent->render.model)
-                       strncpy(name, ent->render.model->name, 25);
+                       strlcpy (name, ent->render.model->name, 25);
                else
                        strcpy(name, "--no model--");
-               name[25] = 0;
                for (j = strlen(name);j < 25;j++)
                        name[j] = ' ';
                Con_Printf ("%3i: %s:%04i (%5i %5i %5i) [%3i %3i %3i] %4.2f %5.3f\n", i, name, ent->render.frame, (int) ent->render.origin[0], (int) ent->render.origin[1], (int) ent->render.origin[2], (int) ent->render.angles[0] % 360, (int) ent->render.angles[1] % 360, (int) ent->render.angles[2] % 360, ent->render.scale, ent->render.alpha);
@@ -462,7 +468,6 @@ void CL_DecayLights(void)
                        dl->radius = (cl.time < dl->die) ? max(0, dl->radius - time * dl->decay) : 0;
 }
 
-extern qboolean Nehahrademcompatibility;
 #define MAXVIEWMODELS 32
 entity_t *viewmodels[MAXVIEWMODELS];
 int numviewmodels;
@@ -496,7 +501,7 @@ void CL_LinkNetworkEntity(entity_t *e)
                        return;
                if (e->render.flags & RENDER_VIEWMODEL)
                {
-                       if (cl.stats[STAT_HEALTH] <= 0 || !r_drawviewmodel.integer || chase_active.integer || envmap || (cl.items & IT_INVISIBILITY))
+                       if (!r_drawviewmodel.integer || chase_active.integer || envmap)
                                return;
                        if (cl.viewentity)
                                CL_LinkNetworkEntity(cl_entities + cl.viewentity);
@@ -587,6 +592,10 @@ void CL_LinkNetworkEntity(entity_t *e)
                                e->render.frame = e->render.frame2 = e->state_current.frame;
                                e->render.frame2time = cl.time;
                                e->render.framelerp = 0;
+                               // make sure frame lerp won't last longer than 100ms
+                               // (this mainly helps with models that use framegroups and
+                               // switch between them infrequently)
+                               e->render.frame1time = max(e->render.frame1time, e->render.frame2time - 0.1f);
                        }
                }
                else
@@ -605,7 +614,7 @@ void CL_LinkNetworkEntity(entity_t *e)
                        Mod_CheckLoaded(e->render.model);
                        if (e->render.model->type == mod_alias || e->render.model->type == mod_sprite)
                                angles[0] = -angles[0];
-                       if (e->render.model->flags & EF_ROTATE)
+                       if ((e->render.model->flags & EF_ROTATE) && (!e->state_current.tagentity && !(e->render.flags & RENDER_VIEWMODEL)))
                        {
                                angles[1] = ANGLEMOD(100*cl.time);
                                if (cl_itembobheight.value)
@@ -715,7 +724,7 @@ void CL_LinkNetworkEntity(entity_t *e)
                        e->persistent.muzzleflash -= cl.frametime * 1000;
                }
                // LordHavoc: if the model has no flags, don't check each
-               if (e->render.model && e->render.model->flags)
+               if (e->render.model && e->render.model->flags && (!e->state_current.tagentity && !(e->render.flags & RENDER_VIEWMODEL)))
                {
                        if (e->render.model->flags & EF_GIB)
                                trailtype = 2;
@@ -786,12 +795,12 @@ void CL_LinkNetworkEntity(entity_t *e)
                if (!(e->render.effects & (EF_NOSHADOW | EF_ADDITIVE))
                 && (e->render.alpha == 1)
                 && !(e->render.flags & RENDER_VIEWMODEL)
-                && ((e - cl_entities) != cl.viewentity || (!cl.intermission && !Nehahrademcompatibility && !cl_noplayershadow.integer)))
+                && ((e - cl_entities) != cl.viewentity || (!cl.intermission && cl.protocol != PROTOCOL_NEHAHRAMOVIE && !cl_noplayershadow.integer)))
                        e->render.flags |= RENDER_SHADOW;
                // as soon as player is known we can call V_CalcRefDef
                if ((e - cl_entities) == cl.viewentity)
                        V_CalcRefdef();
-               if (e->render.model && e->render.model->name[0] == '*' && e->render.model->brush.TraceBox)
+               if (e->render.model && e->render.model->name[0] == '*' && e->render.model->TraceBox)
                        cl_brushmodel_entities[cl_num_brushmodel_entities++] = &e->render;
                // don't show entities with no modelindex (note: this still shows
                // entities which have a modelindex that resolved to a NULL model)
@@ -843,6 +852,15 @@ static void CL_RelinkNetworkEntities(void)
        ent->state_current.modelindex = cl.stats[STAT_WEAPON];
        ent->state_current.frame = cl.stats[STAT_WEAPONFRAME];
        ent->state_current.flags = RENDER_VIEWMODEL;
+       if (cl.stats[STAT_HEALTH] <= 0 || cl.intermission)
+               ent->state_current.modelindex = 0;
+       else if (cl.items & IT_INVISIBILITY)
+       {
+               if (gamemode == GAME_TRANSFUSION)
+                       ent->state_current.alpha = 128;
+               else
+                       ent->state_current.modelindex = 0;
+       }
 
        // start on the entity after the world
        entitylinkframenumber++;
@@ -1095,27 +1113,10 @@ int CL_ReadFromServer(void)
 CL_SendCmd
 =================
 */
-void CL_SendCmd(void)
+void CL_SendCmd(usercmd_t *cmd)
 {
-       usercmd_t cmd;
-
        if (cls.signon == SIGNONS)
-       {
-               // get basic movement from keyboard
-               CL_BaseMove(&cmd);
-
-               // OS independent code
-               IN_PreMove();
-
-               // allow mice or other external controllers to add to the move
-               IN_Move(&cmd);
-
-               // OS independent code
-               IN_PostMove();
-
-               // send the unreliable message
-               CL_SendMove(&cmd);
-       }
+               CL_SendMove(cmd);
 
        if (cls.demoplayback)
        {