using Content.Server.DeviceLinking.Events; using Content.Server.Power.Components; using Content.Server.Wires; using Content.Shared.Doors.Components; using Content.Shared.Doors.Systems; using Content.Shared.Interaction; using Content.Shared.Power; using Content.Shared.Wires; using Robust.Shared.Player; namespace Content.Server.Doors.Systems; public sealed class AirlockSystem : SharedAirlockSystem { [Dependency] private readonly WiresSystem _wiresSystem = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnSignalReceived); SubscribeLocalEvent(OnPowerChanged); SubscribeLocalEvent(OnActivate, before: new[] { typeof(DoorSystem) }); } private void OnSignalReceived(EntityUid uid, AirlockComponent component, ref SignalReceivedEvent args) { if (args.Port == component.AutoClosePort && component.AutoClose) { component.AutoClose = false; Dirty(uid, component); } } private void OnPowerChanged(EntityUid uid, AirlockComponent component, ref PowerChangedEvent args) { component.Powered = args.Powered; Dirty(uid, component); if (!TryComp(uid, out DoorComponent? door)) return; if (!args.Powered) { // stop any scheduled auto-closing if (door.State == DoorState.Open) DoorSystem.SetNextStateChange(uid, null); } else { UpdateAutoClose(uid, door: door); } } private void OnActivate(EntityUid uid, AirlockComponent component, ActivateInWorldEvent args) { if (args.Handled || !args.Complex) return; if (TryComp(uid, out var panel) && panel.Open && TryComp(args.User, out var actor)) { if (TryComp(uid, out var wiresPanelSecurity) && !wiresPanelSecurity.WiresAccessible) return; _wiresSystem.OpenUserInterface(uid, actor.PlayerSession); args.Handled = true; return; } if (component.KeepOpenIfClicked && component.AutoClose) { // Disable auto close component.AutoClose = false; Dirty(uid, component); } } }