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 9f2a5fb028..b02446e750 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2017,6 +2017,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"
@@ -4536,6 +4537,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"