diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm
index a3bb5355947..571b32cbc48 100644
--- a/code/ATMOSPHERICS/pipes.dm
+++ b/code/ATMOSPHERICS/pipes.dm
@@ -34,7 +34,7 @@
if(istype(W, /obj/item/device/analyzer))
atmosanalyzer_scan(parent.air, user)
- if(istype(W,/obj/item/device/pipe_painter))
+ if(istype(W,/obj/item/device/pipe_painter) || istype(W,/obj/item/weapon/pipe_dispenser))
return
return ..()
@@ -49,4 +49,4 @@
var/obj/item/pipe_meter/PM = new (T)
meter.transfer_fingerprints_to(PM)
qdel(meter)
- ..()
\ No newline at end of file
+ ..()
diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm
index bb16ba4c47c..c1fa0980810 100644
--- a/code/game/machinery/pipe/construction.dm
+++ b/code/game/machinery/pipe/construction.dm
@@ -22,6 +22,15 @@ Buildable meters
#define PIPE_HEAT_EXCHANGE 17
#define PIPE_DVALVE 18
#define PIPE_4WAYMANIFOLD 19
+//Disposal piping numbers - do NOT hardcode these, use the defines
+#define DISP_PIPE_STRAIGHT 0
+#define DISP_PIPE_BENT 1
+#define DISP_JUNCTION 2
+#define DISP_YJUNCTION 3
+#define DISP_END_TRUNK 4
+#define DISP_END_BIN 5
+#define DISP_END_OUTLET 6
+#define DISP_END_CHUTE 7
/obj/item/pipe
name = "pipe"
@@ -95,6 +104,28 @@ Buildable meters
src.pixel_y = rand(-5, 5)
//update the name and icon of the pipe item depending on the type
+var/global/list/pipeID2State = list(
+ "simple", \
+ "simple", \
+ "he", \
+ "he", \
+ "connector", \
+ "manifold", \
+ "junction", \
+ "uvent", \
+ "mvalve", \
+ "pump", \
+ "scrubber", \
+ "insulated", \
+ "insulated", \
+ "filter", \
+ "mixer", \
+ "passivegate", \
+ "volumepump", \
+ "heunary", \
+ "dvalve", \
+ "manifold4w", \
+)
/obj/item/pipe/proc/update()
var/list/nlist = list( \
@@ -120,29 +151,7 @@ Buildable meters
"4-way manifold", \
)
name = nlist[pipe_type+1] + " fitting"
- var/list/islist = list( \
- "simple", \
- "simple", \
- "he", \
- "he", \
- "connector", \
- "manifold", \
- "junction", \
- "uvent", \
- "mvalve", \
- "pump", \
- "scrubber", \
- "insulated", \
- "insulated", \
- "filter", \
- "mixer", \
- "passivegate", \
- "volumepump", \
- "heunary", \
- "dvalve", \
- "manifold4w", \
- )
- icon_state = islist[pipe_type + 1]
+ icon_state = pipeID2State[pipe_type + 1]
//called when a turf is attacked with a pipe item
// place the pipe on the turf, setting pipe level to 1 (underfloor) if the turf is not intact
@@ -423,24 +432,3 @@ Buildable meters
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
user << "You have fastened the meter to the pipe."
qdel(src)
-
-#undef PIPE_SIMPLE_STRAIGHT
-#undef PIPE_SIMPLE_BENT
-#undef PIPE_HE_STRAIGHT
-#undef PIPE_HE_BENT
-#undef PIPE_CONNECTOR
-#undef PIPE_MANIFOLD
-#undef PIPE_JUNCTION
-#undef PIPE_UVENT
-#undef PIPE_MVALVE
-#undef PIPE_PUMP
-#undef PIPE_SCRUBBER
-#undef PIPE_INSULATED_STRAIGHT
-#undef PIPE_INSULATED_BENT
-#undef PIPE_GAS_FILTER
-#undef PIPE_GAS_MIXER
-#undef PIPE_PASSIVE_GATE
-#undef PIPE_VOLUME_PUMP
-#undef PIPE_OUTLET_INJECT
-#undef PIPE_DVALVE
-#undef PIPE_4WAYMANIFOLD
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/RPD.dm b/code/game/objects/items/weapons/RPD.dm
new file mode 100644
index 00000000000..8ed87ab0597
--- /dev/null
+++ b/code/game/objects/items/weapons/RPD.dm
@@ -0,0 +1,547 @@
+//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
+
+/*
+CONTAINS:
+RPD
+*/
+#define PIPE_BINARY 0
+#define PIPE_BENT 1
+#define PIPE_TRINARY 2
+#define PIPE_TRIN_M 3
+#define PIPE_UNARY 4
+
+/datum/pipe_info
+ var/id=-1
+ var/dir=SOUTH
+ var/dirtype=PIPE_BINARY
+ var/icon = 'icons/obj/pipe-item.dmi'
+ var/icon_state=""
+ var/selected=0
+
+/datum/pipe_info/New(var/pid,var/direction,var/dt)
+ src.id=pid
+ src.icon_state=pipeID2State[pid+1]
+ src.dir=direction
+ src.dirtype=dt
+
+/datum/pipe_info/proc/Render(var/dispenser,var/label)
+ return "
[label]"
+
+/datum/pipe_info/meter
+ icon = 'icons/obj/pipes.dmi'
+ icon_state = "meterX"
+
+/datum/pipe_info/meter/New()
+ return
+
+/datum/pipe_info/meter/Render(var/dispenser,var/label)
+ return "[label]" //hardcoding is no
+
+var/global/list/disposalpipeID2State=list(
+ "pipe-s",
+ "pipe-c",
+ "pipe-j1",
+ "pipe-j2",
+ "pipe-y",
+ "pipe-t",
+ "condisposal",
+ "outlet",
+ "intake",
+ "pipe-j1s",
+ "pipe-j2s"
+)
+
+/datum/pipe_info/disposal
+ icon = 'icons/obj/pipes/disposal.dmi'
+ icon_state = "meterX"
+
+/datum/pipe_info/disposal/New(var/pid,var/dt)
+ src.id=pid
+ src.icon_state=disposalpipeID2State[pid+1]
+ src.dir=2
+ src.dirtype=dt
+ if(pid<6 || pid>8)
+ icon_state = "con[icon_state]"
+
+/datum/pipe_info/disposal/Render(var/dispenser,var/label)
+ return "[label]" //avoid hardcoding.
+
+//find these defines in code\game\machinery\pipe\consruction.dm
+var/global/list/RPD_recipes=list(
+ "Regular Pipes" = list(
+ "Pipe" = new /datum/pipe_info(PIPE_SIMPLE_STRAIGHT, 1, PIPE_BINARY),
+ "Bent Pipe" = new /datum/pipe_info(PIPE_SIMPLE_BENT, 5, PIPE_BENT),
+ "Manifold" = new /datum/pipe_info(PIPE_MANIFOLD, 1, PIPE_TRINARY),
+ "Manual Valve" = new /datum/pipe_info(PIPE_MVALVE, 1, PIPE_BINARY),
+ "Digital Valve" = new /datum/pipe_info(PIPE_DVALVE, 1, PIPE_BINARY),
+ "4-Way Manifold" = new /datum/pipe_info(PIPE_4WAYMANIFOLD, 1, PIPE_BINARY),
+ ),
+ "Devices"=list(
+ "Connector" = new /datum/pipe_info(PIPE_CONNECTOR, 1, PIPE_UNARY),
+ "Unary Vent" = new /datum/pipe_info(PIPE_UVENT, 1, PIPE_UNARY),
+ "Gas Pump" = new /datum/pipe_info(PIPE_PUMP, 1, PIPE_UNARY),
+ "Passive Gate" = new /datum/pipe_info(PIPE_PASSIVE_GATE, 1, PIPE_UNARY),
+ "Volume Pump" = new /datum/pipe_info(PIPE_VOLUME_PUMP, 1, PIPE_UNARY),
+ "Scrubber" = new /datum/pipe_info(PIPE_SCRUBBER, 1, PIPE_UNARY),
+ "Meter" = new /datum/pipe_info/meter(),
+ "Gas Filter" = new /datum/pipe_info(PIPE_GAS_FILTER, 1, PIPE_TRIN_M),
+ "Gas Mixer" = new /datum/pipe_info(PIPE_GAS_MIXER, 1, PIPE_TRIN_M),
+// "Injector" = new /datum/pipe_info(PIPE_INJECTOR, 1, PIPE_UNARY),
+ ),
+ "Heat Exchange" = list(
+ "Pipe" = new /datum/pipe_info(PIPE_HE_STRAIGHT, 1, PIPE_BINARY),
+ "Bent Pipe" = new /datum/pipe_info(PIPE_HE_BENT, 5, PIPE_BENT),
+ "Junction" = new /datum/pipe_info(PIPE_JUNCTION, 1, PIPE_UNARY),
+ "Heat Exchanger" = new /datum/pipe_info(PIPE_HEAT_EXCHANGE, 1, PIPE_UNARY),
+ ),
+ "Insulated Pipes" = list(
+ "Pipe" = new /datum/pipe_info(PIPE_INSULATED_STRAIGHT,1, PIPE_BINARY),
+ "Bent Pipe" = new /datum/pipe_info(PIPE_INSULATED_BENT, 5, PIPE_BENT),
+ ),
+ "Disposal Pipes" = list(
+ "Pipe" = new /datum/pipe_info/disposal(DISP_PIPE_STRAIGHT, PIPE_BINARY),
+ "Bent Pipe" = new /datum/pipe_info/disposal(DISP_PIPE_BENT, PIPE_BENT),
+ "Junction" = new /datum/pipe_info/disposal(DISP_JUNCTION, PIPE_TRINARY),
+ "Y-Junction" = new /datum/pipe_info/disposal(DISP_YJUNCTION, PIPE_TRINARY),
+ "Trunk" = new /datum/pipe_info/disposal(DISP_END_TRUNK, PIPE_TRINARY),
+ "Bin" = new /datum/pipe_info/disposal(DISP_END_BIN, PIPE_UNARY),
+ "Outlet" = new /datum/pipe_info/disposal(DISP_END_OUTLET, PIPE_UNARY),
+ "Chute" = new /datum/pipe_info/disposal(DISP_END_CHUTE, PIPE_UNARY),
+ )
+)
+/obj/item/weapon/pipe_dispenser
+ name = "Rapid Piping Device (RPD)"
+ desc = "A device used to rapidly pipe things."
+ icon = 'icons/obj/items.dmi'
+ icon_state = "rpd"
+ opacity = 0
+ density = 0
+ anchored = 0.0
+ flags = CONDUCT
+ force = 10.0
+ throwforce = 10.0
+ throw_speed = 1
+ throw_range = 5
+ w_class = 3.0
+ m_amt = 75000
+ g_amt = 37500
+ origin_tech = "engineering=4;materials=2"
+ var/datum/effect/effect/system/spark_spread/spark_system
+ var/working = 0
+ var/p_type = 0
+ var/p_conntype = 0
+ var/p_dir = 1
+ var/p_class = 0
+ var/p_disposal = 0
+ var/list/paint_colors = list(
+ "grey" = "#cccccc",
+ "red" = "#800000",
+ "blue" = "#000080",
+ "cyan" = "#1C94C4",
+ "green" = "#00CC00",
+ "yellow" = "#FFCC00",
+ "purple" = "#822BFF"
+ )
+ var/paint_color="grey"
+
+/obj/item/weapon/pipe_dispenser/New()
+ . = ..()
+ spark_system = new /datum/effect/effect/system/spark_spread
+ spark_system.set_up(5, 0, src)
+ spark_system.attach(src)
+
+/obj/item/weapon/pipe_dispenser/attack_self(mob/user as mob)
+ show_menu(user)
+
+/obj/item/weapon/pipe_dispenser/proc/render_dir_img(var/_dir,var/pic,var/title)
+ var/selected=""
+ if(_dir == p_dir)
+ selected=" class=\"selected\""
+ return "
"
+
+/obj/item/weapon/pipe_dispenser/proc/show_menu(mob/user as mob)
+ if(!user || !src) return 0
+ var/dat = {"Type
+Utilities:
+"}
+ var/icon/preview=null
+ for(var/category in RPD_recipes)
+ dat += "[category]:"
+ var/list/cat=RPD_recipes[category]
+ for(var/label in cat)
+ var/datum/pipe_info/I = cat[label]
+ var/found=0
+ if(I.id == p_type)
+ if(p_class==0 && I.type==/datum/pipe_info)
+ found=1
+ else if(p_class==2 && I.type==/datum/pipe_info/disposal)
+ found=1
+ if(found)
+ preview=new /icon(I.icon,I.icon_state)
+ dat += I.Render(src,label)
+ dat += "
"
+
+ var/color_css=""
+ var/color_picker=""
+ for(var/color_name in paint_colors)
+ var/color=paint_colors[color_name]
+ color_css += {"
+ a.color.[color_name] {
+ color: [color];
+ }
+ a.color.[color_name]:hover {
+ border:1px solid [color];
+ }
+ a.color.[color_name].selected {
+ background-color: [color];
+ }
+ "}
+ var/selected=""
+ if(color_name==paint_color)
+ selected = " selected"
+ color_picker += {"•"}
+
+ var/dirsel="Direction
"
+ switch(p_conntype)
+ if(-1)
+ if(p_class==-2)
+ dirsel = "Direction
[color_picker]"
+
+ if(PIPE_BINARY) // Straight, N-S, W-E
+ if(preview)
+ user << browse_rsc(new /icon(preview, dir=NORTH), "vertical.png")
+ user << browse_rsc(new /icon(preview, dir=EAST), "horizontal.png")
+
+ dirsel += ""
+ dirsel += render_dir_img(1,"vertical.png","Vertical")
+ dirsel += render_dir_img(4,"horizontal.png","Horizontal")
+ dirsel += "
"
+ else
+ dirsel+={"
+
+ ↕
+ ↔
+
+ "}
+ if(PIPE_BENT) // Bent, N-W, N-E etc
+ if(preview)
+ user << browse_rsc(new /icon(preview, dir=NORTHWEST), "nw.png")
+ user << browse_rsc(new /icon(preview, dir=NORTHEAST), "ne.png")
+ user << browse_rsc(new /icon(preview, dir=SOUTHWEST), "sw.png")
+ user << browse_rsc(new /icon(preview, dir=SOUTHEAST), "se.png")
+
+ dirsel += ""
+ dirsel += render_dir_img(9,"nw.png","West to North")
+ dirsel += render_dir_img(5,"ne.png","North to East")
+ dirsel += "
"
+ dirsel += render_dir_img(10,"sw.png","South to West")
+ dirsel += render_dir_img(6,"se.png","East to South")
+ dirsel += "
"
+ else
+ dirsel+={"
+
+ ╝
+ ╚
+
+ ╗
+ ╔
+
+ "}
+ if(PIPE_TRINARY) // Manifold
+ if(preview)
+ user << browse_rsc(new /icon(preview, dir=NORTH), "s.png")
+ user << browse_rsc(new /icon(preview, dir=EAST), "w.png")
+ user << browse_rsc(new /icon(preview, dir=SOUTH), "n.png")
+ user << browse_rsc(new /icon(preview, dir=WEST), "e.png")
+
+ dirsel += ""
+ dirsel += render_dir_img(1,"s.png","West South East")
+ dirsel += render_dir_img(4,"w.png","North West South")
+ dirsel += "
"
+ dirsel += render_dir_img(2,"n.png","East North West")
+ dirsel += render_dir_img(8,"e.png","South East North")
+ dirsel += "
"
+ else
+ dirsel+={"
+
+ ╦
+ ╣
+
+ ╩
+ ╠
+
+ "}
+ if(PIPE_TRIN_M) // Mirrored ones
+ if(preview)
+ user << browse_rsc(new /icon(preview, dir=NORTH), "s.png")
+ user << browse_rsc(new /icon(preview, dir=EAST), "w.png")
+ user << browse_rsc(new /icon(preview, dir=SOUTH), "n.png")
+ user << browse_rsc(new /icon(preview, dir=WEST), "e.png")
+ user << browse_rsc(new /icon(preview, dir=SOUTHEAST), "sm.png") //each mirror icon is 45 anticlockwise from it's real direction
+ user << browse_rsc(new /icon(preview, dir=NORTHEAST), "wm.png")
+ user << browse_rsc(new /icon(preview, dir=NORTHWEST), "nm.png")
+ user << browse_rsc(new /icon(preview, dir=SOUTHWEST), "em.png")
+
+ dirsel += ""
+ dirsel += render_dir_img(1,"s.png","West South East")
+ dirsel += render_dir_img(4,"w.png","North West South")
+ dirsel += "
"
+ dirsel += render_dir_img(2,"n.png","East North West")
+ dirsel += render_dir_img(8,"e.png","South East North")
+ dirsel += "
"
+ dirsel += render_dir_img(6,"sm.png","West South East")
+ dirsel += render_dir_img(5,"wm.png","North West South")
+ dirsel += "
"
+ dirsel += render_dir_img(9,"nm.png","East North West")
+ dirsel += render_dir_img(10,"em.png","South East North")
+ dirsel += "
"
+ else
+ dirsel+={"
+
+ ╦
+ ╣
+
+ ╩
+ ╠
+
+ ╦
+ ╣
+
+ ╩
+ ╠
+
+ "}
+ if(PIPE_UNARY) // Unary
+ if(preview)
+ user << browse_rsc(new /icon(preview, dir=NORTH), "n.png")
+ user << browse_rsc(new /icon(preview, dir=EAST), "e.png")
+ user << browse_rsc(new /icon(preview, dir=SOUTH), "s.png")
+ user << browse_rsc(new /icon(preview, dir=WEST), "w.png")
+
+ dirsel += ""
+ dirsel += render_dir_img(NORTH,"n.png","North")
+ dirsel += render_dir_img(EAST, "e.png","East")
+ dirsel += render_dir_img(SOUTH,"s.png","South")
+ dirsel += render_dir_img(WEST, "w.png","West")
+ dirsel += "
"
+ else
+ dirsel+={"
+
+ ↑
+ →
+ ↓
+ ←
+
+ "}
+
+ dat = {"
+
+
+ [name]
+
+
+
+[dirsel][dat]
+
+
+"}
+ user << browse(dat, "window=pipedispenser")
+ onclose(user, "pipedispenser")
+ return
+
+/obj/item/weapon/pipe_dispenser/Topic(href, href_list)
+ if(usr.stat || usr.restrained())
+ usr << browse(null, "window=pipedispenser")
+ return
+ usr.set_machine(src)
+ src.add_fingerprint(usr)
+ if(href_list["setdir"])
+ p_dir= text2num(href_list["setdir"])
+ show_menu(usr)
+
+ if(href_list["eatpipes"])
+ p_class = -1
+ p_conntype=-1
+ p_dir=1
+ src.spark_system.start()
+ playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0)
+ show_menu(usr)
+
+ if(href_list["paintpipes"])
+ p_class = -2
+ p_conntype=-1
+ p_dir=1
+ src.spark_system.start()
+ playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0)
+ show_menu(usr)
+
+ if(href_list["set_color"])
+ paint_color=href_list["set_color"]
+ src.spark_system.start()
+ playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0)
+ show_menu(usr)
+
+ if(href_list["makepipe"])
+ p_type = text2num(href_list["makepipe"])
+ p_dir = text2num(href_list["dir"])
+ p_conntype = text2num(href_list["type"])
+ p_class = 0
+ src.spark_system.start()
+ playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0)
+ show_menu(usr)
+
+ if(href_list["makemeter"])
+ p_class = 1
+ p_conntype=-1
+ p_dir=1
+ src.spark_system.start()
+ playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0)
+ show_menu(usr)
+
+ if(href_list["dmake"])
+ p_type = text2num(href_list["dmake"])
+ p_conntype = text2num(href_list["type"])
+ p_dir = 1
+ p_class = 2
+ src.spark_system.start()
+ playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0)
+ show_menu(usr)
+
+
+/obj/item/weapon/pipe_dispenser/afterattack(atom/A, mob/user)
+ if(!in_range(A,user))
+ return
+ if(loc != user)
+ return
+ if(!isrobot(user) && !ishuman(user))
+ return 0
+ if(istype(A,/area/shuttle)||istype(A,/turf/space/transit))
+ return 0
+
+ switch(p_class)
+ if(-2) // Paint pipes
+ if(!istype(A,/obj/machinery/atmospherics/pipe) || istype(A,/obj/machinery/atmospherics/pipe/simple/heat_exchanging) || istype(A,/obj/machinery/atmospherics/pipe/simple/insulated))
+ // Avoid spewing errors about invalid mode -2 when clicking on stuff that aren't pipes.
+ user << "\The [src]'s error light flickers. Perhaps you need to only use it on pipes and pipe meters?"
+ return 0
+ var/obj/machinery/atmospherics/pipe/P = A
+ playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
+ P.pipe_color = paint_color
+ user.visible_message("[user] paints \the [P] [paint_color].","You paint \the [P] [paint_color].")
+ P.update_icon()
+ return 1
+ if(-1) // Eating pipes
+ // Must click on an actual pipe or meter.
+ if(istype(A,/obj/item/pipe) || istype(A,/obj/item/pipe_meter) || istype(A,/obj/structure/disposalconstruct))
+ user << "Destroying Pipe..."
+ playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
+ if(do_after(user, 5))
+ activate()
+ del(A)
+ return 1
+ return 0
+
+ // Avoid spewing errors about invalid mode -1 when clicking on stuff that aren't pipes.
+ user << "The [src]'s error light flickers. Perhaps you need to only use it on pipes and pipe meters?"
+ return 0
+ if(0)
+ if(!(istype(A, /turf)))
+ user << "The [src]'s error light flickers."
+ return 0
+ user << "Building Pipes ..."
+ playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
+ if(do_after(user, 20))
+ activate()
+ var/obj/item/pipe/P = new (A, pipe_type=p_type, dir=p_dir)
+ P.update()
+ P.add_fingerprint(usr)
+ return 1
+ return 0
+
+ if(1)
+ if(!(istype(A, /turf)))
+ user << "The [src]'s error light flickers."
+ return 0
+ user << "Building Meter..."
+ playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
+ if(do_after(user, 20))
+ activate()
+ new /obj/item/pipe_meter(A)
+ return 1
+ return 0
+
+ if(2)
+ if(!(istype(A, /turf)))
+ user << "The [src]'s error light flickers."
+ return 0
+ user << "Building Pipes..."
+ playsound(get_turf(src), 'sound/machines/click.ogg', 50, 1)
+ if(do_after(user, 20))
+ activate()
+ var/obj/structure/disposalconstruct/C = new (A)
+ // This may still produce runtimes, but I checked and /obj/structure/disposalconstruct
+ // DOES have a dir property, inherited from /obj/structure. - N3X
+ C.dir=p_dir
+ switch(p_type)
+ if(0)
+ C.ptype = 0
+ if(1)
+ C.ptype = 1
+ if(2)
+ C.ptype = 2
+ if(3)
+ C.ptype = 4
+ if(4)
+ C.ptype = 5
+ if(5)
+ C.ptype = 6
+ C.density = 1
+ if(6)
+ C.ptype = 7
+ C.density = 1
+ if(7)
+ C.ptype = 8
+ C.density = 1
+ C.add_fingerprint(usr)
+ C.update()
+ return 1
+ return 0
+ else
+ ..()
+ return 0
+
+
+/obj/item/weapon/pipe_dispenser/proc/activate()
+ playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
+
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index 439fb0a86ff..ae268783c38 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -125,8 +125,8 @@
/obj/structure/closet/secure_closet/atmospherics/New()
..()
- sleep(2)
new /obj/item/device/radio/headset/headset_eng(src)
+ new /obj/item/weapon/pipe_dispenser(src)
new /obj/item/weapon/storage/toolbox/mechanical(src)
new /obj/item/weapon/storage/backpack/satchel_norm(src)
new /obj/item/weapon/tank/emergency_oxygen/engi(src)
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 6e488bc3ec9..77be370abf8 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -109,6 +109,7 @@
modules += new /obj/item/borg/sight/meson(src)
emag = new /obj/item/borg/stun(src)
modules += new /obj/item/weapon/rcd/borg(src)
+ modules += new /obj/item/weapon/pipe_dispenser(src) //What could possibly go wrong?
modules += new /obj/item/weapon/extinguisher(src)
modules += new /obj/item/weapon/weldingtool/largetank/cyborg(src)
modules += new /obj/item/weapon/screwdriver(src)
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 8eca25e1066..71868e610c9 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -403,6 +403,14 @@
build_path = /obj/item/weapon/rcd
category = list("hacked", "Construction")
+/datum/design/rpd
+ name = "Rapid pipe dispenser (RPD)"
+ id = "rpd"
+ build_type = AUTOLATHE
+ materials = list("$metal" = 75000, "$glass" = 37500)
+ build_path = /obj/item/weapon/pipe_dispenser
+ category = list("hacked", "Construction")
+
/datum/design/electropack
name = "Electropack"
id = "electropack"
diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi
index 9107f227f89..ac7af348b0f 100644
Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 1ee1c28cfe7..3b1467a5f08 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -579,6 +579,7 @@
#include "code\game\objects\items\weapons\paiwire.dm"
#include "code\game\objects\items\weapons\power_cells.dm"
#include "code\game\objects\items\weapons\RCD.dm"
+#include "code\game\objects\items\weapons\RPD.dm"
#include "code\game\objects\items\weapons\RSF.dm"
#include "code\game\objects\items\weapons\scrolls.dm"
#include "code\game\objects\items\weapons\shields.dm"