From 5d9596a72d87d29118c53a0add753fffef74bee7 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Mon, 21 Mar 2016 18:56:27 +0000 Subject: [PATCH 1/7] Makes it possible to have more than 16 preferences --- code/__defines/misc.dm | 20 --- code/_helpers/game.dm | 2 +- code/_helpers/logging.dm | 4 +- code/_helpers/text.dm | 2 +- code/game/area/areas.dm | 2 +- code/game/machinery/telecomms/broadcaster.dm | 19 +-- code/game/objects/items/devices/PDA/PDA.dm | 2 +- code/game/sound.dm | 2 +- code/game/verbs/ooc.dm | 8 +- code/modules/admin/admin.dm | 2 +- code/modules/admin/admin_verbs.dm | 32 ---- code/modules/admin/verbs/adminhelp.dm | 2 +- code/modules/admin/verbs/adminpm.dm | 2 +- code/modules/admin/verbs/deadsay.dm | 6 +- code/modules/admin/verbs/playsound.dm | 2 +- code/modules/admin/verbs/pray.dm | 2 +- .../preference_setup/general/01_basic.dm | 2 +- .../preference_setup/global/02_settings.dm | 102 +++++++++-- .../preference_setup/global/setting_datums.dm | 161 ++++++++++++++++++ code/modules/client/preferences.dm | 3 +- code/modules/client/preferences_toggles.dm | 159 ----------------- code/modules/mob/emote.dm | 4 +- code/modules/mob/hear_say.dm | 6 +- code/modules/mob/living/carbon/brain/emote.dm | 2 +- .../mob/living/carbon/human/whisper.dm | 2 +- code/modules/mob/living/say.dm | 2 +- .../living/silicon/robot/drone/drone_say.dm | 4 +- .../simple_animal/borer/borer_captive.dm | 2 +- .../mob/living/simple_animal/borer/say.dm | 2 +- code/modules/mob/mob_helpers.dm | 2 +- code/modules/mob/say.dm | 2 +- code/modules/mob/typing_indicator.dm | 47 ++--- .../finds/finds_talkingitem.dm | 2 +- polaris.dme | 2 +- 34 files changed, 305 insertions(+), 310 deletions(-) create mode 100644 code/modules/client/preference_setup/global/setting_datums.dm delete mode 100644 code/modules/client/preferences_toggles.dm diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 9741282f93..e9f44499a4 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -25,26 +25,6 @@ #define PROCESS_KILL 26 // Used to trigger removal from a processing list. #define MAX_GEAR_COST 10 // Used in chargen for accessory loadout limit. -// Preference toggles. -#define SOUND_ADMINHELP 0x1 -#define SOUND_MIDI 0x2 -#define SOUND_AMBIENCE 0x4 -#define SOUND_LOBBY 0x8 -#define CHAT_OOC 0x10 -#define CHAT_DEAD 0x20 -#define CHAT_GHOSTEARS 0x40 -#define CHAT_GHOSTSIGHT 0x80 -#define CHAT_PRAYER 0x100 -#define CHAT_RADIO 0x200 -#define CHAT_ATTACKLOGS 0x400 -#define CHAT_DEBUGLOGS 0x800 -#define CHAT_LOOC 0x1000 -#define CHAT_GHOSTRADIO 0x2000 -#define SHOW_TYPING 0x4000 -#define CHAT_NOICONS 0x8000 - -#define TOGGLES_DEFAULT (SOUND_ADMINHELP|SOUND_MIDI|SOUND_AMBIENCE|SOUND_LOBBY|CHAT_OOC|CHAT_DEAD|CHAT_GHOSTEARS|CHAT_GHOSTSIGHT|CHAT_PRAYER|CHAT_RADIO|CHAT_ATTACKLOGS|CHAT_LOOC) - // For secHUDs and medHUDs and variants. The number is the location of the image on the list hud_list of humans. #define HEALTH_HUD 1 // A simple line rounding the mob's number health. #define STATUS_HUD 2 // Alive, dead, diseased, etc. diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm index 3964ddeeba..06b277257f 100644 --- a/code/_helpers/game.dm +++ b/code/_helpers/game.dm @@ -244,7 +244,7 @@ var/turf/ear = get_turf(M) if(ear) // Ghostship is magic: Ghosts can hear radio chatter from anywhere - if(speaker_coverage[ear] || (istype(M, /mob/observer/dead) && (M.client) && (M.client.prefs.toggles & CHAT_GHOSTRADIO))) + if(speaker_coverage[ear] || (istype(M, /mob/observer/dead) && M.is_preference_enabled(/datum/client_preference/ghost_radio))) . |= M // Since we're already looping through mobs, why bother using |= ? This only slows things down. return . diff --git a/code/_helpers/logging.dm b/code/_helpers/logging.dm index 23119c69ad..d29c78e83a 100644 --- a/code/_helpers/logging.dm +++ b/code/_helpers/logging.dm @@ -31,7 +31,7 @@ diary << "\[[time_stamp()]]DEBUG: [text][log_end]" for(var/client/C in admins) - if(C.prefs.toggles & CHAT_DEBUGLOGS) + if(C.is_preference_enabled(/datum/client_preference/admin/show_debug_logs)) C << "DEBUG: [text]" @@ -91,7 +91,7 @@ if(dir & WEST) comps += "WEST" if(dir & UP) comps += "UP" if(dir & DOWN) comps += "DOWN" - + return english_list(comps, nothing_text="0", and_text="|", comma_text="|") //more or less a logging utility diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm index 224301a898..72549c9ee1 100644 --- a/code/_helpers/text.dm +++ b/code/_helpers/text.dm @@ -304,7 +304,7 @@ proc/TextPreview(var/string,var/len=40) // to always create it and then throw it out. /var/icon/text_tag_icons = new('./icons/chattags.dmi') /proc/create_text_tag(var/tagname, var/tagdesc = tagname, var/client/C = null) - if(C && (C.prefs.toggles & CHAT_NOICONS)) + if(!(C && C.is_preference_enabled(/datum/client_preference/chat_tags))) return tagdesc return "[tagdesc]" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 07b3dcacc5..3bf5efab88 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -243,7 +243,7 @@ var/list/mob/living/forced_ambiance_list = new /area/proc/play_ambience(var/mob/living/L) // Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch - if(!(L && L.client && (L.client.prefs.toggles & SOUND_AMBIENCE))) return + if(!(L && L.is_preference_enabled(/datum/client_preference/play_ambiance))) return // If we previously were in an area with force-played ambiance, stop it. if(L in forced_ambiance_list) diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index b64f5923c8..30c92af922 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -286,19 +286,14 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept for (var/mob/R in receive) /* --- Loop through the receivers and categorize them --- */ - - if (R.client) - if(R.client.prefs) - if(!(R.client.prefs.toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios. - continue - else - log_debug("Client prefs found to be null in /proc/Broadcast_Message() for mob [R] and client [R.ckey], this should be investigated.") + if (!R.is_preference_enabled(/datum/client_preference/holder/hear_radio)) + continue if(istype(R, /mob/new_player)) // we don't want new players to hear messages. rare but generates runtimes. continue // Ghosts hearing all radio chat don't want to hear syndicate intercepts, they're duplicates - if(data == 3 && istype(R, /mob/observer/dead) && R.client && R.client.prefs && (R.client.prefs.toggles & CHAT_GHOSTRADIO)) + if(data == 3 && istype(R, /mob/observer/dead) && R.is_preference_enabled(/datum/client_preference/ghost_radio)) continue // --- Check for compression --- @@ -494,12 +489,8 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept /* --- Loop through the receivers and categorize them --- */ - if (R.client) - if(R.client.prefs) - if(!(R.client.prefs.toggles & CHAT_RADIO)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios. - continue - else - log_debug("Client prefs found to be null in /proc/Broadcast_SimpleMessage() for mob [R] and client [R.ckey], this should be investigated.") + if(!R.is_preference_enabled(/datum/client_preference/holder/hear_radio)) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios. + continue // --- Check for compression --- diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index ed2e134154..b3915ffcee 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -990,7 +990,7 @@ var/global/list/obj/item/device/pda/PDAs = list() tnote.Add(list(list("sent" = 1, "owner" = "[P.owner]", "job" = "[P.ownjob]", "message" = "[t]", "target" = "\ref[P]"))) P.tnote.Add(list(list("sent" = 0, "owner" = "[owner]", "job" = "[ownjob]", "message" = "[t]", "target" = "\ref[src]"))) for(var/mob/M in player_list) - if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTEARS)) // src.client is so that ghosts don't have to listen to mice + if(M.stat == DEAD && M.client && (M.is_preference_enabled(/datum/client_preference/ghost_ears))) // src.client is so that ghosts don't have to listen to mice if(istype(M, /mob/new_player)) continue M.show_message("PDA Message - [owner] -> [P.owner]: [t]") diff --git a/code/game/sound.dm b/code/game/sound.dm index ce2b992d9b..fea1bdcb38 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -157,7 +157,7 @@ var/const/FALLOFF_SOUNDS = 0.5 /client/proc/playtitlemusic() if(!ticker || !ticker.login_music) return - if(prefs.toggles & SOUND_LOBBY) + if(is_preference_enabled(/datum/client_preference/play_lobby_music)) src << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1) // MAD JAMS /proc/get_rand_frequency() diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm index f2a2d74f11..1e976a2afc 100644 --- a/code/game/verbs/ooc.dm +++ b/code/game/verbs/ooc.dm @@ -15,7 +15,7 @@ msg = sanitize(msg) if(!msg) return - if(!(prefs.toggles & CHAT_OOC)) + if(!is_preference_enabled(/datum/client_preference/show_ooc)) src << "You have OOC muted." return @@ -50,7 +50,7 @@ ooc_style = "admin" for(var/client/target in clients) - if(target.prefs.toggles & CHAT_OOC) + if(target.is_preference_enabled(/datum/client_preference/show_ooc)) var/display_name = src.key if(holder) if(holder.fakekey) @@ -83,7 +83,7 @@ if(!msg) return - if(!(prefs.toggles & CHAT_LOOC)) + if(!is_preference_enabled(/datum/client_preference/show_looc)) src << "You have LOOC muted." return @@ -117,7 +117,7 @@ display_name = mob.name for(var/client/target in clients) - if(target.prefs.toggles & CHAT_LOOC) + if(target.is_preference_enabled(/datum/client_preference/show_looc)) var/prefix = "" var/admin_stuff = "" var/send = 0 diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index a3e6a5032d..7e2effce61 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -16,7 +16,7 @@ var/global/floorIsLava = 0 var/rendered = "ATTACK: [text]" for(var/client/C in admins) if((R_ADMIN|R_MOD) & C.holder.rights) - if(C.prefs.toggles & CHAT_ATTACKLOGS) + if(C.is_preference_enabled(/datum/client_preference/admin/show_attack_logs)) var/msg = rendered C << msg diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 228030f157..0ea7169874 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -2,7 +2,6 @@ var/list/admin_verbs_default = list( /datum/admins/proc/show_player_panel, /*shows an interface for individual players, with various links (links require additional flags*/ /client/proc/player_panel, - /client/proc/toggleadminhelpsound, /*toggles whether we hear a sound when adminhelps/PMs are used*/ /client/proc/deadmin_self, /*destroys our own admin datum so we can play as a regular player*/ /client/proc/hide_verbs, /*hides all our adminverbs*/ /client/proc/hide_most_verbs, /*hides all our hideable adminverbs*/ @@ -57,9 +56,7 @@ var/list/admin_verbs_admin = list( /client/proc/check_antagonists, /client/proc/admin_memo, /*admin memo system. show/delete/write. +SERVER needed to delete admin memos of others*/ /client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/ - /client/proc/toggleprayers, /*toggles prayers on/off*/ // /client/proc/toggle_hear_deadcast, /*toggles whether we hear deadchat*/ - /client/proc/toggle_hear_radio, /*toggles whether we hear the radio*/ /client/proc/investigate_show, /*various admintools for investigation. Such as a singulo grief-log*/ /client/proc/secrets, /datum/admins/proc/toggleooc, /*toggles ooc on/off for everyone*/ @@ -75,8 +72,6 @@ var/list/admin_verbs_admin = list( /client/proc/free_slot, /*frees slot for chosen job*/ /client/proc/cmd_admin_change_custom_event, /client/proc/cmd_admin_rejuvenate, - /client/proc/toggleattacklogs, - /client/proc/toggledebuglogs, /client/proc/toggleghostwriters, /client/proc/toggledrones, /datum/admins/proc/show_skills, @@ -187,7 +182,6 @@ var/list/admin_verbs_debug = list( /client/proc/enable_debug_verbs, /client/proc/callproc, /client/proc/callproc_target, - /client/proc/toggledebuglogs, /client/proc/SDQL_query, /client/proc/SDQL2_query, /client/proc/Jump, @@ -218,8 +212,6 @@ var/list/admin_verbs_rejuv = list( var/list/admin_verbs_hideable = list( /client/proc/deadmin_self, // /client/proc/deadchat, - /client/proc/toggleprayers, - /client/proc/toggle_hear_radio, /datum/admins/proc/show_traitor_panel, /datum/admins/proc/toggleenter, /datum/admins/proc/toggleguests, @@ -291,11 +283,9 @@ var/list/admin_verbs_mod = list( /client/proc/cmd_admin_pm_context, /*right-click adminPM interface*/ /client/proc/cmd_admin_pm_panel, /*admin-pm list*/ /client/proc/debug_variables, /*allows us to -see- the variables of any instance in the game.*/ - /client/proc/toggledebuglogs, /datum/admins/proc/PlayerNotes, /client/proc/admin_ghost, /*allows us to ghost/reenter body at will*/ /client/proc/cmd_mod_say, - /client/proc/toggleattacklogs, /datum/admins/proc/show_player_info, /client/proc/player_panel_new, /client/proc/dsay, @@ -903,17 +893,6 @@ var/list/admin_verbs_mentor = list( message_admins("A job slot for [job] has been opened by [key_name_admin(usr)]") return -/client/proc/toggleattacklogs() - set name = "Toggle Attack Log Messages" - set category = "Preferences" - - prefs.toggles ^= CHAT_ATTACKLOGS - if (prefs.toggles & CHAT_ATTACKLOGS) - usr << "You now will get attack log messages" - else - usr << "You now won't get attack log messages" - - /client/proc/toggleghostwriters() set name = "Toggle ghost writers" set category = "Server" @@ -942,17 +921,6 @@ var/list/admin_verbs_mentor = list( src << "Enabled maint drones." message_admins("Admin [key_name_admin(usr)] has enabled maint drones.", 1) -/client/proc/toggledebuglogs() - set name = "Toggle Debug Log Messages" - set category = "Preferences" - - prefs.toggles ^= CHAT_DEBUGLOGS - if (prefs.toggles & CHAT_DEBUGLOGS) - usr << "You now will get debug log messages" - else - usr << "You now won't get debug log messages" - - /client/proc/man_up(mob/T as mob in mob_list) set category = "Fun" set name = "Man Up" diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index f4ce67aa2c..504a8419bf 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -100,7 +100,7 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey"," if((R_ADMIN|R_MOD|R_MENTOR|R_SERVER) & X.holder.rights) if(X.is_afk()) admin_number_afk++ - if(X.prefs.toggles & SOUND_ADMINHELP) + if(X.is_preference_enabled(/datum/client_preference/holder/play_adminhelp_ping)) X << 'sound/effects/adminhelp.ogg' if(X.holder.rights == R_MENTOR) X << mentor_msg // Mentors won't see coloring of names on people with special_roles (Antags, etc.) diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm index f031bc2835..898cc4e835 100644 --- a/code/modules/admin/verbs/adminpm.dm +++ b/code/modules/admin/verbs/adminpm.dm @@ -104,7 +104,7 @@ //play the recieving admin the adminhelp sound (if they have them enabled) //non-admins shouldn't be able to disable this - if(C.prefs && C.prefs.toggles & SOUND_ADMINHELP) + if(C.is_preference_enabled(/datum/client_preference/holder/play_adminhelp_ping)) C << 'sound/effects/adminhelp.ogg' log_admin("PM: [key_name(src)]->[key_name(C)]: [msg]") diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index e6da3c736a..93646dd7b5 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -8,11 +8,11 @@ if(!src.mob) return if(prefs.muted & MUTE_DEADCHAT) - src << "\red You cannot send DSAY messages (muted)." + src << "You cannot send DSAY messages (muted)." return - if(!(prefs.toggles & CHAT_DEAD)) - src << "\red You have deadchat muted." + if(!is_preference_enabled(/datum/client_preference/show_dsay)) + src << "You have deadchat muted." return if (src.handle_spam_prevention(msg,MUTE_DEADCHAT)) diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm index 3a4b40d985..eb7451c61c 100644 --- a/code/modules/admin/verbs/playsound.dm +++ b/code/modules/admin/verbs/playsound.dm @@ -16,7 +16,7 @@ var/list/sounds_cache = list() log_admin("[key_name(src)] played sound [S]") message_admins("[key_name_admin(src)] played sound [S]", 1) for(var/mob/M in player_list) - if(M.client.prefs.toggles & SOUND_MIDI) + if(M.is_preference_enabled(/datum/client_preference/play_admin_midis)) M << uploaded_sound feedback_add_details("admin_verb","PGS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index e43c5400d9..600549cdfa 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -21,7 +21,7 @@ for(var/client/C in admins) if(R_ADMIN & C.holder.rights) - if(C.prefs.toggles & CHAT_PRAYER) + if(C.is_preference_enabled(/datum/client_preference/admin/show_chat_prayers)) C << msg usr << "Your prayers have been received by the gods." diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm index 367d3e247b..efd55d37ec 100644 --- a/code/modules/client/preference_setup/general/01_basic.dm +++ b/code/modules/client/preference_setup/general/01_basic.dm @@ -21,7 +21,7 @@ /datum/category_item/player_setup_item/general/basic/sanitize_character() if(!pref.species) pref.species = "Human" - var/datum/species/S = all_species[pref.species] + var/datum/species/S = all_species[pref.species ? pref.species : "Human"] pref.age = sanitize_integer(pref.age, S.min_age, S.max_age, initial(pref.age)) pref.gender = sanitize_inlist(pref.gender, valid_player_genders, pick(valid_player_genders)) pref.real_name = sanitize_name(pref.real_name, pref.species) diff --git a/code/modules/client/preference_setup/global/02_settings.dm b/code/modules/client/preference_setup/global/02_settings.dm index 7b61a86cb4..c44f9c4e44 100644 --- a/code/modules/client/preference_setup/global/02_settings.dm +++ b/code/modules/client/preference_setup/global/02_settings.dm @@ -1,3 +1,6 @@ +/datum/preferences + var/preferences = null + /datum/category_item/player_setup_item/player_global/settings name = "Settings" sort_order = 2 @@ -5,34 +8,101 @@ /datum/category_item/player_setup_item/player_global/settings/load_preferences(var/savefile/S) S["lastchangelog"] >> pref.lastchangelog S["default_slot"] >> pref.default_slot - S["toggles"] >> pref.toggles + S["preferences"] >> pref.preferences /datum/category_item/player_setup_item/player_global/settings/save_preferences(var/savefile/S) S["lastchangelog"] << pref.lastchangelog S["default_slot"] << pref.default_slot - S["toggles"] << pref.toggles + S["preferences"] << pref.preferences /datum/category_item/player_setup_item/player_global/settings/sanitize_preferences() + if(!istype(pref.preferences, /list)) + pref.preferences = list() + var/mob/pref_mob = preference_mob() + for(var/cp in get_client_preferences()) + var/datum/client_preference/client_pref = cp + if(!client_pref.enabled_by_default || !client_pref.may_toggle(pref_mob)) + continue + pref.preferences += client_pref.key + + for(var/preference in pref.preferences) + if(!get_client_preference_by_key(preference)) + pref.preferences -= preference + pref.lastchangelog = sanitize_text(pref.lastchangelog, initial(pref.lastchangelog)) pref.default_slot = sanitize_integer(pref.default_slot, 1, config.character_slots, initial(pref.default_slot)) - pref.toggles = sanitize_integer(pref.toggles, 0, 65535, initial(pref.toggles)) /datum/category_item/player_setup_item/player_global/settings/content(var/mob/user) - . += "Play admin midis: [(pref.toggles & SOUND_MIDI) ? "Yes" : "No"]
" - . += "Play lobby music: [(pref.toggles & SOUND_LOBBY) ? "Yes" : "No"]
" - . += "Ghost ears: [(pref.toggles & CHAT_GHOSTEARS) ? "All Speech" : "Nearest Creatures"]
" - . += "Ghost sight: [(pref.toggles & CHAT_GHOSTSIGHT) ? "All Emotes" : "Nearest Creatures"]
" - . += "Ghost radio: [(pref.toggles & CHAT_GHOSTRADIO) ? "All Chatter" : "Nearest Speakers"]
" + . = list() + . += "Preferences
" + . += "" + var/mob/pref_mob = preference_mob() + for(var/cp in get_client_preferences()) + var/datum/client_preference/client_pref = cp + if(!client_pref.may_toggle(pref_mob)) + continue + + . += "" + if(pref_mob.is_preference_enabled(client_pref.key)) + . += "" + else + . += "" + . += "" + + . += "
[client_pref.description]: [client_pref.enabled_description] [client_pref.disabled_description][client_pref.enabled_description] [client_pref.disabled_description]
" + return jointext(.) /datum/category_item/player_setup_item/player_global/settings/OnTopic(var/href,var/list/href_list, var/mob/user) - if(href_list["toggle"]) - var/toggle_flag = text2num(href_list["toggle"]) - pref.toggles ^= toggle_flag - if(toggle_flag == SOUND_LOBBY && isnewplayer(user)) - if(pref.toggles & SOUND_LOBBY) - user << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1) - else - user << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) + var/mob/pref_mob = preference_mob() + if(href_list["toggle_on"]) + . = pref_mob.set_preference(href_list["toggle_on"], TRUE) + else if(href_list["toggle_off"]) + . = pref_mob.set_preference(href_list["toggle_off"], FALSE) + if(.) return TOPIC_REFRESH return ..() + + +/client/proc/is_preference_enabled(var/preference) + if(ispath(preference)) + var/datum/client_preference/cp = get_client_preference_by_type(preference) + preference = cp.key + + return (preference in prefs.preferences) + +/client/proc/set_preference(var/preference, var/set_preference) + var/datum/client_preference/cp + if(ispath(preference)) + cp = get_client_preference_by_type(preference) + else + cp = get_client_preference_by_key(preference) + + if(!cp) + return FALSE + + var/enabled + if(set_preference && !(preference in prefs.preferences)) + prefs.preferences += preference + enabled = TRUE + . = TRUE + else if(!set_preference && (preference in prefs.preferences)) + prefs.preferences -= preference + enabled = FALSE + . = TRUE + if(.) + cp.toggled(mob, enabled) + +/mob/proc/is_preference_enabled(var/preference) + if(!client) + return FALSE + return client.is_preference_enabled(preference) + +/mob/proc/set_preference(var/preference, var/set_preference) + if(!client) + return FALSE + if(!client.prefs) + log_debug("Client prefs found to be null for mob [src] and client [ckey], this should be investigated.") + return FALSE + + return client.set_preference(preference, set_preference) \ No newline at end of file diff --git a/code/modules/client/preference_setup/global/setting_datums.dm b/code/modules/client/preference_setup/global/setting_datums.dm new file mode 100644 index 0000000000..dd872e2c16 --- /dev/null +++ b/code/modules/client/preference_setup/global/setting_datums.dm @@ -0,0 +1,161 @@ +var/list/_client_preferences +var/list/_client_preferences_by_key +var/list/_client_preferences_by_type + +/proc/get_client_preferences() + if(!_client_preferences) + _client_preferences = list() + for(var/ct in subtypes(/datum/client_preference)) + var/datum/client_preference/client_type = ct + if(initial(client_type.description)) + _client_preferences += new client_type() + return _client_preferences + +/proc/get_client_preference_by_key(var/preference) + if(!_client_preferences_by_key) + _client_preferences_by_key = list() + for(var/ct in get_client_preferences()) + var/datum/client_preference/client_pref = ct + _client_preferences_by_key[client_pref.key] = client_pref + return _client_preferences_by_key[preference] + +/proc/get_client_preference_by_type(var/preference) + if(!_client_preferences_by_type) + _client_preferences_by_type = list() + for(var/ct in get_client_preferences()) + var/datum/client_preference/client_pref = ct + _client_preferences_by_type[client_pref.type] = client_pref + return _client_preferences_by_type[preference] + +/datum/client_preference + var/description + var/key + var/enabled_by_default = TRUE + var/enabled_description = "Yes" + var/disabled_description = "No" + +/datum/client_preference/proc/may_toggle(var/mob/preference_mob) + return TRUE + +/datum/client_preference/proc/toggled(var/mob/preference_mob, var/enabled) + return + +/********************* +* Player Preferences * +*********************/ + +/datum/client_preference/play_admin_midis + description ="Play admin midis" + key = "SOUND_MIDI" + +/datum/client_preference/play_lobby_music + description ="Play lobby music" + key = "SOUND_LOBBY" + +/datum/client_preference/play_lobby_music/toggled(var/mob/preference_mob, var/enabled) + if(enabled) + preference_mob << sound(ticker.login_music, repeat = 0, wait = 0, volume = 85, channel = 1) + else + preference_mob << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) + +/datum/client_preference/play_ambiance + description ="Play ambience" + key = "SOUND_AMBIENCE" + +/datum/client_preference/play_ambiance/toggled(var/mob/preference_mob, var/enabled) + if(!enabled) + preference_mob << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1) + preference_mob << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2) + +/datum/client_preference/ghost_ears + description ="Ghost ears" + key = "CHAT_GHOSTEARS" + enabled_description = "All Speech" + disabled_description = "Nearby" + +/datum/client_preference/ghost_sight + description ="Ghost sight" + key = "CHAT_GHOSTSIGHT" + enabled_description = "All Emotes" + disabled_description = "Nearby" + +/datum/client_preference/ghost_radio + description ="Ghost radio" + key = "CHAT_GHOSTRADIO" + enabled_description = "All Chatter" + disabled_description = "Nearby" + +/datum/client_preference/chat_tags + description ="Chat tags" + key = "CHAT_SHOWICONS" + enabled_description = "Show" + disabled_description = "Hide" + +/datum/client_preference/show_typing_indicator + description ="Typing indicator" + key = "SHOW_TYPING" + enabled_description = "Show" + disabled_description = "Hide" + +/datum/client_preference/show_typing_indicator/toggled(var/mob/preference_mob, var/enabled) + if(!enabled) + preference_mob.set_typing_indicator(0) + +/datum/client_preference/show_ooc + description ="OOC chat" + key = "CHAT_OOC" + enabled_description = "Show" + disabled_description = "Hide" + +/datum/client_preference/show_looc + description ="LOOC chat" + key = "CHAT_LOOC" + enabled_description = "Show" + disabled_description = "Hide" + +/datum/client_preference/show_dsay + description ="Dead chat" + key = "CHAT_DEAD" + enabled_description = "Show" + disabled_description = "Hide" + +/******************** +* Admin Preferences * +********************/ +/datum/client_preference/admin/may_toggle(var/mob/preference_mob) + return check_rights(R_ADMIN, 0, preference_mob) + +/datum/client_preference/admin/show_attack_logs + description = "Attack Log Messages" + key = "CHAT_ATTACKLOGS" + enabled_description = "Show" + disabled_description = "Hide" + enabled_by_default = FALSE + +/datum/client_preference/admin/show_debug_logs + description = "Debug Log Messages" + key = "CHAT_DEBUGLOGS" + enabled_description = "Show" + disabled_description = "Hide" + enabled_by_default = FALSE + +/datum/client_preference/admin/show_chat_prayers + description = "Chat Prayers" + key = "CHAT_PRAYER" + enabled_description = "Show" + disabled_description = "Hide" + +/datum/client_preference/holder/may_toggle(var/mob/preference_mob) + return preference_mob && preference_mob.client && preference_mob.client.holder + +/datum/client_preference/holder/play_adminhelp_ping + description = "Adminhelps" + key = "SOUND_ADMINHELP" + enabled_description = "Hear" + disabled_description = "Silent" + +/datum/client_preference/holder/hear_radio + description = "Radio chatter" + key = "CHAT_RADIO" + enabled_description = "Show" + disabled_description = "Hide" diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 313e507498..f000ccfe7d 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -19,7 +19,6 @@ datum/preferences var/ooccolor = "#010000" //Whatever this is set to acts as 'reset' color and is thus unusable as an actual custom color var/be_special = 0 //Special role selection var/UI_style = "Midnight" - var/toggles = TOGGLES_DEFAULT var/UI_style_color = "#ffffff" var/UI_style_alpha = 255 @@ -204,7 +203,7 @@ datum/preferences dat += player_setup.content(user) dat += "" - user << browse(dat, "window=preferences;size=625x736") + user << browse(dat, "window=preferences;size=635x736") /datum/preferences/proc/process_link(mob/user, list/href_list) if(!user) return diff --git a/code/modules/client/preferences_toggles.dm b/code/modules/client/preferences_toggles.dm deleted file mode 100644 index 09ee55b173..0000000000 --- a/code/modules/client/preferences_toggles.dm +++ /dev/null @@ -1,159 +0,0 @@ -//toggles -/client/verb/toggle_ghost_ears() - set name = "Show/Hide GhostEars" - set category = "Preferences" - set desc = ".Toggle Between seeing all mob speech, and only speech of nearby mobs" - prefs.toggles ^= CHAT_GHOSTEARS - src << "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTEARS) ? "see all speech in the world" : "only see speech from nearby mobs"]." - prefs.save_preferences() - feedback_add_details("admin_verb","TGE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/verb/toggle_ghost_sight() - set name = "Show/Hide GhostSight" - set category = "Preferences" - set desc = ".Toggle Between seeing all mob emotes, and only emotes of nearby mobs" - prefs.toggles ^= CHAT_GHOSTSIGHT - src << "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTSIGHT) ? "see all emotes in the world" : "only see emotes from nearby mobs"]." - 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_radio() - set name = "Enable/Disable GhostRadio" - set category = "Preferences" - set desc = ".Toggle between hearing all radio chatter, or only from nearby speakers" - prefs.toggles ^= CHAT_GHOSTRADIO - src << "As a ghost, you will now [(prefs.toggles & CHAT_GHOSTRADIO) ? "hear all radio chat in the world" : "only hear from nearby speakers"]." - prefs.save_preferences() - feedback_add_details("admin_verb","TGR") - -/client/proc/toggle_hear_radio() - set name = "Show/Hide RadioChatter" - set category = "Preferences" - set desc = "Toggle seeing radiochatter from radios and speakers" - if(!holder) return - prefs.toggles ^= CHAT_RADIO - prefs.save_preferences() - usr << "You will [(prefs.toggles & CHAT_RADIO) ? "now" : "no longer"] see radio chatter from radios or speakers" - feedback_add_details("admin_verb","THR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/proc/toggleadminhelpsound() - set name = "Hear/Silence Adminhelps" - set category = "Preferences" - set desc = "Toggle hearing a notification when admin PMs are recieved" - if(!holder) return - prefs.toggles ^= SOUND_ADMINHELP - prefs.save_preferences() - usr << "You will [(prefs.toggles & SOUND_ADMINHELP) ? "now" : "no longer"] hear a sound when adminhelps arrive." - feedback_add_details("admin_verb","AHS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/verb/deadchat() // Deadchat toggle is usable by anyone. - set name = "Show/Hide Deadchat" - set category = "Preferences" - set desc ="Toggles seeing deadchat" - prefs.toggles ^= CHAT_DEAD - prefs.save_preferences() - - if(src.holder) - src << "You will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat." - else - src << "As a ghost, you will [(prefs.toggles & CHAT_DEAD) ? "now" : "no longer"] see deadchat." - - feedback_add_details("admin_verb","TDV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/proc/toggleprayers() - set name = "Show/Hide Prayers" - set category = "Preferences" - set desc = "Toggles seeing prayers" - prefs.toggles ^= CHAT_PRAYER - prefs.save_preferences() - src << "You will [(prefs.toggles & CHAT_PRAYER) ? "now" : "no longer"] see prayerchat." - feedback_add_details("admin_verb","TP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/verb/toggletitlemusic() - set name = "Hear/Silence LobbyMusic" - set category = "Preferences" - set desc = "Toggles hearing the GameLobby music" - prefs.toggles ^= SOUND_LOBBY - prefs.save_preferences() - if(prefs.toggles & SOUND_LOBBY) - src << "You will now hear music in the game lobby." - if(istype(mob, /mob/new_player)) - playtitlemusic() - else - src << "You will no longer hear music in the game lobby." - if(istype(mob, /mob/new_player)) - src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1) // stop the jamsz - feedback_add_details("admin_verb","TLobby") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/verb/togglemidis() - set name = "Hear/Silence Midis" - set category = "Preferences" - set desc = "Toggles hearing sounds uploaded by admins" - prefs.toggles ^= SOUND_MIDI - prefs.save_preferences() - if(prefs.toggles & SOUND_MIDI) - src << "You will now hear any sounds uploaded by admins." - var/sound/break_sound = sound(null, repeat = 0, wait = 0, channel = 777) - break_sound.priority = 250 - src << break_sound //breaks the client's sound output on channel 777 - else - src << "You will no longer hear sounds uploaded by admins; any currently playing midis have been disabled." - feedback_add_details("admin_verb","TMidi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -/client/verb/listen_ooc() - set name = "Show/Hide OOC" - set category = "Preferences" - set desc = "Toggles seeing OutOfCharacter chat" - prefs.toggles ^= CHAT_OOC - prefs.save_preferences() - src << "You will [(prefs.toggles & CHAT_OOC) ? "now" : "no longer"] see messages on the OOC channel." - feedback_add_details("admin_verb","TOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - - -/client/verb/listen_looc() - set name = "Show/Hide LOOC" - set category = "Preferences" - set desc = "Toggles seeing Local OutOfCharacter chat" - prefs.toggles ^= CHAT_LOOC - prefs.save_preferences() - - src << "You will [(prefs.toggles & CHAT_LOOC) ? "now" : "no longer"] see messages on the LOOC channel." - feedback_add_details("admin_verb","TLOOC") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - - -/client/verb/toggle_chattags() - set name = "Show/Hide Chat Tags" - set category = "Preferences" - set desc = "Toggles seeing chat tags/icons" - prefs.toggles ^= CHAT_NOICONS - prefs.save_preferences() - - src << "You will [!(prefs.toggles & CHAT_NOICONS) ? "now" : "no longer"] see chat tag icons." - feedback_add_details("admin_verb","TCTAG") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - - -/client/verb/Toggle_Soundscape() //All new ambience should be added here so it works with this verb until someone better at things comes up with a fix that isn't awful - set name = "Hear/Silence Ambience" - set category = "Preferences" - set desc = "Toggles hearing ambient sound effects" - prefs.toggles ^= SOUND_AMBIENCE - prefs.save_preferences() - if(prefs.toggles & SOUND_AMBIENCE) - src << "You will now hear ambient sounds." - else - src << "You will no longer hear ambient sounds." - src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 1) - src << sound(null, repeat = 0, wait = 0, volume = 0, channel = 2) - feedback_add_details("admin_verb","TAmbi") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - -//be special -/client/verb/toggle_be_special(role in be_special_flags) - set name = "Toggle SpecialRole Candidacy" - set category = "Preferences" - set desc = "Toggles which special roles you would like to be a candidate for, during events." - var/role_flag = be_special_flags[role] - if(!role_flag) return - prefs.be_special ^= role_flag - prefs.save_preferences() - src << "You will [(prefs.be_special & role_flag) ? "now" : "no longer"] be considered for [role] events (where possible)." - feedback_add_details("admin_verb","TBeSpecial") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 340546002f..8ab162dbc4 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -33,7 +33,7 @@ continue if(findtext(message," snores.")) //Because we have so many sleeping people. break - if(M.stat == 2 && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null))) + if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_sight) && !(M in viewers(src,null))) M.show_message(message, m_type) if (m_type & 1) @@ -66,7 +66,7 @@ src << "You cannot send deadchat emotes (muted)." return - if(!(client.prefs.toggles & CHAT_DEAD)) + if(!is_preference_enabled(/datum/client_preference/show_dsay)) src << "You have deadchat muted." return diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index fabca03049..375b1e1e13 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -4,7 +4,7 @@ if(!client) return - if(speaker && !speaker.client && istype(src,/mob/observer/dead) && client.prefs.toggles & CHAT_GHOSTEARS && !speaker in view(src)) + if(speaker && !speaker.client && istype(src,/mob/observer/dead) && is_preference_enabled(/datum/client_preference/ghost_ears) && !(speaker in view(src))) //Does the speaker have a client? It's either random stuff that observers won't care about (Experiment 97B says, 'EHEHEHEHEHEHEHE') //Or someone snoring. So we make it where they won't hear it. return @@ -51,12 +51,12 @@ var/track = null if(istype(src, /mob/observer/dead)) - if(italics && client.prefs.toggles & CHAT_GHOSTRADIO) + if(italics && is_preference_enabled(/datum/client_preference/ghost_radio)) return if(speaker_name != speaker.real_name && speaker.real_name) speaker_name = "[speaker.real_name] ([speaker_name])" track = "([ghost_follow_link(speaker, src)]) " - if(client.prefs.toggles & CHAT_GHOSTEARS && speaker in view(src)) + if(is_preference_enabled(/datum/client_preference/ghost_ears) && (speaker in view(src))) message = "[message]" if((sdisabilities & DEAF) || ear_deaf) diff --git a/code/modules/mob/living/carbon/brain/emote.dm b/code/modules/mob/living/carbon/brain/emote.dm index 1995ff5e1c..f29167f1f3 100644 --- a/code/modules/mob/living/carbon/brain/emote.dm +++ b/code/modules/mob/living/carbon/brain/emote.dm @@ -70,7 +70,7 @@ for(var/mob/M in dead_mob_list) if (!M.client || istype(M, /mob/new_player)) continue //skip monkeys, leavers, and new_players - if(M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(src,null))) + if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_sight) && !(M in viewers(src,null))) M.show_message(message) diff --git a/code/modules/mob/living/carbon/human/whisper.dm b/code/modules/mob/living/carbon/human/whisper.dm index 8817c43528..157310291a 100644 --- a/code/modules/mob/living/carbon/human/whisper.dm +++ b/code/modules/mob/living/carbon/human/whisper.dm @@ -116,7 +116,7 @@ for (var/mob/M in dead_mob_list) //does this include players who joined as observers as well? if (!(M.client)) continue - if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTEARS)) + if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_ears)) listening |= M //Pass whispers on to anything inside the immediate listeners. diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index fe33cfdcb9..54af2697ec 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -248,7 +248,7 @@ proc/get_radio_key_from_channel(var/channel) for(var/mob/M in player_list) - if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTEARS)) + if(M.stat == DEAD && M.client && M.is_preference_enabled(/datum/client_preference/ghost_ears)) listening |= M continue if(M.loc && M.locs[1] in hearturfs) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_say.dm b/code/modules/mob/living/silicon/robot/drone/drone_say.dm index 40f0119c99..b0f89a70ea 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_say.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_say.dm @@ -9,7 +9,7 @@ message = sanitize(message) - if (stat == 2) + if (stat == DEAD) return say_dead(message) if(copytext(message,1,2) == "*") @@ -34,7 +34,7 @@ for (var/mob/M in player_list) if (istype(M, /mob/new_player)) continue - else if(M.stat == 2 && M.client.prefs.toggles & CHAT_GHOSTEARS) + else if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_ears)) if(M.client) M << "[src] transmits, \"[message]\"" return 1 return ..(message, 0) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/borer/borer_captive.dm b/code/modules/mob/living/simple_animal/borer/borer_captive.dm index b153c78c8c..2d6bfc34b3 100644 --- a/code/modules/mob/living/simple_animal/borer/borer_captive.dm +++ b/code/modules/mob/living/simple_animal/borer/borer_captive.dm @@ -28,7 +28,7 @@ for (var/mob/M in player_list) if (istype(M, /mob/new_player)) continue - else if(M.stat == 2 && M.client.prefs.toggles & CHAT_GHOSTEARS) + else if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_ears)) M << "The captive mind of [src] whispers, \"[message]\"" /mob/living/captive_brain/emote(var/message) diff --git a/code/modules/mob/living/simple_animal/borer/say.dm b/code/modules/mob/living/simple_animal/borer/say.dm index a5e5a34d58..0d4cdad06e 100644 --- a/code/modules/mob/living/simple_animal/borer/say.dm +++ b/code/modules/mob/living/simple_animal/borer/say.dm @@ -38,5 +38,5 @@ for (var/mob/M in player_list) if (istype(M, /mob/new_player)) continue - else if(M.stat == 2 && M.client.prefs.toggles & CHAT_GHOSTEARS) + else if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_ears)) M << "[src.truename] whispers to [host], \"[message]\"" \ No newline at end of file diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 871215a519..9f1eb24dd1 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -391,7 +391,7 @@ proc/is_blind(A) name = realname for(var/mob/M in player_list) - if(M.client && ((!istype(M, /mob/new_player) && M.stat == DEAD) || (M.client.holder && !is_mentor(M.client))) && (M.client.prefs.toggles & CHAT_DEAD)) + if(M.client && ((!istype(M, /mob/new_player) && M.stat == DEAD) || (M.client.holder && !is_mentor(M.client))) && M.is_preference_enabled(/datum/client_preference/show_dsay)) var/follow var/lname if(subject) diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 8eabd67951..7a954a4b31 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -54,7 +54,7 @@ src << "Deadchat is globally muted." return - if(client && !(client.prefs.toggles & CHAT_DEAD)) + if(is_preference_enabled(/datum/client_preference/show_dsay)) usr << "You have deadchat muted." return diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm index 147edb1afe..8a8d92f2c7 100644 --- a/code/modules/mob/typing_indicator.dm +++ b/code/modules/mob/typing_indicator.dm @@ -15,8 +15,8 @@ mob/var/obj/effect/decal/typing_indicator typing_indicator.icon_state = "typing" if(client && !stat) - typing_indicator.invisibility = invisibility - if(client.prefs.toggles & SHOW_TYPING) + typing_indicator.invisibility = invisibility + if(!is_preference_enabled(/datum/client_preference/show_typing_indicator)) overlays -= typing_indicator else if(state) @@ -54,35 +54,20 @@ mob/var/obj/effect/decal/typing_indicator me_verb(message) /mob/proc/handle_typing_indicator() - if(client) - if(!(client.prefs.toggles & SHOW_TYPING) && !hud_typing) - var/temp = winget(client, "input", "text") + if(is_preference_enabled(/datum/client_preference/show_typing_indicator) && !hud_typing) + var/temp = winget(client, "input", "text") - if (temp != last_typed) - last_typed = temp - last_typed_time = world.time + if (temp != last_typed) + last_typed = temp + last_typed_time = world.time - if (world.time > last_typed_time + TYPING_INDICATOR_LIFETIME) - set_typing_indicator(0) - return - if(length(temp) > 5 && findtext(temp, "Say \"", 1, 7)) - set_typing_indicator(1) - else if(length(temp) > 3 && findtext(temp, "Me ", 1, 5)) - set_typing_indicator(1) + if (world.time > last_typed_time + TYPING_INDICATOR_LIFETIME) + set_typing_indicator(0) + return + if(length(temp) > 5 && findtext(temp, "Say \"", 1, 7)) + set_typing_indicator(1) + else if(length(temp) > 3 && findtext(temp, "Me ", 1, 5)) + set_typing_indicator(1) - else - set_typing_indicator(0) - -/client/verb/typing_indicator() - set name = "Show/Hide Typing Indicator" - set category = "Preferences" - set desc = "Toggles showing an indicator when you are typing emote or say message." - prefs.toggles ^= SHOW_TYPING - prefs.save_preferences() - src << "You will [(prefs.toggles & SHOW_TYPING) ? "no longer" : "now"] display a typing indicator." - - // Clear out any existing typing indicator. - if(prefs.toggles & SHOW_TYPING) - if(istype(mob)) mob.set_typing_indicator(0) - - feedback_add_details("admin_verb","TID") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! \ No newline at end of file + else + set_typing_indicator(0) \ No newline at end of file diff --git a/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm b/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm index 0dd7e46ed8..69aaac47c0 100644 --- a/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm +++ b/code/modules/research/xenoarchaeology/finds/finds_talkingitem.dm @@ -121,7 +121,7 @@ continue //skip monkeys and leavers if (istype(M, /mob/new_player)) continue - if(M.stat == 2 && M.client.prefs.toggles & CHAT_GHOSTEARS) + if(M.stat == DEAD && M.is_preference_enabled(/datum/client_preference/ghost_ears)) listening|=M for(var/mob/M in listening) diff --git a/polaris.dme b/polaris.dme index 6a7b2f7782..17eecd50cd 100644 --- a/polaris.dme +++ b/polaris.dme @@ -972,7 +972,6 @@ #include "code\modules\client\preferences_factions.dm" #include "code\modules\client\preferences_savefile.dm" #include "code\modules\client\preferences_spawnpoints.dm" -#include "code\modules\client\preferences_toggles.dm" #include "code\modules\client\ui_style.dm" #include "code\modules\client\preference_setup\preference_setup.dm" #include "code\modules\client\preference_setup\antagonism\01_basic.dm" @@ -987,6 +986,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\setting_datums.dm" #include "code\modules\client\preference_setup\loadout\loadout.dm" #include "code\modules\client\preference_setup\loadout\loadout_accessories.dm" #include "code\modules\client\preference_setup\loadout\loadout_cosmetics.dm" From dfe77a0669d40e971cf2e11fd61bfb2a553d3541 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Mon, 21 Mar 2016 19:12:13 +0000 Subject: [PATCH 2/7] Adds changelog --- html/changelogs/Yoshax-morepreferences.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/Yoshax-morepreferences.txt diff --git a/html/changelogs/Yoshax-morepreferences.txt b/html/changelogs/Yoshax-morepreferences.txt new file mode 100644 index 0000000000..9318611ecb --- /dev/null +++ b/html/changelogs/Yoshax-morepreferences.txt @@ -0,0 +1,4 @@ +author: Yoshax + +delete-after: True + - tweak Player preferences has been overhauled. Please update your preferences, found at "Character Setup" > "Global" > "Preferences", as they have been reset. \ No newline at end of file From ea579b2da68eff0c207ef8c6d4f93f85391b9385 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Fri, 4 Mar 2016 21:52:41 +0100 Subject: [PATCH 3/7] Preferences now store client key instead of the client itself. For reasons unbeknown to me, the client var is reset when the client logs outs and thus the preference mob cease to be. Now stores the client key, and acquires the appropriate mob based on that, if possible. Also removes the sanitation check because the holder isn't set before the preferences are created. Fixes #12341. --- .../client/preference_setup/global/02_settings.dm | 7 +++++++ .../client/preference_setup/preference_setup.dm | 11 +++++------ code/modules/client/preferences.dm | 12 +++++++++++- 3 files changed, 23 insertions(+), 7 deletions(-) diff --git a/code/modules/client/preference_setup/global/02_settings.dm b/code/modules/client/preference_setup/global/02_settings.dm index c44f9c4e44..2e1c058138 100644 --- a/code/modules/client/preference_setup/global/02_settings.dm +++ b/code/modules/client/preference_setup/global/02_settings.dm @@ -25,10 +25,13 @@ continue pref.preferences += client_pref.key +<<<<<<< HEAD for(var/preference in pref.preferences) if(!get_client_preference_by_key(preference)) pref.preferences -= preference +======= +>>>>>>> 19b7ebf... Preferences now store client key instead of the client itself. pref.lastchangelog = sanitize_text(pref.lastchangelog, initial(pref.lastchangelog)) pref.default_slot = sanitize_integer(pref.default_slot, 1, config.character_slots, initial(pref.default_slot)) @@ -50,7 +53,11 @@ . += "" . += "" +<<<<<<< HEAD return jointext(.) +======= + return jointext(., "") +>>>>>>> 19b7ebf... Preferences now store client key instead of the client itself. /datum/category_item/player_setup_item/player_global/settings/OnTopic(var/href,var/list/href_list, var/mob/user) var/mob/pref_mob = preference_mob() diff --git a/code/modules/client/preference_setup/preference_setup.dm b/code/modules/client/preference_setup/preference_setup.dm index 81c1f4c463..f02ecddc7b 100644 --- a/code/modules/client/preference_setup/preference_setup.dm +++ b/code/modules/client/preference_setup/preference_setup.dm @@ -212,13 +212,13 @@ /datum/category_item/player_setup_item/Topic(var/href,var/list/href_list) if(..()) return 1 - var/mob/user = usr - if(!user.client) + var/mob/pref_mob = preference_mob() + if(!pref_mob || !pref_mob.client) return 1 - . = OnTopic(href, href_list, user) + . = OnTopic(href, href_list, usr) if(. == TOPIC_REFRESH) - user.client.prefs.ShowChoices(user) + pref_mob.client.prefs.ShowChoices(usr) /datum/category_item/player_setup_item/CanUseTopic(var/mob/user) return 1 @@ -227,5 +227,4 @@ return TOPIC_NOACTION /datum/category_item/player_setup_item/proc/preference_mob() - if(pref && pref.client && pref.client.mob) - return pref.client.mob + return get_mob_by_key(pref.client_ckey) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index f000ccfe7d..288e7bffcb 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -109,10 +109,14 @@ datum/preferences // OOC Metadata: var/metadata = "" +<<<<<<< HEAD // Communicator identity data var/communicator_visibility = 0 var/client/client = null +======= + var/client_ckey = null +>>>>>>> 19b7ebf... Preferences now store client key instead of the client itself. var/datum/category_collection/player_setup_collection/player_setup @@ -125,7 +129,7 @@ datum/preferences gear = list() if(istype(C)) - client = C + client_ckey = C.ckey if(!IsGuestKey(C.key)) load_path(C.ckey) if(load_preferences()) @@ -186,6 +190,12 @@ datum/preferences /datum/preferences/proc/ShowChoices(mob/user) if(!user || !user.client) return + + if(!get_mob_by_key(client_ckey)) + user << "No mob exists for the given client!" + close_load_dialog(user) + return + var/dat = "
" if(path) From 78abc7f7906790c2ef93261e5c37fa0678913f27 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Tue, 22 Mar 2016 16:07:58 +0000 Subject: [PATCH 4/7] Fixes cherry picking errors --- .../client/preference_setup/global/02_settings.dm | 12 +----------- code/modules/client/preferences.dm | 8 ++------ 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/code/modules/client/preference_setup/global/02_settings.dm b/code/modules/client/preference_setup/global/02_settings.dm index 2e1c058138..203b561eed 100644 --- a/code/modules/client/preference_setup/global/02_settings.dm +++ b/code/modules/client/preference_setup/global/02_settings.dm @@ -25,13 +25,6 @@ continue pref.preferences += client_pref.key -<<<<<<< HEAD - for(var/preference in pref.preferences) - if(!get_client_preference_by_key(preference)) - pref.preferences -= preference - -======= ->>>>>>> 19b7ebf... Preferences now store client key instead of the client itself. pref.lastchangelog = sanitize_text(pref.lastchangelog, initial(pref.lastchangelog)) pref.default_slot = sanitize_integer(pref.default_slot, 1, config.character_slots, initial(pref.default_slot)) @@ -53,11 +46,8 @@ . += "" . += "" -<<<<<<< HEAD - return jointext(.) -======= + return jointext(., "") ->>>>>>> 19b7ebf... Preferences now store client key instead of the client itself. /datum/category_item/player_setup_item/player_global/settings/OnTopic(var/href,var/list/href_list, var/mob/user) var/mob/pref_mob = preference_mob() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 288e7bffcb..3b9929fc6f 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -109,15 +109,11 @@ datum/preferences // OOC Metadata: var/metadata = "" -<<<<<<< HEAD + var/client_ckey = null + // Communicator identity data var/communicator_visibility = 0 - var/client/client = null -======= - var/client_ckey = null ->>>>>>> 19b7ebf... Preferences now store client key instead of the client itself. - var/datum/category_collection/player_setup_collection/player_setup /datum/preferences/New(client/C) From f3cde3af017eed832d13433d9afdfb72c87d30b7 Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Mon, 7 Mar 2016 18:33:36 +0100 Subject: [PATCH 5/7] Both enabled and disabled preferences are now stored. The purpose is to ensure that new preferences that are in neither list get the appropriate enabled/disabled setting without having to utilize the savefile update path. Also attempts to optimize the acquirement of the preference mob. --- .../preference_setup/global/02_settings.dm | 69 ++++++++++++------- .../preference_setup/preference_setup.dm | 9 ++- code/modules/client/preferences.dm | 2 + 3 files changed, 56 insertions(+), 24 deletions(-) diff --git a/code/modules/client/preference_setup/global/02_settings.dm b/code/modules/client/preference_setup/global/02_settings.dm index 203b561eed..718ed5d12e 100644 --- a/code/modules/client/preference_setup/global/02_settings.dm +++ b/code/modules/client/preference_setup/global/02_settings.dm @@ -1,29 +1,52 @@ /datum/preferences - var/preferences = null + var/preferences_enabled = null + var/preferences_disabled = null /datum/category_item/player_setup_item/player_global/settings name = "Settings" sort_order = 2 /datum/category_item/player_setup_item/player_global/settings/load_preferences(var/savefile/S) - S["lastchangelog"] >> pref.lastchangelog - S["default_slot"] >> pref.default_slot - S["preferences"] >> pref.preferences + S["lastchangelog"] >> pref.lastchangelog + S["default_slot"] >> pref.default_slot + S["preferences"] >> pref.preferences_enabled + S["preferences_disabled"] >> pref.preferences_disabled /datum/category_item/player_setup_item/player_global/settings/save_preferences(var/savefile/S) - S["lastchangelog"] << pref.lastchangelog - S["default_slot"] << pref.default_slot - S["preferences"] << pref.preferences + S["lastchangelog"] << pref.lastchangelog + S["default_slot"] << pref.default_slot + S["preferences"] << pref.preferences_enabled + S["preferences_disabled"] << pref.preferences_disabled /datum/category_item/player_setup_item/player_global/settings/sanitize_preferences() - if(!istype(pref.preferences, /list)) - pref.preferences = list() - var/mob/pref_mob = preference_mob() - for(var/cp in get_client_preferences()) - var/datum/client_preference/client_pref = cp - if(!client_pref.enabled_by_default || !client_pref.may_toggle(pref_mob)) - continue - pref.preferences += client_pref.key + var/mob/pref_mob = preference_mob() + + // Ensure our preferences are lists. + if(!istype(pref.preferences_enabled, /list)) + pref.preferences_enabled = list() + if(!istype(pref.preferences_disabled, /list)) + pref.preferences_disabled = list() + + // Arrange preferences that have never been enabled/disabled. + var/list/client_preference_keys = list() + for(var/cp in get_client_preferences()) + var/datum/client_preference/client_pref = cp + client_preference_keys += client_pref.key + if((client_pref.key in pref.preferences_enabled) || (client_pref.key in pref.preferences_disabled)) + continue + + if(client_pref.enabled_by_default && client_pref.may_toggle(pref_mob)) + pref.preferences_enabled += client_pref.key + else + pref.preferences_disabled += client_pref.key + + // Clean out preferences that no longer exist. + for(var/key in pref.preferences_enabled) + if(!(key in client_preference_keys)) + pref.preferences_enabled -= key + for(var/key in pref.preferences_disabled) + if(!(key in client_preference_keys)) + pref.preferences_disabled -= key pref.lastchangelog = sanitize_text(pref.lastchangelog, initial(pref.lastchangelog)) pref.default_slot = sanitize_integer(pref.default_slot, 1, config.character_slots, initial(pref.default_slot)) @@ -46,7 +69,6 @@ . += "" . += "" - return jointext(., "") /datum/category_item/player_setup_item/player_global/settings/OnTopic(var/href,var/list/href_list, var/mob/user) @@ -60,13 +82,12 @@ return ..() - /client/proc/is_preference_enabled(var/preference) if(ispath(preference)) var/datum/client_preference/cp = get_client_preference_by_type(preference) preference = cp.key - return (preference in prefs.preferences) + return (preference in prefs.preferences_enabled) /client/proc/set_preference(var/preference, var/set_preference) var/datum/client_preference/cp @@ -79,12 +100,14 @@ return FALSE var/enabled - if(set_preference && !(preference in prefs.preferences)) - prefs.preferences += preference + if(set_preference && !(preference in prefs.preferences_enabled)) + prefs.preferences_enabled += preference + prefs.preferences_disabled -= preference enabled = TRUE . = TRUE - else if(!set_preference && (preference in prefs.preferences)) - prefs.preferences -= preference + else if(!set_preference && (preference in prefs.preferences_enabled)) + prefs.preferences_enabled -= preference + prefs.preferences_disabled |= preference enabled = FALSE . = TRUE if(.) @@ -102,4 +125,4 @@ log_debug("Client prefs found to be null for mob [src] and client [ckey], this should be investigated.") return FALSE - return client.set_preference(preference, set_preference) \ No newline at end of file + return client.set_preference(preference, set_preference) diff --git a/code/modules/client/preference_setup/preference_setup.dm b/code/modules/client/preference_setup/preference_setup.dm index f02ecddc7b..a890db16f5 100644 --- a/code/modules/client/preference_setup/preference_setup.dm +++ b/code/modules/client/preference_setup/preference_setup.dm @@ -227,4 +227,11 @@ return TOPIC_NOACTION /datum/category_item/player_setup_item/proc/preference_mob() - return get_mob_by_key(pref.client_ckey) + if(!pref.client) + for(var/client/C) + if(C.ckey == pref.client_ckey) + pref.client = C + break + + if(pref.client) + return pref.client.mob diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 3b9929fc6f..cc339556c3 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -109,6 +109,7 @@ datum/preferences // OOC Metadata: var/metadata = "" + var/client/client = null var/client_ckey = null // Communicator identity data @@ -125,6 +126,7 @@ datum/preferences gear = list() if(istype(C)) + client = C client_ckey = C.ckey if(!IsGuestKey(C.key)) load_path(C.ckey) From 3d78390ce6f99b0164cc8bbfb4a3cf27ececc1df Mon Sep 17 00:00:00 2001 From: PsiOmegaDelta Date: Tue, 15 Mar 2016 09:05:04 +0100 Subject: [PATCH 6/7] Adjusts preference defaults. They are no longer affected by whether clients are allowed to toggle them. --- code/modules/client/preference_setup/global/02_settings.dm | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/code/modules/client/preference_setup/global/02_settings.dm b/code/modules/client/preference_setup/global/02_settings.dm index 718ed5d12e..b7322645be 100644 --- a/code/modules/client/preference_setup/global/02_settings.dm +++ b/code/modules/client/preference_setup/global/02_settings.dm @@ -19,8 +19,6 @@ S["preferences_disabled"] << pref.preferences_disabled /datum/category_item/player_setup_item/player_global/settings/sanitize_preferences() - var/mob/pref_mob = preference_mob() - // Ensure our preferences are lists. if(!istype(pref.preferences_enabled, /list)) pref.preferences_enabled = list() @@ -35,7 +33,7 @@ if((client_pref.key in pref.preferences_enabled) || (client_pref.key in pref.preferences_disabled)) continue - if(client_pref.enabled_by_default && client_pref.may_toggle(pref_mob)) + if(client_pref.enabled_by_default) pref.preferences_enabled += client_pref.key else pref.preferences_disabled += client_pref.key From db1a5021bc4829338506f6f321c71dd8a92e8f66 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Mon, 28 Mar 2016 15:59:26 +0100 Subject: [PATCH 7/7] Corrects error in a span ckass --- code/modules/admin/verbs/deadsay.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/admin/verbs/deadsay.dm b/code/modules/admin/verbs/deadsay.dm index 93646dd7b5..11193a3f09 100644 --- a/code/modules/admin/verbs/deadsay.dm +++ b/code/modules/admin/verbs/deadsay.dm @@ -8,11 +8,11 @@ if(!src.mob) return if(prefs.muted & MUTE_DEADCHAT) - src << "You cannot send DSAY messages (muted)." + src << "You cannot send DSAY messages (muted)." return if(!is_preference_enabled(/datum/client_preference/show_dsay)) - src << "You have deadchat muted." + src << "You have deadchat muted." return if (src.handle_spam_prevention(msg,MUTE_DEADCHAT))