diff --git a/code/datums/mind_vr.dm b/code/datums/mind_vr.dm
index 851e713f66..d2ae478410 100644
--- a/code/datums/mind_vr.dm
+++ b/code/datums/mind_vr.dm
@@ -1,2 +1,14 @@
/datum/mind
- var/vore_death = FALSE // Was our last gasp a gurgle?
\ No newline at end of file
+ var/vore_death = FALSE // Was our last gasp a gurgle?
+ var/show_in_directory
+ var/directory_tag
+ var/directory_erptag
+ var/directory_ad
+
+/mob/living/mind_initialize()
+ . = ..()
+ if (client?.prefs)
+ mind.show_in_directory = client.prefs.show_in_directory
+ mind.directory_tag = client.prefs.directory_tag
+ mind.directory_erptag = client.prefs.directory_erptag
+ mind.directory_ad = client.prefs.directory_ad
diff --git a/code/modules/client/verbs/character_directory.dm b/code/modules/client/verbs/character_directory.dm
index 8e7162cc78..13a1bd3e16 100644
--- a/code/modules/client/verbs/character_directory.dm
+++ b/code/modules/client/verbs/character_directory.dm
@@ -29,10 +29,15 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
/datum/character_directory/tgui_data(mob/user, datum/tgui/ui, datum/tgui_state/state)
var/list/data = ..()
-
- data["personalVisibility"] = user?.client?.prefs?.show_in_directory
- data["personalTag"] = user?.client?.prefs?.directory_tag || "Unset"
- data["personalErpTag"] = user?.client?.prefs?.directory_erptag || "Unset"
+
+ if (user?.mind)
+ data["personalVisibility"] = user.mind.show_in_directory
+ data["personalTag"] = user.mind.directory_tag || "Unset"
+ data["personalErpTag"] = user.mind.directory_erptag || "Unset"
+ else if (user?.client?.prefs)
+ data["personalVisibility"] = user.client.prefs.show_in_directory
+ data["personalTag"] = user.client.prefs.directory_tag || "Unset"
+ data["personalErpTag"] = user.client.prefs.directory_erptag || "Unset"
return data
@@ -42,18 +47,26 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
var/list/directory_mobs = list()
for(var/client/C in GLOB.clients)
// Allow opt-out.
- if(!C?.prefs?.show_in_directory)
+ if(C?.mob?.mind ? !C.mob.mind.show_in_directory : !C?.prefs?.show_in_directory)
continue
-
+
// These are the three vars we're trying to find
// The approach differs based on the mob the client is controlling
var/name = null
var/species = null
var/ooc_notes = null
var/flavor_text = null
- var/tag = C.prefs.directory_tag || "Unset"
- var/erptag = C.prefs.directory_erptag || "Unset"
- var/character_ad = C.prefs.directory_ad
+ var/tag
+ var/erptag
+ var/character_ad
+ if (C.mob?.mind) //could use ternary for all three but this is more efficient
+ tag = C.mob.mind.directory_tag || "Unset"
+ erptag = C.mob.mind.directory_erptag || "Unset"
+ character_ad = C.mob.mind.directory_ad
+ else
+ tag = C.prefs.directory_tag || "Unset"
+ erptag = C.prefs.directory_erptag || "Unset"
+ character_ad = C.prefs.directory_ad
if(ishuman(C.mob))
var/mob/living/carbon/human/H = C.mob
@@ -86,7 +99,7 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
// But if we can't find the name, they must be using a non-compatible mob type currently.
if(!name)
continue
-
+
directory_mobs.Add(list(list(
"name" = name,
"species" = species,
@@ -107,38 +120,80 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
if(.)
return
+ if(action == "refresh")
+ // This is primarily to stop malicious users from trying to lag the server by spamming this verb
+ if(!usr.checkMoveCooldown())
+ to_chat(usr, "Don't spam character directory refresh.")
+ return
+ usr.setMoveCooldown(10)
+ update_tgui_static_data(usr, ui)
+ return TRUE
+ else
+ return check_for_mind_or_prefs(usr, action, params["overwrite_prefs"])
+
+/datum/character_directory/proc/check_for_mind_or_prefs(mob/user, action, overwrite_prefs)
+ if (!user.client)
+ return
+ var/can_set_prefs = overwrite_prefs && !!user.client.prefs
+ var/can_set_mind = !!user.mind
+ if (!can_set_prefs && !can_set_mind)
+ if (!overwrite_prefs && !!user.client.prefs)
+ to_chat(user, "You cannot change these settings if you don't have a mind to save them to. Enable overwriting prefs and switch to a slot you're fine with overwriting.")
+ return
switch(action)
- if("refresh")
- // This is primarily to stop malicious users from trying to lag the server by spamming this verb
- if(!usr.checkMoveCooldown())
- to_chat(usr, "Don't spam character directory refresh.")
- return
- usr.setMoveCooldown(10)
- update_tgui_static_data(usr, ui)
- return TRUE
- if("setTag")
+ if ("setTag")
var/list/new_tag = tgui_input_list(usr, "Pick a new Vore tag for the character directory", "Character Tag", GLOB.char_directory_tags)
if(!new_tag)
return
- usr?.client?.prefs?.directory_tag = new_tag
- return TRUE
- if("setErpTag")
+ return set_for_mind_or_prefs(user, action, new_tag, can_set_prefs, can_set_mind)
+ if ("setErpTag")
var/list/new_erptag = tgui_input_list(usr, "Pick a new ERP tag for the character directory", "Character ERP Tag", GLOB.char_directory_erptags)
if(!new_erptag)
return
- usr?.client?.prefs?.directory_erptag = new_erptag
- return TRUE
- if("setVisible")
- usr?.client?.prefs?.show_in_directory = !usr?.client?.prefs?.show_in_directory
- to_chat(usr, "You are now [usr.client.prefs.show_in_directory ? "shown" : "not shown"] in the directory.")
- return TRUE
- if("editAd")
- if(!usr?.client?.prefs)
- return
-
- var/current_ad = usr.client.prefs.directory_ad
+ return set_for_mind_or_prefs(user, action, new_erptag, can_set_prefs, can_set_mind)
+ if ("setVisible")
+ var/visible = TRUE
+ if (can_set_mind)
+ visible = user.mind.show_in_directory
+ else if (can_set_prefs)
+ visible = user.client.prefs.show_in_directory
+ to_chat(usr, "You are now [!visible ? "shown" : "not shown"] in the directory.")
+ return set_for_mind_or_prefs(user, action, !visible, can_set_prefs, can_set_mind)
+ if ("editAd")
+ var/current_ad = (can_set_mind ? usr.mind.directory_ad : null) || (can_set_prefs ? usr.client.prefs.directory_ad : null)
var/new_ad = sanitize(tgui_input_text(usr, "Change your character ad", "Character Ad", current_ad, multiline = TRUE, prevent_enter = TRUE), extra = 0)
if(isnull(new_ad))
return
- usr.client.prefs.directory_ad = new_ad
- return TRUE
\ No newline at end of file
+ return set_for_mind_or_prefs(user, action, new_ad, can_set_prefs, can_set_mind)
+
+/datum/character_directory/proc/set_for_mind_or_prefs(mob/user, action, new_value, can_set_prefs, can_set_mind)
+ can_set_prefs &&= !!user.client.prefs
+ can_set_mind &&= !!user.mind
+ if (!can_set_prefs && !can_set_mind)
+ to_chat(user, "You seem to have lost either your mind, or your current preferences, while changing the values.[action == "editAd" ? " Here is your ad that you wrote. [new_value]" : null]")
+ return
+ switch(action)
+ if ("setTag")
+ if (can_set_prefs)
+ user.client.prefs.directory_tag = new_value
+ if (can_set_mind)
+ user.mind.directory_tag = new_value
+ return TRUE
+ if ("setErpTag")
+ if (can_set_prefs)
+ user.client.prefs.directory_erptag = new_value
+ if (can_set_mind)
+ user.mind.directory_erptag = new_value
+ return TRUE
+ if ("setVisible")
+ if (can_set_prefs)
+ user.client.prefs.show_in_directory = new_value
+ if (can_set_mind)
+ user.mind.show_in_directory = new_value
+ return TRUE
+ if ("editAd")
+ if (can_set_prefs)
+ user.client.prefs.directory_ad = new_value
+ if (can_set_mind)
+ user.mind.directory_ad = new_value
+ return TRUE
diff --git a/tgui/packages/tgui/interfaces/CharacterDirectory.js b/tgui/packages/tgui/interfaces/CharacterDirectory.js
index 35a437c5ec..9bb08b6488 100644
--- a/tgui/packages/tgui/interfaces/CharacterDirectory.js
+++ b/tgui/packages/tgui/interfaces/CharacterDirectory.js
@@ -29,28 +29,52 @@ export const CharacterDirectory = (props, context) => {
const [overlay, setOverlay] = useLocalState(context, 'overlay', null);
+ const [overwritePrefs, setOverwritePrefs] = useLocalState(context, 'overwritePrefs', false);
+
return (
{(overlay && ) || (
-
+
+
+ Save to current preferences slot:
+
+
+ }>
-
- act('setErpTag')} />
+ act('setErpTag', { overwrite_prefs: overwritePrefs })}
+ />
- act('editAd')} />
+ act('editAd', { overwrite_prefs: overwritePrefs })} />