From f8fc337da3a17840d9438f063bf70d2eec112406 Mon Sep 17 00:00:00 2001 From: Reo Lozzot <84661000+ReoDaProtovali@users.noreply.github.com> Date: Thu, 23 Apr 2026 20:22:06 -0500 Subject: [PATCH] Toilet Overhaul (#19370) * April Fool ! there's 30 minutes till midnight in my timezone so it's still valid * Powder that make the maintainer say yes * Apply suggestions from code review Co-authored-by: Cameron Lennox * Edits * Update watercloset.dm * five nights at space station toilet pls merge or else poopwater 2 pr will be next --------- Co-authored-by: Cameron Lennox --- .../components/crafting/recipes/misc.dm | 13 + .../machinery/disposal_connection.dm | 9 +- code/game/objects/effects/chem/water.dm | 48 +- code/game/objects/effects/toilet_output.dm | 7 + code/game/objects/structures/watercloset.dm | 411 +++++++++++++++--- .../game/objects/structures/watercloset_vr.dm | 41 -- maps/groundbase/gb-misc.dmm | 12 +- maps/groundbase/gb-z1.dmm | 16 +- maps/groundbase/gb-z2.dmm | 20 +- maps/groundbase/gb-z3.dmm | 2 +- maps/redgate/fantasy_items.dm | 9 +- maps/stellar_delight/stellar_delight1.dmm | 4 +- maps/tether/submaps/tether_misc.dmm | 12 +- maps/tether/tether-01-surface1.dmm | 18 +- maps/tether/tether-02-surface2.dmm | 12 +- maps/tether/tether-03-surface3.dmm | 10 +- maps/tether/tether-05-station1.dmm | 6 +- vorestation.dme | 3 +- 18 files changed, 459 insertions(+), 194 deletions(-) create mode 100644 code/datums/components/crafting/recipes/misc.dm create mode 100644 code/game/objects/effects/toilet_output.dm delete mode 100644 code/game/objects/structures/watercloset_vr.dm diff --git a/code/datums/components/crafting/recipes/misc.dm b/code/datums/components/crafting/recipes/misc.dm new file mode 100644 index 0000000000..5d70c20f56 --- /dev/null +++ b/code/datums/components/crafting/recipes/misc.dm @@ -0,0 +1,13 @@ +//Craftable toilets in vorecode, 2026 oh yeah woo yeah +/datum/crafting_recipe/toilet + name = "toilet" + result = /obj/structure/toilet + reqs = list( + list(/obj/item/stack/material/steel = 5), + list(/obj/item/reagent_containers/glass/bucket = 1) + ) + time = 3 SECONDS + category = CAT_MISC + +/datum/crafting_recipe/toilet/on_craft_completion(mob/user, atom/result) + result.dir = user.dir //face the toilet where you face. diff --git a/code/datums/components/machinery/disposal_connection.dm b/code/datums/components/machinery/disposal_connection.dm index 08b36f6054..978dce20f9 100644 --- a/code/datums/components/machinery/disposal_connection.dm +++ b/code/datums/components/machinery/disposal_connection.dm @@ -79,14 +79,13 @@ /datum/component/disposal_system_connection/proc/handle_flush(list/flushed_items, datum/gas_mixture/flush_gas) PROTECTED_PROC(TRUE) SHOULD_CALL_PARENT(TRUE) + // if no trunk connected, return false + if(!connected_trunk) + return FALSE + var/obj/structure/disposalholder/packet = new() // virtual holder object which actually travels through the pipes. packet.init(flushed_items, flush_gas) - // if no trunk connected, expel immediately - if(!connected_trunk) - handle_expel(packet) - return TRUE - // start the holder processing movement packet.forceMove(connected_trunk) packet.active = TRUE diff --git a/code/game/objects/effects/chem/water.dm b/code/game/objects/effects/chem/water.dm index ad09ab9439..9212851e9c 100644 --- a/code/game/objects/effects/chem/water.dm +++ b/code/game/objects/effects/chem/water.dm @@ -15,27 +15,35 @@ /obj/effect/effect/water/proc/set_up(var/turf/target, var/step_count = 5, var/delay = 5) if(!target) return - for(var/i = 1 to step_count) - if(!loc) + step_process(target, step_count, delay) + +/obj/effect/effect/water/proc/step_process(var/turf/target, var/step_count, var/delay, var/iteration) + step_count-- + if(!loc) + qdel(src) + return + step_towards(src, target) + var/turf/T = get_turf(src) + if(T && reagents) + reagents.touch_turf(T, reagents.total_volume) //VOREStation Add + var/mob/M + for(var/atom/A in T) + if(!ismob(A) && A.simulated) // Mobs are handled differently + reagents.touch(A, reagents.total_volume) + else if(ismob(A) && !M) + M = A + if(M) + reagents.splash(M, reagents.total_volume) + QDEL_IN(src, 1 SECOND) return - step_towards(src, target) - var/turf/T = get_turf(src) - if(T && reagents) - reagents.touch_turf(T, reagents.total_volume) //VOREStation Add - var/mob/M - for(var/atom/A in T) - if(!ismob(A) && A.simulated) // Mobs are handled differently - reagents.touch(A, reagents.total_volume) - else if(ismob(A) && !M) - M = A - if(M) - reagents.splash(M, reagents.total_volume) - break - if(T == get_turf(target)) - break - sleep(delay) - sleep(10) - qdel(src) + if(T == get_turf(target)) + QDEL_IN(src, 1 SECOND) + return + + if(step_count > 0) + addtimer(CALLBACK(src, PROC_REF(step_process), target, step_count, delay, iteration), delay) + return + QDEL_IN(src, 1 SECOND) /obj/effect/effect/water/Move(turf/newloc) if(newloc.density) diff --git a/code/game/objects/effects/toilet_output.dm b/code/game/objects/effects/toilet_output.dm new file mode 100644 index 0000000000..ea135009ca --- /dev/null +++ b/code/game/objects/effects/toilet_output.dm @@ -0,0 +1,7 @@ +// For some reason, /landmark seems to be near-exclusively used for spawnpoints. Yet it's also being used here as the shit output. +// I smell a refactor/repath in the future, but that time is not now. +/obj/effect/landmark/teleplumb_exit + name = "teleplumbing exit" + +/obj/effect/landmark/teleplumb_exit/Entered(atom/movable/thing, atom/old_loc) + thing.forceMove(get_turf(src)) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index ea7d9f5150..7884e377de 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -14,10 +14,22 @@ icon_state = "toilet" density = FALSE anchored = TRUE - var/open = 0 //if the lid is up - var/cistern = 0 //if the cistern bit is open - var/w_items = 0 //the combined w_class of all the items in the cistern - var/mob/living/swirlie = null //the mob being given a swirlie + var/open = FALSE //if the lid is up + var/cistern = FALSE //if the cistern bit is open + var/w_items = 0 //the combined w_class of all the items in the cistern + + /// Used to both track the crystal needed to upgrade the toilet, and to tell if the toilet is teleplumbed. Set to True in subtypes or mapping if you'd like it to be teleplumbed on init. + var/obj/item/teleplumb_crystal = null + /// Bin used to upgrade this toilet. Turned into a real object on init. + var/obj/item/stock_parts/matter_bin/bin = /obj/item/stock_parts/matter_bin + + //Flushing stuff + var/panic_mult = 1 + var/refilling = FALSE + var/datum/weakref/swirlie_mob = null //the mob being given a swirlie + var/datum/weakref/teleplumb_dest_ref //the destination of this toilet if it's teleplumbed + var/list/currently_held_objects = list() //List of objects currently in the toilet, used for flushing. + COOLDOWN_DECLARE(panic_flush) /obj/structure/toilet/Initialize(mapload) . = ..() @@ -25,7 +37,44 @@ update_icon() AddComponent(/datum/component/hose_connector/endless_drain) // Cannot suck from toilet... for obvious reasons. -/obj/structure/toilet/attack_hand(mob/living/user as mob) + if(ispath(bin)) + bin = new bin(src) + + if(teleplumb_crystal) + teleplumb_crystal = new /obj/item/bluespace_crystal(src) + teleplumb_dest_ref = WEAKREF(locate(/obj/effect/landmark/teleplumb_exit)) + desc = "The BS-500, a bluespace rift-rotation-based waste disposal unit for small matter. This one seems remarkably clean." + + // Non-bluespace plumbing. For POIs and player construction n' stuff. + var/obj/structure/disposalpipe/trunk/trunk = locate() in get_turf(src) + AddComponent(/datum/component/disposal_system_connection, FALSE, FALSE) //Dont show our disposal connection, and we want to handle failed flushes on our own. + RegisterSignal(src, COMSIG_DISPOSAL_RECEIVE, PROC_REF(toilet_reflux)) + if(trunk) + SEND_SIGNAL(src, COMSIG_DISPOSAL_LINK, trunk) + +/obj/structure/toilet/Destroy() + if(bin) + if(bin.type == /obj/item/stock_parts/matter_bin) //Specifically, if this is a basic bin, you dont get it back. Other bins are returned. + QDEL_NULL(bin) + else + bin.forceMove(src.loc) + bin = null + if(teleplumb_crystal) + teleplumb_crystal.forceMove(src.loc) + teleplumb_crystal = null + for(var/atom/movable/AM in currently_held_objects) + AM.forceMove(src.loc) + currently_held_objects = null + swirlie_mob = null + teleplumb_dest_ref = null + . = ..() + + +/obj/structure/toilet/update_icon() + icon_state = "[initial(icon_state)][open][cistern]" + +/obj/structure/toilet/attack_hand(mob/living/user) + var/mob/living/swirlie = swirlie_mob?.resolve() if(swirlie) user.setClickCooldown(user.get_attack_speed()) user.visible_message(span_danger("[user] slams the toilet seat onto [swirlie.name]'s head!"), span_notice("You slam the toilet seat onto [swirlie.name]'s head!"), "You hear reverberating porcelain.") @@ -33,26 +82,45 @@ return if(cistern && !open) - if(!contents.len) + var/list/cistern_loot = list() + for(var/atom/movable/AM in contents) + if(AM == bin || AM == teleplumb_crystal) + continue + cistern_loot += AM + + if(!length(cistern_loot)) + //You can take the bluespace crystal out if there's nothing else in the cistern. + if(teleplumb_crystal && ishuman(user)) //Only humans can grief the toilets + if(tgui_alert(user, "You see a glimmering crystal attached to parts of the toilet's components... Do you want to take it?", "Toilet Crystal", list("Take it!", "Leave it.")) == "Take it!") + user.put_in_hands(teleplumb_crystal) + to_chat(user, span_notice("You take \the [teleplumb_crystal].")) + teleplumb_crystal = null + teleplumb_dest_ref = null + desc = initial(desc) + else + to_chat(user, span_notice("You decide to leave it.")) to_chat(user, span_notice("The cistern is empty.")) return + var/obj/item/I = pick(cistern_loot) + if(ishuman(user)) + user.put_in_hands(I) else - var/obj/item/I = pick(contents) - if(ishuman(user)) - user.put_in_hands(I) - else - I.loc = get_turf(src) - to_chat(user, span_notice("You find \an [I] in the cistern.")) - w_items -= I.w_class - return + I.loc = get_turf(src) + to_chat(user, span_notice("You find \an [I] in the cistern.")) + w_items -= I.w_class + return open = !open update_icon() -/obj/structure/toilet/update_icon() - icon_state = "[initial(icon_state)][open][cistern]" +/obj/structure/toilet/attack_ai(mob/user) + if(isrobot(user)) + if(user.client && !user.is_remote_viewing()) + return attack_hand(user) + else + return attack_hand(user) -/obj/structure/toilet/attackby(obj/item/I as obj, mob/living/user as mob) +/obj/structure/toilet/attackby(obj/item/I, mob/living/user) if(I.has_tool_quality(TOOL_CROWBAR)) to_chat(user, span_notice("You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"].")) playsound(src, 'sound/effects/stonedoor_openclose.ogg', 50, 1) @@ -62,6 +130,16 @@ update_icon() return + if(I.has_tool_quality(TOOL_WRENCH) && cistern) //Kill Toilet. + if(refilling) + to_chat(user, span_notice("Wait for \the [src] to finish refilling...")) + to_chat(user, span_notice("You begin to dismantle \the [src]...")) + if(!do_after(user, 5 SECONDS, src)) + return + to_chat(user, span_notice("You dismantle \the [src].")) + deconstruct() + return + if(istype(I, /obj/item/grab)) user.setClickCooldown(user.get_attack_speed(I)) var/obj/item/grab/G = I @@ -69,69 +147,268 @@ if(isliving(G.affecting)) var/mob/living/GM = G.affecting - if(G.state>1) - if(!GM.loc == get_turf(src)) - to_chat(user, span_notice("[GM.name] needs to be on the toilet.")) - return - if(open && !swirlie) - user.visible_message(span_danger("[user] starts to give [GM.name] a swirlie!"), span_notice("You start to give [GM.name] a swirlie!")) - swirlie = GM - if(do_after(user, 3 SECONDS, target = GM)) - user.visible_message(span_danger("[user] gives [GM.name] a swirlie!"), span_notice("You give [GM.name] a swirlie!"), "You hear a toilet flushing.") + if(G.state <= GRAB_PASSIVE) + to_chat(user, span_notice("You need a tighter grip.")) + return + if(!GM.loc == get_turf(src)) + to_chat(user, span_notice("[GM.name] needs to be on the toilet.")) + return + var/mob/living/swirlie = swirlie_mob?.resolve() + if(open && !swirlie) + user.visible_message(span_danger("[user] starts to give [GM] a swirlie!"), span_notice("You start to give [GM] a swirlie!")) + swirlie_mob = WEAKREF(GM) + if(do_after(user, 3 SECONDS, target = GM)) + if(!open) //Someone closed it while we were trying to swirlie. Rude. + open = TRUE //Open it. + update_icon() + if(!refilling) + user.visible_message(span_danger("[user] gives [GM] a swirlie!"), span_notice("You give [GM] a swirlie!"), "You hear a toilet flushing.") if(!GM.internal) GM.adjustOxyLoss(5) - swirlie = null - else - user.visible_message(span_danger("[user] slams [GM.name] into the [src]!"), span_notice("You slam [GM.name] into the [src]!")) - GM.adjustBruteLoss(5) + if(GM.size_multiplier <= 0.75) + GM.visible_message(span_danger("[GM] gets sucked into \the [src] due to their small size!"), span_userdanger("You get sucked into \the [src]!")) + GM.forceMove(get_turf(src)) + GM.Weaken(5) + flush() + else + user.visible_message(span_warning("[user] tries to give [GM.name] a swirlie, but the toilet was still refilling!"), span_warning("You cant give [GM] swirlie while \the [src] is still refilling!")) + swirlie_mob = null else - to_chat(user, span_notice("You need a tighter grip.")) + user.visible_message(span_danger("[user] slams [GM] into the [src]!"), span_notice("You slam [GM] into the [src]!")) + GM.adjustBruteLoss(5) + + if(cistern && !teleplumb_crystal && istype(I, /obj/item/bluespace_crystal)) + to_chat(user, span_notice("You begin to insert \the [I] into \the [src]...")) + if(!do_after(user, 2 SECONDS, src)) + return + to_chat(user, span_notice("You insert \the [I] into \the [src]. A deep rumble eminates from within it, and a faint blue glow eminates from the bottom of the bowl for a moment.")) + user.drop_item() + I.forceMove(src) + teleplumb_crystal = I + //TODO: add a way to link this to custom destinations. + teleplumb_dest_ref = WEAKREF(locate(/obj/effect/landmark/teleplumb_exit)) + desc = "The BS-500, a bluespace rift-rotation-based waste disposal unit for small matter. This one seems remarkably clean." + return + + if(cistern && istype(I, /obj/item/stock_parts/matter_bin)) + to_chat(user, span_notice("You begin to replace \the [bin] in \the [src] with \the [I].")) + if(!do_after(user, 2 SECONDS, src)) + return + to_chat(user, span_notice("You replace \the [bin] with \the [I].")) + bin.forceMove(src.loc) //Remove the old bin. + user.drop_item() + I.forceMove(src) + bin = I //Set the internally stored bin to the new bin. + return if(cistern && !istype(user,/mob/living/silicon/robot)) //STOP PUTTING YOUR MODULES IN THE TOILET. if(I.w_class > ITEMSIZE_NORMAL) //3 to_chat(user, span_notice("\The [I] does not fit.")) return - if(w_items + I.w_class > ITEMSIZE_HUGE) //5 + if(w_items + I.w_class > ITEMSIZE_COST_TINY * 5) // 5 tiny or 2 small and 1 tiny to_chat(user, span_notice("The cistern is full.")) return user.drop_item() - I.loc = src + I.forceMove(src) w_items += I.w_class to_chat(user, "You carefully place \the [I] into the cistern.") return -/obj/structure/toilet/prison - name = "prison toilet" - icon_state = "toilet2" +/obj/structure/toilet/click_alt(mob/user) + if(!isliving(user) || get_dist(user, src) > 1 || user.loc == src ) + return + if(user.stat) //replace with user.canUseTopic() in the future + return CLICK_ACTION_BLOCKING + if(!open) + to_chat(user, span_notice("You need to open the lid before flushing \the [src].")) + return CLICK_ACTION_BLOCKING + if(refilling) + to_chat(user, span_notice("The toilet is still refilling its tank.")) + playsound(src, 'sound/machines/door_locked.ogg', 30, 1) + //Even while it's flushing, you can repeatedly pull down the lever for a bigger flush. + if(user.a_intent == I_HURT) + if(COOLDOWN_FINISHED(src, panic_flush)) + panic_mult++ + COOLDOWN_START(src, panic_flush, 1 SECOND) //Let's not encourage hitting the click-cap. + user.visible_message(span_notice("[user] pulls the flush lever mid-flush!"), span_notice("You full the flush lever mid-flush!"), "you hear the sound of a toilet handle being jiggled.") + return CLICK_ACTION_BLOCKING + to_chat(user, span_notice("You need to wait [round((COOLDOWN_TIMELEFT(src, panic_flush)) / 10, 0.1)] more seconds longer before you can pull the flush lever again!")) + return CLICK_ACTION_BLOCKING + //Flush succeeds + user.visible_message(span_notice("[user] flushes the toilet."), span_notice("You flush the toilet."), "you hear a toilet flushing.") + flush() + return CLICK_ACTION_SUCCESS -/obj/structure/toilet/prison/attack_hand(mob/living/user) +/obj/structure/toilet/proc/flush() + refilling = TRUE + playsound(src, 'sound/vore/death7.ogg', 50, 1) //Got lazy about getting new sound files. Have a sick remix lmao. + playsound(src, 'sound/effects/bubbles.ogg', 50, 1) + playsound(src, 'sound/mecha/powerup.ogg', 30, 1) + + var/list/bowl_contents = list() + for(var/obj/item/I in loc.contents) + if(istype(I) && !I.anchored) + bowl_contents += I + for(var/mob/living/L in loc.contents) + if(L.buckled || !(L.resting || L.lying)) + continue + var/bin_bonus = 0.15 + if(bin) + bin_bonus *= bin.rating + if(L.size_multiplier <= 0.6 + bin_bonus) + bowl_contents += L + + if(!length(bowl_contents)) //Reduced recharge if nothing is being flushed + VARSET_IN(src, refilling, FALSE, 7.5 SECONDS) + VARSET_IN(src, panic_mult, initial(panic_mult), 7.5 SECONDS) + return + + begin_flush(bowl_contents[1], bowl_contents) return -/obj/structure/toilet/prison/attackby(obj/item/I, mob/living/user) - if(istype(I, /obj/item/grab)) - user.setClickCooldown(user.get_attack_speed(I)) - var/obj/item/grab/G = I +///Timer proc that takes the object given and begins the flush process. Makes the object spin. +/obj/structure/toilet/proc/begin_flush(atom/movable/flushed, list/pick_list) + flushed.SpinAnimation(5,3) + addtimer(CALLBACK(src, PROC_REF(secondary_flush), flushed, pick_list), 0.2 SECONDS) - if(isliving(G.affecting)) - var/mob/living/GM = G.affecting +///Timer proc that takes the object given and removes it from the list, beginning to spin the next object if there is one. +/obj/structure/toilet/proc/secondary_flush(atom/movable/flushed, list/pick_list) + pick_list -= flushed - if(G.state>1) - if(!GM.loc == get_turf(src)) - to_chat(user, span_notice("[GM.name] needs to be on the toilet.")) - return - if(open && !swirlie) - user.visible_message(span_danger("[user] starts to give [GM.name] a swirlie!"), span_notice("You start to give [GM.name] a swirlie!")) - swirlie = GM - if(do_after(user, 3 SECONDS, target = GM)) - user.visible_message(span_danger("[user] gives [GM.name] a swirlie!"), span_notice("You give [GM.name] a swirlie!"), "You hear a toilet flushing.") - if(!GM.internal) - GM.adjustOxyLoss(5) - swirlie = null - else - user.visible_message(span_danger("[user] slams [GM.name] into the [src]!"), span_notice("You slam [GM.name] into the [src]!")) - GM.adjustBruteLoss(5) - else - to_chat(user, span_notice("You need a tighter grip.")) + if(!length(pick_list)) //All flushed. + addtimer(CALLBACK(src, PROC_REF(tertiary_flush), flushed, TRUE), 1.5 SECONDS, TIMER_DELETE_ME) + return + addtimer(CALLBACK(src, PROC_REF(tertiary_flush), flushed, FALSE), 1.5 SECONDS, TIMER_DELETE_ME) //Put the object in the bin. + + var/obj_to_be_flushed = pick_list[1] + addtimer(CALLBACK(src, PROC_REF(begin_flush), obj_to_be_flushed, pick_list), 0.2 SECONDS, TIMER_DELETE_ME) + +///Adds the object to the toilet's current_flush list. +/obj/structure/toilet/proc/tertiary_flush(atom/movable/flushed, flush_completed) + if(flushed.loc == loc) + flushed.forceMove(src) + currently_held_objects += flushed + + if(flush_completed) //Flushed it all. + addtimer(CALLBACK(src, PROC_REF(flush_send), currently_held_objects), 1 SECOND, TIMER_DELETE_ME) + VARSET_IN(src, refilling, FALSE, 20 SECONDS) + return + +/obj/structure/toilet/proc/flush_send(list/to_send) + var/flush_weight = 0 + var/max_flush_weight = get_flush_power() + var/list/taken_contents = list() + for(var/atom/movable/flushed in to_send) + if(flushed.loc != src) + continue + + //Mobs and items are calculated differently + var/weight_value = 0 + if(isitem(flushed)) + var/obj/item/I = flushed + weight_value = I.w_class + if(isliving(flushed)) + var/mob/living/L = flushed + weight_value = L.size_multiplier * 10 + + if(flush_weight + weight_value <= max_flush_weight) + taken_contents += flushed + flush_weight += weight_value + var/atom/teleplumb_dest = teleplumb_dest_ref?.resolve() + if(teleplumb_crystal && teleplumb_dest) + if(isliving(flushed)) + var/mob/living/m = flushed + to_chat(m, span_danger("You're glunked down by \the [src] through a series of extradimensional bluespace pipeworks!")) + flushed.forceMove(teleplumb_dest) + + var/datum/gas_mixture/air_contents = new(1) //1 liter of nothing, ig. + if(SEND_SIGNAL(src, COMSIG_DISPOSAL_FLUSH, to_send, air_contents)) + for(var/atom/movable/flushed in to_send) + if(isliving(flushed)) + var/mob/living/m = flushed + to_chat(m, span_warning("You're flushed away by \the [src]!")) + + var/flush_failed = FALSE + for(var/atom/movable/flushed in to_send) + if(flushed.loc != src) //Not in here, flushed or otherwise. + continue + flush_failed = TRUE + flushed.forceMove(src.loc) + if(flush_failed) + visible_message(span_warning("\The [src] glurks and splutters, unable to guzzle more stuff down in a single flush!"), span_warning("Glornch")) + panic_mult = initial(panic_mult) + currently_held_objects = list() //Clear the list. + +/obj/structure/toilet/proc/toilet_reflux(datum/source, list/received_items, datum/gas_mixture/gas) + SIGNAL_HANDLER + var/turf/T = get_turf(src) + T.assume_air(gas) + + if(!length(received_items)) + visible_message(span_warning("The water in \the [src] gurgles and bubbles ominously..."), span_notice("You hear a wet gurgling and spluttering..."), runemessage = "glurgles") + return + visible_message(span_danger("\The [src] gurgles for a moment, before spewing forth a bunch of stuff in a wave of toilet water!"), "GLORGLONCH!") + for(var/atom/movable/AM in received_items) + var/turf/target_turf = get_offset_target_turf(loc, rand(-2, 2), rand(-2, 2)) + + AM.forceMove(T) + AM.pipe_eject(0) + AM.throw_at(target_turf, 5, 1) + + //Toilet blast ! + for(var/direction in GLOB.alldirs + null) // null is for the center tile. + if(prob(75) && direction != null) //Only sometimes wet blast, except the center tile. That always wets. + continue + var/turf/target_turf = get_ranged_target_turf(src, direction, rand(1, 2)) + if(!target_turf) // This shouldn't fail but... + continue + var/obj/effect/effect/water/W = new(get_turf(T)) + W.create_reagents(15) + W.reagents.add_reagent(REAGENT_ID_WATER, 15) + W.set_color() + W.set_up(target_turf) + +/obj/structure/toilet/atom_deconstruct(disassembled) + place_deconstruction_materials() + for(var/atom/movable/AM in contents) //Should handle both cistern and upgrade parts. + AM.forceMove(src.loc) + +/obj/structure/toilet/proc/place_deconstruction_materials() + new /obj/item/stack/material/steel(src.loc, 5) + new /obj/item/reagent_containers/glass/bucket(src.loc) + +/obj/structure/toilet/proc/get_flush_power() + . = ITEMSIZE_COST_SMALL * 3 // 3 small items, or 6 tiny items. + if(bin) + . *= bin.rating + . *= panic_mult + if(teleplumb_crystal) //Teleplumbed gets applied at the end + . *= 2 + +/obj/structure/toilet/teleplumbed + teleplumb_crystal = TRUE + +/obj/structure/toilet/prison + name = "prison toilet" + desc = "The HT-421, a torque rotation based waste disposal unit for small matter. This older model isnt quite as capable as newer units." + icon_state = "toilet2" + +/obj/structure/toilet/prison/place_deconstruction_materials() + new /obj/item/stack/material/iron(src.loc, 5) + new /obj/item/reagent_containers/glass/bucket(src.loc) + +/obj/structure/toilet/prison/get_flush_power() + . = ..() + if(teleplumb_crystal) //No teleplumb bonus. + . /= 2 + return round(. / 3) //Has a 1/3 the power of a normal toilet. + +/obj/structure/toilet/prison/flush_send(list/to_send) //Permabrig escape prevention + for(var/mob/living/escapee in to_send) + to_chat(escapee, span_warning("A grate at the bottom of \the [src] prevents you from being flushed away!")) //Kinda gross, come to think of it. + escapee.forceMove(src.loc) + to_send -= escapee + . = ..() /obj/structure/urinal name = "urinal" @@ -141,7 +418,7 @@ density = FALSE anchored = TRUE -/obj/structure/urinal/attackby(obj/item/I as obj, mob/user as mob) +/obj/structure/urinal/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/grab)) var/obj/item/grab/G = I if(isliving(G.affecting)) @@ -185,7 +462,7 @@ //add heat controls? when emagged, you can freeze to death in it? -/obj/machinery/shower/attack_hand(mob/M as mob) +/obj/machinery/shower/attack_hand(mob/M) on = !on update_icon() handle_mist() @@ -197,7 +474,7 @@ else soundloop.stop() -/obj/machinery/shower/attackby(obj/item/I as obj, mob/user as mob) +/obj/machinery/shower/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/analyzer)) //Lol? Why... to_chat(user, span_notice("The water temperature seems to be [current_temperature].")) @@ -646,7 +923,7 @@ thing.reagents.clear_reagents() thing.update_icon() -/obj/structure/sink/attack_hand(mob/user as mob) +/obj/structure/sink/attack_hand(mob/user) if(ishuman(user)) var/mob/living/carbon/human/H = user var/obj/item/organ/external/temp = H.organs_by_name[BP_R_HAND] @@ -697,7 +974,7 @@ for(var/mob/V in viewers(src, null)) V.show_message(span_notice("[user] washes their hands using \the [src].")) -/obj/structure/sink/attackby(obj/item/O as obj, mob/user as mob) +/obj/structure/sink/attackby(obj/item/O, mob/user) if(busy) to_chat(user, span_warning("Someone's already washing here.")) return @@ -772,12 +1049,12 @@ icon_state = "puddle" desc = "A small pool of some liquid, ostensibly water." -/obj/structure/sink/puddle/attack_hand(mob/M as mob) +/obj/structure/sink/puddle/attack_hand(mob/M) icon_state = "puddle-splash" ..() icon_state = "puddle" -/obj/structure/sink/puddle/attackby(obj/item/O as obj, mob/user as mob) +/obj/structure/sink/puddle/attackby(obj/item/O, mob/user) icon_state = "puddle-splash" ..() icon_state = "puddle" diff --git a/code/game/objects/structures/watercloset_vr.dm b/code/game/objects/structures/watercloset_vr.dm deleted file mode 100644 index 5338274246..0000000000 --- a/code/game/objects/structures/watercloset_vr.dm +++ /dev/null @@ -1,41 +0,0 @@ -//Flushable toilets on station levels. Flushing sends stuff directly to a trashpit landmark without stinking up the cargo office. -//Only on-station toilets are affected and only if the trashpit landmark also exists. Otherwise toilets will stay normal. - -/obj/structure/toilet - var/teleplumbed = FALSE - var/exit_landmark - -/obj/structure/toilet/Initialize(mapload) - if(z in using_map.map_levels) - teleplumbed = TRUE - exit_landmark = locate(/obj/effect/landmark/teleplumb_exit) - if(teleplumbed && exit_landmark) - desc = "The BS-500, a bluespace rift-rotation-based waste disposal unit for small matter. This one seems remarkably clean." - return ..() - -/obj/structure/toilet/attack_hand(mob/living/user as mob) - if(open && teleplumbed && exit_landmark) - var/list/bowl_contents = list() - for(var/obj/item/I in loc.contents) - if(istype(I) && !I.anchored) - bowl_contents += I - if(bowl_contents.len) - user.visible_message(span_notice("[user] flushes the toilet."), span_notice("You flush the toilet.")) - playsound(src, 'sound/vore/death7.ogg', 50, 1) //Got lazy about getting new sound files. Have a sick remix lmao. - playsound(src, 'sound/effects/bubbles.ogg', 50, 1) - playsound(src, 'sound/mecha/powerup.ogg', 30, 1) - for(var/obj/item/F in bowl_contents) - F.forceMove(get_turf(exit_landmark)) - bowl_contents -= F - return - return ..() - -/obj/structure/toilet/attack_ai(mob/user as mob) - if(isrobot(user)) - if(user.client && !user.is_remote_viewing()) - return attack_hand(user) - else - return attack_hand(user) - -/obj/effect/landmark/teleplumb_exit - name = "teleplumbing exit" diff --git a/maps/groundbase/gb-misc.dmm b/maps/groundbase/gb-misc.dmm index e4be2af24c..c1a84308ab 100644 --- a/maps/groundbase/gb-misc.dmm +++ b/maps/groundbase/gb-misc.dmm @@ -472,7 +472,7 @@ /turf/simulated/shuttle/floor/alienplating, /area/unknown/dorm1) "bz" = ( -/obj/structure/toilet, +/obj/structure/toilet/teleplumbed, /turf/simulated/shuttle/floor/alienplating, /area/unknown/dorm1) "bA" = ( @@ -597,7 +597,7 @@ /turf/simulated/shuttle/floor/alienplating, /area/unknown/dorm2) "bR" = ( -/obj/structure/toilet, +/obj/structure/toilet/teleplumbed, /turf/simulated/shuttle/floor/alienplating, /area/unknown/dorm2) "bS" = ( @@ -710,7 +710,7 @@ /turf/simulated/shuttle/floor/alienplating, /area/unknown/dorm3) "cg" = ( -/obj/structure/toilet, +/obj/structure/toilet/teleplumbed, /turf/simulated/shuttle/floor/alienplating, /area/unknown/dorm3) "ch" = ( @@ -1768,7 +1768,7 @@ /turf/simulated/shuttle/floor/alienplating, /area/unknown/dorm4) "fx" = ( -/obj/structure/toilet, +/obj/structure/toilet/teleplumbed, /turf/simulated/shuttle/floor/alienplating, /area/unknown/dorm4) "fy" = ( @@ -1813,7 +1813,7 @@ /turf/simulated/shuttle/floor/alienplating, /area/unknown/dorm5) "fF" = ( -/obj/structure/toilet, +/obj/structure/toilet/teleplumbed, /turf/simulated/shuttle/floor/alienplating, /area/unknown/dorm5) "fG" = ( @@ -2071,7 +2071,7 @@ }, /area/beach) "gv" = ( -/obj/structure/toilet, +/obj/structure/toilet/teleplumbed, /turf/simulated/shuttle/floor/alienplating, /area/unknown/dorm6) "gw" = ( diff --git a/maps/groundbase/gb-z1.dmm b/maps/groundbase/gb-z1.dmm index b96b00b6b7..fab19e3fe5 100644 --- a/maps/groundbase/gb-z1.dmm +++ b/maps/groundbase/gb-z1.dmm @@ -2396,7 +2396,7 @@ }, /area/groundbase/command/tcomms/chamber) "fj" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 8 }, /obj/machinery/light/small, @@ -2978,7 +2978,7 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 8 }, /turf/simulated/floor/tiled/white, @@ -7062,7 +7062,7 @@ /turf/simulated/floor/tiled/dark, /area/groundbase/security/halle) "po" = ( -/obj/structure/toilet, +/obj/structure/toilet/teleplumbed, /obj/machinery/button/remote/airlock{ dir = 4; id = "z1stall3"; @@ -8347,7 +8347,7 @@ /turf/simulated/floor/carpet/turcarpet, /area/groundbase/civilian/gameroom) "sr" = ( -/obj/structure/toilet, +/obj/structure/toilet/teleplumbed, /obj/machinery/button/remote/airlock{ dir = 4; id = "z1stall1"; @@ -14217,7 +14217,7 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 8 }, /turf/simulated/floor/tiled/white, @@ -17154,7 +17154,7 @@ /turf/simulated/floor/tiled/dark, /area/groundbase/medical/autoresleeving) "Mv" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 8 }, /obj/machinery/light/small, @@ -18959,7 +18959,7 @@ /turf/simulated/floor/wood, /area/groundbase/civilian/cafe) "QV" = ( -/obj/structure/toilet, +/obj/structure/toilet/teleplumbed, /obj/machinery/button/remote/airlock{ dir = 4; id = "z1stall2"; @@ -20692,7 +20692,7 @@ /turf/simulated/floor/carpet/gaycarpet, /area/groundbase/civilian/clown) "UO" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 8 }, /obj/machinery/light/small, diff --git a/maps/groundbase/gb-z2.dmm b/maps/groundbase/gb-z2.dmm index dec1af449e..7772a92c24 100644 --- a/maps/groundbase/gb-z2.dmm +++ b/maps/groundbase/gb-z2.dmm @@ -2874,7 +2874,7 @@ /turf/simulated/floor/tiled/eris/cafe, /area/groundbase/civilian/kitchen) "hv" = ( -/obj/structure/toilet, +/obj/structure/toilet/teleplumbed, /obj/machinery/button/remote/airlock{ id = "toilet1"; pixel_x = -26; @@ -4801,7 +4801,7 @@ /turf/simulated/floor/tiled, /area/groundbase/science/robotics) "mI" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 8 }, /obj/machinery/light, @@ -5235,7 +5235,7 @@ /turf/simulated/floor/wood, /area/groundbase/medical/psych) "oj" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 8 }, /obj/machinery/light, @@ -7696,7 +7696,7 @@ /area/groundbase/science/xenohall) "vi" = ( /obj/machinery/light, -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 4 }, /turf/simulated/floor/tiled/white, @@ -8075,7 +8075,7 @@ /area/groundbase/medical/lobby) "wk" = ( /obj/machinery/light, -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 4 }, /turf/simulated/floor/tiled/white, @@ -8865,7 +8865,7 @@ /turf/simulated/floor/wood, /area/groundbase/dorms/room1) "yC" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 8 }, /obj/machinery/light, @@ -11075,7 +11075,7 @@ /turf/simulated/floor/outdoors/sidewalk/slab, /area/groundbase/level2/nw) "EU" = ( -/obj/structure/toilet, +/obj/structure/toilet/teleplumbed, /obj/machinery/button/remote/airlock{ id = "toilet2"; pixel_x = -26; @@ -11228,7 +11228,7 @@ /area/groundbase/command/hop) "Fr" = ( /obj/machinery/light, -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 4 }, /turf/simulated/floor/tiled/white, @@ -14632,7 +14632,7 @@ /area/groundbase/civilian/hydroponics) "OB" = ( /obj/machinery/light, -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 4 }, /turf/simulated/floor/tiled/white, @@ -17179,7 +17179,7 @@ /turf/simulated/floor/carpet, /area/groundbase/civilian/chapel) "VT" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 8 }, /obj/machinery/light, diff --git a/maps/groundbase/gb-z3.dmm b/maps/groundbase/gb-z3.dmm index c4eda33aca..a28bc77b9f 100644 --- a/maps/groundbase/gb-z3.dmm +++ b/maps/groundbase/gb-z3.dmm @@ -3267,7 +3267,7 @@ /turf/simulated/floor/tiled/white, /area/groundbase/medical/paramedic) "Yz" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 8 }, /turf/simulated/floor/tiled/white, diff --git a/maps/redgate/fantasy_items.dm b/maps/redgate/fantasy_items.dm index 75dc65c22f..733a496f39 100644 --- a/maps/redgate/fantasy_items.dm +++ b/maps/redgate/fantasy_items.dm @@ -137,10 +137,10 @@ icon_state = "toilet3" open = 1 -/obj/structure/toilet/wooden/attack_hand(mob/living/user as mob) +/obj/structure/toilet/wooden/attack_hand(mob/living/user) return //No lid -/obj/structure/toilet/wooden/attackby(obj/item/I as obj, mob/living/user as mob) //simpler interactions +/obj/structure/toilet/wooden/attackby(obj/item/I, mob/living/user) //simpler interactions if(istype(I, /obj/item/grab)) user.setClickCooldown(user.get_attack_speed(I)) var/obj/item/grab/G = I @@ -152,14 +152,15 @@ if(!GM.loc == get_turf(src)) to_chat(user, span_notice("[GM.name] needs to be on the toilet.")) return + var/mob/living/swirlie = swirlie_mob?.resolve() if(open && !swirlie) user.visible_message(span_danger("[user] starts to give [GM.name] a swirlie!"), span_notice("You start to give [GM.name] a swirlie!")) - swirlie = GM + swirlie_mob = WEAKREF(GM) if(do_after(user, 3 SECONDS, target = GM)) user.visible_message(span_danger("[user] gives [GM.name] a swirlie!"), span_notice("You give [GM.name] a swirlie!"), "You hear a toilet flushing.") if(!GM.internal) GM.adjustOxyLoss(5) - swirlie = null + swirlie_mob = null else user.visible_message(span_danger("[user] slams [GM.name] into the [src]!"), span_notice("You slam [GM.name] into the [src]!")) GM.adjustBruteLoss(5) diff --git a/maps/stellar_delight/stellar_delight1.dmm b/maps/stellar_delight/stellar_delight1.dmm index 9463ac200d..c9cfa3ad44 100644 --- a/maps/stellar_delight/stellar_delight1.dmm +++ b/maps/stellar_delight/stellar_delight1.dmm @@ -10379,7 +10379,7 @@ /turf/simulated/floor/tiled/dark, /area/security/security_equiptment_storage) "vd" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 4 }, /obj/machinery/alarm/angled{ @@ -17283,7 +17283,7 @@ /turf/simulated/floor/tiled/steel_ridged, /area/stellardelight/deck1/dorms/dorm6) "Ki" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 4 }, /obj/machinery/alarm/angled{ diff --git a/maps/tether/submaps/tether_misc.dmm b/maps/tether/submaps/tether_misc.dmm index b99187f567..9d54050109 100644 --- a/maps/tether/submaps/tether_misc.dmm +++ b/maps/tether/submaps/tether_misc.dmm @@ -811,7 +811,7 @@ /turf/simulated/shuttle/floor/alienplating, /area/unknown/dorm5) "cH" = ( -/obj/structure/toilet, +/obj/structure/toilet/teleplumbed, /turf/simulated/shuttle/floor/alienplating, /area/unknown/dorm5) "cI" = ( @@ -832,7 +832,7 @@ /turf/simulated/shuttle/floor/alienplating, /area/unknown/dorm6) "cL" = ( -/obj/structure/toilet, +/obj/structure/toilet/teleplumbed, /turf/simulated/shuttle/floor/alienplating, /area/unknown/dorm6) "cM" = ( @@ -3030,7 +3030,7 @@ /turf/simulated/shuttle/floor/alienplating, /area/unknown/dorm4) "Sq" = ( -/obj/structure/toilet, +/obj/structure/toilet/teleplumbed, /turf/simulated/shuttle/floor/alienplating, /area/unknown/dorm4) "Sr" = ( @@ -3166,7 +3166,7 @@ /turf/simulated/shuttle/floor/alienplating, /area/unknown/dorm3) "Tb" = ( -/obj/structure/toilet, +/obj/structure/toilet/teleplumbed, /turf/simulated/shuttle/floor/alienplating, /area/unknown/dorm3) "Tc" = ( @@ -3309,7 +3309,7 @@ /turf/simulated/shuttle/floor/alienplating, /area/unknown/dorm2) "TQ" = ( -/obj/structure/toilet, +/obj/structure/toilet/teleplumbed, /turf/simulated/shuttle/floor/alienplating, /area/unknown/dorm2) "TR" = ( @@ -3440,7 +3440,7 @@ /turf/simulated/shuttle/floor/alienplating, /area/unknown/dorm1) "UC" = ( -/obj/structure/toilet, +/obj/structure/toilet/teleplumbed, /turf/simulated/shuttle/floor/alienplating, /area/unknown/dorm1) "UD" = ( diff --git a/maps/tether/tether-01-surface1.dmm b/maps/tether/tether-01-surface1.dmm index f697ea82b5..dc03ce1a24 100644 --- a/maps/tether/tether-01-surface1.dmm +++ b/maps/tether/tether-01-surface1.dmm @@ -11965,7 +11965,7 @@ /turf/simulated/floor/tiled/techmaint, /area/rnd/external) "auX" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 1 }, /obj/machinery/light/small{ @@ -19636,7 +19636,7 @@ /area/tether/surfacebase/cargostore) "aHB" = ( /obj/effect/floor_decal/rust, -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ pixel_y = 10 }, /turf/simulated/floor/tiled/white, @@ -19782,7 +19782,7 @@ /turf/simulated/floor/tiled, /area/rnd/hallway) "aHO" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ pixel_y = 10 }, /turf/simulated/floor/plating, @@ -22060,7 +22060,7 @@ /turf/simulated/floor/tiled/white, /area/crew_quarters/sleep/Dorm_8) "aLX" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ pixel_y = 10 }, /obj/machinery/alarm{ @@ -23338,7 +23338,7 @@ /turf/simulated/floor/tiled/white, /area/crew_quarters/sleep/Dorm_6) "aOv" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ pixel_y = 10 }, /obj/machinery/alarm{ @@ -24433,7 +24433,7 @@ /turf/simulated/floor/tiled/white, /area/crew_quarters/sleep/Dorm_4) "aQn" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ pixel_y = 10 }, /obj/machinery/alarm{ @@ -25545,7 +25545,7 @@ /turf/simulated/floor/tiled/white, /area/crew_quarters/sleep/Dorm_2) "aSv" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ pixel_y = 10 }, /obj/machinery/alarm{ @@ -28569,7 +28569,7 @@ /turf/simulated/floor/tiled/white, /area/vacant/vacant_bar) "aYs" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ pixel_y = 10 }, /turf/simulated/floor/tiled/white, @@ -28661,7 +28661,7 @@ /turf/simulated/floor/tiled, /area/rnd/hardstorage) "aYE" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ pixel_y = 10 }, /turf/simulated/floor/plating, diff --git a/maps/tether/tether-02-surface2.dmm b/maps/tether/tether-02-surface2.dmm index cd61c83b5a..5b49b923d3 100644 --- a/maps/tether/tether-02-surface2.dmm +++ b/maps/tether/tether-02-surface2.dmm @@ -5443,7 +5443,7 @@ /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/centralhall) "aiI" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 8 }, /obj/machinery/light/small{ @@ -6662,7 +6662,7 @@ /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/uppersouthstairwell) "akH" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 8 }, /obj/machinery/light/small{ @@ -7453,7 +7453,7 @@ /turf/simulated/floor/tiled/white, /area/tether/surfacebase/medical/bathroom) "alT" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 8 }, /obj/machinery/light/small{ @@ -24116,7 +24116,7 @@ /turf/simulated/floor/plating, /area/maintenance/engineering/pumpstation) "aSj" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 8 }, /obj/machinery/light/small{ @@ -24199,7 +24199,7 @@ /turf/simulated/floor/plating, /area/tether/surfacebase/east_stairs_two) "aSs" = ( -/obj/structure/toilet, +/obj/structure/toilet/teleplumbed, /obj/machinery/light/small{ dir = 4 }, @@ -24466,7 +24466,7 @@ /turf/simulated/floor/plating, /area/engineering/atmos/storage) "aSU" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 1 }, /obj/machinery/light/small, diff --git a/maps/tether/tether-03-surface3.dmm b/maps/tether/tether-03-surface3.dmm index e048cb6cfb..c34ea751ba 100644 --- a/maps/tether/tether-03-surface3.dmm +++ b/maps/tether/tether-03-surface3.dmm @@ -13129,7 +13129,7 @@ /turf/simulated/floor/tiled/white, /area/crew_quarters/recreation_area_restroom/showers) "awl" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -32844,7 +32844,7 @@ /turf/simulated/floor/tiled/white, /area/crew_quarters/barrestroom) "bfN" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 8 }, /obj/machinery/light/small{ @@ -37554,7 +37554,7 @@ /turf/simulated/floor/tiled/white, /area/tether/surfacebase/entrepreneur/session) "bJF" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 8 }, /obj/machinery/light/small{ @@ -39654,7 +39654,7 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 1 }, /obj/machinery/button/remote/airlock{ @@ -40697,7 +40697,7 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 1 }, /obj/machinery/button/remote/airlock{ diff --git a/maps/tether/tether-05-station1.dmm b/maps/tether/tether-05-station1.dmm index a9a2ec0703..acaf619d1b 100644 --- a/maps/tether/tether-05-station1.dmm +++ b/maps/tether/tether-05-station1.dmm @@ -6093,7 +6093,7 @@ /turf/simulated/floor/tiled/dark, /area/tcommsat/computer) "aof" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 4 }, /obj/machinery/light/small, @@ -6370,7 +6370,7 @@ /turf/simulated/floor/tiled, /area/engineering/workshop) "aoQ" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 4 }, /obj/machinery/light/small{ @@ -10611,7 +10611,7 @@ /turf/simulated/floor/tiled, /area/quartermaster/storage) "aDM" = ( -/obj/structure/toilet{ +/obj/structure/toilet/teleplumbed{ dir = 4 }, /obj/machinery/light/small, diff --git a/vorestation.dme b/vorestation.dme index 13334e59f2..ca1e78d743 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -764,6 +764,7 @@ #include "code\datums\components\crafting\crafting_external.dm" #include "code\datums\components\crafting\recipes.dm" #include "code\datums\components\crafting\tool_quality.dm" +#include "code\datums\components\crafting\recipes\misc.dm" #include "code\datums\components\crafting\recipes\primitive.dm" #include "code\datums\components\crafting\recipes\survival.dm" #include "code\datums\components\crafting\recipes\weapons.dm" @@ -1579,6 +1580,7 @@ #include "code\game\objects\effects\spiders.dm" #include "code\game\objects\effects\spiders_vr.dm" #include "code\game\objects\effects\step_triggers.dm" +#include "code\game\objects\effects\toilet_output.dm" #include "code\game\objects\effects\wire_deleter.dm" #include "code\game\objects\effects\zone_divider.dm" #include "code\game\objects\effects\alien\aliens.dm" @@ -2037,7 +2039,6 @@ #include "code\game\objects\structures\trash_pile_vr.dm" #include "code\game\objects\structures\under_wardrobe.dm" #include "code\game\objects\structures\watercloset.dm" -#include "code\game\objects\structures\watercloset_vr.dm" #include "code\game\objects\structures\windoor_assembly.dm" #include "code\game\objects\structures\window.dm" #include "code\game\objects\structures\window_spawner.dm"