AdminNameOverlay.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. using System.Linq;
  2. using System.Numerics;
  3. using Content.Client.Administration.Systems;
  4. using Content.Shared.CCVar;
  5. using Content.Shared.Mind;
  6. using Robust.Client.Graphics;
  7. using Robust.Client.ResourceManagement;
  8. using Robust.Client.UserInterface;
  9. using Robust.Shared.Configuration;
  10. using Robust.Shared.Enums;
  11. using Robust.Shared.Prototypes;
  12. namespace Content.Client.Administration;
  13. internal sealed class AdminNameOverlay : Overlay
  14. {
  15. [Dependency] private readonly IConfigurationManager _config = default!;
  16. private readonly AdminSystem _system;
  17. private readonly IEntityManager _entityManager;
  18. private readonly IEyeManager _eyeManager;
  19. private readonly EntityLookupSystem _entityLookup;
  20. private readonly IUserInterfaceManager _userInterfaceManager;
  21. private readonly Font _font;
  22. //TODO make this adjustable via GUI
  23. private readonly ProtoId<RoleTypePrototype>[] _filter =
  24. ["SoloAntagonist", "TeamAntagonist", "SiliconAntagonist", "FreeAgent"];
  25. private readonly string _antagLabelClassic = Loc.GetString("admin-overlay-antag-classic");
  26. private readonly Color _antagColorClassic = Color.OrangeRed;
  27. public AdminNameOverlay(AdminSystem system, IEntityManager entityManager, IEyeManager eyeManager, IResourceCache resourceCache, EntityLookupSystem entityLookup, IUserInterfaceManager userInterfaceManager)
  28. {
  29. IoCManager.InjectDependencies(this);
  30. _system = system;
  31. _entityManager = entityManager;
  32. _eyeManager = eyeManager;
  33. _entityLookup = entityLookup;
  34. _userInterfaceManager = userInterfaceManager;
  35. ZIndex = 200;
  36. _font = new VectorFont(resourceCache.GetResource<FontResource>("/Fonts/NotoSans/NotoSans-Regular.ttf"), 10);
  37. }
  38. public override OverlaySpace Space => OverlaySpace.ScreenSpace;
  39. protected override void Draw(in OverlayDrawArgs args)
  40. {
  41. var viewport = args.WorldAABB;
  42. //TODO make this adjustable via GUI
  43. var classic = _config.GetCVar(CCVars.AdminOverlayClassic);
  44. var playTime = _config.GetCVar(CCVars.AdminOverlayPlaytime);
  45. var startingJob = _config.GetCVar(CCVars.AdminOverlayStartingJob);
  46. foreach (var playerInfo in _system.PlayerList)
  47. {
  48. var entity = _entityManager.GetEntity(playerInfo.NetEntity);
  49. // Otherwise the entity can not exist yet
  50. if (entity == null || !_entityManager.EntityExists(entity))
  51. {
  52. continue;
  53. }
  54. // if not on the same map, continue
  55. if (_entityManager.GetComponent<TransformComponent>(entity.Value).MapID != args.MapId)
  56. {
  57. continue;
  58. }
  59. var aabb = _entityLookup.GetWorldAABB(entity.Value);
  60. // if not on screen, continue
  61. if (!aabb.Intersects(in viewport))
  62. {
  63. continue;
  64. }
  65. var uiScale = _userInterfaceManager.RootControl.UIScale;
  66. var lineoffset = new Vector2(0f, 14f) * uiScale;
  67. var screenCoordinates = _eyeManager.WorldToScreen(aabb.Center +
  68. new Angle(-_eyeManager.CurrentEye.Rotation).RotateVec(
  69. aabb.TopRight - aabb.Center)) + new Vector2(1f, 7f);
  70. var currentOffset = Vector2.Zero;
  71. args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, playerInfo.CharacterName, uiScale, playerInfo.Connected ? Color.Aquamarine : Color.White);
  72. currentOffset += lineoffset;
  73. args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, playerInfo.Username, uiScale, playerInfo.Connected ? Color.Yellow : Color.White);
  74. currentOffset += lineoffset;
  75. if (!string.IsNullOrEmpty(playerInfo.PlaytimeString) && playTime)
  76. {
  77. args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, playerInfo.PlaytimeString, uiScale, playerInfo.Connected ? Color.Orange : Color.White);
  78. currentOffset += lineoffset;
  79. }
  80. if (!string.IsNullOrEmpty(playerInfo.StartingJob) && startingJob)
  81. {
  82. args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, Loc.GetString(playerInfo.StartingJob), uiScale, playerInfo.Connected ? Color.GreenYellow : Color.White);
  83. currentOffset += lineoffset;
  84. }
  85. if (classic && playerInfo.Antag)
  86. {
  87. args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, _antagLabelClassic, uiScale, Color.OrangeRed);
  88. currentOffset += lineoffset;
  89. }
  90. else if (!classic && _filter.Contains(playerInfo.RoleProto))
  91. {
  92. var label = Loc.GetString(playerInfo.RoleProto.Name).ToUpper();
  93. var color = playerInfo.RoleProto.Color;
  94. args.ScreenHandle.DrawString(_font, screenCoordinates + currentOffset, label, uiScale, color);
  95. currentOffset += lineoffset;
  96. }
  97. }
  98. }
  99. }