Cleaner BoundUserInterfaces (#17736)
This commit is contained in:
@@ -2,7 +2,6 @@ using System.Linq;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using Content.Server.DeviceLinking.Components;
|
||||
using Content.Server.MachineLinking.Components;
|
||||
using Content.Server.MachineLinking.Events;
|
||||
using Content.Server.Power.Components;
|
||||
using Content.Server.Tools;
|
||||
using Content.Shared.DeviceLinking.Events;
|
||||
@@ -246,9 +245,9 @@ namespace Content.Server.MachineLinking.System
|
||||
return;
|
||||
}
|
||||
|
||||
if (TryGetOrOpenUI(actor, linker, out var bui))
|
||||
if (TryGetOrOpenUI(args.Used, out var bui, actor))
|
||||
{
|
||||
TryUpdateUI(linker, transmitter, receiver, bui);
|
||||
TryUpdateUI(args.Used, uid, linker.SavedReceiver!.Value, bui, transmitter, receiver);
|
||||
args.Handled = true;
|
||||
}
|
||||
}
|
||||
@@ -275,26 +274,29 @@ namespace Content.Server.MachineLinking.System
|
||||
return;
|
||||
}
|
||||
|
||||
if (TryGetOrOpenUI(actor, linker, out var bui))
|
||||
if (TryGetOrOpenUI(args.Used, out var bui, actor))
|
||||
{
|
||||
TryUpdateUI(linker, transmitter, receiver, bui);
|
||||
TryUpdateUI(args.Used, linker.SavedTransmitter!.Value, uid, bui, transmitter, receiver);
|
||||
args.Handled = true;
|
||||
}
|
||||
}
|
||||
|
||||
private bool TryGetOrOpenUI(ActorComponent actor, SignalLinkerComponent linker, [NotNullWhen(true)] out BoundUserInterface? bui)
|
||||
private bool TryGetOrOpenUI(EntityUid linkerUid, [NotNullWhen(true)] out BoundUserInterface? bui, ActorComponent actor)
|
||||
{
|
||||
if (_userInterfaceSystem.TryGetUi(linker.Owner, SignalLinkerUiKey.Key, out bui))
|
||||
if (_userInterfaceSystem.TryGetUi(linkerUid, SignalLinkerUiKey.Key, out bui))
|
||||
{
|
||||
bui.Open(actor.PlayerSession);
|
||||
_userInterfaceSystem.OpenUi(bui, actor.PlayerSession);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private bool TryUpdateUI(SignalLinkerComponent linker, SignalTransmitterComponent transmitter, SignalReceiverComponent receiver, BoundUserInterface? bui = null)
|
||||
private bool TryUpdateUI(EntityUid linkerUid, EntityUid transmitterUid, EntityUid receiverUid, BoundUserInterface? bui = null, SignalTransmitterComponent? transmitter = null, SignalReceiverComponent? receiver = null)
|
||||
{
|
||||
if (bui == null && !_userInterfaceSystem.TryGetUi(linker.Owner, SignalLinkerUiKey.Key, out bui))
|
||||
if (!Resolve(transmitterUid, ref transmitter) || !Resolve(receiverUid, ref receiver))
|
||||
return false;
|
||||
|
||||
if (bui == null && !_userInterfaceSystem.TryGetUi(linkerUid, SignalLinkerUiKey.Key, out bui))
|
||||
return false;
|
||||
|
||||
var outKeys = transmitter.Outputs.Keys.ToList();
|
||||
@@ -304,24 +306,30 @@ namespace Content.Server.MachineLinking.System
|
||||
{
|
||||
foreach (var re in transmitter.Outputs[outKeys[i]])
|
||||
{
|
||||
if (re.Uid == receiver.Owner)
|
||||
if (re.Uid == receiverUid)
|
||||
links.Add((i, inKeys.IndexOf(re.Port)));
|
||||
}
|
||||
}
|
||||
|
||||
bui.SetState(new SignalPortsState($"{Name(transmitter.Owner)} ({transmitter.Owner})", outKeys,
|
||||
$"{Name(receiver.Owner)} ({receiver.Owner})", inKeys, links));
|
||||
UserInterfaceSystem.SetUiState(bui, new SignalPortsState(
|
||||
$"{Name(transmitterUid)} ({transmitterUid})",
|
||||
outKeys,
|
||||
$"{Name(receiverUid)} ({receiverUid})",
|
||||
inKeys,
|
||||
links
|
||||
));
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
private bool TryLink(SignalTransmitterComponent transmitter, SignalReceiverComponent receiver, SignalPortSelected args, EntityUid? user, bool quiet = false, bool checkRange = true)
|
||||
private bool TryLink(EntityUid transmitterUid, EntityUid receiverUid, SignalPortSelected args, EntityUid? user, bool quiet = false, bool checkRange = true, SignalTransmitterComponent? transmitter = null, SignalReceiverComponent? receiver = null)
|
||||
{
|
||||
if (!transmitter.Outputs.TryGetValue(args.TransmitterPort, out var linkedReceivers) ||
|
||||
!receiver.Inputs.TryGetValue(args.ReceiverPort, out var linkedTransmitters))
|
||||
{
|
||||
if (!Resolve(transmitterUid, ref transmitter) || !Resolve(receiverUid, ref receiver))
|
||||
return false;
|
||||
|
||||
if (!transmitter.Outputs.TryGetValue(args.TransmitterPort, out var linkedReceivers)
|
||||
|| !receiver.Inputs.TryGetValue(args.ReceiverPort, out var linkedTransmitters))
|
||||
return false;
|
||||
}
|
||||
|
||||
quiet |= !user.HasValue;
|
||||
|
||||
@@ -329,11 +337,11 @@ namespace Content.Server.MachineLinking.System
|
||||
// transmitter ports.
|
||||
foreach (var identifier in linkedTransmitters)
|
||||
{
|
||||
if (identifier.Uid == transmitter.Owner && identifier.Port == args.TransmitterPort)
|
||||
if (identifier.Uid == transmitterUid && identifier.Port == args.TransmitterPort)
|
||||
return true;
|
||||
}
|
||||
|
||||
if (checkRange && !IsInRange(transmitter, receiver))
|
||||
if (checkRange && !IsInRange(transmitterUid, receiverUid, transmitter, receiver))
|
||||
{
|
||||
if (!quiet)
|
||||
_popupSystem.PopupCursor(Loc.GetString("signal-linker-component-out-of-range"), user!.Value);
|
||||
@@ -341,35 +349,35 @@ namespace Content.Server.MachineLinking.System
|
||||
}
|
||||
|
||||
// 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);
|
||||
var linkAttempt = new LinkAttemptEvent(user, transmitterUid, args.TransmitterPort, receiverUid, args.ReceiverPort);
|
||||
RaiseLocalEvent(transmitterUid, linkAttempt, true);
|
||||
if (linkAttempt.Cancelled)
|
||||
{
|
||||
if (!quiet)
|
||||
_popupSystem.PopupCursor(Loc.GetString("signal-linker-component-connection-refused", ("machine", transmitter.Owner)), user!.Value);
|
||||
_popupSystem.PopupCursor(Loc.GetString("signal-linker-component-connection-refused", ("machine", transmitterUid)), user!.Value);
|
||||
return false;
|
||||
}
|
||||
RaiseLocalEvent(receiver.Owner, linkAttempt, true);
|
||||
RaiseLocalEvent(receiverUid, linkAttempt, true);
|
||||
if (linkAttempt.Cancelled)
|
||||
{
|
||||
if (!quiet)
|
||||
_popupSystem.PopupCursor(Loc.GetString("signal-linker-component-connection-refused", ("machine", receiver.Owner)), user!.Value);
|
||||
_popupSystem.PopupCursor(Loc.GetString("signal-linker-component-connection-refused", ("machine", receiverUid)), user!.Value);
|
||||
return false;
|
||||
}
|
||||
|
||||
linkedReceivers.Add(new(receiver.Owner, args.ReceiverPort));
|
||||
linkedTransmitters.Add(new(transmitter.Owner, args.TransmitterPort));
|
||||
linkedReceivers.Add(new(receiverUid, args.ReceiverPort));
|
||||
linkedTransmitters.Add(new(transmitterUid, 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))),
|
||||
("machine1", transmitterUid), ("port1", PortName<TransmitterPortPrototype>(args.TransmitterPort)),
|
||||
("machine2", receiverUid), ("port2", PortName<ReceiverPortPrototype>(args.ReceiverPort))),
|
||||
user!.Value, PopupType.Medium);
|
||||
}
|
||||
|
||||
var newLink = new NewLinkEvent(user, transmitter.Owner, args.TransmitterPort, receiver.Owner, args.ReceiverPort);
|
||||
RaiseLocalEvent(receiver.Owner, newLink);
|
||||
RaiseLocalEvent(transmitter.Owner, newLink);
|
||||
var newLink = new NewLinkEvent(user, transmitterUid, args.TransmitterPort, receiverUid, args.ReceiverPort);
|
||||
RaiseLocalEvent(receiverUid, newLink);
|
||||
RaiseLocalEvent(transmitterUid, newLink);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -382,22 +390,25 @@ namespace Content.Server.MachineLinking.System
|
||||
!receiver.Inputs.TryGetValue(args.ReceiverPort, out var transmitters))
|
||||
return;
|
||||
|
||||
if (args.Session.AttachedEntity is not { Valid: true} attached)
|
||||
if (args.Session.AttachedEntity is not { Valid: true } attached)
|
||||
return;
|
||||
|
||||
if (receivers.Contains(new(receiver.Owner, args.ReceiverPort)) ||
|
||||
transmitters.Contains(new(transmitter.Owner, args.TransmitterPort)))
|
||||
var receiverUid = linker.SavedReceiver.Value;
|
||||
var transmitterUid = linker.SavedTransmitter.Value;
|
||||
|
||||
if (receivers.Contains(new(receiverUid, args.ReceiverPort)) ||
|
||||
transmitters.Contains(new(transmitterUid, args.TransmitterPort)))
|
||||
{
|
||||
// link already exists, remove it
|
||||
if (receivers.Remove(new(receiver.Owner, args.ReceiverPort)) &&
|
||||
transmitters.Remove(new(transmitter.Owner, args.TransmitterPort)))
|
||||
if (receivers.Remove(new(receiverUid, args.ReceiverPort)) &&
|
||||
transmitters.Remove(new(transmitterUid, args.TransmitterPort)))
|
||||
{
|
||||
RaiseLocalEvent(receiver.Owner, new PortDisconnectedEvent(args.ReceiverPort), true);
|
||||
RaiseLocalEvent(transmitter.Owner, new PortDisconnectedEvent(args.TransmitterPort), true);
|
||||
RaiseLocalEvent(receiverUid, new PortDisconnectedEvent(args.ReceiverPort), true);
|
||||
RaiseLocalEvent(transmitterUid, 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))),
|
||||
("machine1", transmitterUid), ("port1", PortName<TransmitterPortPrototype>(args.TransmitterPort)),
|
||||
("machine2", receiverUid), ("port2", PortName<ReceiverPortPrototype>(args.ReceiverPort))),
|
||||
attached, PopupType.Medium);
|
||||
}
|
||||
else
|
||||
@@ -407,10 +418,10 @@ namespace Content.Server.MachineLinking.System
|
||||
}
|
||||
else
|
||||
{
|
||||
TryLink(transmitter, receiver, args, attached);
|
||||
TryLink(transmitterUid, receiverUid, args, attached, transmitter: transmitter, receiver: receiver);
|
||||
}
|
||||
|
||||
TryUpdateUI(linker, transmitter, receiver);
|
||||
TryUpdateUI(uid, transmitterUid, receiverUid, transmitter: transmitter, receiver: receiver);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -432,19 +443,22 @@ namespace Content.Server.MachineLinking.System
|
||||
!TryComp(linker.SavedReceiver, out SignalReceiverComponent? receiver))
|
||||
return;
|
||||
|
||||
var transmitterUid = linker.SavedTransmitter.Value;
|
||||
var receiverUid = linker.SavedReceiver.Value;
|
||||
|
||||
foreach (var (port, receivers) in transmitter.Outputs)
|
||||
{
|
||||
if (receivers.RemoveAll(id => id.Uid == receiver.Owner) > 0)
|
||||
RaiseLocalEvent(transmitter.Owner, new PortDisconnectedEvent(port), true);
|
||||
if (receivers.RemoveAll(id => id.Uid == receiverUid) > 0)
|
||||
RaiseLocalEvent(transmitterUid, new PortDisconnectedEvent(port), true);
|
||||
}
|
||||
|
||||
foreach (var (port, transmitters) in receiver.Inputs)
|
||||
{
|
||||
if (transmitters.RemoveAll(id => id.Uid == transmitter.Owner) > 0)
|
||||
RaiseLocalEvent(receiver.Owner, new PortDisconnectedEvent(port), true);
|
||||
if (transmitters.RemoveAll(id => id.Uid == transmitterUid) > 0)
|
||||
RaiseLocalEvent(receiverUid, new PortDisconnectedEvent(port), true);
|
||||
}
|
||||
|
||||
TryUpdateUI(linker, transmitter, receiver);
|
||||
TryUpdateUI(uid, transmitterUid, receiverUid, transmitter: transmitter, receiver: receiver);
|
||||
}
|
||||
|
||||
private void OnLinkerLinkDefaultSelected(EntityUid uid, SignalLinkerComponent linker, LinkerLinkDefaultSelected args)
|
||||
@@ -456,8 +470,11 @@ namespace Content.Server.MachineLinking.System
|
||||
if (args.Session.AttachedEntity is not { Valid: true } user)
|
||||
return;
|
||||
|
||||
TryLinkDefaults(linker.SavedReceiver!.Value, linker.SavedTransmitter!.Value, user, receiver, transmitter);
|
||||
TryUpdateUI(linker, transmitter, receiver);
|
||||
var transmitterUid = linker.SavedTransmitter!.Value;
|
||||
var receiverUid = linker.SavedReceiver!.Value;
|
||||
|
||||
TryLinkDefaults(receiverUid, transmitterUid, user, receiver, transmitter);
|
||||
TryUpdateUI(uid, transmitterUid, receiverUid, transmitter: transmitter, receiver: receiver);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -470,7 +487,7 @@ namespace Content.Server.MachineLinking.System
|
||||
if (!Resolve(receiverUid, ref receiver, false) || !Resolve(transmitterUid, ref transmitter, false))
|
||||
return false;
|
||||
|
||||
if (!IsInRange(transmitter, receiver))
|
||||
if (!IsInRange(transmitterUid, receiverUid, transmitter, receiver))
|
||||
return false;
|
||||
|
||||
var allLinksSucceeded = true;
|
||||
@@ -478,14 +495,14 @@ namespace Content.Server.MachineLinking.System
|
||||
// First, disconnect existing links.
|
||||
foreach (var (port, receivers) in transmitter.Outputs)
|
||||
{
|
||||
if (receivers.RemoveAll(id => id.Uid == receiver.Owner) > 0)
|
||||
RaiseLocalEvent(transmitter.Owner, new PortDisconnectedEvent(port), true);
|
||||
if (receivers.RemoveAll(id => id.Uid == receiverUid) > 0)
|
||||
RaiseLocalEvent(transmitterUid, new PortDisconnectedEvent(port), true);
|
||||
}
|
||||
|
||||
foreach (var (port, transmitters) in receiver.Inputs)
|
||||
{
|
||||
if (transmitters.RemoveAll(id => id.Uid == transmitter.Owner) > 0)
|
||||
RaiseLocalEvent(receiver.Owner, new PortDisconnectedEvent(port), true);
|
||||
if (transmitters.RemoveAll(id => id.Uid == transmitterUid) > 0)
|
||||
RaiseLocalEvent(receiverUid, new PortDisconnectedEvent(port), true);
|
||||
}
|
||||
|
||||
// Then make any valid default connections.
|
||||
@@ -498,7 +515,7 @@ namespace Content.Server.MachineLinking.System
|
||||
foreach (var inPort in prototype.DefaultLinks)
|
||||
{
|
||||
if (receiver.Inputs.ContainsKey(inPort))
|
||||
allLinksSucceeded &= TryLink(transmitter, receiver, new(outPort, inPort), user, quiet: true, checkRange: false);
|
||||
allLinksSucceeded &= TryLink(transmitterUid, receiverUid, new(outPort, inPort), user, quiet: true, checkRange: false, transmitter: transmitter, receiver: receiver);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -511,16 +528,16 @@ namespace Content.Server.MachineLinking.System
|
||||
component.SavedReceiver = null;
|
||||
}
|
||||
|
||||
private bool IsInRange(SignalTransmitterComponent transmitterComponent, SignalReceiverComponent receiverComponent)
|
||||
private bool IsInRange(EntityUid transmitterUid, EntityUid receiverUid, SignalTransmitterComponent transmitterComponent, SignalReceiverComponent _)
|
||||
{
|
||||
if (TryComp(transmitterComponent.Owner, out ApcPowerReceiverComponent? transmitterPower) &&
|
||||
TryComp(receiverComponent.Owner, out ApcPowerReceiverComponent? receiverPower) &&
|
||||
if (TryComp(transmitterUid, out ApcPowerReceiverComponent? transmitterPower) &&
|
||||
TryComp(receiverUid, out ApcPowerReceiverComponent? receiverPower) &&
|
||||
transmitterPower.Provider?.Net == receiverPower.Provider?.Net)
|
||||
return true;
|
||||
|
||||
// TODO: As elsewhere don't use mappos inrange.
|
||||
return Comp<TransformComponent>(transmitterComponent.Owner).MapPosition.InRange(
|
||||
Comp<TransformComponent>(receiverComponent.Owner).MapPosition, transmitterComponent.TransmissionRange);
|
||||
return Comp<TransformComponent>(transmitterUid).MapPosition.InRange(
|
||||
Comp<TransformComponent>(receiverUid).MapPosition, transmitterComponent.TransmissionRange);
|
||||
}
|
||||
|
||||
private bool IsLinkerInteractable(EntityUid uid, SignalLinkerComponent linkerComponent)
|
||||
|
||||
Reference in New Issue
Block a user