public override void UpdateBeforeMapSolve(bool prediction, PhysicsMap map, float frameTime)
        {
            base.UpdateBeforeMapSolve(prediction, map, frameTime);

            foreach (var body in map.AwakeBodies)
            {
                // Only apply friction when it's not a mob (or the mob doesn't have control)
                if (prediction && !body.Predict ||
                    body.BodyStatus == BodyStatus.InAir ||
                    SharedMoverController.UseMobMovement(_broadPhaseSystem, body, _mapManager))
                {
                    continue;
                }

                var surfaceFriction = GetTileFriction(body);
                var bodyModifier    = body.Owner.GetComponentOrNull <SharedTileFrictionModifier>()?.Modifier ?? 1.0f;
                var friction        = _frictionModifier * surfaceFriction * bodyModifier;

                ReduceLinearVelocity(prediction, body, friction, frameTime);
                ReduceAngularVelocity(prediction, body, friction, frameTime);
            }
        }