From d8afcdcdf01c7b9c4bfc57b53bbc9aeb5f5b8a9d Mon Sep 17 00:00:00 2001 From: deathride58 Date: Mon, 16 Dec 2024 09:19:15 -0500 Subject: [PATCH] Makes admins not count towards the playercount cap (#33424) * Makes admins not count towards the playercount cap * Update Content.Shared/CCVar/CCVars.Admin.cs (thx Aeshus Co-authored-by: Thomas <87614336+Aeshus@users.noreply.github.com> * Actually fixes whitespace on the comments Thanks VScode very good IDE --------- Co-authored-by: Thomas <87614336+Aeshus@users.noreply.github.com> --- Content.Server/Connection/ConnectionManager.cs | 13 +++++++++++-- Content.Shared/CCVar/CCVars.Admin.cs | 9 +++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Content.Server/Connection/ConnectionManager.cs b/Content.Server/Connection/ConnectionManager.cs index e4c7cf0be2e937..c2b30b23bece71 100644 --- a/Content.Server/Connection/ConnectionManager.cs +++ b/Content.Server/Connection/ConnectionManager.cs @@ -2,6 +2,7 @@ using System.Linq; using System.Threading.Tasks; using System.Runtime.InteropServices; +using Content.Server.Administration.Managers; using Content.Server.Chat.Managers; using Content.Server.Database; using Content.Server.GameTicking; @@ -56,6 +57,7 @@ public sealed partial class ConnectionManager : IConnectionManager [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly ILogManager _logManager = default!; [Dependency] private readonly IChatManager _chatManager = default!; + [Dependency] private readonly IAdminManager _adminManager = default!; private ISawmill _sawmill = default!; private readonly Dictionary _temporaryBypasses = []; @@ -270,7 +272,14 @@ session.Status is SessionStatus.Connected or SessionStatus.InGame ticker.PlayerGameStatuses.TryGetValue(userId, out var status) && status == PlayerGameStatus.JoinedGame; var adminBypass = _cfg.GetCVar(CCVars.AdminBypassMaxPlayers) && adminData != null; - if ((_plyMgr.PlayerCount >= _cfg.GetCVar(CCVars.SoftMaxPlayers) && !adminBypass) && !wasInGame) + var softPlayerCount = _plyMgr.PlayerCount; + + if (!_cfg.GetCVar(CCVars.AdminsCountForMaxPlayers)) + { + softPlayerCount -= _adminManager.ActiveAdmins.Count(); + } + + if ((softPlayerCount >= _cfg.GetCVar(CCVars.SoftMaxPlayers) && !adminBypass) && !wasInGame) { return (ConnectionDenyReason.Full, Loc.GetString("soft-player-cap-full"), null); } @@ -287,7 +296,7 @@ session.Status is SessionStatus.Connected or SessionStatus.InGame foreach (var whitelist in _whitelists) { - if (!IsValid(whitelist, _plyMgr.PlayerCount)) + if (!IsValid(whitelist, softPlayerCount)) { // Not valid for current player count. continue; diff --git a/Content.Shared/CCVar/CCVars.Admin.cs b/Content.Shared/CCVar/CCVars.Admin.cs index 28bebfbe8a6521..c422a5a02a1d73 100644 --- a/Content.Shared/CCVar/CCVars.Admin.cs +++ b/Content.Shared/CCVar/CCVars.Admin.cs @@ -149,6 +149,15 @@ public sealed partial class CCVars public static readonly CVarDef AdminBypassMaxPlayers = CVarDef.Create("admin.bypass_max_players", true, CVar.SERVERONLY); + /// + /// Determines whether admins count towards the total playercount when determining whether the server is over + /// Ideally this should be used in conjuction with . + /// This also applies to playercount limits in whitelist conditions + /// If false, then admins will not be considered when checking whether the playercount is already above the soft player cap + /// + public static readonly CVarDef AdminsCountForMaxPlayers = + CVarDef.Create("admin.admins_count_for_max_players", false, CVar.SERVERONLY); + /// /// Determine if custom rank names are used. /// If it is false, it'd use the actual rank name regardless of the individual's title.