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.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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user