CatStation/Content.Server/Shuttles/Systems/DockingSignalControlSystem.cs
UpAndLeaves 1e3b924417
Allow toggling shuttle docks via network linking (#45734)
* Allow toggling shuttle docks via network linking

* RQC

* RQC 2

* Fuck shit I fucked it

* More explainin'

* RQC

* review

* Fix merge issues

* Update DockingSignalControlSystem.cs

---------

Co-authored-by: Pok245 <113675512+Pok27@users.noreply.github.com>
2026-09-22 10:20:40 +00:00

66 lines
2.2 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<LogicStatePayload> args)
{
if (args.Port != ent.Comp.DockTogglePort)
return;
if (!TryComp<DockingComponent>(ent, out var dock))
return;
var state = args.Data.State;
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));
}
}
}