]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - sv_user.c
sv_user: Don't detect heavy movement loss right after a map change
[xonotic/darkplaces.git] / sv_user.c
index 9e17dbfee03d0da0d8e65e19122b4cbb7b667667..1e3d581f0c186bd501531e93af826af6a60fcdf0 100644 (file)
--- a/sv_user.c
+++ b/sv_user.c
@@ -738,7 +738,8 @@ static void SV_ReadClientMove (void)
                sv_readmoves[sv_numreadmoves++] = *move;
 
        // movement packet loss tracking
-       if(move->sequence)
+       // bones_was_here: checking begun prevents heavy loss detection right after a map change
+       if(move->sequence && host_client->begun)
        {
                if(move->sequence > host_client->movement_highestsequence_seen)
                {
@@ -775,7 +776,7 @@ static void SV_ExecuteClientMoves(void)
 {
        prvm_prog_t *prog = SVVM_prog;
        int moveindex;
-       float moveframetime;
+       double moveframetime;
        double oldframetime;
        double oldframetime2;
 #ifdef NUM_PING_TIMES
@@ -811,7 +812,8 @@ static void SV_ExecuteClientMoves(void)
                                // 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, min(0.1, sv_clmovement_inputtimeout.value));
+                               // bones_was_here: limit moveframetime to a multiple of sv.frametime to match inputtimeout behaviour
+                               moveframetime = min(move->time - host_client->cmd.time, min(0.1, sys_ticrate.value > 0.0 ? sv.frametime * ceil(sv_clmovement_inputtimeout.value / sv.frametime) : sv_clmovement_inputtimeout.value));
 
                                // discard (treat like lost) moves with too low distance from
                                // the previous one to prevent hacks using float inaccuracy
@@ -840,8 +842,6 @@ static void SV_ExecuteClientMoves(void)
                                //  with this approach, and if they don't send input for a while they
                                //  start moving anyway, so the longest 'lagaport' possible is
                                //  determined by the sv_clmovement_inputtimeout cvar)
-                               if (moveframetime <= 0)
-                                       continue;
                                oldframetime = PRVM_serverglobalfloat(frametime);
                                oldframetime2 = sv.frametime;
                                // update ping time for qc to see while executing this move
@@ -857,7 +857,7 @@ static void SV_ExecuteClientMoves(void)
                                SV_Physics_ClientMove();
                                sv.frametime = oldframetime2;
                                PRVM_serverglobalfloat(frametime) = oldframetime;
-                               host_client->clmovement_inputtimeout = sv_clmovement_inputtimeout.value;
+                               host_client->clmovement_inputtimeout = min(0.1, sv_clmovement_inputtimeout.value);
                        }
                }
        }