diff --git a/README.md b/README.md index 665bc23..23381d0 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,7 @@ When the plugin is first loaded it will create a `retakes_config.json` file in t | IsDebugMode | Whether to enable debug output to the server console or not. | false | false | true | | ShouldForceEvenTeamsWhenPlayerCountIsMultipleOf10 | Whether to force even teams when the active players is a multiple of 10 or not. (this means you will get 5v5 @ 10 players / 10v10 @ 20 players) | true | false | true | | EnableFallbackBombsiteAnnouncement | Whether to enable the fallback bombsite announcement. | true | false | true | +| ShouldRemoveSpectators | When a player is moved to spectators, remove them from all retake queues. Ensures that AFK plugins work as expected. | false | false | true | ## Commands | Command | Arguments | Description | Permissions | diff --git a/RetakesPlugin/Modules/Configs/RetakesConfigData.cs b/RetakesPlugin/Modules/Configs/RetakesConfigData.cs index b290f1e..8540214 100644 --- a/RetakesPlugin/Modules/Configs/RetakesConfigData.cs +++ b/RetakesPlugin/Modules/Configs/RetakesConfigData.cs @@ -2,7 +2,7 @@ public class RetakesConfigData { - public static int CurrentVersion = 8; + public static int CurrentVersion = 9; public int Version { get; set; } = CurrentVersion; public int MaxPlayers { get; set; } = 9; @@ -19,4 +19,5 @@ public class RetakesConfigData public bool IsDebugMode { get; set; } = false; public bool ShouldForceEvenTeamsWhenPlayerCountIsMultipleOf10 { get; set; } = true; public bool EnableFallbackBombsiteAnnouncement { get; set; } = true; + public bool ShouldRemoveSpectators { get; set; } = true; } diff --git a/RetakesPlugin/Modules/Managers/GameManager.cs b/RetakesPlugin/Modules/Managers/GameManager.cs index 9a2b96a..1667884 100644 --- a/RetakesPlugin/Modules/Managers/GameManager.cs +++ b/RetakesPlugin/Modules/Managers/GameManager.cs @@ -11,17 +11,18 @@ public class GameManager public readonly QueueManager QueueManager; private readonly int _consecutiveRoundWinsToScramble; private readonly bool _isScrambleEnabled; - + private readonly bool _removeSpectatorsEnabled; public const int ScoreForKill = 50; public const int ScoreForAssist = 25; public const int ScoreForDefuse = 50; - public GameManager(Translator translator, QueueManager queueManager, int? roundsToScramble, bool? isScrambleEnabled) + public GameManager(Translator translator, QueueManager queueManager, int? roundsToScramble, bool? isScrambleEnabled, bool? RemoveSpectatorsEnabled) { _translator = translator; QueueManager = queueManager; _consecutiveRoundWinsToScramble = roundsToScramble ?? 5; _isScrambleEnabled = isScrambleEnabled ?? true; + _removeSpectatorsEnabled = RemoveSpectatorsEnabled ?? false; } private bool _scrambleNextRound; @@ -245,4 +246,29 @@ private void SetTeams(List? terrorists, List _hasMutedVoices) + { + if (_removeSpectatorsEnabled) + { + CCSPlayerController? player = @event.Userid; + + if (!Helpers.IsValidPlayer(player)) + { + return HookResult.Continue; + } + int team = @event.Team; + + if (team == (int)CsTeam.Spectator) + { + // Ensure player is active ingame. + if (QueueManager.ActivePlayers.Contains(player)) + { + QueueManager.RemovePlayerFromQueues(player); + _hasMutedVoices.Remove(player); + } + } + } + return HookResult.Continue; + } } diff --git a/RetakesPlugin/RetakesPlugin.cs b/RetakesPlugin/RetakesPlugin.cs index e6708d5..da4311c 100644 --- a/RetakesPlugin/RetakesPlugin.cs +++ b/RetakesPlugin/RetakesPlugin.cs @@ -20,7 +20,7 @@ namespace RetakesPlugin; [MinimumApiVersion(220)] public class RetakesPlugin : BasePlugin { - private const string Version = "2.0.4"; + private const string Version = "2.0.5"; #region Plugin info public override string ModuleName => "Retakes Plugin"; @@ -487,7 +487,8 @@ private void OnMapStart(string mapName) _retakesConfig?.RetakesConfigData?.ShouldForceEvenTeamsWhenPlayerCountIsMultipleOf10 ), _retakesConfig?.RetakesConfigData?.RoundsToScramble, - _retakesConfig?.RetakesConfigData?.IsScrambleEnabled + _retakesConfig?.RetakesConfigData?.IsScrambleEnabled, + _retakesConfig?.RetakesConfigData?.ShouldRemoveSpectators ); _breakerManager = new BreakerManager( @@ -815,7 +816,13 @@ public HookResult OnPlayerTeam(EventPlayerTeam @event, GameEventInfo info) // Ensure all team join events are silent. @event.Silent = true; - return HookResult.Continue; + if (_gameManager == null) + { + Helpers.Debug($"Game manager not loaded."); + return HookResult.Continue; + } + + return _gameManager.RemoveSpectators(@event, _hasMutedVoices); } private HookResult OnCommandJoinTeam(CCSPlayerController? player, CommandInfo commandInfo)