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 0000000000..19da0bca4d --- /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 9921541d68..f4f445a0ca 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