diff --git a/code/game/verbs/ignore.dm b/code/game/verbs/ignore.dm
new file mode 100644
index 00000000000..b772bd4e813
--- /dev/null
+++ b/code/game/verbs/ignore.dm
@@ -0,0 +1,44 @@
+/client/verb/ignore(key_to_ignore as text)
+ set name = "Ignore"
+ set category = "OOC"
+ set desc = "Makes OOC and Deadchat messages from a specific player not appear to you."
+
+ if(!key_to_ignore)
+ return
+ key_to_ignore = ckey(sanitize(key_to_ignore))
+ if(prefs && prefs.ignored_players)
+ if(key_to_ignore in prefs.ignored_players)
+ usr << "[key_to_ignore] is already being ignored."
+ return
+ prefs.ignored_players |= key_to_ignore
+ prefs.save_preferences()
+ usr << "Now ignoring [key_to_ignore]."
+
+/client/verb/unignore(key_to_unignore as text)
+ set name = "Unignore"
+ set category = "OOC"
+ set desc = "Reverts your ignoring of a specific player."
+
+ if(!key_to_unignore)
+ return
+ key_to_unignore = ckey(sanitize(key_to_unignore))
+ if(prefs && prefs.ignored_players)
+ if(!(key_to_unignore in prefs.ignored_players))
+ usr << "[key_to_unignore] isn't being ignored."
+ return
+ prefs.ignored_players -= key_to_unignore
+ prefs.save_preferences()
+ usr << "Reverted ignore on [key_to_unignore]."
+
+/mob/proc/is_key_ignored(var/key_to_check)
+ if(client)
+ return client.is_key_ignored(key_to_check)
+ return 0
+
+/client/proc/is_key_ignored(var/key_to_check)
+ key_to_check = ckey(key_to_check)
+ if(key_to_check in prefs.ignored_players)
+ if(directory[key_to_check] in admins) // This is here so this is only evaluated if someone is actually being blocked.
+ return 0
+ return 1
+ return 0
\ No newline at end of file
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index 1e976a2afcd..fd9a37935eb 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -51,6 +51,8 @@
for(var/client/target in clients)
if(target.is_preference_enabled(/datum/client_preference/show_ooc))
+ if(target.is_key_ignored(key)) // If we're ignored by this person, then do nothing.
+ continue
var/display_name = src.key
if(holder)
if(holder.fakekey)
diff --git a/code/modules/client/preference_setup/global/05_ooc.dm b/code/modules/client/preference_setup/global/05_ooc.dm
new file mode 100644
index 00000000000..08aa97836a9
--- /dev/null
+++ b/code/modules/client/preference_setup/global/05_ooc.dm
@@ -0,0 +1,38 @@
+/datum/category_item/player_setup_item/player_global/ooc
+ name = "OOC"
+ sort_order = 5
+
+/datum/category_item/player_setup_item/player_global/ooc/load_preferences(var/savefile/S)
+ S["ignored_players"] >> pref.ignored_players
+
+
+/datum/category_item/player_setup_item/player_global/ooc/save_preferences(var/savefile/S)
+ S["ignored_players"] << pref.ignored_players
+
+
+/datum/category_item/player_setup_item/player_global/ooc/sanitize_preferences()
+ if(isnull(pref.ignored_players))
+ pref.ignored_players = list()
+
+/datum/category_item/player_setup_item/player_global/ooc/content(var/mob/user)
+ . += "OOC:
"
+ . += "Ignored Players
"
+ for(var/ignored_player in pref.ignored_players)
+ . += "[ignored_player] (Unignore)
"
+ . += "(Ignore Player)"
+
+/datum/category_item/player_setup_item/player_global/ooc/OnTopic(var/href,var/list/href_list, var/mob/user)
+ if(href_list["unignore_player"])
+ if(CanUseTopic(user))
+ pref.ignored_players -= href_list["unignore_player"]
+ return TOPIC_REFRESH
+
+ if(href_list["ignore_player"])
+ if(CanUseTopic(user))
+ var/player_to_ignore = input(user, "Who do you want to ignore?","Ignore") as null|text
+ if(player_to_ignore)
+ player_to_ignore = sanitize(ckey(player_to_ignore))
+ pref.ignored_players |= player_to_ignore
+ return TOPIC_REFRESH
+
+ return ..()
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index cc339556c30..fb3b592e8cd 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -108,6 +108,7 @@ datum/preferences
// OOC Metadata:
var/metadata = ""
+ var/list/ignored_players = list()
var/client/client = null
var/client_ckey = null
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index e0500ff3cff..51f223295e0 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -404,6 +404,8 @@ proc/is_blind(A)
var/follow
var/lname
if(subject)
+ if(M.is_key_ignored(subject.client.key)) // If we're ignored, do nothing.
+ continue
if(subject != M)
follow = "([ghost_follow_link(subject, M)]) "
if(M.stat != DEAD && M.client.holder)
diff --git a/polaris.dme b/polaris.dme
index a52e40f32c3..2dc731c0ef0 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -851,6 +851,7 @@
#include "code\game\turfs\unsimulated\beach.dm"
#include "code\game\turfs\unsimulated\floor.dm"
#include "code\game\turfs\unsimulated\walls.dm"
+#include "code\game\verbs\ignore.dm"
#include "code\game\verbs\ooc.dm"
#include "code\game\verbs\suicide.dm"
#include "code\game\verbs\who.dm"
@@ -997,6 +998,7 @@
#include "code\modules\client\preference_setup\global\02_settings.dm"
#include "code\modules\client\preference_setup\global\03_pai.dm"
#include "code\modules\client\preference_setup\global\04_communicators.dm"
+#include "code\modules\client\preference_setup\global\05_ooc.dm"
#include "code\modules\client\preference_setup\global\setting_datums.dm"
#include "code\modules\client\preference_setup\loadout\gear_tweaks.dm"
#include "code\modules\client\preference_setup\loadout\loadout.dm"