]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - cl_input.c
use trace_plane_normal to check whether the trace succeeded
[xonotic/darkplaces.git] / cl_input.c
index 214f3115e0bf87b28f5a69c52c235bb3c84cb916..6edee3efd5fd73bcfb3d74ba8b88e7b081eef49d 100644 (file)
@@ -428,7 +428,7 @@ cvar_t cl_movement_stopspeed = {0, "cl_movement_stopspeed", "100", "speed below
 cvar_t cl_movement_friction = {0, "cl_movement_friction", "4", "how fast you slow down (should match sv_friction)"};
 cvar_t cl_movement_wallfriction = {0, "cl_movement_wallfriction", "1", "how fast you slow down while sliding along a wall (should match sv_wallfriction)"};
 cvar_t cl_movement_waterfriction = {0, "cl_movement_waterfriction", "-1", "how fast you slow down (should match sv_waterfriction), if less than 0 the cl_movement_friction variable is used instead"};
-cvar_t cl_movement_edgefriction = {0, "cl_movement_edgefriction", "2", "how much to slow down when you may be about to fall off a ledge (should match edgefriction)"};
+cvar_t cl_movement_edgefriction = {0, "cl_movement_edgefriction", "1", "how much to slow down when you may be about to fall off a ledge (should match edgefriction)"};
 cvar_t cl_movement_stepheight = {0, "cl_movement_stepheight", "18", "how tall a step you can step in one instant (should match sv_stepheight)"};
 cvar_t cl_movement_accelerate = {0, "cl_movement_accelerate", "10", "how fast you accelerate (should match sv_accelerate)"};
 cvar_t cl_movement_airaccelerate = {0, "cl_movement_airaccelerate", "-1", "how fast you accelerate while in the air (should match sv_airaccelerate), if less than 0 the cl_movement_accelerate variable is used instead"};
@@ -1013,27 +1013,30 @@ void CL_ClientMovement_Physics_Walk(cl_clientmovement_state_t *s)
        {
                // apply edge friction
                f = sqrt(s->velocity[0] * s->velocity[0] + s->velocity[1] * s->velocity[1]);
-               friction = cl.movevars_friction;
-               if (f > 0 && cl.movevars_edgefriction != 1)
+               if (f > 0)
                {
-                       vec3_t neworigin2;
-                       vec3_t neworigin3;
-                       // note: QW uses the full player box for the trace, and yet still
-                       // uses s->origin[2] + s->mins[2], which is clearly an bug, but
-                       // this mimics it for compatibility
-                       VectorSet(neworigin2, s->origin[0] + s->velocity[0]*(16/f), s->origin[1] + s->velocity[1]*(16/f), s->origin[2] + s->mins[2]);
-                       VectorSet(neworigin3, neworigin2[0], neworigin2[1], neworigin2[2] - 34);
-                       if (cls.protocol == PROTOCOL_QUAKEWORLD)
-                               trace = CL_Move(neworigin2, s->mins, s->maxs, neworigin3, MOVE_NORMAL, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_PLAYERCLIP, true, true, NULL, false);
-                       else
-                               trace = CL_Move(neworigin2, vec3_origin, vec3_origin, neworigin3, MOVE_NORMAL, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_PLAYERCLIP, true, true, NULL, false);
-                       if (trace.fraction == 1 && !trace.startsolid)
-                               friction *= cl.movevars_edgefriction;
+                       friction = cl.movevars_friction;
+                       if (cl.movevars_edgefriction != 1)
+                       {
+                               vec3_t neworigin2;
+                               vec3_t neworigin3;
+                               // note: QW uses the full player box for the trace, and yet still
+                               // uses s->origin[2] + s->mins[2], which is clearly an bug, but
+                               // this mimics it for compatibility
+                               VectorSet(neworigin2, s->origin[0] + s->velocity[0]*(16/f), s->origin[1] + s->velocity[1]*(16/f), s->origin[2] + s->mins[2]);
+                               VectorSet(neworigin3, neworigin2[0], neworigin2[1], neworigin2[2] - 34);
+                               if (cls.protocol == PROTOCOL_QUAKEWORLD)
+                                       trace = CL_Move(neworigin2, s->mins, s->maxs, neworigin3, MOVE_NORMAL, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_PLAYERCLIP, true, true, NULL, false);
+                               else
+                                       trace = CL_Move(neworigin2, vec3_origin, vec3_origin, neworigin3, MOVE_NORMAL, NULL, SUPERCONTENTS_SOLID | SUPERCONTENTS_BODY | SUPERCONTENTS_PLAYERCLIP, true, true, NULL, false);
+                               if (trace.fraction == 1 && !trace.startsolid)
+                                       friction *= cl.movevars_edgefriction;
+                       }
+                       // apply ground friction
+                       f = 1 - s->cmd.frametime * friction * ((f < cl.movevars_stopspeed) ? (cl.movevars_stopspeed / f) : 1);
+                       f = max(f, 0);
+                       VectorScale(s->velocity, f, s->velocity);
                }
-               // apply ground friction
-               f = 1 - s->cmd.frametime * friction * ((f < cl.movevars_stopspeed) ? (cl.movevars_stopspeed / f) : 1);
-               f = max(f, 0);
-               VectorScale(s->velocity, f, s->velocity);
                addspeed = wishspeed - DotProduct(s->velocity, wishdir);
                if (addspeed > 0)
                {
@@ -1280,11 +1283,11 @@ void QW_MSG_WriteDeltaUsercmd(sizebuf_t *buf, usercmd_t *from, usercmd_t *to)
        if (bits & QW_CM_ANGLE3)
                MSG_WriteAngle16i(buf, to->viewangles[2]);
        if (bits & QW_CM_FORWARD)
-               MSG_WriteShort(buf, to->forwardmove);
+               MSG_WriteShort(buf, (short) to->forwardmove);
        if (bits & QW_CM_SIDE)
-               MSG_WriteShort(buf, to->sidemove);
+               MSG_WriteShort(buf, (short) to->sidemove);
        if (bits & QW_CM_UP)
-               MSG_WriteShort(buf, to->upmove);
+               MSG_WriteShort(buf, (short) to->upmove);
        if (bits & QW_CM_BUTTONS)
                MSG_WriteByte(buf, to->buttons);
        if (bits & QW_CM_IMPULSE)
@@ -1413,7 +1416,7 @@ void CL_SendMove(void)
                packettime = 0;
        // always send if buttons changed or an impulse is pending
        // even if it violates the rate limit!
-       if (!cl_netimmediatebuttons.integer || (cl.movecmd[0].buttons == cl.movecmd[1].buttons && !cl.movecmd[0].impulse))
+       if (!cl.movecmd[0].impulse && (!cl_netimmediatebuttons.integer || cl.movecmd[0].buttons == cl.movecmd[1].buttons))
        {
                // don't choke the connection with packets (obey rate limit)
                if ((cls.protocol == PROTOCOL_QUAKEWORLD || cls.signon == SIGNONS) && !NetConn_CanSend(cls.netcon) && !cl.islocalgame)