using Content.Shared.Buckle; using Content.Shared.Rotation; using Content.Shared.Standing; using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Shared.Timing; using DrawDepth = Content.Shared.DrawDepth.DrawDepth; namespace Content.Client.Standing; public sealed class LayingDownSystem : SharedLayingDownSystem { [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IEyeManager _eyeManager = default!; [Dependency] private readonly StandingStateSystem _standing = default!; [Dependency] private readonly AnimationPlayerSystem _animation = default!; [Dependency] private readonly SharedBuckleSystem _buckle = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnMovementInput); SubscribeNetworkEvent(OnDowned); SubscribeNetworkEvent(OnStood); SubscribeNetworkEvent(OnCheckAutoGetUp); } private void OnMovementInput(EntityUid uid, LayingDownComponent component, MoveEvent args) { if (!_timing.IsFirstTimePredicted || !_standing.IsDown(uid) || _buckle.IsBuckled(uid) || _animation.HasRunningAnimation(uid, "rotate") || !TryComp(uid, out var transform) || !TryComp(uid, out var sprite) || !TryComp(uid, out var rotationVisuals)) return; var rotation = transform.LocalRotation + (_eyeManager.CurrentEye.Rotation - (transform.LocalRotation - transform.WorldRotation)); if (rotation.GetDir() is Direction.SouthEast or Direction.East or Direction.NorthEast or Direction.North) { rotationVisuals.HorizontalRotation = Angle.FromDegrees(270); sprite.Rotation = Angle.FromDegrees(270); return; } rotationVisuals.HorizontalRotation = Angle.FromDegrees(90); sprite.Rotation = Angle.FromDegrees(90); } private void OnDowned(DrawDownedEvent args) { var uid = GetEntity(args.Uid); if (!TryComp(uid, out var sprite) || !TryComp(uid, out var component)) return; sprite.DrawDepth = component.CrawlingDrawDepth; } private void OnStood(DrawStoodEvent args) { var uid = GetEntity(args.Uid); if (!TryComp(uid, out var sprite) || !TryComp(uid, out var component)) return; sprite.DrawDepth = component.NormalDrawDepth; } private void OnCheckAutoGetUp(CheckAutoGetUpEvent ev, EntitySessionEventArgs args) { if (!_timing.IsFirstTimePredicted) return; var uid = GetEntity(ev.User); if (!TryComp(uid, out var transform) || !TryComp(uid, out var rotationVisuals)) return; var rotation = transform.LocalRotation + (_eyeManager.CurrentEye.Rotation - (transform.LocalRotation - transform.WorldRotation)); if (rotation.GetDir() is Direction.SouthEast or Direction.East or Direction.NorthEast or Direction.North) { rotationVisuals.HorizontalRotation = Angle.FromDegrees(270); return; } rotationVisuals.HorizontalRotation = Angle.FromDegrees(90); } }