using System.Text; using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Events; using Cs2SuperPowers.Players; namespace Cs2SuperPowers.Powers; public abstract class BasePower(IPlayerHud playerHud) : ISuperPower { private readonly HashSet _playerIds = new(); protected BasePlugin? Plugin { get; private set; } public abstract int Id { get; } public abstract string Name { get; } public abstract string Description { get; } public abstract char ChatColor { get; } public abstract string HtmlColor { get; } public virtual bool CanBeRandomlyAssigned => true; public virtual int MinimumPlayersRequired => 0; public void Initialize(BasePlugin pluginRef) { Plugin = pluginRef; OnInitialize(); } protected abstract void OnInitialize(); public virtual void AssignToPlayer(CCSPlayerController player, bool showMessages) { _playerIds.Add(player.SteamID); if (showMessages) { player.PrintToChat($"You have been granted the power of {ChatColor}{Name}"); player.PrintToChat(Description); var centerMessageBuilder = new StringBuilder(); centerMessageBuilder.Append("Your superpower:
"); centerMessageBuilder.Append($"{Name}
"); centerMessageBuilder.Append($"{Description}
"); playerHud.ShowMessage(player, centerMessageBuilder.ToString(), TimeSpan.FromSeconds(10)); } } public virtual void UnassignFromPlayer(CCSPlayerController player) { _playerIds.Remove(player.SteamID); } private readonly List _registeredDelegates = new(); protected void RegisterEventHandler(BasePlugin.GameEventHandler handler, HookMode hookMode = HookMode.Post) where T : GameEvent { _registeredDelegates.Add(handler); Plugin!.RegisterEventHandler(handler, hookMode); } protected void RegisterListener(T handler) where T : Delegate { _registeredDelegates.Add(handler); Plugin!.RegisterListener(handler); } protected void AddTimer(float seconds, Action callback, bool repeat = false) { if (repeat) { _registeredDelegates.Add(callback); Plugin!.AddTimer(seconds, callback); } else { Action? wrappedCallback = null; wrappedCallback = () => { callback(); if (wrappedCallback != null) { _registeredDelegates.Remove(wrappedCallback); } }; _registeredDelegates.Add(wrappedCallback); Plugin!.AddTimer(seconds, wrappedCallback); } } protected void NextFrame(Action callback) { Action? wrappedCallback = null; wrappedCallback = () => { callback(); if (wrappedCallback != null) { _registeredDelegates.Remove(wrappedCallback); } }; _registeredDelegates.Add(wrappedCallback); Server.NextFrame(wrappedCallback); } protected bool IsAssignedTo(CCSPlayerController player) { return _playerIds.Contains(player.SteamID); } }