Esempio n. 1
0
        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);
                }
Esempio n. 2
0
        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);
        }