using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; namespace Cs2SuperPowers.Players; public class PlayerHud : IPlayerHud { private readonly Dictionary _playerMessages = new(); private readonly List _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(); 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);