From 1d36a4215d3fa2cd5a7531aaac21f494966568a7 Mon Sep 17 00:00:00 2001 From: TheGreatKitsune Date: Sun, 26 Feb 2023 15:43:47 -0600 Subject: [PATCH] Item TF spawnpoints --- code/_helpers/global_lists_ch.dm | 2 + code/game/jobs/job_controller.dm | 92 ++++++++++++++++++- code/game/objects/items_vr.dm | 1 + .../loadout/gear_tweaks_ch.dm | 38 ++++++++ .../preference_setup/loadout/loadout.dm | 2 +- code/modules/mob/new_player/new_player.dm | 11 ++- modular_chomp/code/game/objects/items.dm | 18 ++++ .../modules/client/preferences_spawnpoints.dm | 4 + vorestation.dme | 2 + 9 files changed, 167 insertions(+), 3 deletions(-) create mode 100644 code/modules/client/preference_setup/loadout/gear_tweaks_ch.dm create mode 100644 modular_chomp/code/game/objects/items.dm diff --git a/code/_helpers/global_lists_ch.dm b/code/_helpers/global_lists_ch.dm index ff5c0a26e4..8f96b700fc 100644 --- a/code/_helpers/global_lists_ch.dm +++ b/code/_helpers/global_lists_ch.dm @@ -13,6 +13,8 @@ var/global/list/vore_reagent_sounds = list( 'sound/vore/walkslosh10.ogg', "None" = null) +var/global/list/item_tf_spawnpoints = list() // Global variable tracking which items are item tf spawnpoints + /var/global/list/existing_metroids = list() //Global variable for tracking metroids for the event announcement. Needs to go here for load order. //stuff that only synths can eat diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index ed7b64dfca..e5f901bd72 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -657,6 +657,7 @@ var/global/datum/controller/occupations/job_master var/fail_deadly = FALSE var/obj/belly/vore_spawn_gut var/mob/living/prey_to_nomph + var/obj/item/item_to_be //CHOMPEdit - Remove fail_deadly addition on offmap_spawn @@ -781,6 +782,91 @@ var/global/datum/controller/occupations/job_master else to_chat(C, "No prey were available to accept you.") return + //CHOMPEdit - Item TF spawnpoints! + else if(C.prefs.spawnpoint == "Item TF spawn") + var/list/items = list() + var/list/item_names = list() + var/list/carriers = list() + for(var/obj/item/I in item_tf_spawnpoints) + if(LAZYLEN(I.ckeys_allowed_itemspawn)) + if(!(C.ckey in I.ckeys_allowed_itemspawn)) + continue + var/atom/item_loc = I.loc + var/mob/living/carrier + while(!isturf(item_loc)) + if(isliving(item_loc)) + carrier = item_loc + break + else + item_loc = item_loc.loc + if(istype(carrier)) + if(!(carrier.z in using_map.vorespawn_levels)) + continue + if(carrier.stat == UNCONSCIOUS || carrier.stat == DEAD || carrier.client.is_afk(10 MINUTES)) + continue + carriers += carrier + else + if(!(item_loc.z in using_map.vorespawn_levels)) + continue + carriers += null + + items += I + if(I.name == initial(I.name)) + if(carrier) + item_names += "[carrier]'s [I.name] ([I.loc.name])" + else + item_names += "[I.name] ([I.loc.name])" + else + if(carrier) + item_names += "[carrier]'s [I.name] (\a [initial(I.name)] at [I.loc.name])" + else + item_names += "[I.name] (\a [initial(I.name)] at [I.loc.name])" + if(LAZYLEN(items)) + var/backup = alert(C, "Do you want a mind backup?", "Confirm", "Yes", "No") + if(backup == "Yes") + backup = 1 + var/item_name = input(C, "Choose an Item to spawn as.", "Item TF Spawnpoint") as null|anything in item_names + if(!item_name) + return + var/index = item_names.Find(item_name) + var/obj/item/item = items[index] + + var/mob/living/carrier = carriers[index] + if(istype(carrier)) + to_chat(C, "[carrier] has received your spawn request. Please wait.") + log_and_message_admins("[key_name(C)] has requested to item spawn into [key_name(carrier)]'s possession") + + var/confirm = alert(carrier, "[C.prefs.real_name] is attempting to join as the [item_name] in your possession.", "Confirm", "No", "Yes") + if(confirm != "Yes") + to_chat(C, "[carrier] has declined your spawn request.") + var/message = sanitizeSafe(input(carrier,"Do you want to leave them a message?")as text|null) + if(message) + to_chat(C, "[carrier] message : [message]") + return + if(carrier.stat == UNCONSCIOUS || carrier.stat == DEAD) + to_chat(C, "[carrier] is not conscious.") + to_chat(carrier, "You must be conscious to accept.") + return + if(!(carrier.z in using_map.vorespawn_levels)) + to_chat(C, "[carrier] is no longer in station grounds.") + to_chat(carrier, "You must be within station grounds to accept.") + return + log_and_message_admins("[key_name(C)] has item spawned onto [key_name(carrier)]") + item_to_be = item + if(backup) + addtimer(CALLBACK(src, .proc/m_backup_client, C), 5 SECONDS) + else + var/confirm = alert(C, "\The [item.name] is currently not in any character's possession! Do you still want to spawn as it?", "Confirm", "No", "Yes") + if(confirm != "Yes") + return + log_and_message_admins("[key_name(C)] has item spawned into \a [item.name] that was not held by anyone") + item_to_be = item + if(backup) + addtimer(CALLBACK(src, .proc/m_backup_client, C), 5 SECONDS) + else + to_chat(C, "No items were available to accept you.") + return + //CHOMPEdit End else if(!(C.prefs.spawnpoint in using_map.allowed_spawns)) if(fail_deadly) @@ -793,11 +879,15 @@ var/global/datum/controller/occupations/job_master spawnpos = spawntypes[C.prefs.spawnpoint] //We will return a list key'd by "turf" and "msg" - . = list("turf","msg", "voreny", "prey") + . = list("turf","msg", "voreny", "prey", "itemtf") //CHOMPEdit - Item TF spawnpoints if(vore_spawn_gut) .["voreny"] = vore_spawn_gut if(prey_to_nomph) .["prey"] = prey_to_nomph //We pass this on later to reverse the vorespawn in new_player.dm + //CHOMPEdit Start - Item TF spawnpoints + if(item_to_be) + .["itemtf"] = item_to_be + //CHOMPEdit End if(spawnpos && istype(spawnpos) && spawnpos.turfs.len) if(spawnpos.check_job_spawning(rank)) .["turf"] = spawnpos.get_spawn_position() diff --git a/code/game/objects/items_vr.dm b/code/game/objects/items_vr.dm index 09b7ff7ffd..026e346695 100644 --- a/code/game/objects/items_vr.dm +++ b/code/game/objects/items_vr.dm @@ -25,6 +25,7 @@ listening_objects |= src new_voice.verbs -= /mob/living/voice/verb/change_name //No changing your name! Bad! new_voice.verbs -= /mob/living/voice/verb/hang_up //Also you can't hang up. You are the item! + src.item_tf_spawnpoint_used() //CHOMPEdit - Item TF spawnpoints // Chomp edit /obj/item/proc/muffled_by_belly(var/mob/user) diff --git a/code/modules/client/preference_setup/loadout/gear_tweaks_ch.dm b/code/modules/client/preference_setup/loadout/gear_tweaks_ch.dm new file mode 100644 index 0000000000..a1af401b75 --- /dev/null +++ b/code/modules/client/preference_setup/loadout/gear_tweaks_ch.dm @@ -0,0 +1,38 @@ +var/datum/gear_tweak/item_tf_spawn/gear_tweak_item_tf_spawn = new() + +/datum/gear_tweak/item_tf_spawn + +/datum/gear_tweak/item_tf_spawn/get_contents(var/metadata) + if(metadata["state"] == "Not Enabled") + return "Item TF spawnpoint: Not Enabled" + else if(metadata["state"] == "Anyone") + return "Item TF spawnpoint: Enabled" + else + return "Item TF spawnpoint: Only ckeys [english_list(metadata["valid"], and_text = ", ")]" + +/datum/gear_tweak/item_tf_spawn/get_default() + . = list() + .["state"] = "Not Enabled" + .["valid"] = list() + +/datum/gear_tweak/item_tf_spawn/get_metadata(var/user, var/list/metadata) + . = list() + var/entry = tgui_input_list(user, "Choose an entry.", "Character Preference", list("Not Enabled", "Anyone", "Only Specific Players"), metadata["state"]) + if(entry) + .["state"] = entry + if(entry == "Only Specific Players") + var/ckey_input = tgui_input_text(user, "Input ckeys allowed to join on separate lines", "Allowed Players", jointext(metadata["valid"], "\n"), multiline = TRUE) + .["valid"] = splittext(lowertext(ckey_input), "\n") + else + .["valid"] = metadata["valid"] + else + return metadata + +/datum/gear_tweak/item_tf_spawn/tweak_item(var/obj/item/I, var/metadata) + if(metadata["state"] == "Not Enabled") + return + else if(metadata["state"] == "Anyone") + I.item_tf_spawnpoint_set() + else if(metadata["state"] == "Only Specific Players") + I.item_tf_spawnpoint_set() + I.ckeys_allowed_itemspawn = metadata["valid"] diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm index 48390196fd..5bf688f40e 100644 --- a/code/modules/client/preference_setup/loadout/loadout.dm +++ b/code/modules/client/preference_setup/loadout/loadout.dm @@ -264,7 +264,7 @@ var/list/gear_datums = list() if(!description) var/obj/O = path description = initial(O.desc) - gear_tweaks = list(gear_tweak_free_name, gear_tweak_free_desc) + gear_tweaks = list(gear_tweak_free_name, gear_tweak_free_desc, gear_tweak_item_tf_spawn) //CHOMPEdit - Item TF spawnpoints /datum/gear_data var/path diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index a6b2e872aa..70e9ea7fb8 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -496,7 +496,16 @@ ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn var/gut = join_props["voreny"] var/mob/living/prey = join_props["prey"] - if(prey) + //CHOMPEdit Start - Item TF + var/obj/item/itemtf = join_props["itemtf"] + if(itemtf) + itemtf.inhabit_item(character, itemtf.name, character) + var/mob/living/possessed_voice = itemtf.possessed_voice + itemtf.trash_eatable = character.devourable + itemtf.unacidable = !character.digestable + character.forceMove(possessed_voice) + //CHOMPEdit End + else if(prey) character.copy_from_prefs_vr(1,1) //Yes I know we're reloading these, shut up var/obj/belly/gut_to_enter for(var/obj/belly/B in character.vore_organs) diff --git a/modular_chomp/code/game/objects/items.dm b/modular_chomp/code/game/objects/items.dm new file mode 100644 index 0000000000..76b7249529 --- /dev/null +++ b/modular_chomp/code/game/objects/items.dm @@ -0,0 +1,18 @@ +/obj/item + var/item_tf_spawn_allowed = FALSE + var/list/ckeys_allowed_itemspawn = list() + +/obj/item/proc/item_tf_spawnpoint_set() + if(!item_tf_spawn_allowed) + item_tf_spawn_allowed = TRUE + item_tf_spawnpoints += src + +/obj/item/proc/item_tf_spawnpoint_used() + if(item_tf_spawn_allowed) + item_tf_spawn_allowed = FALSE + item_tf_spawnpoints -= src + +/obj/item/Destroy(force, ...) + if(item_tf_spawn_allowed) + item_tf_spawnpoints -= src + return ..() diff --git a/modular_chomp/code/modules/client/preferences_spawnpoints.dm b/modular_chomp/code/modules/client/preferences_spawnpoints.dm index 818f7df8dc..074c3b5503 100644 --- a/modular_chomp/code/modules/client/preferences_spawnpoints.dm +++ b/modular_chomp/code/modules/client/preferences_spawnpoints.dm @@ -16,6 +16,10 @@ display_name = "Vorespawn - Pred" msg = "has arrived on the station" +/datum/spawnpoint/vore/itemtf + display_name = "Item TF spawn" + msg = "has arrived on the station" + /datum/spawnpoint/vore/New() ..() turfs = latejoin diff --git a/vorestation.dme b/vorestation.dme index f8d5ff9b8a..f5e66f8e3e 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -2014,6 +2014,7 @@ #include "code\modules\client\preference_setup\global\04_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\gear_tweaks_ch.dm" #include "code\modules\client\preference_setup\loadout\gear_tweaks_vr.dm" #include "code\modules\client\preference_setup\loadout\loadout.dm" #include "code\modules\client\preference_setup\loadout\loadout_accessories.dm" @@ -4534,6 +4535,7 @@ #include "modular_chomp\code\game\jobs\job\silicon.dm" #include "modular_chomp\code\game\machinery\airconditioner_ch.dm" #include "modular_chomp\code\game\machinery\autolathe_armory.dm" +#include "modular_chomp\code\game\objects\items.dm" #include "modular_chomp\code\game\objects\items\clockwork\ratvarian_spear.dm" #include "modular_chomp\code\game\objects\structures\desert_planet_structures.dm" #include "modular_chomp\code\game\objects\structures\gargoyle.dm"