diff --git a/code/modules/client/preference_setup/global/setting_datums.dm b/code/modules/client/preference_setup/global/setting_datums.dm
index f8c0615ef95..21f80375063 100644
--- a/code/modules/client/preference_setup/global/setting_datums.dm
+++ b/code/modules/client/preference_setup/global/setting_datums.dm
@@ -113,6 +113,13 @@ var/list/_client_preferences_by_type
enabled_description = "Visible"
disabled_description = "Hidden"
enabled_by_default = FALSE
+
+/datum/client_preference/ghost_see_whisubtle
+ description = "See subtles/whispers as ghost"
+ key = "GHOST_SEE_WHISUBTLE"
+ enabled_description = "Visible"
+ disabled_description = "Hidden"
+ enabled_by_default = TRUE
//VOREStation Add End
/datum/client_preference/weather_sounds
description ="Weather sounds"
@@ -373,7 +380,7 @@ var/list/_client_preferences_by_type
key = "RECEIVE_TIPS"
enabled_description = "Enabled"
disabled_description = "Disabled"
-
+
/datum/client_preference/pain_frequency
description = "Pain Messages Cooldown"
key = "PAIN_FREQUENCY"
diff --git a/code/modules/client/preferences_vr.dm b/code/modules/client/preferences_vr.dm
index 5de49fd1c15..99e81035092 100644
--- a/code/modules/client/preferences_vr.dm
+++ b/code/modules/client/preferences_vr.dm
@@ -88,6 +88,21 @@
feedback_add_details("admin_verb","TWhisubtleVis") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/client/verb/toggle_ghost_privacyvision()
+ set name = "Toggle Ghost Private Eyes/ears"
+ set category = "Preferences"
+ set desc = "Toggles your ability to see subtles/whispers. Overrides admin status. Respects Ghost Privacy"
+
+ var/pref_path = /datum/client_preference/ghost_see_whisubtle
+
+ toggle_preference(pref_path)
+
+ to_chat(src, "As a ghost, you will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear subtles/whispers made by players.")
+
+ SScharacter_setup.queue_preferences_save(prefs)
+
+ feedback_add_details("admin_verb","TGhostSeeWhisSubtle") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
/client/verb/toggle_capture_crystal()
set name = "Toggle Catchable"
set category = "Preferences"
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index e6f3c5edeed..04a257cc5d4 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -363,7 +363,8 @@ var/list/channel_to_radio_key = new
if(M && src) //If we still exist, when the spawn processes
//VOREStation Add - Ghosts don't hear whispers
- if(whispering && !is_preference_enabled(/datum/client_preference/whisubtle_vis) && isobserver(M) && !M.client?.holder)
+ if(whispering && isobserver(M) && (!M.is_preference_enabled(/datum/client_preference/ghost_see_whisubtle) || \
+ (!is_preference_enabled(/datum/client_preference/whisubtle_vis) && !M.client?.holder)))
M.show_message("[src.name] [w_not_heard].", 2)
return
//VOREStation Add End
diff --git a/code/modules/mob/living/silicon/pai/pai_vr.dm b/code/modules/mob/living/silicon/pai/pai_vr.dm
index e692cc107bd..86d9d833346 100644
--- a/code/modules/mob/living/silicon/pai/pai_vr.dm
+++ b/code/modules/mob/living/silicon/pai/pai_vr.dm
@@ -513,7 +513,8 @@
if (istype(G, /mob/new_player))
continue
else if(isobserver(G) && G.is_preference_enabled(/datum/client_preference/ghost_ears))
- if(is_preference_enabled(/datum/client_preference/whisubtle_vis) || G.client.holder)
+ if((is_preference_enabled(/datum/client_preference/whisubtle_vis) || G.client.holder) && \
+ G.is_preference_enabled(/datum/client_preference/ghost_see_whisubtle))
to_chat(G, "[src.name]'s screen prints, \"[message]\"")
/mob/living/silicon/pai/proc/touch_window(soft_name) //This lets us touch TGUI procs and windows that may be nested behind other TGUI procs and windows
diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm
index e7e0e9ecca7..54b63aef977 100644
--- a/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/animal/alien animals/stardog.dm
@@ -500,7 +500,8 @@
for(var/mob/M as anything in vis_mobs)
if(isnewplayer(M))
continue
- if(isobserver(M) && !L.is_preference_enabled(/datum/client_preference/whisubtle_vis) && !M.client?.holder)
+ if(isobserver(M) && (!M.is_preference_enabled(/datum/client_preference/ghost_see_whisubtle) || \
+ !L.is_preference_enabled(/datum/client_preference/whisubtle_vis) && !M.client?.holder))
spawn(0)
M.show_message(undisplayed_message, 2)
else
@@ -1171,7 +1172,8 @@
for(var/mob/M as anything in vis_mobs)
if(isnewplayer(M))
continue
- if(isobserver(M) && !L.is_preference_enabled(/datum/client_preference/whisubtle_vis) && !M.client?.holder)
+ if(isobserver(M) && (!M.is_preference_enabled(/datum/client_preference/ghost_see_whisubtle) || \
+ !L.is_preference_enabled(/datum/client_preference/whisubtle_vis) && !M.client?.holder))
spawn(0)
M.show_message(undisplayed_message, 2)
else
diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm
index efbd0c308ed..ce58e3d8517 100644
--- a/code/modules/mob/say_vr.dm
+++ b/code/modules/mob/say_vr.dm
@@ -200,7 +200,8 @@
for(var/mob/M as anything in vis_mobs)
if(isnewplayer(M))
continue
- if(isobserver(M) && !is_preference_enabled(/datum/client_preference/whisubtle_vis) && !M.client?.holder)
+ if(isobserver(M) && (!M.is_preference_enabled(/datum/client_preference/ghost_see_whisubtle) || \
+ !is_preference_enabled(/datum/client_preference/whisubtle_vis) && !M.client?.holder))
spawn(0)
M.show_message(undisplayed_message, 2)
else
@@ -341,7 +342,8 @@
for (var/mob/G in player_list)
if (istype(G, /mob/new_player))
continue
- else if(isobserver(G) && G.is_preference_enabled(/datum/client_preference/ghost_ears))
+ else if(isobserver(G) && G.is_preference_enabled(/datum/client_preference/ghost_ears && \
+ G.is_preference_enabled(/datum/client_preference/ghost_see_whisubtle)))
if(is_preference_enabled(/datum/client_preference/whisubtle_vis) || G.client.holder)
to_chat(G, "\The [M] thinks, \"[message]\"")
log_say(message,M)
@@ -438,7 +440,8 @@
for (var/mob/G in player_list)
if (istype(G, /mob/new_player))
continue
- else if(isobserver(G) && G.is_preference_enabled(/datum/client_preference/ghost_ears))
+ else if(isobserver(G) && G.is_preference_enabled(/datum/client_preference/ghost_ears && \
+ G.is_preference_enabled(/datum/client_preference/ghost_see_whisubtle)))
if(is_preference_enabled(/datum/client_preference/whisubtle_vis) || G.client.holder)
to_chat(G, "\The [M] [message]")
log_say(message,M)