From e7294bdf4f84c85110e81b3c0433f7a1725842a2 Mon Sep 17 00:00:00 2001
From: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
Date: Wed, 18 Dec 2024 14:15:04 +0100
Subject: [PATCH] Only disable panicbunker for admins with AdminFlags.Admin
(#33879)
* Only disable panicbunker for admins with AdminFlags.Admin
* nicer curly braces
---
.../Administration/Systems/AdminSystem.cs | 13 ++++++----
Content.Shared/Administration/AdminData.cs | 5 ++--
.../Managers/ISharedAdminManager.cs | 24 ++++++++++++-------
Content.Shared/CCVar/CCVars.Game.cs | 1 +
4 files changed, 28 insertions(+), 15 deletions(-)
diff --git a/Content.Server/Administration/Systems/AdminSystem.cs b/Content.Server/Administration/Systems/AdminSystem.cs
index ce18a1e4f7263a..620880360359f8 100644
--- a/Content.Server/Administration/Systems/AdminSystem.cs
+++ b/Content.Server/Administration/Systems/AdminSystem.cs
@@ -337,10 +337,15 @@ private void OnBabyJailMaxOverallMinutesChanged(int minutes)
private void UpdatePanicBunker()
{
- var admins = PanicBunker.CountDeadminnedAdmins
- ? _adminManager.AllAdmins
- : _adminManager.ActiveAdmins;
- var hasAdmins = admins.Any();
+ var hasAdmins = false;
+ foreach (var admin in _adminManager.AllAdmins)
+ {
+ if (_adminManager.HasAdminFlag(admin, AdminFlags.Admin, includeDeAdmin: PanicBunker.CountDeadminnedAdmins))
+ {
+ hasAdmins = true;
+ break;
+ }
+ }
// TODO Fix order dependent Cvars
// Please for the sake of my sanity don't make cvars & order dependent.
diff --git a/Content.Shared/Administration/AdminData.cs b/Content.Shared/Administration/AdminData.cs
index 229edbcd4c365b..bad36f78c57e49 100644
--- a/Content.Shared/Administration/AdminData.cs
+++ b/Content.Shared/Administration/AdminData.cs
@@ -31,10 +31,11 @@ public sealed class AdminData
/// Checks whether this admin has an admin flag.
///
/// The flags to check. Multiple flags can be specified, they must all be held.
+ /// If true then also count flags even if the admin has de-adminned.
/// False if this admin is not or does not have all the flags specified.
- public bool HasFlag(AdminFlags flag)
+ public bool HasFlag(AdminFlags flag, bool includeDeAdmin = false)
{
- return Active && (Flags & flag) == flag;
+ return (includeDeAdmin || Active) && (Flags & flag) == flag;
}
///
diff --git a/Content.Shared/Administration/Managers/ISharedAdminManager.cs b/Content.Shared/Administration/Managers/ISharedAdminManager.cs
index 22d918d4a33ca2..f24d7f37d9ad3d 100644
--- a/Content.Shared/Administration/Managers/ISharedAdminManager.cs
+++ b/Content.Shared/Administration/Managers/ISharedAdminManager.cs
@@ -18,7 +18,7 @@ public interface ISharedAdminManager
///
/// if the player is not an admin.
AdminData? GetAdminData(EntityUid uid, bool includeDeAdmin = false);
-
+
///
/// Gets the admin data for a player, if they are an admin.
///
@@ -37,24 +37,30 @@ public interface ISharedAdminManager
///
/// When used by the client, this only returns accurate results for the player's own entity.
///
+ ///
+ /// Whether to check flags even for admins that are current de-adminned.
+ ///
/// True if the player is and admin and has the specified flags.
- bool HasAdminFlag(EntityUid player, AdminFlags flag)
+ bool HasAdminFlag(EntityUid player, AdminFlags flag, bool includeDeAdmin = false)
{
- var data = GetAdminData(player);
- return data != null && data.HasFlag(flag);
+ var data = GetAdminData(player, includeDeAdmin);
+ return data != null && data.HasFlag(flag, includeDeAdmin);
}
-
+
///
/// See if a player has an admin flag.
///
///
/// When used by the client, this only returns accurate results for the player's own session.
///
+ ///
+ /// Whether to check flags even for admins that are current de-adminned.
+ ///
/// True if the player is and admin and has the specified flags.
- bool HasAdminFlag(ICommonSession player, AdminFlags flag)
+ bool HasAdminFlag(ICommonSession player, AdminFlags flag, bool includeDeAdmin = false)
{
- var data = GetAdminData(player);
- return data != null && data.HasFlag(flag);
+ var data = GetAdminData(player, includeDeAdmin);
+ return data != null && data.HasFlag(flag, includeDeAdmin);
}
///
@@ -71,7 +77,7 @@ bool IsAdmin(EntityUid uid, bool includeDeAdmin = false)
{
return GetAdminData(uid, includeDeAdmin) != null;
}
-
+
///
/// Checks if a player is an admin.
///
diff --git a/Content.Shared/CCVar/CCVars.Game.cs b/Content.Shared/CCVar/CCVars.Game.cs
index 19092055e39f46..d74b46c7cccb8c 100644
--- a/Content.Shared/CCVar/CCVars.Game.cs
+++ b/Content.Shared/CCVar/CCVars.Game.cs
@@ -154,6 +154,7 @@ public static readonly CVarDef
///
/// Whether or not the panic bunker will enable when no admins are online.
+ /// This counts everyone with the 'Admin' AdminFlag.
///
public static readonly CVarDef PanicBunkerEnableWithoutAdmins =
CVarDef.Create("game.panic_bunker.enable_without_admins", false, CVar.SERVERONLY);