diff --git a/code/__DEFINES/preferences.dm b/code/__DEFINES/preferences.dm
index 9e0496a9249..1472a045d2d 100644
--- a/code/__DEFINES/preferences.dm
+++ b/code/__DEFINES/preferences.dm
@@ -13,8 +13,9 @@
#define MEMBER_PUBLIC 1024
#define CHAT_PULLR 2048
#define INTENT_STYLE 4096
+#define CHAT_GHOSTWHISPER 8192
-#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|MEMBER_PUBLIC|CHAT_PULLR|INTENT_STYLE)
+#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|MEMBER_PUBLIC|CHAT_PULLR|INTENT_STYLE|CHAT_GHOSTWHISPER)
#define BE_TRAITOR 1
#define BE_OPERATIVE 2
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index d04fb218547..7d3b28c5049 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -217,6 +217,7 @@ datum/preferences
dat += "Play lobby music: [(toggles & SOUND_LOBBY) ? "Yes" : "No"]
"
dat += "Ghost ears: [(toggles & CHAT_GHOSTEARS) ? "Nearest Creatures" : "All Speech"]
"
dat += "Ghost sight: [(toggles & CHAT_GHOSTSIGHT) ? "Nearest Creatures" : "All Emotes"]
"
+ dat += "Ghost whispers: [(toggles & CHAT_GHOSTWHISPER) ? "Nearest Creatures" : "All Speech"]
"
dat += "Pull requests: [(toggles & CHAT_PULLR) ? "Yes" : "No"]
"
if(config.allow_Metadata)
@@ -741,6 +742,9 @@ datum/preferences
if("ghost_sight")
toggles ^= CHAT_GHOSTSIGHT
+ if("ghost_whispers")
+ toggles ^= CHAT_GHOSTWHISPER
+
if("pull_requests")
toggles ^= CHAT_PULLR
diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm
index 360a0fcf481..7e33cebffd0 100644
--- a/code/modules/client/preferences_toggles.dm
+++ b/code/modules/client/preferences_toggles.dm
@@ -17,6 +17,15 @@
prefs.save_preferences()
feedback_add_details("admin_verb","TGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/client/verb/toggle_ghost_whispers()
+ set name = "Show/Hide GhostWhispers"
+ set category = "Preferences"
+ set desc = ".Toggle between hearing all whispers, and only whispers of nearby mobs"
+ prefs.toggles ^= CHAT_GHOSTWHISPER
+ src << "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTWHISPER) ? "see all whispers in the world" : "only see whispers from nearby mobs"]."
+ prefs.save_preferences()
+ feedback_add_details("admin_verb","TGW") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
/client/proc/toggle_hear_radio()
set name = "Show/Hide RadioChatter"
set category = "Preferences"
diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm
index 7423fdf456e..f3b6baae554 100644
--- a/code/modules/mob/living/carbon/human/whisper.dm
+++ b/code/modules/mob/living/carbon/human/whisper.dm
@@ -42,10 +42,11 @@
var/list/listening_dead = list()
for(var/mob/M in player_list)
- if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTEARS) && client)
+ if(M.stat == DEAD && ((M.client.prefs.toggles & CHAT_GHOSTWHISPER) || (get_dist(M, src) <= 7)))
listening_dead |= M
- var/list/listening = get_hear(1, src) | listening_dead
+ var/list/listening = get_hear(1, src)
+ listening |= listening_dead
var/list/eavesdropping = hearers(2, src)
eavesdropping -= listening
var/list/watching = hearers(5, src)
diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm
index 9a420303cf1..4c4ee69543c 100644
--- a/code/modules/mob/living/say.dm
+++ b/code/modules/mob/living/say.dm
@@ -144,7 +144,7 @@ var/list/department_radio_keys = list(
var/list/listening = get_hearers_in_view(message_range, source)
var/list/listening_dead = list()
for(var/mob/M in player_list)
- if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTEARS) && client) // client is so that ghosts don't have to listen to mice
+ if(M.stat == DEAD && ((M.client.prefs.toggles & CHAT_GHOSTEARS) || (get_dist(M, src) <= 7))&& client) // client is so that ghosts don't have to listen to mice
listening_dead |= M
listening -= listening_dead //so ghosts dont hear stuff twice