82
Content.Client/Administration/AdminNameOverlay.cs
Normal file
82
Content.Client/Administration/AdminNameOverlay.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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<SS14Window> _commandWindows = new();
|
||||
private AdminNameOverlay _adminNameOverlay = default!;
|
||||
|
||||
public void Initialize()
|
||||
{
|
||||
@@ -29,6 +38,7 @@ namespace Content.Client.Administration.Managers
|
||||
_netManager.RegisterNetMessage<AdminMenuPlayerListMessage>(HandlePlayerListMessage);
|
||||
|
||||
_commandWindows = new List<SS14Window>();
|
||||
_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<AdminNameOverlay>())
|
||||
_overlayManager.AddOverlay(_adminNameOverlay);
|
||||
}
|
||||
|
||||
private void AdminNameOverlayOff()
|
||||
{
|
||||
_overlayManager.RemoveOverlay<AdminNameOverlay>();
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
<Control xmlns="https://spacestation14.io">
|
||||
<BoxContainer Orientation="Vertical">
|
||||
<BoxContainer Orientation="Horizontal">
|
||||
<Label Name="PlayerCount" HorizontalExpand="True" SizeFlagsStretchRatio="0.7"
|
||||
<Label Name="PlayerCount" HorizontalExpand="True" SizeFlagsStretchRatio="0.25"
|
||||
Text="{Loc Player Count}" />
|
||||
<Button Name="RefreshButton" HorizontalExpand="True" SizeFlagsStretchRatio="0.3"
|
||||
<Button Name="RefreshButton" HorizontalExpand="True" SizeFlagsStretchRatio="0.25"
|
||||
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>
|
||||
<Control MinSize="0 5" />
|
||||
<ScrollContainer HorizontalExpand="True" VerticalExpand="True">
|
||||
|
||||
@@ -18,13 +18,20 @@ namespace Content.Client.Administration.UI.Tabs
|
||||
{
|
||||
public delegate void PlayerListRefresh();
|
||||
|
||||
public delegate void AdminNameOverlayToggle();
|
||||
|
||||
public event PlayerListRefresh? OnPlayerListRefresh;
|
||||
public event AdminNameOverlayToggle? OnAdminNameOverlayOn;
|
||||
public event AdminNameOverlayToggle? OnAdminNameOverlayOff;
|
||||
|
||||
|
||||
public PlayerTab()
|
||||
{
|
||||
IoCManager.InjectDependencies(this);
|
||||
RobustXamlLoader.Load(this);
|
||||
RefreshButton.OnPressed += (_) => OnPlayerListRefresh?.Invoke();
|
||||
OverlayButtonOn.OnPressed += (_) => OnAdminNameOverlayOn?.Invoke();
|
||||
OverlayButtonOff.OnPressed += (_) => OnAdminNameOverlayOff?.Invoke();
|
||||
}
|
||||
|
||||
protected override void EnteredTree()
|
||||
|
||||
@@ -17,6 +17,7 @@ using Robust.Shared.Configuration;
|
||||
using Robust.Shared.Console;
|
||||
using Robust.Shared.ContentPack;
|
||||
using Robust.Shared.Enums;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.IoC;
|
||||
using Robust.Shared.Localization;
|
||||
using Robust.Shared.Network;
|
||||
@@ -251,8 +252,9 @@ namespace Content.Server.Administration.Managers
|
||||
var name = session.Name;
|
||||
var username = session.AttachedEntity?.Name ?? string.Empty;
|
||||
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);
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using Lidgren.Network;
|
||||
using Robust.Shared.GameObjects;
|
||||
using Robust.Shared.Network;
|
||||
|
||||
namespace Content.Shared.Administration.Menu
|
||||
@@ -21,8 +23,9 @@ namespace Content.Shared.Administration.Menu
|
||||
var username = buffer.ReadString();
|
||||
var characterName = buffer.ReadString();
|
||||
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.CharacterName);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user