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.