using System.Threading; using Content.Server.Power.Components; // using Content.Server.WireHacking; using Content.Shared.Doors.Components; using Robust.Shared.Audio; using Robust.Shared.Player; // using static Content.Shared.Wires.SharedWiresComponent; // using static Content.Shared.Wires.SharedWiresComponent.WiresAction; namespace Content.Server.Doors.Components { /// /// Companion component to DoorComponent that handles airlock-specific behavior -- wires, requiring power to operate, bolts, and allowing automatic closing. /// [RegisterComponent] [ComponentReference(typeof(SharedAirlockComponent))] public sealed class AirlockComponent : SharedAirlockComponent { [Dependency] private readonly IEntityManager _entityManager = default!; /// /// Sound to play when the bolts on the airlock go up. /// [DataField("boltUpSound")] public SoundSpecifier BoltUpSound = new SoundPathSpecifier("/Audio/Machines/boltsup.ogg"); /// /// Sound to play when the bolts on the airlock go down. /// [DataField("boltDownSound")] public SoundSpecifier BoltDownSound = new SoundPathSpecifier("/Audio/Machines/boltsdown.ogg"); /// /// Duration for which power will be disabled after pulsing either power wire. /// [DataField("powerWiresTimeout")] public float PowerWiresTimeout = 5.0f; /// /// Whether the maintenance panel should be visible even if the airlock is opened. /// [DataField("openPanelVisible")] public bool OpenPanelVisible = false; private CancellationTokenSource _powerWiresPulsedTimerCancel = new(); private bool _powerWiresPulsed; /// /// True if either power wire was pulsed in the last . /// [ViewVariables(VVAccess.ReadWrite)] private bool PowerWiresPulsed { get => _powerWiresPulsed; set { _powerWiresPulsed = value; // UpdateWiresStatus(); // UpdatePowerCutStatus(); } } private bool _boltsDown; [ViewVariables(VVAccess.ReadWrite)] public bool BoltsDown { get => _boltsDown; set { _boltsDown = value; UpdateBoltLightStatus(); } } private bool _boltLightsEnabled = true; public bool BoltLightsEnabled { get => _boltLightsEnabled; set { _boltLightsEnabled = value; UpdateBoltLightStatus(); } } [ViewVariables(VVAccess.ReadWrite)] public bool BoltLightsVisible { get => _boltLightsEnabled && BoltsDown && IsPowered() && _entityManager.TryGetComponent(Owner, out var doorComponent) && doorComponent.State == DoorState.Closed; set { _boltLightsEnabled = value; UpdateBoltLightStatus(); } } /// /// Delay until an open door automatically closes. /// [DataField("autoCloseDelay")] public TimeSpan AutoCloseDelay = TimeSpan.FromSeconds(5f); /// /// Multiplicative modifier for the auto-close delay. Can be modified by hacking the airlock wires. Setting to /// zero will disable auto-closing. /// [ViewVariables(VVAccess.ReadWrite)] public float AutoCloseDelayModifier = 1.0f; protected override void Initialize() { base.Initialize(); if (_entityManager.TryGetComponent(Owner, out var receiverComponent) && _entityManager.TryGetComponent(Owner, out var appearanceComponent)) { appearanceComponent.SetData(DoorVisuals.Powered, receiverComponent.Powered); } } public bool CanChangeState() { return IsPowered() && !IsBolted(); } public bool IsBolted() { return _boltsDown; } public bool IsPowered() { return !_entityManager.TryGetComponent(Owner, out var receiverComponent) || receiverComponent.Powered; } public void UpdateBoltLightStatus() { if (_entityManager.TryGetComponent(Owner, out var appearanceComponent)) { appearanceComponent.SetData(DoorVisuals.BoltLights, BoltLightsVisible); } } public void SetBoltsWithAudio(bool newBolts) { if (newBolts == BoltsDown) { return; } BoltsDown = newBolts; SoundSystem.Play(newBolts ? BoltDownSound.GetSound() : BoltUpSound.GetSound(), Filter.Pvs(Owner), Owner); } } }