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); } }
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); } }