]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_input.c
fixed crashes when changing a few settings while playing a demo
[xonotic/darkplaces.git] / cl_input.c
index 6235e25d2e5d05e00b79ebb1e9d131c45ea51c2c..402a9ec68c6170ee64d85cac271983df3192a5c4 100644 (file)
@@ -495,8 +495,8 @@ void CL_UpdatePrydonCursor(void)
        cl.cmd.cursor_screen[1] = bound(-1, cl.cmd.cursor_screen[1], 1);
        cl.cmd.cursor_screen[2] = 1;
 
-       scale[0] = -r_refdef.frustum_x;
-       scale[1] = -r_refdef.frustum_y;
+       scale[0] = -r_view.frustum_x;
+       scale[1] = -r_view.frustum_y;
        scale[2] = 1;
 
        // trace distance
@@ -505,9 +505,9 @@ void CL_UpdatePrydonCursor(void)
        // calculate current view matrix
        V_CalcRefdef();
        VectorClear(temp);
-       Matrix4x4_Transform(&r_refdef.viewentitymatrix, temp, cl.cmd.cursor_start);
+       Matrix4x4_Transform(&r_view.matrix, temp, cl.cmd.cursor_start);
        VectorSet(temp, cl.cmd.cursor_screen[2] * scale[2], cl.cmd.cursor_screen[0] * scale[0], cl.cmd.cursor_screen[1] * scale[1]);
-       Matrix4x4_Transform(&r_refdef.viewentitymatrix, temp, cl.cmd.cursor_end);
+       Matrix4x4_Transform(&r_view.matrix, temp, cl.cmd.cursor_end);
        // trace from view origin to the cursor
        cl.cmd.cursor_fraction = CL_SelectTraceLine(cl.cmd.cursor_start, cl.cmd.cursor_end, cl.cmd.cursor_impact, cl.cmd.cursor_normal, &cl.cmd.cursor_entitynumber, (chase_active.integer || cl.intermission) ? &cl.entities[cl.playerentity].render : NULL, false);
 }
@@ -520,8 +520,12 @@ void CL_ClientMovement_InputQW(qw_usercmd_t *cmd)
        n = cl.movement_numqueue;
        cl.movement_numqueue = 0;
        for (i = 0;i < n;i++)
+       {
                if (cl.movement_queue[i].sequence > cls.netcon->qw.incoming_sequence)
                        cl.movement_queue[cl.movement_numqueue++] = cl.movement_queue[i];
+               else if (i == 0)
+                       cl.movement_replay_canjump = !cl.movement_queue[i].jump;
+       }
        // add to input queue if there is room
        if (cl.movement_numqueue < (int)(sizeof(cl.movement_queue)/sizeof(cl.movement_queue[0])))
        {
@@ -551,14 +555,22 @@ void CL_ClientMovement_Input(qboolean buttonjump, qboolean buttoncrouch)
        if (cl.servermovesequence)
        {
                for (i = 0;i < n;i++)
+               {
                        if (cl.movement_queue[i].sequence > cl.servermovesequence)
                                cl.movement_queue[cl.movement_numqueue++] = cl.movement_queue[i];
+                       else if (i == 0)
+                               cl.movement_replay_canjump = !cl.movement_queue[i].jump;
+               }
        }
        else
        {
                for (i = 0;i < n;i++)
+               {
                        if (cl.movement_queue[i].time >= cl.mtime[0] - cl_movement_latency.value / 1000.0 && cl.movement_queue[i].time <= cl.mtime[0])
                                cl.movement_queue[cl.movement_numqueue++] = cl.movement_queue[i];
+                       else if (i == 0)
+                               cl.movement_replay_canjump = !cl.movement_queue[i].jump;
+               }
        }
        // add to input queue if there is room
        if (cl.movement_numqueue < (int)(sizeof(cl.movement_queue)/sizeof(cl.movement_queue[0])) && cl.mtime[0] > cl.mtime[1])
@@ -1019,7 +1031,7 @@ void CL_ClientMovement_Replay(void)
        VectorCopy(cl.entities[cl.playerentity].state_current.origin, s.origin);
        VectorCopy(cl.mvelocity[0], s.velocity);
        s.crouched = true; // will be updated on first move
-       s.canjump = true;
+       s.canjump = cl.movement_replay_canjump;
 
        // set up movement variables
        if (cls.protocol == PROTOCOL_QUAKEWORLD)