From 6fdb36449744527a3e0fb9aba303fc89270e3749 Mon Sep 17 00:00:00 2001 From: Paul Ritter Date: Sun, 3 Oct 2021 13:34:36 +0200 Subject: [PATCH] Admin overlay (#4728) * adds admin overlay * fixes things --- .../Administration/AdminNameOverlay.cs | 82 +++++++++++++++++++ .../Managers/AdminMenuManager.cs | 24 ++++++ .../Administration/UI/AdminMenuWindow.xaml.cs | 12 +++ .../Administration/UI/Tabs/PlayerTab.xaml | 8 +- .../Administration/UI/Tabs/PlayerTab.xaml.cs | 7 ++ .../Administration/Managers/AdminManager.cs | 4 +- .../Menu/AdminMenuPlayerListMessage.cs | 8 +- 7 files changed, 140 insertions(+), 5 deletions(-) create mode 100644 Content.Client/Administration/AdminNameOverlay.cs diff --git a/Content.Client/Administration/AdminNameOverlay.cs b/Content.Client/Administration/AdminNameOverlay.cs new file mode 100644 index 0000000000..bd4bfe53a0 --- /dev/null +++ b/Content.Client/Administration/AdminNameOverlay.cs @@ -0,0 +1,82 @@ +using System.Collections.Generic; +using Content.Client.Administration.Managers; +using Content.Shared.Administration.Menu; +using Robust.Client.Graphics; +using Robust.Client.ResourceManagement; +using Robust.Shared.Containers; +using Robust.Shared.Enums; +using Robust.Shared.GameObjects; +using Robust.Shared.Maths; +using Robust.Shared.Physics; + +namespace Content.Client.Administration +{ + internal class AdminNameOverlay : Overlay + { + private readonly AdminMenuManager _manager; + private readonly IEntityManager _entityManager; + private readonly IEyeManager _eyeManager; + private readonly IEntityLookup _entityLookup; + private IReadOnlyList? _playerInfos; + private readonly Font _font; + + public AdminNameOverlay(AdminMenuManager manager, IEntityManager entityManager, IEyeManager eyeManager, IResourceCache resourceCache, IEntityLookup entityLookup) + { + _manager = manager; + _entityManager = entityManager; + _eyeManager = eyeManager; + _entityLookup = entityLookup; + ZIndex = 200; + _font = new VectorFont(resourceCache.GetResource("/Fonts/NotoSans/NotoSans-Regular.ttf"), 10); + } + + public override OverlaySpace Space => OverlaySpace.ScreenSpace; + + public void UpdatePlayerInfo(List playerInfos) + { + _playerInfos = playerInfos; + } + + protected override void Draw(in OverlayDrawArgs args) + { + if (_playerInfos == null) + { + return; + } + + var viewport = _eyeManager.GetWorldViewport(); + + foreach (var playerInfo in _playerInfos) + { + // Otherwise the entity can not exist yet + if (!_entityManager.TryGetEntity(playerInfo.EntityUid, out var entity)) + { + continue; + } + + // if not on the same map, continue + if (entity.Transform.MapID != _eyeManager.CurrentMap) + { + continue; + } + + var aabb = _entityLookup.GetWorldAabbFromEntity(entity); + + // if not on screen, continue + if (!aabb.Intersects(in viewport)) + { + continue; + } + + var lineoffset = new Vector2(0, 11f); + var screenCoordinates = _eyeManager.WorldToScreen(aabb.TopRight + (0, -0.1f)); + if (playerInfo.Antag) + { + args.ScreenHandle.DrawString(_font, screenCoordinates + (lineoffset * 2), "ANTAG", Color.OrangeRed); + } + args.ScreenHandle.DrawString(_font, screenCoordinates+(lineoffset), playerInfo.Username, Color.Yellow); + args.ScreenHandle.DrawString(_font, screenCoordinates, playerInfo.CharacterName, Color.Aquamarine); + } + } + } +} diff --git a/Content.Client/Administration/Managers/AdminMenuManager.cs b/Content.Client/Administration/Managers/AdminMenuManager.cs index 38bc3b0abb..dd1a7f5789 100644 --- a/Content.Client/Administration/Managers/AdminMenuManager.cs +++ b/Content.Client/Administration/Managers/AdminMenuManager.cs @@ -4,8 +4,11 @@ using Content.Client.HUD; using Content.Shared.Administration.Menu; using Content.Shared.Input; using Robust.Client.Console; +using Robust.Client.Graphics; using Robust.Client.Input; +using Robust.Client.ResourceManagement; using Robust.Client.UserInterface.CustomControls; +using Robust.Shared.GameObjects; using Robust.Shared.Input.Binding; using Robust.Shared.IoC; using Robust.Shared.Network; @@ -19,9 +22,15 @@ namespace Content.Client.Administration.Managers [Dependency] private readonly IGameHud _gameHud = default!; [Dependency] private readonly IClientAdminManager _clientAdminManager = default!; [Dependency] private readonly IClientConGroupController _clientConGroupController = default!; + [Dependency] private readonly IOverlayManager _overlayManager = default!; + [Dependency] private readonly IEyeManager _eyeManager = default!; + [Dependency] private readonly IResourceCache _resourceCache = default!; + [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly IEntityLookup _entityLookup = default!; private AdminMenuWindow? _window; private List _commandWindows = new(); + private AdminNameOverlay _adminNameOverlay = default!; public void Initialize() { @@ -29,6 +38,7 @@ namespace Content.Client.Administration.Managers _netManager.RegisterNetMessage(HandlePlayerListMessage); _commandWindows = new List(); + _adminNameOverlay = new AdminNameOverlay(this, _entityManager, _eyeManager, _resourceCache, _entityLookup); // Reset the AdminMenu Window on disconnect _netManager.Disconnect += (_, _) => ResetWindow(); @@ -70,6 +80,18 @@ namespace Content.Client.Administration.Managers private void HandlePlayerListMessage(AdminMenuPlayerListMessage msg) { _window?.RefreshPlayerList(msg.PlayersInfo); + _adminNameOverlay.UpdatePlayerInfo(msg.PlayersInfo); + } + + private void AdminNameOverlayOn() + { + if (!_overlayManager.HasOverlay()) + _overlayManager.AddOverlay(_adminNameOverlay); + } + + private void AdminNameOverlayOff() + { + _overlayManager.RemoveOverlay(); } public void ResetWindow() @@ -92,6 +114,8 @@ namespace Content.Client.Administration.Managers { _window ??= new AdminMenuWindow(); _window.OnPlayerListRefresh += RequestPlayerList; + _window.OnAdminNameOverlayOn += AdminNameOverlayOn; + _window.OnAdminNameOverlayOff += AdminNameOverlayOff; _window.OpenCentered(); } diff --git a/Content.Client/Administration/UI/AdminMenuWindow.xaml.cs b/Content.Client/Administration/UI/AdminMenuWindow.xaml.cs index bb431027b0..908a4a3cd1 100644 --- a/Content.Client/Administration/UI/AdminMenuWindow.xaml.cs +++ b/Content.Client/Administration/UI/AdminMenuWindow.xaml.cs @@ -21,6 +21,18 @@ namespace Content.Client.Administration.UI remove => PlayerTabControl.OnPlayerListRefresh -= value; } + public event PlayerTab.AdminNameOverlayToggle? OnAdminNameOverlayOn + { + add => PlayerTabControl.OnAdminNameOverlayOn += value; + remove => PlayerTabControl.OnAdminNameOverlayOn -= value; + } + + public event PlayerTab.AdminNameOverlayToggle? OnAdminNameOverlayOff + { + add => PlayerTabControl.OnAdminNameOverlayOff += value; + remove => PlayerTabControl.OnAdminNameOverlayOff -= value; + } + public AdminMenuWindow() { MinSize = SetSize = (500, 250); diff --git a/Content.Client/Administration/UI/Tabs/PlayerTab.xaml b/Content.Client/Administration/UI/Tabs/PlayerTab.xaml index 6c17639df7..4e133e5d06 100644 --- a/Content.Client/Administration/UI/Tabs/PlayerTab.xaml +++ b/Content.Client/Administration/UI/Tabs/PlayerTab.xaml @@ -1,10 +1,14 @@  -