CatStation/Content.Server/Shuttles/Systems/DockingSignalControlSystem.cs
Varen c512e35bf9
Add bolt signal to door outputs (#44940)
* Add bolt signal to door outputs

* Update DoorSignalControlSystem.cs

* fix test

---------

Co-authored-by: Pok245 <113675512+Pok27@users.noreply.github.com>
2026-09-23 19:54:44 +00:00

77 lines
2.5 KiB
C#

using Content.Server.DeviceLinking.Systems;
using Content.Server.Shuttles.Components;
using Content.Server.Shuttles.Events;
using Content.Shared.DeviceLinking;
using Content.Shared.DeviceLinking.Events;
namespace Content.Server.Shuttles.Systems;
public sealed partial class DockingSignalControlSystem : EntitySystem
{
[Dependency] private DeviceLinkSystem _deviceLinkSystem = default!;
[Dependency] private DockingSystem _dockingSystem = default!;
[SubscribeLocalEvent]
private void OnMapInit(Entity<DockingSignalControlComponent> ent, ref MapInitEvent args)
{
_deviceLinkSystem.EnsureSourcePorts(ent, ent.Comp.DockStatusSignalPort);
_deviceLinkSystem.EnsureSinkPorts(ent, ent.Comp.DockTogglePort);
}
[SubscribeLocalEvent]
private void OnDocked(Entity<DockingSignalControlComponent> ent, ref DockEvent args)
{
_deviceLinkSystem.SendSignal(ent.Owner, ent.Comp.DockStatusSignalPort, signal: true);
}
[SubscribeLocalEvent]
private void OnUndocked(Entity<DockingSignalControlComponent> ent, ref UndockEvent args)
{
_deviceLinkSystem.SendSignal(ent.Owner, ent.Comp.DockStatusSignalPort, signal: false);
}
[SubscribeLocalEvent]
private void OnSignalReceived(Entity<DockingSignalControlComponent> ent, ref SignalReceivedEvent args)
{
if (args.Port != ent.Comp.DockTogglePort)
return;
ToggleDock(ent, SignalState.Momentary);
}
[SubscribeLocalEvent]
private void OnSignalReceived(Entity<DockingSignalControlComponent> ent, ref SignalReceivedEvent<LogicStatePayload> args)
{
if (args.Port != ent.Comp.DockTogglePort)
return;
ToggleDock(ent, args.Data.State);
}
private void ToggleDock(Entity<DockingSignalControlComponent> ent, SignalState state)
{
if (!TryComp<DockingComponent>(ent, out var dock))
return;
var shouldDock = state == SignalState.High || state == SignalState.Momentary && !dock.Docked;
if (shouldDock)
{
var query = AllEntityQuery<DockingComponent>();
while (query.MoveNext(out var dockingUid, out var docking))
{
if (!_dockingSystem.CanDock((ent, dock), (dockingUid, docking)))
continue;
_dockingSystem.Dock((ent, dock), (dockingUid, docking));
break;
}
}
else
{
if (!_dockingSystem.CanUndock((ent, dock)))
return;
_dockingSystem.Undock((ent, dock));
}
}
}