Skip to content

Commit 6a8023c

Browse files
authored
Fix admin verb PVS issue (space-wizards#21406)
1 parent 40afc27 commit 6a8023c

File tree

6 files changed

+59
-31
lines changed

6 files changed

+59
-31
lines changed

Content.Client/Administration/UI/CustomControls/PlayerListControl.xaml.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ private void PlayerListItemPressed(BaseButton.ButtonEventArgs? args, ListData? d
6060
}
6161
else if (args.Event.Function == EngineKeyFunctions.UseSecondary && selectedPlayer.NetEntity != null)
6262
{
63-
_uiManager.GetUIController<VerbMenuUIController>().OpenVerbMenu(_entManager.GetEntity(selectedPlayer.NetEntity.Value));
63+
_uiManager.GetUIController<VerbMenuUIController>().OpenVerbMenu(selectedPlayer.NetEntity.Value, true);
6464
}
6565
}
6666

Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTab.xaml.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,13 @@ namespace Content.Client.Administration.UI.Tabs.PlayerTab
1414
[GenerateTypedNameReferences]
1515
public sealed partial class PlayerTab : Control
1616
{
17+
[Dependency] private readonly IEntityManager _entManager = default!;
18+
[Dependency] private readonly IPlayerManager _playerMan = default!;
19+
1720
private const string ArrowUp = "↑";
1821
private const string ArrowDown = "↓";
1922
private readonly Color _altColor = Color.FromHex("#292B38");
2023
private readonly Color _defaultColor = Color.FromHex("#2F2F3B");
21-
private IEntityManager _entManager;
2224
private readonly AdminSystem _adminSystem;
2325
private IReadOnlyList<PlayerInfo> _players = new List<PlayerInfo>();
2426

@@ -30,7 +32,7 @@ public sealed partial class PlayerTab : Control
3032

3133
public PlayerTab()
3234
{
33-
_entManager = IoCManager.Resolve<IEntityManager>();
35+
IoCManager.InjectDependencies(this);
3436
_adminSystem = _entManager.System<AdminSystem>();
3537
RobustXamlLoader.Load(this);
3638
RefreshPlayerList(_adminSystem.PlayerList);
@@ -95,13 +97,11 @@ private void RefreshPlayerList(IReadOnlyList<PlayerInfo> players)
9597
foreach (var child in PlayerList.Children.ToArray())
9698
{
9799
if (child is PlayerTabEntry)
98-
child.Orphan();
100+
child.Dispose();
99101
}
100102

101103
_players = players;
102-
103-
var playerManager = IoCManager.Resolve<IPlayerManager>();
104-
PlayerCount.Text = $"Players: {playerManager.PlayerCount}";
104+
PlayerCount.Text = $"Players: {_playerMan.PlayerCount}";
105105

106106
var sortedPlayers = new List<PlayerInfo>(players);
107107
sortedPlayers.Sort(Compare);

Content.Client/UserInterface/Systems/Admin/AdminUIController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ private void PlayerTabEntryPressed(ButtonEventArgs args)
187187
if (function == EngineKeyFunctions.UIClick)
188188
_conHost.ExecuteCommand($"vv {entity}");
189189
else if (function == EngineKeyFunctions.UseSecondary)
190-
_verb.OpenVerbMenu(EntityManager.GetEntity(entity), true);
190+
_verb.OpenVerbMenu(entity, true);
191191
else
192192
return;
193193

Content.Client/Verbs/UI/VerbMenuUIController.cs

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using Robust.Client.UserInterface;
1010
using Robust.Client.UserInterface.Controllers;
1111
using Robust.Shared.Input;
12+
using Robust.Shared.Utility;
1213

1314
namespace Content.Client.Verbs.UI
1415
{
@@ -29,7 +30,7 @@ public sealed class VerbMenuUIController : UIController, IOnStateEntered<Gamepla
2930
[UISystemDependency] private readonly CombatModeSystem _combatMode = default!;
3031
[UISystemDependency] private readonly VerbSystem _verbSystem = default!;
3132

32-
public EntityUid CurrentTarget;
33+
public NetEntity CurrentTarget;
3334
public SortedSet<Verb> CurrentVerbs = new();
3435

3536
/// <summary>
@@ -64,8 +65,25 @@ public void OnStateExited(GameplayState state)
6465
/// </param>
6566
public void OpenVerbMenu(EntityUid target, bool force = false, ContextMenuPopup? popup=null)
6667
{
67-
if (_playerManager.LocalPlayer?.ControlledEntity is not {Valid: true} user ||
68-
_combatMode.IsInCombatMode(user))
68+
DebugTools.Assert(target.IsValid());
69+
OpenVerbMenu(EntityManager.GetNetEntity(target), force, popup);
70+
}
71+
72+
/// <summary>
73+
/// Open a verb menu and fill it with verbs applicable to the given target entity.
74+
/// </summary>
75+
/// <param name="target">Entity to get verbs on.</param>
76+
/// <param name="force">Used to force showing all verbs. Only works on networked entities if the user is an admin.</param>
77+
/// <param name="popup">
78+
/// If this is not null, verbs will be placed into the given popup instead.
79+
/// </param>
80+
public void OpenVerbMenu(NetEntity target, bool force = false, ContextMenuPopup? popup=null)
81+
{
82+
DebugTools.Assert(target.IsValid());
83+
if (_playerManager.LocalEntity is not {Valid: true} user)
84+
return;
85+
86+
if (!force && _combatMode.IsInCombatMode(user))
6987
return;
7088

7189
Close();
@@ -82,7 +100,7 @@ public void OpenVerbMenu(EntityUid target, bool force = false, ContextMenuPopup?
82100

83101
// Add indicator that some verbs may be missing.
84102
// I long for the day when verbs will all be predicted and this becomes unnecessary.
85-
if (!EntityManager.IsClientSide(target))
103+
if (!target.IsClientSide())
86104
{
87105
_context.AddElement(menu, new ContextMenuElement(Loc.GetString("verb-system-waiting-on-server-text")));
88106
}
@@ -248,7 +266,7 @@ private void Close()
248266

249267
private void HandleVerbsResponse(VerbsResponseEvent msg)
250268
{
251-
if (OpenMenu == null || !OpenMenu.Visible || CurrentTarget != EntityManager.GetEntity(msg.Entity))
269+
if (OpenMenu == null || !OpenMenu.Visible || CurrentTarget != msg.Entity)
252270
return;
253271

254272
AddServerVerbs(msg.Verbs, OpenMenu);

Content.Client/Verbs/VerbSystem.cs

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -170,28 +170,27 @@ public bool TryGetEntityMenuEntities(MapCoordinates targetPos, [NotNullWhen(true
170170
/// </summary>
171171
public SortedSet<Verb> GetVerbs(EntityUid target, EntityUid user, Type type, bool force = false)
172172
{
173-
return GetVerbs(target, user, new List<Type>() { type }, force);
173+
return GetVerbs(GetNetEntity(target), user, new List<Type>() { type }, force);
174174
}
175175

176176
/// <summary>
177177
/// Ask the server to send back a list of server-side verbs, and for now return an incomplete list of verbs
178178
/// (only those defined locally).
179179
/// </summary>
180-
public SortedSet<Verb> GetVerbs(EntityUid target, EntityUid user, List<Type> verbTypes,
180+
public SortedSet<Verb> GetVerbs(NetEntity target, EntityUid user, List<Type> verbTypes,
181181
bool force = false)
182182
{
183-
if (!IsClientSide(target))
184-
{
185-
RaiseNetworkEvent(new RequestServerVerbsEvent(GetNetEntity(target), verbTypes, adminRequest: force));
186-
}
183+
if (!target.IsClientSide())
184+
RaiseNetworkEvent(new RequestServerVerbsEvent(target, verbTypes, adminRequest: force));
187185

188186
// Some admin menu interactions will try get verbs for entities that have not yet been sent to the player.
189-
if (!Exists(target))
187+
if (!TryGetEntity(target, out var local))
190188
return new();
191189

192-
return GetLocalVerbs(target, user, verbTypes, force);
190+
return GetLocalVerbs(local.Value, user, verbTypes, force);
193191
}
194192

193+
195194
/// <summary>
196195
/// Execute actions associated with the given verb.
197196
/// </summary>
@@ -200,25 +199,35 @@ public SortedSet<Verb> GetVerbs(EntityUid target, EntityUid user, List<Type> ver
200199
/// </remarks>
201200
public void ExecuteVerb(EntityUid target, Verb verb)
202201
{
203-
var user = _playerManager.LocalPlayer?.ControlledEntity;
204-
if (user == null)
202+
ExecuteVerb(GetNetEntity(target), verb);
203+
}
204+
205+
/// <summary>
206+
/// Execute actions associated with the given verb.
207+
/// </summary>
208+
/// <remarks>
209+
/// Unless this is a client-exclusive verb, this will also tell the server to run the same verb.
210+
/// </remarks>
211+
public void ExecuteVerb(NetEntity target, Verb verb)
212+
{
213+
if ( _playerManager.LocalEntity is not {} user)
205214
return;
206215

207216
// is this verb actually valid?
208217
if (verb.Disabled)
209218
{
210219
// maybe send an informative pop-up message.
211220
if (!string.IsNullOrWhiteSpace(verb.Message))
212-
_popupSystem.PopupEntity(verb.Message, user.Value);
221+
_popupSystem.PopupEntity(verb.Message, user);
213222

214223
return;
215224
}
216225

217-
if (verb.ClientExclusive || IsClientSide(target))
226+
if (verb.ClientExclusive || target.IsClientSide())
218227
// is this a client exclusive (gui) verb?
219-
ExecuteVerb(verb, user.Value, target);
228+
ExecuteVerb(verb, user, GetEntity(target));
220229
else
221-
EntityManager.RaisePredictiveEvent(new ExecuteVerbEvent(GetNetEntity(target), verb));
230+
EntityManager.RaisePredictiveEvent(new ExecuteVerbEvent(target, verb));
222231
}
223232

224233
private void HandleVerbResponse(VerbsResponseEvent msg)

Content.Shared/Verbs/SharedVerbSystem.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,24 +24,25 @@ private void HandleExecuteVerb(ExecuteVerbEvent args, EntitySessionEventArgs eve
2424
if (user == null)
2525
return;
2626

27-
var target = GetEntity(args.Target);
27+
if (!TryGetEntity(args.Target, out var target))
28+
return;
2829

2930
// It is possible that client-side prediction can cause this event to be raised after the target entity has
3031
// been deleted. So we need to check that the entity still exists.
31-
if (Deleted(target) || Deleted(user))
32+
if (Deleted(user))
3233
return;
3334

3435
// Get the list of verbs. This effectively also checks that the requested verb is in fact a valid verb that
3536
// the user can perform.
36-
var verbs = GetLocalVerbs(target, user.Value, args.RequestedVerb.GetType());
37+
var verbs = GetLocalVerbs(target.Value, user.Value, args.RequestedVerb.GetType());
3738

3839
// Note that GetLocalVerbs might waste time checking & preparing unrelated verbs even though we know
3940
// precisely which one we want to run. However, MOST entities will only have 1 or 2 verbs of a given type.
4041
// The one exception here is the "other" verb type, which has 3-4 verbs + all the debug verbs.
4142

4243
// Find the requested verb.
4344
if (verbs.TryGetValue(args.RequestedVerb, out var verb))
44-
ExecuteVerb(verb, user.Value, target);
45+
ExecuteVerb(verb, user.Value, target.Value);
4546
}
4647

4748
/// <summary>

0 commit comments

Comments
 (0)