diff --git a/Content.Shared/GameObjects/Components/Movement/SharedSlipperyComponent.cs b/Content.Shared/GameObjects/Components/Movement/SharedSlipperyComponent.cs index c0695cb160..f467ac7642 100644 --- a/Content.Shared/GameObjects/Components/Movement/SharedSlipperyComponent.cs +++ b/Content.Shared/GameObjects/Components/Movement/SharedSlipperyComponent.cs @@ -74,6 +74,12 @@ namespace Content.Shared.GameObjects.Components.Movement return false; } + if (entity.TryGetComponent(out ICollidableComponent collidable)) + { + var controller = collidable.EnsureController(); + controller.LinearVelocity = collidable.LinearVelocity; + } + stun.Paralyze(5); _slipped.Add(entity.Uid); diff --git a/Content.Shared/Physics/SlipController.cs b/Content.Shared/Physics/SlipController.cs new file mode 100644 index 0000000000..f5f3004a3f --- /dev/null +++ b/Content.Shared/Physics/SlipController.cs @@ -0,0 +1,40 @@ +using Robust.Shared.Interfaces.Physics; +using Robust.Shared.IoC; +using Robust.Shared.Physics; + +namespace Content.Shared.Physics +{ + public class SlipController : VirtualController + { +#pragma warning disable 649 + [Dependency] private readonly IPhysicsManager _physicsManager; +#pragma warning restore 649 + + public SlipController() + { + IoCManager.InjectDependencies(this); + } + + private float Decay { get; set; } = 0.95f; + + public override void UpdateAfterProcessing() + { + if (ControlledComponent == null) + { + return; + } + + if (_physicsManager.IsWeightless(ControlledComponent.Owner.Transform.GridPosition)) + { + return; + } + + LinearVelocity *= Decay; + + if (LinearVelocity.Length < 0.001) + { + Stop(); + } + } + } +}