]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - sv_user.c
fix the "ping times for antilag/display wrong" issue, but increasing the problems...
[xonotic/darkplaces.git] / sv_user.c
index 5fc53adcc7e0719865043e9bfde560cf5800559d..279c036776399c9a82c9d1bbfc9d83114de896e6 100644 (file)
--- a/sv_user.c
+++ b/sv_user.c
@@ -347,7 +347,7 @@ void SV_AirMove (void)
                // noclip
                VectorCopy (wishvel, host_client->edict->fields.server->velocity);
        }
-       else if (onground && (!sv_gameplayfix_qwplayerphysics.integer || !host_client->edict->fields.server->button2 || !((int)host_client->edict->fields.server->flags & FL_JUMPRELEASED)))
+       else if (onground)
        {
                SV_UserFriction ();
                SV_Accelerate ();
@@ -371,6 +371,8 @@ void SV_ClientThink (void)
 {
        vec3_t v_angle;
 
+       //Con_Printf("clientthink for %ims\n", (int) (sv.frametime * 1000));
+
        SV_ApplyClientMove();
        // make sure the velocity is sane (not a NaN)
        SV_CheckVelocity(host_client->edict);
@@ -579,6 +581,7 @@ void SV_ExecuteClientMoves(void)
                                Con_Printf("%smove #%i %ims (%ims) %i %i '%i %i %i' '%i %i %i'\n", (move->time - host_client->cmd.time) > sv.frametime * 1.01 ? "^1" : "^2", move->sequence, (int)floor((move->time - host_client->cmd.time) * 1000.0 + 0.5), (int)floor(move->time * 1000.0 + 0.5), move->impulse, move->buttons, (int)move->viewangles[0], (int)move->viewangles[1], (int)move->viewangles[2], (int)move->forwardmove, (int)move->sidemove, (int)move->upmove);
 #endif
                                // this is a new move
+                               move->time = bound(sv.time - 1, move->time, sv.time); // prevent slowhack/speedhack combos
                                move->time = max(move->time, host_client->cmd.time); // prevent backstepping of time
                                moveframetime = bound(0, move->time - host_client->cmd.time, 0.1);
                                //Con_Printf("movesequence = %i (%i lost), moveframetime = %f\n", move->sequence, move->sequence ? move->sequence - host_client->movesequence - 1 : 0, moveframetime);
@@ -628,6 +631,12 @@ void SV_ExecuteClientMoves(void)
                }
                // now copy the new move
                host_client->cmd = sv_readmoves[sv_numreadmoves-1];
+               host_client->cmd.time = max(host_client->cmd.time, sv.time);
+                       // physics will run up to sv.time, so allow no predicted moves
+                       // before that otherwise, there is a speedhack by turning
+                       // prediction on and off repeatedly on client side because the
+                       // engine would run BOTH client and server physics for the same
+                       // time
                host_client->movesequence = 0;
                // make sure that normal physics takes over immediately
                host_client->clmovement_skipphysicsframes = 0;