using Content.Shared.Movement.Events; using Content.Shared.Standing; using Content.Shared.Stunnable; using Robust.Shared.Physics.Events; namespace Content.Shared.Slippery; public sealed class SlidingSystem : EntitySystem { public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnStand); SubscribeLocalEvent(OnStartCollide); SubscribeLocalEvent(OnEndCollide); } /// /// Remove the component when the entity stands up again. /// private void OnStand(EntityUid uid, SlidingComponent component, ref StoodEvent args) { RemComp(uid); } /// /// Sets friction to 0 if colliding with a SuperSlippery Entity. /// private void OnStartCollide(EntityUid uid, SlidingComponent component, ref StartCollideEvent args) { if (!TryComp(args.OtherEntity, out var slippery) || !slippery.SlipData.SuperSlippery) return; component.CollidingEntities.Add(args.OtherEntity); Dirty(uid, component); } /// /// Set friction to normal when ending collision with a SuperSlippery entity. /// private void OnEndCollide(EntityUid uid, SlidingComponent component, ref EndCollideEvent args) { if (!component.CollidingEntities.Remove(args.OtherEntity)) return; if (component.CollidingEntities.Count == 0) RemComp(uid); Dirty(uid, component); } }