diff --git a/Content.Client/Administration/AdminNameOverlay.cs b/Content.Client/Administration/AdminNameOverlay.cs index 3c968ec17c..205e9757e6 100644 --- a/Content.Client/Administration/AdminNameOverlay.cs +++ b/Content.Client/Administration/AdminNameOverlay.cs @@ -1,6 +1,7 @@ using System.Linq; using System.Numerics; using Content.Client.Administration.Systems; +using Content.Client.Stylesheets; using Content.Shared.CCVar; using Content.Shared.Mind; using Robust.Client.Graphics; @@ -14,14 +15,17 @@ namespace Content.Client.Administration; 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; + private readonly Font _fontBold; + private bool _overlayClassic; + private bool _overlaySymbols; + private bool _overlayPlaytime; + private bool _overlayStartingJob; //TODO make this adjustable via GUI private readonly ProtoId[] _filter = @@ -29,17 +33,29 @@ internal sealed class AdminNameOverlay : Overlay 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) + public AdminNameOverlay( + AdminSystem system, + IEntityManager entityManager, + IEyeManager eyeManager, + IResourceCache resourceCache, + EntityLookupSystem entityLookup, + IUserInterfaceManager userInterfaceManager, + IConfigurationManager config) { - IoCManager.InjectDependencies(this); - _system = system; _entityManager = entityManager; _eyeManager = eyeManager; _entityLookup = entityLookup; _userInterfaceManager = userInterfaceManager; ZIndex = 200; - _font = new VectorFont(resourceCache.GetResource("/Fonts/NotoSans/NotoSans-Regular.ttf"), 10); + // Setting this to a specific font would break the antag symbols + _font = resourceCache.NotoStack(); + _fontBold = resourceCache.NotoStack(variation: "Bold"); + + config.OnValueChanged(CCVars.AdminOverlayClassic, (show) => { _overlayClassic = show; }, true); + config.OnValueChanged(CCVars.AdminOverlaySymbols, (show) => { _overlaySymbols = show; }, true); + config.OnValueChanged(CCVars.AdminOverlayPlaytime, (show) => { _overlayPlaytime = show; }, true); + config.OnValueChanged(CCVars.AdminOverlayStartingJob, (show) => { _overlayStartingJob = show; }, true); } public override OverlaySpace Space => OverlaySpace.ScreenSpace; @@ -48,11 +64,6 @@ internal sealed class AdminNameOverlay : Overlay { var viewport = args.WorldAABB; - //TODO make this adjustable via GUI - var classic = _config.GetCVar(CCVars.AdminOverlayClassic); - var playTime = _config.GetCVar(CCVars.AdminOverlayPlaytime); - var startingJob = _config.GetCVar(CCVars.AdminOverlayStartingJob); - foreach (var playerInfo in _system.PlayerList) { var entity = _entityManager.GetEntity(playerInfo.NetEntity); @@ -85,35 +96,51 @@ internal sealed class AdminNameOverlay : Overlay var currentOffset = Vector2.Zero; + // Character name args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, playerInfo.CharacterName, uiScale, playerInfo.Connected ? Color.Aquamarine : Color.White); currentOffset += lineoffset; + // Username args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, playerInfo.Username, uiScale, playerInfo.Connected ? Color.Yellow : Color.White); currentOffset += lineoffset; - if (!string.IsNullOrEmpty(playerInfo.PlaytimeString) && playTime) + // Playtime + if (!string.IsNullOrEmpty(playerInfo.PlaytimeString) && _overlayPlaytime) { args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, playerInfo.PlaytimeString, uiScale, playerInfo.Connected ? Color.Orange : Color.White); currentOffset += lineoffset; } - if (!string.IsNullOrEmpty(playerInfo.StartingJob) && startingJob) + // Job + if (!string.IsNullOrEmpty(playerInfo.StartingJob) && _overlayStartingJob) { args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, Loc.GetString(playerInfo.StartingJob), uiScale, playerInfo.Connected ? Color.GreenYellow : Color.White); currentOffset += lineoffset; } - if (classic && playerInfo.Antag) + // Classic Antag Label + if (_overlayClassic && playerInfo.Antag) { - args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, _antagLabelClassic, uiScale, Color.OrangeRed); + var symbol = _overlaySymbols ? Loc.GetString("player-tab-antag-prefix") : string.Empty; + var label = _overlaySymbols + ? Loc.GetString("player-tab-character-name-antag-symbol", + ("symbol", symbol), + ("name", _antagLabelClassic)) + : _antagLabelClassic; + args.ScreenHandle.DrawString(_fontBold, screenCoordinates + currentOffset, label, uiScale, _antagColorClassic); currentOffset += lineoffset; } - else if (!classic && _filter.Contains(playerInfo.RoleProto)) + // Role Type + else if (!_overlayClassic && _filter.Contains(playerInfo.RoleProto)) { - var label = Loc.GetString(playerInfo.RoleProto.Name).ToUpper(); + var symbol = _overlaySymbols && playerInfo.Antag ? playerInfo.RoleProto.Symbol : string.Empty; + var role = Loc.GetString(playerInfo.RoleProto.Name).ToUpper(); + var label = _overlaySymbols + ? Loc.GetString("player-tab-character-name-antag-symbol", ("symbol", symbol), ("name", role)) + : role; var color = playerInfo.RoleProto.Color; - args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, label, uiScale, color); + args.ScreenHandle.DrawString(_fontBold, screenCoordinates + currentOffset, label, uiScale, color); currentOffset += lineoffset; } } diff --git a/Content.Client/Administration/Systems/AdminSystem.Overlay.cs b/Content.Client/Administration/Systems/AdminSystem.Overlay.cs index ba6ce40ca0..ba56f4694f 100644 --- a/Content.Client/Administration/Systems/AdminSystem.Overlay.cs +++ b/Content.Client/Administration/Systems/AdminSystem.Overlay.cs @@ -14,6 +14,7 @@ namespace Content.Client.Administration.Systems [Dependency] private readonly IEyeManager _eyeManager = default!; [Dependency] private readonly EntityLookupSystem _entityLookup = default!; [Dependency] private readonly IUserInterfaceManager _userInterfaceManager = default!; + [Dependency] private readonly IConfigurationManager _configurationManager = default!; private AdminNameOverlay _adminNameOverlay = default!; @@ -22,7 +23,14 @@ namespace Content.Client.Administration.Systems private void InitializeOverlay() { - _adminNameOverlay = new AdminNameOverlay(this, EntityManager, _eyeManager, _resourceCache, _entityLookup, _userInterfaceManager); + _adminNameOverlay = new AdminNameOverlay( + this, + EntityManager, + _eyeManager, + _resourceCache, + _entityLookup, + _userInterfaceManager, + _configurationManager); _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 b7231869c9..b5b2b0e345 100644 --- a/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTab.xaml.cs +++ b/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTab.xaml.cs @@ -2,11 +2,13 @@ using System.Linq; using Content.Client.Administration.Systems; using Content.Client.UserInterface.Controls; using Content.Shared.Administration; +using Content.Shared.CCVar; using Robust.Client.AutoGenerated; using Robust.Client.Graphics; using Robust.Client.Player; using Robust.Client.UserInterface; using Robust.Client.UserInterface.XAML; +using Robust.Shared.Configuration; using static Content.Client.Administration.UI.Tabs.PlayerTab.PlayerTabHeader; using static Robust.Client.UserInterface.Controls.BaseButton; @@ -16,6 +18,7 @@ namespace Content.Client.Administration.UI.Tabs.PlayerTab; public sealed partial class PlayerTab : Control { [Dependency] private readonly IEntityManager _entManager = default!; + [Dependency] private readonly IConfigurationManager _config = default!; [Dependency] private readonly IPlayerManager _playerMan = default!; private const string ArrowUp = "↑"; @@ -41,6 +44,10 @@ public sealed partial class PlayerTab : Control _adminSystem.OverlayEnabled += OverlayEnabled; _adminSystem.OverlayDisabled += OverlayDisabled; + _config.OnValueChanged(CCVars.AdminPlayerlistSeparateSymbols, PlayerListSettingsChanged); + _config.OnValueChanged(CCVars.AdminPlayerlistHighlightedCharacterColor, PlayerListSettingsChanged); + _config.OnValueChanged(CCVars.AdminPlayerlistRoleTypeColor, PlayerListSettingsChanged); + OverlayButton.OnPressed += OverlayButtonPressed; ShowDisconnectedButton.OnPressed += ShowDisconnectedPressed; @@ -106,6 +113,11 @@ public sealed partial class PlayerTab : Control #region ListContainer + private void PlayerListSettingsChanged(bool _) + { + RefreshPlayerList(_adminSystem.PlayerList); + } + private void RefreshPlayerList(IReadOnlyList players) { _players = players; @@ -196,8 +208,7 @@ public sealed partial class PlayerTab : Control Header.Username => Compare(x.Username, y.Username), 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.RoleType => y.SortWeight - x.SortWeight, 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 54e51747fb..a30b909226 100644 --- a/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabEntry.xaml +++ b/Content.Client/Administration/UI/Tabs/PlayerTab/PlayerTabEntry.xaml @@ -19,11 +19,6 @@ HorizontalExpand="True" ClipText="True"/> -