Ok, more research, more updates.
The Velocity IS replicated by bReplicateMovement. This is done in AActor::GatherCurrentMovement, which after a while gets updated in the async physics tick and set back on the client side object.
I found out that the reason for the velocity being ahead on the client is down to this coefficient:
void FPhysicsReplication::ApplyAsyncDesiredState(const float DeltaSeconds, const FAsyncPhysicsRepCallbackData* AsyncData)
{
...
const FVector NewLinVel = FVector(State.LinearVelocity) + (LinDiff * LinearVelocityCoefficient * DeltaSeconds);
...
}
I tweaked the coefficient in the project settings and set it to 0, and the jittering velocity on the client side disappears. I think this extra velocity is added to try and have the client side object catch up to the server one.
Sad part of the story, is that even setting this to 0 and having the velocity stable on the client side, there’s still jittering, so back to debug mode ![]()