public override void UpdateBeforeMapSolve(bool prediction, SharedPhysicsMapComponent mapComponent, float frameTime)
        {
            base.UpdateBeforeMapSolve(prediction, mapComponent, frameTime);

            var frictionQuery = GetEntityQuery <TileFrictionModifierComponent>();
            var xformQuery    = GetEntityQuery <TransformComponent>();

            foreach (var body in mapComponent.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 ||
                    Mover.UseMobMovement(body.Owner))
                {
                    continue;
                }

                if (body.LinearVelocity.Equals(Vector2.Zero) && body.AngularVelocity.Equals(0f))
                {
                    continue;
                }

                DebugTools.Assert(!Deleted(body.Owner));

                if (!xformQuery.TryGetComponent(body.Owner, out var xform))
                {
                    Logger.ErrorS("physics", $"Unable to get transform for {ToPrettyString(body.Owner)} in tilefrictioncontroller");
                    continue;
                }

                var surfaceFriction = GetTileFriction(body, xform);
                var bodyModifier    = 1f;

                if (frictionQuery.TryGetComponent(body.Owner, out var frictionComp))
                {
                    bodyModifier = frictionComp.Modifier;
                }

                var friction = _frictionModifier * surfaceFriction * bodyModifier;

                ReduceLinearVelocity(prediction, body, friction, frameTime);
                ReduceAngularVelocity(prediction, body, friction, frameTime);
            }
        }
Exemple #2
0
        public override void UpdateBeforeMapSolve(bool prediction, SharedPhysicsMapComponent mapComponent, float frameTime)
        {
            base.UpdateBeforeMapSolve(prediction, mapComponent, frameTime);

            foreach (var body in mapComponent.AwakeBodies)
            {
                // Only apply friction when it's not a mob (or the mob doesn't have control)
                if (body.Deleted ||
                    prediction && !body.Predict ||
                    body.BodyStatus == BodyStatus.InAir ||
                    Mover.UseMobMovement(body.Owner.Uid))
                {
                    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);
            }
        }