From 95081b7acdb28ee95d05a95d4f9e25c7466b9efe Mon Sep 17 00:00:00 2001
From: Jackraxxus <60418544+Jackraxxus@users.noreply.github.com>
Date: Sat, 22 Feb 2025 05:54:05 +1100
Subject: [PATCH] Adds a Config for Auto-Deadminning on Ready Up and
Latejoining (#89522)
## About The Pull Request
Fixes #89458
Adds a config for auto-deadminning admins who ready up before the round
starts, or click join game after.
The deadminning happens as soon as the button is pressed, not when a job
is selected or the round starts. I figure it's better to do it straight
away since both have opportunities for metainfo to be posted in admin
chat. Before there's admins messing with dynamic config / plotting
events etc. and during the round there's basically everything that gets
posted to admin logs.
I've had to add a typecheck to the auto_deadmin proc, since the lobby
menu technically happens on the centcom Z-level, and there's a pref for
ignoring deadminning on centcom Z, so it checks to see if the admin is a
new player mob.
Changed the old config from auto_deadmin_player to auto_deadmin_always
to make it less deceptive.
Was suggested a pref could be added to do this. I can do that if people
want it maybe, but it's not in this PR at the time of posting it.
Is now a pref
I dunno if the latejoin proccall is in the right spot in the click
sequence thing I can move it if people want.
## Why It's Good For The Game
Admins spawning themselves on station is very important for both
shenanigans and troubleshooting. It's annoying to have to click readmin
every time and I'm too lazy to figure out how to perms escalate my way
into disabling that config every round (Though I have tried).
This PR is marginally more likely to convince Timber to turn that off
than cussing him out in adminbus.
## Changelog
:cl:
admin: Added a new config to force admins to deadmin when readying up or
latejoining the round.
/:cl:
---
code/_onclick/hud/new_player.dm | 3 +++
code/controllers/configuration/entries/general.dm | 5 ++++-
code/controllers/subsystem/job.dm | 2 +-
code/modules/admin/permissionedit.dm | 2 +-
code/modules/client/preferences/admin.dm | 13 +++++++++++++
code/modules/mob/dead/new_player/new_player.dm | 7 +++++++
code/modules/mob/login.dm | 4 ++--
config/config.txt | 7 +++++--
.../preferences/features/game_preferences/admin.tsx | 9 +++++++++
9 files changed, 45 insertions(+), 7 deletions(-)
diff --git a/code/_onclick/hud/new_player.dm b/code/_onclick/hud/new_player.dm
index 986abbb146e..34185a2542d 100644
--- a/code/_onclick/hud/new_player.dm
+++ b/code/_onclick/hud/new_player.dm
@@ -254,6 +254,7 @@
var/mob/dead/new_player/new_player = hud.mymob
ready = !ready
if(ready)
+ new_player.auto_deadmin_on_ready_or_latejoin()
new_player.ready = PLAYER_READY_TO_PLAY
base_icon_state = "ready"
else
@@ -316,6 +317,8 @@
to_chat(new_player, span_notice("You have been added to the queue to join the game. Your position in queue is [SSticker.queued_players.len]."))
return
+ new_player.auto_deadmin_on_ready_or_latejoin()
+
if(!LAZYACCESS(params2list(params), CTRL_CLICK))
GLOB.latejoin_menu.ui_interact(new_player)
else
diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm
index e70b8e6962f..425fa39cd08 100644
--- a/code/controllers/configuration/entries/general.dm
+++ b/code/controllers/configuration/entries/general.dm
@@ -7,7 +7,7 @@
default = "Game Master"
protection = CONFIG_ENTRY_LOCKED
-/datum/config_entry/flag/auto_deadmin_players
+/datum/config_entry/flag/auto_deadmin_always
protection = CONFIG_ENTRY_LOCKED
/datum/config_entry/number/auto_deadmin_timegate
@@ -20,6 +20,9 @@
/datum/config_entry/flag/auto_deadmin_heads
protection = CONFIG_ENTRY_LOCKED
+/datum/config_entry/flag/auto_deadmin_on_ready_or_latejoin
+ protection = CONFIG_ENTRY_LOCKED
+
/datum/config_entry/flag/auto_deadmin_silicons
protection = CONFIG_ENTRY_LOCKED
diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm
index 5b9b1b9f8b4..96659ee029e 100644
--- a/code/controllers/subsystem/job.dm
+++ b/code/controllers/subsystem/job.dm
@@ -600,7 +600,7 @@ SUBSYSTEM_DEF(job)
job.announce_job(equipping, alt_title) // SKYRAT EDIT CHANGE - ALTERNATIVE_JOB_TITLES - ORIGINAL: job.announce_job(equipping)
if(player_client?.holder)
- if(CONFIG_GET(flag/auto_deadmin_players) || (player_client.prefs?.toggles & DEADMIN_ALWAYS))
+ if(CONFIG_GET(flag/auto_deadmin_always) || (player_client.prefs?.toggles & DEADMIN_ALWAYS))
player_client.holder.auto_deadmin()
else
handle_auto_deadmin_roles(player_client, job.title)
diff --git a/code/modules/admin/permissionedit.dm b/code/modules/admin/permissionedit.dm
index e474fcff095..a4a4c525167 100644
--- a/code/modules/admin/permissionedit.dm
+++ b/code/modules/admin/permissionedit.dm
@@ -302,7 +302,7 @@ ADMIN_VERB(edit_admin_permissions, R_PERMISSIONS, "Permissions Panel", "Edit adm
/datum/admins/proc/auto_deadmin()
if(owner.is_localhost())
return FALSE
- if(owner.prefs.read_preference(/datum/preference/toggle/bypass_deadmin_in_centcom) && is_centcom_level(owner.mob.z))
+ if(owner.prefs.read_preference(/datum/preference/toggle/bypass_deadmin_in_centcom) && is_centcom_level(owner.mob.z) && !istype(owner.mob, /mob/dead/new_player))
return FALSE
to_chat(owner, span_interface("You are now a normal player."), confidential = TRUE)
diff --git a/code/modules/client/preferences/admin.dm b/code/modules/client/preferences/admin.dm
index 47b96abca41..5694bb36fda 100644
--- a/code/modules/client/preferences/admin.dm
+++ b/code/modules/client/preferences/admin.dm
@@ -73,3 +73,16 @@
return FALSE
return is_admin(preferences.parent)
+
+/datum/preference/toggle/auto_deadmin_on_ready_or_latejoin
+ category = PREFERENCE_CATEGORY_GAME_PREFERENCES
+ savefile_key = "auto_deadmin_on_ready_or_latejoin"
+ savefile_identifier = PREFERENCE_PLAYER
+
+/datum/preference/toggle/auto_deadmin_on_ready_or_latejoin/is_accessible(datum/preferences/preferences)
+ if (!..(preferences))
+ return FALSE
+ if (preferences.toggles & DEADMIN_ALWAYS) //No reason to show if they're deadminning always, because deadmin always also deadmins on ready / latejoin
+ return FALSE
+
+ return is_admin(preferences.parent)
diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm
index fabdce5bc32..1c6ed58ae24 100644
--- a/code/modules/mob/dead/new_player/new_player.dm
+++ b/code/modules/mob/dead/new_player/new_player.dm
@@ -410,4 +410,11 @@
to_chat(new_player, span_info("Lobby Menu HUD reset. You may reset the HUD again in [DisplayTimeText(RESET_HUD_INTERVAL)]."))
hud_used.show_hud(hud_used.hud_version)
+///Auto deadmins an admin when they click to toggle the ready button or join game button in the menu
+/mob/dead/new_player/proc/auto_deadmin_on_ready_or_latejoin()
+ if(!client?.holder) //If they aren't an admin we dont care
+ return TRUE
+ if(CONFIG_GET(flag/auto_deadmin_on_ready_or_latejoin) || (client.prefs.read_preference(/datum/preference/toggle/auto_deadmin_on_ready_or_latejoin)) || (client.prefs?.toggles & DEADMIN_ALWAYS))
+ return client.holder.auto_deadmin()
+
#undef RESET_HUD_INTERVAL
diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm
index 3308fd4aa45..7d2e111083f 100644
--- a/code/modules/mob/login.dm
+++ b/code/modules/mob/login.dm
@@ -142,7 +142,7 @@
* Checks if the attached client is an admin and may deadmin them
*
* Configs:
- * * flag/auto_deadmin_players
+ * * flag/auto_deadmin_always
* * client.prefs?.toggles & DEADMIN_ALWAYS
* * User is antag and flag/auto_deadmin_antagonists or client.prefs?.toggles & DEADMIN_ANTAGONIST
* * or if their job demands a deadminning SSjob.handle_auto_deadmin_roles()
@@ -152,7 +152,7 @@
/mob/proc/auto_deadmin_on_login() //return true if they're not an admin at the end.
if(!client?.holder)
return TRUE
- if(CONFIG_GET(flag/auto_deadmin_players) || (client.prefs?.toggles & DEADMIN_ALWAYS))
+ if(CONFIG_GET(flag/auto_deadmin_always) || (client.prefs?.toggles & DEADMIN_ALWAYS))
return client.holder.auto_deadmin()
if(mind.has_antag_datum(/datum/antagonist) && (CONFIG_GET(flag/auto_deadmin_antagonists) || client.prefs?.toggles & DEADMIN_ANTAGONIST))
return client.holder.auto_deadmin()
diff --git a/config/config.txt b/config/config.txt
index 3d3f628423f..17c3750efc6 100644
--- a/config/config.txt
+++ b/config/config.txt
@@ -380,8 +380,11 @@ AUTOADMIN_RANK Game Master
#AUTOADMIN
-## Uncomment to automatically deadmin players when the game starts.
-#AUTO_DEADMIN_PLAYERS
+## Uncomment to automatically deadmin players whenever they are controlling a mob.
+#AUTO_DEADMIN_ALWAYS
+
+## Uncomment to automatically deadmin players when they click to ready up or join game. For latejoining, does it before they pick a role because it's best done early to limit metainfo.
+#AUTO_DEADMIN_ON_READY_OR_LATEJOIN
## Number of game ticks before player-admins will be automatically deadminned.
#AUTO_DEADMIN_TIMEGATE 600
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/admin.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/admin.tsx
index 7888a53e003..7224b78da7d 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/admin.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/admin.tsx
@@ -53,3 +53,12 @@ export const comms_notification: FeatureToggle = {
category: 'ADMIN',
component: CheckboxInput,
};
+
+export const auto_deadmin_on_ready_or_latejoin: FeatureToggle = {
+ name: 'Auto deadmin - Ready or Latejoin',
+ category: 'ADMIN',
+ description: `
+ When enabled, you will automatically deadmin when you click to ready up or latejoin a round.
+`,
+ component: CheckboxInput,
+};