Admin overlay (#4728)

* adds admin overlay

* fixes things
This commit is contained in:
Paul Ritter
2021-10-03 13:34:36 +02:00
committed by GitHub
parent f4c01b58ce
commit 6fdb364497
7 changed files with 140 additions and 5 deletions

View File

@@ -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<AdminMenuPlayerListMessage.PlayerInfo>? _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<FontResource>("/Fonts/NotoSans/NotoSans-Regular.ttf"), 10);
}
public override OverlaySpace Space => OverlaySpace.ScreenSpace;
public void UpdatePlayerInfo(List<AdminMenuPlayerListMessage.PlayerInfo> 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);
}
}
}
}

View File

@@ -4,8 +4,11 @@ using Content.Client.HUD;
using Content.Shared.Administration.Menu; using Content.Shared.Administration.Menu;
using Content.Shared.Input; using Content.Shared.Input;
using Robust.Client.Console; using Robust.Client.Console;
using Robust.Client.Graphics;
using Robust.Client.Input; using Robust.Client.Input;
using Robust.Client.ResourceManagement;
using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.CustomControls;
using Robust.Shared.GameObjects;
using Robust.Shared.Input.Binding; using Robust.Shared.Input.Binding;
using Robust.Shared.IoC; using Robust.Shared.IoC;
using Robust.Shared.Network; using Robust.Shared.Network;
@@ -19,9 +22,15 @@ namespace Content.Client.Administration.Managers
[Dependency] private readonly IGameHud _gameHud = default!; [Dependency] private readonly IGameHud _gameHud = default!;
[Dependency] private readonly IClientAdminManager _clientAdminManager = default!; [Dependency] private readonly IClientAdminManager _clientAdminManager = default!;
[Dependency] private readonly IClientConGroupController _clientConGroupController = 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 AdminMenuWindow? _window;
private List<SS14Window> _commandWindows = new(); private List<SS14Window> _commandWindows = new();
private AdminNameOverlay _adminNameOverlay = default!;
public void Initialize() public void Initialize()
{ {
@@ -29,6 +38,7 @@ namespace Content.Client.Administration.Managers
_netManager.RegisterNetMessage<AdminMenuPlayerListMessage>(HandlePlayerListMessage); _netManager.RegisterNetMessage<AdminMenuPlayerListMessage>(HandlePlayerListMessage);
_commandWindows = new List<SS14Window>(); _commandWindows = new List<SS14Window>();
_adminNameOverlay = new AdminNameOverlay(this, _entityManager, _eyeManager, _resourceCache, _entityLookup);
// Reset the AdminMenu Window on disconnect // Reset the AdminMenu Window on disconnect
_netManager.Disconnect += (_, _) => ResetWindow(); _netManager.Disconnect += (_, _) => ResetWindow();
@@ -70,6 +80,18 @@ namespace Content.Client.Administration.Managers
private void HandlePlayerListMessage(AdminMenuPlayerListMessage msg) private void HandlePlayerListMessage(AdminMenuPlayerListMessage msg)
{ {
_window?.RefreshPlayerList(msg.PlayersInfo); _window?.RefreshPlayerList(msg.PlayersInfo);
_adminNameOverlay.UpdatePlayerInfo(msg.PlayersInfo);
}
private void AdminNameOverlayOn()
{
if (!_overlayManager.HasOverlay<AdminNameOverlay>())
_overlayManager.AddOverlay(_adminNameOverlay);
}
private void AdminNameOverlayOff()
{
_overlayManager.RemoveOverlay<AdminNameOverlay>();
} }
public void ResetWindow() public void ResetWindow()
@@ -92,6 +114,8 @@ namespace Content.Client.Administration.Managers
{ {
_window ??= new AdminMenuWindow(); _window ??= new AdminMenuWindow();
_window.OnPlayerListRefresh += RequestPlayerList; _window.OnPlayerListRefresh += RequestPlayerList;
_window.OnAdminNameOverlayOn += AdminNameOverlayOn;
_window.OnAdminNameOverlayOff += AdminNameOverlayOff;
_window.OpenCentered(); _window.OpenCentered();
} }

View File

@@ -21,6 +21,18 @@ namespace Content.Client.Administration.UI
remove => PlayerTabControl.OnPlayerListRefresh -= value; 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() public AdminMenuWindow()
{ {
MinSize = SetSize = (500, 250); MinSize = SetSize = (500, 250);

View File

@@ -1,10 +1,14 @@
<Control xmlns="https://spacestation14.io"> <Control xmlns="https://spacestation14.io">
<BoxContainer Orientation="Vertical"> <BoxContainer Orientation="Vertical">
<BoxContainer Orientation="Horizontal"> <BoxContainer Orientation="Horizontal">
<Label Name="PlayerCount" HorizontalExpand="True" SizeFlagsStretchRatio="0.7" <Label Name="PlayerCount" HorizontalExpand="True" SizeFlagsStretchRatio="0.25"
Text="{Loc Player Count}" /> Text="{Loc Player Count}" />
<Button Name="RefreshButton" HorizontalExpand="True" SizeFlagsStretchRatio="0.3" <Button Name="RefreshButton" HorizontalExpand="True" SizeFlagsStretchRatio="0.25"
Text="{Loc Refresh}" /> Text="{Loc Refresh}" />
<Button Name="OverlayButtonOn" HorizontalExpand="True" SizeFlagsStretchRatio="0.25"
Text="{Loc Overlay On}"/>
<Button Name="OverlayButtonOff" HorizontalExpand="True" SizeFlagsStretchRatio="0.25"
Text="{Loc Overlay Off}"/>
</BoxContainer> </BoxContainer>
<Control MinSize="0 5" /> <Control MinSize="0 5" />
<ScrollContainer HorizontalExpand="True" VerticalExpand="True"> <ScrollContainer HorizontalExpand="True" VerticalExpand="True">

View File

@@ -18,13 +18,20 @@ namespace Content.Client.Administration.UI.Tabs
{ {
public delegate void PlayerListRefresh(); public delegate void PlayerListRefresh();
public delegate void AdminNameOverlayToggle();
public event PlayerListRefresh? OnPlayerListRefresh; public event PlayerListRefresh? OnPlayerListRefresh;
public event AdminNameOverlayToggle? OnAdminNameOverlayOn;
public event AdminNameOverlayToggle? OnAdminNameOverlayOff;
public PlayerTab() public PlayerTab()
{ {
IoCManager.InjectDependencies(this); IoCManager.InjectDependencies(this);
RobustXamlLoader.Load(this); RobustXamlLoader.Load(this);
RefreshButton.OnPressed += (_) => OnPlayerListRefresh?.Invoke(); RefreshButton.OnPressed += (_) => OnPlayerListRefresh?.Invoke();
OverlayButtonOn.OnPressed += (_) => OnAdminNameOverlayOn?.Invoke();
OverlayButtonOff.OnPressed += (_) => OnAdminNameOverlayOff?.Invoke();
} }
protected override void EnteredTree() protected override void EnteredTree()

View File

@@ -17,6 +17,7 @@ using Robust.Shared.Configuration;
using Robust.Shared.Console; using Robust.Shared.Console;
using Robust.Shared.ContentPack; using Robust.Shared.ContentPack;
using Robust.Shared.Enums; using Robust.Shared.Enums;
using Robust.Shared.GameObjects;
using Robust.Shared.IoC; using Robust.Shared.IoC;
using Robust.Shared.Localization; using Robust.Shared.Localization;
using Robust.Shared.Network; using Robust.Shared.Network;
@@ -251,8 +252,9 @@ namespace Content.Server.Administration.Managers
var name = session.Name; var name = session.Name;
var username = session.AttachedEntity?.Name ?? string.Empty; var username = session.AttachedEntity?.Name ?? string.Empty;
var antag = session.ContentData()?.Mind?.AllRoles.Any(r => r.Antagonist) ?? false; var antag = session.ContentData()?.Mind?.AllRoles.Any(r => r.Antagonist) ?? false;
var uid = session.AttachedEntity?.Uid ?? EntityUid.Invalid;
netMsg.PlayersInfo.Add(new AdminMenuPlayerListMessage.PlayerInfo(name, username, antag)); netMsg.PlayersInfo.Add(new AdminMenuPlayerListMessage.PlayerInfo(name, username, antag, uid));
} }
_netMgr.ServerSendMessage(netMsg, senderSession.ConnectedClient); _netMgr.ServerSendMessage(netMsg, senderSession.ConnectedClient);

View File

@@ -1,5 +1,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using Lidgren.Network; using Lidgren.Network;
using Robust.Shared.GameObjects;
using Robust.Shared.Network; using Robust.Shared.Network;
namespace Content.Shared.Administration.Menu namespace Content.Shared.Administration.Menu
@@ -21,8 +23,9 @@ namespace Content.Shared.Administration.Menu
var username = buffer.ReadString(); var username = buffer.ReadString();
var characterName = buffer.ReadString(); var characterName = buffer.ReadString();
var antag = buffer.ReadBoolean(); var antag = buffer.ReadBoolean();
var uid = buffer.ReadEntityUid();
PlayersInfo.Add(new PlayerInfo(username, characterName, antag)); PlayersInfo.Add(new PlayerInfo(username, characterName, antag, uid));
} }
} }
@@ -35,9 +38,10 @@ namespace Content.Shared.Administration.Menu
buffer.Write(player.Username); buffer.Write(player.Username);
buffer.Write(player.CharacterName); buffer.Write(player.CharacterName);
buffer.Write(player.Antag); buffer.Write(player.Antag);
buffer.Write(player.EntityUid);
} }
} }
public record PlayerInfo(string Username, string CharacterName, bool Antag); public record PlayerInfo(string Username, string CharacterName, bool Antag, EntityUid EntityUid);
} }
} }