ECS airlocks (#13500)

This commit is contained in:
metalgearsloth
2023-01-18 05:44:32 +11:00
committed by GitHub
parent 8550baa218
commit 2873a830bd
19 changed files with 270 additions and 291 deletions

View File

@@ -1,4 +1,5 @@
using Content.Shared.Doors.Components;
using Content.Shared.Popups;
using Robust.Shared.GameStates;
namespace Content.Shared.Doors.Systems;
@@ -6,24 +7,26 @@ namespace Content.Shared.Doors.Systems;
public abstract class SharedAirlockSystem : EntitySystem
{
[Dependency] protected readonly SharedAppearanceSystem Appearance = default!;
[Dependency] protected readonly SharedAudioSystem Audio = default!;
[Dependency] protected readonly SharedDoorSystem DoorSystem = default!;
[Dependency] protected readonly SharedPopupSystem Popup = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<SharedAirlockComponent, ComponentGetState>(OnGetState);
SubscribeLocalEvent<SharedAirlockComponent, ComponentHandleState>(OnHandleState);
SubscribeLocalEvent<SharedAirlockComponent, BeforeDoorClosedEvent>(OnBeforeDoorClosed);
SubscribeLocalEvent<AirlockComponent, ComponentGetState>(OnGetState);
SubscribeLocalEvent<AirlockComponent, ComponentHandleState>(OnHandleState);
SubscribeLocalEvent<AirlockComponent, BeforeDoorClosedEvent>(OnBeforeDoorClosed);
}
private void OnGetState(EntityUid uid, SharedAirlockComponent airlock, ref ComponentGetState args)
private void OnGetState(EntityUid uid, AirlockComponent 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)
private void OnHandleState(EntityUid uid, AirlockComponent airlock, ref ComponentHandleState args)
{
if (args.Current is not AirlockComponentState state)
return;
@@ -31,21 +34,45 @@ public abstract class SharedAirlockSystem : EntitySystem
airlock.Safety = state.Safety;
}
protected virtual void OnBeforeDoorClosed(EntityUid uid, SharedAirlockComponent airlock, BeforeDoorClosedEvent args)
protected virtual void OnBeforeDoorClosed(EntityUid uid, AirlockComponent airlock, BeforeDoorClosedEvent args)
{
if (!airlock.Safety)
args.PerformCollisionCheck = false;
}
public void UpdateEmergencyLightStatus(SharedAirlockComponent component)
public void UpdateEmergencyLightStatus(EntityUid uid, AirlockComponent component)
{
Appearance.SetData(component.Owner, DoorVisuals.EmergencyLights, component.EmergencyAccess);
Appearance.SetData(uid, DoorVisuals.EmergencyLights, component.EmergencyAccess);
}
public void ToggleEmergencyAccess(SharedAirlockComponent component)
public void ToggleEmergencyAccess(EntityUid uid, AirlockComponent component)
{
component.EmergencyAccess = !component.EmergencyAccess;
UpdateEmergencyLightStatus(component);
UpdateEmergencyLightStatus(uid, component);
}
public void SetAutoCloseDelayModifier(AirlockComponent component, float value)
{
if (component.AutoCloseDelayModifier.Equals(value))
return;
component.AutoCloseDelayModifier = value;
}
public void SetSafety(AirlockComponent component, bool value)
{
if (component.Safety == value)
return;
component.Safety = value;
}
public void SetBoltWireCut(AirlockComponent component, bool value)
{
if (component.BoltWireCut == value)
return;
component.BoltWireCut = value;
}
}