ResistLockerSystem.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. using Content.Server.Popups;
  2. using Content.Server.Storage.Components;
  3. using Content.Server.Storage.EntitySystems;
  4. using Content.Shared.DoAfter;
  5. using Content.Shared.Lock;
  6. using Content.Shared.Movement.Events;
  7. using Content.Shared.Popups;
  8. using Content.Shared.Resist;
  9. using Content.Shared.Tools.Components;
  10. using Content.Shared.Tools.Systems;
  11. using Content.Shared.ActionBlocker;
  12. namespace Content.Server.Resist;
  13. public sealed class ResistLockerSystem : EntitySystem
  14. {
  15. [Dependency] private readonly EntityStorageSystem _entityStorage = default!;
  16. [Dependency] private readonly LockSystem _lockSystem = default!;
  17. [Dependency] private readonly PopupSystem _popupSystem = default!;
  18. [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!;
  19. [Dependency] private readonly WeldableSystem _weldable = default!;
  20. [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!;
  21. public override void Initialize()
  22. {
  23. base.Initialize();
  24. SubscribeLocalEvent<ResistLockerComponent, ContainerRelayMovementEntityEvent>(OnRelayMovement);
  25. SubscribeLocalEvent<ResistLockerComponent, ResistLockerDoAfterEvent>(OnDoAfter);
  26. }
  27. private void OnRelayMovement(EntityUid uid, ResistLockerComponent component, ref ContainerRelayMovementEntityEvent args)
  28. {
  29. if (component.IsResisting)
  30. return;
  31. if (!TryComp(uid, out EntityStorageComponent? storageComponent))
  32. return;
  33. if (!_actionBlocker.CanMove(args.Entity))
  34. return;
  35. if (TryComp<LockComponent>(uid, out var lockComponent) && lockComponent.Locked || _weldable.IsWelded(uid))
  36. {
  37. AttemptResist(args.Entity, uid, storageComponent, component);
  38. }
  39. }
  40. private void AttemptResist(EntityUid user, EntityUid target, EntityStorageComponent? storageComponent = null, ResistLockerComponent? resistLockerComponent = null)
  41. {
  42. if (!Resolve(target, ref storageComponent, ref resistLockerComponent))
  43. return;
  44. var doAfterEventArgs = new DoAfterArgs(EntityManager, user, resistLockerComponent.ResistTime, new ResistLockerDoAfterEvent(), target, target: target)
  45. {
  46. BreakOnMove = true,
  47. BreakOnDamage = true,
  48. NeedHand = false, //No hands 'cause we be kickin'
  49. };
  50. resistLockerComponent.IsResisting = true;
  51. _popupSystem.PopupEntity(Loc.GetString("resist-locker-component-start-resisting"), user, user, PopupType.Large);
  52. _doAfterSystem.TryStartDoAfter(doAfterEventArgs);
  53. }
  54. private void OnDoAfter(EntityUid uid, ResistLockerComponent component, DoAfterEvent args)
  55. {
  56. if (args.Cancelled)
  57. {
  58. component.IsResisting = false;
  59. _popupSystem.PopupEntity(Loc.GetString("resist-locker-component-resist-interrupted"), args.Args.User, args.Args.User, PopupType.Medium);
  60. return;
  61. }
  62. if (args.Handled || args.Args.Target == null)
  63. return;
  64. component.IsResisting = false;
  65. if (HasComp<EntityStorageComponent>(uid))
  66. {
  67. WeldableComponent? weldable = null;
  68. if (_weldable.IsWelded(uid, weldable))
  69. _weldable.SetWeldedState(uid, false, weldable);
  70. if (TryComp<LockComponent>(args.Args.Target.Value, out var lockComponent))
  71. _lockSystem.Unlock(uid, args.Args.User, lockComponent);
  72. _entityStorage.TryOpenStorage(args.Args.User, uid);
  73. }
  74. args.Handled = true;
  75. }
  76. }