Files
tbd-station-14/Content.Shared/Doors/Systems/SharedAirlockSystem.cs
2022-05-13 17:59:03 +10:00

54 lines
1.8 KiB
C#

using Content.Shared.Doors.Components;
using Robust.Shared.GameStates;
namespace Content.Shared.Doors.Systems;
public abstract class SharedAirlockSystem : EntitySystem
{
[Dependency] protected readonly SharedDoorSystem DoorSystem = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<SharedAirlockComponent, ComponentGetState>(OnGetState);
SubscribeLocalEvent<SharedAirlockComponent, ComponentHandleState>(OnHandleState);
SubscribeLocalEvent<SharedAirlockComponent, BeforeDoorClosedEvent>(OnBeforeDoorClosed);
}
private void OnGetState(EntityUid uid, SharedAirlockComponent airlock, ref ComponentGetState args)
{
// Need to network airlock safety state to avoid mis-predicts when a door auto-closes as the client walks through the door.
args.State = new AirlockComponentState(airlock.Safety);
}
private void OnHandleState(EntityUid uid, SharedAirlockComponent airlock, ref ComponentHandleState args)
{
if (args.Current is not AirlockComponentState state)
return;
airlock.Safety = state.Safety;
}
protected virtual void OnBeforeDoorClosed(EntityUid uid, SharedAirlockComponent airlock, BeforeDoorClosedEvent args)
{
if (!airlock.Safety)
args.PerformCollisionCheck = false;
}
public void UpdateEmergencyLightStatus(SharedAirlockComponent component)
{
if (TryComp<AppearanceComponent>(component.Owner, out var appearanceComponent))
{
appearanceComponent.SetData(DoorVisuals.EmergencyLights, component.EmergencyAccess);
}
}
public void ToggleEmergencyAccess(SharedAirlockComponent component)
{
component.EmergencyAccess = !component.EmergencyAccess;
UpdateEmergencyLightStatus(component);
}
}