Ejemplo n.º 1
0
        /// <summary>
        ///     Add an alt-click verb to allow users to link the default ports, without needing to open the UI.
        /// </summary>
        private void OnGetReceiverVerbs(EntityUid uid, SignalReceiverComponent component, GetVerbsEvent <AlternativeVerb> args)
        {
            if (!args.CanAccess || !args.CanInteract)
            {
                return;
            }

            if (!TryComp(args.Using, out SignalLinkerComponent? linker))
            {
                return;
            }

            AlternativeVerb verb = new()
            {
                Text       = Loc.GetString("signal-linking-verb-text-link-default"),
                IconEntity = args.Using
            };

            args.Verbs.Add(verb);

            if (linker.SavedTransmitter != null)
            {
                verb.Act = () =>
                {
                    var msg = TryLinkDefaults(uid, linker.SavedTransmitter.Value, args.User, component)
                        ? Loc.GetString("signal-linking-verb-success", ("machine", linker.SavedTransmitter.Value))
                        : Loc.GetString("signal-linking-verb-fail", ("machine", linker.SavedTransmitter.Value));
                    _popupSystem.PopupEntity(msg, uid, Filter.Entities(args.User));
                };
                return;
            }

            verb.Disabled = true;
            verb.Message  = Loc.GetString("signal-linking-verb-disabled-no-transmitter");
        }
Ejemplo n.º 2
0
        private void OnReceiverInteractUsing(EntityUid uid, SignalReceiverComponent receiver, InteractUsingEvent args)
        {
            if (args.Handled)
            {
                return;
            }

            if (!TryComp(args.Used, out SignalLinkerComponent? linker) ||
                !TryComp(args.User, out ActorComponent? actor))
            {
                return;
            }

            linker.SavedReceiver = uid;

            if (!TryComp(linker.SavedTransmitter, out SignalTransmitterComponent? transmitter))
            {
                _popupSystem.PopupCursor(Loc.GetString("signal-linker-component-saved", ("machine", uid)),
                                         Filter.Entities(args.User), PopupType.Medium);
                args.Handled = true;
                return;
            }

            if (TryGetOrOpenUI(actor, linker, out var bui))
            {
                TryUpdateUI(linker, transmitter, receiver, bui);
                args.Handled = true;
                return;
            }
        }
Ejemplo n.º 3
0
 public SignalLink(SignalTransmitterComponent transmitterComponent, string transmitterPort, SignalReceiverComponent receiverComponent, string receiverPort)
 {
     TransmitterComponent = transmitterComponent;
     ReceiverComponent    = receiverComponent;
     Transmitterport      = TransmitterComponent.Outputs.GetPort(transmitterPort);
     Receiverport         = ReceiverComponent.Inputs.GetPort(receiverPort);
 }
Ejemplo n.º 4
0
 public LinkAttemptEvent(IEntity attemptee, SignalTransmitterComponent transmitterComponent, string transmitterPort, SignalReceiverComponent receiverComponent, string receiverPort)
 {
     TransmitterComponent = transmitterComponent;
     this.TransmitterPort = transmitterPort;
     ReceiverComponent    = receiverComponent;
     this.ReceiverPort    = receiverPort;
     Attemptee            = attemptee;
 }
Ejemplo n.º 5
0
        private void OnReceiverRemoved(EntityUid uid, SignalReceiverComponent component, ComponentRemove args)
        {
            Dictionary <EntityUid, SignalTransmitterComponent?> uidCache = new();

            foreach (var rport in component.Inputs)
            {
                foreach (var tport in rport.Value)
                {
                    if (!uidCache.TryGetValue(tport.Uid, out var transmitter))
                    {
                        uidCache.Add(tport.Uid, transmitter = CompOrNull <SignalTransmitterComponent>(tport.Uid));
                    }
                    if (transmitter != null && transmitter.Outputs.TryGetValue(tport.Port, out var receivers))
                    {
                        receivers.Remove(new(uid, rport.Key));
                    }
                }
            }
        }
Ejemplo n.º 6
0
        private void OnReceiverStartup(EntityUid uid, SignalReceiverComponent receiver, ComponentStartup args)
        {
            // validate links
            Dictionary <EntityUid, SignalTransmitterComponent?> uidCache = new();

            foreach (var rport in receiver.Inputs)
            {
                foreach (var tport in rport.Value)
                {
                    if (!uidCache.TryGetValue(tport.Uid, out var transmitter))
                    {
                        uidCache.Add(tport.Uid, transmitter = CompOrNull <SignalTransmitterComponent>(tport.Uid));
                    }
                    if (transmitter == null || !transmitter.Outputs.TryGetValue(tport.Port, out var tpv))
                    {
                        rport.Value.Remove(tport);
                    }
                    else if (!tpv.Contains(new(uid, rport.Key)))
                    {
                        tpv.Add(new(uid, rport.Key));
                    }
                }
            }
        }
Ejemplo n.º 7
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);
        }
Ejemplo n.º 8
0
        private bool TryUpdateUI(SignalLinkerComponent linker, SignalTransmitterComponent transmitter, SignalReceiverComponent receiver, BoundUserInterface?bui = null)
        {
            if (bui == null && !_userInterfaceSystem.TryGetUi(linker.Owner, SignalLinkerUiKey.Key, out bui))
            {
                return(false);
            }

            var outKeys             = transmitter.Outputs.Keys.ToList();
            var inKeys              = receiver.Inputs.Keys.ToList();
            List <(int, int)> links = new();

            for (int i = 0; i < outKeys.Count; i++)
            {
                foreach (var re in transmitter.Outputs[outKeys[i]])
                {
                    if (re.Uid == receiver.Owner)
                    {
                        links.Add((i, inKeys.IndexOf(re.Port)));
                    }
                }
            }

            bui.SetState(new SignalPortsState($"{Name(transmitter.Owner)} ({transmitter.Owner})", outKeys,
                                              $"{Name(receiver.Owner)} ({receiver.Owner})", inKeys, links));
            return(true);
        }