DeployFoldableSystem.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using Content.Shared.DragDrop;
  2. using Content.Shared.Hands.Components;
  3. using Content.Shared.Hands.EntitySystems;
  4. using Content.Shared.Interaction;
  5. namespace Content.Shared.Foldable;
  6. public sealed class DeployFoldableSystem : EntitySystem
  7. {
  8. [Dependency] private readonly SharedHandsSystem _hands = default!;
  9. [Dependency] private readonly FoldableSystem _foldable = default!;
  10. public override void Initialize()
  11. {
  12. base.Initialize();
  13. SubscribeLocalEvent<DeployFoldableComponent, AfterInteractEvent>(OnAfterInteract);
  14. SubscribeLocalEvent<DeployFoldableComponent, CanDragEvent>(OnCanDrag);
  15. SubscribeLocalEvent<DeployFoldableComponent, DragDropDraggedEvent>(OnDragDropDragged);
  16. SubscribeLocalEvent<DeployFoldableComponent, CanDropDraggedEvent>(OnCanDropDragged);
  17. }
  18. private void OnCanDropDragged(Entity<DeployFoldableComponent> ent, ref CanDropDraggedEvent args)
  19. {
  20. if (args.User != args.Target)
  21. return;
  22. args.Handled = true;
  23. args.CanDrop = true;
  24. }
  25. private void OnDragDropDragged(Entity<DeployFoldableComponent> ent, ref DragDropDraggedEvent args)
  26. {
  27. if (!TryComp<FoldableComponent>(ent, out var foldable)
  28. || !_foldable.TrySetFolded(ent, foldable, true))
  29. return;
  30. _hands.PickupOrDrop(args.User, ent.Owner);
  31. args.Handled = true;
  32. }
  33. private void OnCanDrag(Entity<DeployFoldableComponent> ent, ref CanDragEvent args)
  34. {
  35. if (!TryComp<FoldableComponent>(ent, out var foldable)
  36. || foldable.IsFolded)
  37. return;
  38. args.Handled = true;
  39. }
  40. private void OnAfterInteract(Entity<DeployFoldableComponent> ent, ref AfterInteractEvent args)
  41. {
  42. if (args.Handled || !args.CanReach)
  43. return;
  44. if (!TryComp<FoldableComponent>(ent, out var foldable))
  45. return;
  46. if (!TryComp(args.User, out HandsComponent? hands)
  47. || !_hands.TryDrop(args.User, args.Used, targetDropLocation: args.ClickLocation, handsComp: hands))
  48. return;
  49. if (!_foldable.TrySetFolded(ent, foldable, false))
  50. {
  51. _hands.TryPickup(args.User, args.Used, handsComp: hands);
  52. return;
  53. }
  54. args.Handled = true;
  55. }
  56. }