diff --git a/Content.Client/Administration/AdminNameOverlay.cs b/Content.Client/Administration/AdminNameOverlay.cs index c21ba2e32c..47d251910c 100644 --- a/Content.Client/Administration/AdminNameOverlay.cs +++ b/Content.Client/Administration/AdminNameOverlay.cs @@ -1,73 +1,100 @@ +using System.Linq; using System.Numerics; using Content.Client.Administration.Systems; +using Content.Shared.CCVar; +using Content.Shared.Mind; using Robust.Client.Graphics; using Robust.Client.ResourceManagement; +using Robust.Client.UserInterface; +using Robust.Shared.Configuration; using Robust.Shared.Enums; -using Robust.Shared.GameObjects; -using Robust.Shared.IoC; -using Robust.Shared.Maths; +using Robust.Shared.Prototypes; -namespace Content.Client.Administration +namespace Content.Client.Administration; + +internal sealed class AdminNameOverlay : Overlay { - internal sealed class AdminNameOverlay : Overlay + [Dependency] private readonly IConfigurationManager _config = default!; + + private readonly AdminSystem _system; + private readonly IEntityManager _entityManager; + private readonly IEyeManager _eyeManager; + private readonly EntityLookupSystem _entityLookup; + private readonly IUserInterfaceManager _userInterfaceManager; + private readonly Font _font; + + //TODO make this adjustable via GUI + private readonly ProtoId[] _filter = + ["SoloAntagonist", "TeamAntagonist", "SiliconAntagonist", "FreeAgent"]; + private readonly string _antagLabelClassic = Loc.GetString("admin-overlay-antag-classic"); + private readonly Color _antagColorClassic = Color.OrangeRed; + + public AdminNameOverlay(AdminSystem system, IEntityManager entityManager, IEyeManager eyeManager, IResourceCache resourceCache, EntityLookupSystem entityLookup, IUserInterfaceManager userInterfaceManager) { - private readonly AdminSystem _system; - private readonly IEntityManager _entityManager; - private readonly IEyeManager _eyeManager; - private readonly EntityLookupSystem _entityLookup; - private readonly Font _font; + IoCManager.InjectDependencies(this); - public AdminNameOverlay(AdminSystem system, IEntityManager entityManager, IEyeManager eyeManager, IResourceCache resourceCache, EntityLookupSystem entityLookup) + _system = system; + _entityManager = entityManager; + _eyeManager = eyeManager; + _entityLookup = entityLookup; + _userInterfaceManager = userInterfaceManager; + ZIndex = 200; + _font = new VectorFont(resourceCache.GetResource("/Fonts/NotoSans/NotoSans-Regular.ttf"), 10); + } + + public override OverlaySpace Space => OverlaySpace.ScreenSpace; + + protected override void Draw(in OverlayDrawArgs args) + { + var viewport = args.WorldAABB; + + //TODO make this adjustable via GUI + var classic = _config.GetCVar(CCVars.AdminOverlayClassic); + + foreach (var playerInfo in _system.PlayerList) { - _system = system; - _entityManager = entityManager; - _eyeManager = eyeManager; - _entityLookup = entityLookup; - ZIndex = 200; - _font = new VectorFont(resourceCache.GetResource("/Fonts/NotoSans/NotoSans-Regular.ttf"), 10); - } + var entity = _entityManager.GetEntity(playerInfo.NetEntity); - public override OverlaySpace Space => OverlaySpace.ScreenSpace; - - protected override void Draw(in OverlayDrawArgs args) - { - var viewport = args.WorldAABB; - - foreach (var playerInfo in _system.PlayerList) + // Otherwise the entity can not exist yet + if (entity == null || !_entityManager.EntityExists(entity)) { - var entity = _entityManager.GetEntity(playerInfo.NetEntity); - - // Otherwise the entity can not exist yet - if (entity == null || !_entityManager.EntityExists(entity)) - { - continue; - } - - // if not on the same map, continue - if (_entityManager.GetComponent(entity.Value).MapID != _eyeManager.CurrentMap) - { - continue; - } - - var aabb = _entityLookup.GetWorldAABB(entity.Value); - - // if not on screen, continue - if (!aabb.Intersects(in viewport)) - { - continue; - } - - var lineoffset = new Vector2(0f, 11f); - var screenCoordinates = _eyeManager.WorldToScreen(aabb.Center + - new Angle(-_eyeManager.CurrentEye.Rotation).RotateVec( - aabb.TopRight - aabb.Center)) + new Vector2(1f, 7f); - if (playerInfo.Antag) - { - args.ScreenHandle.DrawString(_font, screenCoordinates + (lineoffset * 2), "ANTAG", Color.OrangeRed); - } - args.ScreenHandle.DrawString(_font, screenCoordinates+lineoffset, playerInfo.Username, playerInfo.Connected ? Color.Yellow : Color.White); - args.ScreenHandle.DrawString(_font, screenCoordinates, playerInfo.CharacterName, playerInfo.Connected ? Color.Aquamarine : Color.White); + continue; } + + // if not on the same map, continue + if (_entityManager.GetComponent(entity.Value).MapID != args.MapId) + { + continue; + } + + var aabb = _entityLookup.GetWorldAABB(entity.Value); + + // if not on screen, continue + if (!aabb.Intersects(in viewport)) + { + continue; + } + + var uiScale = _userInterfaceManager.RootControl.UIScale; + var lineoffset = new Vector2(0f, 11f) * uiScale; + var screenCoordinates = _eyeManager.WorldToScreen(aabb.Center + + new Angle(-_eyeManager.CurrentEye.Rotation).RotateVec( + aabb.TopRight - aabb.Center)) + new Vector2(1f, 7f); + + if (classic && playerInfo.Antag) + { + args.ScreenHandle.DrawString(_font, screenCoordinates + (lineoffset * 2), _antagLabelClassic, uiScale, _antagColorClassic); + } + else if (!classic && _filter.Contains(playerInfo.RoleProto.ID)) + { + var label = Loc.GetString(playerInfo.RoleProto.Name).ToUpper(); + var color = playerInfo.RoleProto.Color; + + args.ScreenHandle.DrawString(_font, screenCoordinates + (lineoffset * 2), label, uiScale, color); + } + + args.ScreenHandle.DrawString(_font, screenCoordinates + lineoffset, playerInfo.Username, uiScale, playerInfo.Connected ? Color.Yellow : Color.White); + args.ScreenHandle.DrawString(_font, screenCoordinates, playerInfo.CharacterName, uiScale, playerInfo.Connected ? Color.Aquamarine : Color.White); } } } diff --git a/Content.Client/Administration/Systems/AdminSystem.Overlay.cs b/Content.Client/Administration/Systems/AdminSystem.Overlay.cs index 3502faf9e8..c363a190c1 100644 --- a/Content.Client/Administration/Systems/AdminSystem.Overlay.cs +++ b/Content.Client/Administration/Systems/AdminSystem.Overlay.cs @@ -1,6 +1,7 @@ using Content.Client.Administration.Managers; using Robust.Client.Graphics; using Robust.Client.ResourceManagement; +using Robust.Client.UserInterface; namespace Content.Client.Administration.Systems { @@ -11,6 +12,7 @@ namespace Content.Client.Administration.Systems [Dependency] private readonly IClientAdminManager _adminManager = default!; [Dependency] private readonly IEyeManager _eyeManager = default!; [Dependency] private readonly EntityLookupSystem _entityLookup = default!; + [Dependency] private readonly IUserInterfaceManager _userInterfaceManager = default!; private AdminNameOverlay _adminNameOverlay = default!; @@ -19,7 +21,7 @@ namespace Content.Client.Administration.Systems private void InitializeOverlay() { - _adminNameOverlay = new AdminNameOverlay(this, EntityManager, _eyeManager, _resourceCache, _entityLookup); + _adminNameOverlay = new AdminNameOverlay(this, EntityManager, _eyeManager, _resourceCache, _entityLookup, _userInterfaceManager); _adminManager.AdminStatusUpdated += OnAdminStatusUpdated; } diff --git a/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTab.xaml.cs b/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTab.xaml.cs index 826945e7cc..be82d46d02 100644 --- a/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTab.xaml.cs +++ b/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTab.xaml.cs @@ -197,6 +197,7 @@ namespace Content.Client.Administration.UI.Tabs.PlayerTab Header.Character => Compare(x.CharacterName, y.CharacterName), Header.Job => Compare(x.StartingJob, y.StartingJob), Header.Antagonist => x.Antag.CompareTo(y.Antag), + Header.RoleType => Compare(x.RoleProto.Name , y.RoleProto.Name), Header.Playtime => TimeSpan.Compare(x.OverallPlaytime ?? default, y.OverallPlaytime ?? default), _ => 1 }; diff --git a/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabEntry.xaml b/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabEntry.xaml index 95cd0e8659..72b6b5afa6 100644 --- a/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabEntry.xaml +++ b/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabEntry.xaml @@ -23,6 +23,12 @@ SizeFlagsStretchRatio="2" HorizontalExpand="True" ClipText="True"/> + +