/// <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"); }
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; } }
public SignalLink(SignalTransmitterComponent transmitterComponent, string transmitterPort, SignalReceiverComponent receiverComponent, string receiverPort) { TransmitterComponent = transmitterComponent; ReceiverComponent = receiverComponent; Transmitterport = TransmitterComponent.Outputs.GetPort(transmitterPort); Receiverport = ReceiverComponent.Inputs.GetPort(receiverPort); }
public LinkAttemptEvent(IEntity attemptee, SignalTransmitterComponent transmitterComponent, string transmitterPort, SignalReceiverComponent receiverComponent, string receiverPort) { TransmitterComponent = transmitterComponent; this.TransmitterPort = transmitterPort; ReceiverComponent = receiverComponent; this.ReceiverPort = receiverPort; Attemptee = attemptee; }
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)); } } } }
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)); } } } }
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); }
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); }