From a5cd8be9d08694005ae023cd66e24fc2e3ad779a Mon Sep 17 00:00:00 2001 From: Seris02 Date: Fri, 20 Jan 2023 20:29:34 +0800 Subject: [PATCH] adds the ability to use temporary character directories --- code/datums/mind_vr.dm | 14 +- .../client/verbs/character_directory.dm | 125 +++++++++++++----- .../tgui/interfaces/CharacterDirectory.js | 34 ++++- 3 files changed, 132 insertions(+), 41 deletions(-) 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:  + +