diff --git a/Content.Client/Access/IdCardSystem.cs b/Content.Client/Access/IdCardSystem.cs
index fcf2bf57de..e0c02976f7 100644
--- a/Content.Client/Access/IdCardSystem.cs
+++ b/Content.Client/Access/IdCardSystem.cs
@@ -2,6 +2,4 @@
namespace Content.Client.Access;
-public sealed class IdCardSystem : SharedIdCardSystem
-{
-}
+public sealed class IdCardSystem : SharedIdCardSystem;
diff --git a/Content.Client/Access/UI/AgentIDCardBoundUserInterface.cs b/Content.Client/Access/UI/AgentIDCardBoundUserInterface.cs
index 73f18aec8d..c3fac8cb92 100644
--- a/Content.Client/Access/UI/AgentIDCardBoundUserInterface.cs
+++ b/Content.Client/Access/UI/AgentIDCardBoundUserInterface.cs
@@ -40,9 +40,9 @@ namespace Content.Client.Access.UI
SendMessage(new AgentIDCardJobChangedMessage(newJob));
}
- public void OnJobIconChanged(string newJobIcon)
+ public void OnJobIconChanged(string newJobIconId)
{
- SendMessage(new AgentIDCardJobIconChangedMessage(newJobIcon));
+ SendMessage(new AgentIDCardJobIconChangedMessage(newJobIconId));
}
///
@@ -57,7 +57,7 @@ namespace Content.Client.Access.UI
_window.SetCurrentName(cast.CurrentName);
_window.SetCurrentJob(cast.CurrentJob);
- _window.SetAllowedIcons(cast.Icons);
+ _window.SetAllowedIcons(cast.Icons, cast.CurrentJobIconId);
}
protected override void Dispose(bool disposing)
diff --git a/Content.Client/Access/UI/AgentIDCardWindow.xaml.cs b/Content.Client/Access/UI/AgentIDCardWindow.xaml.cs
index beca0c41ba..9a38c0c485 100644
--- a/Content.Client/Access/UI/AgentIDCardWindow.xaml.cs
+++ b/Content.Client/Access/UI/AgentIDCardWindow.xaml.cs
@@ -38,7 +38,7 @@ namespace Content.Client.Access.UI
JobLineEdit.OnFocusExit += e => OnJobChanged?.Invoke(e.Text);
}
- public void SetAllowedIcons(HashSet icons)
+ public void SetAllowedIcons(HashSet icons, string currentJobIconId)
{
IconGrid.DisposeAllChildren();
@@ -79,6 +79,10 @@ namespace Content.Client.Access.UI
jobIconButton.AddChild(jobIconTexture);
jobIconButton.OnPressed += _ => _bui.OnJobIconChanged(jobIcon.ID);
IconGrid.AddChild(jobIconButton);
+
+ if (jobIconId.Equals(currentJobIconId))
+ jobIconButton.Pressed = true;
+
i++;
}
}
diff --git a/Content.Client/Administration/Components/HeadstandComponent.cs b/Content.Client/Administration/Components/HeadstandComponent.cs
index d95e74576b..a4e3bfc5aa 100644
--- a/Content.Client/Administration/Components/HeadstandComponent.cs
+++ b/Content.Client/Administration/Components/HeadstandComponent.cs
@@ -3,7 +3,7 @@ using Robust.Shared.GameStates;
namespace Content.Client.Administration.Components;
-[RegisterComponent, NetworkedComponent]
+[RegisterComponent]
public sealed partial class HeadstandComponent : SharedHeadstandComponent
{
diff --git a/Content.Client/Administration/Components/KillSignComponent.cs b/Content.Client/Administration/Components/KillSignComponent.cs
index 1cf47b93ff..91c44ef3f2 100644
--- a/Content.Client/Administration/Components/KillSignComponent.cs
+++ b/Content.Client/Administration/Components/KillSignComponent.cs
@@ -3,6 +3,5 @@ using Robust.Shared.GameStates;
namespace Content.Client.Administration.Components;
-[NetworkedComponent, RegisterComponent]
-public sealed partial class KillSignComponent : SharedKillSignComponent
-{ }
+[RegisterComponent]
+public sealed partial class KillSignComponent : SharedKillSignComponent;
diff --git a/Content.Client/Audio/Jukebox/JukeboxSystem.cs b/Content.Client/Audio/Jukebox/JukeboxSystem.cs
index 53bde82a78..dd4a5bbb9b 100644
--- a/Content.Client/Audio/Jukebox/JukeboxSystem.cs
+++ b/Content.Client/Audio/Jukebox/JukeboxSystem.cs
@@ -11,6 +11,7 @@ public sealed class JukeboxSystem : SharedJukeboxSystem
[Dependency] private readonly IPrototypeManager _protoManager = default!;
[Dependency] private readonly AnimationPlayerSystem _animationPlayer = default!;
[Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!;
+ [Dependency] private readonly SharedUserInterfaceSystem _uiSystem = default!;
public override void Initialize()
{
@@ -35,13 +36,10 @@ public sealed class JukeboxSystem : SharedJukeboxSystem
var query = AllEntityQuery();
- while (query.MoveNext(out _, out var ui))
+ while (query.MoveNext(out var uid, out _, out var ui))
{
- if (!ui.OpenInterfaces.TryGetValue(JukeboxUiKey.Key, out var baseBui) ||
- baseBui is not JukeboxBoundUserInterface bui)
- {
+ if (!_uiSystem.TryGetOpenUi((uid, ui), JukeboxUiKey.Key, out var bui))
continue;
- }
bui.PopulateMusic();
}
@@ -49,15 +47,9 @@ public sealed class JukeboxSystem : SharedJukeboxSystem
private void OnJukeboxAfterState(Entity ent, ref AfterAutoHandleStateEvent args)
{
- if (!TryComp(ent, out UserInterfaceComponent? ui))
+ if (!_uiSystem.TryGetOpenUi(ent.Owner, JukeboxUiKey.Key, out var bui))
return;
- if (!ui.OpenInterfaces.TryGetValue(JukeboxUiKey.Key, out var baseBui) ||
- baseBui is not JukeboxBoundUserInterface bui)
- {
- return;
- }
-
bui.Reload();
}
diff --git a/Content.Client/Clothing/ClientClothingSystem.cs b/Content.Client/Clothing/ClientClothingSystem.cs
index 377bd3f2a7..438902c97b 100644
--- a/Content.Client/Clothing/ClientClothingSystem.cs
+++ b/Content.Client/Clothing/ClientClothingSystem.cs
@@ -11,6 +11,7 @@ using Content.Shared.Item;
using Robust.Client.GameObjects;
using Robust.Client.Graphics;
using Robust.Client.ResourceManagement;
+using Robust.Shared.Serialization.Manager;
using Robust.Shared.Serialization.TypeSerializers.Implementations;
using Robust.Shared.Utility;
using static Robust.Client.GameObjects.SpriteComponent;
@@ -53,6 +54,7 @@ public sealed class ClientClothingSystem : ClothingSystem
};
[Dependency] private readonly IResourceCache _cache = default!;
+ [Dependency] private readonly ISerializationManager _serialization = default!;
[Dependency] private readonly InventorySystem _inventorySystem = default!;
public override void Initialize()
@@ -272,6 +274,7 @@ public sealed class ClientClothingSystem : ClothingSystem
// temporary, until layer draw depths get added. Basically: a layer with the key "slot" is being used as a
// bookmark to determine where in the list of layers we should insert the clothing layers.
bool slotLayerExists = sprite.LayerMapTryGet(slot, out var index);
+ var displacementData = inventory.Displacements.GetValueOrDefault(slot);
// add the new layers
foreach (var (key, layerData) in ev.Layers)
@@ -311,10 +314,29 @@ public sealed class ClientClothingSystem : ClothingSystem
// Sprite layer redactor when
// Sprite "redactor" just a week away.
if (slot == Jumpsuit)
- layerData.Shader ??= "StencilDraw";
+ layerData.Shader ??= inventory.JumpsuitShader;
sprite.LayerSetData(index, layerData);
layer.Offset += slotDef.Offset;
+
+ if (displacementData != null)
+ {
+ var displacementKey = $"{key}-displacement";
+ if (!revealedLayers.Add(displacementKey))
+ {
+ Log.Warning($"Duplicate key for clothing visuals DISPLACEMENT: {displacementKey}.");
+ continue;
+ }
+
+ var displacementLayer = _serialization.CreateCopy(displacementData.Layer, notNullableOverride: true);
+ displacementLayer.CopyToShaderParameters!.LayerKey = key;
+
+ // Add before main layer for this item.
+ sprite.AddLayer(displacementLayer, index);
+ sprite.LayerMapSet(displacementKey, index);
+
+ revealedLayers.Add(displacementKey);
+ }
}
RaiseLocalEvent(equipment, new EquipmentVisualsUpdatedEvent(equipee, slot, revealedLayers), true);
diff --git a/Content.Client/Extinguisher/FireExtinguisherComponent.cs b/Content.Client/Extinguisher/FireExtinguisherComponent.cs
index 126c172924..324b05a93d 100644
--- a/Content.Client/Extinguisher/FireExtinguisherComponent.cs
+++ b/Content.Client/Extinguisher/FireExtinguisherComponent.cs
@@ -3,7 +3,5 @@ using Robust.Shared.GameStates;
namespace Content.Client.Extinguisher;
-[NetworkedComponent, RegisterComponent]
-public sealed partial class FireExtinguisherComponent : SharedFireExtinguisherComponent
-{
-}
+[RegisterComponent]
+public sealed partial class FireExtinguisherComponent : SharedFireExtinguisherComponent;
diff --git a/Content.Client/GameTicking/Managers/ClientGameTicker.cs b/Content.Client/GameTicking/Managers/ClientGameTicker.cs
index f62f99c6df..309db2eb4e 100644
--- a/Content.Client/GameTicking/Managers/ClientGameTicker.cs
+++ b/Content.Client/GameTicking/Managers/ClientGameTicker.cs
@@ -7,7 +7,7 @@ using Content.Shared.GameWindow;
using JetBrains.Annotations;
using Robust.Client.Graphics;
using Robust.Client.State;
-using Robust.Shared.Utility;
+using Robust.Client.UserInterface;
namespace Content.Client.GameTicking.Managers
{
@@ -18,16 +18,11 @@ namespace Content.Client.GameTicking.Managers
[Dependency] private readonly IClientAdminManager _admin = default!;
[Dependency] private readonly IClyde _clyde = default!;
[Dependency] private readonly SharedMapSystem _map = default!;
+ [Dependency] private readonly IUserInterfaceManager _userInterfaceManager = default!;
- [ViewVariables] private bool _initialized;
private Dictionary> _jobsAvailable = new();
private Dictionary _stationNames = new();
- ///
- /// The current round-end window. Could be used to support re-opening the window after closing it.
- ///
- private RoundEndSummaryWindow? _window;
-
[ViewVariables] public bool AreWeReady { get; private set; }
[ViewVariables] public bool IsGameStarted { get; private set; }
[ViewVariables] public string? RestartSound { get; private set; }
@@ -152,12 +147,7 @@ namespace Content.Client.GameTicking.Managers
// Force an update in the event of this song being the same as the last.
RestartSound = message.RestartSound;
- // Don't open duplicate windows (mainly for replays).
- if (_window?.RoundId == message.RoundId)
- return;
-
- //This is not ideal at all, but I don't see an immediately better fit anywhere else.
- _window = new RoundEndSummaryWindow(message.GamemodeTitle, message.RoundEndText, message.RoundDuration, message.RoundId, message.AllPlayersEndInfo, EntityManager);
+ _userInterfaceManager.GetUIController().OpenRoundEndSummaryWindow(message);
}
}
}
diff --git a/Content.Client/Input/ContentContexts.cs b/Content.Client/Input/ContentContexts.cs
index 2e888b3df9..8a7ca3b773 100644
--- a/Content.Client/Input/ContentContexts.cs
+++ b/Content.Client/Input/ContentContexts.cs
@@ -38,6 +38,7 @@ namespace Content.Client.Input
common.AddFunction(ContentKeyFunctions.ZoomIn);
common.AddFunction(ContentKeyFunctions.ResetZoom);
common.AddFunction(ContentKeyFunctions.InspectEntity);
+ common.AddFunction(ContentKeyFunctions.ToggleRoundEndSummaryWindow);
// Not in engine, because engine cannot check for sanbox/admin status before starting placement.
common.AddFunction(ContentKeyFunctions.EditorCopyObject);
diff --git a/Content.Client/MagicMirror/MagicMirrorBoundUserInterface.cs b/Content.Client/MagicMirror/MagicMirrorBoundUserInterface.cs
index bfbf2efe4f..f6979bf8d7 100644
--- a/Content.Client/MagicMirror/MagicMirrorBoundUserInterface.cs
+++ b/Content.Client/MagicMirror/MagicMirrorBoundUserInterface.cs
@@ -72,9 +72,6 @@ public sealed class MagicMirrorBoundUserInterface : BoundUserInterface
if (!disposing)
return;
- if (_window != null)
- _window.OnClose -= Close;
-
_window?.Dispose();
}
}
diff --git a/Content.Client/MagicMirror/MagicMirrorSystem.cs b/Content.Client/MagicMirror/MagicMirrorSystem.cs
new file mode 100644
index 0000000000..9b0b1dea0b
--- /dev/null
+++ b/Content.Client/MagicMirror/MagicMirrorSystem.cs
@@ -0,0 +1,8 @@
+using Content.Shared.MagicMirror;
+
+namespace Content.Client.MagicMirror;
+
+public sealed class MagicMirrorSystem : SharedMagicMirrorSystem
+{
+
+}
diff --git a/Content.Client/NetworkConfigurator/NetworkConfiguratorBoundUserInterface.cs b/Content.Client/NetworkConfigurator/NetworkConfiguratorBoundUserInterface.cs
index 264c297b63..80c98f143b 100644
--- a/Content.Client/NetworkConfigurator/NetworkConfiguratorBoundUserInterface.cs
+++ b/Content.Client/NetworkConfigurator/NetworkConfiguratorBoundUserInterface.cs
@@ -88,6 +88,7 @@ public sealed class NetworkConfiguratorBoundUserInterface : BoundUserInterface
base.Dispose(disposing);
if (!disposing) return;
+ _linkMenu?.Dispose();
_listMenu?.Dispose();
_configurationMenu?.Dispose();
}
diff --git a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs
index aca9efcfe2..a575f1ba51 100644
--- a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs
+++ b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs
@@ -215,6 +215,7 @@ namespace Content.Client.Options.UI.Tabs
AddButton(ContentKeyFunctions.OpenInventoryMenu);
AddButton(ContentKeyFunctions.OpenAHelp);
AddButton(ContentKeyFunctions.OpenActionsMenu);
+ AddButton(ContentKeyFunctions.ToggleRoundEndSummaryWindow);
AddButton(ContentKeyFunctions.OpenEntitySpawnWindow);
AddButton(ContentKeyFunctions.OpenSandboxWindow);
AddButton(ContentKeyFunctions.OpenTileSpawnWindow);
diff --git a/Content.Client/PDA/PdaBoundUserInterface.cs b/Content.Client/PDA/PdaBoundUserInterface.cs
index ef9d6e8b9b..07352b512b 100644
--- a/Content.Client/PDA/PdaBoundUserInterface.cs
+++ b/Content.Client/PDA/PdaBoundUserInterface.cs
@@ -21,7 +21,6 @@ namespace Content.Client.PDA
protected override void Open()
{
base.Open();
- SendMessage(new PdaRequestUpdateInterfaceMessage());
_menu = new PdaMenu();
_menu.OpenCenteredLeft();
_menu.OnClose += Close;
@@ -32,17 +31,17 @@ namespace Content.Client.PDA
_menu.EjectIdButton.OnPressed += _ =>
{
- SendMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaIdSlotId));
+ SendPredictedMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaIdSlotId));
};
_menu.EjectPenButton.OnPressed += _ =>
{
- SendMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaPenSlotId));
+ SendPredictedMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaPenSlotId));
};
_menu.EjectPaiButton.OnPressed += _ =>
{
- SendMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaPaiSlotId));
+ SendPredictedMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaPaiSlotId));
};
_menu.ActivateMusicButton.OnPressed += _ =>
diff --git a/Content.Client/Paper/PaperComponent.cs b/Content.Client/Paper/PaperComponent.cs
index d197cd3721..1dc827bf7e 100644
--- a/Content.Client/Paper/PaperComponent.cs
+++ b/Content.Client/Paper/PaperComponent.cs
@@ -1,9 +1,6 @@
using Content.Shared.Paper;
-using Robust.Shared.GameStates;
namespace Content.Client.Paper;
-[NetworkedComponent, RegisterComponent]
-public sealed partial class PaperComponent : SharedPaperComponent
-{
-}
+[RegisterComponent]
+public sealed partial class PaperComponent : SharedPaperComponent;
diff --git a/Content.Client/Power/ActivatableUIRequiresPowerSystem.cs b/Content.Client/Power/ActivatableUIRequiresPowerSystem.cs
new file mode 100644
index 0000000000..60ed8d87b9
--- /dev/null
+++ b/Content.Client/Power/ActivatableUIRequiresPowerSystem.cs
@@ -0,0 +1,21 @@
+using Content.Shared.Power.Components;
+using Content.Shared.UserInterface;
+using Content.Shared.Wires;
+
+namespace Content.Client.Power;
+
+public sealed class ActivatableUIRequiresPowerSystem : EntitySystem
+{
+ public override void Initialize()
+ {
+ base.Initialize();
+
+ SubscribeLocalEvent(OnActivate);
+ }
+
+ private void OnActivate(EntityUid uid, ActivatableUIRequiresPowerComponent component, ActivatableUIOpenAttemptEvent args)
+ {
+ // Client can't predict the power properly at the moment so rely upon the server to do it.
+ args.Cancel();
+ }
+}
diff --git a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs
index 213eb0b662..70b7608f6d 100644
--- a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs
+++ b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs
@@ -697,6 +697,20 @@ namespace Content.Client.Preferences.UI
var color = SkinColor.TintedHues(_rgbSkinColorSelector.Color);
+ CMarkings.CurrentSkinColor = color;
+ Profile = Profile.WithCharacterAppearance(Profile.Appearance.WithSkinColor(color));
+ break;
+ }
+ case HumanoidSkinColor.VoxFeathers:
+ {
+ if (!_rgbSkinColorContainer.Visible)
+ {
+ _skinColor.Visible = false;
+ _rgbSkinColorContainer.Visible = true;
+ }
+
+ var color = SkinColor.ClosestVoxColor(_rgbSkinColorSelector.Color);
+
CMarkings.CurrentSkinColor = color;
Profile = Profile.WithCharacterAppearance(Profile.Appearance.WithSkinColor(color));
break;
@@ -908,6 +922,18 @@ namespace Content.Client.Preferences.UI
_rgbSkinColorSelector.Color = Profile.Appearance.SkinColor;
break;
}
+ case HumanoidSkinColor.VoxFeathers:
+ {
+ if (!_rgbSkinColorContainer.Visible)
+ {
+ _skinColor.Visible = false;
+ _rgbSkinColorContainer.Visible = true;
+ }
+
+ _rgbSkinColorSelector.Color = SkinColor.ClosestVoxColor(Profile.Appearance.SkinColor);
+
+ break;
+ }
}
}
diff --git a/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Position.cs b/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Position.cs
index 2ee7e30ec9..24f0e8a1d3 100644
--- a/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Position.cs
+++ b/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Position.cs
@@ -198,6 +198,13 @@ public sealed partial class ReplaySpectatorSystem
if (args.Transform.MapUid != null || args.OldMapId == MapId.Nullspace)
return;
+ if (_spectatorData != null)
+ {
+ // Currently scrubbing/setting the replay tick
+ // the observer will get respawned once the state was applied
+ return;
+ }
+
// The entity being spectated from was moved to null-space.
// This was probably because they were spectating some entity in a client-side replay that left PVS range.
// Simple respawn the ghost.
diff --git a/Content.Client/RoundEnd/RoundEndSummaryUIController.cs b/Content.Client/RoundEnd/RoundEndSummaryUIController.cs
new file mode 100644
index 0000000000..cf824833ef
--- /dev/null
+++ b/Content.Client/RoundEnd/RoundEndSummaryUIController.cs
@@ -0,0 +1,51 @@
+using Content.Client.GameTicking.Managers;
+using Content.Shared.GameTicking;
+using Content.Shared.Input;
+using JetBrains.Annotations;
+using Robust.Client.Input;
+using Robust.Client.UserInterface.Controllers;
+using Robust.Shared.Input.Binding;
+using Robust.Shared.Player;
+
+namespace Content.Client.RoundEnd;
+
+[UsedImplicitly]
+public sealed class RoundEndSummaryUIController : UIController,
+ IOnSystemLoaded
+{
+ [Dependency] private readonly IInputManager _input = default!;
+
+ private RoundEndSummaryWindow? _window;
+
+ private void ToggleScoreboardWindow(ICommonSession? session = null)
+ {
+ if (_window == null)
+ return;
+
+ if (_window.IsOpen)
+ {
+ _window.Close();
+ }
+ else
+ {
+ _window.OpenCenteredRight();
+ _window.MoveToFront();
+ }
+ }
+
+ public void OpenRoundEndSummaryWindow(RoundEndMessageEvent message)
+ {
+ // Don't open duplicate windows (mainly for replays).
+ if (_window?.RoundId == message.RoundId)
+ return;
+
+ _window = new RoundEndSummaryWindow(message.GamemodeTitle, message.RoundEndText,
+ message.RoundDuration, message.RoundId, message.AllPlayersEndInfo, EntityManager);
+ }
+
+ public void OnSystemLoaded(ClientGameTicker system)
+ {
+ _input.SetInputCommand(ContentKeyFunctions.ToggleRoundEndSummaryWindow,
+ InputCmdHandler.FromDelegate(ToggleScoreboardWindow));
+ }
+}
diff --git a/Content.Client/RoundEnd/RoundEndSummaryWindow.cs b/Content.Client/RoundEnd/RoundEndSummaryWindow.cs
index 5b73c77934..9c9f83a427 100644
--- a/Content.Client/RoundEnd/RoundEndSummaryWindow.cs
+++ b/Content.Client/RoundEnd/RoundEndSummaryWindow.cs
@@ -2,7 +2,6 @@ using System.Linq;
using System.Numerics;
using Content.Client.Message;
using Content.Shared.GameTicking;
-using Robust.Client.GameObjects;
using Robust.Client.UserInterface.Controls;
using Robust.Client.UserInterface.CustomControls;
using Robust.Shared.Utility;
diff --git a/Content.Client/Storage/StorageBoundUserInterface.cs b/Content.Client/Storage/StorageBoundUserInterface.cs
index f7fdbb8367..899df30f7f 100644
--- a/Content.Client/Storage/StorageBoundUserInterface.cs
+++ b/Content.Client/Storage/StorageBoundUserInterface.cs
@@ -17,6 +17,14 @@ public sealed class StorageBoundUserInterface : BoundUserInterface
_storage = _entManager.System();
}
+ protected override void Open()
+ {
+ base.Open();
+
+ if (_entManager.TryGetComponent(Owner, out var comp))
+ _storage.OpenStorageWindow((Owner, comp));
+ }
+
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
@@ -25,16 +33,5 @@ public sealed class StorageBoundUserInterface : BoundUserInterface
_storage.CloseStorageWindow(Owner);
}
-
- protected override void ReceiveMessage(BoundUserInterfaceMessage message)
- {
- base.ReceiveMessage(message);
-
- if (message is StorageModifyWindowMessage)
- {
- if (_entManager.TryGetComponent(Owner, out var comp))
- _storage.OpenStorageWindow((Owner, comp));
- }
- }
}
diff --git a/Content.Client/Storage/Systems/StorageSystem.cs b/Content.Client/Storage/Systems/StorageSystem.cs
index 2728bfa9e8..8bf0dcd981 100644
--- a/Content.Client/Storage/Systems/StorageSystem.cs
+++ b/Content.Client/Storage/Systems/StorageSystem.cs
@@ -111,7 +111,7 @@ public sealed class StorageSystem : SharedStorageSystem
if (!Resolve(entity, ref entity.Comp, false))
return;
- if (entity.Comp.OpenInterfaces.GetValueOrDefault(StorageComponent.StorageUiKey.Key) is not { } bui)
+ if (entity.Comp.ClientOpenInterfaces.GetValueOrDefault(StorageComponent.StorageUiKey.Key) is not { } bui)
return;
bui.Close();
diff --git a/Content.Client/Strip/StrippableSystem.cs b/Content.Client/Strip/StrippableSystem.cs
index c5083d2204..23f38e9d51 100644
--- a/Content.Client/Strip/StrippableSystem.cs
+++ b/Content.Client/Strip/StrippableSystem.cs
@@ -35,7 +35,7 @@ public sealed class StrippableSystem : SharedStrippableSystem
if (!TryComp(uid, out UserInterfaceComponent? uiComp))
return;
- foreach (var ui in uiComp.OpenInterfaces.Values)
+ foreach (var ui in uiComp.ClientOpenInterfaces.Values)
{
if (ui is StrippableBoundUserInterface stripUi)
stripUi.DirtyMenu();
diff --git a/Content.Client/UserInterface/Systems/Alerts/Controls/AlertControl.cs b/Content.Client/UserInterface/Systems/Alerts/Controls/AlertControl.cs
index 9423f7288d..af93033a9d 100644
--- a/Content.Client/UserInterface/Systems/Alerts/Controls/AlertControl.cs
+++ b/Content.Client/UserInterface/Systems/Alerts/Controls/AlertControl.cs
@@ -117,8 +117,7 @@ namespace Content.Client.UserInterface.Systems.Alerts.Controls
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
-
- _entityManager.DeleteEntity(_spriteViewEntity);
+ _entityManager.QueueDeleteEntity(_spriteViewEntity);
}
}
diff --git a/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml.cs b/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml.cs
index 189de50407..a1a494c47b 100644
--- a/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml.cs
+++ b/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml.cs
@@ -97,7 +97,8 @@ public sealed partial class AlertsUI : UIWidget
}
else
{
- if (existingAlertControl != null) AlertContainer.Children.Remove(existingAlertControl);
+ if (existingAlertControl != null)
+ AlertContainer.Children.Remove(existingAlertControl);
// this is a new alert + alert key or just a different alert with the same
// key, create the control and add it in the appropriate order
diff --git a/Content.Client/UserInterface/Systems/Hands/HandsUIController.cs b/Content.Client/UserInterface/Systems/Hands/HandsUIController.cs
index 99d7bc77b8..9ee429ba7e 100644
--- a/Content.Client/UserInterface/Systems/Hands/HandsUIController.cs
+++ b/Content.Client/UserInterface/Systems/Hands/HandsUIController.cs
@@ -22,6 +22,7 @@ public sealed class HandsUIController : UIController, IOnStateEntered _handsContainers = new();
private readonly Dictionary _handContainerIndices = new();
@@ -450,15 +451,15 @@ public sealed class HandsUIController : UIController, IOnStateEntered
+ /// Test that a nuke ops gamemode can start after failing to start once.
+ ///
+ [Test]
+ public async Task FailAndStartTest()
+ {
+ await using var pair = await PoolManager.GetServerClient(new PoolSettings
+ {
+ Dirty = true,
+ DummyTicker = false,
+ Connected = true,
+ InLobby = true
+ });
+
+ var server = pair.Server;
+ var client = pair.Client;
+ var entMan = server.EntMan;
+ var ticker = server.System();
+ server.System().Run = true;
+
+ Assert.That(server.CfgMan.GetCVar(CCVars.GridFill), Is.False);
+ Assert.That(server.CfgMan.GetCVar(CCVars.GameLobbyFallbackEnabled), Is.True);
+ Assert.That(server.CfgMan.GetCVar(CCVars.GameLobbyDefaultPreset), Is.EqualTo("secret"));
+ server.CfgMan.SetCVar(CCVars.GridFill, true);
+ server.CfgMan.SetCVar(CCVars.GameLobbyFallbackEnabled, false);
+ server.CfgMan.SetCVar(CCVars.GameLobbyDefaultPreset, "TestPreset");
+
+ // Initially in the lobby
+ Assert.That(ticker.RunLevel, Is.EqualTo(GameRunLevel.PreRoundLobby));
+ Assert.That(client.AttachedEntity, Is.Null);
+ Assert.That(ticker.PlayerGameStatuses[client.User!.Value], Is.EqualTo(PlayerGameStatus.NotReadyToPlay));
+
+ // Try to start nukeops without readying up
+ await pair.WaitCommand("setgamepreset TestPresetTenPlayers");
+ await pair.WaitCommand("startround");
+ await pair.RunTicksSync(10);
+
+ // Game should not have started
+ Assert.That(ticker.RunLevel, Is.EqualTo(GameRunLevel.PreRoundLobby));
+ Assert.That(ticker.PlayerGameStatuses[client.User!.Value], Is.EqualTo(PlayerGameStatus.NotReadyToPlay));
+ Assert.That(!client.EntMan.EntityExists(client.AttachedEntity));
+ var player = pair.Player!.AttachedEntity;
+ Assert.That(!entMan.EntityExists(player));
+
+ // Ready up and start nukeops
+ await pair.WaitClientCommand("toggleready True");
+ Assert.That(ticker.PlayerGameStatuses[client.User!.Value], Is.EqualTo(PlayerGameStatus.ReadyToPlay));
+ await pair.WaitCommand("setgamepreset TestPreset");
+ await pair.WaitCommand("startround");
+ await pair.RunTicksSync(10);
+
+ // Game should have started
+ Assert.That(ticker.RunLevel, Is.EqualTo(GameRunLevel.InRound));
+ Assert.That(ticker.PlayerGameStatuses[client.User!.Value], Is.EqualTo(PlayerGameStatus.JoinedGame));
+ Assert.That(client.EntMan.EntityExists(client.AttachedEntity));
+ player = pair.Player!.AttachedEntity!.Value;
+ Assert.That(entMan.EntityExists(player));
+
+ ticker.SetGamePreset((GamePresetPrototype?)null);
+ server.CfgMan.SetCVar(CCVars.GridFill, false);
+ server.CfgMan.SetCVar(CCVars.GameLobbyFallbackEnabled, true);
+ server.CfgMan.SetCVar(CCVars.GameLobbyDefaultPreset, "secret");
+ server.System().Run = false;
+ await pair.CleanReturnAsync();
+ }
+}
+
+public sealed class TestRuleSystem : EntitySystem
+{
+ public bool Run;
+
+ public override void Initialize()
+ {
+ SubscribeLocalEvent(OnRoundStartAttempt);
+ }
+
+ private void OnRoundStartAttempt(RoundStartAttemptEvent args)
+ {
+ if (!Run)
+ return;
+
+ if (args.Forced || args.Cancelled)
+ return;
+
+ var query = EntityQueryEnumerator();
+ while (query.MoveNext(out _, out _, out var gameRule))
+ {
+ var minPlayers = gameRule.MinPlayers;
+ if (args.Players.Length >= minPlayers)
+ continue;
+
+ args.Cancel();
+ }
+ }
+}
+
+[RegisterComponent]
+public sealed partial class TestRuleComponent : Component;
diff --git a/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs b/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs
index d45290c866..95cf8a06df 100644
--- a/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs
+++ b/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs
@@ -820,7 +820,7 @@ public abstract partial class InteractionTest
return false;
}
- if (!ui.OpenInterfaces.TryGetValue(key, out bui))
+ if (!ui.ClientOpenInterfaces.TryGetValue(key, out bui))
{
if (shouldSucceed)
Assert.Fail($"Entity {SEntMan.ToPrettyString(SEntMan.GetEntity(target.Value))} does not have an open bui with key {key.GetType()}.{key}.");
diff --git a/Content.IntegrationTests/Tests/Power/PowerTest.cs b/Content.IntegrationTests/Tests/Power/PowerTest.cs
index a6af3e6a65..a94e94489c 100644
--- a/Content.IntegrationTests/Tests/Power/PowerTest.cs
+++ b/Content.IntegrationTests/Tests/Power/PowerTest.cs
@@ -143,8 +143,8 @@ namespace Content.IntegrationTests.Tests.Power
anchored: true
- type: UserInterface
interfaces:
- - key: enum.ApcUiKey.Key
- type: ApcBoundUserInterface
+ enum.ApcUiKey.Key:
+ type: ApcBoundUserInterface
- type: AccessReader
access: [['Engineering']]
diff --git a/Content.Server/Access/Systems/AccessOverriderSystem.cs b/Content.Server/Access/Systems/AccessOverriderSystem.cs
index 25f2e4c1b0..bc038fe4ff 100644
--- a/Content.Server/Access/Systems/AccessOverriderSystem.cs
+++ b/Content.Server/Access/Systems/AccessOverriderSystem.cs
@@ -68,16 +68,13 @@ public sealed class AccessOverriderSystem : SharedAccessOverriderSystem
private void OnDoAfter(EntityUid uid, AccessOverriderComponent component, AccessOverriderDoAfterEvent args)
{
- if (!TryComp(args.User, out ActorComponent? actor))
- return;
-
if (args.Handled || args.Cancelled)
return;
if (args.Args.Target != null)
{
component.TargetAccessReaderId = args.Args.Target.Value;
- _userInterface.TryOpen(uid, AccessOverriderUiKey.Key, actor.PlayerSession);
+ _userInterface.OpenUi(uid, AccessOverriderUiKey.Key, args.User);
UpdateUserInterface(uid, component, args);
}
@@ -94,7 +91,7 @@ public sealed class AccessOverriderSystem : SharedAccessOverriderSystem
private void OnWriteToTargetAccessReaderIdMessage(EntityUid uid, AccessOverriderComponent component, WriteToTargetAccessReaderIdMessage args)
{
- if (args.Session.AttachedEntity is not { Valid: true } player)
+ if (args.Actor is not { Valid: true } player)
return;
TryWriteToTargetAccessReaderId(uid, args.AccessList, player, component);
@@ -154,22 +151,19 @@ public sealed class AccessOverriderSystem : SharedAccessOverriderSystem
targetLabel,
targetLabelColor);
- _userInterface.TrySetUiState(uid, AccessOverriderUiKey.Key, newState);
+ _userInterface.SetUiState(uid, AccessOverriderUiKey.Key, newState);
}
private List> ConvertAccessHashSetsToList(List>> accessHashsets)
{
- List> accessList = new List>();
+ var accessList = new List>();
- if (accessHashsets != null && accessHashsets.Any())
+ if (accessHashsets.Count <= 0)
+ return accessList;
+
+ foreach (var hashSet in accessHashsets)
{
- foreach (HashSet> hashSet in accessHashsets)
- {
- foreach (ProtoId hash in hashSet.ToArray())
- {
- accessList.Add(hash);
- }
- }
+ accessList.AddRange(hashSet);
}
return accessList;
diff --git a/Content.Server/Access/Systems/AgentIDCardSystem.cs b/Content.Server/Access/Systems/AgentIDCardSystem.cs
index bd4d3b3f23..d5e9dc357d 100644
--- a/Content.Server/Access/Systems/AgentIDCardSystem.cs
+++ b/Content.Server/Access/Systems/AgentIDCardSystem.cs
@@ -61,14 +61,14 @@ namespace Content.Server.Access.Systems
private void AfterUIOpen(EntityUid uid, AgentIDCardComponent component, AfterActivatableUIOpenEvent args)
{
- if (!_uiSystem.TryGetUi(uid, AgentIDCardUiKey.Key, out var ui))
+ if (!_uiSystem.HasUi(uid, AgentIDCardUiKey.Key))
return;
if (!TryComp(uid, out var idCard))
return;
- var state = new AgentIDCardBoundUserInterfaceState(idCard.FullName ?? "", idCard.JobTitle ?? "", component.Icons);
- _uiSystem.SetUiState(ui, state, args.Session);
+ var state = new AgentIDCardBoundUserInterfaceState(idCard.FullName ?? "", idCard.JobTitle ?? "", idCard.JobIcon ?? "", component.Icons);
+ _uiSystem.SetUiState(uid, AgentIDCardUiKey.Key, state);
}
private void OnJobChanged(EntityUid uid, AgentIDCardComponent comp, AgentIDCardJobChangedMessage args)
@@ -94,7 +94,7 @@ namespace Content.Server.Access.Systems
return;
}
- if (!_prototypeManager.TryIndex(args.JobIcon, out var jobIcon))
+ if (!_prototypeManager.TryIndex(args.JobIconId, out var jobIcon))
{
return;
}
diff --git a/Content.Server/Access/Systems/IdCardConsoleSystem.cs b/Content.Server/Access/Systems/IdCardConsoleSystem.cs
index db8b9d036e..e680b0c6f4 100644
--- a/Content.Server/Access/Systems/IdCardConsoleSystem.cs
+++ b/Content.Server/Access/Systems/IdCardConsoleSystem.cs
@@ -41,7 +41,7 @@ public sealed class IdCardConsoleSystem : SharedIdCardConsoleSystem
private void OnWriteToTargetIdMessage(EntityUid uid, IdCardConsoleComponent component, WriteToTargetIdMessage args)
{
- if (args.Session.AttachedEntity is not { Valid: true } player)
+ if (args.Actor is not { Valid: true } player)
return;
TryWriteToTargetId(uid, args.FullName, args.JobTitle, args.AccessList, args.JobPrototype, player, component);
@@ -104,7 +104,7 @@ public sealed class IdCardConsoleSystem : SharedIdCardConsoleSystem
Name(targetId));
}
- _userInterface.TrySetUiState(uid, IdCardConsoleUiKey.Key, newState);
+ _userInterface.SetUiState(uid, IdCardConsoleUiKey.Key, newState);
}
///
diff --git a/Content.Server/Access/Systems/IdCardSystem.cs b/Content.Server/Access/Systems/IdCardSystem.cs
index 6b3d8db595..9cd9976cea 100644
--- a/Content.Server/Access/Systems/IdCardSystem.cs
+++ b/Content.Server/Access/Systems/IdCardSystem.cs
@@ -7,8 +7,6 @@ using Content.Shared.Access.Components;
using Content.Shared.Access.Systems;
using Content.Shared.Database;
using Content.Shared.Popups;
-using Content.Shared.Roles;
-using Content.Shared.StatusIcon;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
@@ -20,20 +18,13 @@ public sealed class IdCardSystem : SharedIdCardSystem
[Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
- [Dependency] private readonly MetaDataSystem _metaSystem = default!;
public override void Initialize()
{
base.Initialize();
- SubscribeLocalEvent(OnMapInit);
SubscribeLocalEvent(OnMicrowaved);
}
- private void OnMapInit(EntityUid uid, IdCardComponent id, MapInitEvent args)
- {
- UpdateEntityName(uid, id);
- }
-
private void OnMicrowaved(EntityUid uid, IdCardComponent component, BeingMicrowavedEvent args)
{
if (TryComp(uid, out var access))
@@ -81,143 +72,4 @@ public sealed class IdCardSystem : SharedIdCardSystem
$"{ToPrettyString(args.Microwave)} added {random.ID} access to {ToPrettyString(uid):entity}");
}
}
-
- ///
- /// Attempts to change the job title of a card.
- /// Returns true/false.
- ///
- ///
- /// If provided with a player's EntityUid to the player parameter, adds the change to the admin logs.
- ///
- public bool TryChangeJobTitle(EntityUid uid, string? jobTitle, IdCardComponent? id = null, EntityUid? player = null)
- {
- if (!Resolve(uid, ref id))
- return false;
-
- if (!string.IsNullOrWhiteSpace(jobTitle))
- {
- jobTitle = jobTitle.Trim();
-
- if (jobTitle.Length > IdCardConsoleComponent.MaxJobTitleLength)
- jobTitle = jobTitle[..IdCardConsoleComponent.MaxJobTitleLength];
- }
- else
- {
- jobTitle = null;
- }
-
- if (id.JobTitle == jobTitle)
- return true;
- id.JobTitle = jobTitle;
- Dirty(uid, id);
- UpdateEntityName(uid, id);
-
- if (player != null)
- {
- _adminLogger.Add(LogType.Identity, LogImpact.Low,
- $"{ToPrettyString(player.Value):player} has changed the job title of {ToPrettyString(uid):entity} to {jobTitle} ");
- }
- return true;
- }
-
- public bool TryChangeJobIcon(EntityUid uid, StatusIconPrototype jobIcon, IdCardComponent? id = null, EntityUid? player = null)
- {
- if (!Resolve(uid, ref id))
- {
- return false;
- }
-
- if (id.JobIcon == jobIcon.ID)
- {
- return true;
- }
-
- id.JobIcon = jobIcon.ID;
- Dirty(uid, id);
-
- if (player != null)
- {
- _adminLogger.Add(LogType.Identity, LogImpact.Low,
- $"{ToPrettyString(player.Value):player} has changed the job icon of {ToPrettyString(uid):entity} to {jobIcon} ");
- }
-
- return true;
- }
-
- public bool TryChangeJobDepartment(EntityUid uid, JobPrototype job, IdCardComponent? id = null)
- {
- if (!Resolve(uid, ref id))
- return false;
-
- id.JobDepartments.Clear();
- foreach (var department in _prototypeManager.EnumeratePrototypes())
- {
- if (department.Roles.Contains(job.ID))
- id.JobDepartments.Add("department-" + department.ID);
- }
-
- Dirty(uid, id);
-
- return true;
- }
-
- ///
- /// Attempts to change the full name of a card.
- /// Returns true/false.
- ///
- ///
- /// If provided with a player's EntityUid to the player parameter, adds the change to the admin logs.
- ///
- public bool TryChangeFullName(EntityUid uid, string? fullName, IdCardComponent? id = null, EntityUid? player = null)
- {
- if (!Resolve(uid, ref id))
- return false;
-
- if (!string.IsNullOrWhiteSpace(fullName))
- {
- fullName = fullName.Trim();
- if (fullName.Length > IdCardConsoleComponent.MaxFullNameLength)
- fullName = fullName[..IdCardConsoleComponent.MaxFullNameLength];
- }
- else
- {
- fullName = null;
- }
-
- if (id.FullName == fullName)
- return true;
- id.FullName = fullName;
- Dirty(uid, id);
- UpdateEntityName(uid, id);
-
- if (player != null)
- {
- _adminLogger.Add(LogType.Identity, LogImpact.Low,
- $"{ToPrettyString(player.Value):player} has changed the name of {ToPrettyString(uid):entity} to {fullName} ");
- }
- return true;
- }
-
- ///
- /// Changes the name of the id's owner.
- ///
- ///
- /// If either or is empty, it's replaced by placeholders.
- /// If both are empty, the original entity's name is restored.
- ///
- private void UpdateEntityName(EntityUid uid, IdCardComponent? id = null)
- {
- if (!Resolve(uid, ref id))
- return;
-
- var jobSuffix = string.IsNullOrWhiteSpace(id.JobTitle) ? string.Empty : $" ({id.JobTitle})";
-
- var val = string.IsNullOrWhiteSpace(id.FullName)
- ? Loc.GetString("access-id-card-component-owner-name-job-title-text",
- ("jobSuffix", jobSuffix))
- : Loc.GetString("access-id-card-component-owner-full-name-job-title-text",
- ("fullName", id.FullName),
- ("jobSuffix", jobSuffix));
- _metaSystem.SetEntityName(uid, val);
- }
}
diff --git a/Content.Server/Administration/Components/HeadstandComponent.cs b/Content.Server/Administration/Components/HeadstandComponent.cs
index 8472b5ad36..2ab097fad4 100644
--- a/Content.Server/Administration/Components/HeadstandComponent.cs
+++ b/Content.Server/Administration/Components/HeadstandComponent.cs
@@ -3,7 +3,7 @@ using Robust.Shared.GameStates;
namespace Content.Server.Administration.Components;
-[RegisterComponent, NetworkedComponent]
+[RegisterComponent]
public sealed partial class HeadstandComponent : SharedHeadstandComponent
{
diff --git a/Content.Server/Administration/Components/KillSignComponent.cs b/Content.Server/Administration/Components/KillSignComponent.cs
index e29ce202dd..11479c32fc 100644
--- a/Content.Server/Administration/Components/KillSignComponent.cs
+++ b/Content.Server/Administration/Components/KillSignComponent.cs
@@ -3,6 +3,5 @@ using Robust.Shared.GameStates;
namespace Content.Server.Administration.Components;
-[NetworkedComponent, RegisterComponent]
-public sealed partial class KillSignComponent : SharedKillSignComponent
-{ }
+[RegisterComponent]
+public sealed partial class KillSignComponent : SharedKillSignComponent;
diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.cs b/Content.Server/Administration/Systems/AdminVerbSystem.cs
index f5b237b449..5bb75b4c99 100644
--- a/Content.Server/Administration/Systems/AdminVerbSystem.cs
+++ b/Content.Server/Administration/Systems/AdminVerbSystem.cs
@@ -463,7 +463,7 @@ namespace Content.Server.Administration.Systems
Text = Loc.GetString("configure-verb-get-data-text"),
Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/settings.svg.192dpi.png")),
Category = VerbCategory.Debug,
- Act = () => _uiSystem.TryOpen(args.Target, ConfigurationUiKey.Key, actor.PlayerSession)
+ Act = () => _uiSystem.OpenUi(args.Target, ConfigurationUiKey.Key, actor.PlayerSession)
};
args.Verbs.Add(verb);
}
diff --git a/Content.Server/Advertise/EntitySystems/SpeakOnUIClosedSystem.cs b/Content.Server/Advertise/EntitySystems/SpeakOnUIClosedSystem.cs
index 048f59b8d3..232b4b7eda 100644
--- a/Content.Server/Advertise/EntitySystems/SpeakOnUIClosedSystem.cs
+++ b/Content.Server/Advertise/EntitySystems/SpeakOnUIClosedSystem.cs
@@ -4,6 +4,7 @@ using Content.Server.UserInterface;
using Content.Shared.Advertise;
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
+using ActivatableUIComponent = Content.Shared.UserInterface.ActivatableUIComponent;
namespace Content.Server.Advertise;
diff --git a/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs b/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs
index 5bf78bde85..1b323d6643 100644
--- a/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs
+++ b/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs
@@ -129,11 +129,11 @@ public sealed class AmeControllerSystem : EntitySystem
if (!Resolve(uid, ref controller))
return;
- if (!_userInterfaceSystem.TryGetUi(uid, AmeControllerUiKey.Key, out var bui))
+ if (!_userInterfaceSystem.HasUi(uid, AmeControllerUiKey.Key))
return;
var state = GetUiState(uid, controller);
- _userInterfaceSystem.SetUiState(bui, state);
+ _userInterfaceSystem.SetUiState(uid, AmeControllerUiKey.Key, state);
controller.NextUIUpdate = _gameTiming.CurTime + controller.UpdateUIPeriod;
}
@@ -324,7 +324,7 @@ public sealed class AmeControllerSystem : EntitySystem
private void OnUiButtonPressed(EntityUid uid, AmeControllerComponent comp, UiButtonPressedMessage msg)
{
- var user = msg.Session.AttachedEntity;
+ var user = msg.Actor;
if (!Exists(user))
return;
@@ -334,7 +334,7 @@ public sealed class AmeControllerSystem : EntitySystem
_ => true,
};
- if (!PlayerCanUseController(uid, user!.Value, needsPower, comp))
+ if (!PlayerCanUseController(uid, user, needsPower, comp))
return;
_audioSystem.PlayPvs(comp.ClickSound, uid, AudioParams.Default.WithVolume(-2f));
diff --git a/Content.Server/Anomaly/AnomalySystem.Generator.cs b/Content.Server/Anomaly/AnomalySystem.Generator.cs
index 7aa1a8935f..056a985cbe 100644
--- a/Content.Server/Anomaly/AnomalySystem.Generator.cs
+++ b/Content.Server/Anomaly/AnomalySystem.Generator.cs
@@ -61,7 +61,7 @@ public sealed partial class AnomalySystem
var materialAmount = _material.GetMaterialAmount(uid, component.RequiredMaterial);
var state = new AnomalyGeneratorUserInterfaceState(component.CooldownEndTime, materialAmount, component.MaterialPerAnomaly);
- _ui.TrySetUiState(uid, AnomalyGeneratorUiKey.Key, state);
+ _ui.SetUiState(uid, AnomalyGeneratorUiKey.Key, state);
}
public void TryGeneratorCreateAnomaly(EntityUid uid, AnomalyGeneratorComponent? component = null)
diff --git a/Content.Server/Anomaly/AnomalySystem.Scanner.cs b/Content.Server/Anomaly/AnomalySystem.Scanner.cs
index bce508903d..39c0d08b55 100644
--- a/Content.Server/Anomaly/AnomalySystem.Scanner.cs
+++ b/Content.Server/Anomaly/AnomalySystem.Scanner.cs
@@ -31,7 +31,8 @@ public sealed partial class AnomalySystem
{
if (component.ScannedAnomaly != args.Anomaly)
continue;
- _ui.TryCloseAll(uid, AnomalyScannerUiKey.Key);
+
+ _ui.CloseUi(uid, AnomalyScannerUiKey.Key);
}
}
@@ -108,7 +109,7 @@ public sealed partial class AnomalySystem
Popup.PopupEntity(Loc.GetString("anomaly-scanner-component-scan-complete"), uid);
UpdateScannerWithNewAnomaly(uid, args.Args.Target.Value, component);
- if (TryComp(args.Args.User, out var actor)) _ui.TryOpen(uid, AnomalyScannerUiKey.Key, actor.PlayerSession);
+ _ui.OpenUi(uid, AnomalyScannerUiKey.Key, args.User);
args.Handled = true;
}
@@ -123,7 +124,7 @@ public sealed partial class AnomalySystem
nextPulse = anomalyComponent.NextPulseTime;
var state = new AnomalyScannerUserInterfaceState(GetScannerMessage(component), nextPulse);
- _ui.TrySetUiState(uid, AnomalyScannerUiKey.Key, state);
+ _ui.SetUiState(uid, AnomalyScannerUiKey.Key, state);
}
public void UpdateScannerWithNewAnomaly(EntityUid scanner, EntityUid anomaly, AnomalyScannerComponent? scannerComp = null, AnomalyComponent? anomalyComp = null)
diff --git a/Content.Server/Antag/AntagSelectionPlayerPool.cs b/Content.Server/Antag/AntagSelectionPlayerPool.cs
index 054292dcf9..87873e96d1 100644
--- a/Content.Server/Antag/AntagSelectionPlayerPool.cs
+++ b/Content.Server/Antag/AntagSelectionPlayerPool.cs
@@ -5,15 +5,13 @@ using Robust.Shared.Random;
namespace Content.Server.Antag;
-public sealed class AntagSelectionPlayerPool(params List[] sessions)
+public sealed class AntagSelectionPlayerPool (List> orderedPools)
{
- private readonly List> _orderedPools = sessions.ToList();
-
public bool TryPickAndTake(IRobustRandom random, [NotNullWhen(true)] out ICommonSession? session)
{
session = null;
- foreach (var pool in _orderedPools)
+ foreach (var pool in orderedPools)
{
if (pool.Count == 0)
continue;
@@ -25,5 +23,5 @@ public sealed class AntagSelectionPlayerPool(params List[] sessi
return session != null;
}
- public int Count => _orderedPools.Sum(p => p.Count);
+ public int Count => orderedPools.Sum(p => p.Count);
}
diff --git a/Content.Server/Antag/AntagSelectionSystem.cs b/Content.Server/Antag/AntagSelectionSystem.cs
index eb68e077b1..6bfb7394f5 100644
--- a/Content.Server/Antag/AntagSelectionSystem.cs
+++ b/Content.Server/Antag/AntagSelectionSystem.cs
@@ -35,7 +35,6 @@ public sealed partial class AntagSelectionSystem : GameRuleSystem
+ /// Tries to makes a given player into the specified antagonist.
+ ///
+ public bool TryMakeAntag(Entity ent, ICommonSession? session, AntagSelectionDefinition def, bool ignoreSpawner = false)
+ {
+ if (!IsSessionValid(ent, session, def) ||
+ !IsEntityValid(session?.AttachedEntity, def))
+ {
+ return false;
+ }
+
+ MakeAntag(ent, session, def, ignoreSpawner);
+ return true;
+ }
+
///
/// Makes a given player into the specified antagonist.
///
@@ -262,7 +277,6 @@ public sealed partial class AntagSelectionSystem : GameRuleSystem
public AntagSelectionPlayerPool GetPlayerPool(Entity ent, List sessions, AntagSelectionDefinition def)
{
- var primaryList = new List();
- var secondaryList = new List();
- var fallbackList = new List();
- var rawList = new List();
+ var preferredList = new List();
+ var secondBestList = new List();
+ var unwantedList = new List();
+ var invalidList = new List();
foreach (var session in sessions)
{
if (!IsSessionValid(ent, session, def) ||
!IsEntityValid(session.AttachedEntity, def))
{
- rawList.Add(session);
+ invalidList.Add(session);
continue;
}
var pref = (HumanoidCharacterProfile) _pref.GetPreferences(session.UserId).SelectedCharacter;
- if (def.PrefRoles.Count == 0 || pref.AntagPreferences.Any(p => def.PrefRoles.Contains(p)))
+ if (def.PrefRoles.Count != 0 && pref.AntagPreferences.Any(p => def.PrefRoles.Contains(p)))
{
- primaryList.Add(session);
+ preferredList.Add(session);
}
- else if (def.PrefRoles.Count == 0 || pref.AntagPreferences.Any(p => def.FallbackRoles.Contains(p)))
+ else if (def.FallbackRoles.Count != 0 && pref.AntagPreferences.Any(p => def.FallbackRoles.Contains(p)))
{
- secondaryList.Add(session);
+ secondBestList.Add(session);
}
else
{
- fallbackList.Add(session);
+ unwantedList.Add(session);
}
}
- return new AntagSelectionPlayerPool(primaryList, secondaryList, fallbackList, rawList);
+ return new AntagSelectionPlayerPool(new() { preferredList, secondBestList, unwantedList, invalidList });
}
///
/// Checks if a given session is valid for an antagonist.
///
- public bool IsSessionValid(Entity ent, ICommonSession session, AntagSelectionDefinition def, EntityUid? mind = null)
+ public bool IsSessionValid(Entity ent, ICommonSession? session, AntagSelectionDefinition def, EntityUid? mind = null)
{
+ if (session == null)
+ return true;
+
mind ??= session.GetMind();
if (session.Status is SessionStatus.Disconnected or SessionStatus.Zombie)
diff --git a/Content.Server/Arcade/BlockGame/BlockGame.Ui.cs b/Content.Server/Arcade/BlockGame/BlockGame.Ui.cs
index ef69600783..cd22f1f6d3 100644
--- a/Content.Server/Arcade/BlockGame/BlockGame.Ui.cs
+++ b/Content.Server/Arcade/BlockGame/BlockGame.Ui.cs
@@ -157,39 +157,37 @@ public sealed partial class BlockGame
/// The message to broadcase to all players/spectators.
private void SendMessage(BoundUserInterfaceMessage message)
{
- if (_uiSystem.TryGetUi(_owner, BlockGameUiKey.Key, out var bui))
- _uiSystem.SendUiMessage(bui, message);
+ _uiSystem.ServerSendUiMessage(_entityManager.GetEntity(message.Entity), BlockGameUiKey.Key, message);
}
///
/// Handles sending a message to a specific player/spectator.
///
/// The message to send to a specific player/spectator.
- /// The target recipient.
- private void SendMessage(BoundUserInterfaceMessage message, ICommonSession session)
+ /// The target recipient.
+ private void SendMessage(BoundUserInterfaceMessage message, EntityUid actor)
{
- if (_uiSystem.TryGetUi(_owner, BlockGameUiKey.Key, out var bui))
- _uiSystem.TrySendUiMessage(bui, message, session);
+ _uiSystem.ServerSendUiMessage(_entityManager.GetEntity(message.Entity), BlockGameUiKey.Key, message, actor);
}
///
/// Handles sending the current state of the game to a player that has just opened the UI.
///
- /// The target recipient.
- public void UpdateNewPlayerUI(ICommonSession session)
+ /// The target recipient.
+ public void UpdateNewPlayerUI(EntityUid actor)
{
if (_gameOver)
{
- SendMessage(new BlockGameMessages.BlockGameGameOverScreenMessage(Points, _highScorePlacement?.LocalPlacement, _highScorePlacement?.GlobalPlacement), session);
+ SendMessage(new BlockGameMessages.BlockGameGameOverScreenMessage(Points, _highScorePlacement?.LocalPlacement, _highScorePlacement?.GlobalPlacement), actor);
return;
}
if (Paused)
- SendMessage(new BlockGameMessages.BlockGameSetScreenMessage(BlockGameMessages.BlockGameScreen.Pause, Started), session);
+ SendMessage(new BlockGameMessages.BlockGameSetScreenMessage(BlockGameMessages.BlockGameScreen.Pause, Started), actor);
else
- SendMessage(new BlockGameMessages.BlockGameSetScreenMessage(BlockGameMessages.BlockGameScreen.Game, Started), session);
+ SendMessage(new BlockGameMessages.BlockGameSetScreenMessage(BlockGameMessages.BlockGameScreen.Game, Started), actor);
- FullUpdate(session);
+ FullUpdate(actor);
}
///
@@ -209,14 +207,14 @@ public sealed partial class BlockGame
/// Handles broadcasting the full player-visible game state to a specific player/spectator.
///
/// The target recipient.
- private void FullUpdate(ICommonSession session)
+ private void FullUpdate(EntityUid actor)
{
- UpdateFieldUI(session);
- SendNextPieceUpdate(session);
- SendHoldPieceUpdate(session);
- SendLevelUpdate(session);
- SendPointsUpdate(session);
- SendHighscoreUpdate(session);
+ UpdateFieldUI(actor);
+ SendNextPieceUpdate(actor);
+ SendHoldPieceUpdate(actor);
+ SendLevelUpdate(actor);
+ SendPointsUpdate(actor);
+ SendHighscoreUpdate(actor);
}
///
@@ -234,14 +232,13 @@ public sealed partial class BlockGame
///
/// Handles broadcasting the current location of all of the blocks in the playfield + the active piece to a specific player/spectator.
///
- /// The target recipient.
- public void UpdateFieldUI(ICommonSession session)
+ public void UpdateFieldUI(EntityUid actor)
{
if (!Started)
return;
var computedField = ComputeField();
- SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(computedField.ToArray(), BlockGameMessages.BlockGameVisualType.GameField), session);
+ SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(computedField.ToArray(), BlockGameMessages.BlockGameVisualType.GameField), actor);
}
///
@@ -282,10 +279,9 @@ public sealed partial class BlockGame
///
/// Broadcasts the state of the next queued piece to a specific viewer.
///
- /// The target recipient.
- private void SendNextPieceUpdate(ICommonSession session)
+ private void SendNextPieceUpdate(EntityUid actor)
{
- SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(NextPiece.BlocksForPreview(), BlockGameMessages.BlockGameVisualType.NextBlock), session);
+ SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(NextPiece.BlocksForPreview(), BlockGameMessages.BlockGameVisualType.NextBlock), actor);
}
///
@@ -302,13 +298,12 @@ public sealed partial class BlockGame
///
/// Broadcasts the state of the currently held piece to a specific viewer.
///
- /// The target recipient.
- private void SendHoldPieceUpdate(ICommonSession session)
+ private void SendHoldPieceUpdate(EntityUid actor)
{
if (HeldPiece.HasValue)
- SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(HeldPiece.Value.BlocksForPreview(), BlockGameMessages.BlockGameVisualType.HoldBlock), session);
+ SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(HeldPiece.Value.BlocksForPreview(), BlockGameMessages.BlockGameVisualType.HoldBlock), actor);
else
- SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(Array.Empty(), BlockGameMessages.BlockGameVisualType.HoldBlock), session);
+ SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(Array.Empty(), BlockGameMessages.BlockGameVisualType.HoldBlock), actor);
}
///
@@ -322,10 +317,9 @@ public sealed partial class BlockGame
///
/// Broadcasts the current game level to a specific viewer.
///
- /// The target recipient.
- private void SendLevelUpdate(ICommonSession session)
+ private void SendLevelUpdate(EntityUid actor)
{
- SendMessage(new BlockGameMessages.BlockGameLevelUpdateMessage(Level), session);
+ SendMessage(new BlockGameMessages.BlockGameLevelUpdateMessage(Level), actor);
}
///
@@ -339,10 +333,9 @@ public sealed partial class BlockGame
///
/// Broadcasts the current game score to a specific viewer.
///
- /// The target recipient.
- private void SendPointsUpdate(ICommonSession session)
+ private void SendPointsUpdate(EntityUid actor)
{
- SendMessage(new BlockGameMessages.BlockGameScoreUpdateMessage(Points), session);
+ SendMessage(new BlockGameMessages.BlockGameScoreUpdateMessage(Points), actor);
}
///
@@ -356,9 +349,8 @@ public sealed partial class BlockGame
///
/// Broadcasts the current game high score positions to a specific viewer.
///
- /// The target recipient.
- private void SendHighscoreUpdate(ICommonSession session)
+ private void SendHighscoreUpdate(EntityUid actor)
{
- SendMessage(new BlockGameMessages.BlockGameHighScoreUpdateMessage(_arcadeSystem.GetLocalHighscores(), _arcadeSystem.GetGlobalHighscores()), session);
+ SendMessage(new BlockGameMessages.BlockGameHighScoreUpdateMessage(_arcadeSystem.GetLocalHighscores(), _arcadeSystem.GetGlobalHighscores()), actor);
}
}
diff --git a/Content.Server/Arcade/BlockGame/BlockGame.cs b/Content.Server/Arcade/BlockGame/BlockGame.cs
index 3af1828d56..82063b6443 100644
--- a/Content.Server/Arcade/BlockGame/BlockGame.cs
+++ b/Content.Server/Arcade/BlockGame/BlockGame.cs
@@ -9,8 +9,8 @@ public sealed partial class BlockGame
{
[Dependency] private readonly IEntityManager _entityManager = default!;
[Dependency] private readonly IRobustRandom _random = default!;
- private readonly ArcadeSystem _arcadeSystem = default!;
- private readonly UserInterfaceSystem _uiSystem = default!;
+ private readonly ArcadeSystem _arcadeSystem;
+ private readonly UserInterfaceSystem _uiSystem;
///
/// What entity is currently hosting this game of NT-BG.
@@ -78,7 +78,7 @@ public sealed partial class BlockGame
_gameOver = true;
if (_entityManager.TryGetComponent(_owner, out var cabinet)
- && _entityManager.TryGetComponent(cabinet.Player?.AttachedEntity, out var meta))
+ && _entityManager.TryGetComponent(cabinet.Player, out var meta))
{
_highScorePlacement = _arcadeSystem.RegisterHighScore(meta.EntityName, Points);
SendHighscoreUpdate();
diff --git a/Content.Server/Arcade/BlockGame/BlockGameArcadeComponent.cs b/Content.Server/Arcade/BlockGame/BlockGameArcadeComponent.cs
index 5613d91544..75952b0a33 100644
--- a/Content.Server/Arcade/BlockGame/BlockGameArcadeComponent.cs
+++ b/Content.Server/Arcade/BlockGame/BlockGameArcadeComponent.cs
@@ -13,10 +13,10 @@ public sealed partial class BlockGameArcadeComponent : Component
///
/// The player currently playing the active session of NT-BG.
///
- public ICommonSession? Player = null;
+ public EntityUid? Player = null;
///
/// The players currently viewing (but not playing) the active session of NT-BG.
///
- public readonly List Spectators = new();
+ public readonly List Spectators = new();
}
diff --git a/Content.Server/Arcade/BlockGame/BlockGameArcadeSystem.cs b/Content.Server/Arcade/BlockGame/BlockGameArcadeSystem.cs
index ad65c5cca6..561cad8d7e 100644
--- a/Content.Server/Arcade/BlockGame/BlockGameArcadeSystem.cs
+++ b/Content.Server/Arcade/BlockGame/BlockGameArcadeSystem.cs
@@ -37,14 +37,12 @@ public sealed class BlockGameArcadeSystem : EntitySystem
}
}
- private void UpdatePlayerStatus(EntityUid uid, ICommonSession session, PlayerBoundUserInterface? bui = null, BlockGameArcadeComponent? blockGame = null)
+ private void UpdatePlayerStatus(EntityUid uid, EntityUid actor, BlockGameArcadeComponent? blockGame = null)
{
if (!Resolve(uid, ref blockGame))
return;
- if (bui == null && !_uiSystem.TryGetUi(uid, BlockGameUiKey.Key, out bui))
- return;
- _uiSystem.TrySendUiMessage(bui, new BlockGameMessages.BlockGameUserStatusMessage(blockGame.Player == session), session);
+ _uiSystem.ServerSendUiMessage(uid, BlockGameUiKey.Key, new BlockGameMessages.BlockGameUserStatusMessage(blockGame.Player == actor), actor);
}
private void OnComponentInit(EntityUid uid, BlockGameArcadeComponent component, ComponentInit args)
@@ -54,33 +52,21 @@ public sealed class BlockGameArcadeSystem : EntitySystem
private void OnAfterUIOpen(EntityUid uid, BlockGameArcadeComponent component, AfterActivatableUIOpenEvent args)
{
- if (!TryComp(args.User, out var actor))
- return;
- if (!_uiSystem.TryGetUi(uid, BlockGameUiKey.Key, out var bui))
- return;
-
- var session = actor.PlayerSession;
- if (!bui.SubscribedSessions.Contains(session))
- return;
-
if (component.Player == null)
- component.Player = session;
+ component.Player = args.Actor;
else
- component.Spectators.Add(session);
+ component.Spectators.Add(args.Actor);
- UpdatePlayerStatus(uid, session, bui, component);
- component.Game?.UpdateNewPlayerUI(session);
+ UpdatePlayerStatus(uid, args.Actor, component);
+ component.Game?.UpdateNewPlayerUI(args.Actor);
}
private void OnAfterUiClose(EntityUid uid, BlockGameArcadeComponent component, BoundUIClosedEvent args)
{
- if (args.Session is not { } session)
- return;
-
- if (component.Player != session)
+ if (component.Player != args.Actor)
{
- component.Spectators.Remove(session);
- UpdatePlayerStatus(uid, session, blockGame: component);
+ component.Spectators.Remove(args.Actor);
+ UpdatePlayerStatus(uid, args.Actor, blockGame: component);
return;
}
@@ -88,11 +74,11 @@ public sealed class BlockGameArcadeSystem : EntitySystem
if (component.Spectators.Count > 0)
{
component.Player = component.Spectators[0];
- component.Spectators.Remove(component.Player);
- UpdatePlayerStatus(uid, component.Player, blockGame: component);
+ component.Spectators.Remove(component.Player.Value);
+ UpdatePlayerStatus(uid, component.Player.Value, blockGame: component);
}
- UpdatePlayerStatus(uid, temp, blockGame: component);
+ UpdatePlayerStatus(uid, temp.Value, blockGame: component);
}
private void OnBlockPowerChanged(EntityUid uid, BlockGameArcadeComponent component, ref PowerChangedEvent args)
@@ -100,8 +86,7 @@ public sealed class BlockGameArcadeSystem : EntitySystem
if (args.Powered)
return;
- if (_uiSystem.TryGetUi(uid, BlockGameUiKey.Key, out var bui))
- _uiSystem.CloseAll(bui);
+ _uiSystem.CloseUi(uid, BlockGameUiKey.Key);
component.Player = null;
component.Spectators.Clear();
}
@@ -112,7 +97,7 @@ public sealed class BlockGameArcadeSystem : EntitySystem
return;
if (!BlockGameUiKey.Key.Equals(msg.UiKey))
return;
- if (msg.Session != component.Player)
+ if (msg.Actor != component.Player)
return;
if (msg.PlayerAction == BlockGamePlayerAction.NewGame)
diff --git a/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs b/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs
index f60d88ebf7..f7758f11f1 100644
--- a/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs
+++ b/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs
@@ -90,12 +90,10 @@ public sealed partial class SpaceVillainArcadeSystem : EntitySystem
_audioSystem.PlayPvs(component.NewGameSound, uid, AudioParams.Default.WithVolume(-4f));
component.Game = new SpaceVillainGame(uid, component, this);
- if (_uiSystem.TryGetUi(uid, SpaceVillainArcadeUiKey.Key, out var bui))
- _uiSystem.SendUiMessage(bui, component.Game.GenerateMetaDataMessage());
+ _uiSystem.ServerSendUiMessage(uid, SpaceVillainArcadeUiKey.Key, component.Game.GenerateMetaDataMessage());
break;
case PlayerAction.RequestData:
- if (_uiSystem.TryGetUi(uid, SpaceVillainArcadeUiKey.Key, out bui))
- _uiSystem.SendUiMessage(bui, component.Game.GenerateMetaDataMessage());
+ _uiSystem.ServerSendUiMessage(uid, SpaceVillainArcadeUiKey.Key, component.Game.GenerateMetaDataMessage());
break;
}
}
@@ -110,7 +108,6 @@ public sealed partial class SpaceVillainArcadeSystem : EntitySystem
if (TryComp(uid, out var power) && power.Powered)
return;
- if (_uiSystem.TryGetUi(uid, SpaceVillainArcadeUiKey.Key, out var bui))
- _uiSystem.CloseAll(bui);
+ _uiSystem.CloseUi(uid, SpaceVillainArcadeUiKey.Key);
}
}
diff --git a/Content.Server/Arcade/SpaceVillainGame/SpaceVillainGame.Ui.cs b/Content.Server/Arcade/SpaceVillainGame/SpaceVillainGame.Ui.cs
index 890e9888a7..ebcfb8e3f6 100644
--- a/Content.Server/Arcade/SpaceVillainGame/SpaceVillainGame.Ui.cs
+++ b/Content.Server/Arcade/SpaceVillainGame/SpaceVillainGame.Ui.cs
@@ -9,8 +9,7 @@ public sealed partial class SpaceVillainGame
///
private void UpdateUi(EntityUid uid, bool metadata = false)
{
- if (_uiSystem.TryGetUi(uid, SpaceVillainArcadeUiKey.Key, out var bui))
- _uiSystem.SendUiMessage(bui, metadata ? GenerateMetaDataMessage() : GenerateUpdateMessage());
+ _uiSystem.ServerSendUiMessage(uid, SpaceVillainArcadeUiKey.Key, metadata ? GenerateMetaDataMessage() : GenerateUpdateMessage());
}
private void UpdateUi(EntityUid uid, string message1, string message2, bool metadata = false)
diff --git a/Content.Server/Atmos/EntitySystems/GasAnalyzerSystem.cs b/Content.Server/Atmos/EntitySystems/GasAnalyzerSystem.cs
index 1f5ca80935..15e1dde4ec 100644
--- a/Content.Server/Atmos/EntitySystems/GasAnalyzerSystem.cs
+++ b/Content.Server/Atmos/EntitySystems/GasAnalyzerSystem.cs
@@ -118,8 +118,7 @@ namespace Content.Server.Atmos.EntitySystems
if (!Resolve(uid, ref component))
return;
- if (user != null && TryComp(user, out var actor))
- _userInterface.TryClose(uid, GasAnalyzerUiKey.Key, actor.PlayerSession);
+ _userInterface.CloseUi(uid, GasAnalyzerUiKey.Key, user);
component.Enabled = false;
Dirty(uid, component);
@@ -132,8 +131,6 @@ namespace Content.Server.Atmos.EntitySystems
///
private void OnDisabledMessage(EntityUid uid, GasAnalyzerComponent component, GasAnalyzerDisableMessage message)
{
- if (message.Session.AttachedEntity is not { Valid: true })
- return;
DisableAnalyzer(uid, component);
}
@@ -142,10 +139,7 @@ namespace Content.Server.Atmos.EntitySystems
if (!Resolve(uid, ref component, false))
return;
- if (!TryComp(user, out var actor))
- return;
-
- _userInterface.TryOpen(uid, GasAnalyzerUiKey.Key, actor.PlayerSession);
+ _userInterface.OpenUi(uid, GasAnalyzerUiKey.Key, user);
}
///
@@ -242,7 +236,7 @@ namespace Content.Server.Atmos.EntitySystems
if (gasMixList.Count == 0)
return false;
- _userInterface.TrySendUiMessage(uid, GasAnalyzerUiKey.Key,
+ _userInterface.ServerSendUiMessage(uid, GasAnalyzerUiKey.Key,
new GasAnalyzerUserMessage(gasMixList.ToArray(),
component.Target != null ? Name(component.Target.Value) : string.Empty,
GetNetEntity(component.Target) ?? NetEntity.Invalid,
diff --git a/Content.Server/Atmos/EntitySystems/GasTankSystem.cs b/Content.Server/Atmos/EntitySystems/GasTankSystem.cs
index dd84756e45..07594820fc 100644
--- a/Content.Server/Atmos/EntitySystems/GasTankSystem.cs
+++ b/Content.Server/Atmos/EntitySystems/GasTankSystem.cs
@@ -75,7 +75,7 @@ namespace Content.Server.Atmos.EntitySystems
public void UpdateUserInterface(Entity ent, bool initialUpdate = false)
{
var (owner, component) = ent;
- _ui.TrySetUiState(owner, SharedGasTankUiKey.Key,
+ _ui.SetUiState(owner, SharedGasTankUiKey.Key,
new GasTankBoundUserInterfaceState
{
TankPressure = component.Air?.Pressure ?? 0,
diff --git a/Content.Server/Atmos/Monitor/Components/AirAlarmComponent.cs b/Content.Server/Atmos/Monitor/Components/AirAlarmComponent.cs
index 7030d607a6..93f704fe21 100644
--- a/Content.Server/Atmos/Monitor/Components/AirAlarmComponent.cs
+++ b/Content.Server/Atmos/Monitor/Components/AirAlarmComponent.cs
@@ -24,8 +24,6 @@ public sealed partial class AirAlarmComponent : Component
public readonly Dictionary ScrubberData = new();
public readonly Dictionary SensorData = new();
- public HashSet ActivePlayers = new();
-
public bool CanSync = true;
///
diff --git a/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs b/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs
index 2922d0796a..881f54512a 100644
--- a/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs
+++ b/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs
@@ -223,8 +223,7 @@ public sealed class AirAlarmSystem : EntitySystem
private void OnClose(EntityUid uid, AirAlarmComponent component, BoundUIClosedEvent args)
{
- component.ActivePlayers.Remove(args.Session.UserId);
- if (component.ActivePlayers.Count == 0)
+ if (!_ui.IsUiOpen(uid, SharedAirAlarmInterfaceKey.Key))
RemoveActiveInterface(uid);
}
@@ -247,9 +246,6 @@ public sealed class AirAlarmSystem : EntitySystem
private void OnActivate(EntityUid uid, AirAlarmComponent component, ActivateInWorldEvent args)
{
- if (!TryComp(args.User, out var actor))
- return;
-
if (TryComp(uid, out var panel) && panel.Open)
{
args.Handled = false;
@@ -259,10 +255,7 @@ public sealed class AirAlarmSystem : EntitySystem
if (!this.IsPowered(uid, EntityManager))
return;
- var ui = _ui.GetUiOrNull(uid, SharedAirAlarmInterfaceKey.Key);
- if (ui != null)
- _ui.OpenUi(ui, actor.PlayerSession);
- component.ActivePlayers.Add(actor.PlayerSession.UserId);
+ _ui.OpenUi(uid, SharedAirAlarmInterfaceKey.Key, args.User);
AddActiveInterface(uid);
SyncAllDevices(uid);
UpdateUI(uid, component);
@@ -270,7 +263,7 @@ public sealed class AirAlarmSystem : EntitySystem
private void OnResyncAll(EntityUid uid, AirAlarmComponent component, AirAlarmResyncAllDevicesMessage args)
{
- if (!AccessCheck(uid, args.Session.AttachedEntity, component))
+ if (!AccessCheck(uid, args.Actor, component))
{
return;
}
@@ -285,7 +278,7 @@ public sealed class AirAlarmSystem : EntitySystem
private void OnUpdateAlarmMode(EntityUid uid, AirAlarmComponent component, AirAlarmUpdateAlarmModeMessage args)
{
- if (AccessCheck(uid, args.Session.AttachedEntity, component))
+ if (AccessCheck(uid, args.Actor, component))
{
var addr = string.Empty;
if (TryComp(uid, out var netConn))
@@ -309,7 +302,7 @@ public sealed class AirAlarmSystem : EntitySystem
private void OnUpdateThreshold(EntityUid uid, AirAlarmComponent component, AirAlarmUpdateAlarmThresholdMessage args)
{
- if (AccessCheck(uid, args.Session.AttachedEntity, component))
+ if (AccessCheck(uid, args.Actor, component))
SetThreshold(uid, args.Address, args.Type, args.Threshold, args.Gas);
else
UpdateUI(uid, component);
@@ -317,7 +310,7 @@ public sealed class AirAlarmSystem : EntitySystem
private void OnUpdateDeviceData(EntityUid uid, AirAlarmComponent component, AirAlarmUpdateDeviceDataMessage args)
{
- if (AccessCheck(uid, args.Session.AttachedEntity, component)
+ if (AccessCheck(uid, args.Actor, component)
&& _deviceList.ExistsInDeviceList(uid, args.Address))
{
SetDeviceData(uid, args.Address, args.Data);
@@ -330,7 +323,7 @@ public sealed class AirAlarmSystem : EntitySystem
private void OnCopyDeviceData(EntityUid uid, AirAlarmComponent component, AirAlarmCopyDeviceDataMessage args)
{
- if (!AccessCheck(uid, args.Session.AttachedEntity, component))
+ if (!AccessCheck(uid, args.Actor, component))
{
UpdateUI(uid, component);
return;
@@ -377,7 +370,7 @@ public sealed class AirAlarmSystem : EntitySystem
private void OnAtmosAlarm(EntityUid uid, AirAlarmComponent component, AtmosAlarmEvent args)
{
- if (component.ActivePlayers.Count != 0)
+ if (_ui.IsUiOpen(uid, SharedAirAlarmInterfaceKey.Key))
{
SyncAllDevices(uid);
}
@@ -571,7 +564,7 @@ public sealed class AirAlarmSystem : EntitySystem
///
private void ForceCloseAllInterfaces(EntityUid uid)
{
- _ui.TryCloseAll(uid, SharedAirAlarmInterfaceKey.Key);
+ _ui.CloseUi(uid, SharedAirAlarmInterfaceKey.Key);
}
private void OnAtmosUpdate(EntityUid uid, AirAlarmComponent alarm, ref AtmosDeviceUpdateEvent args)
@@ -639,7 +632,7 @@ public sealed class AirAlarmSystem : EntitySystem
highestAlarm = AtmosAlarmType.Normal;
}
- _ui.TrySetUiState(
+ _ui.SetUiState(
uid,
SharedAirAlarmInterfaceKey.Key,
new AirAlarmUIState(devNet.Address, deviceCount, pressure, temperature, dataToSend, alarm.CurrentMode, alarm.CurrentTab, highestAlarm.Value, alarm.AutoMode));
diff --git a/Content.Server/Atmos/Piping/Binary/EntitySystems/GasPressurePumpSystem.cs b/Content.Server/Atmos/Piping/Binary/EntitySystems/GasPressurePumpSystem.cs
index af25d04df9..83b7b67ba4 100644
--- a/Content.Server/Atmos/Piping/Binary/EntitySystems/GasPressurePumpSystem.cs
+++ b/Content.Server/Atmos/Piping/Binary/EntitySystems/GasPressurePumpSystem.cs
@@ -98,7 +98,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems
UpdateAppearance(uid, pump);
DirtyUI(uid, pump);
- _userInterfaceSystem.TryCloseAll(uid, GasPressurePumpUiKey.Key);
+ _userInterfaceSystem.CloseUi(uid, GasPressurePumpUiKey.Key);
}
private void OnPumpActivate(EntityUid uid, GasPressurePumpComponent pump, ActivateInWorldEvent args)
@@ -108,7 +108,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems
if (Transform(uid).Anchored)
{
- _userInterfaceSystem.TryOpen(uid, GasPressurePumpUiKey.Key, actor.PlayerSession);
+ _userInterfaceSystem.OpenUi(uid, GasPressurePumpUiKey.Key, actor.PlayerSession);
DirtyUI(uid, pump);
}
else
@@ -123,7 +123,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems
{
pump.Enabled = args.Enabled;
_adminLogger.Add(LogType.AtmosPowerChanged, LogImpact.Medium,
- $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}");
+ $"{ToPrettyString(args.Actor):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}");
DirtyUI(uid, pump);
UpdateAppearance(uid, pump);
}
@@ -132,7 +132,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems
{
pump.TargetPressure = Math.Clamp(args.Pressure, 0f, Atmospherics.MaxOutputPressure);
_adminLogger.Add(LogType.AtmosPressureChanged, LogImpact.Medium,
- $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the pressure on {ToPrettyString(uid):device} to {args.Pressure}kPa");
+ $"{ToPrettyString(args.Actor):player} set the pressure on {ToPrettyString(uid):device} to {args.Pressure}kPa");
DirtyUI(uid, pump);
}
@@ -142,7 +142,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems
if (!Resolve(uid, ref pump))
return;
- _userInterfaceSystem.TrySetUiState(uid, GasPressurePumpUiKey.Key,
+ _userInterfaceSystem.SetUiState(uid, GasPressurePumpUiKey.Key,
new GasPressurePumpBoundUserInterfaceState(EntityManager.GetComponent(uid).EntityName, pump.TargetPressure, pump.Enabled));
}
diff --git a/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs b/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs
index e4767c4061..cbcd1f4fa3 100644
--- a/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs
+++ b/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs
@@ -128,7 +128,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems
UpdateAppearance(uid, pump);
DirtyUI(uid, pump);
- _userInterfaceSystem.TryCloseAll(uid, GasVolumePumpUiKey.Key);
+ _userInterfaceSystem.CloseUi(uid, GasVolumePumpUiKey.Key);
}
private void OnPumpActivate(EntityUid uid, GasVolumePumpComponent pump, ActivateInWorldEvent args)
@@ -138,7 +138,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems
if (Transform(uid).Anchored)
{
- _userInterfaceSystem.TryOpen(uid, GasVolumePumpUiKey.Key, actor.PlayerSession);
+ _userInterfaceSystem.OpenUi(uid, GasVolumePumpUiKey.Key, actor.PlayerSession);
DirtyUI(uid, pump);
}
else
@@ -153,7 +153,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems
{
pump.Enabled = args.Enabled;
_adminLogger.Add(LogType.AtmosPowerChanged, LogImpact.Medium,
- $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}");
+ $"{ToPrettyString(args.Actor):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}");
DirtyUI(uid, pump);
UpdateAppearance(uid, pump);
}
@@ -162,7 +162,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems
{
pump.TransferRate = Math.Clamp(args.TransferRate, 0f, pump.MaxTransferRate);
_adminLogger.Add(LogType.AtmosVolumeChanged, LogImpact.Medium,
- $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the transfer rate on {ToPrettyString(uid):device} to {args.TransferRate}");
+ $"{ToPrettyString(args.Actor):player} set the transfer rate on {ToPrettyString(uid):device} to {args.TransferRate}");
DirtyUI(uid, pump);
}
@@ -171,7 +171,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems
if (!Resolve(uid, ref pump))
return;
- _userInterfaceSystem.TrySetUiState(uid, GasVolumePumpUiKey.Key,
+ _userInterfaceSystem.SetUiState(uid, GasVolumePumpUiKey.Key,
new GasVolumePumpBoundUserInterfaceState(Name(uid), pump.TransferRate, pump.Enabled));
}
diff --git a/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs b/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs
index c0c2b930f6..007d304e98 100644
--- a/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs
+++ b/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs
@@ -94,7 +94,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems
_ambientSoundSystem.SetAmbience(uid, false);
DirtyUI(uid, filter);
- _userInterfaceSystem.TryCloseAll(uid, GasFilterUiKey.Key);
+ _userInterfaceSystem.CloseUi(uid, GasFilterUiKey.Key);
}
private void OnFilterActivate(EntityUid uid, GasFilterComponent filter, ActivateInWorldEvent args)
@@ -104,7 +104,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems
if (EntityManager.GetComponent(uid).Anchored)
{
- _userInterfaceSystem.TryOpen(uid, GasFilterUiKey.Key, actor.PlayerSession);
+ _userInterfaceSystem.OpenUi(uid, GasFilterUiKey.Key, actor.PlayerSession);
DirtyUI(uid, filter);
}
else
@@ -120,7 +120,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems
if (!Resolve(uid, ref filter))
return;
- _userInterfaceSystem.TrySetUiState(uid, GasFilterUiKey.Key,
+ _userInterfaceSystem.SetUiState(uid, GasFilterUiKey.Key,
new GasFilterBoundUserInterfaceState(MetaData(uid).EntityName, filter.TransferRate, filter.Enabled, filter.FilteredGas));
}
@@ -136,7 +136,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems
{
filter.Enabled = args.Enabled;
_adminLogger.Add(LogType.AtmosPowerChanged, LogImpact.Medium,
- $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}");
+ $"{ToPrettyString(args.Actor):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}");
DirtyUI(uid, filter);
UpdateAppearance(uid, filter);
}
@@ -145,7 +145,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems
{
filter.TransferRate = Math.Clamp(args.Rate, 0f, filter.MaxTransferRate);
_adminLogger.Add(LogType.AtmosVolumeChanged, LogImpact.Medium,
- $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the transfer rate on {ToPrettyString(uid):device} to {args.Rate}");
+ $"{ToPrettyString(args.Actor):player} set the transfer rate on {ToPrettyString(uid):device} to {args.Rate}");
DirtyUI(uid, filter);
}
@@ -158,7 +158,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems
{
filter.FilteredGas = parsedGas;
_adminLogger.Add(LogType.AtmosFilterChanged, LogImpact.Medium,
- $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the filter on {ToPrettyString(uid):device} to {parsedGas.ToString()}");
+ $"{ToPrettyString(args.Actor):player} set the filter on {ToPrettyString(uid):device} to {parsedGas.ToString()}");
DirtyUI(uid, filter);
}
else
@@ -170,7 +170,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems
{
filter.FilteredGas = null;
_adminLogger.Add(LogType.AtmosFilterChanged, LogImpact.Medium,
- $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the filter on {ToPrettyString(uid):device} to none");
+ $"{ToPrettyString(args.Actor):player} set the filter on {ToPrettyString(uid):device} to none");
DirtyUI(uid, filter);
}
}
diff --git a/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasMixerSystem.cs b/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasMixerSystem.cs
index 4d7fc134c7..4ab8572843 100644
--- a/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasMixerSystem.cs
+++ b/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasMixerSystem.cs
@@ -134,7 +134,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems
DirtyUI(uid, mixer);
UpdateAppearance(uid, mixer);
- _userInterfaceSystem.TryCloseAll(uid, GasFilterUiKey.Key);
+ _userInterfaceSystem.CloseUi(uid, GasFilterUiKey.Key);
}
private void OnMixerActivate(EntityUid uid, GasMixerComponent mixer, ActivateInWorldEvent args)
@@ -144,7 +144,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems
if (Transform(uid).Anchored)
{
- _userInterfaceSystem.TryOpen(uid, GasMixerUiKey.Key, actor.PlayerSession);
+ _userInterfaceSystem.OpenUi(uid, GasMixerUiKey.Key, actor.PlayerSession);
DirtyUI(uid, mixer);
}
else
@@ -160,7 +160,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems
if (!Resolve(uid, ref mixer))
return;
- _userInterfaceSystem.TrySetUiState(uid, GasMixerUiKey.Key,
+ _userInterfaceSystem.SetUiState(uid, GasMixerUiKey.Key,
new GasMixerBoundUserInterfaceState(EntityManager.GetComponent(uid).EntityName, mixer.TargetPressure, mixer.Enabled, mixer.InletOneConcentration));
}
@@ -176,7 +176,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems
{
mixer.Enabled = args.Enabled;
_adminLogger.Add(LogType.AtmosPowerChanged, LogImpact.Medium,
- $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}");
+ $"{ToPrettyString(args.Actor):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}");
DirtyUI(uid, mixer);
UpdateAppearance(uid, mixer);
}
@@ -185,7 +185,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems
{
mixer.TargetPressure = Math.Clamp(args.Pressure, 0f, mixer.MaxTargetPressure);
_adminLogger.Add(LogType.AtmosPressureChanged, LogImpact.Medium,
- $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the pressure on {ToPrettyString(uid):device} to {args.Pressure}kPa");
+ $"{ToPrettyString(args.Actor):player} set the pressure on {ToPrettyString(uid):device} to {args.Pressure}kPa");
DirtyUI(uid, mixer);
}
@@ -196,7 +196,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems
mixer.InletOneConcentration = nodeOne;
mixer.InletTwoConcentration = 1.0f - mixer.InletOneConcentration;
_adminLogger.Add(LogType.AtmosRatioChanged, LogImpact.Medium,
- $"{EntityManager.ToPrettyString(args.Session.AttachedEntity!.Value):player} set the ratio on {EntityManager.ToPrettyString(uid):device} to {mixer.InletOneConcentration}:{mixer.InletTwoConcentration}");
+ $"{EntityManager.ToPrettyString(args.Actor):player} set the ratio on {EntityManager.ToPrettyString(uid):device} to {mixer.InletOneConcentration}:{mixer.InletTwoConcentration}");
DirtyUI(uid, mixer);
}
diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs
index bdc9e76538..e279db09aa 100644
--- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs
+++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs
@@ -96,7 +96,7 @@ public sealed class GasCanisterSystem : EntitySystem
tankPressure = tankComponent.Air.Pressure;
}
- _ui.TrySetUiState(uid, GasCanisterUiKey.Key,
+ _ui.SetUiState(uid, GasCanisterUiKey.Key,
new GasCanisterBoundUserInterfaceState(Name(uid),
canister.Air.Pressure, portStatus, tankLabel, tankPressure, canister.ReleasePressure,
canister.ReleaseValve, canister.MinReleasePressure, canister.MaxReleasePressure));
@@ -104,19 +104,19 @@ public sealed class GasCanisterSystem : EntitySystem
private void OnHoldingTankEjectMessage(EntityUid uid, GasCanisterComponent canister, GasCanisterHoldingTankEjectMessage args)
{
- if (canister.GasTankSlot.Item == null || args.Session.AttachedEntity == null)
+ if (canister.GasTankSlot.Item == null)
return;
var item = canister.GasTankSlot.Item;
- _slots.TryEjectToHands(uid, canister.GasTankSlot, args.Session.AttachedEntity);
- _adminLogger.Add(LogType.CanisterTankEjected, LogImpact.Medium, $"Player {ToPrettyString(args.Session.AttachedEntity.GetValueOrDefault()):player} ejected tank {ToPrettyString(item):tank} from {ToPrettyString(uid):canister}");
+ _slots.TryEjectToHands(uid, canister.GasTankSlot, args.Actor);
+ _adminLogger.Add(LogType.CanisterTankEjected, LogImpact.Medium, $"Player {ToPrettyString(args.Actor):player} ejected tank {ToPrettyString(item):tank} from {ToPrettyString(uid):canister}");
}
private void OnCanisterChangeReleasePressure(EntityUid uid, GasCanisterComponent canister, GasCanisterChangeReleasePressureMessage args)
{
var pressure = Math.Clamp(args.Pressure, canister.MinReleasePressure, canister.MaxReleasePressure);
- _adminLogger.Add(LogType.CanisterPressure, LogImpact.Medium, $"{ToPrettyString(args.Session.AttachedEntity.GetValueOrDefault()):player} set the release pressure on {ToPrettyString(uid):canister} to {args.Pressure}");
+ _adminLogger.Add(LogType.CanisterPressure, LogImpact.Medium, $"{ToPrettyString(args.Actor):player} set the release pressure on {ToPrettyString(uid):canister} to {args.Pressure}");
canister.ReleasePressure = pressure;
DirtyUI(uid, canister);
@@ -129,14 +129,14 @@ public sealed class GasCanisterSystem : EntitySystem
impact = canister.GasTankSlot.HasItem ? LogImpact.Medium : LogImpact.High;
var containedGasDict = new Dictionary();
- var containedGasArray = Gas.GetValues(typeof(Gas));
+ var containedGasArray = Enum.GetValues(typeof(Gas));
for (int i = 0; i < containedGasArray.Length; i++)
{
containedGasDict.Add((Gas)i, canister.Air[i]);
}
- _adminLogger.Add(LogType.CanisterValve, impact, $"{ToPrettyString(args.Session.AttachedEntity.GetValueOrDefault()):player} set the valve on {ToPrettyString(uid):canister} to {args.Valve:valveState} while it contained [{string.Join(", ", containedGasDict)}]");
+ _adminLogger.Add(LogType.CanisterValve, impact, $"{ToPrettyString(args.Actor):player} set the valve on {ToPrettyString(uid):canister} to {args.Valve:valveState} while it contained [{string.Join(", ", containedGasDict)}]");
canister.ReleaseValve = args.Valve;
DirtyUI(uid, canister);
@@ -212,7 +212,7 @@ public sealed class GasCanisterSystem : EntitySystem
if (args.Handled)
return;
- _ui.TryOpen(uid, GasCanisterUiKey.Key, actor.PlayerSession);
+ _ui.OpenUi(uid, GasCanisterUiKey.Key, actor.PlayerSession);
args.Handled = true;
}
@@ -224,7 +224,7 @@ public sealed class GasCanisterSystem : EntitySystem
if (CheckLocked(uid, component, args.User))
return;
- _ui.TryOpen(uid, GasCanisterUiKey.Key, actor.PlayerSession);
+ _ui.OpenUi(uid, GasCanisterUiKey.Key, actor.PlayerSession);
args.Handled = true;
}
diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs
index 9b61044f03..827ba0bda5 100644
--- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs
+++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs
@@ -144,7 +144,7 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems
private void OnToggleMessage(EntityUid uid, GasThermoMachineComponent thermoMachine, GasThermomachineToggleMessage args)
{
var powerState = _power.TogglePower(uid);
- _adminLogger.Add(LogType.AtmosPowerChanged, $"{ToPrettyString(args.Session.AttachedEntity)} turned {(powerState ? "On" : "Off")} {ToPrettyString(uid)}");
+ _adminLogger.Add(LogType.AtmosPowerChanged, $"{ToPrettyString(args.Actor)} turned {(powerState ? "On" : "Off")} {ToPrettyString(uid)}");
DirtyUI(uid, thermoMachine);
}
@@ -155,7 +155,7 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems
else
thermoMachine.TargetTemperature = MathF.Max(args.Temperature, thermoMachine.MinTemperature);
thermoMachine.TargetTemperature = MathF.Max(thermoMachine.TargetTemperature, Atmospherics.TCMB);
- _adminLogger.Add(LogType.AtmosTemperatureChanged, $"{ToPrettyString(args.Session.AttachedEntity)} set temperature on {ToPrettyString(uid)} to {thermoMachine.TargetTemperature}");
+ _adminLogger.Add(LogType.AtmosTemperatureChanged, $"{ToPrettyString(args.Actor)} set temperature on {ToPrettyString(uid)} to {thermoMachine.TargetTemperature}");
DirtyUI(uid, thermoMachine);
}
@@ -168,8 +168,8 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems
if (!Resolve(uid, ref powerReceiver))
return;
- _userInterfaceSystem.TrySetUiState(uid, ThermomachineUiKey.Key,
- new GasThermomachineBoundUserInterfaceState(thermoMachine.MinTemperature, thermoMachine.MaxTemperature, thermoMachine.TargetTemperature, !powerReceiver.PowerDisabled, IsHeater(thermoMachine)), null, ui);
+ _userInterfaceSystem.SetUiState(uid, ThermomachineUiKey.Key,
+ new GasThermomachineBoundUserInterfaceState(thermoMachine.MinTemperature, thermoMachine.MaxTemperature, thermoMachine.TargetTemperature, !powerReceiver.PowerDisabled, IsHeater(thermoMachine)));
}
private void OnExamined(EntityUid uid, GasThermoMachineComponent thermoMachine, ExaminedEvent args)
diff --git a/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs b/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs
index fff15f696c..cbf63f5404 100644
--- a/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs
+++ b/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs
@@ -163,7 +163,7 @@ public sealed class SpaceHeaterSystem : EntitySystem
{
return;
}
- _userInterfaceSystem.TrySetUiState(uid, SpaceHeaterUiKey.Key,
+ _userInterfaceSystem.SetUiState(uid, SpaceHeaterUiKey.Key,
new SpaceHeaterBoundUserInterfaceState(spaceHeater.MinTemperature, spaceHeater.MaxTemperature, thermoMachine.TargetTemperature, !powerReceiver.PowerDisabled, spaceHeater.Mode, spaceHeater.PowerLevel));
}
diff --git a/Content.Server/Audio/Jukebox/JukeboxSystem.cs b/Content.Server/Audio/Jukebox/JukeboxSystem.cs
index bfb9b2099a..cc9235e3d7 100644
--- a/Content.Server/Audio/Jukebox/JukeboxSystem.cs
+++ b/Content.Server/Audio/Jukebox/JukeboxSystem.cs
@@ -5,6 +5,7 @@ using Robust.Server.GameObjects;
using Robust.Shared.Audio;
using Robust.Shared.Audio.Components;
using Robust.Shared.Audio.Systems;
+using Robust.Shared.Player;
using Robust.Shared.Prototypes;
using JukeboxComponent = Content.Shared.Audio.Jukebox.JukeboxComponent;
@@ -66,8 +67,11 @@ public sealed class JukeboxSystem : SharedJukeboxSystem
private void OnJukeboxSetTime(EntityUid uid, JukeboxComponent component, JukeboxSetTimeMessage args)
{
- var offset = (args.Session.Channel.Ping * 1.5f) / 1000f;
- Audio.SetPlaybackPosition(component.AudioStream, args.SongTime + offset);
+ if (TryComp(args.Actor, out ActorComponent? actorComp))
+ {
+ var offset = actorComp.PlayerSession.Channel.Ping * 1.5f / 1000f;
+ Audio.SetPlaybackPosition(component.AudioStream, args.SongTime + offset);
+ }
}
private void OnPowerChanged(Entity entity, ref PowerChangedEvent args)
diff --git a/Content.Server/Bed/Cryostorage/CryostorageSystem.cs b/Content.Server/Bed/Cryostorage/CryostorageSystem.cs
index 2e7f8c4235..1369fa20f1 100644
--- a/Content.Server/Bed/Cryostorage/CryostorageSystem.cs
+++ b/Content.Server/Bed/Cryostorage/CryostorageSystem.cs
@@ -79,9 +79,7 @@ public sealed class CryostorageSystem : SharedCryostorageSystem
private void OnRemoveItemBuiMessage(Entity ent, ref CryostorageRemoveItemBuiMessage args)
{
var (_, comp) = ent;
- if (args.Session.AttachedEntity is not { } attachedEntity)
- return;
-
+ var attachedEntity = args.Actor;
var cryoContained = GetEntity(args.StoredEntity);
if (!comp.StoredPlayers.Contains(cryoContained) || !IsInPausedMap(cryoContained))
@@ -114,6 +112,7 @@ public sealed class CryostorageSystem : SharedCryostorageSystem
AdminLog.Add(LogType.Action, LogImpact.High,
$"{ToPrettyString(attachedEntity):player} removed item {ToPrettyString(entity)} from cryostorage-contained player " +
$"{ToPrettyString(cryoContained):player}, stored in cryostorage {ToPrettyString(ent)}");
+
_container.TryRemoveFromContainer(entity.Value);
_transform.SetCoordinates(entity.Value, Transform(attachedEntity).Coordinates);
_hands.PickupOrDrop(attachedEntity, entity.Value);
@@ -122,8 +121,8 @@ public sealed class CryostorageSystem : SharedCryostorageSystem
private void UpdateCryostorageUIState(Entity ent)
{
- var state = new CryostorageBuiState(GetAllContainedData(ent).ToList());
- _ui.TrySetUiState(ent, CryostorageUIKey.Key, state);
+ var state = new CryostorageBuiState(GetAllContainedData(ent));
+ _ui.SetUiState(ent.Owner, CryostorageUIKey.Key, state);
}
private void OnPlayerSpawned(Entity ent, ref PlayerSpawnCompleteEvent args)
@@ -293,12 +292,17 @@ public sealed class CryostorageSystem : SharedCryostorageSystem
_chatManager.ChatMessageToOne(ChatChannel.Server, msg, msg, uid, false, actor.PlayerSession.Channel);
}
- private IEnumerable GetAllContainedData(Entity ent)
+ private List GetAllContainedData(Entity ent)
{
+ var data = new List();
+ data.EnsureCapacity(ent.Comp.StoredPlayers.Count);
+
foreach (var contained in ent.Comp.StoredPlayers)
{
- yield return GetContainedData(contained);
+ data.Add(GetContainedData(contained));
}
+
+ return data;
}
private CryostorageContainedPlayerData GetContainedData(EntityUid uid)
diff --git a/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs b/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs
index 22e5c67e17..e132e4f12a 100644
--- a/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs
+++ b/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs
@@ -52,7 +52,7 @@ public sealed partial class CargoSystem
return;
var untilNextSkip = bountyDb.NextSkipTime - _timing.CurTime;
- _uiSystem.TrySetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(bountyDb.Bounties, untilNextSkip));
+ _uiSystem.SetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(bountyDb.Bounties, untilNextSkip));
}
private void OnPrintLabelMessage(EntityUid uid, CargoBountyConsoleComponent component, BountyPrintLabelMessage args)
@@ -83,7 +83,7 @@ public sealed partial class CargoSystem
if (!TryGetBountyFromId(station, args.BountyId, out var bounty))
return;
- if (args.Session.AttachedEntity is not { Valid: true } mob)
+ if (args.Actor is not { Valid: true } mob)
return;
if (TryComp(uid, out var accessReaderComponent) &&
@@ -99,7 +99,7 @@ public sealed partial class CargoSystem
FillBountyDatabase(station);
db.NextSkipTime = _timing.CurTime + db.SkipDelay;
var untilNextSkip = db.NextSkipTime - _timing.CurTime;
- _uiSystem.TrySetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(db.Bounties, untilNextSkip));
+ _uiSystem.SetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(db.Bounties, untilNextSkip));
_audio.PlayPvs(component.SkipSound, uid);
}
@@ -462,10 +462,12 @@ public sealed partial class CargoSystem
{
if (_station.GetOwningStation(uid) is not { } station ||
!TryComp(station, out var db))
+ {
continue;
+ }
var untilNextSkip = db.NextSkipTime - _timing.CurTime;
- _uiSystem.TrySetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(db.Bounties, untilNextSkip), ui: ui);
+ _uiSystem.SetUiState((uid, ui), CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(db.Bounties, untilNextSkip));
}
}
diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs
index 13a1d3d565..63556d2fbd 100644
--- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs
+++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs
@@ -102,12 +102,12 @@ namespace Content.Server.Cargo.Systems
private void OnApproveOrderMessage(EntityUid uid, CargoOrderConsoleComponent component, CargoConsoleApproveOrderMessage args)
{
- if (args.Session.AttachedEntity is not { Valid: true } player)
+ if (args.Actor is not { Valid: true } player)
return;
if (!_accessReaderSystem.IsAllowed(player, uid))
{
- ConsolePopup(args.Session, Loc.GetString("cargo-console-order-not-allowed"));
+ ConsolePopup(args.Actor, Loc.GetString("cargo-console-order-not-allowed"));
PlayDenySound(uid, component);
return;
}
@@ -119,7 +119,7 @@ namespace Content.Server.Cargo.Systems
!TryComp(station, out StationDataComponent? stationData) ||
!TryGetOrderDatabase(station, out var orderDatabase))
{
- ConsolePopup(args.Session, Loc.GetString("cargo-console-station-not-found"));
+ ConsolePopup(args.Actor, Loc.GetString("cargo-console-station-not-found"));
PlayDenySound(uid, component);
return;
}
@@ -134,7 +134,7 @@ namespace Content.Server.Cargo.Systems
// Invalid order
if (!_protoMan.HasIndex(order.ProductId))
{
- ConsolePopup(args.Session, Loc.GetString("cargo-console-invalid-product"));
+ ConsolePopup(args.Actor, Loc.GetString("cargo-console-invalid-product"));
PlayDenySound(uid, component);
return;
}
@@ -145,7 +145,7 @@ namespace Content.Server.Cargo.Systems
// Too many orders, avoid them getting spammed in the UI.
if (amount >= capacity)
{
- ConsolePopup(args.Session, Loc.GetString("cargo-console-too-many"));
+ ConsolePopup(args.Actor, Loc.GetString("cargo-console-too-many"));
PlayDenySound(uid, component);
return;
}
@@ -156,7 +156,7 @@ namespace Content.Server.Cargo.Systems
if (cappedAmount != order.OrderQuantity)
{
order.OrderQuantity = cappedAmount;
- ConsolePopup(args.Session, Loc.GetString("cargo-console-snip-snip"));
+ ConsolePopup(args.Actor, Loc.GetString("cargo-console-snip-snip"));
PlayDenySound(uid, component);
}
@@ -165,7 +165,7 @@ namespace Content.Server.Cargo.Systems
// Not enough balance
if (cost > bank.Balance)
{
- ConsolePopup(args.Session, Loc.GetString("cargo-console-insufficient-funds", ("cost", cost)));
+ ConsolePopup(args.Actor, Loc.GetString("cargo-console-insufficient-funds", ("cost", cost)));
PlayDenySound(uid, component);
return;
}
@@ -180,7 +180,7 @@ namespace Content.Server.Cargo.Systems
if (ev.FulfillmentEntity == null)
{
- ConsolePopup(args.Session, Loc.GetString("cargo-console-unfulfilled"));
+ ConsolePopup(args.Actor, Loc.GetString("cargo-console-unfulfilled"));
PlayDenySound(uid, component);
return;
}
@@ -200,7 +200,7 @@ namespace Content.Server.Cargo.Systems
("approverJob", approverJob),
("cost", cost));
_radio.SendRadioMessage(uid, message, component.AnnouncementChannel, uid, escapeMarkup: false);
- ConsolePopup(args.Session, Loc.GetString("cargo-console-trade-station", ("destination", MetaData(ev.FulfillmentEntity.Value).EntityName)));
+ ConsolePopup(args.Actor, Loc.GetString("cargo-console-trade-station", ("destination", MetaData(ev.FulfillmentEntity.Value).EntityName)));
// Log order approval
_adminLogger.Add(LogType.Action, LogImpact.Low,
@@ -271,7 +271,7 @@ namespace Content.Server.Cargo.Systems
private void OnAddOrderMessage(EntityUid uid, CargoOrderConsoleComponent component, CargoConsoleAddOrderMessage args)
{
- if (args.Session.AttachedEntity is not { Valid: true } player)
+ if (args.Actor is not { Valid: true } player)
return;
if (args.Amount <= 0)
@@ -319,9 +319,9 @@ namespace Content.Server.Cargo.Systems
!TryComp(station, out var orderDatabase) ||
!TryComp(station, out var bankAccount)) return;
- if (_uiSystem.TryGetUi(consoleUid, CargoConsoleUiKey.Orders, out var bui))
+ if (_uiSystem.HasUi(consoleUid, CargoConsoleUiKey.Orders))
{
- _uiSystem.SetUiState(bui, new CargoConsoleInterfaceState(
+ _uiSystem.SetUiState(consoleUid, CargoConsoleUiKey.Orders, new CargoConsoleInterfaceState(
MetaData(station.Value).EntityName,
GetOutstandingOrderCount(orderDatabase),
orderDatabase.Capacity,
@@ -331,9 +331,9 @@ namespace Content.Server.Cargo.Systems
}
}
- private void ConsolePopup(ICommonSession session, string text)
+ private void ConsolePopup(EntityUid actor, string text)
{
- _popup.PopupCursor(text, session);
+ _popup.PopupCursor(text, actor);
}
private void PlayDenySound(EntityUid uid, CargoOrderConsoleComponent component)
diff --git a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs
index aa2614cdb8..e9f6d00822 100644
--- a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs
+++ b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs
@@ -54,21 +54,20 @@ public sealed partial class CargoSystem
private void UpdatePalletConsoleInterface(EntityUid uid)
{
- var bui = _uiSystem.GetUi(uid, CargoPalletConsoleUiKey.Sale);
if (Transform(uid).GridUid is not EntityUid gridUid)
{
- _uiSystem.SetUiState(bui,
+ _uiSystem.SetUiState(uid, CargoPalletConsoleUiKey.Sale,
new CargoPalletConsoleInterfaceState(0, 0, false));
return;
}
GetPalletGoods(gridUid, out var toSell, out var amount);
- _uiSystem.SetUiState(bui,
+ _uiSystem.SetUiState(uid, CargoPalletConsoleUiKey.Sale,
new CargoPalletConsoleInterfaceState((int) amount, toSell.Count, true));
}
private void OnPalletUIOpen(EntityUid uid, CargoPalletConsoleComponent component, BoundUIOpenedEvent args)
{
- var player = args.Session.AttachedEntity;
+ var player = args.Actor;
if (player == null)
return;
@@ -86,7 +85,7 @@ public sealed partial class CargoSystem
private void OnPalletAppraise(EntityUid uid, CargoPalletConsoleComponent component, CargoPalletAppraiseMessage args)
{
- var player = args.Session.AttachedEntity;
+ var player = args.Actor;
if (player == null)
return;
@@ -108,8 +107,8 @@ public sealed partial class CargoSystem
var orders = GetProjectedOrders(station ?? EntityUid.Invalid, orderDatabase, shuttle);
var shuttleName = orderDatabase?.Shuttle != null ? MetaData(orderDatabase.Shuttle.Value).EntityName : string.Empty;
- if (_uiSystem.TryGetUi(uid, CargoConsoleUiKey.Shuttle, out var bui))
- _uiSystem.SetUiState(bui, new CargoShuttleConsoleBoundUserInterfaceState(
+ if (_uiSystem.HasUi(uid, CargoConsoleUiKey.Shuttle))
+ _uiSystem.SetUiState(uid, CargoConsoleUiKey.Shuttle, new CargoShuttleConsoleBoundUserInterfaceState(
station != null ? MetaData(station.Value).EntityName : Loc.GetString("cargo-shuttle-console-station-unknown"),
string.IsNullOrEmpty(shuttleName) ? Loc.GetString("cargo-shuttle-console-shuttle-not-found") : shuttleName,
orders
@@ -314,17 +313,16 @@ public sealed partial class CargoSystem
private void OnPalletSale(EntityUid uid, CargoPalletConsoleComponent component, CargoPalletSellMessage args)
{
- var player = args.Session.AttachedEntity;
+ var player = args.Actor;
if (player == null)
return;
- var bui = _uiSystem.GetUi(uid, CargoPalletConsoleUiKey.Sale);
var xform = Transform(uid);
if (xform.GridUid is not EntityUid gridUid)
{
- _uiSystem.SetUiState(bui,
+ _uiSystem.SetUiState(uid, CargoPalletConsoleUiKey.Sale,
new CargoPalletConsoleInterfaceState(0, 0, false));
return;
}
diff --git a/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs b/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs
index 4a76aef911..7896a7822e 100644
--- a/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs
+++ b/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs
@@ -103,12 +103,12 @@ public sealed class CartridgeLoaderSystem : SharedCartridgeLoaderSystem
if (!Resolve(loaderUid, ref loader))
return;
- if (!_userInterfaceSystem.TryGetUi(loaderUid, loader.UiKey, out var ui))
+ if (!_userInterfaceSystem.HasUi(loaderUid, loader.UiKey))
return;
var programs = GetAvailablePrograms(loaderUid, loader);
var state = new CartridgeLoaderUiState(programs, GetNetEntity(loader.ActiveProgram));
- _userInterfaceSystem.SetUiState(ui, state, session);
+ _userInterfaceSystem.SetUiState(loaderUid, loader.UiKey, state);
}
///
@@ -127,8 +127,8 @@ public sealed class CartridgeLoaderSystem : SharedCartridgeLoaderSystem
if (!Resolve(loaderUid, ref loader))
return;
- if (_userInterfaceSystem.TryGetUi(loaderUid, loader.UiKey, out var ui))
- _userInterfaceSystem.SetUiState(ui, state, session);
+ if (_userInterfaceSystem.HasUi(loaderUid, loader.UiKey))
+ _userInterfaceSystem.SetUiState(loaderUid, loader.UiKey, state);
}
///
diff --git a/Content.Server/Chemistry/EntitySystems/ChemMasterSystem.cs b/Content.Server/Chemistry/EntitySystems/ChemMasterSystem.cs
index ab91044574..289db75981 100644
--- a/Content.Server/Chemistry/EntitySystems/ChemMasterSystem.cs
+++ b/Content.Server/Chemistry/EntitySystems/ChemMasterSystem.cs
@@ -80,7 +80,7 @@ namespace Content.Server.Chemistry.EntitySystems
chemMaster.Mode, BuildInputContainerInfo(inputContainer), BuildOutputContainerInfo(outputContainer),
bufferReagents, bufferCurrentVolume, chemMaster.PillType, chemMaster.PillDosageLimit, updateLabel);
- _userInterfaceSystem.TrySetUiState(owner, ChemMasterUiKey.Key, state);
+ _userInterfaceSystem.SetUiState(owner, ChemMasterUiKey.Key, state);
}
private void OnSetModeMessage(Entity chemMaster, ref ChemMasterSetModeMessage message)
@@ -179,7 +179,7 @@ namespace Content.Server.Chemistry.EntitySystems
private void OnCreatePillsMessage(Entity chemMaster, ref ChemMasterCreatePillsMessage message)
{
- var user = message.Session.AttachedEntity;
+ var user = message.Actor;
var maybeContainer = _itemSlotsSystem.GetItemOrNull(chemMaster, SharedChemMaster.OutputSlotName);
if (maybeContainer is not { Valid: true } container
|| !TryComp(container, out StorageComponent? storage))
@@ -218,18 +218,9 @@ namespace Content.Server.Chemistry.EntitySystems
pill.PillType = chemMaster.Comp.PillType;
Dirty(item, pill);
- if (user.HasValue)
- {
- // Log pill creation by a user
- _adminLogger.Add(LogType.Action, LogImpact.Low,
- $"{ToPrettyString(user.Value):user} printed {ToPrettyString(item):pill} {SolutionContainerSystem.ToPrettyString(itemSolution.Comp.Solution)}");
- }
- else
- {
- // Log pill creation by magic? This should never happen... right?
- _adminLogger.Add(LogType.Action, LogImpact.Low,
- $"Unknown printed {ToPrettyString(item):pill} {SolutionContainerSystem.ToPrettyString(itemSolution.Comp.Solution)}");
- }
+ // Log pill creation by a user
+ _adminLogger.Add(LogType.Action, LogImpact.Low,
+ $"{ToPrettyString(user):user} printed {ToPrettyString(item):pill} {SharedSolutionContainerSystem.ToPrettyString(itemSolution.Comp.Solution)}");
}
UpdateUiState(chemMaster);
@@ -238,7 +229,7 @@ namespace Content.Server.Chemistry.EntitySystems
private void OnOutputToBottleMessage(Entity chemMaster, ref ChemMasterOutputToBottleMessage message)
{
- var user = message.Session.AttachedEntity;
+ var user = message.Actor;
var maybeContainer = _itemSlotsSystem.GetItemOrNull(chemMaster, SharedChemMaster.OutputSlotName);
if (maybeContainer is not { Valid: true } container
|| !_solutionContainerSystem.TryGetSolution(container, SharedChemMaster.BottleSolutionName, out var soln, out var solution))
@@ -260,18 +251,9 @@ namespace Content.Server.Chemistry.EntitySystems
_labelSystem.Label(container, message.Label);
_solutionContainerSystem.TryAddSolution(soln.Value, withdrawal);
- if (user.HasValue)
- {
- // Log bottle creation by a user
- _adminLogger.Add(LogType.Action, LogImpact.Low,
- $"{ToPrettyString(user.Value):user} bottled {ToPrettyString(container):bottle} {SolutionContainerSystem.ToPrettyString(solution)}");
- }
- else
- {
- // Log bottle creation by magic? This should never happen... right?
- _adminLogger.Add(LogType.Action, LogImpact.Low,
- $"Unknown bottled {ToPrettyString(container):bottle} {SolutionContainerSystem.ToPrettyString(solution)}");
- }
+ // Log bottle creation by a user
+ _adminLogger.Add(LogType.Action, LogImpact.Low,
+ $"{ToPrettyString(user):user} bottled {ToPrettyString(container):bottle} {SharedSolutionContainerSystem.ToPrettyString(solution)}");
UpdateUiState(chemMaster);
ClickSound(chemMaster);
diff --git a/Content.Server/Chemistry/EntitySystems/ReagentDispenserSystem.cs b/Content.Server/Chemistry/EntitySystems/ReagentDispenserSystem.cs
index d6433da56a..3bcdd4b964 100644
--- a/Content.Server/Chemistry/EntitySystems/ReagentDispenserSystem.cs
+++ b/Content.Server/Chemistry/EntitySystems/ReagentDispenserSystem.cs
@@ -62,7 +62,7 @@ namespace Content.Server.Chemistry.EntitySystems
var inventory = GetInventory(reagentDispenser);
var state = new ReagentDispenserBoundUserInterfaceState(outputContainerInfo, GetNetEntity(outputContainer), inventory, reagentDispenser.Comp.DispenseAmount);
- _userInterfaceSystem.TrySetUiState(reagentDispenser, ReagentDispenserUiKey.Key, state);
+ _userInterfaceSystem.SetUiState(reagentDispenser.Owner, ReagentDispenserUiKey.Key, state);
}
private ContainerInfo? BuildOutputContainerInfo(EntityUid? container)
diff --git a/Content.Server/Cloning/CloningConsoleSystem.cs b/Content.Server/Cloning/CloningConsoleSystem.cs
index 4176806639..950a6599a8 100644
--- a/Content.Server/Cloning/CloningConsoleSystem.cs
+++ b/Content.Server/Cloning/CloningConsoleSystem.cs
@@ -135,17 +135,17 @@ namespace Content.Server.Cloning
public void UpdateUserInterface(EntityUid consoleUid, CloningConsoleComponent consoleComponent)
{
- if (!_uiSystem.TryGetUi(consoleUid, CloningConsoleUiKey.Key, out var ui))
+ if (!_uiSystem.HasUi(consoleUid, CloningConsoleUiKey.Key))
return;
if (!_powerReceiverSystem.IsPowered(consoleUid))
{
- _uiSystem.CloseAll(ui);
+ _uiSystem.CloseUis(consoleUid);
return;
}
var newState = GetUserInterfaceState(consoleComponent);
- _uiSystem.SetUiState(ui, newState);
+ _uiSystem.SetUiState(consoleUid, CloningConsoleUiKey.Key, newState);
}
public void TryClone(EntityUid uid, EntityUid cloningPodUid, EntityUid scannerUid, CloningPodComponent? cloningPod = null, MedicalScannerComponent? scannerComp = null, CloningConsoleComponent? consoleComponent = null)
diff --git a/Content.Server/Clothing/Systems/ChameleonClothingSystem.cs b/Content.Server/Clothing/Systems/ChameleonClothingSystem.cs
index 23b772d99c..feb3428884 100644
--- a/Content.Server/Clothing/Systems/ChameleonClothingSystem.cs
+++ b/Content.Server/Clothing/Systems/ChameleonClothingSystem.cs
@@ -64,7 +64,7 @@ public sealed class ChameleonClothingSystem : SharedChameleonClothingSystem
return;
var state = new ChameleonBoundUserInterfaceState(component.Slot, component.Default);
- _uiSystem.TrySetUiState(uid, ChameleonUiKey.Key, state);
+ _uiSystem.SetUiState(uid, ChameleonUiKey.Key, state);
}
///
diff --git a/Content.Server/Communications/CommunicationsConsoleSystem.cs b/Content.Server/Communications/CommunicationsConsoleSystem.cs
index 6475e1a6d7..61a18fe3d5 100644
--- a/Content.Server/Communications/CommunicationsConsoleSystem.cs
+++ b/Content.Server/Communications/CommunicationsConsoleSystem.cs
@@ -82,8 +82,8 @@ namespace Content.Server.Communications
comp.UIUpdateAccumulator -= UIUpdateInterval;
- if (_uiSystem.TryGetUi(uid, CommunicationsConsoleUiKey.Key, out var ui) && ui.SubscribedSessions.Count > 0)
- UpdateCommsConsoleInterface(uid, comp, ui);
+ if (_uiSystem.IsUiOpen(uid, CommunicationsConsoleUiKey.Key))
+ UpdateCommsConsoleInterface(uid, comp);
}
base.Update(frameTime);
@@ -136,11 +136,8 @@ namespace Content.Server.Communications
///
/// Updates the UI for a particular comms console.
///
- public void UpdateCommsConsoleInterface(EntityUid uid, CommunicationsConsoleComponent comp, PlayerBoundUserInterface? ui = null)
+ public void UpdateCommsConsoleInterface(EntityUid uid, CommunicationsConsoleComponent comp)
{
- if (ui == null && !_uiSystem.TryGetUi(uid, CommunicationsConsoleUiKey.Key, out ui))
- return;
-
var stationUid = _stationSystem.GetOwningStation(uid);
List? levels = null;
string currentLevel = default!;
@@ -168,7 +165,7 @@ namespace Content.Server.Communications
}
}
- _uiSystem.SetUiState(ui, new CommunicationsConsoleInterfaceState(
+ _uiSystem.SetUiState(uid, CommunicationsConsoleUiKey.Key, new CommunicationsConsoleInterfaceState(
CanAnnounce(comp),
CanCallOrRecall(comp),
levels,
@@ -219,12 +216,12 @@ namespace Content.Server.Communications
private void OnSelectAlertLevelMessage(EntityUid uid, CommunicationsConsoleComponent comp, CommunicationsConsoleSelectAlertLevelMessage message)
{
- if (message.Session.AttachedEntity is not { Valid: true } mob)
+ if (message.Actor is not { Valid: true } mob)
return;
if (!CanUse(mob, uid))
{
- _popupSystem.PopupCursor(Loc.GetString("comms-console-permission-denied"), message.Session, PopupType.Medium);
+ _popupSystem.PopupCursor(Loc.GetString("comms-console-permission-denied"), message.Actor, PopupType.Medium);
return;
}
@@ -241,7 +238,7 @@ namespace Content.Server.Communications
var maxLength = _cfg.GetCVar(CCVars.ChatMaxAnnouncementLength);
var msg = SharedChatSystem.SanitizeAnnouncement(message.Message, maxLength);
var author = Loc.GetString("comms-console-announcement-unknown-sender");
- if (message.Session.AttachedEntity is { Valid: true } mob)
+ if (message.Actor is { Valid: true } mob)
{
if (!CanAnnounce(comp))
{
@@ -250,7 +247,7 @@ namespace Content.Server.Communications
if (!CanUse(mob, uid))
{
- _popupSystem.PopupEntity(Loc.GetString("comms-console-permission-denied"), uid, message.Session);
+ _popupSystem.PopupEntity(Loc.GetString("comms-console-permission-denied"), uid, message.Actor);
return;
}
@@ -263,7 +260,7 @@ namespace Content.Server.Communications
comp.AnnouncementCooldownRemaining = comp.Delay;
UpdateCommsConsoleInterface(uid, comp);
- var ev = new CommunicationConsoleAnnouncementEvent(uid, comp, msg, message.Session.AttachedEntity);
+ var ev = new CommunicationConsoleAnnouncementEvent(uid, comp, msg, message.Actor);
RaiseLocalEvent(ref ev);
// allow admemes with vv
@@ -275,15 +272,14 @@ namespace Content.Server.Communications
{
_chatSystem.DispatchGlobalAnnouncement(msg, title, announcementSound: comp.Sound, colorOverride: comp.Color);
- if (message.Session.AttachedEntity != null)
- _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(message.Session.AttachedEntity.Value):player} has sent the following global announcement: {msg}");
-
+ _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(message.Actor):player} has sent the following global announcement: {msg}");
return;
}
+
_chatSystem.DispatchStationAnnouncement(uid, msg, title, colorOverride: comp.Color);
- if (message.Session.AttachedEntity != null)
- _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(message.Session.AttachedEntity.Value):player} has sent the following station announcement: {msg}");
+ _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(message.Actor):player} has sent the following station announcement: {msg}");
+
}
private void OnBroadcastMessage(EntityUid uid, CommunicationsConsoleComponent component, CommunicationsConsoleBroadcastMessage message)
@@ -298,8 +294,7 @@ namespace Content.Server.Communications
_deviceNetworkSystem.QueuePacket(uid, null, payload, net.TransmitFrequency);
- if (message.Session.AttachedEntity != null)
- _adminLogger.Add(LogType.DeviceNetwork, LogImpact.Low, $"{ToPrettyString(message.Session.AttachedEntity.Value):player} has sent the following broadcast: {message.Message:msg}");
+ _adminLogger.Add(LogType.DeviceNetwork, LogImpact.Low, $"{ToPrettyString(message.Actor):player} has sent the following broadcast: {message.Message:msg}");
}
private void OnCallShuttleMessage(EntityUid uid, CommunicationsConsoleComponent comp, CommunicationsConsoleCallEmergencyShuttleMessage message)
@@ -307,12 +302,11 @@ namespace Content.Server.Communications
if (!CanCallOrRecall(comp))
return;
- if (message.Session.AttachedEntity is not { Valid: true } mob)
- return;
+ var mob = message.Actor;
if (!CanUse(mob, uid))
{
- _popupSystem.PopupEntity(Loc.GetString("comms-console-permission-denied"), uid, message.Session);
+ _popupSystem.PopupEntity(Loc.GetString("comms-console-permission-denied"), uid, message.Actor);
return;
}
@@ -320,7 +314,7 @@ namespace Content.Server.Communications
RaiseLocalEvent(ref ev);
if (ev.Cancelled)
{
- _popupSystem.PopupEntity(ev.Reason ?? Loc.GetString("comms-console-shuttle-unavailable"), uid, message.Session);
+ _popupSystem.PopupEntity(ev.Reason ?? Loc.GetString("comms-console-shuttle-unavailable"), uid, message.Actor);
return;
}
@@ -333,17 +327,14 @@ namespace Content.Server.Communications
if (!CanCallOrRecall(comp))
return;
- if (message.Session.AttachedEntity is not { Valid: true } mob)
- return;
-
- if (!CanUse(mob, uid))
+ if (!CanUse(message.Actor, uid))
{
- _popupSystem.PopupEntity(Loc.GetString("comms-console-permission-denied"), uid, message.Session);
+ _popupSystem.PopupEntity(Loc.GetString("comms-console-permission-denied"), uid, message.Actor);
return;
}
_roundEndSystem.CancelRoundEndCountdown(uid);
- _adminLogger.Add(LogType.Action, LogImpact.Extreme, $"{ToPrettyString(mob):player} has recalled the shuttle.");
+ _adminLogger.Add(LogType.Action, LogImpact.Extreme, $"{ToPrettyString(message.Actor):player} has recalled the shuttle.");
}
}
diff --git a/Content.Server/Configurable/ConfigurationSystem.cs b/Content.Server/Configurable/ConfigurationSystem.cs
index eb31149eca..2683bf4e09 100644
--- a/Content.Server/Configurable/ConfigurationSystem.cs
+++ b/Content.Server/Configurable/ConfigurationSystem.cs
@@ -30,10 +30,7 @@ public sealed class ConfigurationSystem : EntitySystem
if (!TryComp(args.Used, out ToolComponent? tool) || !tool.Qualities.Contains(component.QualityNeeded))
return;
- if (!TryComp(args.User, out ActorComponent? actor))
- return;
-
- args.Handled = _uiSystem.TryOpen(uid, ConfigurationUiKey.Key, actor.PlayerSession);
+ args.Handled = _uiSystem.TryOpenUi(uid, ConfigurationUiKey.Key, args.User);
}
private void OnStartup(EntityUid uid, ConfigurationComponent component, ComponentStartup args)
@@ -43,8 +40,8 @@ public sealed class ConfigurationSystem : EntitySystem
private void UpdateUi(EntityUid uid, ConfigurationComponent component)
{
- if (_uiSystem.TryGetUi(uid, ConfigurationUiKey.Key, out var ui))
- _uiSystem.SetUiState(ui, new ConfigurationBoundUserInterfaceState(component.Config));
+ if (_uiSystem.HasUi(uid, ConfigurationUiKey.Key))
+ _uiSystem.SetUiState(uid, ConfigurationUiKey.Key, new ConfigurationBoundUserInterfaceState(component.Config));
}
private void OnUpdate(EntityUid uid, ConfigurationComponent component, ConfigurationUpdatedMessage args)
diff --git a/Content.Server/Construction/ConstructionSystem.Guided.cs b/Content.Server/Construction/ConstructionSystem.Guided.cs
index fe7f9152c0..e096bc02c3 100644
--- a/Content.Server/Construction/ConstructionSystem.Guided.cs
+++ b/Content.Server/Construction/ConstructionSystem.Guided.cs
@@ -41,6 +41,18 @@ namespace Content.Server.Construction
component.Node == component.DeconstructionNode)
return;
+ if (!_prototypeManager.TryIndex(component.Graph, out ConstructionGraphPrototype? graph))
+ return;
+
+ if (component.DeconstructionNode == null)
+ return;
+
+ if (GetCurrentNode(uid, component) is not {} currentNode)
+ return;
+
+ if (graph.Path(currentNode.Name, component.DeconstructionNode) is not {} path || path.Length == 0)
+ return;
+
Verb verb = new();
//verb.Category = VerbCategories.Construction;
//TODO VERBS add more construction verbs? Until then, removing construction category
diff --git a/Content.Server/Crayon/CrayonSystem.cs b/Content.Server/Crayon/CrayonSystem.cs
index 32bb96e9e2..07a13d8a34 100644
--- a/Content.Server/Crayon/CrayonSystem.cs
+++ b/Content.Server/Crayon/CrayonSystem.cs
@@ -90,19 +90,14 @@ public sealed class CrayonSystem : SharedCrayonSystem
if (args.Handled)
return;
- if (!TryComp(args.User, out var actor) ||
- !_uiSystem.TryGetUi(uid, SharedCrayonComponent.CrayonUiKey.Key, out var ui))
+ if (!_uiSystem.HasUi(uid, SharedCrayonComponent.CrayonUiKey.Key))
{
return;
}
- _uiSystem.ToggleUi(ui, actor.PlayerSession);
- if (ui.SubscribedSessions.Contains(actor.PlayerSession))
- {
- // Tell the user interface the selected stuff
- _uiSystem.SetUiState(ui, new CrayonBoundUserInterfaceState(component.SelectedState, component.SelectableColor, component.Color));
- }
+ _uiSystem.TryToggleUi(uid, SharedCrayonComponent.CrayonUiKey.Key, args.User);
+ _uiSystem.SetUiState(uid, SharedCrayonComponent.CrayonUiKey.Key, new CrayonBoundUserInterfaceState(component.SelectedState, component.SelectableColor, component.Color));
args.Handled = true;
}
@@ -140,8 +135,8 @@ public sealed class CrayonSystem : SharedCrayonSystem
private void OnCrayonDropped(EntityUid uid, CrayonComponent component, DroppedEvent args)
{
- if (TryComp(args.User, out var actor))
- _uiSystem.TryClose(uid, SharedCrayonComponent.CrayonUiKey.Key, actor.PlayerSession);
+ // TODO: Use the existing event.
+ _uiSystem.CloseUi(uid, SharedCrayonComponent.CrayonUiKey.Key, args.User);
}
private void UseUpCrayon(EntityUid uid, EntityUid user)
diff --git a/Content.Server/CrewManifest/CrewManifestSystem.cs b/Content.Server/CrewManifest/CrewManifestSystem.cs
index 8b4cbac5c1..e742456015 100644
--- a/Content.Server/CrewManifest/CrewManifestSystem.cs
+++ b/Content.Server/CrewManifest/CrewManifestSystem.cs
@@ -100,12 +100,12 @@ public sealed class CrewManifestSystem : EntitySystem
return;
var owningStation = _stationSystem.GetOwningStation(uid);
- if (owningStation == null || ev.Session is not { } session)
+ if (owningStation == null || !TryComp(ev.Actor, out ActorComponent? actorComp))
{
return;
}
- CloseEui(owningStation.Value, session, uid);
+ CloseEui(owningStation.Value, actorComp.PlayerSession, uid);
}
///
@@ -136,12 +136,12 @@ public sealed class CrewManifestSystem : EntitySystem
{
Log.Error(
"{User} tried to open crew manifest from wrong UI: {Key}. Correct owned is {ExpectedKey}",
- msg.Session, msg.UiKey, component.OwnerKey);
+ msg.Actor, msg.UiKey, component.OwnerKey);
return;
}
var owningStation = _stationSystem.GetOwningStation(uid);
- if (owningStation == null || msg.Session is not { } session)
+ if (owningStation == null || !TryComp(msg.Actor, out ActorComponent? actorComp))
{
return;
}
@@ -151,7 +151,7 @@ public sealed class CrewManifestSystem : EntitySystem
return;
}
- OpenEui(owningStation.Value, session, uid);
+ OpenEui(owningStation.Value, actorComp.PlayerSession, uid);
}
///
diff --git a/Content.Server/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs b/Content.Server/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs
index fe53ea268c..4389c68c04 100644
--- a/Content.Server/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs
+++ b/Content.Server/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs
@@ -77,7 +77,7 @@ public sealed class CriminalRecordsConsoleSystem : SharedCriminalRecordsConsoleS
msg.Status == SecurityStatus.Suspected != (msg.Reason != null))
return;
- if (!CheckSelected(ent, msg.Session, out var mob, out var key))
+ if (!CheckSelected(ent, msg.Actor, out var mob, out var key))
return;
if (!_stationRecords.TryGetRecord(key.Value, out var record) || record.Status == msg.Status)
@@ -150,7 +150,7 @@ public sealed class CriminalRecordsConsoleSystem : SharedCriminalRecordsConsoleS
private void OnAddHistory(Entity ent, ref CriminalRecordAddHistory msg)
{
- if (!CheckSelected(ent, msg.Session, out _, out var key))
+ if (!CheckSelected(ent, msg.Actor, out _, out var key))
return;
var line = msg.Line.Trim();
@@ -167,7 +167,7 @@ public sealed class CriminalRecordsConsoleSystem : SharedCriminalRecordsConsoleS
private void OnDeleteHistory(Entity ent, ref CriminalRecordDeleteHistory msg)
{
- if (!CheckSelected(ent, msg.Session, out _, out var key))
+ if (!CheckSelected(ent, msg.Actor, out _, out var key))
return;
if (!_criminalRecords.TryDeleteHistory(key.Value, msg.Index))
@@ -185,7 +185,7 @@ public sealed class CriminalRecordsConsoleSystem : SharedCriminalRecordsConsoleS
if (!TryComp(owningStation, out var stationRecords))
{
- _ui.TrySetUiState(uid, CriminalRecordsConsoleKey.Key, new CriminalRecordsConsoleState());
+ _ui.SetUiState(uid, CriminalRecordsConsoleKey.Key, new CriminalRecordsConsoleState());
return;
}
@@ -201,24 +201,22 @@ public sealed class CriminalRecordsConsoleSystem : SharedCriminalRecordsConsoleS
state.SelectedKey = id;
}
- _ui.TrySetUiState(uid, CriminalRecordsConsoleKey.Key, state);
+ _ui.SetUiState(uid, CriminalRecordsConsoleKey.Key, state);
}
///
/// Boilerplate that most actions use, if they require that a record be selected.
/// Obviously shouldn't be used for selecting records.
///
- private bool CheckSelected(Entity ent, ICommonSession session,
+ private bool CheckSelected(Entity ent, EntityUid user,
[NotNullWhen(true)] out EntityUid? mob, [NotNullWhen(true)] out StationRecordKey? key)
{
key = null;
mob = null;
- if (session.AttachedEntity is not { } user)
- return false;
if (!_access.IsAllowed(user, ent))
{
- _popup.PopupEntity(Loc.GetString("criminal-records-permission-denied"), ent, session);
+ _popup.PopupEntity(Loc.GetString("criminal-records-permission-denied"), ent, user);
return false;
}
diff --git a/Content.Server/DeviceLinking/Systems/SignalTimerSystem.cs b/Content.Server/DeviceLinking/Systems/SignalTimerSystem.cs
index 0e214ee865..14e0c75d96 100644
--- a/Content.Server/DeviceLinking/Systems/SignalTimerSystem.cs
+++ b/Content.Server/DeviceLinking/Systems/SignalTimerSystem.cs
@@ -48,9 +48,9 @@ public sealed class SignalTimerSystem : EntitySystem
{
var time = TryComp(uid, out var active) ? active.TriggerTime : TimeSpan.Zero;
- if (_ui.TryGetUi(uid, SignalTimerUiKey.Key, out var bui))
+ if (_ui.HasUi(uid, SignalTimerUiKey.Key))
{
- _ui.SetUiState(bui, new SignalTimerBoundUserInterfaceState(component.Label,
+ _ui.SetUiState(uid, SignalTimerUiKey.Key, new SignalTimerBoundUserInterfaceState(component.Label,
TimeSpan.FromSeconds(component.Delay).Minutes.ToString("D2"),
TimeSpan.FromSeconds(component.Delay).Seconds.ToString("D2"),
component.CanEditLabel,
@@ -70,9 +70,9 @@ public sealed class SignalTimerSystem : EntitySystem
_audio.PlayPvs(signalTimer.DoneSound, uid);
_signalSystem.InvokePort(uid, signalTimer.TriggerPort);
- if (_ui.TryGetUi(uid, SignalTimerUiKey.Key, out var bui))
+ if (_ui.HasUi(uid, SignalTimerUiKey.Key))
{
- _ui.SetUiState(bui, new SignalTimerBoundUserInterfaceState(signalTimer.Label,
+ _ui.SetUiState(uid, SignalTimerUiKey.Key, new SignalTimerBoundUserInterfaceState(signalTimer.Label,
TimeSpan.FromSeconds(signalTimer.Delay).Minutes.ToString("D2"),
TimeSpan.FromSeconds(signalTimer.Delay).Seconds.ToString("D2"),
signalTimer.CanEditLabel,
@@ -117,10 +117,7 @@ public sealed class SignalTimerSystem : EntitySystem
/// The entity that is interacted with.
private bool IsMessageValid(EntityUid uid, BoundUserInterfaceMessage message)
{
- if (message.Session.AttachedEntity is not { Valid: true } mob)
- return false;
-
- if (!_accessReader.IsAllowed(mob, uid))
+ if (!_accessReader.IsAllowed(message.Actor, uid))
return false;
return true;
diff --git a/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs b/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs
index 02c6538158..3460124158 100644
--- a/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs
+++ b/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs
@@ -62,7 +62,6 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem
SubscribeLocalEvent(OnClearLinks);
SubscribeLocalEvent(OnToggleLinks);
SubscribeLocalEvent(OnConfigButtonPressed);
- SubscribeLocalEvent(OnUiOpenAttempt);
SubscribeLocalEvent(OnComponentRemoved);
}
@@ -89,7 +88,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem
continue;
//The network configurator is a handheld device. There can only ever be an ui session open for the player holding the device.
- _uiSystem.TryCloseAll(uid, NetworkConfiguratorUiKey.Configure);
+ _uiSystem.CloseUi(uid, NetworkConfiguratorUiKey.Configure);
}
}
@@ -215,7 +214,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem
private void OnComponentRemoved(EntityUid uid, DeviceListComponent component, ComponentRemove args)
{
- _uiSystem.TryCloseAll(uid, NetworkConfiguratorUiKey.Configure);
+ _uiSystem.CloseUi(uid, NetworkConfiguratorUiKey.Configure);
}
///
@@ -433,7 +432,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem
return;
- _uiSystem.TryOpen(configuratorUid, NetworkConfiguratorUiKey.Link, actor.PlayerSession);
+ _uiSystem.OpenUi(configuratorUid, NetworkConfiguratorUiKey.Link, actor.PlayerSession);
configurator.DeviceLinkTarget = targetUid;
@@ -464,7 +463,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem
var sinkAddress = Resolve(sinkUid, ref sinkNetworkComponent, false) ? sinkNetworkComponent.Address : "";
var state = new DeviceLinkUserInterfaceState(sources, sinks, links, sourceAddress, sinkAddress, defaults);
- _uiSystem.TrySetUiState(configuratorUid, NetworkConfiguratorUiKey.Link, state);
+ _uiSystem.SetUiState(configuratorUid, NetworkConfiguratorUiKey.Link, state);
}
///
@@ -478,7 +477,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem
if (Delay(configurator))
return;
- if (!targetUid.HasValue || !TryComp(userUid, out ActorComponent? actor) || !AccessCheck(targetUid.Value, userUid, configurator))
+ if (!targetUid.HasValue || !AccessCheck(targetUid.Value, userUid, configurator))
return;
if (!TryComp(targetUid, out DeviceListComponent? list))
@@ -488,14 +487,13 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem
configurator.ActiveDeviceList = targetUid;
Dirty(configuratorUid, configurator);
- if (!_uiSystem.TryGetUi(configuratorUid, NetworkConfiguratorUiKey.Configure, out var bui))
- return;
-
- if (_uiSystem.OpenUi(bui, actor.PlayerSession))
- _uiSystem.SetUiState(bui, new DeviceListUserInterfaceState(
+ if (_uiSystem.TryOpenUi(configuratorUid, NetworkConfiguratorUiKey.Configure, userUid))
+ {
+ _uiSystem.SetUiState(configuratorUid, NetworkConfiguratorUiKey.Configure, new DeviceListUserInterfaceState(
_deviceListSystem.GetDeviceList(configurator.ActiveDeviceList.Value)
.Select(v => (v.Key, MetaData(v.Value).EntityName)).ToHashSet()
));
+ }
}
///
@@ -523,8 +521,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem
component.Devices.Remove(invalidDevice);
}
- if (_uiSystem.TryGetUi(uid, NetworkConfiguratorUiKey.List, out var bui))
- _uiSystem.SetUiState(bui, new NetworkConfiguratorUserInterfaceState(devices));
+ _uiSystem.SetUiState(uid, NetworkConfiguratorUiKey.List, new NetworkConfiguratorUserInterfaceState(devices));
}
///
@@ -565,10 +562,10 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem
///
private void OnRemoveDevice(EntityUid uid, NetworkConfiguratorComponent component, NetworkConfiguratorRemoveDeviceMessage args)
{
- if (component.Devices.TryGetValue(args.Address, out var removedDevice) && args.Session.AttachedEntity != null)
+ if (component.Devices.TryGetValue(args.Address, out var removedDevice))
{
_adminLogger.Add(LogType.DeviceLinking, LogImpact.Low,
- $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} removed buffered device {ToPrettyString(removedDevice):subject} from {ToPrettyString(uid):tool}");
+ $"{ToPrettyString(args.Actor):actor} removed buffered device {ToPrettyString(removedDevice):subject} from {ToPrettyString(uid):tool}");
}
component.Devices.Remove(args.Address);
@@ -583,10 +580,8 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem
///
private void OnClearDevice(EntityUid uid, NetworkConfiguratorComponent component, NetworkConfiguratorClearDevicesMessage args)
{
- if (args.Session.AttachedEntity != null)
- _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low,
- $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} cleared buffered devices from {ToPrettyString(uid):tool}");
-
+ _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low,
+ $"{ToPrettyString(args.Actor):actor} cleared buffered devices from {ToPrettyString(uid):tool}");
ClearDevices(uid, component);
UpdateListUiState(uid, component);
@@ -609,9 +604,8 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem
if (!configurator.ActiveDeviceLink.HasValue || !configurator.DeviceLinkTarget.HasValue)
return;
- if (args.Session.AttachedEntity != null)
- _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low,
- $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} cleared links between {ToPrettyString(configurator.ActiveDeviceLink.Value):subject} and {ToPrettyString(configurator.DeviceLinkTarget.Value):subject2} with {ToPrettyString(uid):tool}");
+ _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low,
+ $"{ToPrettyString(args.Actor):actor} cleared links between {ToPrettyString(configurator.ActiveDeviceLink.Value):subject} and {ToPrettyString(configurator.DeviceLinkTarget.Value):subject2} with {ToPrettyString(uid):tool}");
if (HasComp(configurator.ActiveDeviceLink) && HasComp(configurator.DeviceLinkTarget))
{
@@ -649,7 +643,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem
if (TryComp(configurator.ActiveDeviceLink, out DeviceLinkSourceComponent? activeSource) && TryComp(configurator.DeviceLinkTarget, out DeviceLinkSinkComponent? targetSink))
{
_deviceLinkSystem.ToggleLink(
- args.Session.AttachedEntity,
+ args.Actor,
configurator.ActiveDeviceLink.Value,
configurator.DeviceLinkTarget.Value,
args.Source, args.Sink,
@@ -660,7 +654,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem
else if (TryComp(configurator.DeviceLinkTarget, out DeviceLinkSourceComponent? targetSource) && TryComp(configurator.ActiveDeviceLink, out DeviceLinkSinkComponent? activeSink))
{
_deviceLinkSystem.ToggleLink(
- args.Session.AttachedEntity,
+ args.Actor,
configurator.DeviceLinkTarget.Value,
configurator.ActiveDeviceLink.Value,
args.Source, args.Sink,
@@ -687,7 +681,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem
if (TryComp(configurator.ActiveDeviceLink, out DeviceLinkSourceComponent? activeSource) && TryComp(configurator.DeviceLinkTarget, out DeviceLinkSinkComponent? targetSink))
{
_deviceLinkSystem.SaveLinks(
- args.Session.AttachedEntity,
+ args.Actor,
configurator.ActiveDeviceLink.Value,
configurator.DeviceLinkTarget.Value,
args.Links,
@@ -705,7 +699,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem
else if (TryComp(configurator.DeviceLinkTarget, out DeviceLinkSourceComponent? targetSource) && TryComp(configurator.ActiveDeviceLink, out DeviceLinkSinkComponent? activeSink))
{
_deviceLinkSystem.SaveLinks(
- args.Session.AttachedEntity,
+ args.Actor,
configurator.DeviceLinkTarget.Value,
configurator.ActiveDeviceLink.Value,
args.Links,
@@ -735,29 +729,25 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem
switch (args.ButtonKey)
{
case NetworkConfiguratorButtonKey.Set:
- if (args.Session.AttachedEntity != null)
- _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low,
- $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} set device links to {ToPrettyString(component.ActiveDeviceList.Value):subject} with {ToPrettyString(uid):tool}");
+ _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low,
+ $"{ToPrettyString(args.Actor):actor} set device links to {ToPrettyString(component.ActiveDeviceList.Value):subject} with {ToPrettyString(uid):tool}");
result = _deviceListSystem.UpdateDeviceList(component.ActiveDeviceList.Value, new HashSet(component.Devices.Values));
break;
case NetworkConfiguratorButtonKey.Add:
- if (args.Session.AttachedEntity != null)
- _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low,
- $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} added device links to {ToPrettyString(component.ActiveDeviceList.Value):subject} with {ToPrettyString(uid):tool}");
+ _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low,
+ $"{ToPrettyString(args.Actor):actor} added device links to {ToPrettyString(component.ActiveDeviceList.Value):subject} with {ToPrettyString(uid):tool}");
result = _deviceListSystem.UpdateDeviceList(component.ActiveDeviceList.Value, new HashSet(component.Devices.Values), true);
break;
case NetworkConfiguratorButtonKey.Clear:
- if (args.Session.AttachedEntity != null)
- _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low,
- $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} cleared device links from {ToPrettyString(component.ActiveDeviceList.Value):subject} with {ToPrettyString(uid):tool}");
+ _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low,
+ $"{ToPrettyString(args.Actor):actor} cleared device links from {ToPrettyString(component.ActiveDeviceList.Value):subject} with {ToPrettyString(uid):tool}");
result = _deviceListSystem.UpdateDeviceList(component.ActiveDeviceList.Value, new HashSet());
break;
case NetworkConfiguratorButtonKey.Copy:
- if (args.Session.AttachedEntity != null)
- _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low,
- $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} copied devices from {ToPrettyString(component.ActiveDeviceList.Value):subject} to {ToPrettyString(uid):tool}");
+ _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low,
+ $"{ToPrettyString(args.Actor):actor} copied devices from {ToPrettyString(component.ActiveDeviceList.Value):subject} to {ToPrettyString(uid):tool}");
ClearDevices(uid, component);
@@ -783,8 +773,8 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem
_ => "error"
};
- _popupSystem.PopupCursor(Loc.GetString(resultText), args.Session, PopupType.Medium);
- _uiSystem.TrySetUiState(
+ _popupSystem.PopupCursor(Loc.GetString(resultText), args.Actor, PopupType.Medium);
+ _uiSystem.SetUiState(
uid,
NetworkConfiguratorUiKey.Configure,
new DeviceListUserInterfaceState(
diff --git a/Content.Server/Disposal/Mailing/MailingUnitSystem.cs b/Content.Server/Disposal/Mailing/MailingUnitSystem.cs
index 001abad3dc..8e9c9e4ba7 100644
--- a/Content.Server/Disposal/Mailing/MailingUnitSystem.cs
+++ b/Content.Server/Disposal/Mailing/MailingUnitSystem.cs
@@ -159,8 +159,7 @@ public sealed class MailingUnitSystem : EntitySystem
args.Handled = true;
UpdateTargetList(uid, component);
- if (_userInterfaceSystem.TryGetUi(uid, MailingUnitUiKey.Key, out var bui))
- _userInterfaceSystem.OpenUi(bui, actor.PlayerSession);
+ _userInterfaceSystem.OpenUi(uid, MailingUnitUiKey.Key, actor.PlayerSession);
}
///
@@ -178,8 +177,7 @@ public sealed class MailingUnitSystem : EntitySystem
return;
var state = new MailingUnitBoundUserInterfaceState(component.DisposalUnitInterfaceState, component.Target, component.TargetList, component.Tag);
- if (_userInterfaceSystem.TryGetUi(uid, MailingUnitUiKey.Key, out var bui))
- _userInterfaceSystem.SetUiState(bui, state);
+ _userInterfaceSystem.SetUiState(uid, MailingUnitUiKey.Key, state);
}
private void OnTargetSelected(EntityUid uid, MailingUnitComponent component, TargetSelectedMessage args)
diff --git a/Content.Server/Disposal/Tube/DisposalTubeSystem.cs b/Content.Server/Disposal/Tube/DisposalTubeSystem.cs
index 6c0bced53e..f0f6e9142c 100644
--- a/Content.Server/Disposal/Tube/DisposalTubeSystem.cs
+++ b/Content.Server/Disposal/Tube/DisposalTubeSystem.cs
@@ -101,8 +101,9 @@ namespace Content.Server.Disposal.Tube
/// A user interface message from the client.
private void OnUiAction(EntityUid uid, DisposalRouterComponent router, SharedDisposalRouterComponent.UiActionMessage msg)
{
- if (!EntityManager.EntityExists(msg.Session.AttachedEntity))
+ if (!EntityManager.EntityExists(msg.Actor))
return;
+
if (TryComp(uid, out var physBody) && physBody.BodyType != BodyType.Static)
return;
@@ -279,9 +280,9 @@ namespace Content.Server.Disposal.Tube
private void OnOpenTaggerUI(EntityUid uid, DisposalTaggerComponent tagger, BoundUIOpenedEvent args)
{
- if (_uiSystem.TryGetUi(uid, DisposalTaggerUiKey.Key, out var bui))
+ if (_uiSystem.HasUi(uid, DisposalTaggerUiKey.Key))
{
- _uiSystem.SetUiState(bui,
+ _uiSystem.SetUiState(uid, DisposalTaggerUiKey.Key,
new DisposalTaggerUserInterfaceState(tagger.Tag));
}
}
@@ -292,13 +293,9 @@ namespace Content.Server.Disposal.Tube
/// Returns a
private void UpdateRouterUserInterface(EntityUid uid, DisposalRouterComponent router)
{
- var bui = _uiSystem.GetUiOrNull(uid, DisposalRouterUiKey.Key);
- if (bui == null)
- return;
-
if (router.Tags.Count <= 0)
{
- _uiSystem.SetUiState(bui, new DisposalRouterUserInterfaceState(""));
+ _uiSystem.SetUiState(uid, DisposalRouterUiKey.Key, new DisposalRouterUserInterfaceState(""));
return;
}
@@ -312,7 +309,7 @@ namespace Content.Server.Disposal.Tube
taglist.Remove(taglist.Length - 2, 2);
- _uiSystem.SetUiState(bui, new DisposalRouterUserInterfaceState(taglist.ToString()));
+ _uiSystem.SetUiState(uid, DisposalRouterUiKey.Key, new DisposalRouterUserInterfaceState(taglist.ToString()));
}
private void OnAnchorChange(EntityUid uid, DisposalTubeComponent component, ref AnchorStateChangedEvent args)
diff --git a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs
index ba84546258..416e0744b5 100644
--- a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs
+++ b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs
@@ -143,6 +143,9 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem
return;
}
+ if (!CanInsert(uid, component, args.User))
+ return;
+
// Add verb to climb inside of the unit,
Verb verb = new()
{
@@ -219,7 +222,7 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem
#region UI Handlers
private void OnUiButtonPressed(EntityUid uid, SharedDisposalUnitComponent component, SharedDisposalUnitComponent.UiButtonPressedMessage args)
{
- if (args.Session.AttachedEntity is not { Valid: true } player)
+ if (args.Actor is not { Valid: true } player)
{
return;
}
@@ -235,7 +238,7 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem
_adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(player):player} hit flush button on {ToPrettyString(uid)}, it's now {(component.Engaged ? "on" : "off")}");
break;
case SharedDisposalUnitComponent.UiButton.Power:
- _power.TogglePower(uid, user: args.Session.AttachedEntity);
+ _power.TogglePower(uid, user: args.Actor);
break;
default:
throw new ArgumentOutOfRangeException($"{ToPrettyString(player):player} attempted to hit a nonexistant button on {ToPrettyString(uid)}");
@@ -268,7 +271,7 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem
}
args.Handled = true;
- _ui.TryOpen(uid, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, actor.PlayerSession);
+ _ui.OpenUi(uid, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, actor.PlayerSession);
}
private void OnAfterInteractUsing(EntityUid uid, SharedDisposalUnitComponent component, AfterInteractUsingEvent args)
@@ -597,7 +600,7 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem
var compState = GetState(uid, component);
var stateString = Loc.GetString($"disposal-unit-state-{compState}");
var state = new SharedDisposalUnitComponent.DisposalUnitBoundUserInterfaceState(Name(uid), stateString, EstimatedFullPressure(uid, component), powered, component.Engaged);
- _ui.TrySetUiState(uid, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, state);
+ _ui.SetUiState(uid, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, state);
var stateUpdatedEvent = new DisposalUnitUIStateUpdatedEvent(state);
RaiseLocalEvent(uid, stateUpdatedEvent);
@@ -802,10 +805,7 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem
QueueAutomaticEngage(uid, component);
- if (TryComp(inserted, out ActorComponent? actor))
- {
- _ui.TryClose(uid, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, actor.PlayerSession);
- }
+ _ui.CloseUi(uid, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, inserted);
// Maybe do pullable instead? Eh still fine.
Joints.RecursiveClearJoints(inserted);
diff --git a/Content.Server/Doors/Electronics/Systems/DoorElectronicsSystem.cs b/Content.Server/Doors/Electronics/Systems/DoorElectronicsSystem.cs
index 56e8bd50b3..af9ccadd91 100644
--- a/Content.Server/Doors/Electronics/Systems/DoorElectronicsSystem.cs
+++ b/Content.Server/Doors/Electronics/Systems/DoorElectronicsSystem.cs
@@ -39,7 +39,7 @@ public sealed class DoorElectronicsSystem : EntitySystem
}
var state = new DoorElectronicsConfigurationState(accesses);
- _uiSystem.TrySetUiState(uid, DoorElectronicsConfigurationUiKey.Key, state);
+ _uiSystem.SetUiState(uid, DoorElectronicsConfigurationUiKey.Key, state);
}
private void OnChangeConfiguration(
diff --git a/Content.Server/Extinguisher/FireExtinguisherComponent.cs b/Content.Server/Extinguisher/FireExtinguisherComponent.cs
index fe10b4a574..991fc76c62 100644
--- a/Content.Server/Extinguisher/FireExtinguisherComponent.cs
+++ b/Content.Server/Extinguisher/FireExtinguisherComponent.cs
@@ -3,7 +3,7 @@ using Robust.Shared.GameStates;
namespace Content.Server.Extinguisher;
-[NetworkedComponent, RegisterComponent]
+[RegisterComponent]
[Access(typeof(FireExtinguisherSystem))]
public sealed partial class FireExtinguisherComponent : SharedFireExtinguisherComponent
{
diff --git a/Content.Server/Eye/Blinding/ActivatableUIRequiresVisionSystem.cs b/Content.Server/Eye/Blinding/ActivatableUIRequiresVisionSystem.cs
index b51efc2f5e..7b937cf0d8 100644
--- a/Content.Server/Eye/Blinding/ActivatableUIRequiresVisionSystem.cs
+++ b/Content.Server/Eye/Blinding/ActivatableUIRequiresVisionSystem.cs
@@ -5,6 +5,7 @@ using Content.Shared.Eye.Blinding.Components;
using Content.Shared.Eye.Blinding.Systems;
using Robust.Shared.Player;
using Robust.Server.GameObjects;
+using Robust.Shared.Collections;
namespace Content.Server.Eye.Blinding;
@@ -37,24 +38,19 @@ public sealed class ActivatableUIRequiresVisionSystem : EntitySystem
if (!args.Blind)
return;
- if (!TryComp(uid, out var actor))
- return;
+ var toClose = new ValueList<(EntityUid Entity, Enum Key)>();
- var uiList = _userInterfaceSystem.GetAllUIsForSession(actor.PlayerSession);
- if (uiList == null)
- return;
-
- Queue closeList = new(); // foreach collection modified moment
-
- foreach (var ui in uiList)
+ foreach (var bui in _userInterfaceSystem.GetActorUis(uid))
{
- if (HasComp(ui.Owner))
- closeList.Enqueue(ui);
+ if (HasComp(bui.Entity))
+ {
+ toClose.Add(bui);
+ }
}
- foreach (var ui in closeList)
+ foreach (var bui in toClose)
{
- _userInterfaceSystem.CloseUi(ui, actor.PlayerSession);
+ _userInterfaceSystem.CloseUi(bui.Entity, bui.Key, uid);
}
}
}
diff --git a/Content.Server/Fax/FaxSystem.cs b/Content.Server/Fax/FaxSystem.cs
index 3ff139466f..f492595444 100644
--- a/Content.Server/Fax/FaxSystem.cs
+++ b/Content.Server/Fax/FaxSystem.cs
@@ -51,7 +51,7 @@ public sealed class FaxSystem : EntitySystem
///
[ValidatePrototypeId]
private const string DefaultPaperPrototypeId = "Paper";
-
+
[ValidatePrototypeId]
private const string OfficePaperPrototypeId = "PaperOffice";
@@ -318,7 +318,7 @@ public sealed class FaxSystem : EntitySystem
private void OnSendButtonPressed(EntityUid uid, FaxMachineComponent component, FaxSendMessage args)
{
- Send(uid, component, args.Session.AttachedEntity);
+ Send(uid, component, args.Actor);
}
private void OnRefreshButtonPressed(EntityUid uid, FaxMachineComponent component, FaxRefreshMessage args)
@@ -358,7 +358,7 @@ public sealed class FaxSystem : EntitySystem
component.SendTimeoutRemaining <= 0 &&
component.InsertingTimeRemaining <= 0;
var state = new FaxUiState(component.FaxName, component.KnownFaxes, canSend, canCopy, isPaperInserted, component.DestinationFaxAddress);
- _userInterface.TrySetUiState(uid, FaxUiKey.Key, state);
+ _userInterface.SetUiState(uid, FaxUiKey.Key, state);
}
///
@@ -410,19 +410,15 @@ public sealed class FaxSystem : EntitySystem
prototype = DefaultPaperPrototypeId;
var name = Loc.GetString("fax-machine-printed-paper-name");
-
+
var printout = new FaxPrintout(args.Content, name, prototype);
component.PrintingQueue.Enqueue(printout);
component.SendTimeoutRemaining += component.SendTimeout;
UpdateUserInterface(uid, component);
- if (args.Session.AttachedEntity != null)
- _adminLogger.Add(LogType.Action, LogImpact.Low,
- $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} added print job to {ToPrettyString(uid):tool} with text: {args.Content}");
- else
- _adminLogger.Add(LogType.Action, LogImpact.Low,
- $"Someone added print job to {ToPrettyString(uid):tool} with text: {args.Content}");
+ _adminLogger.Add(LogType.Action, LogImpact.Low,
+ $"{ToPrettyString(args.Actor):actor} added print job to {ToPrettyString(uid):tool} with text: {args.Content}");
}
///
@@ -457,9 +453,8 @@ public sealed class FaxSystem : EntitySystem
UpdateUserInterface(uid, component);
- if (args.Session.AttachedEntity != null)
- _adminLogger.Add(LogType.Action, LogImpact.Low,
- $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} added copy job to {ToPrettyString(uid):tool} with text: {ToPrettyString(component.PaperSlot.Item):subject}");
+ _adminLogger.Add(LogType.Action, LogImpact.Low,
+ $"{ToPrettyString(args.Actor):actor} added copy job to {ToPrettyString(uid):tool} with text: {ToPrettyString(component.PaperSlot.Item):subject}");
}
///
diff --git a/Content.Server/Fluids/EntitySystems/SpraySystem.cs b/Content.Server/Fluids/EntitySystems/SpraySystem.cs
index f7621aec62..40f19aff2b 100644
--- a/Content.Server/Fluids/EntitySystems/SpraySystem.cs
+++ b/Content.Server/Fluids/EntitySystems/SpraySystem.cs
@@ -144,7 +144,7 @@ public sealed class SpraySystem : EntitySystem
_audio.PlayPvs(entity.Comp.SpraySound, entity, entity.Comp.SpraySound.Params.WithVariation(0.125f));
- _useDelay.SetDelay((entity, useDelay), TimeSpan.FromSeconds(cooldownTime));
+ _useDelay.SetLength((entity, useDelay), TimeSpan.FromSeconds(cooldownTime));
_useDelay.TryResetDelay((entity, useDelay));
}
}
diff --git a/Content.Server/Forensics/Systems/ForensicScannerSystem.cs b/Content.Server/Forensics/Systems/ForensicScannerSystem.cs
index 729b7304fa..5e2a562577 100644
--- a/Content.Server/Forensics/Systems/ForensicScannerSystem.cs
+++ b/Content.Server/Forensics/Systems/ForensicScannerSystem.cs
@@ -52,8 +52,7 @@ namespace Content.Server.Forensics
component.PrintCooldown,
component.PrintReadyAt);
- if (!_uiSystem.TrySetUiState(uid, ForensicScannerUiKey.Key, state))
- Log.Warning($"{ToPrettyString(uid)} was unable to set UI state.");
+ _uiSystem.SetUiState(uid, ForensicScannerUiKey.Key, state);
}
private void OnDoAfter(EntityUid uid, ForensicScannerComponent component, DoAfterEvent args)
@@ -163,23 +162,14 @@ namespace Content.Server.Forensics
private void OpenUserInterface(EntityUid user, Entity scanner)
{
- if (!TryComp(user, out var actor))
- return;
-
UpdateUserInterface(scanner, scanner.Comp);
- _uiSystem.TryOpen(scanner, ForensicScannerUiKey.Key, actor.PlayerSession);
+ _uiSystem.OpenUi(scanner.Owner, ForensicScannerUiKey.Key, user);
}
private void OnPrint(EntityUid uid, ForensicScannerComponent component, ForensicScannerPrintMessage args)
{
- if (!args.Session.AttachedEntity.HasValue)
- {
- Log.Warning($"{ToPrettyString(uid)} got OnPrint without Session.AttachedEntity");
- return;
- }
-
- var user = args.Session.AttachedEntity.Value;
+ var user = args.Actor;
if (_gameTiming.CurTime < component.PrintReadyAt)
{
@@ -191,7 +181,7 @@ namespace Content.Server.Forensics
// Spawn a piece of paper.
var printed = EntityManager.SpawnEntity(component.MachineOutput, Transform(uid).Coordinates);
- _handsSystem.PickupOrDrop(args.Session.AttachedEntity, printed, checkActionBlocker: false);
+ _handsSystem.PickupOrDrop(args.Actor, printed, checkActionBlocker: false);
if (!HasComp(printed))
{
@@ -240,9 +230,6 @@ namespace Content.Server.Forensics
private void OnClear(EntityUid uid, ForensicScannerComponent component, ForensicScannerClearMessage args)
{
- if (!args.Session.AttachedEntity.HasValue)
- return;
-
component.Fingerprints = new();
component.Fibers = new();
component.DNAs = new();
diff --git a/Content.Server/GameTicking/GameTicker.RoundFlow.cs b/Content.Server/GameTicking/GameTicker.RoundFlow.cs
index 792d838169..83d8390dd4 100644
--- a/Content.Server/GameTicking/GameTicker.RoundFlow.cs
+++ b/Content.Server/GameTicking/GameTicker.RoundFlow.cs
@@ -245,7 +245,10 @@ namespace Content.Server.GameTicking
var origReadyPlayers = readyPlayers.ToArray();
if (!StartPreset(origReadyPlayers, force))
+ {
+ _startingRound = false;
return;
+ }
// MapInitialize *before* spawning players, our codebase is too shit to do it afterwards...
_mapManager.DoMapInitialize(DefaultMap);
diff --git a/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs
index ea5c9a830b..0db9d195dc 100644
--- a/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs
+++ b/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs
@@ -71,5 +71,5 @@ public sealed partial class TraitorRuleComponent : Component
public int StartingBalance = 20;
[DataField]
- public int MaxDifficulty = 20;
+ public int MaxDifficulty = 5;
}
diff --git a/Content.Server/GameTicking/Rules/GameRuleSystem.Utility.cs b/Content.Server/GameTicking/Rules/GameRuleSystem.Utility.cs
index 4534333417..27a9edbad7 100644
--- a/Content.Server/GameTicking/Rules/GameRuleSystem.Utility.cs
+++ b/Content.Server/GameTicking/Rules/GameRuleSystem.Utility.cs
@@ -16,6 +16,14 @@ public abstract partial class GameRuleSystem where T: IComponent
return EntityQueryEnumerator();
}
+ ///
+ /// Queries all gamerules, regardless of if they're active or not.
+ ///
+ protected EntityQueryEnumerator QueryAllRules()
+ {
+ return EntityQueryEnumerator();
+ }
+
///
/// Utility function for finding a random event-eligible station entity
///
diff --git a/Content.Server/GameTicking/Rules/GameRuleSystem.cs b/Content.Server/GameTicking/Rules/GameRuleSystem.cs
index bcad146c22..c167ae7b6c 100644
--- a/Content.Server/GameTicking/Rules/GameRuleSystem.cs
+++ b/Content.Server/GameTicking/Rules/GameRuleSystem.cs
@@ -34,8 +34,8 @@ public abstract partial class GameRuleSystem : EntitySystem where T : ICompon
if (args.Forced || args.Cancelled)
return;
- var query = QueryActiveRules();
- while (query.MoveNext(out var uid, out _, out _, out var gameRule))
+ var query = QueryAllRules();
+ while (query.MoveNext(out var uid, out _, out var gameRule))
{
var minPlayers = gameRule.MinPlayers;
if (args.Players.Length >= minPlayers)
diff --git a/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs b/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs
index 2f8b9dc927..232d24004b 100644
--- a/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs
+++ b/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs
@@ -344,7 +344,7 @@ public sealed class NukeopsRuleSystem : GameRuleSystem
var timeRemain = nukeops.WarNukieArriveDelay + Timing.CurTime;
ev.DeclaratorEntity.Comp.ShuttleDisabledTime = timeRemain;
- DistributeExtraTc(nukeops);
+ DistributeExtraTc((uid, nukeops));
}
}
}
@@ -371,7 +371,7 @@ public sealed class NukeopsRuleSystem : GameRuleSystem
return WarConditionStatus.YesWar;
}
- private void DistributeExtraTc(NukeopsRuleComponent nukieRule)
+ private void DistributeExtraTc(Entity nukieRule)
{
var enumerator = EntityQueryEnumerator();
while (enumerator.MoveNext(out var uid, out var component))
@@ -379,13 +379,13 @@ public sealed class NukeopsRuleSystem : GameRuleSystem
if (!_tag.HasTag(uid, NukeOpsUplinkTagPrototype))
continue;
- if (GetOutpost(uid) is not {} outpost)
+ if (GetOutpost(nukieRule.Owner) is not { } outpost)
continue;
if (Transform(uid).MapID != Transform(outpost).MapID) // Will receive bonus TC only on their start outpost
continue;
- _store.TryAddCurrency(new () { { TelecrystalCurrencyPrototype, nukieRule.WarTcAmountPerNukie } }, uid, component);
+ _store.TryAddCurrency(new () { { TelecrystalCurrencyPrototype, nukieRule.Comp.WarTcAmountPerNukie } }, uid, component);
var msg = Loc.GetString("store-currency-war-boost-given", ("target", uid));
_popupSystem.PopupEntity(msg, uid);
@@ -510,7 +510,7 @@ public sealed class NukeopsRuleSystem : GameRuleSystem
if (!Resolve(ent, ref ent.Comp, false))
return null;
- return ent.Comp.MapGrids.FirstOrNull();
+ return ent.Comp.MapGrids.Where(e => HasComp(e) && !HasComp(e)).FirstOrNull();
}
///
diff --git a/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs b/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs
index b778f7c645..083085fa0d 100644
--- a/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs
+++ b/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs
@@ -34,6 +34,7 @@ public sealed class ThiefRuleSystem : GameRuleSystem
//Generate objectives
GenerateObjectives(mindId, mind, ent);
+ _antag.SendBriefing(args.EntityUid, MakeBriefing(args.EntityUid), null, null);
}
private void GenerateObjectives(EntityUid mindId, MindComponent mind, ThiefRuleComponent thiefRule)
diff --git a/Content.Server/Gateway/Systems/GatewaySystem.cs b/Content.Server/Gateway/Systems/GatewaySystem.cs
index 7ebc751dd2..6ed28d71a7 100644
--- a/Content.Server/Gateway/Systems/GatewaySystem.cs
+++ b/Content.Server/Gateway/Systems/GatewaySystem.cs
@@ -129,7 +129,7 @@ public sealed class GatewaySystem : EntitySystem
unlockTime
);
- _ui.TrySetUiState(uid, GatewayUiKey.Key, state);
+ _ui.SetUiState(uid, GatewayUiKey.Key, state);
}
private void UpdateAppearance(EntityUid uid)
@@ -139,12 +139,14 @@ public sealed class GatewaySystem : EntitySystem
private void OnOpenPortal(EntityUid uid, GatewayComponent comp, GatewayOpenPortalMessage args)
{
- if (args.Session.AttachedEntity == null || GetNetEntity(uid) == args.Destination ||
+ if (GetNetEntity(uid) == args.Destination ||
!comp.Enabled || !comp.Interactable)
+ {
return;
+ }
// if the gateway has an access reader check it before allowing opening
- var user = args.Session.AttachedEntity.Value;
+ var user = args.Actor;
if (CheckAccess(user, uid, comp))
return;
diff --git a/Content.Server/Ghost/Roles/Components/GhostRoleMobSpawnerComponent.cs b/Content.Server/Ghost/Roles/Components/GhostRoleMobSpawnerComponent.cs
index 4cdab6ce07..6c2a6986fc 100644
--- a/Content.Server/Ghost/Roles/Components/GhostRoleMobSpawnerComponent.cs
+++ b/Content.Server/Ghost/Roles/Components/GhostRoleMobSpawnerComponent.cs
@@ -1,5 +1,4 @@
using Robust.Shared.Prototypes;
-using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
namespace Content.Server.Ghost.Roles.Components
{
@@ -10,17 +9,22 @@ namespace Content.Server.Ghost.Roles.Components
[Access(typeof(GhostRoleSystem))]
public sealed partial class GhostRoleMobSpawnerComponent : Component
{
- [ViewVariables(VVAccess.ReadWrite)] [DataField("deleteOnSpawn")]
+ [DataField]
public bool DeleteOnSpawn = true;
- [ViewVariables(VVAccess.ReadWrite)] [DataField("availableTakeovers")]
+ [DataField]
public int AvailableTakeovers = 1;
[ViewVariables]
public int CurrentTakeovers = 0;
- [ViewVariables(VVAccess.ReadWrite)]
- [DataField("prototype", customTypeSerializer: typeof(PrototypeIdSerializer))]
- public string? Prototype { get; private set; }
+ [DataField]
+ public EntProtoId? Prototype;
+
+ ///
+ /// If this ghostrole spawner has multiple selectable ghostrole prototypes.
+ ///
+ [DataField]
+ public List SelectablePrototypes = [];
}
}
diff --git a/Content.Server/Ghost/Roles/GhostRoleSystem.cs b/Content.Server/Ghost/Roles/GhostRoleSystem.cs
index 0649e68a31..e7495020c8 100644
--- a/Content.Server/Ghost/Roles/GhostRoleSystem.cs
+++ b/Content.Server/Ghost/Roles/GhostRoleSystem.cs
@@ -23,6 +23,10 @@ using Robust.Shared.Enums;
using Robust.Shared.Player;
using Robust.Shared.Random;
using Robust.Shared.Utility;
+using Content.Server.Popups;
+using Content.Shared.Verbs;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Collections;
namespace Content.Server.Ghost.Roles
{
@@ -37,6 +41,8 @@ namespace Content.Server.Ghost.Roles
[Dependency] private readonly TransformSystem _transform = default!;
[Dependency] private readonly SharedMindSystem _mindSystem = default!;
[Dependency] private readonly SharedRoleSystem _roleSystem = default!;
+ [Dependency] private readonly PopupSystem _popupSystem = default!;
+ [Dependency] private readonly IPrototypeManager _prototype = default!;
private uint _nextRoleIdentifier;
private bool _needsUpdateGhostRoleCount = true;
@@ -63,6 +69,7 @@ namespace Content.Server.Ghost.Roles
SubscribeLocalEvent(OnUnpaused);
SubscribeLocalEvent(OnSpawnerTakeRole);
SubscribeLocalEvent(OnTakeoverTakeRole);
+ SubscribeLocalEvent>(OnVerb);
_playerManager.PlayerStatusChanged += PlayerStatusChanged;
}
@@ -74,11 +81,11 @@ namespace Content.Server.Ghost.Roles
switch (args.NewMobState)
{
case MobState.Alive:
- {
- if (!ghostRole.Taken)
- RegisterGhostRole((component, ghostRole));
- break;
- }
+ {
+ if (!ghostRole.Taken)
+ RegisterGhostRole((component, ghostRole));
+ break;
+ }
case MobState.Critical:
case MobState.Dead:
UnregisterGhostRole((component, ghostRole));
@@ -100,11 +107,11 @@ namespace Content.Server.Ghost.Roles
public void OpenEui(ICommonSession session)
{
- if (session.AttachedEntity is not {Valid: true} attached ||
+ if (session.AttachedEntity is not { Valid: true } attached ||
!EntityManager.HasComponent(attached))
return;
- if(_openUis.ContainsKey(session))
+ if (_openUis.ContainsKey(session))
CloseEui(session);
var eui = _openUis[session] = new GhostRolesEui();
@@ -250,7 +257,7 @@ namespace Content.Server.Ghost.Roles
if (metaQuery.GetComponent(uid).EntityPaused)
continue;
- roles.Add(new GhostRoleInfo {Identifier = id, Name = role.RoleName, Description = role.RoleDescription, Rules = role.RoleRules, Requirements = role.Requirements});
+ roles.Add(new GhostRoleInfo { Identifier = id, Name = role.RoleName, Description = role.RoleDescription, Rules = role.RoleRules, Requirements = role.Requirements });
}
return roles.ToArray();
@@ -407,6 +414,63 @@ namespace Content.Server.Ghost.Roles
args.TookRole = true;
}
+
+ private void OnVerb(EntityUid uid, GhostRoleMobSpawnerComponent component, GetVerbsEvent args)
+ {
+ var prototypes = component.SelectablePrototypes;
+ if (prototypes.Count < 1)
+ return;
+
+ if (!args.CanAccess || !args.CanInteract || args.Hands == null)
+ return;
+
+ var verbs = new ValueList();
+
+ foreach (var prototypeID in prototypes)
+ {
+ if (_prototype.TryIndex(prototypeID, out var prototype))
+ {
+ var verb = CreateVerb(uid, component, args.User, prototype);
+ verbs.Add(verb);
+ }
+ }
+
+ args.Verbs.UnionWith(verbs);
+ }
+
+ private Verb CreateVerb(EntityUid uid, GhostRoleMobSpawnerComponent component, EntityUid userUid, GhostRolePrototype prototype)
+ {
+ var verbText = Loc.GetString(prototype.Name);
+
+ return new Verb()
+ {
+ Text = verbText,
+ Disabled = component.Prototype == prototype.EntityPrototype,
+ Category = VerbCategory.SelectType,
+ Act = () => SetMode(uid, prototype, verbText, component, userUid)
+ };
+ }
+
+ public void SetMode(EntityUid uid, GhostRolePrototype prototype, string verbText, GhostRoleMobSpawnerComponent? component, EntityUid? userUid = null)
+ {
+ if (!Resolve(uid, ref component))
+ return;
+
+ var ghostrolecomp = EnsureComp(uid);
+
+ component.Prototype = prototype.EntityPrototype;
+ ghostrolecomp.RoleName = verbText;
+ ghostrolecomp.RoleDescription = prototype.Description;
+ ghostrolecomp.RoleRules = prototype.Rules;
+
+ // Dirty(ghostrolecomp);
+
+ if (userUid != null)
+ {
+ var msg = Loc.GetString("ghostrole-spawner-select", ("mode", verbText));
+ _popupSystem.PopupEntity(msg, uid, userUid.Value);
+ }
+ }
}
[AnyCommand]
@@ -417,7 +481,7 @@ namespace Content.Server.Ghost.Roles
public string Help => $"{Command}";
public void Execute(IConsoleShell shell, string argStr, string[] args)
{
- if(shell.Player != null)
+ if (shell.Player != null)
EntitySystem.Get().OpenEui(shell.Player);
else
shell.WriteLine("You can only open the ghost roles UI on a client.");
diff --git a/Content.Server/Gravity/GravityGeneratorSystem.cs b/Content.Server/Gravity/GravityGeneratorSystem.cs
index b0c4bb56ff..8e4da75fac 100644
--- a/Content.Server/Gravity/GravityGeneratorSystem.cs
+++ b/Content.Server/Gravity/GravityGeneratorSystem.cs
@@ -131,13 +131,13 @@ namespace Content.Server.Gravity
}
private void SetSwitchedOn(EntityUid uid, GravityGeneratorComponent component, bool on,
- ApcPowerReceiverComponent? powerReceiver = null, ICommonSession? session = null)
+ ApcPowerReceiverComponent? powerReceiver = null, EntityUid? user = null)
{
if (!Resolve(uid, ref powerReceiver))
return;
- if (session is { AttachedEntity: { } })
- _adminLogger.Add(LogType.Action, on ? LogImpact.Medium : LogImpact.High, $"{session:player} set ${ToPrettyString(uid):target} to {(on ? "on" : "off")}");
+ if (user != null)
+ _adminLogger.Add(LogType.Action, on ? LogImpact.Medium : LogImpact.High, $"{ToPrettyString(user)} set ${ToPrettyString(uid):target} to {(on ? "on" : "off")}");
component.SwitchedOn = on;
UpdatePowerState(component, powerReceiver);
@@ -154,7 +154,7 @@ namespace Content.Server.Gravity
private void UpdateUI(Entity ent, float chargeRate)
{
var (_, component, powerReceiver) = ent;
- if (!_uiSystem.IsUiOpen(ent, SharedGravityGeneratorComponent.GravityGeneratorUiKey.Key))
+ if (!_uiSystem.IsUiOpen(ent.Owner, SharedGravityGeneratorComponent.GravityGeneratorUiKey.Key))
return;
var chargeTarget = chargeRate < 0 ? 0 : component.MaxCharge;
@@ -189,8 +189,8 @@ namespace Content.Server.Gravity
chargeEta
);
- _uiSystem.TrySetUiState(
- ent,
+ _uiSystem.SetUiState(
+ ent.Owner,
SharedGravityGeneratorComponent.GravityGeneratorUiKey.Key,
state);
@@ -209,9 +209,6 @@ namespace Content.Server.Gravity
private void OnInteractHand(EntityUid uid, GravityGeneratorComponent component, InteractHandEvent args)
{
- if (!EntityManager.TryGetComponent(args.User, out ActorComponent? actor))
- return;
-
ApcPowerReceiverComponent? powerReceiver = default!;
if (!Resolve(uid, ref powerReceiver))
return;
@@ -220,7 +217,7 @@ namespace Content.Server.Gravity
if (!component.Intact || powerReceiver.PowerReceived < component.IdlePowerUse)
return;
- _uiSystem.TryOpen(uid, SharedGravityGeneratorComponent.GravityGeneratorUiKey.Key, actor.PlayerSession);
+ _uiSystem.OpenUi(uid, SharedGravityGeneratorComponent.GravityGeneratorUiKey.Key, args.User);
component.NeedUIUpdate = true;
}
@@ -287,7 +284,7 @@ namespace Content.Server.Gravity
GravityGeneratorComponent component,
SharedGravityGeneratorComponent.SwitchGeneratorMessage args)
{
- SetSwitchedOn(uid, component, args.On, session:args.Session);
+ SetSwitchedOn(uid, component, args.On, user: args.Actor);
}
}
}
diff --git a/Content.Server/Humanoid/Systems/HumanoidAppearanceSystem.Modifier.cs b/Content.Server/Humanoid/Systems/HumanoidAppearanceSystem.Modifier.cs
index 336116e78b..7744d16151 100644
--- a/Content.Server/Humanoid/Systems/HumanoidAppearanceSystem.Modifier.cs
+++ b/Content.Server/Humanoid/Systems/HumanoidAppearanceSystem.Modifier.cs
@@ -32,8 +32,8 @@ public sealed partial class HumanoidAppearanceSystem
Icon = new SpriteSpecifier.Rsi(new("/Textures/Mobs/Customization/reptilian_parts.rsi"), "tail_smooth"),
Act = () =>
{
- _uiSystem.TryOpen(uid, HumanoidMarkingModifierKey.Key, actor.PlayerSession);
- _uiSystem.TrySetUiState(
+ _uiSystem.OpenUi(uid, HumanoidMarkingModifierKey.Key, actor.PlayerSession);
+ _uiSystem.SetUiState(
uid,
HumanoidMarkingModifierKey.Key,
new HumanoidMarkingModifierState(component.MarkingSet, component.Species,
@@ -48,8 +48,7 @@ public sealed partial class HumanoidAppearanceSystem
private void OnBaseLayersSet(EntityUid uid, HumanoidAppearanceComponent component,
HumanoidMarkingModifierBaseLayersSetMessage message)
{
- if (message.Session is not { } player
- || !_adminManager.HasAdminFlag(player, AdminFlags.Fun))
+ if (!_adminManager.HasAdminFlag(message.Actor, AdminFlags.Fun))
{
return;
}
@@ -67,7 +66,7 @@ public sealed partial class HumanoidAppearanceSystem
if (message.ResendState)
{
- _uiSystem.TrySetUiState(
+ _uiSystem.SetUiState(
uid,
HumanoidMarkingModifierKey.Key,
new HumanoidMarkingModifierState(component.MarkingSet, component.Species,
@@ -81,8 +80,7 @@ public sealed partial class HumanoidAppearanceSystem
private void OnMarkingsSet(EntityUid uid, HumanoidAppearanceComponent component,
HumanoidMarkingModifierMarkingSetMessage message)
{
- if (message.Session is not { } player
- || !_adminManager.HasAdminFlag(player, AdminFlags.Fun))
+ if (!_adminManager.HasAdminFlag(message.Actor, AdminFlags.Fun))
{
return;
}
@@ -92,7 +90,7 @@ public sealed partial class HumanoidAppearanceSystem
if (message.ResendState)
{
- _uiSystem.TrySetUiState(
+ _uiSystem.SetUiState(
uid,
HumanoidMarkingModifierKey.Key,
new HumanoidMarkingModifierState(component.MarkingSet, component.Species,
diff --git a/Content.Server/Instruments/InstrumentComponent.cs b/Content.Server/Instruments/InstrumentComponent.cs
index 1b7913386d..db9dbb375b 100644
--- a/Content.Server/Instruments/InstrumentComponent.cs
+++ b/Content.Server/Instruments/InstrumentComponent.cs
@@ -1,6 +1,7 @@
using Content.Server.UserInterface;
using Content.Shared.Instruments;
using Robust.Shared.Player;
+using ActivatableUIComponent = Content.Shared.UserInterface.ActivatableUIComponent;
namespace Content.Server.Instruments;
@@ -16,9 +17,9 @@ public sealed partial class InstrumentComponent : SharedInstrumentComponent
[ViewVariables] public uint LastSequencerTick = 0;
// TODO Instruments: Make this ECS
- public ICommonSession? InstrumentPlayer =>
+ public EntityUid? InstrumentPlayer =>
_entMan.GetComponentOrNull(Owner)?.CurrentSingleUser
- ?? _entMan.GetComponentOrNull(Owner)?.PlayerSession;
+ ?? _entMan.GetComponentOrNull(Owner)?.PlayerSession.AttachedEntity;
}
[RegisterComponent]
diff --git a/Content.Server/Instruments/InstrumentSystem.cs b/Content.Server/Instruments/InstrumentSystem.cs
index 8dd9644e3c..f5a6713886 100644
--- a/Content.Server/Instruments/InstrumentSystem.cs
+++ b/Content.Server/Instruments/InstrumentSystem.cs
@@ -111,7 +111,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem
if (!TryComp(uid, out InstrumentComponent? instrument))
return;
- if (args.SenderSession != instrument.InstrumentPlayer)
+ if (args.SenderSession.AttachedEntity != instrument.InstrumentPlayer)
return;
instrument.Playing = true;
@@ -125,7 +125,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem
if (!TryComp(uid, out InstrumentComponent? instrument))
return;
- if (args.SenderSession != instrument.InstrumentPlayer)
+ if (args.SenderSession.AttachedEntity != instrument.InstrumentPlayer)
return;
Clean(uid, instrument);
@@ -142,7 +142,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem
if (!TryComp(uid, out InstrumentComponent? instrument))
return;
- if (args.SenderSession != instrument.InstrumentPlayer)
+ if (args.SenderSession.AttachedEntity != instrument.InstrumentPlayer)
return;
if (master != null)
@@ -174,7 +174,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem
if (!TryComp(uid, out InstrumentComponent? instrument))
return;
- if (args.SenderSession != instrument.InstrumentPlayer)
+ if (args.SenderSession.AttachedEntity != instrument.InstrumentPlayer)
return;
if (msg.Channel == RobustMidiEvent.PercussionChannel && !instrument.AllowPercussion)
@@ -194,8 +194,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem
private void OnBoundUIClosed(EntityUid uid, InstrumentComponent component, BoundUIClosedEvent args)
{
if (HasComp(uid)
- && _bui.TryGetUi(uid, args.UiKey, out var bui)
- && bui.SubscribedSessions.Count == 0)
+ && !_bui.IsUiOpen(uid, args.UiKey))
{
RemComp(uid);
}
@@ -232,7 +231,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem
var instrumentQuery = EntityManager.GetEntityQuery();
if (!TryComp(uid, out InstrumentComponent? originInstrument)
- || originInstrument.InstrumentPlayer?.AttachedEntity is not {} originPlayer)
+ || originInstrument.InstrumentPlayer is not {} originPlayer)
return Array.Empty<(NetEntity, string)>();
// It's probably faster to get all possible active instruments than all entities in range
@@ -247,7 +246,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem
continue;
// We want to use the instrument player's name.
- if (instrument.InstrumentPlayer?.AttachedEntity is not {} playerUid)
+ if (instrument.InstrumentPlayer is not {} playerUid)
continue;
// Maybe a bit expensive but oh well GetBands is queued and has a timer anyway.
@@ -298,7 +297,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem
return;
if (!instrument.Playing
- || args.SenderSession != instrument.InstrumentPlayer
+ || args.SenderSession.AttachedEntity != instrument.InstrumentPlayer
|| instrument.InstrumentPlayer == null
|| args.SenderSession.AttachedEntity is not { } attached)
{
@@ -374,8 +373,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem
var entity = GetEntity(request.Entity);
var nearby = GetBands(entity);
- _bui.TrySendUiMessage(entity, request.UiKey, new InstrumentBandResponseBuiMessage(nearby),
- request.Session);
+ _bui.ServerSendUiMessage(entity, request.UiKey, new InstrumentBandResponseBuiMessage(nearby), request.Actor);
}
_bandRequestQueue.Clear();
@@ -413,7 +411,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem
(instrument.BatchesDropped >= MaxMidiBatchesDropped
|| instrument.LaggedBatches >= MaxMidiLaggedBatches))
{
- if (instrument.InstrumentPlayer?.AttachedEntity is {Valid: true} mob)
+ if (instrument.InstrumentPlayer is {Valid: true} mob)
{
_stuns.TryParalyze(mob, TimeSpan.FromSeconds(1), true);
@@ -423,7 +421,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem
// Just in case
Clean(uid);
- _bui.TryCloseAll(uid, InstrumentUiKey.Key);
+ _bui.CloseUi(uid, InstrumentUiKey.Key);
}
instrument.Timer += frameTime;
@@ -437,13 +435,12 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem
}
}
- public void ToggleInstrumentUi(EntityUid uid, ICommonSession session, InstrumentComponent? component = null)
+ public void ToggleInstrumentUi(EntityUid uid, EntityUid actor, InstrumentComponent? component = null)
{
if (!Resolve(uid, ref component))
return;
- if (_bui.TryGetUi(uid, InstrumentUiKey.Key, out var bui))
- _bui.ToggleUi(bui, session);
+ _bui.TryToggleUi(uid, InstrumentUiKey.Key, actor);
}
public override bool ResolveInstrument(EntityUid uid, ref SharedInstrumentComponent? component)
diff --git a/Content.Server/Interaction/InteractionSystem.cs b/Content.Server/Interaction/InteractionSystem.cs
index 203781bcda..4eac7e9ef1 100644
--- a/Content.Server/Interaction/InteractionSystem.cs
+++ b/Content.Server/Interaction/InteractionSystem.cs
@@ -16,13 +16,6 @@ namespace Content.Server.Interaction
[Dependency] private readonly SharedContainerSystem _container = default!;
[Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
- public override void Initialize()
- {
- base.Initialize();
-
- SubscribeLocalEvent(HandleUserInterfaceRangeCheck);
- }
-
public override bool CanAccessViaStorage(EntityUid user, EntityUid target)
{
if (Deleted(target))
@@ -37,26 +30,8 @@ namespace Content.Server.Interaction
if (storage.Container?.ID != container.ID)
return false;
- if (!TryComp(user, out ActorComponent? actor))
- return false;
-
// we don't check if the user can access the storage entity itself. This should be handed by the UI system.
- return _uiSystem.SessionHasOpenUi(container.Owner, StorageComponent.StorageUiKey.Key, actor.PlayerSession);
- }
-
- private void HandleUserInterfaceRangeCheck(ref BoundUserInterfaceCheckRangeEvent ev)
- {
- if (ev.Player.AttachedEntity is not { } user || ev.Result == BoundUserInterfaceRangeResult.Fail)
- return;
-
- if (InRangeUnobstructed(user, ev.Target, ev.UserInterface.InteractionRange))
- {
- ev.Result = BoundUserInterfaceRangeResult.Pass;
- }
- else
- {
- ev.Result = BoundUserInterfaceRangeResult.Fail;
- }
+ return _uiSystem.IsUiOpen(container.Owner, StorageComponent.StorageUiKey.Key, user);
}
}
}
diff --git a/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs b/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs
index 212383c463..fa5c5dad2a 100644
--- a/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs
+++ b/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs
@@ -79,7 +79,7 @@ namespace Content.Server.Kitchen.EntitySystems
SubscribeLocalEvent(OnSignalReceived);
- SubscribeLocalEvent((u, c, m) => Wzhzhzh(u, c, m.Session.AttachedEntity));
+ SubscribeLocalEvent((u, c, m) => Wzhzhzh(u, c, m.Actor));
SubscribeLocalEvent(OnEjectMessage);
SubscribeLocalEvent(OnEjectIndex);
SubscribeLocalEvent(OnSelectTime);
@@ -355,11 +355,7 @@ namespace Content.Server.Kitchen.EntitySystems
public void UpdateUserInterfaceState(EntityUid uid, MicrowaveComponent component)
{
- var ui = _userInterface.GetUiOrNull(uid, MicrowaveUiKey.Key);
- if (ui == null)
- return;
-
- _userInterface.SetUiState(ui, new MicrowaveUpdateUserInterfaceState(
+ _userInterface.SetUiState(uid, MicrowaveUiKey.Key, new MicrowaveUpdateUserInterfaceState(
GetNetEntityArray(component.Storage.ContainedEntities.ToArray()),
HasComp(uid),
component.CurrentCookTimeButtonIndex,
diff --git a/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs b/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs
index e8ee453986..81001f0932 100644
--- a/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs
+++ b/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs
@@ -127,7 +127,7 @@ namespace Content.Server.Kitchen.EntitySystems
_solutionContainersSystem.TryAddSolution(containerSoln.Value, solution);
}
- _userInterfaceSystem.TrySendUiMessage(uid, ReagentGrinderUiKey.Key,
+ _userInterfaceSystem.ServerSendUiMessage(uid, ReagentGrinderUiKey.Key,
new ReagentGrinderWorkCompleteMessage());
UpdateUiState(uid);
@@ -228,7 +228,7 @@ namespace Content.Server.Kitchen.EntitySystems
GetNetEntityArray(inputContainer.ContainedEntities.ToArray()),
containerSolution?.Contents.ToArray()
);
- _userInterfaceSystem.TrySetUiState(uid, ReagentGrinderUiKey.Key, state);
+ _userInterfaceSystem.SetUiState(uid, ReagentGrinderUiKey.Key, state);
}
private void OnStartMessage(Entity entity, ref ReagentGrinderStartMessage message)
@@ -305,7 +305,7 @@ namespace Content.Server.Kitchen.EntitySystems
reagentGrinder.AudioStream = _audioSystem.PlayPvs(sound, uid,
AudioParams.Default.WithPitchScale(1 / reagentGrinder.WorkTimeMultiplier)).Value.Entity; //slightly higher pitched
- _userInterfaceSystem.TrySendUiMessage(uid, ReagentGrinderUiKey.Key,
+ _userInterfaceSystem.ServerSendUiMessage(uid, ReagentGrinderUiKey.Key,
new ReagentGrinderWorkStartedMessage(program));
}
diff --git a/Content.Server/Labels/Label/HandLabelerSystem.cs b/Content.Server/Labels/Label/HandLabelerSystem.cs
index dc7b9de0f8..84c41b0db5 100644
--- a/Content.Server/Labels/Label/HandLabelerSystem.cs
+++ b/Content.Server/Labels/Label/HandLabelerSystem.cs
@@ -90,7 +90,7 @@ namespace Content.Server.Labels
private void OnHandLabelerLabelChanged(EntityUid uid, HandLabelerComponent handLabeler, HandLabelerLabelChangedMessage args)
{
- if (args.Session.AttachedEntity is not {Valid: true} player)
+ if (args.Actor is not {Valid: true} player)
return;
var label = args.Label.Trim();
@@ -109,7 +109,7 @@ namespace Content.Server.Labels
if (!Resolve(uid, ref handLabeler))
return;
- _userInterfaceSystem.TrySetUiState(uid, HandLabelerUiKey.Key,
+ _userInterfaceSystem.SetUiState(uid, HandLabelerUiKey.Key,
new HandLabelerBoundUserInterfaceState(handLabeler.AssignedLabel));
}
}
diff --git a/Content.Server/Lathe/LatheSystem.cs b/Content.Server/Lathe/LatheSystem.cs
index 06d1b463ec..f56737a5a5 100644
--- a/Content.Server/Lathe/LatheSystem.cs
+++ b/Content.Server/Lathe/LatheSystem.cs
@@ -226,11 +226,10 @@ namespace Content.Server.Lathe
if (!Resolve(uid, ref component))
return;
- var ui = _uiSys.GetUi(uid, LatheUiKey.Key);
var producing = component.CurrentRecipe ?? component.Queue.FirstOrDefault();
var state = new LatheUpdateState(GetAvailableRecipes(uid, component), component.Queue, producing);
- _uiSys.SetUiState(ui, state);
+ _uiSys.SetUiState(uid, LatheUiKey.Key, state);
}
private void OnGetRecipes(EntityUid uid, TechnologyDatabaseComponent component, LatheGetRecipesEvent args)
@@ -337,10 +336,10 @@ namespace Content.Server.Lathe
else
break;
}
- if (count > 0 && args.Session.AttachedEntity != null)
+ if (count > 0)
{
_adminLogger.Add(LogType.Action, LogImpact.Low,
- $"{ToPrettyString(args.Session.AttachedEntity.Value):player} queued {count} {recipe.Name} at {ToPrettyString(uid):lathe}");
+ $"{ToPrettyString(args.Actor):player} queued {count} {recipe.Name} at {ToPrettyString(uid):lathe}");
}
}
TryStartProducing(uid, component);
diff --git a/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs b/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs
index dfe398ebaf..04f8e2eb54 100644
--- a/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs
+++ b/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs
@@ -3,6 +3,7 @@ using Content.Server.Popups;
using Content.Shared.UserInterface;
using Content.Shared.Lock;
using Content.Server.UserInterface;
+using ActivatableUISystem = Content.Shared.UserInterface.ActivatableUISystem;
namespace Content.Server.Lock.EntitySystems;
public sealed class ActivatableUIRequiresLockSystem : EntitySystem
diff --git a/Content.Server/MagicMirror/MagicMirrorSystem.cs b/Content.Server/MagicMirror/MagicMirrorSystem.cs
index 9ffd9a07a9..84f1f1c3e5 100644
--- a/Content.Server/MagicMirror/MagicMirrorSystem.cs
+++ b/Content.Server/MagicMirror/MagicMirrorSystem.cs
@@ -16,13 +16,12 @@ namespace Content.Server.MagicMirror;
///
/// Allows humanoids to change their appearance mid-round.
///
-public sealed class MagicMirrorSystem : EntitySystem
+public sealed class MagicMirrorSystem : SharedMagicMirrorSystem
{
[Dependency] private readonly SharedAudioSystem _audio = default!;
[Dependency] private readonly DoAfterSystem _doAfterSystem = default!;
[Dependency] private readonly MarkingManager _markings = default!;
[Dependency] private readonly HumanoidAppearanceSystem _humanoid = default!;
- [Dependency] private readonly SharedInteractionSystem _interaction = default!;
[Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
public override void Initialize()
@@ -32,7 +31,7 @@ public sealed class MagicMirrorSystem : EntitySystem
Subs.BuiEvents(MagicMirrorUiKey.Key, subs =>
{
- subs.Event(OnUIClosed);
+ subs.Event(OnUiClosed);
subs.Event(OnMagicMirrorSelect);
subs.Event(OnTryMagicMirrorChangeColor);
subs.Event(OnTryMagicMirrorAddSlot);
@@ -45,16 +44,6 @@ public sealed class MagicMirrorSystem : EntitySystem
SubscribeLocalEvent(OnChangeColorDoAfter);
SubscribeLocalEvent(OnRemoveSlotDoAfter);
SubscribeLocalEvent(OnAddSlotDoAfter);
-
- SubscribeLocalEvent(OnMirrorRangeCheck);
- }
-
- private void OnMirrorRangeCheck(EntityUid uid, MagicMirrorComponent component, ref BoundUserInterfaceCheckRangeEvent args)
- {
- if (!Exists(component.Target) || !_interaction.InRangeUnobstructed(uid, component.Target.Value))
- {
- args.Result = BoundUserInterfaceRangeResult.Fail;
- }
}
private void OnMagicMirrorInteract(Entity mirror, ref AfterInteractEvent args)
@@ -62,10 +51,7 @@ public sealed class MagicMirrorSystem : EntitySystem
if (!args.CanReach || args.Target == null)
return;
- if (!TryComp(args.User, out var actor))
- return;
-
- if (!_uiSystem.TryOpen(mirror.Owner, MagicMirrorUiKey.Key, actor.PlayerSession))
+ if (!_uiSystem.TryOpenUi(mirror.Owner, MagicMirrorUiKey.Key, args.User))
return;
UpdateInterface(mirror.Owner, args.Target.Value, mirror.Comp);
@@ -79,7 +65,7 @@ public sealed class MagicMirrorSystem : EntitySystem
private void OnMagicMirrorSelect(EntityUid uid, MagicMirrorComponent component, MagicMirrorSelectMessage message)
{
- if (component.Target is not { } target || message.Session.AttachedEntity is not { } user)
+ if (component.Target is not { } target)
return;
_doAfterSystem.Cancel(component.DoAfter);
@@ -92,7 +78,7 @@ public sealed class MagicMirrorSystem : EntitySystem
Marking = message.Marking,
};
- _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.SelectSlotTime, doAfter, uid, target: target, used: uid)
+ _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, message.Actor, component.SelectSlotTime, doAfter, uid, target: target, used: uid)
{
DistanceThreshold = SharedInteractionSystem.InteractionRange,
BreakOnDamage = true,
@@ -134,7 +120,7 @@ public sealed class MagicMirrorSystem : EntitySystem
private void OnTryMagicMirrorChangeColor(EntityUid uid, MagicMirrorComponent component, MagicMirrorChangeColorMessage message)
{
- if (component.Target is not { } target || message.Session.AttachedEntity is not { } user)
+ if (component.Target is not { } target)
return;
_doAfterSystem.Cancel(component.DoAfter);
@@ -147,7 +133,7 @@ public sealed class MagicMirrorSystem : EntitySystem
Colors = message.Colors,
};
- _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.ChangeSlotTime, doAfter, uid, target: target, used: uid)
+ _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, message.Actor, component.ChangeSlotTime, doAfter, uid, target: target, used: uid)
{
BreakOnDamage = true,
BreakOnMove = true,
@@ -187,7 +173,7 @@ public sealed class MagicMirrorSystem : EntitySystem
private void OnTryMagicMirrorRemoveSlot(EntityUid uid, MagicMirrorComponent component, MagicMirrorRemoveSlotMessage message)
{
- if (component.Target is not { } target || message.Session.AttachedEntity is not { } user)
+ if (component.Target is not { } target)
return;
_doAfterSystem.Cancel(component.DoAfter);
@@ -199,7 +185,7 @@ public sealed class MagicMirrorSystem : EntitySystem
Slot = message.Slot,
};
- _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.RemoveSlotTime, doAfter, uid, target: target, used: uid)
+ _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, message.Actor, component.RemoveSlotTime, doAfter, uid, target: target, used: uid)
{
DistanceThreshold = SharedInteractionSystem.InteractionRange,
BreakOnDamage = true,
@@ -243,9 +229,6 @@ public sealed class MagicMirrorSystem : EntitySystem
if (component.Target == null)
return;
- if (message.Session.AttachedEntity == null)
- return;
-
_doAfterSystem.Cancel(component.DoAfter);
component.DoAfter = null;
@@ -254,7 +237,7 @@ public sealed class MagicMirrorSystem : EntitySystem
Category = message.Category,
};
- _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, message.Session.AttachedEntity.Value, component.AddSlotTime, doAfter, uid, target: component.Target.Value, used: uid)
+ _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, message.Actor, component.AddSlotTime, doAfter, uid, target: component.Target.Value, used: uid)
{
BreakOnDamage = true,
BreakOnMove = true,
@@ -315,12 +298,15 @@ public sealed class MagicMirrorSystem : EntitySystem
facialHair,
humanoid.MarkingSet.PointsLeft(MarkingCategories.FacialHair) + facialHair.Count);
+ // TODO: Component states
component.Target = targetUid;
- _uiSystem.TrySetUiState(mirrorUid, MagicMirrorUiKey.Key, state);
+ _uiSystem.SetUiState(mirrorUid, MagicMirrorUiKey.Key, state);
+ Dirty(mirrorUid, component);
}
- private void OnUIClosed(Entity ent, ref BoundUIClosedEvent args)
+ private void OnUiClosed(Entity ent, ref BoundUIClosedEvent args)
{
ent.Comp.Target = null;
+ Dirty(ent);
}
}
diff --git a/Content.Server/MassMedia/Systems/NewsSystem.cs b/Content.Server/MassMedia/Systems/NewsSystem.cs
index 2b18b57ff8..0fb5d42394 100644
--- a/Content.Server/MassMedia/Systems/NewsSystem.cs
+++ b/Content.Server/MassMedia/Systems/NewsSystem.cs
@@ -92,15 +92,12 @@ public sealed class NewsSystem : SharedNewsSystem
if (msg.ArticleNum >= articles.Count)
return;
- if (msg.Session.AttachedEntity is not { } actor)
- return;
-
var article = articles[msg.ArticleNum];
- if (CheckDeleteAccess(article, ent, actor))
+ if (CheckDeleteAccess(article, ent, msg.Actor))
{
_adminLogger.Add(
LogType.Chat, LogImpact.Medium,
- $"{ToPrettyString(actor):actor} deleted news article {article.Title} by {article.Author}: {article.Content}"
+ $"{ToPrettyString(msg.Actor):actor} deleted news article {article.Title} by {article.Author}: {article.Content}"
);
articles.RemoveAt(msg.ArticleNum);
@@ -138,14 +135,11 @@ public sealed class NewsSystem : SharedNewsSystem
if (!TryGetArticles(ent, out var articles))
return;
- if (msg.Session.AttachedEntity is not { } author)
- return;
-
- if (!_accessReader.FindStationRecordKeys(author, out _))
+ if (!_accessReader.FindStationRecordKeys(msg.Actor, out _))
return;
string? authorName = null;
- if (_idCardSystem.TryFindIdCard(author, out var idCard))
+ if (_idCardSystem.TryFindIdCard(msg.Actor, out var idCard))
authorName = idCard.Comp.FullName;
var title = msg.Title.Trim();
@@ -164,7 +158,7 @@ public sealed class NewsSystem : SharedNewsSystem
_adminLogger.Add(
LogType.Chat,
LogImpact.Medium,
- $"{ToPrettyString(author):actor} created news article {article.Title} by {article.Author}: {article.Content}"
+ $"{ToPrettyString(msg.Actor):actor} created news article {article.Title} by {article.Author}: {article.Content}"
);
articles.Add(article);
@@ -248,14 +242,14 @@ public sealed class NewsSystem : SharedNewsSystem
private void UpdateWriterUi(Entity ent)
{
- if (!_ui.TryGetUi(ent, NewsWriterUiKey.Key, out var ui))
+ if (!_ui.HasUi(ent, NewsWriterUiKey.Key))
return;
if (!TryGetArticles(ent, out var articles))
return;
var state = new NewsWriterBoundUserInterfaceState(articles.ToArray(), ent.Comp.PublishEnabled, ent.Comp.NextPublish);
- _ui.SetUiState(ui, state);
+ _ui.SetUiState(ent.Owner, NewsWriterUiKey.Key, state);
}
private void UpdateReaderUi(Entity ent, EntityUid loaderUid)
diff --git a/Content.Server/Mech/Systems/MechSystem.cs b/Content.Server/Mech/Systems/MechSystem.cs
index 9e546dc33f..53c6c62cdb 100644
--- a/Content.Server/Mech/Systems/MechSystem.cs
+++ b/Content.Server/Mech/Systems/MechSystem.cs
@@ -303,15 +303,14 @@ public sealed partial class MechSystem : SharedMechSystem
{
EquipmentStates = ev.States
};
- var ui = _ui.GetUi(uid, MechUiKey.Key);
- _ui.SetUiState(ui, state);
+ _ui.SetUiState(uid, MechUiKey.Key, state);
}
public override void BreakMech(EntityUid uid, MechComponent? component = null)
{
base.BreakMech(uid, component);
- _ui.TryCloseAll(uid, MechUiKey.Key);
+ _ui.CloseUi(uid, MechUiKey.Key);
_actionBlocker.UpdateCanMove(uid);
}
diff --git a/Content.Server/Medical/CrewMonitoring/CrewMonitoringConsoleSystem.cs b/Content.Server/Medical/CrewMonitoring/CrewMonitoringConsoleSystem.cs
index ff02b9cbdf..a53df6dbae 100644
--- a/Content.Server/Medical/CrewMonitoring/CrewMonitoringConsoleSystem.cs
+++ b/Content.Server/Medical/CrewMonitoring/CrewMonitoringConsoleSystem.cs
@@ -58,7 +58,7 @@ public sealed class CrewMonitoringConsoleSystem : EntitySystem
if (!Resolve(uid, ref component))
return;
- if (!_uiSystem.TryGetUi(uid, CrewMonitoringUIKey.Key, out var bui))
+ if (!_uiSystem.IsUiOpen(uid, CrewMonitoringUIKey.Key))
return;
// The grid must have a NavMapComponent to visualize the map in the UI
@@ -69,6 +69,6 @@ public sealed class CrewMonitoringConsoleSystem : EntitySystem
// Update all sensors info
var allSensors = component.ConnectedSensors.Values.ToList();
- _uiSystem.SetUiState(bui, new CrewMonitoringState(allSensors));
+ _uiSystem.SetUiState(uid, CrewMonitoringUIKey.Key, new CrewMonitoringState(allSensors));
}
}
diff --git a/Content.Server/Medical/CryoPodSystem.cs b/Content.Server/Medical/CryoPodSystem.cs
index 02e8cebbe0..71921f44fd 100644
--- a/Content.Server/Medical/CryoPodSystem.cs
+++ b/Content.Server/Medical/CryoPodSystem.cs
@@ -193,7 +193,8 @@ public sealed partial class CryoPodSystem : SharedCryoPodSystem
healthAnalyzer.ScannedEntity = entity.Comp.BodyContainer.ContainedEntity;
}
- _userInterfaceSystem.TrySendUiMessage(
+ // TODO: This should be a state my dude
+ _userInterfaceSystem.ServerSendUiMessage(
entity.Owner,
HealthAnalyzerUiKey.Key,
new HealthAnalyzerScannedUserMessage(GetNetEntity(entity.Comp.BodyContainer.ContainedEntity),
@@ -246,7 +247,7 @@ public sealed partial class CryoPodSystem : SharedCryoPodSystem
else
{
RemComp(entity);
- _uiSystem.TryCloseAll(entity.Owner, HealthAnalyzerUiKey.Key);
+ _uiSystem.CloseUi(entity.Owner, HealthAnalyzerUiKey.Key);
}
UpdateAppearance(entity.Owner, entity.Comp);
}
@@ -297,7 +298,7 @@ public sealed partial class CryoPodSystem : SharedCryoPodSystem
}
// if body is ejected - no need to display health-analyzer
- _uiSystem.TryCloseAll(cryoPod.Owner, HealthAnalyzerUiKey.Key);
+ _uiSystem.CloseUi(cryoPod.Owner, HealthAnalyzerUiKey.Key);
}
#endregion
diff --git a/Content.Server/Medical/HealthAnalyzerSystem.cs b/Content.Server/Medical/HealthAnalyzerSystem.cs
index 4988608327..7282ea197c 100644
--- a/Content.Server/Medical/HealthAnalyzerSystem.cs
+++ b/Content.Server/Medical/HealthAnalyzerSystem.cs
@@ -128,10 +128,10 @@ public sealed class HealthAnalyzerSystem : EntitySystem
private void OpenUserInterface(EntityUid user, EntityUid analyzer)
{
- if (!TryComp(user, out var actor) || !_uiSystem.TryGetUi(analyzer, HealthAnalyzerUiKey.Key, out var ui))
+ if (!_uiSystem.HasUi(analyzer, HealthAnalyzerUiKey.Key))
return;
- _uiSystem.OpenUi(ui, actor.PlayerSession);
+ _uiSystem.OpenUi(analyzer, HealthAnalyzerUiKey.Key, user);
}
///
@@ -172,7 +172,7 @@ public sealed class HealthAnalyzerSystem : EntitySystem
/// True makes the UI show ACTIVE, False makes the UI show INACTIVE
public void UpdateScannedUser(EntityUid healthAnalyzer, EntityUid target, bool scanMode)
{
- if (!_uiSystem.TryGetUi(healthAnalyzer, HealthAnalyzerUiKey.Key, out var ui))
+ if (!_uiSystem.HasUi(healthAnalyzer, HealthAnalyzerUiKey.Key))
return;
if (!HasComp(target))
@@ -194,9 +194,7 @@ public sealed class HealthAnalyzerSystem : EntitySystem
bleeding = bloodstream.BleedAmount > 0;
}
-
-
- _uiSystem.SendUiMessage(ui, new HealthAnalyzerScannedUserMessage(
+ _uiSystem.ServerSendUiMessage(healthAnalyzer, HealthAnalyzerUiKey.Key, new HealthAnalyzerScannedUserMessage(
GetNetEntity(target),
bodyTemperature,
bloodAmount,
diff --git a/Content.Server/NPC/HTN/Preconditions/InContainerPrecondition.cs b/Content.Server/NPC/HTN/Preconditions/InContainerPrecondition.cs
new file mode 100644
index 0000000000..aa0ad98ede
--- /dev/null
+++ b/Content.Server/NPC/HTN/Preconditions/InContainerPrecondition.cs
@@ -0,0 +1,27 @@
+using Robust.Server.Containers;
+
+namespace Content.Server.NPC.HTN.Preconditions;
+
+///
+/// Checks if the owner in container or not
+///
+public sealed partial class InContainerPrecondition : HTNPrecondition
+{
+ private ContainerSystem _container = default!;
+
+ [ViewVariables(VVAccess.ReadWrite)] [DataField("isInContainer")] public bool IsInContainer = true;
+
+ public override void Initialize(IEntitySystemManager sysManager)
+ {
+ base.Initialize(sysManager);
+ _container = sysManager.GetEntitySystem();
+ }
+
+ public override bool IsMet(NPCBlackboard blackboard)
+ {
+ var owner = blackboard.GetValue(NPCBlackboard.Owner);
+
+ return IsInContainer && _container.IsEntityInContainer(owner) ||
+ !IsInContainer && !_container.IsEntityInContainer(owner);
+ }
+}
diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/ContainerOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/ContainerOperator.cs
new file mode 100644
index 0000000000..667d0b8ec4
--- /dev/null
+++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/ContainerOperator.cs
@@ -0,0 +1,40 @@
+using Robust.Server.Containers;
+
+namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators.Combat;
+
+public sealed partial class ContainerOperator : HTNOperator
+{
+ [Dependency] private readonly IEntityManager _entManager = default!;
+ private ContainerSystem _container = default!;
+ private EntityQuery _transformQuery;
+
+ [DataField("shutdownState")]
+ public HTNPlanState ShutdownState { get; private set; } = HTNPlanState.TaskFinished;
+
+ [DataField("targetKey", required: true)]
+ public string TargetKey = default!;
+
+ public override void Initialize(IEntitySystemManager sysManager)
+ {
+ base.Initialize(sysManager);
+ _container = sysManager.GetEntitySystem();
+ _transformQuery = _entManager.GetEntityQuery();
+ }
+
+ public override void Startup(NPCBlackboard blackboard)
+ {
+ base.Startup(blackboard);
+ var owner = blackboard.GetValue(NPCBlackboard.Owner);
+
+ if (!_container.TryGetOuterContainer(owner, _transformQuery.GetComponent(owner), out var outerContainer) && outerContainer == null)
+ return;
+
+ var target = outerContainer.Owner;
+ blackboard.SetValue(TargetKey, target);
+ }
+
+ public override HTNOperatorStatus Update(NPCBlackboard blackboard, float frameTime)
+ {
+ return HTNOperatorStatus.Finished;
+ }
+}
diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/EscapeOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/EscapeOperator.cs
new file mode 100644
index 0000000000..a794e1e314
--- /dev/null
+++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/EscapeOperator.cs
@@ -0,0 +1,140 @@
+using System.Threading;
+using System.Threading.Tasks;
+using Content.Server.NPC.Components;
+using Content.Server.Storage.EntitySystems;
+using Content.Shared.CombatMode;
+using Robust.Server.Containers;
+
+namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators.Combat.Melee;
+
+public sealed partial class EscapeOperator : HTNOperator, IHtnConditionalShutdown
+{
+ [Dependency] private readonly IEntityManager _entManager = default!;
+ private ContainerSystem _container = default!;
+ private EntityStorageSystem _entityStorage = default!;
+
+ [DataField("shutdownState")]
+ public HTNPlanState ShutdownState { get; private set; } = HTNPlanState.TaskFinished;
+
+ [DataField("targetKey", required: true)]
+ public string TargetKey = default!;
+
+ public override void Initialize(IEntitySystemManager sysManager)
+ {
+ base.Initialize(sysManager);
+ _container = sysManager.GetEntitySystem();
+ _entityStorage = sysManager.GetEntitySystem();
+ }
+
+ public override void Startup(NPCBlackboard blackboard)
+ {
+ base.Startup(blackboard);
+ var owner = blackboard.GetValue(NPCBlackboard.Owner);
+ var target = blackboard.GetValue(TargetKey);
+
+ if (_entityStorage.TryOpenStorage(owner, target))
+ {
+ TaskShutdown(blackboard, HTNOperatorStatus.Finished);
+ return;
+ }
+
+ var melee = _entManager.EnsureComponent(owner);
+ melee.MissChance = blackboard.GetValueOrDefault(NPCBlackboard.MeleeMissChance, _entManager);
+ melee.Target = target;
+ }
+
+ public override async Task<(bool Valid, Dictionary? Effects)> Plan(NPCBlackboard blackboard,
+ CancellationToken cancelToken)
+ {
+ var owner = blackboard.GetValue(NPCBlackboard.Owner);
+ if (!blackboard.TryGetValue(TargetKey, out var target, _entManager))
+ {
+ return (false, null);
+ }
+
+ if (!_container.IsEntityInContainer(owner))
+ {
+ return (false, null);
+ }
+
+ if (_entityStorage.TryOpenStorage(owner, target))
+ {
+ return (false, null);
+ }
+
+ return (true, null);
+ }
+
+ public void ConditionalShutdown(NPCBlackboard blackboard)
+ {
+ var owner = blackboard.GetValue(NPCBlackboard.Owner);
+ _entManager.System().SetInCombatMode(owner, false);
+ _entManager.RemoveComponent(owner);
+ blackboard.Remove(TargetKey);
+ }
+
+ public override void TaskShutdown(NPCBlackboard blackboard, HTNOperatorStatus status)
+ {
+ base.TaskShutdown(blackboard, status);
+
+ ConditionalShutdown(blackboard);
+ }
+
+ public override void PlanShutdown(NPCBlackboard blackboard)
+ {
+ base.PlanShutdown(blackboard);
+
+ ConditionalShutdown(blackboard);
+ }
+
+ public override HTNOperatorStatus Update(NPCBlackboard blackboard, float frameTime)
+ {
+ base.Update(blackboard, frameTime);
+ var owner = blackboard.GetValue(NPCBlackboard.Owner);
+ HTNOperatorStatus status;
+
+ if (_entManager.TryGetComponent(owner, out var combat) &&
+ blackboard.TryGetValue(TargetKey, out var target, _entManager))
+ {
+ combat.Target = target;
+
+ // Success
+ if (!_container.IsEntityInContainer(owner))
+ {
+ status = HTNOperatorStatus.Finished;
+ }
+ else
+ {
+ if (_entityStorage.TryOpenStorage(owner, target))
+ {
+ status = HTNOperatorStatus.Finished;
+ }
+ else
+ {
+ switch (combat.Status)
+ {
+ case CombatStatus.TargetOutOfRange:
+ case CombatStatus.Normal:
+ status = HTNOperatorStatus.Continuing;
+ break;
+ default:
+ status = HTNOperatorStatus.Failed;
+ break;
+ }
+ }
+ }
+ }
+ else
+ {
+ status = HTNOperatorStatus.Failed;
+ }
+
+ // Mark it as finished to continue the plan.
+ if (status == HTNOperatorStatus.Continuing && ShutdownState == HTNPlanState.PlanFinished)
+ {
+ status = HTNOperatorStatus.Finished;
+ }
+
+ return status;
+ }
+}
diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/UnPullOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/UnPullOperator.cs
new file mode 100644
index 0000000000..54f422fe67
--- /dev/null
+++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/UnPullOperator.cs
@@ -0,0 +1,35 @@
+using Content.Shared.Movement.Pulling.Components;
+using Content.Shared.Movement.Pulling.Systems;
+
+namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators.Combat;
+
+public sealed partial class UnPullOperator : HTNOperator
+{
+ [Dependency] private readonly IEntityManager _entManager = default!;
+ private PullingSystem _pulling = default!;
+
+ private EntityQuery _pullableQuery;
+
+ [DataField("shutdownState")]
+ public HTNPlanState ShutdownState { get; private set; } = HTNPlanState.TaskFinished;
+
+ public override void Initialize(IEntitySystemManager sysManager)
+ {
+ base.Initialize(sysManager);
+ _pulling = sysManager.GetEntitySystem();
+ _pullableQuery = _entManager.GetEntityQuery();
+ }
+
+ public override void Startup(NPCBlackboard blackboard)
+ {
+ base.Startup(blackboard);
+ var owner = blackboard.GetValue(NPCBlackboard.Owner);
+
+ _pulling.TryStopPull(owner, _pullableQuery.GetComponent(owner), owner);
+ }
+
+ public override HTNOperatorStatus Update(NPCBlackboard blackboard, float frameTime)
+ {
+ return HTNOperatorStatus.Finished;
+ }
+}
diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/UnbuckleOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/UnbuckleOperator.cs
new file mode 100644
index 0000000000..207665d786
--- /dev/null
+++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/UnbuckleOperator.cs
@@ -0,0 +1,34 @@
+using Content.Server.Buckle.Systems;
+using Content.Shared.Buckle.Components;
+
+namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators.Combat;
+
+public sealed partial class UnbuckleOperator : HTNOperator
+{
+ [Dependency] private readonly IEntityManager _entManager = default!;
+ private BuckleSystem _buckle = default!;
+
+ [DataField("shutdownState")]
+ public HTNPlanState ShutdownState { get; private set; } = HTNPlanState.TaskFinished;
+
+ public override void Initialize(IEntitySystemManager sysManager)
+ {
+ base.Initialize(sysManager);
+ _buckle = sysManager.GetEntitySystem();
+ }
+
+ public override void Startup(NPCBlackboard blackboard)
+ {
+ base.Startup(blackboard);
+ var owner = blackboard.GetValue(NPCBlackboard.Owner);
+ if (!_entManager.TryGetComponent(owner, out var buckle) || !buckle.Buckled)
+ return;
+
+ _buckle.TryUnbuckle(owner, owner, true, buckle);
+ }
+
+ public override HTNOperatorStatus Update(NPCBlackboard blackboard, float frameTime)
+ {
+ return HTNOperatorStatus.Finished;
+ }
+}
diff --git a/Content.Server/Nuke/NukeSystem.cs b/Content.Server/Nuke/NukeSystem.cs
index c996f05ec4..b72be0b46c 100644
--- a/Content.Server/Nuke/NukeSystem.cs
+++ b/Content.Server/Nuke/NukeSystem.cs
@@ -187,7 +187,7 @@ public sealed class NukeSystem : EntitySystem
continue;
var msg = Loc.GetString("nuke-component-cant-anchor-floor");
- _popups.PopupEntity(msg, uid, args.Session, PopupType.MediumCaution);
+ _popups.PopupEntity(msg, uid, args.Actor, PopupType.MediumCaution);
return;
}
@@ -243,10 +243,7 @@ public sealed class NukeSystem : EntitySystem
else
{
- if (args.Session.AttachedEntity is not { } user)
- return;
-
- DisarmBombDoafter(uid, user, component);
+ DisarmBombDoafter(uid, args.Actor, component);
}
}
@@ -366,8 +363,7 @@ public sealed class NukeSystem : EntitySystem
if (!Resolve(uid, ref component))
return;
- var ui = _ui.GetUiOrNull(uid, NukeUiKey.Key);
- if (ui == null)
+ if (!_ui.HasUi(uid, NukeUiKey.Key))
return;
var anchored = Transform(uid).Anchored;
@@ -388,7 +384,7 @@ public sealed class NukeSystem : EntitySystem
CooldownTime = (int) component.CooldownTime
};
- _ui.SetUiState(ui, state);
+ _ui.SetUiState(uid, NukeUiKey.Key, state);
}
private void PlayNukeKeypadSound(EntityUid uid, int number, NukeComponent? component = null)
diff --git a/Content.Server/NukeOps/WarDeclaratorSystem.cs b/Content.Server/NukeOps/WarDeclaratorSystem.cs
index bcc0b9c0ea..a2d74e16b3 100644
--- a/Content.Server/NukeOps/WarDeclaratorSystem.cs
+++ b/Content.Server/NukeOps/WarDeclaratorSystem.cs
@@ -55,9 +55,6 @@ public sealed class WarDeclaratorSystem : EntitySystem
private void OnActivated(Entity ent, ref WarDeclaratorActivateMessage args)
{
- if (args.Session.AttachedEntity is not {} playerEntity)
- return;
-
var ev = new WarDeclaredEvent(ent.Comp.CurrentStatus, ent);
RaiseLocalEvent(ref ev);
@@ -75,7 +72,7 @@ public sealed class WarDeclaratorSystem : EntitySystem
{
var title = Loc.GetString(ent.Comp.SenderTitle);
_chat.DispatchGlobalAnnouncement(ent.Comp.Message, title, true, ent.Comp.Sound, ent.Comp.Color);
- _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(playerEntity):player} has declared war with this text: {ent.Comp.Message}");
+ _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(args.Actor):player} has declared war with this text: {ent.Comp.Message}");
}
UpdateUI(ent, ev.Status);
@@ -83,8 +80,8 @@ public sealed class WarDeclaratorSystem : EntitySystem
private void UpdateUI(Entity ent, WarConditionStatus? status = null)
{
- _userInterfaceSystem.TrySetUiState(
- ent,
+ _userInterfaceSystem.SetUiState(
+ ent.Owner,
WarDeclaratorUiKey.Key,
new WarDeclaratorBoundUserInterfaceState(status, ent.Comp.DisableAt, ent.Comp.ShuttleDisabledTime));
}
diff --git a/Content.Server/PAI/PAISystem.cs b/Content.Server/PAI/PAISystem.cs
index e9505b5e6f..091afb1557 100644
--- a/Content.Server/PAI/PAISystem.cs
+++ b/Content.Server/PAI/PAISystem.cs
@@ -102,13 +102,15 @@ public sealed class PAISystem : SharedPAISystem
{
// Close the instrument interface if it was open
// before closing
- if (HasComp(uid) && TryComp(uid, out var actor))
+ if (HasComp(uid))
{
- _instrumentSystem.ToggleInstrumentUi(uid, actor.PlayerSession);
+ _instrumentSystem.ToggleInstrumentUi(uid, uid);
}
// Stop instrument
- if (TryComp(uid, out var instrument)) _instrumentSystem.Clean(uid, instrument);
+ if (TryComp(uid, out var instrument))
+ _instrumentSystem.Clean(uid, instrument);
+
if (TryComp(uid, out var metadata))
{
var proto = metadata.EntityPrototype;
diff --git a/Content.Server/PDA/PdaSystem.cs b/Content.Server/PDA/PdaSystem.cs
index a343607196..0b86fe29ed 100644
--- a/Content.Server/PDA/PdaSystem.cs
+++ b/Content.Server/PDA/PdaSystem.cs
@@ -41,6 +41,7 @@ namespace Content.Server.PDA
SubscribeLocalEvent(OnLightToggle);
// UI Events:
+ SubscribeLocalEvent(OnPdaOpen);
SubscribeLocalEvent(OnUiMessage);
SubscribeLocalEvent(OnUiMessage);
SubscribeLocalEvent(OnUiMessage);
@@ -145,7 +146,7 @@ namespace Content.Server.PDA
if (!Resolve(uid, ref pda, false))
return;
- if (!_ui.TryGetUi(uid, PdaUiKey.Key, out var ui))
+ if (!_ui.HasUi(uid, PdaUiKey.Key))
return;
var address = GetDeviceNetAddress(uid);
@@ -182,7 +183,15 @@ namespace Content.Server.PDA
hasInstrument,
address);
- _ui.SetUiState(ui, state);
+ _ui.SetUiState(uid, PdaUiKey.Key, state);
+ }
+
+ private void OnPdaOpen(Entity ent, ref BoundUIOpenedEvent args)
+ {
+ if (!PdaUiKey.Key.Equals(args.UiKey))
+ return;
+
+ UpdatePdaUi(ent.Owner, ent.Comp);
}
private void OnUiMessage(EntityUid uid, PdaComponent pda, PdaRequestUpdateInterfaceMessage msg)
@@ -208,7 +217,7 @@ namespace Content.Server.PDA
return;
if (HasComp(uid))
- _ringer.ToggleRingerUI(uid, msg.Session);
+ _ringer.ToggleRingerUI(uid, msg.Actor);
}
private void OnUiMessage(EntityUid uid, PdaComponent pda, PdaShowMusicMessage msg)
@@ -217,7 +226,7 @@ namespace Content.Server.PDA
return;
if (TryComp(uid, out var instrument))
- _instrument.ToggleInstrumentUi(uid, msg.Session, instrument);
+ _instrument.ToggleInstrumentUi(uid, msg.Actor, instrument);
}
private void OnUiMessage(EntityUid uid, PdaComponent pda, PdaShowUplinkMessage msg)
@@ -227,7 +236,7 @@ namespace Content.Server.PDA
// check if its locked again to prevent malicious clients opening locked uplinks
if (TryComp(uid, out var store) && IsUnlocked(uid))
- _store.ToggleUi(msg.Session.AttachedEntity!.Value, uid, store);
+ _store.ToggleUi(msg.Actor, uid, store);
}
private void OnUiMessage(EntityUid uid, PdaComponent pda, PdaLockUplinkMessage msg)
diff --git a/Content.Server/PDA/Ringer/RingerSystem.cs b/Content.Server/PDA/Ringer/RingerSystem.cs
index f95725873a..a10544d696 100644
--- a/Content.Server/PDA/Ringer/RingerSystem.cs
+++ b/Content.Server/PDA/Ringer/RingerSystem.cs
@@ -81,7 +81,10 @@ namespace Content.Server.PDA.Ringer
private void OnSetRingtone(EntityUid uid, RingerComponent ringer, RingerSetRingtoneMessage args)
{
- ref var lastSetAt = ref CollectionsMarshal.GetValueRefOrAddDefault(_lastSetRingtoneAt, args.Session.UserId, out var exists);
+ if (!TryComp(args.Actor, out ActorComponent? actorComp))
+ return;
+
+ ref var lastSetAt = ref CollectionsMarshal.GetValueRefOrAddDefault(_lastSetRingtoneAt, actorComp.PlayerSession.UserId, out var exists);
// Delay on the client is 0.333, 0.25 is still enough and gives some leeway in case of small time differences
if (exists && lastSetAt > _gameTiming.CurTime - TimeSpan.FromMilliseconds(250))
@@ -111,7 +114,7 @@ namespace Content.Server.PDA.Ringer
// can't keep store open after locking it
if (!uplink.Unlocked)
- _ui.TryCloseAll(uid, StoreUiKey.Key);
+ _ui.CloseUi(uid, StoreUiKey.Key);
// no saving the code to prevent meta click set on sus guys pda -> wewlad
args.Handled = true;
@@ -130,7 +133,7 @@ namespace Content.Server.PDA.Ringer
return;
uplink.Unlocked = false;
- _ui.TryCloseAll(uid, StoreUiKey.Key);
+ _ui.CloseUi(uid, StoreUiKey.Key);
}
public void RandomizeRingtone(EntityUid uid, RingerComponent ringer, MapInitEvent args)
@@ -181,14 +184,12 @@ namespace Content.Server.PDA.Ringer
private void UpdateRingerUserInterface(EntityUid uid, RingerComponent ringer, bool isPlaying)
{
- if (_ui.TryGetUi(uid, RingerUiKey.Key, out var bui))
- _ui.SetUiState(bui, new RingerUpdateState(isPlaying, ringer.Ringtone));
+ _ui.SetUiState(uid, RingerUiKey.Key, new RingerUpdateState(isPlaying, ringer.Ringtone));
}
- public bool ToggleRingerUI(EntityUid uid, ICommonSession session)
+ public bool ToggleRingerUI(EntityUid uid, EntityUid actor)
{
- if (_ui.TryGetUi(uid, RingerUiKey.Key, out var bui))
- _ui.ToggleUi(bui, session);
+ _ui.TryToggleUi(uid, RingerUiKey.Key, actor);
return true;
}
diff --git a/Content.Server/Paper/PaperComponent.cs b/Content.Server/Paper/PaperComponent.cs
index 3cf011e34d..6c379eea2b 100644
--- a/Content.Server/Paper/PaperComponent.cs
+++ b/Content.Server/Paper/PaperComponent.cs
@@ -3,7 +3,7 @@ using Robust.Shared.GameStates;
namespace Content.Server.Paper;
-[NetworkedComponent, RegisterComponent]
+[RegisterComponent]
public sealed partial class PaperComponent : SharedPaperComponent
{
public PaperAction Mode;
diff --git a/Content.Server/Paper/PaperSystem.cs b/Content.Server/Paper/PaperSystem.cs
index c582b82e2c..d10d04cfb9 100644
--- a/Content.Server/Paper/PaperSystem.cs
+++ b/Content.Server/Paper/PaperSystem.cs
@@ -67,11 +67,7 @@ namespace Content.Server.Paper
private void BeforeUIOpen(EntityUid uid, PaperComponent paperComp, BeforeActivatableUIOpenEvent args)
{
paperComp.Mode = PaperAction.Read;
-
- if (!TryComp(args.User, out var actor))
- return;
-
- UpdateUserInterface(uid, paperComp, actor.PlayerSession);
+ UpdateUserInterface(uid, paperComp);
}
private void OnExamined(EntityUid uid, PaperComponent paperComp, ExaminedEvent args)
@@ -108,12 +104,10 @@ namespace Content.Server.Paper
{
var writeEvent = new PaperWriteEvent(uid, args.User);
RaiseLocalEvent(args.Used, ref writeEvent);
- if (!TryComp(args.User, out var actor))
- return;
paperComp.Mode = PaperAction.Write;
- _uiSystem.TryOpen(uid, PaperUiKey.Key, actor.PlayerSession);
- UpdateUserInterface(uid, paperComp, actor.PlayerSession);
+ _uiSystem.OpenUi(uid, PaperUiKey.Key, args.User);
+ UpdateUserInterface(uid, paperComp);
args.Handled = true;
return;
}
@@ -157,9 +151,8 @@ namespace Content.Server.Paper
if (TryComp(uid, out var meta))
_metaSystem.SetEntityDescription(uid, "", meta);
- if (args.Session.AttachedEntity != null)
- _adminLogger.Add(LogType.Chat, LogImpact.Low,
- $"{ToPrettyString(args.Session.AttachedEntity.Value):player} has written on {ToPrettyString(uid):entity} the following text: {args.Text}");
+ _adminLogger.Add(LogType.Chat, LogImpact.Low,
+ $"{ToPrettyString(args.Actor):player} has written on {ToPrettyString(uid):entity} the following text: {args.Text}");
_audio.PlayPvs(paperComp.Sound, uid);
}
@@ -213,13 +206,12 @@ namespace Content.Server.Paper
_appearance.SetData(uid, PaperVisuals.Status, status, appearance);
}
- public void UpdateUserInterface(EntityUid uid, PaperComponent? paperComp = null, ICommonSession? session = null)
+ public void UpdateUserInterface(EntityUid uid, PaperComponent? paperComp = null)
{
if (!Resolve(uid, ref paperComp))
return;
- if (_uiSystem.TryGetUi(uid, PaperUiKey.Key, out var bui))
- _uiSystem.SetUiState(bui, new PaperBoundUserInterfaceState(paperComp.Content, paperComp.StampedBy, paperComp.Mode), session);
+ _uiSystem.SetUiState(uid, PaperUiKey.Key, new PaperBoundUserInterfaceState(paperComp.Content, paperComp.StampedBy, paperComp.Mode));
}
}
diff --git a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.ControlBox.cs b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.ControlBox.cs
index 5d373652a9..f3cff9f2e7 100644
--- a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.ControlBox.cs
+++ b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.ControlBox.cs
@@ -67,7 +67,7 @@ public sealed partial class ParticleAcceleratorSystem
FireEmitter(comp.StarboardEmitter!.Value, strength);
}
- public void SwitchOn(EntityUid uid, ICommonSession? user = null, ParticleAcceleratorControlBoxComponent? comp = null)
+ public void SwitchOn(EntityUid uid, EntityUid? user = null, ParticleAcceleratorControlBoxComponent? comp = null)
{
if (!Resolve(uid, ref comp))
return;
@@ -77,7 +77,7 @@ public sealed partial class ParticleAcceleratorSystem
if (comp.Enabled || !comp.CanBeEnabled)
return;
- if (user?.AttachedEntity is { } player)
+ if (user is { } player)
_adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(player):player} has turned {ToPrettyString(uid)} on");
comp.Enabled = true;
@@ -90,14 +90,14 @@ public sealed partial class ParticleAcceleratorSystem
UpdateUI(uid, comp);
}
- public void SwitchOff(EntityUid uid, ICommonSession? user = null, ParticleAcceleratorControlBoxComponent? comp = null)
+ public void SwitchOff(EntityUid uid, EntityUid? user = null, ParticleAcceleratorControlBoxComponent? comp = null)
{
if (!Resolve(uid, ref comp))
return;
if (!comp.Enabled)
return;
- if (user?.AttachedEntity is { } player)
+ if (user is { } player)
_adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(player):player} has turned {ToPrettyString(uid)} off");
comp.Enabled = false;
@@ -138,7 +138,7 @@ public sealed partial class ParticleAcceleratorSystem
UpdateUI(uid, comp);
}
- public void SetStrength(EntityUid uid, ParticleAcceleratorPowerState strength, ICommonSession? user = null, ParticleAcceleratorControlBoxComponent? comp = null)
+ public void SetStrength(EntityUid uid, ParticleAcceleratorPowerState strength, EntityUid? user = null, ParticleAcceleratorControlBoxComponent? comp = null)
{
if (!Resolve(uid, ref comp))
return;
@@ -154,7 +154,7 @@ public sealed partial class ParticleAcceleratorSystem
if (strength == comp.SelectedStrength)
return;
- if (user?.AttachedEntity is { } player)
+ if (user is { } player)
{
var impact = strength switch
{
@@ -235,7 +235,8 @@ public sealed partial class ParticleAcceleratorSystem
{
if (!Resolve(uid, ref comp))
return;
- if (!_uiSystem.TryGetUi(uid, ParticleAcceleratorControlBoxUiKey.Key, out var bui))
+
+ if (!_uiSystem.HasUi(uid, ParticleAcceleratorControlBoxUiKey.Key))
return;
var draw = 0f;
@@ -247,7 +248,7 @@ public sealed partial class ParticleAcceleratorSystem
receive = powerConsumer.ReceivedPower;
}
- _uiSystem.SetUiState(bui, new ParticleAcceleratorUIState(
+ _uiSystem.SetUiState(uid, ParticleAcceleratorControlBoxUiKey.Key, new ParticleAcceleratorUIState(
comp.Assembled,
comp.Enabled,
comp.SelectedStrength,
@@ -346,7 +347,7 @@ public sealed partial class ParticleAcceleratorSystem
UpdateAppearance(uid, comp);
if (!args.Powered)
- _uiSystem.TryCloseAll(uid, ParticleAcceleratorControlBoxUiKey.Key);
+ _uiSystem.CloseUi(uid, ParticleAcceleratorControlBoxUiKey.Key);
}
private void OnUISetEnableMessage(EntityUid uid, ParticleAcceleratorControlBoxComponent comp, ParticleAcceleratorSetEnableMessage msg)
@@ -361,10 +362,10 @@ public sealed partial class ParticleAcceleratorSystem
if (msg.Enabled)
{
if (comp.Assembled)
- SwitchOn(uid, msg.Session, comp);
+ SwitchOn(uid, msg.Actor, comp);
}
else
- SwitchOff(uid, msg.Session, comp);
+ SwitchOff(uid, msg.Actor, comp);
UpdateUI(uid, comp);
}
@@ -378,7 +379,7 @@ public sealed partial class ParticleAcceleratorSystem
if (TryComp(uid, out var apcPower) && !apcPower.Powered)
return;
- SetStrength(uid, msg.State, msg.Session, comp);
+ SetStrength(uid, msg.State, msg.Actor, comp);
UpdateUI(uid, comp);
}
@@ -392,7 +393,7 @@ public sealed partial class ParticleAcceleratorSystem
if (TryComp(uid, out var apcPower) && !apcPower.Powered)
return;
- RescanParts(uid, msg.Session, comp);
+ RescanParts(uid, msg.Actor, comp);
UpdateUI(uid, comp);
}
diff --git a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Parts.cs b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Parts.cs
index bdbc7b3f5b..99bb0d5cbd 100644
--- a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Parts.cs
+++ b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Parts.cs
@@ -18,7 +18,7 @@ public sealed partial class ParticleAcceleratorSystem
SubscribeLocalEvent(BodyTypeChanged);
}
- public void RescanParts(EntityUid uid, ICommonSession? user = null, ParticleAcceleratorControlBoxComponent? controller = null)
+ public void RescanParts(EntityUid uid, EntityUid? user = null, ParticleAcceleratorControlBoxComponent? controller = null)
{
if (!Resolve(uid, ref controller))
return;
diff --git a/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorLimiterWireAction.cs b/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorLimiterWireAction.cs
index 0cbd47c233..0645944a2a 100644
--- a/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorLimiterWireAction.cs
+++ b/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorLimiterWireAction.cs
@@ -48,8 +48,7 @@ public sealed partial class ParticleAcceleratorLimiterWireAction : ComponentWire
// Yes, it's a feature that mending this wire WON'T WORK if the strength wire is also cut.
// Since that blocks SetStrength().
var paSystem = EntityManager.System();
- var userSession = EntityManager.TryGetComponent(user, out var actor) ? actor.PlayerSession : null;
- paSystem.SetStrength(wire.Owner, controller.MaxStrength, userSession, controller);
+ paSystem.SetStrength(wire.Owner, controller.MaxStrength, user, controller);
return true;
}
diff --git a/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorStrengthWireAction.cs b/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorStrengthWireAction.cs
index 65fa76ee41..1650960bd3 100644
--- a/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorStrengthWireAction.cs
+++ b/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorStrengthWireAction.cs
@@ -33,7 +33,6 @@ public sealed partial class ParticleAcceleratorStrengthWireAction : ComponentWir
public override void Pulse(EntityUid user, Wire wire, ParticleAcceleratorControlBoxComponent controller)
{
var paSystem = EntityManager.System();
- var userSession = EntityManager.TryGetComponent(user, out var actor) ? actor.PlayerSession : null;
- paSystem.SetStrength(wire.Owner, (ParticleAcceleratorPowerState) ((int) controller.SelectedStrength + 1), userSession, controller);
+ paSystem.SetStrength(wire.Owner, (ParticleAcceleratorPowerState) ((int) controller.SelectedStrength + 1), user, controller);
}
}
diff --git a/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorToggleWireAction.cs b/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorToggleWireAction.cs
index c43403edd4..40a15d2bc5 100644
--- a/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorToggleWireAction.cs
+++ b/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorToggleWireAction.cs
@@ -23,10 +23,9 @@ public sealed partial class ParticleAcceleratorPowerWireAction : ComponentWireAc
public override bool Cut(EntityUid user, Wire wire, ParticleAcceleratorControlBoxComponent controller)
{
var paSystem = EntityManager.System();
- var userSession = EntityManager.TryGetComponent(user, out var actor) ? actor.PlayerSession : null;
controller.CanBeEnabled = false;
- paSystem.SwitchOff(wire.Owner, userSession, controller);
+ paSystem.SwitchOff(wire.Owner, user, controller);
return true;
}
@@ -39,11 +38,10 @@ public sealed partial class ParticleAcceleratorPowerWireAction : ComponentWireAc
public override void Pulse(EntityUid user, Wire wire, ParticleAcceleratorControlBoxComponent controller)
{
var paSystem = EntityManager.System();
- var userSession = EntityManager.TryGetComponent(user, out var actor) ? actor.PlayerSession : null;
if (controller.Enabled)
- paSystem.SwitchOff(wire.Owner, userSession, controller);
+ paSystem.SwitchOff(wire.Owner, user, controller);
else if (controller.Assembled)
- paSystem.SwitchOn(wire.Owner, userSession, controller);
+ paSystem.SwitchOn(wire.Owner, user, controller);
}
}
diff --git a/Content.Server/Pinpointer/NavMapSystem.cs b/Content.Server/Pinpointer/NavMapSystem.cs
index 34c76a1320..0aa6ab1908 100644
--- a/Content.Server/Pinpointer/NavMapSystem.cs
+++ b/Content.Server/Pinpointer/NavMapSystem.cs
@@ -155,9 +155,6 @@ public sealed partial class NavMapSystem : SharedNavMapSystem
private void OnConfigureMessage(Entity ent, ref NavMapBeaconConfigureBuiMessage args)
{
- if (args.Session.AttachedEntity is not { } user)
- return;
-
if (!TryComp(ent, out var beacon))
return;
@@ -167,7 +164,7 @@ public sealed partial class NavMapSystem : SharedNavMapSystem
return;
_adminLog.Add(LogType.Action, LogImpact.Medium,
- $"{ToPrettyString(user):player} configured NavMapBeacon \'{ToPrettyString(ent):entity}\' with text \'{args.Text}\', color {args.Color.ToHexNoAlpha()}, and {(args.Enabled ? "enabled" : "disabled")} it.");
+ $"{ToPrettyString(args.Actor):player} configured NavMapBeacon \'{ToPrettyString(ent):entity}\' with text \'{args.Text}\', color {args.Color.ToHexNoAlpha()}, and {(args.Enabled ? "enabled" : "disabled")} it.");
if (TryComp(ent, out var warpPoint))
{
diff --git a/Content.Server/Pinpointer/StationMapSystem.cs b/Content.Server/Pinpointer/StationMapSystem.cs
index c9db560fef..b0b3141fb0 100644
--- a/Content.Server/Pinpointer/StationMapSystem.cs
+++ b/Content.Server/Pinpointer/StationMapSystem.cs
@@ -24,29 +24,23 @@ public sealed class StationMapSystem : EntitySystem
private void OnStationMapClosed(EntityUid uid, StationMapComponent component, BoundUIClosedEvent args)
{
- if (!Equals(args.UiKey, StationMapUiKey.Key) || args.Session.AttachedEntity == null)
+ if (!Equals(args.UiKey, StationMapUiKey.Key))
return;
- RemCompDeferred(args.Session.AttachedEntity.Value);
+ RemCompDeferred(args.Actor);
}
private void OnUserParentChanged(EntityUid uid, StationMapUserComponent component, ref EntParentChangedMessage args)
{
- if (TryComp(uid, out var actor))
- {
- _ui.TryClose(component.Map, StationMapUiKey.Key, actor.PlayerSession);
- }
+ _ui.CloseUi(component.Map, StationMapUiKey.Key, uid);
}
private void OnStationMapOpened(EntityUid uid, StationMapComponent component, BoundUIOpenedEvent args)
{
- if (args.Session.AttachedEntity == null)
- return;
-
if (!_cell.TryUseActivatableCharge(uid))
return;
- var comp = EnsureComp(args.Session.AttachedEntity.Value);
+ var comp = EnsureComp(args.Actor);
comp.Map = uid;
}
}
diff --git a/Content.Server/Power/Components/ActivatableUIRequiresPowerComponent.cs b/Content.Server/Power/Components/ActivatableUIRequiresPowerComponent.cs
deleted file mode 100644
index c387457adb..0000000000
--- a/Content.Server/Power/Components/ActivatableUIRequiresPowerComponent.cs
+++ /dev/null
@@ -1,8 +0,0 @@
-namespace Content.Server.Power.Components
-{
- [RegisterComponent]
- public sealed partial class ActivatableUIRequiresPowerComponent : Component
- {
- }
-}
-
diff --git a/Content.Server/Power/EntitySystems/ActivatableUIRequiresPowerSystem.cs b/Content.Server/Power/EntitySystems/ActivatableUIRequiresPowerSystem.cs
index 561b0e71f0..72843a65b8 100644
--- a/Content.Server/Power/EntitySystems/ActivatableUIRequiresPowerSystem.cs
+++ b/Content.Server/Power/EntitySystems/ActivatableUIRequiresPowerSystem.cs
@@ -4,11 +4,12 @@ using Content.Shared.UserInterface;
using JetBrains.Annotations;
using Content.Shared.Wires;
using Content.Server.UserInterface;
+using Content.Shared.Power.Components;
+using ActivatableUISystem = Content.Shared.UserInterface.ActivatableUISystem;
namespace Content.Server.Power.EntitySystems;
-[UsedImplicitly]
-internal sealed class ActivatableUIRequiresPowerSystem : EntitySystem
+public sealed class ActivatableUIRequiresPowerSystem : EntitySystem
{
[Dependency] private readonly ActivatableUISystem _activatableUI = default!;
[Dependency] private readonly SharedPopupSystem _popup = default!;
diff --git a/Content.Server/Power/EntitySystems/ApcSystem.cs b/Content.Server/Power/EntitySystems/ApcSystem.cs
index 95b5d74a94..388f65ad2e 100644
--- a/Content.Server/Power/EntitySystems/ApcSystem.cs
+++ b/Content.Server/Power/EntitySystems/ApcSystem.cs
@@ -66,11 +66,8 @@ public sealed class ApcSystem : EntitySystem
//Update the HasAccess var for UI to read
private void OnBoundUiOpen(EntityUid uid, ApcComponent component, BoundUIOpenedEvent args)
{
- if (args.Session.AttachedEntity == null)
- return;
-
// TODO: this should be per-player not stored on the apc
- component.HasAccess = _accessReader.IsAllowed(args.Session.AttachedEntity.Value, uid);
+ component.HasAccess = _accessReader.IsAllowed(args.Actor, uid);
UpdateApcState(uid, component);
}
@@ -81,21 +78,18 @@ public sealed class ApcSystem : EntitySystem
if (attemptEv.Cancelled)
{
_popup.PopupCursor(Loc.GetString("apc-component-on-toggle-cancel"),
- args.Session, PopupType.Medium);
+ args.Actor, PopupType.Medium);
return;
}
- if (args.Session.AttachedEntity == null)
- return;
-
- if (_accessReader.IsAllowed(args.Session.AttachedEntity.Value, uid))
+ if (_accessReader.IsAllowed(args.Actor, uid))
{
ApcToggleBreaker(uid, component);
}
else
{
_popup.PopupCursor(Loc.GetString("apc-component-insufficient-access"),
- args.Session, PopupType.Medium);
+ args.Actor, PopupType.Medium);
}
}
@@ -158,7 +152,7 @@ public sealed class ApcSystem : EntitySystem
(int) MathF.Ceiling(battery.CurrentSupply), apc.LastExternalState,
battery.CurrentStorage / battery.Capacity);
- _ui.TrySetUiState(uid, ApcUiKey.Key, state, ui: ui);
+ _ui.SetUiState((uid, ui), ApcUiKey.Key, state);
}
private ApcChargeState CalcChargeState(EntityUid uid, PowerState.Battery battery)
diff --git a/Content.Server/Power/EntitySystems/PowerMonitoringConsoleSystem.cs b/Content.Server/Power/EntitySystems/PowerMonitoringConsoleSystem.cs
index 0e20f007d7..be1238fd2b 100644
--- a/Content.Server/Power/EntitySystems/PowerMonitoringConsoleSystem.cs
+++ b/Content.Server/Power/EntitySystems/PowerMonitoringConsoleSystem.cs
@@ -286,20 +286,17 @@ internal sealed partial class PowerMonitoringConsoleSystem : SharedPowerMonitori
var query = AllEntityQuery();
while (query.MoveNext(out var ent, out var console))
{
- if (!_userInterfaceSystem.TryGetUi(ent, PowerMonitoringConsoleUiKey.Key, out var bui))
+ if (!_userInterfaceSystem.IsUiOpen(ent, PowerMonitoringConsoleUiKey.Key))
continue;
- foreach (var session in bui.SubscribedSessions)
- UpdateUIState(ent, console, session);
+ UpdateUIState(ent, console);
+
}
}
}
- public void UpdateUIState(EntityUid uid, PowerMonitoringConsoleComponent component, ICommonSession session)
+ private void UpdateUIState(EntityUid uid, PowerMonitoringConsoleComponent component)
{
- if (!_userInterfaceSystem.TryGetUi(uid, PowerMonitoringConsoleUiKey.Key, out var bui))
- return;
-
var consoleXform = Transform(uid);
if (consoleXform?.GridUid == null)
@@ -422,15 +419,15 @@ internal sealed partial class PowerMonitoringConsoleSystem : SharedPowerMonitori
}
// Set the UI state
- _userInterfaceSystem.SetUiState(bui,
+ _userInterfaceSystem.SetUiState(uid,
+ PowerMonitoringConsoleUiKey.Key,
new PowerMonitoringConsoleBoundInterfaceState
(totalSources,
totalBatteryUsage,
totalLoads,
allEntries.ToArray(),
sourcesForFocus.ToArray(),
- loadsForFocus.ToArray()),
- session);
+ loadsForFocus.ToArray()));
}
private double GetPrimaryPowerValues(EntityUid uid, PowerMonitoringDeviceComponent device, out double powerSupplied, out double powerUsage, out double batteryUsage)
diff --git a/Content.Server/Power/Generator/PortableGeneratorSystem.cs b/Content.Server/Power/Generator/PortableGeneratorSystem.cs
index a95a3fd423..f7d259b122 100644
--- a/Content.Server/Power/Generator/PortableGeneratorSystem.cs
+++ b/Content.Server/Power/Generator/PortableGeneratorSystem.cs
@@ -48,30 +48,21 @@ public sealed class PortableGeneratorSystem : SharedPortableGeneratorSystem
private void GeneratorSwitchOutputMessage(EntityUid uid, PortableGeneratorComponent component, PortableGeneratorSwitchOutputMessage args)
{
- if (args.Session.AttachedEntity == null)
- return;
-
var fuelGenerator = Comp(uid);
if (fuelGenerator.On)
return;
- _switchable.Cycle(uid, args.Session.AttachedEntity.Value);
+ _switchable.Cycle(uid, args.Actor);
}
private void GeneratorStopMessage(EntityUid uid, PortableGeneratorComponent component, PortableGeneratorStopMessage args)
{
- if (args.Session.AttachedEntity == null)
- return;
-
- StopGenerator(uid, component, args.Session.AttachedEntity.Value);
+ StopGenerator(uid, component, args.Actor);
}
private void GeneratorStartMessage(EntityUid uid, PortableGeneratorComponent component, PortableGeneratorStartMessage args)
{
- if (args.Session.AttachedEntity == null)
- return;
-
- StartGenerator(uid, component, args.Session.AttachedEntity.Value);
+ StartGenerator(uid, component, args.Actor);
}
private void StartGenerator(EntityUid uid, PortableGeneratorComponent component, EntityUid user)
@@ -234,7 +225,7 @@ public sealed class PortableGeneratorSystem : SharedPortableGeneratorSystem
if (powerSupplier.Net is { IsConnectedNetwork: true } net)
networkStats = (net.NetworkNode.LastCombinedLoad, net.NetworkNode.LastCombinedSupply);
- _uiSystem.TrySetUiState(
+ _uiSystem.SetUiState(
uid,
GeneratorComponentUiKey.Key,
new PortableGeneratorComponentBuiState(fuelComp, fuel, clogged, networkStats));
diff --git a/Content.Server/PowerCell/PowerCellSystem.cs b/Content.Server/PowerCell/PowerCellSystem.cs
index d4c1faa4c9..f45a01b2e1 100644
--- a/Content.Server/PowerCell/PowerCellSystem.cs
+++ b/Content.Server/PowerCell/PowerCellSystem.cs
@@ -11,6 +11,7 @@ using Content.Server.Power.EntitySystems;
using Content.Server.UserInterface;
using Content.Shared.Containers.ItemSlots;
using Content.Shared.Popups;
+using ActivatableUISystem = Content.Shared.UserInterface.ActivatableUISystem;
namespace Content.Server.PowerCell;
diff --git a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs
index ace7d8ae31..56c5d8e548 100644
--- a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs
+++ b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs
@@ -201,6 +201,9 @@ public sealed class RadioDeviceSystem : EntitySystem
private void OnReceiveRadio(EntityUid uid, RadioSpeakerComponent component, ref RadioReceiveEvent args)
{
+ if (uid == args.RadioSource)
+ return;
+
var nameEv = new TransformSpeakerNameEvent(args.MessageSource, Name(args.MessageSource));
RaiseLocalEvent(args.MessageSource, nameEv);
@@ -218,25 +221,25 @@ public sealed class RadioDeviceSystem : EntitySystem
private void OnToggleIntercomMic(EntityUid uid, IntercomComponent component, ToggleIntercomMicMessage args)
{
- if (component.RequiresPower && !this.IsPowered(uid, EntityManager) || args.Session.AttachedEntity is not { } user)
+ if (component.RequiresPower && !this.IsPowered(uid, EntityManager))
return;
- SetMicrophoneEnabled(uid, user, args.Enabled, true);
+ SetMicrophoneEnabled(uid, args.Actor, args.Enabled, true);
UpdateIntercomUi(uid, component);
}
private void OnToggleIntercomSpeaker(EntityUid uid, IntercomComponent component, ToggleIntercomSpeakerMessage args)
{
- if (component.RequiresPower && !this.IsPowered(uid, EntityManager) || args.Session.AttachedEntity is not { } user)
+ if (component.RequiresPower && !this.IsPowered(uid, EntityManager))
return;
- SetSpeakerEnabled(uid, user, args.Enabled, true);
+ SetSpeakerEnabled(uid, args.Actor, args.Enabled, true);
UpdateIntercomUi(uid, component);
}
private void OnSelectIntercomChannel(EntityUid uid, IntercomComponent component, SelectIntercomChannelMessage args)
{
- if (component.RequiresPower && !this.IsPowered(uid, EntityManager) || args.Session.AttachedEntity is not { })
+ if (component.RequiresPower && !this.IsPowered(uid, EntityManager))
return;
if (!_protoMan.TryIndex(args.Channel, out _) || !component.SupportedChannels.Contains(args.Channel))
@@ -259,6 +262,6 @@ public sealed class RadioDeviceSystem : EntitySystem
var availableChannels = component.SupportedChannels;
var selectedChannel = micComp?.BroadcastChannel ?? SharedChatSystem.CommonChannel;
var state = new IntercomBoundUIState(micEnabled, speakerEnabled, availableChannels, selectedChannel);
- _ui.TrySetUiState(uid, IntercomUiKey.Key, state);
+ _ui.SetUiState(uid, IntercomUiKey.Key, state);
}
}
diff --git a/Content.Server/Radio/EntitySystems/RadioSystem.cs b/Content.Server/Radio/EntitySystems/RadioSystem.cs
index 5d3074b06b..4341746aaf 100644
--- a/Content.Server/Radio/EntitySystems/RadioSystem.cs
+++ b/Content.Server/Radio/EntitySystems/RadioSystem.cs
@@ -112,7 +112,7 @@ public sealed class RadioSystem : EntitySystem
NetEntity.Invalid,
null);
var chatMsg = new MsgChatMessage { Message = chat };
- var ev = new RadioReceiveEvent(message, messageSource, channel, chatMsg);
+ var ev = new RadioReceiveEvent(message, messageSource, channel, radioSource, chatMsg);
var sendAttemptEv = new RadioSendAttemptEvent(channel, radioSource);
RaiseLocalEvent(ref sendAttemptEv);
diff --git a/Content.Server/Radio/RadioEvent.cs b/Content.Server/Radio/RadioEvent.cs
index 69d764ffe6..fafa66674e 100644
--- a/Content.Server/Radio/RadioEvent.cs
+++ b/Content.Server/Radio/RadioEvent.cs
@@ -4,7 +4,7 @@ using Content.Shared.Radio;
namespace Content.Server.Radio;
[ByRefEvent]
-public readonly record struct RadioReceiveEvent(string Message, EntityUid MessageSource, RadioChannelPrototype Channel, MsgChatMessage ChatMsg);
+public readonly record struct RadioReceiveEvent(string Message, EntityUid MessageSource, RadioChannelPrototype Channel, EntityUid RadioSource, MsgChatMessage ChatMsg);
///
/// Use this event to cancel sending message per receiver
diff --git a/Content.Server/Research/Systems/ResearchSystem.Client.cs b/Content.Server/Research/Systems/ResearchSystem.Client.cs
index 6bd5300d8f..f8fdba55b7 100644
--- a/Content.Server/Research/Systems/ResearchSystem.Client.cs
+++ b/Content.Server/Research/Systems/ResearchSystem.Client.cs
@@ -45,7 +45,7 @@ public sealed partial class ResearchSystem
if (!this.IsPowered(uid, EntityManager))
return;
- _uiSystem.TryToggleUi(uid, ResearchClientUiKey.Key, args.Session);
+ _uiSystem.TryToggleUi(uid, ResearchClientUiKey.Key, args.Actor);
}
#endregion
@@ -88,7 +88,7 @@ public sealed partial class ResearchSystem
var state = new ResearchClientBoundInterfaceState(names.Length, names,
GetServerIds(), serverComponent?.Id ?? -1);
- _uiSystem.TrySetUiState(uid, ResearchClientUiKey.Key, state);
+ _uiSystem.SetUiState(uid, ResearchClientUiKey.Key, state);
}
///
diff --git a/Content.Server/Research/Systems/ResearchSystem.Console.cs b/Content.Server/Research/Systems/ResearchSystem.Console.cs
index 9f95fd2517..5358ddefcd 100644
--- a/Content.Server/Research/Systems/ResearchSystem.Console.cs
+++ b/Content.Server/Research/Systems/ResearchSystem.Console.cs
@@ -20,8 +20,7 @@ public sealed partial class ResearchSystem
private void OnConsoleUnlock(EntityUid uid, ResearchConsoleComponent component, ConsoleUnlockTechnologyMessage args)
{
- if (args.Session.AttachedEntity is not { } ent)
- return;
+ var act = args.Actor;
if (!this.IsPowered(uid, EntityManager))
return;
@@ -29,13 +28,13 @@ public sealed partial class ResearchSystem
if (!PrototypeManager.TryIndex(args.Id, out var technologyPrototype))
return;
- if (TryComp(uid, out var access) && !_accessReader.IsAllowed(ent, uid, access))
+ if (TryComp(uid, out var access) && !_accessReader.IsAllowed(act, uid, access))
{
- _popup.PopupEntity(Loc.GetString("research-console-no-access-popup"), ent);
+ _popup.PopupEntity(Loc.GetString("research-console-no-access-popup"), act);
return;
}
- if (!UnlockTechnology(uid, args.Id, ent))
+ if (!UnlockTechnology(uid, args.Id, act))
return;
var message = Loc.GetString("research-console-unlock-technology-radio-broadcast",
@@ -68,7 +67,7 @@ public sealed partial class ResearchSystem
state = new ResearchConsoleBoundInterfaceState(default);
}
- _uiSystem.TrySetUiState(uid, ResearchConsoleUiKey.Key, state);
+ _uiSystem.SetUiState(uid, ResearchConsoleUiKey.Key, state);
}
private void OnPointsChanged(EntityUid uid, ResearchConsoleComponent component, ref ResearchServerPointsChangedEvent args)
diff --git a/Content.Server/Research/TechnologyDisk/Systems/DiskConsoleSystem.cs b/Content.Server/Research/TechnologyDisk/Systems/DiskConsoleSystem.cs
index 2064abd8eb..6700247522 100644
--- a/Content.Server/Research/TechnologyDisk/Systems/DiskConsoleSystem.cs
+++ b/Content.Server/Research/TechnologyDisk/Systems/DiskConsoleSystem.cs
@@ -91,7 +91,7 @@ public sealed class DiskConsoleSystem : EntitySystem
totalPoints >= component.PricePerDisk;
var state = new DiskConsoleBoundUserInterfaceState(totalPoints, component.PricePerDisk, canPrint);
- _ui.TrySetUiState(uid, DiskConsoleUiKey.Key, state);
+ _ui.SetUiState(uid, DiskConsoleUiKey.Key, state);
}
private void OnShutdown(EntityUid uid, DiskConsolePrintingComponent component, ComponentShutdown args)
diff --git a/Content.Server/Salvage/SalvageSystem.ExpeditionConsole.cs b/Content.Server/Salvage/SalvageSystem.ExpeditionConsole.cs
index 61636bea7c..d031418476 100644
--- a/Content.Server/Salvage/SalvageSystem.ExpeditionConsole.cs
+++ b/Content.Server/Salvage/SalvageSystem.ExpeditionConsole.cs
@@ -56,7 +56,7 @@ public sealed partial class SalvageSystem
if (station != component.Owner)
continue;
- _ui.TrySetUiState(uid, SalvageConsoleUiKey.Expedition, state, ui: uiComp);
+ _ui.SetUiState((uid, uiComp), SalvageConsoleUiKey.Expedition, state);
}
}
@@ -74,6 +74,6 @@ public sealed partial class SalvageSystem
state = new SalvageExpeditionConsoleState(TimeSpan.Zero, false, true, 0, new List());
}
- _ui.TrySetUiState(component, SalvageConsoleUiKey.Expedition, state);
+ _ui.SetUiState(component.Owner, SalvageConsoleUiKey.Expedition, state);
}
}
diff --git a/Content.Server/Salvage/SalvageSystem.Magnet.cs b/Content.Server/Salvage/SalvageSystem.Magnet.cs
index e4711a5876..4b7291298b 100644
--- a/Content.Server/Salvage/SalvageSystem.Magnet.cs
+++ b/Content.Server/Salvage/SalvageSystem.Magnet.cs
@@ -35,11 +35,6 @@ public sealed partial class SalvageSystem
private void OnMagnetClaim(EntityUid uid, SalvageMagnetComponent component, ref MagnetClaimOfferEvent args)
{
- var player = args.Session.AttachedEntity;
-
- if (player is null)
- return;
-
var station = _station.GetOwningStation(uid);
if (!TryComp(station, out SalvageMagnetDataComponent? dataComp) ||
@@ -177,12 +172,12 @@ public sealed partial class SalvageSystem
// Fuck with the seed to mix wrecks and asteroids.
seed = (int) (seed / 10f) * 10;
-
+
if (i >= data.Comp.OfferCount / 2)
{
seed++;
}
-
+
data.Comp.Offered.Add(seed);
}
@@ -216,7 +211,7 @@ public sealed partial class SalvageSystem
if (!TryComp(station, out SalvageMagnetDataComponent? dataComp))
return;
- _ui.TrySetUiState(entity, SalvageMagnetUiKey.Key,
+ _ui.SetUiState(entity.Owner, SalvageMagnetUiKey.Key,
new SalvageMagnetBoundUserInterfaceState(dataComp.Offered)
{
Cooldown = dataComp.OfferCooldown,
@@ -238,7 +233,7 @@ public sealed partial class SalvageSystem
if (station != data.Owner)
continue;
- _ui.TrySetUiState(magnetUid, SalvageMagnetUiKey.Key,
+ _ui.SetUiState(magnetUid, SalvageMagnetUiKey.Key,
new SalvageMagnetBoundUserInterfaceState(data.Comp.Offered)
{
Cooldown = data.Comp.OfferCooldown,
diff --git a/Content.Server/SensorMonitoring/SensorMonitoringConsoleComponent.cs b/Content.Server/SensorMonitoring/SensorMonitoringConsoleComponent.cs
index 63b4d9daef..b5a954f166 100644
--- a/Content.Server/SensorMonitoring/SensorMonitoringConsoleComponent.cs
+++ b/Content.Server/SensorMonitoring/SensorMonitoringConsoleComponent.cs
@@ -27,7 +27,7 @@ public sealed partial class SensorMonitoringConsoleComponent : Component
public TimeSpan RetentionTime = TimeSpan.FromMinutes(1);
// UI update tracking stuff.
- public HashSet InitialUIStateSent = new();
+ public HashSet InitialUIStateSent = new();
public TimeSpan LastUIUpdate;
public ValueList RemovedSensors;
diff --git a/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.UI.cs b/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.UI.cs
index 26c6b17831..dec3e6c36e 100644
--- a/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.UI.cs
+++ b/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.UI.cs
@@ -18,27 +18,26 @@ public sealed partial class SensorMonitoringConsoleSystem
private void UpdateConsoleUI(EntityUid uid, SensorMonitoringConsoleComponent comp)
{
- if (!_userInterface.TryGetUi(uid, SensorMonitoringConsoleUiKey.Key, out var ui))
- return;
-
- if (ui.SubscribedSessions.Count == 0)
+ if (!_userInterface.IsUiOpen(uid, SensorMonitoringConsoleUiKey.Key))
+ {
return;
+ }
ConsoleUIState? fullState = null;
SensorMonitoringIncrementalUpdate? incrementalUpdate = null;
- foreach (var session in ui.SubscribedSessions)
+ foreach (var actorUid in _userInterface.GetActors(uid, SensorMonitoringConsoleUiKey.Key))
{
- if (comp.InitialUIStateSent.Contains(session))
+ if (comp.InitialUIStateSent.Contains(actorUid))
{
incrementalUpdate ??= CalculateIncrementalUpdate();
- _userInterface.TrySendUiMessage(ui, incrementalUpdate, session);
+ _userInterface.ServerSendUiMessage(uid, SensorMonitoringConsoleUiKey.Key, incrementalUpdate, actorUid);
}
else
{
fullState ??= CalculateFullState();
- _userInterface.SetUiState(ui, fullState, session);
- comp.InitialUIStateSent.Add(session);
+ _userInterface.SetUiState(uid, SensorMonitoringConsoleUiKey.Key, fullState);
+ comp.InitialUIStateSent.Add(actorUid);
}
}
@@ -131,9 +130,6 @@ public sealed partial class SensorMonitoringConsoleSystem
if (!args.UiKey.Equals(SensorMonitoringConsoleUiKey.Key))
return;
- if (args.Session is not { } player)
- return;
-
- component.InitialUIStateSent.Remove(player);
+ component.InitialUIStateSent.Remove(args.Actor);
}
}
diff --git a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs
index 803aa963f3..d45c04cdc2 100644
--- a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs
+++ b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs
@@ -245,19 +245,18 @@ public sealed partial class EmergencyShuttleSystem
private void OnEmergencyRepealAll(EntityUid uid, EmergencyShuttleConsoleComponent component, EmergencyShuttleRepealAllMessage args)
{
- var player = args.Session.AttachedEntity;
- if (player == null) return;
+ var player = args.Actor;
- if (!_reader.FindAccessTags(player.Value).Contains(EmergencyRepealAllAccess))
+ if (!_reader.FindAccessTags(player).Contains(EmergencyRepealAllAccess))
{
- _popup.PopupCursor(Loc.GetString("emergency-shuttle-console-denied"), player.Value, PopupType.Medium);
+ _popup.PopupCursor(Loc.GetString("emergency-shuttle-console-denied"), player, PopupType.Medium);
return;
}
if (component.AuthorizedEntities.Count == 0)
return;
- _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle early launch REPEAL ALL by {args.Session:user}");
+ _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle early launch REPEAL ALL by {args.Actor:user}");
_chatSystem.DispatchGlobalAnnouncement(Loc.GetString("emergency-shuttle-console-auth-revoked", ("remaining", component.AuthorizationsRequired)));
component.AuthorizedEntities.Clear();
UpdateAllEmergencyConsoles();
@@ -265,13 +264,11 @@ public sealed partial class EmergencyShuttleSystem
private void OnEmergencyRepeal(EntityUid uid, EmergencyShuttleConsoleComponent component, EmergencyShuttleRepealMessage args)
{
- var player = args.Session.AttachedEntity;
- if (player == null)
- return;
+ var player = args.Actor;
- if (!_idSystem.TryFindIdCard(player.Value, out var idCard) || !_reader.IsAllowed(idCard, uid))
+ if (!_idSystem.TryFindIdCard(player, out var idCard) || !_reader.IsAllowed(idCard, uid))
{
- _popup.PopupCursor(Loc.GetString("emergency-shuttle-console-denied"), player.Value, PopupType.Medium);
+ _popup.PopupCursor(Loc.GetString("emergency-shuttle-console-denied"), player, PopupType.Medium);
return;
}
@@ -279,7 +276,7 @@ public sealed partial class EmergencyShuttleSystem
if (!component.AuthorizedEntities.Remove(MetaData(idCard).EntityName))
return;
- _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle early launch REPEAL by {args.Session:user}");
+ _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle early launch REPEAL by {args.Actor:user}");
var remaining = component.AuthorizationsRequired - component.AuthorizedEntities.Count;
_chatSystem.DispatchGlobalAnnouncement(Loc.GetString("emergency-shuttle-console-auth-revoked", ("remaining", remaining)));
CheckForLaunch(component);
@@ -288,13 +285,11 @@ public sealed partial class EmergencyShuttleSystem
private void OnEmergencyAuthorize(EntityUid uid, EmergencyShuttleConsoleComponent component, EmergencyShuttleAuthorizeMessage args)
{
- var player = args.Session.AttachedEntity;
- if (player == null)
- return;
+ var player = args.Actor;
- if (!_idSystem.TryFindIdCard(player.Value, out var idCard) || !_reader.IsAllowed(idCard, uid))
+ if (!_idSystem.TryFindIdCard(player, out var idCard) || !_reader.IsAllowed(idCard, uid))
{
- _popup.PopupCursor(Loc.GetString("emergency-shuttle-console-denied"), args.Session, PopupType.Medium);
+ _popup.PopupCursor(Loc.GetString("emergency-shuttle-console-denied"), args.Actor, PopupType.Medium);
return;
}
@@ -302,7 +297,7 @@ public sealed partial class EmergencyShuttleSystem
if (!component.AuthorizedEntities.Add(MetaData(idCard).EntityName))
return;
- _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle early launch AUTH by {args.Session:user}");
+ _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle early launch AUTH by {args.Actor:user}");
var remaining = component.AuthorizationsRequired - component.AuthorizedEntities.Count;
if (remaining > 0)
@@ -349,9 +344,10 @@ public sealed partial class EmergencyShuttleSystem
auths.Add(auth);
}
- if (_uiSystem.TryGetUi(uid, EmergencyConsoleUiKey.Key, out var bui))
+ if (_uiSystem.HasUi(uid, EmergencyConsoleUiKey.Key))
_uiSystem.SetUiState(
- bui,
+ uid,
+ EmergencyConsoleUiKey.Key,
new EmergencyConsoleBoundUserInterfaceState()
{
EarlyLaunchTime = EarlyLaunchAuthorized ? _timing.CurTime + TimeSpan.FromSeconds(_consoleAccumulator) : null,
diff --git a/Content.Server/Shuttles/Systems/RadarConsoleSystem.cs b/Content.Server/Shuttles/Systems/RadarConsoleSystem.cs
index b7f08b4b34..1de20a8734 100644
--- a/Content.Server/Shuttles/Systems/RadarConsoleSystem.cs
+++ b/Content.Server/Shuttles/Systems/RadarConsoleSystem.cs
@@ -39,7 +39,7 @@ public sealed class RadarConsoleSystem : SharedRadarConsoleSystem
angle = Angle.Zero;
}
- if (_uiSystem.TryGetUi(uid, RadarConsoleUiKey.Key, out var bui))
+ if (_uiSystem.HasUi(uid, RadarConsoleUiKey.Key))
{
NavInterfaceState state;
var docks = _console.GetAllDocks();
@@ -53,7 +53,7 @@ public sealed class RadarConsoleSystem : SharedRadarConsoleSystem
state = _console.GetNavState(uid, docks);
}
- _uiSystem.SetUiState(bui, new NavBoundUserInterfaceState(state));
+ _uiSystem.SetUiState(uid, RadarConsoleUiKey.Key, new NavBoundUserInterfaceState(state));
}
}
}
diff --git a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs
index a4f2c7b4db..89dc114caf 100644
--- a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs
+++ b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs
@@ -136,13 +136,12 @@ public sealed partial class ShuttleConsoleSystem : SharedShuttleConsoleSystem
///
private void OnConsoleUIClose(EntityUid uid, ShuttleConsoleComponent component, BoundUIClosedEvent args)
{
- if ((ShuttleConsoleUiKey) args.UiKey != ShuttleConsoleUiKey.Key ||
- args.Session.AttachedEntity is not { } user)
+ if ((ShuttleConsoleUiKey) args.UiKey != ShuttleConsoleUiKey.Key)
{
return;
}
- RemovePilot(user);
+ RemovePilot(args.Actor);
}
private void OnConsoleUIOpenAttempt(EntityUid uid, ShuttleConsoleComponent component,
@@ -265,9 +264,9 @@ public sealed partial class ShuttleConsoleSystem : SharedShuttleConsoleSystem
new List());
}
- if (_ui.TryGetUi(consoleUid, ShuttleConsoleUiKey.Key, out var bui))
+ if (_ui.HasUi(consoleUid, ShuttleConsoleUiKey.Key))
{
- _ui.SetUiState(bui, new ShuttleBoundUserInterfaceState(navState, mapState, dockState));
+ _ui.SetUiState(consoleUid, ShuttleConsoleUiKey.Key, new ShuttleBoundUserInterfaceState(navState, mapState, dockState));
}
}
diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.IFF.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.IFF.cs
index bf265da2e6..ce79466b58 100644
--- a/Content.Server/Shuttles/Systems/ShuttleSystem.IFF.cs
+++ b/Content.Server/Shuttles/Systems/ShuttleSystem.IFF.cs
@@ -57,7 +57,7 @@ public sealed partial class ShuttleSystem
!TryComp(uid, out var xform) ||
!TryComp(xform.GridUid, out var iff))
{
- _uiSystem.TrySetUiState(uid, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState()
+ _uiSystem.SetUiState(uid, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState()
{
AllowedFlags = component.AllowedFlags,
Flags = IFFFlags.None,
@@ -65,7 +65,7 @@ public sealed partial class ShuttleSystem
}
else
{
- _uiSystem.TrySetUiState(uid, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState()
+ _uiSystem.SetUiState(uid, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState()
{
AllowedFlags = component.AllowedFlags,
Flags = iff.Flags,
@@ -83,7 +83,7 @@ public sealed partial class ShuttleSystem
if (xform.GridUid != gridUid)
continue;
- _uiSystem.TrySetUiState(uid, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState()
+ _uiSystem.SetUiState(uid, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState()
{
AllowedFlags = comp.AllowedFlags,
Flags = component.Flags,
diff --git a/Content.Server/Silicons/Borgs/BorgSystem.Ui.cs b/Content.Server/Silicons/Borgs/BorgSystem.Ui.cs
index 3dcdd78aff..d0e9f80e36 100644
--- a/Content.Server/Silicons/Borgs/BorgSystem.Ui.cs
+++ b/Content.Server/Silicons/Borgs/BorgSystem.Ui.cs
@@ -28,20 +28,19 @@ public sealed partial class BorgSystem
private void OnEjectBrainBuiMessage(EntityUid uid, BorgChassisComponent component, BorgEjectBrainBuiMessage args)
{
- if (args.Session.AttachedEntity is not { } attachedEntity || component.BrainEntity is not { } brain)
+ if (component.BrainEntity is not { } brain)
return;
_adminLog.Add(LogType.Action, LogImpact.Medium,
- $"{ToPrettyString(attachedEntity):player} removed brain {ToPrettyString(brain)} from borg {ToPrettyString(uid)}");
+ $"{ToPrettyString(args.Actor):player} removed brain {ToPrettyString(brain)} from borg {ToPrettyString(uid)}");
_container.Remove(brain, component.BrainContainer);
- _hands.TryPickupAnyHand(attachedEntity, brain);
+ _hands.TryPickupAnyHand(args.Actor, brain);
UpdateUI(uid, component);
}
private void OnEjectBatteryBuiMessage(EntityUid uid, BorgChassisComponent component, BorgEjectBatteryBuiMessage args)
{
- if (args.Session.AttachedEntity is not { } attachedEntity ||
- !TryComp(uid, out var slotComp) ||
+ if (!TryComp(uid, out var slotComp) ||
!Container.TryGetContainer(uid, slotComp.CellSlotId, out var container) ||
!container.ContainedEntities.Any())
{
@@ -49,14 +48,11 @@ public sealed partial class BorgSystem
}
var ents = Container.EmptyContainer(container);
- _hands.TryPickupAnyHand(attachedEntity, ents.First());
+ _hands.TryPickupAnyHand(args.Actor, ents.First());
}
private void OnSetNameBuiMessage(EntityUid uid, BorgChassisComponent component, BorgSetNameBuiMessage args)
{
- if (args.Session.AttachedEntity is not { } attachedEntity)
- return;
-
if (args.Name.Length > HumanoidCharacterProfile.MaxNameLength ||
args.Name.Length == 0 ||
string.IsNullOrWhiteSpace(args.Name) ||
@@ -75,24 +71,21 @@ public sealed partial class BorgSystem
if (metaData.EntityName.Equals(name, StringComparison.InvariantCulture))
return;
- _adminLog.Add(LogType.Action, LogImpact.High, $"{ToPrettyString(attachedEntity):player} set borg \"{ToPrettyString(uid)}\"'s name to: {name}");
+ _adminLog.Add(LogType.Action, LogImpact.High, $"{ToPrettyString(args.Actor):player} set borg \"{ToPrettyString(uid)}\"'s name to: {name}");
_metaData.SetEntityName(uid, name, metaData);
}
private void OnRemoveModuleBuiMessage(EntityUid uid, BorgChassisComponent component, BorgRemoveModuleBuiMessage args)
{
- if (args.Session.AttachedEntity is not { } attachedEntity)
- return;
-
var module = GetEntity(args.Module);
if (!component.ModuleContainer.Contains(module))
return;
_adminLog.Add(LogType.Action, LogImpact.Medium,
- $"{ToPrettyString(attachedEntity):player} removed module {ToPrettyString(module)} from borg {ToPrettyString(uid)}");
+ $"{ToPrettyString(args.Actor):player} removed module {ToPrettyString(module)} from borg {ToPrettyString(uid)}");
_container.Remove(module, component.ModuleContainer);
- _hands.TryPickupAnyHand(attachedEntity, module);
+ _hands.TryPickupAnyHand(args.Actor, module);
UpdateUI(uid, component);
}
@@ -111,6 +104,6 @@ public sealed partial class BorgSystem
}
var state = new BorgBuiState(chargePercent, hasBattery);
- _ui.TrySetUiState(uid, BorgUiKey.Key, state);
+ _ui.SetUiState(uid, BorgUiKey.Key, state);
}
}
diff --git a/Content.Server/Silicons/Laws/SiliconLawSystem.cs b/Content.Server/Silicons/Laws/SiliconLawSystem.cs
index 010682bc0d..cc1532899d 100644
--- a/Content.Server/Silicons/Laws/SiliconLawSystem.cs
+++ b/Content.Server/Silicons/Laws/SiliconLawSystem.cs
@@ -93,10 +93,10 @@ public sealed class SiliconLawSystem : SharedSiliconLawSystem
private void OnBoundUIOpened(EntityUid uid, SiliconLawBoundComponent component, BoundUIOpenedEvent args)
{
_entityManager.TryGetComponent(uid, out var intrinsicRadio);
- HashSet? radioChannels = intrinsicRadio?.Channels;
+ var radioChannels = intrinsicRadio?.Channels;
var state = new SiliconLawBuiState(GetLaws(uid).Laws, radioChannels);
- _userInterface.TrySetUiState(args.Entity, SiliconLawsUiKey.Key, state, args.Session);
+ _userInterface.SetUiState(args.Entity, SiliconLawsUiKey.Key, state);
}
private void OnPlayerSpawnComplete(EntityUid uid, SiliconLawBoundComponent component, PlayerSpawnCompleteEvent args)
diff --git a/Content.Server/Solar/EntitySystems/PowerSolarControlConsoleSystem.cs b/Content.Server/Solar/EntitySystems/PowerSolarControlConsoleSystem.cs
index 179cadcfbc..dd3f0c0054 100644
--- a/Content.Server/Solar/EntitySystems/PowerSolarControlConsoleSystem.cs
+++ b/Content.Server/Solar/EntitySystems/PowerSolarControlConsoleSystem.cs
@@ -35,13 +35,13 @@ namespace Content.Server.Solar.EntitySystems
_updateTimer -= 1;
var state = new SolarControlConsoleBoundInterfaceState(_powerSolarSystem.TargetPanelRotation, _powerSolarSystem.TargetPanelVelocity, _powerSolarSystem.TotalPanelPower, _powerSolarSystem.TowardsSun);
var query = EntityQueryEnumerator();
- while (query.MoveNext(out var uid, out var _, out var uiComp))
+ while (query.MoveNext(out var uid, out _, out var uiComp))
{
- _uiSystem.TrySetUiState(uid, SolarControlConsoleUiKey.Key, state, ui: uiComp);
+ _uiSystem.SetUiState((uid, uiComp), SolarControlConsoleUiKey.Key, state);
}
}
}
-
+
private void OnUIMessage(EntityUid uid, SolarControlConsoleComponent component, SolarControlConsoleAdjustMessage msg)
{
if (double.IsFinite(msg.Rotation))
diff --git a/Content.Server/StationRecords/Systems/GeneralStationRecordConsoleSystem.cs b/Content.Server/StationRecords/Systems/GeneralStationRecordConsoleSystem.cs
index 721eff6f2c..a5202285d9 100644
--- a/Content.Server/StationRecords/Systems/GeneralStationRecordConsoleSystem.cs
+++ b/Content.Server/StationRecords/Systems/GeneralStationRecordConsoleSystem.cs
@@ -57,7 +57,7 @@ public sealed class GeneralStationRecordConsoleSystem : EntitySystem
if (!TryComp(owningStation, out var stationRecords))
{
- _ui.TrySetUiState(uid, GeneralStationRecordConsoleKey.Key, new GeneralStationRecordConsoleState());
+ _ui.SetUiState(uid, GeneralStationRecordConsoleKey.Key, new GeneralStationRecordConsoleState());
return;
}
@@ -66,7 +66,7 @@ public sealed class GeneralStationRecordConsoleSystem : EntitySystem
switch (listing.Count)
{
case 0:
- _ui.TrySetUiState(uid, GeneralStationRecordConsoleKey.Key, new GeneralStationRecordConsoleState());
+ _ui.SetUiState(uid, GeneralStationRecordConsoleKey.Key, new GeneralStationRecordConsoleState());
return;
case 1:
console.ActiveKey = listing.Keys.First();
@@ -80,6 +80,6 @@ public sealed class GeneralStationRecordConsoleSystem : EntitySystem
_stationRecords.TryGetRecord(key, out var record, stationRecords);
GeneralStationRecordConsoleState newState = new(id, record, listing, console.Filter);
- _ui.TrySetUiState(uid, GeneralStationRecordConsoleKey.Key, newState);
+ _ui.SetUiState(uid, GeneralStationRecordConsoleKey.Key, newState);
}
}
diff --git a/Content.Server/Storage/EntitySystems/StorageSystem.cs b/Content.Server/Storage/EntitySystems/StorageSystem.cs
index 5d41e0a521..4b5dd7290c 100644
--- a/Content.Server/Storage/EntitySystems/StorageSystem.cs
+++ b/Content.Server/Storage/EntitySystems/StorageSystem.cs
@@ -7,10 +7,8 @@ using Content.Shared.Lock;
using Content.Shared.Storage;
using Content.Shared.Storage.Components;
using Content.Shared.Storage.EntitySystems;
-using Content.Shared.Timing;
using Content.Shared.Verbs;
using Robust.Server.GameObjects;
-using Robust.Shared.Audio.Systems;
using Robust.Shared.Map;
using Robust.Shared.Player;
using Robust.Shared.Prototypes;
@@ -20,124 +18,21 @@ namespace Content.Server.Storage.EntitySystems;
public sealed partial class StorageSystem : SharedStorageSystem
{
- [Dependency] private readonly IAdminManager _admin = default!;
[Dependency] private readonly IPrototypeManager _prototype = default!;
- [Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
- [Dependency] private readonly SharedAudioSystem _audio = default!;
- [Dependency] private readonly UseDelaySystem _useDelay = default!;
public override void Initialize()
{
base.Initialize();
- SubscribeLocalEvent>(AddUiVerb);
- Subs.BuiEvents(StorageComponent.StorageUiKey.Key, subs =>
- {
- subs.Event(OnBoundUIClosed);
- });
SubscribeLocalEvent(OnExploded);
SubscribeLocalEvent(OnStorageFillMapInit);
}
- private void AddUiVerb(EntityUid uid, StorageComponent component, GetVerbsEvent args)
- {
- var silent = false;
- if (!args.CanAccess || !args.CanInteract || TryComp(uid, out var lockComponent) && lockComponent.Locked)
- {
- // we allow admins to open the storage anyways
- if (!_admin.HasAdminFlag(args.User, AdminFlags.Admin))
- return;
-
- silent = true;
- }
-
- silent |= HasComp(args.User);
-
- // Get the session for the user
- if (!TryComp(args.User, out var actor))
- return;
-
- // Does this player currently have the storage UI open?
- var uiOpen = _uiSystem.SessionHasOpenUi(uid, StorageComponent.StorageUiKey.Key, actor.PlayerSession);
-
- ActivationVerb verb = new()
- {
- Act = () =>
- {
- if (uiOpen)
- {
- _uiSystem.TryClose(uid, StorageComponent.StorageUiKey.Key, actor.PlayerSession);
- }
- else
- {
- OpenStorageUI(uid, args.User, component, silent);
- }
- }
- };
- if (uiOpen)
- {
- verb.Text = Loc.GetString("comp-storage-verb-close-storage");
- verb.Icon = new SpriteSpecifier.Texture(
- new("/Textures/Interface/VerbIcons/close.svg.192dpi.png"));
- }
- else
- {
- verb.Text = Loc.GetString("comp-storage-verb-open-storage");
- verb.Icon = new SpriteSpecifier.Texture(
- new("/Textures/Interface/VerbIcons/open.svg.192dpi.png"));
- }
- args.Verbs.Add(verb);
- }
-
- private void OnBoundUIClosed(EntityUid uid, StorageComponent storageComp, BoundUIClosedEvent args)
- {
- if (TryComp(args.Session.AttachedEntity, out var actor) && actor?.PlayerSession != null)
- CloseNestedInterfaces(uid, actor.PlayerSession, storageComp);
-
- // If UI is closed for everyone
- if (!_uiSystem.IsUiOpen(uid, args.UiKey))
- {
- storageComp.IsUiOpen = false;
- UpdateAppearance((uid, storageComp, null));
-
- if (storageComp.StorageCloseSound is not null)
- Audio.PlayEntity(storageComp.StorageCloseSound, Filter.Pvs(uid, entityManager: EntityManager), uid, true, storageComp.StorageCloseSound.Params);
- }
- }
-
private void OnExploded(Entity ent, ref BeforeExplodeEvent args)
{
args.Contents.AddRange(ent.Comp.Container.ContainedEntities);
}
- ///