Files
CS2-SuperPowers/Players/PlayerHud.cs
T
2026-07-26 23:47:38 +02:00

61 lines
1.8 KiB
C#

using CounterStrikeSharp.API;
using CounterStrikeSharp.API.Core;
namespace Cs2SuperPowers.Players;
public class PlayerHud : IPlayerHud
{
private readonly Dictionary<CCSPlayerController, DisposableMessage> _playerMessages = new();
private readonly List<Delegate> _registeredDelegates = new();
public void Initialize(BasePlugin pluginRef)
{
Listeners.OnTick onTickListener = OnTick;
_registeredDelegates.Add(onTickListener);
pluginRef.RegisterListener(onTickListener);
}
public void ShowMessage(CCSPlayerController player, string message, TimeSpan? duration = null)
{
duration ??= TimeSpan.FromSeconds(10);
if (_playerMessages.ContainsKey(player))
{
_playerMessages.Remove(player);
}
_playerMessages.Add(player, new DisposableMessage(message, DateTime.UtcNow.Add(duration.Value)));
}
private void OnTick()
{
var toRemove = new List<CCSPlayerController>();
foreach (var playerMessage in _playerMessages.ToList())
{
if (playerMessage.Value.DisplayUntil >= DateTime.UtcNow)
{
playerMessage.Key.PrintToCenterHtml(playerMessage.Value.Message);
}
else
{
toRemove.Add(playerMessage.Key);
}
}
foreach (var player in toRemove)
{
Action? wrappedCallback = null;
wrappedCallback = () =>
{
_playerMessages.Remove(player);
if (wrappedCallback != null)
{
_registeredDelegates.Remove(wrappedCallback);
}
};
_registeredDelegates.Add(wrappedCallback);
Server.NextFrame(wrappedCallback);
}
}
}
record DisposableMessage(string Message, DateTime DisplayUntil);