61 lines
1.8 KiB
C#
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); |