diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
index cb95aab8c0..d2aa2f6a91 100644
--- a/code/__DEFINES/preferences.dm
+++ b/code/__DEFINES/preferences.dm
@@ -16,6 +16,12 @@
#define DISABLE_ARRIVALRATTLE (1<<13)
#define COMBOHUD_LIGHTING (1<<14)
+#define DEADMIN_ALWAYS (1<<0)
+#define DEADMIN_ANTAGONIST (1<<1)
+#define DEADMIN_POSITION_HEAD (1<<2)
+#define DEADMIN_POSITION_SECURITY (1<<3)
+#define DEADMIN_POSITION_SILICON (1<<4)
+
#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|MEMBER_PUBLIC|INTENT_STYLE|MIDROUND_ANTAG|SOUND_INSTRUMENTS|SOUND_SHIP_AMBIENCE|SOUND_PRAYERS|SOUND_ANNOUNCEMENTS)
//Chat toggles
diff --git a/code/controllers/configuration/entries/admin.dm b/code/controllers/configuration/entries/admin.dm
index 1f9b5d460f..60919e10a9 100644
--- a/code/controllers/configuration/entries/admin.dm
+++ b/code/controllers/configuration/entries/admin.dm
@@ -64,3 +64,18 @@
/datum/config_entry/flag/automute_on //enables automuting/spam prevention
/datum/config_entry/flag/debug_admin_hrefs
+
+/datum/config_entry/flag/auto_deadmin_players
+ protection = CONFIG_ENTRY_LOCKED
+
+/datum/config_entry/flag/auto_deadmin_antagonists
+ protection = CONFIG_ENTRY_LOCKED
+
+/datum/config_entry/flag/auto_deadmin_heads
+ protection = CONFIG_ENTRY_LOCKED
+
+/datum/config_entry/flag/auto_deadmin_silicons
+ protection = CONFIG_ENTRY_LOCKED
+
+/datum/config_entry/flag/auto_deadmin_security
+ protection = CONFIG_ENTRY_LOCKED
diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm
index 6258ecf03f..64af18a82a 100644
--- a/code/controllers/subsystem/job.dm
+++ b/code/controllers/subsystem/job.dm
@@ -466,11 +466,11 @@ SUBSYSTEM_DEF(job)
SSpersistence.antag_rep_change[M.client.ckey] += job.GetAntagRep()
-/* if(M.client.holder)
- if(CONFIG_GET(flag/auto_deadmin_players) || (M.client.prefs?.toggles & DEADMIN_ALWAYS))
+ if(M.client.holder)
+ if(CONFIG_GET(flag/auto_deadmin_players) || (M.client.prefs?.deadmin & DEADMIN_ALWAYS))
M.client.holder.auto_deadmin()
else
- handle_auto_deadmin_roles(M.client, rank) */
+ handle_auto_deadmin_roles(M.client, rank)
to_chat(M, "You are the [rank].")
if(job)
@@ -517,19 +517,19 @@ SUBSYSTEM_DEF(job)
binder.decks = N.client.prefs.tcg_decks
return H
-/*
+
/datum/controller/subsystem/job/proc/handle_auto_deadmin_roles(client/C, rank)
if(!C?.holder)
return TRUE
var/datum/job/job = GetJob(rank)
if(!job)
return
- if((job.auto_deadmin_role_flags & DEADMIN_POSITION_HEAD) && (CONFIG_GET(flag/auto_deadmin_heads) || (C.prefs?.toggles & DEADMIN_POSITION_HEAD)))
+ if((job.auto_deadmin_role_flags & DEADMIN_POSITION_HEAD) && (CONFIG_GET(flag/auto_deadmin_heads) || (C.prefs?.deadmin & DEADMIN_POSITION_HEAD)))
return C.holder.auto_deadmin()
- else if((job.auto_deadmin_role_flags & DEADMIN_POSITION_SECURITY) && (CONFIG_GET(flag/auto_deadmin_security) || (C.prefs?.toggles & DEADMIN_POSITION_SECURITY)))
+ else if((job.auto_deadmin_role_flags & DEADMIN_POSITION_SECURITY) && (CONFIG_GET(flag/auto_deadmin_security) || (C.prefs?.deadmin & DEADMIN_POSITION_SECURITY)))
+ return C.holder.auto_deadmin()
+ else if((job.auto_deadmin_role_flags & DEADMIN_POSITION_SILICON) && (CONFIG_GET(flag/auto_deadmin_silicons) || (C.prefs?.deadmin & DEADMIN_POSITION_SILICON))) //in the event there's ever psuedo-silicon roles added, ie synths.
return C.holder.auto_deadmin()
- else if((job.auto_deadmin_role_flags & DEADMIN_POSITION_SILICON) && (CONFIG_GET(flag/auto_deadmin_silicons) || (C.prefs?.toggles & DEADMIN_POSITION_SILICON))) //in the event there's ever psuedo-silicon roles added, ie synths.
- return C.holder.auto_deadmin()*/
/datum/controller/subsystem/job/proc/setup_officer_positions()
var/datum/job/J = SSjob.GetJob("Security Officer")
diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm
index a1b1a1288e..ca392a0441 100644
--- a/code/modules/antagonists/_common/antag_datum.dm
+++ b/code/modules/antagonists/_common/antag_datum.dm
@@ -185,8 +185,8 @@ GLOBAL_LIST_EMPTY(antagonists)
// RegisterSignal(owner, COMSIG_MINDSHIELD_IMPLANTED, .proc/on_mindshield)
if(is_banned(owner.current) && replace_banned)
replace_banned_player()
- // else if(owner.current.client?.holder && (CONFIG_GET(flag/auto_deadmin_antagonists) || owner.current.client.prefs?.toggles & DEADMIN_ANTAGONIST))
- // owner.current.client.holder.auto_deadmin()
+ else if(owner.current.client?.holder && (CONFIG_GET(flag/auto_deadmin_antagonists) || owner.current.client.prefs?.deadmin & DEADMIN_ANTAGONIST))
+ owner.current.client.holder.auto_deadmin()
if(!soft_antag && owner.current.stat != DEAD)
owner.current.add_to_current_living_antags()
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 92e7830b74..dcfb199837 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -85,6 +85,8 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/tgui_lock = TRUE
var/windowflashing = TRUE
var/toggles = TOGGLES_DEFAULT
+ /// A separate variable for deadmin toggles, only deals with those.
+ var/deadmin = NONE
var/db_flags
var/chat_toggles = TOGGLES_DEFAULT_CHAT
var/ghost_form = "ghost"
@@ -844,6 +846,35 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Announce Login: [(toggles & ANNOUNCE_LOGIN)?"Enabled":"Disabled"]
"
dat += "
"
dat += "Combo HUD Lighting: [(toggles & COMBOHUD_LIGHTING)?"Full-bright":"No Change"]
"
+ dat += "
"
+
+ //deadmin
+ dat += "
Deadmin While Playing
"
+ if(CONFIG_GET(flag/auto_deadmin_players))
+ dat += "Always Deadmin: FORCED
"
+ else
+ dat += "Always Deadmin: [(deadmin & DEADMIN_ALWAYS)?"Enabled":"Disabled"]
"
+ if(!(deadmin & DEADMIN_ALWAYS))
+ dat += "
"
+ if(!CONFIG_GET(flag/auto_deadmin_antagonists))
+ dat += "As Antag: [(deadmin & DEADMIN_ANTAGONIST)?"Deadmin":"Keep Admin"]
"
+ else
+ dat += "As Antag: FORCED
"
+
+ if(!CONFIG_GET(flag/auto_deadmin_heads))
+ dat += "As Command: [(deadmin & DEADMIN_POSITION_HEAD)?"Deadmin":"Keep Admin"]
"
+ else
+ dat += "As Command: FORCED
"
+
+ if(!CONFIG_GET(flag/auto_deadmin_security))
+ dat += "As Security: [(deadmin & DEADMIN_POSITION_SECURITY)?"Deadmin":"Keep Admin"]
"
+ else
+ dat += "As Security: FORCED
"
+
+ if(!CONFIG_GET(flag/auto_deadmin_silicons))
+ dat += "As Silicon: [(deadmin & DEADMIN_POSITION_SILICON)?"Deadmin":"Keep Admin"]
"
+ else
+ dat += "As Silicon: FORCED
"
dat += ""
dat +=""
@@ -2815,6 +2846,19 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if("combohud_lighting")
toggles ^= COMBOHUD_LIGHTING
+ // Deadmin preferences
+ if("toggle_deadmin_always")
+ deadmin ^= DEADMIN_ALWAYS
+ if("toggle_deadmin_antag")
+ deadmin ^= DEADMIN_ANTAGONIST
+ if("toggle_deadmin_head")
+ deadmin ^= DEADMIN_POSITION_HEAD
+ if("toggle_deadmin_security")
+ deadmin ^= DEADMIN_POSITION_SECURITY
+ if("toggle_deadmin_silicon")
+ deadmin ^= DEADMIN_POSITION_SILICON
+ //
+
if("be_special")
var/be_special_type = href_list["be_special_type"]
if(be_special_type in be_special)
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 2a65cae9b6..a4fadb9b41 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -401,6 +401,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["default_slot"] >> default_slot
S["chat_toggles"] >> chat_toggles
S["toggles"] >> toggles
+ S["deadmin"] >> deadmin
S["ghost_form"] >> ghost_form
S["ghost_orbit"] >> ghost_orbit
S["ghost_accs"] >> ghost_accs
@@ -473,6 +474,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
windowflashing = sanitize_integer(windowflashing, 0, 1, initial(windowflashing))
default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot))
toggles = sanitize_integer(toggles, 0, 16777215, initial(toggles))
+ deadmin = sanitize_integer(deadmin, 0, 16777215, initial(deadmin))
clientfps = sanitize_integer(clientfps, 0, 1000, 0)
parallax = sanitize_integer(parallax, PARALLAX_DISABLE, PARALLAX_INSANE, null)
ambientocclusion = sanitize_integer(ambientocclusion, 0, 1, initial(ambientocclusion))
@@ -582,6 +584,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["be_special"], be_special)
WRITE_FILE(S["default_slot"], default_slot)
WRITE_FILE(S["toggles"], toggles)
+ WRITE_FILE(S["deadmin"], deadmin)
WRITE_FILE(S["chat_toggles"], chat_toggles)
WRITE_FILE(S["ghost_form"], ghost_form)
WRITE_FILE(S["ghost_orbit"], ghost_orbit)
diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm
index 6eaad5e2dc..e66a173404 100644
--- a/code/modules/jobs/job_types/_job.dm
+++ b/code/modules/jobs/job_types/_job.dm
@@ -15,7 +15,7 @@
//Bitflags for the job
var/flag = NONE //Deprecated
var/department_flag = NONE //Deprecated
-// var/auto_deadmin_role_flags = NONE
+ var/auto_deadmin_role_flags = NONE
//Players will be allowed to spawn in as jobs that are set to "Station"
var/faction = "None"
diff --git a/code/modules/jobs/job_types/ai.dm b/code/modules/jobs/job_types/ai.dm
index 38625cfd9c..171ea047e6 100644
--- a/code/modules/jobs/job_types/ai.dm
+++ b/code/modules/jobs/job_types/ai.dm
@@ -1,7 +1,7 @@
/datum/job/ai
title = "AI"
flag = AI_JF
-// auto_deadmin_role_flags = DEADMIN_POSITION_SILICON
+ auto_deadmin_role_flags = DEADMIN_POSITION_SILICON
department_flag = ENGSEC
faction = "Station"
total_positions = 1
diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm
index 4806bf5546..c3765260cc 100644
--- a/code/modules/jobs/job_types/captain.dm
+++ b/code/modules/jobs/job_types/captain.dm
@@ -1,7 +1,7 @@
/datum/job/captain
title = "Captain"
flag = CAPTAIN
-// auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY //:eyes:
+ auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY //:eyes:
department_head = list("CentCom")
department_flag = ENGSEC
faction = "Station"
diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm
index 6fbf546e95..bfc52e9437 100644
--- a/code/modules/jobs/job_types/chief_engineer.dm
+++ b/code/modules/jobs/job_types/chief_engineer.dm
@@ -1,7 +1,7 @@
/datum/job/chief_engineer
title = "Chief Engineer"
flag = CHIEF
-// auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
+ auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
department_head = list("Captain")
department_flag = ENGSEC
head_announce = list(RADIO_CHANNEL_ENGINEERING)
diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm
index bb5fc68809..89b06f6802 100644
--- a/code/modules/jobs/job_types/chief_medical_officer.dm
+++ b/code/modules/jobs/job_types/chief_medical_officer.dm
@@ -3,7 +3,7 @@
flag = CMO_JF
department_head = list("Captain")
department_flag = MEDSCI
-// auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
+ auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
head_announce = list(RADIO_CHANNEL_MEDICAL)
faction = "Station"
total_positions = 1
diff --git a/code/modules/jobs/job_types/cyborg.dm b/code/modules/jobs/job_types/cyborg.dm
index 761882894f..17a7cfad74 100644
--- a/code/modules/jobs/job_types/cyborg.dm
+++ b/code/modules/jobs/job_types/cyborg.dm
@@ -1,7 +1,7 @@
/datum/job/cyborg
title = "Cyborg"
flag = CYBORG
-// auto_deadmin_role_flags = DEADMIN_POSITION_SILICON
+ auto_deadmin_role_flags = DEADMIN_POSITION_SILICON
department_flag = ENGSEC
faction = "Station"
total_positions = 0
diff --git a/code/modules/jobs/job_types/detective.dm b/code/modules/jobs/job_types/detective.dm
index c704326879..b56ebed191 100644
--- a/code/modules/jobs/job_types/detective.dm
+++ b/code/modules/jobs/job_types/detective.dm
@@ -1,7 +1,7 @@
/datum/job/detective
title = "Detective"
flag = DETECTIVE
-// auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY
+ auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY
department_head = list("Head of Security")
department_flag = ENGSEC
faction = "Station"
diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm
index 07c1a12ced..ce05f199a2 100644
--- a/code/modules/jobs/job_types/head_of_personnel.dm
+++ b/code/modules/jobs/job_types/head_of_personnel.dm
@@ -1,7 +1,7 @@
/datum/job/hop
title = "Head of Personnel"
flag = HOP
-// auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
+ auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
department_head = list("Captain")
department_flag = CIVILIAN
head_announce = list(RADIO_CHANNEL_SERVICE)
diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm
index d612b6a56d..57f248b760 100644
--- a/code/modules/jobs/job_types/head_of_security.dm
+++ b/code/modules/jobs/job_types/head_of_security.dm
@@ -1,7 +1,7 @@
/datum/job/hos
title = "Head of Security"
flag = HOS
-// auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY
+ auto_deadmin_role_flags = DEADMIN_POSITION_HEAD|DEADMIN_POSITION_SECURITY
department_head = list("Captain")
department_flag = ENGSEC
head_announce = list(RADIO_CHANNEL_SECURITY)
diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm
index ff811d30d1..98343417c8 100644
--- a/code/modules/jobs/job_types/quartermaster.dm
+++ b/code/modules/jobs/job_types/quartermaster.dm
@@ -4,7 +4,7 @@
department_head = list("Captain")
department_flag = CIVILIAN
head_announce = list(RADIO_CHANNEL_SUPPLY)
-// auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
+ auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
faction = "Station"
total_positions = 1
spawn_positions = 1
diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm
index e70e747ae6..51f5296b16 100644
--- a/code/modules/jobs/job_types/research_director.dm
+++ b/code/modules/jobs/job_types/research_director.dm
@@ -1,7 +1,7 @@
/datum/job/rd
title = "Research Director"
flag = RD_JF
-// auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
+ auto_deadmin_role_flags = DEADMIN_POSITION_HEAD
department_head = list("Captain")
department_flag = MEDSCI
head_announce = list(RADIO_CHANNEL_SCIENCE)
diff --git a/code/modules/jobs/job_types/security_officer.dm b/code/modules/jobs/job_types/security_officer.dm
index df2fd7a5c6..f5d64b101a 100644
--- a/code/modules/jobs/job_types/security_officer.dm
+++ b/code/modules/jobs/job_types/security_officer.dm
@@ -1,7 +1,7 @@
/datum/job/officer
title = "Security Officer"
flag = OFFICER
-// auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY
+ auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY
department_head = list("Head of Security")
department_flag = ENGSEC
faction = "Station"
diff --git a/code/modules/jobs/job_types/warden.dm b/code/modules/jobs/job_types/warden.dm
index 074ccac09f..26decc294f 100644
--- a/code/modules/jobs/job_types/warden.dm
+++ b/code/modules/jobs/job_types/warden.dm
@@ -1,7 +1,7 @@
/datum/job/warden
title = "Warden"
flag = WARDEN
-// auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY
+ auto_deadmin_role_flags = DEADMIN_POSITION_SECURITY
department_head = list("Head of Security")
department_flag = ENGSEC
faction = "Station"
diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm
index a4e5b6b8d4..b455787e5c 100644
--- a/code/modules/mob/dead/dead.dm
+++ b/code/modules/mob/dead/dead.dm
@@ -121,6 +121,9 @@ INITIALIZE_IMMEDIATE(/mob/dead)
if (isturf(T))
update_z(T.z)
+/mob/dead/auto_deadmin_on_login()
+ return
+
/mob/dead/Logout()
update_z(null)
return ..()
diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm
index 7b1854b940..ddc47465a4 100644
--- a/code/modules/mob/living/silicon/login.dm
+++ b/code/modules/mob/living/silicon/login.dm
@@ -11,3 +11,10 @@
if(G)
mind.remove_antag_datum(G)
..()
+
+/mob/living/silicon/auto_deadmin_on_login()
+ if(!client?.holder)
+ return TRUE
+ if(CONFIG_GET(flag/auto_deadmin_silicons) || (client.prefs?.deadmin & DEADMIN_POSITION_SILICON))
+ return client.holder.auto_deadmin()
+ return ..()
diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
index 475886a2e1..9ecc60f7eb 100644
--- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
+++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm
@@ -140,6 +140,12 @@
if(!picked)
pickVisualAppearence()
+/mob/living/simple_animal/drone/auto_deadmin_on_login()
+ if(!client?.holder)
+ return TRUE
+ if(CONFIG_GET(flag/auto_deadmin_silicons) || (client.prefs?.deadmin & DEADMIN_POSITION_SILICON))
+ return client.holder.auto_deadmin()
+ return ..()
/mob/living/simple_animal/drone/death(gibbed)
..(gibbed)
diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm
index aac55c614b..a49df9522b 100644
--- a/code/modules/mob/login.dm
+++ b/code/modules/mob/login.dm
@@ -79,6 +79,7 @@
for(var/foo in client.player_details.post_login_callbacks)
var/datum/callback/CB = foo
CB.Invoke()
+ auto_deadmin_on_login()
mind?.hide_ckey = client?.prefs?.hide_ckey
@@ -96,3 +97,13 @@
// optimized area sound effects. Enable during events (compile flag when 😳)
// AddElement(/datum/element/weather_listener, /datum/weather/long_rain, ZTRAIT_STATION, GLOB.rain_sounds)
+
+/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?.deadmin & DEADMIN_ALWAYS))
+ return client.holder.auto_deadmin()
+ if(mind.has_antag_datum(/datum/antagonist) && (CONFIG_GET(flag/auto_deadmin_antagonists) || client.prefs?.deadmin & DEADMIN_ANTAGONIST))
+ return client.holder.auto_deadmin()
+ if(job)
+ return SSjob.handle_auto_deadmin_roles(client, job)
diff --git a/config/entries/admin.txt b/config/entries/admin.txt
index e583790b82..d7932bbe13 100644
--- a/config/entries/admin.txt
+++ b/config/entries/admin.txt
@@ -81,3 +81,17 @@ GUEST_BAN
## Allow admin hrefs that don't use the new token system, will eventually be removed
DEBUG_ADMIN_HREFS
+
+##
+## Those deadmin configs will lock admins this way, so it's not really recommended unless really needed
+##
+## Uncomment to automatically deadmin players when the game starts.
+#AUTO_DEADMIN_PLAYERS
+
+## Uncomment to automatically deadmin antagonists when they gain the role.
+#AUTO_DEADMIN_ANTAGONISTS
+
+## Uncomment to automatically deadmin specific role sets when a player joins the game.
+#AUTO_DEADMIN_HEADS
+#AUTO_DEADMIN_SECURITY
+#AUTO_DEADMIN_SILICONS
|