private void OnSignalPortSelected(EntityUid uid, SignalLinkerComponent linker, SignalPortSelected args) { if (!TryComp(linker.SavedTransmitter, out SignalTransmitterComponent? transmitter) || !TryComp(linker.SavedReceiver, out SignalReceiverComponent? receiver) || !transmitter.Outputs.TryGetValue(args.TransmitterPort, out var receivers) || !receiver.Inputs.TryGetValue(args.ReceiverPort, out var transmitters)) { return; } if (args.Session.AttachedEntity is not EntityUid { Valid: true } attached) { return; } if (receivers.Contains(new(receiver.Owner, args.ReceiverPort)) || transmitters.Contains(new(transmitter.Owner, args.TransmitterPort))) { // link already exists, remove it if (receivers.Remove(new(receiver.Owner, args.ReceiverPort)) && transmitters.Remove(new(transmitter.Owner, args.TransmitterPort))) { RaiseLocalEvent(receiver.Owner, new PortDisconnectedEvent(args.ReceiverPort), true); RaiseLocalEvent(transmitter.Owner, new PortDisconnectedEvent(args.TransmitterPort), true); _popupSystem.PopupCursor(Loc.GetString("signal-linker-component-unlinked-port", ("machine1", transmitter.Owner), ("port1", PortName <TransmitterPortPrototype>(args.TransmitterPort)), ("machine2", receiver.Owner), ("port2", PortName <ReceiverPortPrototype>(args.ReceiverPort))), Filter.Entities(attached), PopupType.Medium); }
private bool TryLink(SignalTransmitterComponent transmitter, SignalReceiverComponent receiver, SignalPortSelected args, EntityUid user, bool quiet = false, bool checkRange = true) { if (!transmitter.Outputs.TryGetValue(args.TransmitterPort, out var linkedReceivers) || !receiver.Inputs.TryGetValue(args.ReceiverPort, out var linkedTransmitters)) { return(false); } // Does the link already exist? Under the assumption that nothing has broken, lets only check the // transmitter ports. foreach (var identifier in linkedTransmitters) { if (identifier.Uid == transmitter.Owner && identifier.Port == args.TransmitterPort) { return(true); } } if (checkRange && !IsInRange(transmitter, receiver)) { if (!quiet) { _popupSystem.PopupCursor(Loc.GetString("signal-linker-component-out-of-range"), Filter.Entities(user)); } return(false); } // allow other systems to refuse the connection var linkAttempt = new LinkAttemptEvent(user, transmitter.Owner, args.TransmitterPort, receiver.Owner, args.ReceiverPort); RaiseLocalEvent(transmitter.Owner, linkAttempt, true); if (linkAttempt.Cancelled) { if (!quiet) { _popupSystem.PopupCursor(Loc.GetString("signal-linker-component-connection-refused", ("machine", transmitter.Owner)), Filter.Entities(user)); } return(false); } RaiseLocalEvent(receiver.Owner, linkAttempt, true); if (linkAttempt.Cancelled) { if (!quiet) { _popupSystem.PopupCursor(Loc.GetString("signal-linker-component-connection-refused", ("machine", receiver.Owner)), Filter.Entities(user)); } return(false); } linkedReceivers.Add(new(receiver.Owner, args.ReceiverPort)); linkedTransmitters.Add(new(transmitter.Owner, args.TransmitterPort)); if (!quiet) { _popupSystem.PopupCursor(Loc.GetString("signal-linker-component-linked-port", ("machine1", transmitter.Owner), ("port1", PortName <TransmitterPortPrototype>(args.TransmitterPort)), ("machine2", receiver.Owner), ("port2", PortName <ReceiverPortPrototype>(args.ReceiverPort))), Filter.Entities(user), PopupType.Medium); } return(true); }