feat: add BasePower abstraction
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
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);
|
||||
Reference in New Issue
Block a user