From a9584aeec17b8dca3dc863dcf80ac6bcea3fc10a Mon Sep 17 00:00:00 2001 From: ReoDaProtovali Date: Mon, 16 Sep 2024 04:07:55 -0500 Subject: [PATCH 1/5] Plap --- .../code/machinery/feeding_tube_industrial.dm | 114 ++++++++++++++++++ code/modules/recycling/disposal/outlet.dm | 4 + 2 files changed, 118 insertions(+) create mode 100644 GainStation13/code/machinery/feeding_tube_industrial.dm diff --git a/GainStation13/code/machinery/feeding_tube_industrial.dm b/GainStation13/code/machinery/feeding_tube_industrial.dm new file mode 100644 index 00000000..dbaabc7a --- /dev/null +++ b/GainStation13/code/machinery/feeding_tube_industrial.dm @@ -0,0 +1,114 @@ +/** + * Contains: + * Industrial Feeding Tube + */ + +/obj/structure/disposaloutlet/industrial_feeding_tube + name = "industrial feeding tube" + desc = "" + icon = 'icons/obj/atmospherics/pipes/disposal.dmi' + icon_state = "outlet" + anchored = FALSE + var/turf/target // this will be where the output objects are 'thrown' to. + var/attached //Where the tube tries to splort out into + var/obj/machinery/iv_drip/feeding_tube/stored //This is made using a feeding tube + var/start_eject = 0 + var/eject_range = 2 + +/obj/structure/disposaloutlet/industrial_feeding_tube/Initialize(mapload, obj/machinery/iv_drip/feeding_tube/make_from) + . = ..() + if(make_from) + make_from.forceMove(src) + stored = make_from + else + stored = new /obj/machinery/iv_drip/feeding_tube + + trunk = locate() in loc + if(trunk) + trunk.linked = src // link the pipe trunk to self + anchored = TRUE + +/obj/machinery/disposaloutlet/industrial_feeding_tube/MouseDrop(mob/living/target) + . = ..() + if(!isliving(usr) || !usr.canUseTopic(src, BE_CLOSE) || !isliving(target)) + return + + if(attached) + visible_message("[attached] is detached from [src].") + attached = null + update_icon() + return + + if(!Adjacent(target) || !usr.Adjacent(target)) + return + + + if(!target.has_dna()) + to_chat(usr, "[src] beeps: Warning, incompatible creature!") + return + + if(Adjacent(target) && usr.Adjacent(target)) + if(beaker) + usr.visible_message("[usr] attaches [src] to [target].", "You attach [src] to [target].") + log_combat(usr, target, "attached", src, "containing: [beaker.name] - ([beaker.reagents.log_list()])") + add_fingerprint(usr) + attached = target + START_PROCESSING(SSmachines, src) + update_icon() + else + to_chat(usr, "There's nothing attached to [src]!") //gs13 edit + + if(iscarbon(target)) + var/mob/living/carbon/feedee + if(HAS_TRAIT(feedee, TRAIT_TRASHCAN)) + var/food_dump = input("Where do you shove the tube?", "Select belly") as null|anything in feedee.vore_organs + if(!food_dump || !istype(food_dump, /obj/belly)) + attached = target //Attach normally + return + else + attached = food_dump + + +// expel the contents of the holder object, then delete it +// called when the holder exits the outlet +/obj/structure/disposaloutlet/industrial_feeding_tube/expel(obj/structure/disposalholder/H) + H.active = FALSE + flick("outlet-open", src) + if((start_eject + 30) < world.time) + start_eject = world.time + playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 0, 0) + addtimer(CALLBACK(src,PROC_REF(expel_holder), H, TRUE), 20) + else + addtimer(CALLBACK(src,PROC_REF(expel_holder), H), 20) + +/obj/structure/disposaloutlet/proc/expel_holder(obj/structure/disposalholder/H, playsound=FALSE) + if(playsound) + playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) + + if(!H) + return + + var/turf/T = get_turf(src) + + for(var/A in H) + var/atom/movable/AM = A + AM.forceMove(T) + AM.pipe_eject(dir) + AM.throw_at(target, eject_range, 1) + + H.vent_gas(T) + qdel(H) + +/obj/structure/disposaloutlet/welder_act(mob/living/user, obj/item/I) + if(!I.tool_start_check(user, amount=0)) + return TRUE + + playsound(src, 'sound/items/welder2.ogg', 100, 1) + to_chat(user, "You start slicing the floorweld off [src]...") + if(I.use_tool(src, user, 20)) + to_chat(user, "You slice the floorweld off [src].") + stored.forceMove(loc) + transfer_fingerprints_to(stored) + stored = null + qdel(src) + return TRUE diff --git a/code/modules/recycling/disposal/outlet.dm b/code/modules/recycling/disposal/outlet.dm index cca78f84..54d6b16f 100644 --- a/code/modules/recycling/disposal/outlet.dm +++ b/code/modules/recycling/disposal/outlet.dm @@ -16,6 +16,10 @@ /obj/structure/disposaloutlet/Initialize(mapload, obj/structure/disposalconstruct/make_from) . = ..() + //GS Add: Hacky Solution, but it works. + if(type == /obj/structure/disposaloutlet/industrial_feeding_tube) + return + //GS Add End. if(make_from) setDir(make_from.dir) make_from.forceMove(src) From 4a153fef13742bf442b6405d875bf6f4a070881c Mon Sep 17 00:00:00 2001 From: ReoDaProtovali Date: Tue, 17 Sep 2024 00:46:35 -0500 Subject: [PATCH 2/5] done? --- .../code/machinery/feeding_tube_industrial.dm | 157 ++++++++++++++---- code/datums/traits/neutral.dm | 4 +- tgstation.dme | 1 + 3 files changed, 129 insertions(+), 33 deletions(-) diff --git a/GainStation13/code/machinery/feeding_tube_industrial.dm b/GainStation13/code/machinery/feeding_tube_industrial.dm index dbaabc7a..9921541d 100644 --- a/GainStation13/code/machinery/feeding_tube_industrial.dm +++ b/GainStation13/code/machinery/feeding_tube_industrial.dm @@ -5,13 +5,19 @@ /obj/structure/disposaloutlet/industrial_feeding_tube name = "industrial feeding tube" - desc = "" + desc = "An imposing machine designed to pump an absurd amount of food down something's throat. It seems to connect to disposal pipes." icon = 'icons/obj/atmospherics/pipes/disposal.dmi' icon_state = "outlet" anchored = FALSE var/turf/target // this will be where the output objects are 'thrown' to. - var/attached //Where the tube tries to splort out into - var/obj/machinery/iv_drip/feeding_tube/stored //This is made using a feeding tube + /// Who the tube is attached to + var/mob/living/attached + /// Where the tube tries to dump it's stuff into + var/output_dest + /// It's Glogged ! + var/clogged = FALSE + /// This is made using a feeding tube + var/obj/machinery/iv_drip/feeding_tube/stored var/start_eject = 0 var/eject_range = 2 @@ -30,22 +36,14 @@ /obj/machinery/disposaloutlet/industrial_feeding_tube/MouseDrop(mob/living/target) . = ..() - if(!isliving(usr) || !usr.canUseTopic(src, BE_CLOSE) || !isliving(target)) + if(!usr.canUseTopic(src, BE_CLOSE) || !isliving(target)) return if(attached) - visible_message("[attached] is detached from [src].") + attached.visible_message("[attached] is detached from [src].") attached = null update_icon() - return - - if(!Adjacent(target) || !usr.Adjacent(target)) - return - - - if(!target.has_dna()) - to_chat(usr, "[src] beeps: Warning, incompatible creature!") - return + return if(Adjacent(target) && usr.Adjacent(target)) if(beaker) @@ -53,35 +51,98 @@ log_combat(usr, target, "attached", src, "containing: [beaker.name] - ([beaker.reagents.log_list()])") add_fingerprint(usr) attached = target - START_PROCESSING(SSmachines, src) update_icon() else to_chat(usr, "There's nothing attached to [src]!") //gs13 edit if(iscarbon(target)) var/mob/living/carbon/feedee - if(HAS_TRAIT(feedee, TRAIT_TRASHCAN)) - var/food_dump = input("Where do you shove the tube?", "Select belly") as null|anything in feedee.vore_organs - if(!food_dump || !istype(food_dump, /obj/belly)) - attached = target //Attach normally - return + + if(HAS_TRAIT(feedee, TRAIT_TRASHCAN) || feedee) + var/food_dump = input("Where do you shove the tube? (cancel for it to just feed normally)", "Select belly") as null|anything in feedee.vore_organs + if(!food_dump || !isbelly(food_dump)) + output_dest = feedee //Attach normally else - attached = food_dump - + output_dest = food_dump //Attach to vorebelly + + attached = feedee + START_PROCESSING(SSmachines, src) + return // expel the contents of the holder object, then delete it // called when the holder exits the outlet /obj/structure/disposaloutlet/industrial_feeding_tube/expel(obj/structure/disposalholder/H) + var/clunkVol = LAZYLEN(H.contents) + if(H.hasmob) //Uh oh- + clunkVol += 25 + playsound(src, H.hasmob ? "clang" : "clangsmall", clamp(clunkVol, 5, H.hasmob ? 50, 25)) H.active = FALSE - flick("outlet-open", src) - if((start_eject + 30) < world.time) - start_eject = world.time - playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 0, 0) - addtimer(CALLBACK(src,PROC_REF(expel_holder), H, TRUE), 20) - else - addtimer(CALLBACK(src,PROC_REF(expel_holder), H), 20) + if(clogged) + clog(H.contents) + if(!attached) + flick("ind-tube-spew", src) + + addtimer(CALLBACK(src,PROC_REF(expel_holder), H, TRUE), 5) + return -/obj/structure/disposaloutlet/proc/expel_holder(obj/structure/disposalholder/H, playsound=FALSE) + + if(isliving(output_dest)) + var/list/not_food = list() + var/turf/T = get_turf(src) + + for(var/atom/movable/AM in H) + if(istype(AM, /obj/item/reagent_containers/food/snacks)) + var/obj/item/reagent_containers/food/snacks/food = AM + + var/food_reagents = food.reagents + if(food_reagents.total_volume) + var/food_size = food_reagents.total_volume //We're cramming the Whole Thing down your throat~ + + SEND_SIGNAL(food, COMSIG_FOOD_EATEN, attached) + + food_reagents.reaction(attached, INGEST, food_size) + food_reagents.trans_to(attached, food_size) + + food.checkLiked(food_size, attached) //...Hopefully you like the taste. + + if(food.trash) //Lets make the trash the food's supposed to make, if it has any + var/trash = food.generate_trash(src) + if(not_food) + not_food += trash // If it's already going to get clogged, clog it more with the trash + else + trash.forceMove(T) // Otherwise move it to the tile. For convinience + + qdel(food) //Gulp... + continue + + else + not_food += AM // That's not (traditionally) edible! + + if(not_food) + clog(not_food) // Now you've gone and clogged us... + H.vent_gas(T) + qdel(H) + return + + if(isbelly(output_dest)) + var/list/inedible //Some things shouldnt be eaten... + var/turf/T = get_turf(src) + + for(var/atom/movable/AM in H) + if(isliving(AM)) + var/mob/living/cutie = AM + if(cutie.devourable != TRUE) //Do not eat this QT... + inedible += cutie + continue + + AM.forceMove(attached) + if(inedible) + clog(inedible) + + H.vent_gas(T) + qdel(H) + +/obj/structure/disposaloutlet/industrial_feeding_tube/expel_holder(obj/structure/disposalholder/H, playsound=FALSE) if(playsound) playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) @@ -92,6 +153,9 @@ for(var/A in H) var/atom/movable/AM = A + + target = get_offset_target_turf(loc, rand(5)-rand(5), rand(5)-rand(5)) + AM.forceMove(T) AM.pipe_eject(dir) AM.throw_at(target, eject_range, 1) @@ -99,7 +163,38 @@ H.vent_gas(T) qdel(H) -/obj/structure/disposaloutlet/welder_act(mob/living/user, obj/item/I) +/obj/structure/disposaloutlet/industrial_feeding_tube/attack_hand(mob/user) + . = ..() + if(attached) + attached.visible_message("[attached] is detached from [src].") + attached = null + update_icon() + return + +/obj/structure/disposaloutlet/industrial_feeding_tube/attackby(obj/item/I, mob/living/user, params) + if(I.tool_behaviour == TOOL_CROWBAR) + user.visible_message("") + if(do_after(user, 30, TRUE, src)) + unclog() + +/obj/structure/disposaloutlet/industrial_feeding_tube/proc/clog(list/clog_junk) + for(var/atom/movable/AM in clog_junk) + AM.forceMove(src) + clogged = TRUE + playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 1) + +/obj/structure/disposaloutlet/industrial_feeding_tube/proc/unclog() + + for(var/atom/movable/AM in src) + + target = get_offset_target_turf(loc, rand(5)-rand(5), rand(5)-rand(5)) + + AM.forceMove(T) + AM.pipe_eject(dir) + AM.throw_at(target, eject_range, 1) + + +/obj/structure/disposaloutlet/industrial_feeding_tube/welder_act(mob/living/user, obj/item/I) if(!I.tool_start_check(user, amount=0)) return TRUE diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index 3c1f24e6..77b03dd8 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -191,10 +191,10 @@ medical_record_text = "Patient has been observed eating inedible garbage." /datum/quirk/trashcan/add() - quirk_holder.verbs += /mob/living/proc/eat_trash + add_verb(quirk_holder, /mob/living/proc/eat_trash) /datum/quirk/trashcan/remove() - quirk_holder.verbs -= /mob/living/proc/eat_trash + remove_verb(quirk_holder, /mob/living/proc/eat_trash) /datum/quirk/universal_diet name = "Universal diet" diff --git a/tgstation.dme b/tgstation.dme index f1e1a7c2..44c65f0a 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3098,6 +3098,7 @@ #include "GainStation13\code\machinery\adipoelectric_transformer.dm" #include "GainStation13\code\machinery\fattening_turret.dm" #include "GainStation13\code\machinery\feeding_tube.dm" +#include "GainStation13\code\machinery\feeding_tube_industrial.dm" #include "GainStation13\code\machinery\supply_teleporter.dm" #include "GainStation13\code\mechanics\fatness.dm" #include "GainStation13\code\mechanics\fatrousal.dm" From 3d9e368e029e10003b6861ab3f60ac68b9a618cf Mon Sep 17 00:00:00 2001 From: ReoDaProtovali Date: Tue, 17 Sep 2024 06:59:48 -0500 Subject: [PATCH 3/5] Not done. --- .../crafting/recipes/recipes_misc_gs.dm | 15 ++ .../code/machinery/feeding_tube_industrial.dm | 201 ++++++++++++++---- tgstation.dme | 1 + 3 files changed, 176 insertions(+), 41 deletions(-) create mode 100644 GainStation13/code/datums/components/crafting/recipes/recipes_misc_gs.dm diff --git a/GainStation13/code/datums/components/crafting/recipes/recipes_misc_gs.dm b/GainStation13/code/datums/components/crafting/recipes/recipes_misc_gs.dm new file mode 100644 index 00000000..19da0bca --- /dev/null +++ b/GainStation13/code/datums/components/crafting/recipes/recipes_misc_gs.dm @@ -0,0 +1,15 @@ +// GS miscellaneous recipes + +/datum/crafting_recipe/industrial_feeding_tube + name = "Industrial Feeding Tube" + reqs = list( + /obj/machinery/iv_drip/feeding_tube = 1, + /obj/item/stack/sheet/metal = 2, + /obj/item/pipe = 2 + ) + parts = list( + /obj/machinery/iv_drip/feeding_tube = 1 + ) + results = /obj/structure/disposaloutlet/industrial_feeding_tube + tools = list(TOOL_WELDER, TOOL_WRENCH, TOOL_SCREWDRIVER) + category = CAT_MISC diff --git a/GainStation13/code/machinery/feeding_tube_industrial.dm b/GainStation13/code/machinery/feeding_tube_industrial.dm index 9921541d..f4f445a0 100644 --- a/GainStation13/code/machinery/feeding_tube_industrial.dm +++ b/GainStation13/code/machinery/feeding_tube_industrial.dm @@ -4,12 +4,13 @@ */ /obj/structure/disposaloutlet/industrial_feeding_tube - name = "industrial feeding tube" + name = "\improper industrial feeding tube" desc = "An imposing machine designed to pump an absurd amount of food down something's throat. It seems to connect to disposal pipes." - icon = 'icons/obj/atmospherics/pipes/disposal.dmi' - icon_state = "outlet" + icon = 'GainStation13/icons/obj/feeding_tube.dmi' + icon_state = "feeding_tube" anchored = FALSE - var/turf/target // this will be where the output objects are 'thrown' to. + /// Is it welded down? + var/welded = FALSE /// Who the tube is attached to var/mob/living/attached /// Where the tube tries to dump it's stuff into @@ -17,43 +18,48 @@ /// It's Glogged ! var/clogged = FALSE /// This is made using a feeding tube - var/obj/machinery/iv_drip/feeding_tube/stored - var/start_eject = 0 - var/eject_range = 2 + var/obj/machinery/iv_drip/feeding_tube/storedFeeder //Really wish I could redefine stored. /obj/structure/disposaloutlet/industrial_feeding_tube/Initialize(mapload, obj/machinery/iv_drip/feeding_tube/make_from) . = ..() if(make_from) make_from.forceMove(src) - stored = make_from + storedFeeder = make_from else - stored = new /obj/machinery/iv_drip/feeding_tube + storedFeeder = new /obj/machinery/iv_drip/feeding_tube(src) trunk = locate() in loc if(trunk) trunk.linked = src // link the pipe trunk to self anchored = TRUE + welded = TRUE //Make it functional -/obj/machinery/disposaloutlet/industrial_feeding_tube/MouseDrop(mob/living/target) +/obj/structure/disposaloutlet/industrial_feeding_tube/CheckParts(list/parts_list) + ..() + storedFeeder = locate(/obj/machinery/iv_drip/feeding_tube) in contents + +/obj/structure/disposaloutlet/industrial_feeding_tube/Destroy() + if(attached) + attached = null + if(output_dest) + output_dest = null + QDEL_NULL(storedFeeder) + return ..() + +/obj/structure/disposaloutlet/industrial_feeding_tube/MouseDrop(mob/living/target) . = ..() if(!usr.canUseTopic(src, BE_CLOSE) || !isliving(target)) return + if(!anchored || !welded) + to_chat(usr, "You need to anchor down \the [src] before you can use it.") + return + if(attached) attached.visible_message("[attached] is detached from [src].") attached = null update_icon() return - - if(Adjacent(target) && usr.Adjacent(target)) - if(beaker) - usr.visible_message("[usr] attaches [src] to [target].", "You attach [src] to [target].") - log_combat(usr, target, "attached", src, "containing: [beaker.name] - ([beaker.reagents.log_list()])") - add_fingerprint(usr) - attached = target - update_icon() - else - to_chat(usr, "There's nothing attached to [src]!") //gs13 edit if(iscarbon(target)) var/mob/living/carbon/feedee @@ -66,21 +72,49 @@ output_dest = food_dump //Attach to vorebelly attached = feedee + update_icon() START_PROCESSING(SSmachines, src) return +/obj/structure/disposaloutlet/industrial_feeding_tube/process() + if(!attached) + return PROCESS_KILL + + if(!(get_dist(src, attached) <= 1 && isturf(attached.loc))) + to_chat(attached, "The feeding hose is yanked out of you!") + attached = null + output_dest = null + update_icon() + return PROCESS_KILL + + //face_atom(attached) + +/obj/structure/disposaloutlet/industrial_feeding_tube/update_icon() + // A lot of this is temp. More likely than not you shouldnt see this comment as it'll be properly updated when reo PRs this. + // Or it wont because epic fail :333 + if(attached) + icon_state = "injecting" //Temp. Change it when proper icons are made + else + icon_state = "injectidle" //Temp. + + cut_overlays() + + + + + // expel the contents of the holder object, then delete it // called when the holder exits the outlet /obj/structure/disposaloutlet/industrial_feeding_tube/expel(obj/structure/disposalholder/H) var/clunkVol = LAZYLEN(H.contents) if(H.hasmob) //Uh oh- clunkVol += 25 - playsound(src, H.hasmob ? "clang" : "clangsmall", clamp(clunkVol, 5, H.hasmob ? 50, 25)) + playsound(src, H.hasmob ? "clang" : "clangsmall", clamp(clunkVol, 5, H.hasmob ? 50 : 25)) H.active = FALSE if(clogged) clog(H.contents) if(!attached) - flick("ind-tube-spew", src) + //flick("ind-tube-spew", src) addtimer(CALLBACK(src,PROC_REF(expel_holder), H, TRUE), 5) return @@ -94,7 +128,7 @@ if(istype(AM, /obj/item/reagent_containers/food/snacks)) var/obj/item/reagent_containers/food/snacks/food = AM - var/food_reagents = food.reagents + var/datum/reagents/food_reagents = food.reagents if(food_reagents.total_volume) var/food_size = food_reagents.total_volume //We're cramming the Whole Thing down your throat~ @@ -106,7 +140,7 @@ food.checkLiked(food_size, attached) //...Hopefully you like the taste. if(food.trash) //Lets make the trash the food's supposed to make, if it has any - var/trash = food.generate_trash(src) + var/obj/item/trash = food.generate_trash(src) if(not_food) not_food += trash // If it's already going to get clogged, clog it more with the trash else @@ -172,10 +206,53 @@ return /obj/structure/disposaloutlet/industrial_feeding_tube/attackby(obj/item/I, mob/living/user, params) - if(I.tool_behaviour == TOOL_CROWBAR) - user.visible_message("") - if(do_after(user, 30, TRUE, src)) - unclog() + if(user.a_intent == INTENT_HARM) + return ..() + switch(I.tool_behaviour) + if(TOOL_WRENCH) + if(welded) + to_chat(user, "\The [src] is firmly welded to the floor. Cut the floorwelds before trying to unwrench it!") + var/turf/T = get_turf(src) + if(!T.intact || !isfloorturf(T)) + to_chat(user, "You need to remove the floor tiles before detaching \the [src]!") + return + if(anchored) + I.play_tool_sound(src, 100) + anchored = !anchored + trunk.linked = null + trunk = null + attached = null + output_dest = null + user.visible_message("[user] detaches \the [src] from the floor!") + return + else + var/found_trunk = FALSE + for(var/obj/structure/disposalpipe/P in T) + if(istype(P, /obj/structure/disposalpipe/trunk)) + found_trunk = TRUE + break + if(!found_trunk) + to_chat(user, "\The [src] requires a trunk underneath it in order to work!") + return + + to_chat(user, "You attach \the [src] to the trunk.") + return + + I.play_tool_sound(src, 100) + update_icon() + return + + if(TOOL_CROWBAR) + if(!clogged) + to_chat(user, "\The [src] doesnt seem to be clogged at the moment...") + return + + user.visible_message("[user] inserts [user.p_their()] [I] into the maintenance hatch of \the [src], attempting to unclog it...") + if(do_after(user, 30, TRUE, src)) + user.visible_message("[user] unclogs \the [src]!") + unclog() + + . = ..() /obj/structure/disposaloutlet/industrial_feeding_tube/proc/clog(list/clog_junk) for(var/atom/movable/AM in clog_junk) @@ -184,26 +261,68 @@ playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 1) /obj/structure/disposaloutlet/industrial_feeding_tube/proc/unclog() - + + var/turf/T = get_turf(src) for(var/atom/movable/AM in src) + if(AM == storedFeeder) // We need to keep this... + continue - target = get_offset_target_turf(loc, rand(5)-rand(5), rand(5)-rand(5)) + target = get_offset_target_turf(loc, rand(2)-rand(2), rand(2)-rand(2)) AM.forceMove(T) AM.pipe_eject(dir) AM.throw_at(target, eject_range, 1) - /obj/structure/disposaloutlet/industrial_feeding_tube/welder_act(mob/living/user, obj/item/I) if(!I.tool_start_check(user, amount=0)) - return TRUE + return + if(anchored) + var/turf/T = get_turf(src) + if(!welded) // If we're attaching it, we need to check for the pipe we're attaching to + var/found_trunk = FALSE + for(var/obj/structure/disposalpipe/P in T) + if(istype(P, /obj/structure/disposalpipe/trunk)) + found_trunk = TRUE + break + if(!found_trunk) // No pipe, no attach. + to_chat(user, "\The [src] needs to be welded to a trunk!") + return + + to_chat(user, welded ? "You start slicing the floorweld off \the [src]..." : "You start welding \the [src] in place...") + playsound(src, 'sound/items/welder2.ogg', 100, 1) + if(I.use_tool(src, user, 20)) + if(welded) + to_chat(user, "You slice the floorweld off [src].") + welded = FALSE + return + else + to_chat(user, "You weld \the [src] to the floor.") + welded = TRUE + trunk = locate(/obj/structure/disposalpipe/trunk) in T + trunk.linked = src + return + + + else + to_chat(user, "You begin deconstructing \the [src]") + if(I.use_tool(src, user, 30)) + deconstruct(TRUE) + return - playsound(src, 'sound/items/welder2.ogg', 100, 1) - to_chat(user, "You start slicing the floorweld off [src]...") - if(I.use_tool(src, user, 20)) - to_chat(user, "You slice the floorweld off [src].") - stored.forceMove(loc) - transfer_fingerprints_to(stored) - stored = null - qdel(src) - return TRUE +/obj/structure/disposaloutlet/industrial_feeding_tube/deconstruct(disassembled) + if(!(flags_1 & NODECONSTRUCT_1)) + if(storedFeeder) + storedFeeder.forceMove(loc) //Lets get our Feeder back + transfer_fingerprints_to(storedFeeder) + storedFeeder = null + else + var/feeder = new /obj/machinery/iv_drip/feeding_tube(loc) + transfer_fingerprints_to(feeder) + new /obj/item/stack/sheet/metal(loc, 2) + new /obj/item/pipe(loc) + new /obj/item/pipe(loc) + if(contents) //Anything still glogged inside... + for(var/atom/movable/AM in src) + AM.forceMove(loc) + qdel(src) + \ No newline at end of file diff --git a/tgstation.dme b/tgstation.dme index 44c65f0a..8c5d1233 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -3080,6 +3080,7 @@ #include "GainStation13\code\clothing\head.dm" #include "GainStation13\code\clothing\suits.dm" #include "GainStation13\code\datums\components\fattening_door.dm" +#include "GainStation13\code\datums\components\crafting\recipes\recipes_misc_gs.dm" #include "GainStation13\code\datums\diseases\advance\symptoms\berry.dm" #include "GainStation13\code\datums\mutations\fatfang.dm" #include "GainStation13\code\datums\mutations\radfat.dm" From 4fbcd9947b6e9ff51a58bdc038530b6c29b72e42 Mon Sep 17 00:00:00 2001 From: ReoDaProtovali <84661000+ReoDaProtovali@users.noreply.github.com> Date: Sun, 29 Sep 2024 07:25:34 -0500 Subject: [PATCH 4/5] Almost complete.... --- .../crafting/recipes/recipes_misc_gs.dm | 12 +- .../code/machinery/feeding_tube_industrial.dm | 458 +++++++++++------- .../icons/obj/feeding_tube_industrial.dmi | Bin 0 -> 2854 bytes v_CHOMPstation2/sound/rakshasa/Corrosion3.ogg | Bin 0 -> 9043 bytes 4 files changed, 298 insertions(+), 172 deletions(-) create mode 100644 GainStation13/icons/obj/feeding_tube_industrial.dmi create mode 100644 v_CHOMPstation2/sound/rakshasa/Corrosion3.ogg diff --git a/GainStation13/code/datums/components/crafting/recipes/recipes_misc_gs.dm b/GainStation13/code/datums/components/crafting/recipes/recipes_misc_gs.dm index 19da0bca..9d53cff6 100644 --- a/GainStation13/code/datums/components/crafting/recipes/recipes_misc_gs.dm +++ b/GainStation13/code/datums/components/crafting/recipes/recipes_misc_gs.dm @@ -3,13 +3,15 @@ /datum/crafting_recipe/industrial_feeding_tube name = "Industrial Feeding Tube" reqs = list( - /obj/machinery/iv_drip/feeding_tube = 1, - /obj/item/stack/sheet/metal = 2, - /obj/item/pipe = 2 + // /obj/machinery/iv_drip/feeding_tube = 1, //Removing this. Seems to be buggy with not-items used to craft + /obj/item/stack/sheet/metal = 5, + /obj/item/stack/sheet/plastic = 5, + /obj/item/pipe = 2, + /obj/item/stock_parts/matter_bin = 2 ) parts = list( - /obj/machinery/iv_drip/feeding_tube = 1 + /obj/item/stock_parts/matter_bin = 2 ) - results = /obj/structure/disposaloutlet/industrial_feeding_tube + result = /obj/structure/disposaloutlet/industrial_feeding_tube tools = list(TOOL_WELDER, TOOL_WRENCH, TOOL_SCREWDRIVER) category = CAT_MISC diff --git a/GainStation13/code/machinery/feeding_tube_industrial.dm b/GainStation13/code/machinery/feeding_tube_industrial.dm index f4f445a0..7de83343 100644 --- a/GainStation13/code/machinery/feeding_tube_industrial.dm +++ b/GainStation13/code/machinery/feeding_tube_industrial.dm @@ -5,9 +5,10 @@ /obj/structure/disposaloutlet/industrial_feeding_tube name = "\improper industrial feeding tube" - desc = "An imposing machine designed to pump an absurd amount of food down something's throat. It seems to connect to disposal pipes." - icon = 'GainStation13/icons/obj/feeding_tube.dmi' - icon_state = "feeding_tube" + desc = "An imposing machine designed to pump an absurd amount of \"food\" down something's throat. It seems to connect to disposal pipes." + icon = 'GainStation13/icons/obj/feeding_tube_industrial.dmi' + icon_state = "base" + max_integrity = 500 //Durable... anchored = FALSE /// Is it welded down? var/welded = FALSE @@ -17,44 +18,73 @@ var/output_dest /// It's Glogged ! var/clogged = FALSE - /// This is made using a feeding tube - var/obj/machinery/iv_drip/feeding_tube/storedFeeder //Really wish I could redefine stored. + /// Are we currently pumping? + var/pumping = FALSE + /// Stuff we're currently trying to pump out + var/list/pump_stuff = list() + /// How many items we can push per-pump. + var/pump_limit = 5 -/obj/structure/disposaloutlet/industrial_feeding_tube/Initialize(mapload, obj/machinery/iv_drip/feeding_tube/make_from) +/obj/structure/disposaloutlet/industrial_feeding_tube/Initialize(mapload) . = ..() - if(make_from) - make_from.forceMove(src) - storedFeeder = make_from - else - storedFeeder = new /obj/machinery/iv_drip/feeding_tube(src) - trunk = locate() in loc - if(trunk) + update_icon() + + if(anchored) // So it can be mapped in, attached to something. + trunk = locate() in loc + if(!trunk) + return trunk.linked = src // link the pipe trunk to self anchored = TRUE welded = TRUE //Make it functional /obj/structure/disposaloutlet/industrial_feeding_tube/CheckParts(list/parts_list) ..() - storedFeeder = locate(/obj/machinery/iv_drip/feeding_tube) in contents + pump_limit = 0 + for(var/obj/item/stock_parts/matter_bin/mb in contents) + if(pump_stuff.Find(mb)) //stuff we're going to pump are not being used to build us. + continue + pump_limit += mb.rating * 2.5 // ~20 items per pump with 2 bluespace bins + pump_limit = ceil(pump_limit) //Only whole numbers + +/obj/structure/disposaloutlet/industrial_feeding_tube/deconstruct(disassembled) + if(!(flags_1 & NODECONSTRUCT_1)) + new /obj/item/stack/sheet/metal(loc, 5) + new /obj/item/stack/sheet/plastic(loc, 5) + new /obj/item/pipe/binary(loc, PIPE_STRAIGHT, NORTH) + new /obj/item/pipe/binary(loc, PIPE_STRAIGHT, NORTH) + + if(contents) //Anything still glogged inside... + for(var/atom/movable/AM in src) + AM.forceMove(loc) + qdel(src) + /obj/structure/disposaloutlet/industrial_feeding_tube/Destroy() if(attached) attached = null if(output_dest) output_dest = null - QDEL_NULL(storedFeeder) + + if(LAZYLEN(contents)) // Just to be safe, lets dump everything out before it's deleted. + for(var/atom/movable/AM in contents) + if(istype(AM, /obj/item/stock_parts/matter_bin)) + if(AM in pump_stuff) // Unless it's one of our component parts.. + AM.forceMove(loc) + continue + qdel(AM) + return ..() /obj/structure/disposaloutlet/industrial_feeding_tube/MouseDrop(mob/living/target) . = ..() - if(!usr.canUseTopic(src, BE_CLOSE) || !isliving(target)) + if(!usr.canUseTopic(src, BE_CLOSE)) // iscarbon() so that xenos/wendigos(?) can do feeding stuff maybe. Maybe. return - - if(!anchored || !welded) - to_chat(usr, "You need to anchor down \the [src] before you can use it.") + if(!welded) + to_chat(usr, "You need to weld down \the [src] before you can use it.") + return + if(!isliving(target)) return - if(attached) attached.visible_message("[attached] is detached from [src].") attached = null @@ -62,18 +92,39 @@ return if(iscarbon(target)) - var/mob/living/carbon/feedee + var/mob/living/carbon/feedee = target + + if(HAS_TRAIT(feedee, TRAIT_TRASHCAN)) + var/food_dump = input(usr, "Where do you shove the tube? (cancel for to just feed normally)", "Select belly") as null|anything in feedee.vore_organs + if(food_dump && isbelly(food_dump)) + // Best to be safe with this thing. Since you can eat pretty much anythign with it... + // Including People, Intentionally or otherwise. + if(usr != feedee) // If someone is feeding themself, skip the prefcheck. + var/feedeePrefCheck = alert(feedee, "[usr] is attempting to shove \the [src]'s tube into your [food_dump]! Do you want this?", "THE TUBE", "Yes!!", "No!") + if(feedeePrefCheck != "Yes!!") + to_chat(usr, "[feedee] doesnt want to be fed by \the [src]...") + return - if(HAS_TRAIT(feedee, TRAIT_TRASHCAN) || feedee) - var/food_dump = input("Where do you shove the tube? (cancel for it to just feed normally)", "Select belly") as null|anything in feedee.vore_organs - if(!food_dump || !isbelly(food_dump)) - output_dest = feedee //Attach normally - else output_dest = food_dump //Attach to vorebelly + attached = feedee + update_icon() + START_PROCESSING(SSobj, src) + face_atom(feedee) + return + //Either we arn't attaching to vorebelly, or we arnt able to. Let's try to feed them normally! + if(usr != feedee) // + var/feedeePrefCheck = alert(feedee, "[usr] is attempting to shove \the [src]'s tube into your mouth! Do you want this?", "THE TUBE", "Yes!!", "No!") + if(feedeePrefCheck != "Yes!!") + to_chat(usr, "[feedee] doesnt want to be fed by \the [src]...") + return + + output_dest = feedee //Attach normally attached = feedee + update_icon() - START_PROCESSING(SSmachines, src) + START_PROCESSING(SSobj, src) + face_atom(feedee) return /obj/structure/disposaloutlet/industrial_feeding_tube/process() @@ -87,21 +138,28 @@ update_icon() return PROCESS_KILL - //face_atom(attached) + face_atom(attached) -/obj/structure/disposaloutlet/industrial_feeding_tube/update_icon() +/obj/structure/disposaloutlet/industrial_feeding_tube/update_overlays() // A lot of this is temp. More likely than not you shouldnt see this comment as it'll be properly updated when reo PRs this. // Or it wont because epic fail :333 - if(attached) - icon_state = "injecting" //Temp. Change it when proper icons are made - else - icon_state = "injectidle" //Temp. - + . = ..() cut_overlays() + var/mutable_appearance/tube_overlay = mutable_appearance('GainStation13/icons/obj/feeding_tube_industrial.dmi', "tube_idle") + + if(pumping) + tube_overlay.icon_state = "tube-pump" + else + if(attached) + tube_overlay.icon_state = "tube-active" + else + tube_overlay.icon_state = "tube-idle" + + add_overlay("light-[clogged ? "r" : "g"]") + + add_overlay(tube_overlay) - - // expel the contents of the holder object, then delete it // called when the holder exits the outlet @@ -111,71 +169,109 @@ clunkVol += 25 playsound(src, H.hasmob ? "clang" : "clangsmall", clamp(clunkVol, 5, H.hasmob ? 50 : 25)) H.active = FALSE + H.vent_gas(get_turf(src)) if(clogged) clog(H.contents) - if(!attached) - //flick("ind-tube-spew", src) - - addtimer(CALLBACK(src,PROC_REF(expel_holder), H, TRUE), 5) - return - + else + for(var/atom/movable/AM in H.contents) + pump_stuff += AM // Get ready to pump! + AM.forceMove(src) + if(!pumping) //Lets start a new pump cycle if we arnt pumping. Otherwise, it'll just be added to the queue. + pump() + qdel(H) - if(isliving(output_dest)) - var/list/not_food = list() - var/turf/T = get_turf(src) - - for(var/atom/movable/AM in H) - if(istype(AM, /obj/item/reagent_containers/food/snacks)) - var/obj/item/reagent_containers/food/snacks/food = AM - - var/datum/reagents/food_reagents = food.reagents - if(food_reagents.total_volume) - var/food_size = food_reagents.total_volume //We're cramming the Whole Thing down your throat~ - - SEND_SIGNAL(food, COMSIG_FOOD_EATEN, attached) - - food_reagents.reaction(attached, INGEST, food_size) - food_reagents.trans_to(attached, food_size) - - food.checkLiked(food_size, attached) //...Hopefully you like the taste. - - if(food.trash) //Lets make the trash the food's supposed to make, if it has any - var/obj/item/trash = food.generate_trash(src) - if(not_food) - not_food += trash // If it's already going to get clogged, clog it more with the trash - else - trash.forceMove(T) // Otherwise move it to the tile. For convinience - - qdel(food) //Gulp... - continue - - else - not_food += AM // That's not (traditionally) edible! - - if(not_food) - clog(not_food) // Now you've gone and clogged us... - H.vent_gas(T) - qdel(H) +/obj/structure/disposaloutlet/industrial_feeding_tube/proc/pump(repeat = TRUE, unlimited = FALSE) + if(clogged) return + var/list/this_pump = list() //What we're going to pump this cycle + var/item_count = 0 + for(var/atom/movable/AM in pump_stuff) + this_pump += AM // Add to the stuff we're currently pumping + item_count++ + if(item_count > pump_limit && !unlimited) //We're pumping as much as our parts allow! + break + if(!pumping) + pumping = TRUE + update_icon() + spawn(8) + pumping = FALSE + update_icon() + spawn(9) //Wait for the animation to finish - if(isbelly(output_dest)) - var/list/inedible //Some things shouldnt be eaten... - var/turf/T = get_turf(src) - - for(var/atom/movable/AM in H) - if(isliving(AM)) - var/mob/living/cutie = AM - if(cutie.devourable != TRUE) //Do not eat this QT... - inedible += cutie - continue - - AM.forceMove(attached) - if(inedible) - clog(inedible) + if(!output_dest || !attached) //We either arnt, or got disconnected by time stuff was about to splort out! + spew(this_pump, TRUE) + if(LAZYLEN(pump_stuff) && repeat) + pump() + return - H.vent_gas(T) - qdel(H) + var/fed_something = FALSE + // Feed Normally + if(isliving(output_dest)) + var/list/not_food = list() + for(var/atom/movable/AM in this_pump) + if(istype(AM, /obj/item/reagent_containers/food/snacks)) + var/obj/item/reagent_containers/food/snacks/food = AM + var/datum/reagents/food_reagents = food.reagents + if(food_reagents.total_volume) + var/food_size = food_reagents.total_volume //We're cramming the Whole Thing down your throat~ + SEND_SIGNAL(food, COMSIG_FOOD_EATEN, attached) + + food_reagents.reaction(attached, INGEST, food_size) + food_reagents.trans_to(attached, food_size) + + food.checkLiked(food_size, attached) //...Hopefully you like the taste. + + + if(food.trash) //Lets make the trash the food's supposed to make, if it has any + var/obj/item/trash = food.generate_trash(src) + if(not_food) + not_food += trash // If it's already going to get clogged, clog it more with the trash + else + trash.forceMove(get_turf(src)) // Otherwise move it to the tile. For convinience + + fed_something = TRUE + pump_stuff -= food + qdel(food) //Gulp... + continue + else + not_food += AM // That's not (traditionally) edible! + + if(LAZYLEN(not_food)) + clog(not_food) // Now you've gone and clogged us... + + // Feed Voraciously + if(isbelly(output_dest)) + var/list/inedible //Some things shouldnt be eaten... + for(var/atom/movable/AM in this_pump) + pump_stuff -= AM // We're putting this in. Remove it from the list. + if(isitem(AM)) + var/obj/item/I = AM + if(is_type_in_list(I, item_vore_blacklist)) + inedible += I + continue + if(isliving(AM)) + var/mob/living/cutie = AM + if(cutie.devourable != TRUE) //Do not eat this QT... + inedible += cutie + continue + + fed_something = TRUE + AM.forceMove(output_dest) + if(inedible) + clog(inedible) + + // After everything, if we've pushed something, play the "rubber tube noise" + // It's technically an evil digestion sound from a snowflake shadekin, but it makes for a good tube sound. Thanks Verkie! + if(fed_something) + playsound(attached.loc, 'v_CHOMPstation2/sound/rakshasa/Corrosion3.ogg', rand(10,50), 1) + + if(LAZYLEN(pump_stuff) && repeat) + pump() + else + pumping = FALSE + update_icon() + /obj/structure/disposaloutlet/industrial_feeding_tube/expel_holder(obj/structure/disposalholder/H, playsound=FALSE) if(playsound) playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) @@ -183,18 +279,9 @@ if(!H) return - var/turf/T = get_turf(src) + spew(H.contents) - for(var/A in H) - var/atom/movable/AM = A - - target = get_offset_target_turf(loc, rand(5)-rand(5), rand(5)-rand(5)) - - AM.forceMove(T) - AM.pipe_eject(dir) - AM.throw_at(target, eject_range, 1) - - H.vent_gas(T) + H.vent_gas(get_turf(src)) qdel(H) /obj/structure/disposaloutlet/industrial_feeding_tube/attack_hand(mob/user) @@ -202,41 +289,49 @@ if(attached) attached.visible_message("[attached] is detached from [src].") attached = null + output_dest = null update_icon() return /obj/structure/disposaloutlet/industrial_feeding_tube/attackby(obj/item/I, mob/living/user, params) - if(user.a_intent == INTENT_HARM) + if(user.a_intent != INTENT_HELP) return ..() switch(I.tool_behaviour) if(TOOL_WRENCH) if(welded) to_chat(user, "\The [src] is firmly welded to the floor. Cut the floorwelds before trying to unwrench it!") + return TRUE var/turf/T = get_turf(src) - if(!T.intact || !isfloorturf(T)) - to_chat(user, "You need to remove the floor tiles before detaching \the [src]!") - return + if(T.intact && isfloorturf(T)) + to_chat(user, "You need to remove the floor tiles before [anchored ? "detaching" : "attaching"] \the [src]!") + return TRUE if(anchored) I.play_tool_sound(src, 100) - anchored = !anchored + + anchored = FALSE trunk.linked = null trunk = null attached = null output_dest = null + user.visible_message("[user] detaches \the [src] from the floor!") - return + return TRUE else var/found_trunk = FALSE for(var/obj/structure/disposalpipe/P in T) if(istype(P, /obj/structure/disposalpipe/trunk)) + var/obj/structure/disposalpipe/trunk/newtrunk = P + if(newtrunk.linked) //Trunk is already linked to something + continue found_trunk = TRUE + trunk = newtrunk break if(!found_trunk) to_chat(user, "\The [src] requires a trunk underneath it in order to work!") return - + to_chat(user, "You attach \the [src] to the trunk.") - return + anchored = TRUE I.play_tool_sound(src, 100) update_icon() @@ -245,84 +340,113 @@ if(TOOL_CROWBAR) if(!clogged) to_chat(user, "\The [src] doesnt seem to be clogged at the moment...") - return + return TRUE - user.visible_message("[user] inserts [user.p_their()] [I] into the maintenance hatch of \the [src], attempting to unclog it...") + user.visible_message("[user] starts to pry open the maintenance hatch of \the [src], attempting to unclog it...") if(do_after(user, 30, TRUE, src)) user.visible_message("[user] unclogs \the [src]!") unclog() - + return . = ..() -/obj/structure/disposaloutlet/industrial_feeding_tube/proc/clog(list/clog_junk) - for(var/atom/movable/AM in clog_junk) - AM.forceMove(src) - clogged = TRUE - playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 1) - -/obj/structure/disposaloutlet/industrial_feeding_tube/proc/unclog() - - var/turf/T = get_turf(src) - for(var/atom/movable/AM in src) - if(AM == storedFeeder) // We need to keep this... - continue - - target = get_offset_target_turf(loc, rand(2)-rand(2), rand(2)-rand(2)) - - AM.forceMove(T) - AM.pipe_eject(dir) - AM.throw_at(target, eject_range, 1) - /obj/structure/disposaloutlet/industrial_feeding_tube/welder_act(mob/living/user, obj/item/I) if(!I.tool_start_check(user, amount=0)) return if(anchored) - var/turf/T = get_turf(src) - if(!welded) // If we're attaching it, we need to check for the pipe we're attaching to - var/found_trunk = FALSE - for(var/obj/structure/disposalpipe/P in T) - if(istype(P, /obj/structure/disposalpipe/trunk)) - found_trunk = TRUE - break - if(!found_trunk) // No pipe, no attach. - to_chat(user, "\The [src] needs to be welded to a trunk!") - return - - to_chat(user, welded ? "You start slicing the floorweld off \the [src]..." : "You start welding \the [src] in place...") + //var/turf/T = get_turf(src) + if(!welded) + if(!trunk) // If we're attaching it, we need to check for the pipe we're attaching to + to_chat(user, "\The [src] needs to be welded to a trunk.") + return TRUE + to_chat(user, "You start welding \the [src] in place...") + else + if(clogged) // There's junk inside! + to_chat(user, "There's junk inside \the [src]! Clean it out before trying to remove it!") + return TRUE + //Already welded, lets cut it free + to_chat(user, "You start slicing the floorweld off \the [src]...") + playsound(src, 'sound/items/welder2.ogg', 100, 1) if(I.use_tool(src, user, 20)) if(welded) to_chat(user, "You slice the floorweld off [src].") welded = FALSE - return + trunk.linked = null + return TRUE else to_chat(user, "You weld \the [src] to the floor.") welded = TRUE - trunk = locate(/obj/structure/disposalpipe/trunk) in T trunk.linked = src - return + return TRUE else to_chat(user, "You begin deconstructing \the [src]") if(I.use_tool(src, user, 30)) deconstruct(TRUE) - return + return TRUE -/obj/structure/disposaloutlet/industrial_feeding_tube/deconstruct(disassembled) - if(!(flags_1 & NODECONSTRUCT_1)) - if(storedFeeder) - storedFeeder.forceMove(loc) //Lets get our Feeder back - transfer_fingerprints_to(storedFeeder) - storedFeeder = null +// Someone got stuck inside after it got clogged! +// Lets let them force their way out +/obj/structure/disposaloutlet/industrial_feeding_tube/container_resist(mob/living/user) + if(user.stat || !clogged) //If it's not clogged, they'll be ejected soon... One way or another. + return + playsound(src, "clang", 50) + visible_message("\The [src] loudly clongs as something inside tries to break free!") + if(do_after(user, 100)) + unclog() + +/obj/structure/disposaloutlet/industrial_feeding_tube/proc/clog(list/clog_junk) + clogged = TRUE + for(var/atom/movable/AM in clog_junk) + if(!pump_stuff.Find(AM)) + pump_stuff += AM + + playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 1) + +/obj/structure/disposaloutlet/industrial_feeding_tube/proc/unclog() + + spew(pump_stuff) + + clogged = FALSE + +/obj/structure/disposaloutlet/industrial_feeding_tube/proc/spew(var/list/spew_stuff, playsound = FALSE) + var/turf/T = get_turf(src) + + if(playsound) + playsound(src, 'sound/machines/hiss.ogg', 50, 0, 0) + for(var/atom/movable/AM in spew_stuff) + if(AM in pump_stuff) + pump_stuff -= AM + target = get_offset_target_turf(loc, rand(2)-rand(2), rand(2)-rand(2)) + + AM.forceMove(T) + AM.pipe_eject(dir) + AM.throw_at(target, eject_range, 1) + +/obj/structure/disposaloutlet/industrial_feeding_tube/proc/face_atom(atom/A) //Literally stolen from /mob. Sue me. + if(!A || !x || !y || !A.x || !A.y ) + return + var/dx = A.x - x + var/dy = A.y - y + if(!dx && !dy) // Wall items are graphically shifted but on the floor + if(A.pixel_y > 16) + setDir(NORTH) + else if(A.pixel_y < -16) + setDir(SOUTH) + else if(A.pixel_x > 16) + setDir(EAST) + else if(A.pixel_x < -16) + setDir(WEST) + return + + if(abs(dx) < abs(dy)) + if(dy > 0) + setDir(NORTH) else - var/feeder = new /obj/machinery/iv_drip/feeding_tube(loc) - transfer_fingerprints_to(feeder) - new /obj/item/stack/sheet/metal(loc, 2) - new /obj/item/pipe(loc) - new /obj/item/pipe(loc) - if(contents) //Anything still glogged inside... - for(var/atom/movable/AM in src) - AM.forceMove(loc) - qdel(src) - \ No newline at end of file + setDir(SOUTH) + else + if(dx > 0) + setDir(EAST) + else + setDir(WEST) diff --git a/GainStation13/icons/obj/feeding_tube_industrial.dmi b/GainStation13/icons/obj/feeding_tube_industrial.dmi new file mode 100644 index 0000000000000000000000000000000000000000..99adb797ecc03568c9de501e1dd672974b1b7e2d GIT binary patch literal 2854 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 literal 0 HcmV?d00001 diff --git a/v_CHOMPstation2/sound/rakshasa/Corrosion3.ogg b/v_CHOMPstation2/sound/rakshasa/Corrosion3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..cef4bf5c2d0d231fe27357610f5100a9ab01f615 GIT binary patch literal 9043 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 DUL8By literal 0 HcmV?d00001 From 09d29d240ca395c6dfa5a8b86d8cb0d18f9a30ad Mon Sep 17 00:00:00 2001 From: ReoDaProtovali <84661000+ReoDaProtovali@users.noreply.github.com> Date: Sun, 29 Sep 2024 22:50:47 -0500 Subject: [PATCH 5/5] Finished. Scrubbed out a few last bugs --- .../code/machinery/feeding_tube_industrial.dm | 24 +++++++++++++----- .../icons/obj/feeding_tube_industrial.dmi | Bin 2854 -> 5656 bytes 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/GainStation13/code/machinery/feeding_tube_industrial.dm b/GainStation13/code/machinery/feeding_tube_industrial.dm index 7de83343..ddf73f97 100644 --- a/GainStation13/code/machinery/feeding_tube_industrial.dm +++ b/GainStation13/code/machinery/feeding_tube_industrial.dm @@ -42,7 +42,7 @@ ..() pump_limit = 0 for(var/obj/item/stock_parts/matter_bin/mb in contents) - if(pump_stuff.Find(mb)) //stuff we're going to pump are not being used to build us. + if(mb in pump_stuff) //stuff we're going to pump are not being used to build us. continue pump_limit += mb.rating * 2.5 // ~20 items per pump with 2 bluespace bins @@ -156,7 +156,8 @@ else tube_overlay.icon_state = "tube-idle" - add_overlay("light-[clogged ? "r" : "g"]") + if(welded) //if we're not welded, dont show our light on. + add_overlay("light-[clogged ? "r" : "g"]") add_overlay(tube_overlay) @@ -368,6 +369,8 @@ playsound(src, 'sound/items/welder2.ogg', 100, 1) if(I.use_tool(src, user, 20)) + update_icon() + playsound(src, 'sound/items/welder.ogg', 100, 1) if(welded) to_chat(user, "You slice the floorweld off [src].") welded = FALSE @@ -381,8 +384,10 @@ else + playsound(src, 'sound/items/welder2.ogg', 100, 1) to_chat(user, "You begin deconstructing \the [src]") if(I.use_tool(src, user, 30)) + playsound(src, 'sound/items/welder.ogg', 100, 1) deconstruct(TRUE) return TRUE @@ -391,24 +396,29 @@ /obj/structure/disposaloutlet/industrial_feeding_tube/container_resist(mob/living/user) if(user.stat || !clogged) //If it's not clogged, they'll be ejected soon... One way or another. return - playsound(src, "clang", 50) + playsound(src, 'sound/effects/clang.ogg', 50) visible_message("\The [src] loudly clongs as something inside tries to break free!") if(do_after(user, 100)) unclog() -/obj/structure/disposaloutlet/industrial_feeding_tube/proc/clog(list/clog_junk) +/obj/structure/disposaloutlet/industrial_feeding_tube/proc/clog(list/clog_junk, loud = TRUE) clogged = TRUE for(var/atom/movable/AM in clog_junk) - if(!pump_stuff.Find(AM)) + if(!(AM in pump_stuff)) pump_stuff += AM - - playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 1) + AM.forceMove(src) + + + update_icon() + if(loud) + playsound(src, 'sound/machines/warning-buzzer.ogg', 50, 1) /obj/structure/disposaloutlet/industrial_feeding_tube/proc/unclog() spew(pump_stuff) clogged = FALSE + update_icon() /obj/structure/disposaloutlet/industrial_feeding_tube/proc/spew(var/list/spew_stuff, playsound = FALSE) var/turf/T = get_turf(src) diff --git a/GainStation13/icons/obj/feeding_tube_industrial.dmi b/GainStation13/icons/obj/feeding_tube_industrial.dmi index 99adb797ecc03568c9de501e1dd672974b1b7e2d..058e5f47c1e60f6af24007edbafba2c5da0947f5 100644 GIT binary patch delta 5499 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 T8Z*%R|3IEd??d$mPo@4Jb(N5v