]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Fix admin verb PVS issue (#21406)
authorLeon Friedrich <60421075+ElectroJr@users.noreply.github.com>
Sat, 4 Nov 2023 15:58:26 +0000 (02:58 +1100)
committerGitHub <noreply@github.com>
Sat, 4 Nov 2023 15:58:26 +0000 (02:58 +1100)
Content.Client/Administration/UI/CustomControls/PlayerListControl.xaml.cs
Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTab.xaml.cs
Content.Client/UserInterface/Systems/Admin/AdminUIController.cs
Content.Client/Verbs/UI/VerbMenuUIController.cs
Content.Client/Verbs/VerbSystem.cs
Content.Shared/Verbs/SharedVerbSystem.cs

index 5fa28bf1ac751b6890780ef5ac133411126c0870..39749f8ac6f60a21fb9cea45438d638f0a8789c0 100644 (file)
@@ -60,7 +60,7 @@ namespace Content.Client.Administration.UI.CustomControls
             }
             else if (args.Event.Function == EngineKeyFunctions.UseSecondary && selectedPlayer.NetEntity != null)
             {
-                _uiManager.GetUIController<VerbMenuUIController>().OpenVerbMenu(_entManager.GetEntity(selectedPlayer.NetEntity.Value));
+                _uiManager.GetUIController<VerbMenuUIController>().OpenVerbMenu(selectedPlayer.NetEntity.Value, true);
             }
         }
 
index 4f77369b57b3cd6bd5a6ecbcc795d42edc3442b6..1190a4c329c50006b7e5a4c427b42d33faa9aa59 100644 (file)
@@ -14,11 +14,13 @@ namespace Content.Client.Administration.UI.Tabs.PlayerTab
     [GenerateTypedNameReferences]
     public sealed partial class PlayerTab : Control
     {
+        [Dependency] private readonly IEntityManager _entManager = default!;
+        [Dependency] private readonly IPlayerManager _playerMan = default!;
+
         private const string ArrowUp = "↑";
         private const string ArrowDown = "↓";
         private readonly Color _altColor = Color.FromHex("#292B38");
         private readonly Color _defaultColor = Color.FromHex("#2F2F3B");
-        private IEntityManager _entManager;
         private readonly AdminSystem _adminSystem;
         private IReadOnlyList<PlayerInfo> _players = new List<PlayerInfo>();
 
@@ -30,7 +32,7 @@ namespace Content.Client.Administration.UI.Tabs.PlayerTab
 
         public PlayerTab()
         {
-            _entManager = IoCManager.Resolve<IEntityManager>();
+            IoCManager.InjectDependencies(this);
             _adminSystem = _entManager.System<AdminSystem>();
             RobustXamlLoader.Load(this);
             RefreshPlayerList(_adminSystem.PlayerList);
@@ -95,13 +97,11 @@ namespace Content.Client.Administration.UI.Tabs.PlayerTab
             foreach (var child in PlayerList.Children.ToArray())
             {
                 if (child is PlayerTabEntry)
-                    child.Orphan();
+                    child.Dispose();
             }
 
             _players = players;
-
-            var playerManager = IoCManager.Resolve<IPlayerManager>();
-            PlayerCount.Text = $"Players: {playerManager.PlayerCount}";
+            PlayerCount.Text = $"Players: {_playerMan.PlayerCount}";
 
             var sortedPlayers = new List<PlayerInfo>(players);
             sortedPlayers.Sort(Compare);
index 4a7a57e5272f2cc80ae8e7d802ba370b9b100ab5..acb79cf3012dbe6edf8e082b6033de1d695fe487 100644 (file)
@@ -187,7 +187,7 @@ public sealed class AdminUIController : UIController, IOnStateEntered<GameplaySt
         if (function == EngineKeyFunctions.UIClick)
             _conHost.ExecuteCommand($"vv {entity}");
         else if (function == EngineKeyFunctions.UseSecondary)
-            _verb.OpenVerbMenu(EntityManager.GetEntity(entity), true);
+            _verb.OpenVerbMenu(entity, true);
         else
             return;
 
index 6347564ec8245a5d027881ea02a757e8c4c0eee3..165b55131af296be28587b5f21319e13e6752d5e 100644 (file)
@@ -9,6 +9,7 @@ using Robust.Client.Player;
 using Robust.Client.UserInterface;
 using Robust.Client.UserInterface.Controllers;
 using Robust.Shared.Input;
+using Robust.Shared.Utility;
 
 namespace Content.Client.Verbs.UI
 {
@@ -29,7 +30,7 @@ namespace Content.Client.Verbs.UI
         [UISystemDependency] private readonly CombatModeSystem _combatMode = default!;
         [UISystemDependency] private readonly VerbSystem _verbSystem = default!;
 
-        public EntityUid CurrentTarget;
+        public NetEntity CurrentTarget;
         public SortedSet<Verb> CurrentVerbs = new();
 
         /// <summary>
@@ -64,8 +65,25 @@ namespace Content.Client.Verbs.UI
         /// </param>
         public void OpenVerbMenu(EntityUid target, bool force = false, ContextMenuPopup? popup=null)
         {
-            if (_playerManager.LocalPlayer?.ControlledEntity is not {Valid: true} user ||
-                _combatMode.IsInCombatMode(user))
+            DebugTools.Assert(target.IsValid());
+            OpenVerbMenu(EntityManager.GetNetEntity(target), force, popup);
+        }
+
+        /// <summary>
+        ///     Open a verb menu and fill it with verbs applicable to the given target entity.
+        /// </summary>
+        /// <param name="target">Entity to get verbs on.</param>
+        /// <param name="force">Used to force showing all verbs. Only works on networked entities if the user is an admin.</param>
+        /// <param name="popup">
+        ///     If this is not null, verbs will be placed into the given popup instead.
+        /// </param>
+        public void OpenVerbMenu(NetEntity target, bool force = false, ContextMenuPopup? popup=null)
+        {
+            DebugTools.Assert(target.IsValid());
+            if (_playerManager.LocalEntity is not {Valid: true} user)
+                return;
+
+            if (!force && _combatMode.IsInCombatMode(user))
                 return;
 
             Close();
@@ -82,7 +100,7 @@ namespace Content.Client.Verbs.UI
 
             // Add indicator that some verbs may be missing.
             // I long for the day when verbs will all be predicted and this becomes unnecessary.
-            if (!EntityManager.IsClientSide(target))
+            if (!target.IsClientSide())
             {
                 _context.AddElement(menu, new ContextMenuElement(Loc.GetString("verb-system-waiting-on-server-text")));
             }
@@ -248,7 +266,7 @@ namespace Content.Client.Verbs.UI
 
         private void HandleVerbsResponse(VerbsResponseEvent msg)
         {
-            if (OpenMenu == null || !OpenMenu.Visible || CurrentTarget != EntityManager.GetEntity(msg.Entity))
+            if (OpenMenu == null || !OpenMenu.Visible || CurrentTarget != msg.Entity)
                 return;
 
             AddServerVerbs(msg.Verbs, OpenMenu);
index e71da351b94a45b085f6da024cc656e7bd9857f2..34634482c61c12705cb750f4ca4573bd6e40eb6e 100644 (file)
@@ -170,28 +170,27 @@ namespace Content.Client.Verbs
         /// </summary>
         public SortedSet<Verb> GetVerbs(EntityUid target, EntityUid user, Type type, bool force = false)
         {
-            return GetVerbs(target, user, new List<Type>() { type }, force);
+            return GetVerbs(GetNetEntity(target), user, new List<Type>() { type }, force);
         }
 
         /// <summary>
         ///     Ask the server to send back a list of server-side verbs, and for now return an incomplete list of verbs
         ///     (only those defined locally).
         /// </summary>
-        public SortedSet<Verb> GetVerbs(EntityUid target, EntityUid user, List<Type> verbTypes,
+        public SortedSet<Verb> GetVerbs(NetEntity target, EntityUid user, List<Type> verbTypes,
             bool force = false)
         {
-            if (!IsClientSide(target))
-            {
-                RaiseNetworkEvent(new RequestServerVerbsEvent(GetNetEntity(target), verbTypes, adminRequest: force));
-            }
+            if (!target.IsClientSide())
+                RaiseNetworkEvent(new RequestServerVerbsEvent(target, verbTypes, adminRequest: force));
 
             // Some admin menu interactions will try get verbs for entities that have not yet been sent to the player.
-            if (!Exists(target))
+            if (!TryGetEntity(target, out var local))
                 return new();
 
-            return GetLocalVerbs(target, user, verbTypes, force);
+            return GetLocalVerbs(local.Value, user, verbTypes, force);
         }
 
+
         /// <summary>
         ///     Execute actions associated with the given verb.
         /// </summary>
@@ -200,8 +199,18 @@ namespace Content.Client.Verbs
         /// </remarks>
         public void ExecuteVerb(EntityUid target, Verb verb)
         {
-            var user = _playerManager.LocalPlayer?.ControlledEntity;
-            if (user == null)
+            ExecuteVerb(GetNetEntity(target), verb);
+        }
+
+        /// <summary>
+        ///     Execute actions associated with the given verb.
+        /// </summary>
+        /// <remarks>
+        ///     Unless this is a client-exclusive verb, this will also tell the server to run the same verb.
+        /// </remarks>
+        public void ExecuteVerb(NetEntity target, Verb verb)
+        {
+            if ( _playerManager.LocalEntity is not {} user)
                 return;
 
             // is this verb actually valid?
@@ -209,16 +218,16 @@ namespace Content.Client.Verbs
             {
                 // maybe send an informative pop-up message.
                 if (!string.IsNullOrWhiteSpace(verb.Message))
-                    _popupSystem.PopupEntity(verb.Message, user.Value);
+                    _popupSystem.PopupEntity(verb.Message, user);
 
                 return;
             }
 
-            if (verb.ClientExclusive || IsClientSide(target))
+            if (verb.ClientExclusive || target.IsClientSide())
                 // is this a client exclusive (gui) verb?
-                ExecuteVerb(verb, user.Value, target);
+                ExecuteVerb(verb, user, GetEntity(target));
             else
-                EntityManager.RaisePredictiveEvent(new ExecuteVerbEvent(GetNetEntity(target), verb));
+                EntityManager.RaisePredictiveEvent(new ExecuteVerbEvent(target, verb));
         }
 
         private void HandleVerbResponse(VerbsResponseEvent msg)
index 40cb2d500229837959475f03358ebfd13af92a84..e6286c47cc399667db5a9c9b0db5a410345b3149 100644 (file)
@@ -24,16 +24,17 @@ namespace Content.Shared.Verbs
             if (user == null)
                 return;
 
-            var target = GetEntity(args.Target);
+            if (!TryGetEntity(args.Target, out var target))
+                return;
 
             // It is possible that client-side prediction can cause this event to be raised after the target entity has
             // been deleted. So we need to check that the entity still exists.
-            if (Deleted(target) || Deleted(user))
+            if (Deleted(user))
                 return;
 
             // Get the list of verbs. This effectively also checks that the requested verb is in fact a valid verb that
             // the user can perform.
-            var verbs = GetLocalVerbs(target, user.Value, args.RequestedVerb.GetType());
+            var verbs = GetLocalVerbs(target.Value, user.Value, args.RequestedVerb.GetType());
 
             // Note that GetLocalVerbs might waste time checking & preparing unrelated verbs even though we know
             // precisely which one we want to run. However, MOST entities will only have 1 or 2 verbs of a given type.
@@ -41,7 +42,7 @@ namespace Content.Shared.Verbs
 
             // Find the requested verb.
             if (verbs.TryGetValue(args.RequestedVerb, out var verb))
-                ExecuteVerb(verb, user.Value, target);
+                ExecuteVerb(verb, user.Value, target.Value);
         }
 
         /// <summary>