diff --git a/code/_global_vars/lists/misc.dm b/code/_global_vars/lists/misc.dm index e02c99290c..e94aa8d652 100644 --- a/code/_global_vars/lists/misc.dm +++ b/code/_global_vars/lists/misc.dm @@ -5,4 +5,6 @@ GLOBAL_LIST_EMPTY(meteor_list) GLOBAL_LIST_EMPTY(wire_color_directory) // This is an associative list with the `holder_type` as the key, and a list of colors as the value. // Reference list for disposal sort junctions. Filled up by sorting junction's New() -GLOBAL_LIST_EMPTY(tagger_locations) \ No newline at end of file +GLOBAL_LIST_EMPTY(tagger_locations) + +GLOBAL_LIST_INIT(char_directory_tags, list("Pred", "Prey", "Switch", "Non-Vore", "Unset")) \ No newline at end of file diff --git a/code/game/verbs/character_directory.dm b/code/game/verbs/character_directory.dm index 99f95700b8..13d0120123 100644 --- a/code/game/verbs/character_directory.dm +++ b/code/game/verbs/character_directory.dm @@ -1,61 +1,130 @@ +GLOBAL_DATUM(character_directory, /datum/character_directory) + /client/verb/show_character_directory() set name = "Character Directory" set category = "OOC" set desc = "Shows a listing of all active characters, along with their associated OOC notes, flavor text, and more." - if(mob.next_move >= world.time) //This is primarily to stop malicious users from trying to lag the server by spamming this verb + // 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) - mob.next_move = world.time + 10 + if(!GLOB.character_directory) + GLOB.character_directory = new + GLOB.character_directory.tgui_interact(mob) - var/html = "" - var/curID = 0 +// This is a global singleton. Keep in mind that all operations should occur on usr, not src. +/datum/character_directory +/datum/character_directory/tgui_state(mob/user) + return GLOB.tgui_always_state + +/datum/character_directory/tgui_interact(mob/user, datum/tgui/ui, datum/tgui/parent_ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "CharacterDirectory", "Character Directory") + ui.open() + +/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 + + return data + +/datum/character_directory/tgui_static_data(mob/user, datum/tgui/ui, datum/tgui_state/state) + var/list/data = ..() + + var/list/directory_mobs = list() for(var/client/C in GLOB.clients) - if(C.prefs && !C.prefs.show_in_directory) + // Allow opt-out. + if(!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/ooc_notes = null + var/flavor_text = null + var/tag = C.prefs.directory_tag + var/character_ad = C.prefs.directory_ad + if(ishuman(C.mob)) var/mob/living/carbon/human/H = C.mob if(data_core && data_core.general) if(!find_general_record("name", H.real_name)) if(!find_record("name", H.real_name, data_core.hidden_general)) continue - curID++ - html += "
404: Station not found
" + name = "[R.name] ([R.modtype] [R.braintype])" + ooc_notes = R.ooc_notes + flavor_text = R.flavor_text - var/datum/browser/popup = new(mob, "chardir", "Character Directory", 640, 480) - popup.set_content(html) - popup.open() + // It's okay if we fail to find OOC notes and flavor text + // 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, + "ooc_notes" = ooc_notes, + "tag" = tag, + "character_ad" = character_ad, + "flavor_text" = flavor_text, + ))) + + data["directory"] = directory_mobs + + return data + + +/datum/character_directory/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state) + . = ..() + if(.) + 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") + var/list/new_tag = input(usr, "Pick a new tag for the character directory", "Character Tag", usr?.client?.prefs?.directory_tag) as null|anything in GLOB.char_directory_tags + if(!new_tag) + return + usr?.client?.prefs?.directory_tag = new_tag + 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 + var/new_ad = sanitize(input(usr, "Change your character ad", "Character Ad", current_ad) as message|null, extra = 0) + if(isnull(new_ad)) + return + usr.client.prefs.directory_ad = new_ad + return TRUE \ No newline at end of file diff --git a/code/modules/client/preference_setup/vore/09_misc.dm b/code/modules/client/preference_setup/vore/09_misc.dm index 2911c8a10d..7f868e7286 100644 --- a/code/modules/client/preference_setup/vore/09_misc.dm +++ b/code/modules/client/preference_setup/vore/09_misc.dm @@ -6,10 +6,14 @@ /datum/category_item/player_setup_item/vore/misc/load_character(var/savefile/S) S["show_in_directory"] >> pref.show_in_directory + S["directory_tag"] >> pref.directory_tag + S["directory_ad"] >> pref.directory_ad S["sensorpref"] >> pref.sensorpref //TFF 5/8/19 - add sensor pref setting to load after saved /datum/category_item/player_setup_item/vore/misc/save_character(var/savefile/S) S["show_in_directory"] << pref.show_in_directory + S["directory_tag"] << pref.directory_tag + S["directory_ad"] << pref.directory_ad S["sensorpref"] << pref.sensorpref //TFF 5/8/19 - add sensor pref setting to be saveable //TFF 5/8/19 - add new datum category to allow for setting multiple settings when this is selected in the loadout. @@ -20,17 +24,30 @@ /datum/category_item/player_setup_item/vore/misc/sanitize_character() pref.show_in_directory = sanitize_integer(pref.show_in_directory, 0, 1, initial(pref.show_in_directory)) + pref.directory_tag = sanitize_inlist(pref.directory_tag, GLOB.char_directory_tags, initial(pref.directory_tag)) pref.sensorpref = sanitize_integer(pref.sensorpref, 1, sensorpreflist.len, initial(pref.sensorpref)) //TFF - 5/8/19 - add santisation for sensor prefs /datum/category_item/player_setup_item/vore/misc/content(var/mob/user) . += "