From bbf24686889ec6c4c5cfd1842cd0e817b556a87a Mon Sep 17 00:00:00 2001 From: Neerti Date: Thu, 5 May 2016 10:14:34 -0400 Subject: [PATCH] Adds ability for players to ignore other players. (#1539) Players can now choose to not receive messages in OOC and deadchat from specific players, with the Ignore verb, or in the global preferences tab. Ignores can be reverted with the Unignore verb, or with the global preferences tab as well. This has no effect on IC chat. LOOC is also exempted from this. Admin messages cannot be blocked. --- code/game/verbs/ignore.dm | 44 +++++++++++++++++++ code/game/verbs/ooc.dm | 2 + .../client/preference_setup/global/05_ooc.dm | 38 ++++++++++++++++ code/modules/client/preferences.dm | 1 + code/modules/mob/mob_helpers.dm | 2 + polaris.dme | 2 + 6 files changed, 89 insertions(+) create mode 100644 code/game/verbs/ignore.dm create mode 100644 code/modules/client/preference_setup/global/05_ooc.dm diff --git a/code/game/verbs/ignore.dm b/code/game/verbs/ignore.dm new file mode 100644 index 0000000000..b772bd4e81 --- /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 1e976a2afc..fd9a37935e 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 0000000000..08aa97836a --- /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 cc339556c3..fb3b592e8c 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 e0500ff3cf..51f223295e 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 a52e40f32c..2dc731c0ef 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"