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);
}
}
}