]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - sv_user.c
fix movement loss tracking
[xonotic/darkplaces.git] / sv_user.c
index 98f28141eb3bc594281df63ff2f4dbd239a68502..2ca62d7eab7bcc2a756061857379acab984981a3 100644 (file)
--- a/sv_user.c
+++ b/sv_user.c
@@ -58,7 +58,7 @@ void SV_SetIdealPitch (void)
                bottom[1] = top[1];
                bottom[2] = top[2] - 160;
 
-               tr = SV_Move (top, vec3_origin, vec3_origin, bottom, MOVE_NOMONSTERS, host_client->edict, SUPERCONTENTS_SOLID);
+               tr = SV_TraceLine(top, bottom, MOVE_NOMONSTERS, host_client->edict, SUPERCONTENTS_SOLID);
                // if looking at a wall, leave ideal the way is was
                if (tr.startsolid)
                        return;
@@ -124,7 +124,7 @@ void SV_UserFriction (void)
        start[2] = host_client->edict->fields.server->origin[2] + host_client->edict->fields.server->mins[2];
        stop[2] = start[2] - 34;
 
-       trace = SV_Move (start, vec3_origin, vec3_origin, stop, MOVE_NOMONSTERS, host_client->edict, SV_GenericHitSuperContentsMask(host_client->edict));
+       trace = SV_TraceLine(start, stop, MOVE_NOMONSTERS, host_client->edict, SV_GenericHitSuperContentsMask(host_client->edict));
 
        if (trace.fraction == 1.0)
                friction = sv_friction.value*sv_edgefriction.value;
@@ -165,6 +165,7 @@ void SV_Accelerate (void)
                host_client->edict->fields.server->velocity[i] += accelspeed*wishdir[i];
 }
 
+extern cvar_t sv_gameplayfix_q2airaccelerate;
 void SV_AirAccelerate (vec3_t wishveloc)
 {
        int i;
@@ -177,7 +178,7 @@ void SV_AirAccelerate (vec3_t wishveloc)
        addspeed = wishspd - currentspeed;
        if (addspeed <= 0)
                return;
-       accelspeed = (sv_airaccelerate.value < 0 ? sv_accelerate.value : sv_airaccelerate.value)*wishspeed * sv.frametime;
+       accelspeed = (sv_airaccelerate.value < 0 ? sv_accelerate.value : sv_airaccelerate.value)*(sv_gameplayfix_q2airaccelerate.integer ? wishspd : wishspeed) * sv.frametime;
        if (accelspeed > addspeed)
                accelspeed = addspeed;
 
@@ -392,7 +393,7 @@ void SV_ClientThink (void)
        if (host_client->edict->fields.server->movetype == MOVETYPE_NONE)
                return;
 
-       onground = (int)host_client->edict->fields.server->flags & FL_ONGROUND;
+       onground = ((int)host_client->edict->fields.server->flags & FL_ONGROUND) != 0;
 
        DropPunchAngle ();
 
@@ -543,6 +544,35 @@ void SV_ReadClientMove (void)
        // (we have to buffer the moves because of old ones being repeated)
        if (sv_numreadmoves < CL_MAX_USERCMDS)
                sv_readmoves[sv_numreadmoves++] = *move;
+
+       // movement packet loss tracking
+       if(move->sequence)
+       {
+               if(move->sequence > host_client->movement_highestsequence_seen)
+               {
+                       if(host_client->movement_highestsequence_seen)
+                       {
+                               // mark moves in between as lost
+                               if(move->sequence - host_client->movement_highestsequence_seen - 1 < NETGRAPH_PACKETS)
+                                       for(i = host_client->movement_highestsequence_seen + 1; i < move->sequence; ++i)
+                                               host_client->movement_count[i % NETGRAPH_PACKETS] = -1;
+                               else
+                                       memset(host_client->movement_count, -1, sizeof(host_client->movement_count));
+                       }
+                       // mark THIS move as seen for the first time
+                       host_client->movement_count[move->sequence % NETGRAPH_PACKETS] = 1;
+                       // update highest sequence seen
+                       host_client->movement_highestsequence_seen = move->sequence;
+               }
+               else
+                       if(host_client->movement_count[move->sequence % NETGRAPH_PACKETS] >= 0)
+                               ++host_client->movement_count[move->sequence % NETGRAPH_PACKETS];
+       }
+       else
+       {
+               host_client->movement_highestsequence_seen = 0;
+               memset(host_client->movement_count, 0, sizeof(host_client->movement_count));
+       }
 }
 
 void SV_ExecuteClientMoves(void)