using Content.Shared.DragDrop; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; using Content.Shared.Interaction; namespace Content.Shared.Foldable; public sealed class DeployFoldableSystem : EntitySystem { [Dependency] private readonly SharedHandsSystem _hands = default!; [Dependency] private readonly FoldableSystem _foldable = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnAfterInteract); SubscribeLocalEvent(OnCanDrag); SubscribeLocalEvent(OnDragDropDragged); SubscribeLocalEvent(OnCanDropDragged); } private void OnCanDropDragged(Entity ent, ref CanDropDraggedEvent args) { if (args.User != args.Target) return; args.Handled = true; args.CanDrop = true; } private void OnDragDropDragged(Entity ent, ref DragDropDraggedEvent args) { if (!TryComp(ent, out var foldable) || !_foldable.TrySetFolded(ent, foldable, true)) return; _hands.PickupOrDrop(args.User, ent.Owner); args.Handled = true; } private void OnCanDrag(Entity ent, ref CanDragEvent args) { if (!TryComp(ent, out var foldable) || foldable.IsFolded) return; args.Handled = true; } private void OnAfterInteract(Entity ent, ref AfterInteractEvent args) { if (args.Handled || !args.CanReach) return; if (!TryComp(ent, out var foldable)) return; if (!TryComp(args.User, out HandsComponent? hands) || !_hands.TryDrop(args.User, args.Used, targetDropLocation: args.ClickLocation, handsComp: hands)) return; if (!_foldable.TrySetFolded(ent, foldable, false)) { _hands.TryPickup(args.User, args.Used, handsComp: hands); return; } args.Handled = true; } }