]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Fix objects tab not showing nents (#23837)
authormetalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Wed, 10 Jan 2024 08:30:20 +0000 (19:30 +1100)
committerGitHub <noreply@github.com>
Wed, 10 Jan 2024 08:30:20 +0000 (01:30 -0700)
* Fix objects tab not showing nents

* Fix everything

Content.Client/Administration/UI/Tabs/ObjectsTab/ObjectsTab.xaml.cs
Content.Client/Administration/UI/Tabs/ObjectsTab/ObjectsTabEntry.xaml.cs
Content.Client/Station/StationSystem.cs
Content.Client/UserInterface/Systems/Admin/AdminUIController.cs
Content.Server/Station/Systems/StationSystem.cs
Content.Shared/Station/StationsUpdatedEvent.cs

index dcb184b3083302d3edf354b8352e478498cc2e22..a5c300843658695b02e020555c190d9f8e10ca61 100644 (file)
@@ -3,6 +3,7 @@ using Robust.Client.AutoGenerated;
 using Robust.Client.UserInterface;
 using Robust.Client.UserInterface.XAML;
 using Robust.Shared.Map.Components;
+using Robust.Shared.Timing;
 
 namespace Content.Client.Administration.UI.Tabs.ObjectsTab;
 
@@ -10,12 +11,20 @@ namespace Content.Client.Administration.UI.Tabs.ObjectsTab;
 public sealed partial class ObjectsTab : Control
 {
     [Dependency] private readonly EntityManager _entityManager = default!;
+    [Dependency] private readonly IGameTiming _timing = default!;
 
     private readonly List<ObjectsTabEntry> _objects = new();
     private List<ObjectsTabSelection> _selections = new();
 
     public event Action<ObjectsTabEntry, GUIBoundKeyEventArgs>? OnEntryKeyBindDown;
 
+    // Listen I could either have like 4 different event subscribers (for map / grid / station changes) and manage their lifetimes in AdminUIController
+    // OR
+    // I can do this.
+    private TimeSpan _updateFrequency = TimeSpan.FromSeconds(2);
+
+    private TimeSpan _nextUpdate = TimeSpan.FromSeconds(2);
+
     public ObjectsTab()
     {
         RobustXamlLoader.Load(this);
@@ -33,12 +42,17 @@ public sealed partial class ObjectsTab : Control
             ObjectTypeOptions.AddItem(Enum.GetName((ObjectsTabSelection)type)!);
         }
 
+        RefreshObjectList();
+    }
+
+    private void RefreshObjectList()
+    {
         RefreshObjectList(_selections[ObjectTypeOptions.SelectedId]);
     }
 
     private void RefreshObjectList(ObjectsTabSelection selection)
     {
-        var entities = new List<EntityUid>();
+        var entities = new List<(string Name, NetEntity Entity)>();
         switch (selection)
         {
             case ObjectsTabSelection.Stations:
@@ -46,20 +60,20 @@ public sealed partial class ObjectsTab : Control
                 break;
             case ObjectsTabSelection.Grids:
             {
-                var query = _entityManager.AllEntityQueryEnumerator<MapGridComponent>();
-                while (query.MoveNext(out var uid, out _))
+                var query = _entityManager.AllEntityQueryEnumerator<MapGridComponent, MetaDataComponent>();
+                while (query.MoveNext(out var uid, out _, out var metadata))
                 {
-                    entities.Add(uid);
+                    entities.Add((metadata.EntityName, _entityManager.GetNetEntity(uid)));
                 }
 
                 break;
             }
             case ObjectsTabSelection.Maps:
             {
-                var query = _entityManager.AllEntityQueryEnumerator<MapComponent>();
-                while (query.MoveNext(out var uid, out _))
+                var query = _entityManager.AllEntityQueryEnumerator<MapComponent, MetaDataComponent>();
+                while (query.MoveNext(out var uid, out _, out var metadata))
                 {
-                    entities.Add(uid);
+                    entities.Add((metadata.EntityName, _entityManager.GetNetEntity(uid)));
                 }
                 break;
             }
@@ -74,17 +88,28 @@ public sealed partial class ObjectsTab : Control
 
         _objects.Clear();
 
-        foreach (var entity in entities)
+        foreach (var (name, nent) in entities)
         {
-            // TODO the server eitehr needs to send the entity's name, or it needs to ensure the client knows about the entity.
-            var name = _entityManager.GetComponentOrNull<MetaDataComponent>(entity)?.EntityName ?? "Unknown Entity"; // this should be fixed, so I CBF localizing.
-            var ctrl = new ObjectsTabEntry(name, entity);
+            var ctrl = new ObjectsTabEntry(name, nent);
             _objects.Add(ctrl);
             ObjectList.AddChild(ctrl);
             ctrl.OnKeyBindDown += args => OnEntryKeyBindDown?.Invoke(ctrl, args);
         }
     }
 
+    protected override void FrameUpdate(FrameEventArgs args)
+    {
+        base.FrameUpdate(args);
+
+        if (_timing.CurTime < _nextUpdate)
+            return;
+
+        // I do not care for precision.
+        _nextUpdate = _timing.CurTime + _updateFrequency;
+
+        RefreshObjectList();
+    }
+
     private enum ObjectsTabSelection
     {
         Grids,
index 98cfe53af193ea13065083e1e58bd445ab5aad1b..c9b2cd8b572d131109bd6145ada066b0be8a2e7a 100644 (file)
@@ -7,13 +7,13 @@ namespace Content.Client.Administration.UI.Tabs.ObjectsTab;
 [GenerateTypedNameReferences]
 public sealed partial class ObjectsTabEntry : ContainerButton
 {
-    public EntityUid AssocEntity;
+    public NetEntity AssocEntity;
 
-    public ObjectsTabEntry(string name, EntityUid euid)
+    public ObjectsTabEntry(string name, NetEntity nent)
     {
         RobustXamlLoader.Load(this);
-        AssocEntity = euid;
-        EIDLabel.Text = euid.ToString();
+        AssocEntity = nent;
+        EIDLabel.Text = nent.ToString();
         NameLabel.Text = name;
     }
 }
index 737a12aa600d3de963c6d37ec1cd93480f22c898..2a3e4850cfa4f629a28ea4a74cd026560e3db1c2 100644 (file)
@@ -7,8 +7,7 @@ namespace Content.Client.Station;
 /// </summary>
 public sealed class StationSystem : EntitySystem
 {
-
-    private readonly HashSet<EntityUid> _stations = new();
+    private readonly List<(string Name, NetEntity Entity)> _stations = new();
 
     /// <summary>
     /// All stations that currently exist.
@@ -16,7 +15,7 @@ public sealed class StationSystem : EntitySystem
     /// <remarks>
     /// I'd have this just invoke an entity query, but we're on the client and the client barely knows about stations.
     /// </remarks>
-    public IReadOnlySet<EntityUid> Stations => _stations;
+    public IReadOnlyList<(string Name, NetEntity Entity)> Stations => _stations;
 
     /// <inheritdoc/>
     public override void Initialize()
@@ -27,7 +26,7 @@ public sealed class StationSystem : EntitySystem
     private void StationsUpdated(StationsUpdatedEvent ev)
     {
         _stations.Clear();
-        // TODO this needs to be dona in component states and with the Ensure() methods
-        _stations.UnionWith(GetEntitySet(ev.Stations));
+        // TODO this needs to be done in component states and with the Ensure() methods
+        _stations.AddRange(ev.Stations);
     }
 }
index 0969a62940ce78fdb57abf4b7bdc0a720164414d..cccd9201a292443fe86c55612c825cf526693fd7 100644 (file)
@@ -23,7 +23,10 @@ using static Robust.Client.UserInterface.Controls.BaseButton;
 namespace Content.Client.UserInterface.Systems.Admin;
 
 [UsedImplicitly]
-public sealed class AdminUIController : UIController, IOnStateEntered<GameplayState>, IOnStateEntered<LobbyState>, IOnSystemChanged<AdminSystem>
+public sealed class AdminUIController : UIController,
+    IOnStateEntered<GameplayState>,
+    IOnStateEntered<LobbyState>,
+    IOnSystemChanged<AdminSystem>
 {
     [Dependency] private readonly IClientAdminManager _admin = default!;
     [Dependency] private readonly IClientConGroupController _conGroups = default!;
index 7aa29551b2d6f5a8c6016a6ea447eef57ed1cf3d..a0adeb2243494a02f9fbc6083ad7bb41546a9e44 100644 (file)
@@ -85,7 +85,7 @@ public sealed class StationSystem : EntitySystem
     {
         if (e.NewStatus == SessionStatus.Connected)
         {
-            RaiseNetworkEvent(new StationsUpdatedEvent(GetNetEntitySet(GetStationsSet())), e.Session);
+            RaiseNetworkEvent(new StationsUpdatedEvent(GetStationNames()), e.Session);
         }
     }
 
@@ -93,7 +93,7 @@ public sealed class StationSystem : EntitySystem
 
     private void OnStationAdd(EntityUid uid, StationDataComponent component, ComponentStartup args)
     {
-        RaiseNetworkEvent(new StationsUpdatedEvent(GetNetEntitySet(GetStationsSet())), Filter.Broadcast());
+        RaiseNetworkEvent(new StationsUpdatedEvent(GetStationNames()), Filter.Broadcast());
 
         var metaData = MetaData(uid);
         RaiseLocalEvent(new StationInitializedEvent(uid));
@@ -108,7 +108,7 @@ public sealed class StationSystem : EntitySystem
             RemComp<StationMemberComponent>(grid);
         }
 
-        RaiseNetworkEvent(new StationsUpdatedEvent(GetNetEntitySet(GetStationsSet())), Filter.Broadcast());
+        RaiseNetworkEvent(new StationsUpdatedEvent(GetStationNames()), Filter.Broadcast());
     }
 
     private void OnPreGameMapLoad(PreGameMapLoad ev)
@@ -468,6 +468,19 @@ public sealed class StationSystem : EntitySystem
         return stations;
     }
 
+    public List<(string Name, NetEntity Entity)> GetStationNames()
+    {
+        var stations = GetStationsSet();
+        var stats = new List<(string Name, NetEntity Station)>();
+
+        foreach (var weh in stations)
+        {
+            stats.Add((MetaData(weh).EntityName, GetNetEntity(weh)));
+        }
+
+        return stats;
+    }
+
     /// <summary>
     /// Returns the first station that has a grid in a certain map.
     /// If the map has no stations, null is returned instead.
index ff782b765037cc83a36376d70e441187f7d932b1..488e2b8e2049bdcd7e95350cca0d150b53107a58 100644 (file)
@@ -5,9 +5,9 @@ namespace Content.Shared.Station;
 [NetSerializable, Serializable]
 public sealed class StationsUpdatedEvent : EntityEventArgs
 {
-    public readonly HashSet<NetEntity> Stations;
+    public readonly List<(string Name, NetEntity Entity)> Stations;
 
-    public StationsUpdatedEvent(HashSet<NetEntity> stations)
+    public StationsUpdatedEvent(List<(string Name, NetEntity Entity)> stations)
     {
         Stations = stations;
     }