DoorRemoteSystem.cs 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using Content.Server.Administration.Logs;
  2. using Content.Server.Doors.Systems;
  3. using Content.Server.Power.EntitySystems;
  4. using Content.Shared.Access.Components;
  5. using Content.Shared.Database;
  6. using Content.Shared.Doors.Components;
  7. using Content.Shared.Examine;
  8. using Content.Shared.Interaction;
  9. using Content.Shared.Remotes.Components;
  10. using Content.Shared.Remotes.EntitySystems;
  11. namespace Content.Shared.Remotes
  12. {
  13. public sealed class DoorRemoteSystem : SharedDoorRemoteSystem
  14. {
  15. [Dependency] private readonly IAdminLogManager _adminLogger = default!;
  16. [Dependency] private readonly AirlockSystem _airlock = default!;
  17. [Dependency] private readonly DoorSystem _doorSystem = default!;
  18. [Dependency] private readonly ExamineSystemShared _examine = default!;
  19. public override void Initialize()
  20. {
  21. base.Initialize();
  22. SubscribeLocalEvent<DoorRemoteComponent, BeforeRangedInteractEvent>(OnBeforeInteract);
  23. }
  24. private void OnBeforeInteract(Entity<DoorRemoteComponent> entity, ref BeforeRangedInteractEvent args)
  25. {
  26. bool isAirlock = TryComp<AirlockComponent>(args.Target, out var airlockComp);
  27. if (args.Handled
  28. || args.Target == null
  29. || !TryComp<DoorComponent>(args.Target, out var doorComp) // If it isn't a door we don't use it
  30. // Only able to control doors if they are within your vision and within your max range.
  31. // Not affected by mobs or machines anymore.
  32. || !_examine.InRangeUnOccluded(args.User,
  33. args.Target.Value,
  34. SharedInteractionSystem.MaxRaycastRange,
  35. null))
  36. {
  37. return;
  38. }
  39. args.Handled = true;
  40. if (!this.IsPowered(args.Target.Value, EntityManager))
  41. {
  42. Popup.PopupEntity(Loc.GetString("door-remote-no-power"), args.User, args.User);
  43. return;
  44. }
  45. if (TryComp<AccessReaderComponent>(args.Target, out var accessComponent)
  46. && !_doorSystem.HasAccess(args.Target.Value, args.Used, doorComp, accessComponent))
  47. {
  48. if (isAirlock)
  49. _doorSystem.Deny(args.Target.Value, doorComp, args.User);
  50. Popup.PopupEntity(Loc.GetString("door-remote-denied"), args.User, args.User);
  51. return;
  52. }
  53. switch (entity.Comp.Mode)
  54. {
  55. case OperatingMode.OpenClose:
  56. if (_doorSystem.TryToggleDoor(args.Target.Value, doorComp, args.Used))
  57. _adminLogger.Add(LogType.Action,
  58. LogImpact.Medium,
  59. $"{ToPrettyString(args.User):player} used {ToPrettyString(args.Used)} on {ToPrettyString(args.Target.Value)}: {doorComp.State}");
  60. break;
  61. case OperatingMode.ToggleBolts:
  62. if (TryComp<DoorBoltComponent>(args.Target, out var boltsComp))
  63. {
  64. if (!boltsComp.BoltWireCut)
  65. {
  66. _doorSystem.SetBoltsDown((args.Target.Value, boltsComp), !boltsComp.BoltsDown, args.Used);
  67. _adminLogger.Add(LogType.Action,
  68. LogImpact.Medium,
  69. $"{ToPrettyString(args.User):player} used {ToPrettyString(args.Used)} on {ToPrettyString(args.Target.Value)} to {(boltsComp.BoltsDown ? "" : "un")}bolt it");
  70. }
  71. }
  72. break;
  73. case OperatingMode.ToggleEmergencyAccess:
  74. if (airlockComp != null)
  75. {
  76. _airlock.SetEmergencyAccess((args.Target.Value, airlockComp), !airlockComp.EmergencyAccess);
  77. _adminLogger.Add(LogType.Action,
  78. LogImpact.Medium,
  79. $"{ToPrettyString(args.User):player} used {ToPrettyString(args.Used)} on {ToPrettyString(args.Target.Value)} to set emergency access {(airlockComp.EmergencyAccess ? "on" : "off")}");
  80. }
  81. break;
  82. default:
  83. throw new InvalidOperationException(
  84. $"{nameof(DoorRemoteComponent)} had invalid mode {entity.Comp.Mode}");
  85. }
  86. }
  87. }
  88. }