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 ent, ref MapInitEvent args) { _deviceLinkSystem.EnsureSourcePorts(ent, ent.Comp.DockStatusSignalPort); _deviceLinkSystem.EnsureSinkPorts(ent, ent.Comp.DockTogglePort); } [SubscribeLocalEvent] private void OnDocked(Entity ent, ref DockEvent args) { _deviceLinkSystem.SendSignal(ent.Owner, ent.Comp.DockStatusSignalPort, signal: true); } [SubscribeLocalEvent] private void OnUndocked(Entity ent, ref UndockEvent args) { _deviceLinkSystem.SendSignal(ent.Owner, ent.Comp.DockStatusSignalPort, signal: false); } [SubscribeLocalEvent] private void OnSignalReceived(Entity ent, ref SignalReceivedEvent args) { if (args.Port != ent.Comp.DockTogglePort) return; ToggleDock(ent, SignalState.Momentary); } [SubscribeLocalEvent] private void OnSignalReceived(Entity ent, ref SignalReceivedEvent args) { if (args.Port != ent.Comp.DockTogglePort) return; ToggleDock(ent, args.Data.State); } private void ToggleDock(Entity ent, SignalState state) { if (!TryComp(ent, out var dock)) return; var shouldDock = state == SignalState.High || state == SignalState.Momentary && !dock.Docked; if (shouldDock) { var query = AllEntityQuery(); 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)); } } }