2025-06-08 00:54:06 +02:00

98 lines
3.1 KiB
C#

using HintServiceMeow.Core.Enum;
using HintServiceMeow.Core.Models.Hints;
using HintServiceMeow.Core.Utilities;
using LabApi.Events.Arguments.PlayerEvents;
using LabApi.Features;
using LabApi.Features.Console;
using LabApi.Features.Wrappers;
using MEC;
using PlayerRoles;
namespace VisibleSpectators;
/// <summary>
/// Handles spectator hint management and updates for players.
/// </summary>
public class SpectatorManager
{
private readonly SpectatorConfig _config;
private readonly Dictionary<Player, Hint> _spectatorHints = new();
public int YCoordinate { get; set; } = 100;
public SpectatorManager(SpectatorConfig config)
{
_config = config;
}
public IEnumerator<float> KeepUpdatingSpectators()
{
while (true)
{
UpdateSpectators();
yield return Timing.WaitForSeconds(1);
}
// ReSharper disable once IteratorNeverReturns
}
public void OnSpectate(PlayerChangedSpectatorEventArgs ev)
{
UpdateSpectators(ev.OldTarget);
UpdateSpectators(ev.NewTarget);
UpdateSpectators(ev.Player);
}
public void OnJoin(PlayerJoinedEventArgs ev)
{
AddPlayerHint(ev.Player);
}
private void UpdateSpectators()
{
foreach (var player in GetPlayers())
UpdateSpectators(player);
}
private void AddPlayerHint(Player player)
{
var hint = new Hint
{
Text = $"{_config.HeaderMessage}\n{_config.NoSpectatorsMessage}",
Alignment = HintAlignment.Right,
YCoordinate = YCoordinate,
Hide = true
};
var playerDisplay = PlayerDisplay.Get(player);
playerDisplay.AddHint(hint);
_spectatorHints[player] = hint;
}
private void UpdateSpectators(Player player)
{
if (player == null) return;
if (!_spectatorHints.ContainsKey(player)) AddPlayerHint(player);
var spectators = _config.NoSpectatorsMessage;
try
{
spectators = string.Join("\n", player.CurrentSpectators.Where(PlayerDisplayUtil.IsNotOverwatch).Select(PlayerDisplayUtil.PlayerToDisplay));
if (player.Role == RoleTypeId.Spectator)
spectators = player.CurrentlySpectating == null
? _config.NoSpectatorsMessage
: string.Join("\n",
player.CurrentlySpectating?.CurrentSpectators.Where(PlayerDisplayUtil.IsNotOverwatch)
.Select(PlayerDisplayUtil.PlayerToDisplay) ?? Array.Empty<string>());
}
catch (Exception e)
{
Logger.Error(e);
}
if (spectators.Length < 2) spectators = _config.NoSpectatorsMessage;
_spectatorHints[player].Text = $"{_config.HeaderMessage}\n{spectators}";
_spectatorHints[player].Hide = player.Role is RoleTypeId.Destroyed or RoleTypeId.None;
_spectatorHints[player].YCoordinate = YCoordinate + player.CurrentSpectators.Count * 10;
}
private static Player[] GetPlayers()
{
return Player.ReadyList.Where(PlayerDisplayUtil.IsNotOverwatch).Where(x => x != null).ToArray();
}
}