+using Content.Shared.Administration;
+using Content.Shared.Administration.Managers;
+using Content.Shared.Mind.Components;
using Content.Shared.Verbs;
using Robust.Client.Console;
using Robust.Shared.Utility;
{
[Dependency] private readonly IClientConGroupController _clientConGroupController = default!;
[Dependency] private readonly IClientConsoleHost _clientConsoleHost = default!;
+ [Dependency] private readonly ISharedAdminManager _admin = default!;
public override void Initialize()
{
SubscribeLocalEvent<GetVerbsEvent<Verb>>(AddAdminVerbs);
+
}
private void AddAdminVerbs(GetVerbsEvent<Verb> args)
};
args.Verbs.Add(verb);
}
+
+ if (!_admin.IsAdmin(args.User))
+ return;
+
+ if (_admin.HasAdminFlag(args.User, AdminFlags.Admin))
+ args.ExtraCategories.Add(VerbCategory.Admin);
+
+ if (_admin.HasAdminFlag(args.User, AdminFlags.Fun) && HasComp<MindContainerComponent>(args.Target))
+ args.ExtraCategories.Add(VerbCategory.Antag);
+
+ if (_admin.HasAdminFlag(args.User, AdminFlags.Debug))
+ args.ExtraCategories.Add(VerbCategory.Debug);
+
+ if (_admin.HasAdminFlag(args.User, AdminFlags.Fun))
+ args.ExtraCategories.Add(VerbCategory.Smite);
+
+ if (_admin.HasAdminFlag(args.User, AdminFlags.Admin))
+ args.ExtraCategories.Add(VerbCategory.Tricks);
}
}
}
public NetEntity CurrentTarget;
public SortedSet<Verb> CurrentVerbs = new();
+ public List<VerbCategory> ExtraCategories = new();
/// <summary>
/// Separate from <see cref="ContextMenuUIController.RootMenu"/>, since we can open a verb menu as a submenu
menu.MenuBody.DisposeAllChildren();
CurrentTarget = target;
- CurrentVerbs = _verbSystem.GetVerbs(target, user, Verb.VerbTypes, force);
+ CurrentVerbs = _verbSystem.GetVerbs(target, user, Verb.VerbTypes, out ExtraCategories, force);
OpenMenu = menu;
// Fill in client-side verbs.
FillVerbPopup(menu);
- // Add indicator that some verbs may be missing.
- // I long for the day when verbs will all be predicted and this becomes unnecessary.
- if (!target.IsClientSide())
- {
- _context.AddElement(menu, new ContextMenuElement(Loc.GetString("verb-system-waiting-on-server-text")));
- }
-
// if popup isn't null (ie we are opening out of an entity menu element),
// assume that that is going to handle opening the submenu properly
if (popup != null)
var element = new VerbMenuElement(verb);
_context.AddElement(popup, element);
}
-
else if (listedCategories.Add(verb.Category.Text))
AddVerbCategory(verb.Category, popup);
}
+ if (ExtraCategories != null)
+ {
+ foreach (var category in ExtraCategories)
+ {
+ if (listedCategories.Add(category.Text))
+ AddVerbCategory(category, popup);
+ }
+ }
+
popup.InvalidateMeasure();
}
}
}
- if (verbsInCategory.Count == 0)
+ if (verbsInCategory.Count == 0 && !ExtraCategories.Contains(category))
return;
- var element = new VerbMenuElement(category, verbsInCategory[0].TextStyleClass);
+ var style = verbsInCategory.FirstOrDefault()?.TextStyleClass ?? Verb.DefaultTextStyleClass;
+ var element = new VerbMenuElement(category, style);
_context.AddElement(popup, element);
// Create the pop-up that appears when hovering over this element
return true;
}
- /// <summary>
- /// Asks the server to send back a list of server-side verbs, for the given verb type.
- /// </summary>
- public SortedSet<Verb> GetVerbs(EntityUid target, EntityUid user, Type type, bool force = false)
- {
- 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(NetEntity target, EntityUid user, List<Type> verbTypes,
- bool force = false)
+ public SortedSet<Verb> GetVerbs(NetEntity target, EntityUid user, List<Type> verbTypes, out List<VerbCategory> extraCategories, bool force = false)
{
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 (!TryGetEntity(target, out var local))
+ {
+ extraCategories = new();
return new();
+ }
- return GetLocalVerbs(local.Value, user, verbTypes, force);
+ return GetLocalVerbs(local.Value, user, verbTypes, out extraCategories, force);
}
return GetLocalVerbs(target, user, new List<Type>() { type }, force);
}
+ /// <inheritdoc cref="GetLocalVerbs(Robust.Shared.GameObjects.EntityUid,Robust.Shared.GameObjects.EntityUid,System.Type,bool)"/>
+ public SortedSet<Verb> GetLocalVerbs(EntityUid target, EntityUid user, List<Type> types, bool force = false)
+ {
+ return GetLocalVerbs(target, user, types, out _, force);
+ }
+
/// <summary>
/// Raises a number of events in order to get all verbs of the given type(s) defined in local systems. This
/// does not request verbs from the server.
/// </summary>
- public SortedSet<Verb> GetLocalVerbs(EntityUid target, EntityUid user, List<Type> types, bool force = false)
+ public SortedSet<Verb> GetLocalVerbs(EntityUid target, EntityUid user, List<Type> types,
+ out List<VerbCategory> extraCategories, bool force = false)
{
SortedSet<Verb> verbs = new();
+ extraCategories = new();
// accessibility checks
bool canAccess = false;
// TODO: fix this garbage and use proper generics or reflection or something else, not this.
if (types.Contains(typeof(InteractionVerb)))
{
- var verbEvent = new GetVerbsEvent<InteractionVerb>(user, target, @using, hands, canInteract, canAccess);
+ var verbEvent = new GetVerbsEvent<InteractionVerb>(user, target, @using, hands, canInteract, canAccess, extraCategories);
RaiseLocalEvent(target, verbEvent, true);
verbs.UnionWith(verbEvent.Verbs);
}
&& @using != null
&& @using != target)
{
- var verbEvent = new GetVerbsEvent<UtilityVerb>(user, target, @using, hands, canInteract, canAccess);
+ var verbEvent = new GetVerbsEvent<UtilityVerb>(user, target, @using, hands, canInteract, canAccess, extraCategories);
RaiseLocalEvent(@using.Value, verbEvent, true); // directed at used, not at target
verbs.UnionWith(verbEvent.Verbs);
}
if (types.Contains(typeof(InnateVerb)))
{
- var verbEvent = new GetVerbsEvent<InnateVerb>(user, target, @using, hands, canInteract, canAccess);
+ var verbEvent = new GetVerbsEvent<InnateVerb>(user, target, @using, hands, canInteract, canAccess, extraCategories);
RaiseLocalEvent(user, verbEvent, true);
verbs.UnionWith(verbEvent.Verbs);
}
if (types.Contains(typeof(AlternativeVerb)))
{
- var verbEvent = new GetVerbsEvent<AlternativeVerb>(user, target, @using, hands, canInteract, canAccess);
+ var verbEvent = new GetVerbsEvent<AlternativeVerb>(user, target, @using, hands, canInteract, canAccess, extraCategories);
RaiseLocalEvent(target, verbEvent, true);
verbs.UnionWith(verbEvent.Verbs);
}
if (types.Contains(typeof(ActivationVerb)))
{
- var verbEvent = new GetVerbsEvent<ActivationVerb>(user, target, @using, hands, canInteract, canAccess);
+ var verbEvent = new GetVerbsEvent<ActivationVerb>(user, target, @using, hands, canInteract, canAccess, extraCategories);
RaiseLocalEvent(target, verbEvent, true);
verbs.UnionWith(verbEvent.Verbs);
}
if (types.Contains(typeof(ExamineVerb)))
{
- var verbEvent = new GetVerbsEvent<ExamineVerb>(user, target, @using, hands, canInteract, canAccess);
+ var verbEvent = new GetVerbsEvent<ExamineVerb>(user, target, @using, hands, canInteract, canAccess, extraCategories);
RaiseLocalEvent(target, verbEvent, true);
verbs.UnionWith(verbEvent.Verbs);
}
// generic verbs
if (types.Contains(typeof(Verb)))
{
- var verbEvent = new GetVerbsEvent<Verb>(user, target, @using, hands, canInteract, canAccess);
+ var verbEvent = new GetVerbsEvent<Verb>(user, target, @using, hands, canInteract, canAccess, extraCategories);
RaiseLocalEvent(target, verbEvent, true);
verbs.UnionWith(verbEvent.Verbs);
}
if (types.Contains(typeof(EquipmentVerb)))
{
var access = canAccess || _interactionSystem.CanAccessEquipment(user, target);
- var verbEvent = new GetVerbsEvent<EquipmentVerb>(user, target, @using, hands, canInteract, access);
+ var verbEvent = new GetVerbsEvent<EquipmentVerb>(user, target, @using, hands, canInteract, access, extraCategories);
RaiseLocalEvent(target, verbEvent);
verbs.UnionWith(verbEvent.Verbs);
}