diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
index 40a9f325b0..ef0f656781 100755
--- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
@@ -234,4 +234,45 @@ obj/machinery/atmospherics/trinary/filter/Topic(href, href_list) // -- TLE
*/
return
+obj/machinery/atmospherics/trinary/filter/m_filter
+ icon = 'icons/obj/atmospherics/m_filter.dmi'
+ icon_state = "intact_off"
+ dir = SOUTH
+ initialize_directions = SOUTH|NORTH|EAST
+
+obj/machinery/atmospherics/trinary/filter/m_filter/New()
+ ..()
+ switch(dir)
+ if(NORTH)
+ initialize_directions = WEST|NORTH|SOUTH
+ if(SOUTH)
+ initialize_directions = SOUTH|EAST|NORTH
+ if(EAST)
+ initialize_directions = EAST|WEST|NORTH
+ if(WEST)
+ initialize_directions = WEST|SOUTH|EAST
+
+obj/machinery/atmospherics/trinary/filter/m_filter/initialize()
+ if(node1 && node2 && node3) return
+
+ var/node1_connect = turn(dir, -180)
+ var/node2_connect = turn(dir, 90)
+ var/node3_connect = dir
+
+ for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ node1 = target
+ break
+
+ for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ node2 = target
+ break
+
+ for(var/obj/machinery/atmospherics/target in get_step(src,node3_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ node3 = target
+ break
+
+ update_icon()
diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
index bcff8e09cc..3b16042fca 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
@@ -160,3 +160,93 @@ obj/machinery/atmospherics/trinary/mixer
src.update_icon()
src.updateUsrDialog()
return
+
+obj/machinery/atmospherics/trinary/mixer/t_mixer
+ icon = 'icons/obj/atmospherics/t_mixer.dmi'
+ icon_state = "intact_off"
+
+ dir = SOUTH
+ initialize_directions = SOUTH|EAST|WEST
+
+ //node 3 is the outlet, nodes 1 & 2 are intakes
+
+obj/machinery/atmospherics/trinary/mixer/t_mixer/New()
+ ..()
+ switch(dir)
+ if(NORTH)
+ initialize_directions = EAST|NORTH|WEST
+ if(SOUTH)
+ initialize_directions = SOUTH|WEST|EAST
+ if(EAST)
+ initialize_directions = EAST|NORTH|SOUTH
+ if(WEST)
+ initialize_directions = WEST|NORTH|SOUTH
+
+obj/machinery/atmospherics/trinary/mixer/t_mixer/initialize()
+ if(node1 && node2 && node3) return
+
+ var/node1_connect = turn(dir, -90)
+ var/node2_connect = turn(dir, 90)
+ var/node3_connect = dir
+
+ for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ node1 = target
+ break
+
+ for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ node2 = target
+ break
+
+ for(var/obj/machinery/atmospherics/target in get_step(src,node3_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ node3 = target
+ break
+
+ update_icon()
+
+obj/machinery/atmospherics/trinary/mixer/m_mixer
+ icon = 'icons/obj/atmospherics/m_mixer.dmi'
+ icon_state = "intact_off"
+
+ dir = SOUTH
+ initialize_directions = SOUTH|NORTH|EAST
+
+ //node 3 is the outlet, nodes 1 & 2 are intakes
+
+obj/machinery/atmospherics/trinary/mixer/m_mixer/New()
+ ..()
+ switch(dir)
+ if(NORTH)
+ initialize_directions = WEST|NORTH|SOUTH
+ if(SOUTH)
+ initialize_directions = SOUTH|EAST|NORTH
+ if(EAST)
+ initialize_directions = EAST|WEST|NORTH
+ if(WEST)
+ initialize_directions = WEST|SOUTH|EAST
+
+obj/machinery/atmospherics/trinary/mixer/m_mixer/initialize()
+ if(node1 && node2 && node3) return
+
+ var/node1_connect = turn(dir, -180)
+ var/node2_connect = turn(dir, 90)
+ var/node3_connect = dir
+
+ for(var/obj/machinery/atmospherics/target in get_step(src,node1_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ node1 = target
+ break
+
+ for(var/obj/machinery/atmospherics/target in get_step(src,node2_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ node2 = target
+ break
+
+ for(var/obj/machinery/atmospherics/target in get_step(src,node3_connect))
+ if(target.initialize_directions & get_dir(target,src))
+ node3 = target
+ break
+
+ update_icon()
\ No newline at end of file
diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm
index d3e494b2d7..c7829494aa 100644
--- a/code/game/machinery/pipe/construction.dm
+++ b/code/game/machinery/pipe/construction.dm
@@ -27,6 +27,9 @@ Buildable meters
#define PIPE_UP 21
#define PIPE_DOWN 22
///// Z-Level stuff
+#define PIPE_GAS_FILTER_M 23
+#define PIPE_GAS_MIXER_T 24
+#define PIPE_GAS_MIXER_M 25
/obj/item/pipe
name = "pipe"
@@ -71,6 +74,12 @@ Buildable meters
src.pipe_type = PIPE_MVALVE
else if(istype(make_from, /obj/machinery/atmospherics/binary/pump))
src.pipe_type = PIPE_PUMP
+ else if(istype(make_from, /obj/machinery/atmospherics/trinary/filter/m_filter))
+ src.pipe_type = PIPE_GAS_FILTER_M
+ else if(istype(make_from, /obj/machinery/atmospherics/trinary/mixer/t_mixer))
+ src.pipe_type = PIPE_GAS_MIXER_T
+ else if(istype(make_from, /obj/machinery/atmospherics/trinary/mixer/m_mixer))
+ src.pipe_type = PIPE_GAS_MIXER_M
else if(istype(make_from, /obj/machinery/atmospherics/trinary/filter))
src.pipe_type = PIPE_GAS_FILTER
else if(istype(make_from, /obj/machinery/atmospherics/trinary/mixer))
@@ -132,6 +141,9 @@ Buildable meters
"pipe up", \
"pipe down", \
///// Z-Level stuff
+ "gas filter m", \
+ "gas mixer t", \
+ "gas mixer m", \
)
name = nlist[pipe_type+1] + " fitting"
var/list/islist = list( \
@@ -160,6 +172,9 @@ Buildable meters
"cap", \
"cap", \
///// Z-Level stuff
+ "m_filter", \
+ "t_mixer", \
+ "m_mixer", \
)
icon_state = islist[pipe_type + 1]
@@ -230,6 +245,10 @@ Buildable meters
return flip|cw|acw
if(PIPE_GAS_FILTER, PIPE_GAS_MIXER,PIPE_MTVALVE)
return dir|flip|cw
+ if(PIPE_GAS_FILTER_M, PIPE_GAS_MIXER_M)
+ return dir|flip|acw
+ if(PIPE_GAS_MIXER_T)
+ return dir|cw|acw
if(PIPE_CAP)
return flip
///// Z-Level stuff
@@ -490,7 +509,7 @@ Buildable meters
P.node3.initialize()
P.node3.build_network()
- if(PIPE_GAS_MIXER) //gas filter
+ if(PIPE_GAS_MIXER) //gas mixer
var/obj/machinery/atmospherics/trinary/mixer/P = new(src.loc)
P.dir = dir
P.initialize_directions = pipe_dir
@@ -510,6 +529,66 @@ Buildable meters
P.node3.initialize()
P.node3.build_network()
+ if(PIPE_GAS_FILTER_M) //gas filter mirrored
+ var/obj/machinery/atmospherics/trinary/filter/m_filter/P = new(src.loc)
+ P.dir = dir
+ P.initialize_directions = pipe_dir
+ if (pipename)
+ P.name = pipename
+ var/turf/T = P.loc
+ P.level = T.intact ? 2 : 1
+ P.initialize()
+ P.build_network()
+ if (P.node1)
+ P.node1.initialize()
+ P.node1.build_network()
+ if (P.node2)
+ P.node2.initialize()
+ P.node2.build_network()
+ if (P.node3)
+ P.node3.initialize()
+ P.node3.build_network()
+
+ if(PIPE_GAS_MIXER_T) //gas mixer-t
+ var/obj/machinery/atmospherics/trinary/mixer/t_mixer/P = new(src.loc)
+ P.dir = dir
+ P.initialize_directions = pipe_dir
+ if (pipename)
+ P.name = pipename
+ var/turf/T = P.loc
+ P.level = T.intact ? 2 : 1
+ P.initialize()
+ P.build_network()
+ if (P.node1)
+ P.node1.initialize()
+ P.node1.build_network()
+ if (P.node2)
+ P.node2.initialize()
+ P.node2.build_network()
+ if (P.node3)
+ P.node3.initialize()
+ P.node3.build_network()
+
+ if(PIPE_GAS_MIXER_M) //gas mixer mirrored
+ var/obj/machinery/atmospherics/trinary/mixer/m_mixer/P = new(src.loc)
+ P.dir = dir
+ P.initialize_directions = pipe_dir
+ if (pipename)
+ P.name = pipename
+ var/turf/T = P.loc
+ P.level = T.intact ? 2 : 1
+ P.initialize()
+ P.build_network()
+ if (P.node1)
+ P.node1.initialize()
+ P.node1.build_network()
+ if (P.node2)
+ P.node2.initialize()
+ P.node2.build_network()
+ if (P.node3)
+ P.node3.initialize()
+ P.node3.build_network()
+
if(PIPE_SCRUBBER) //scrubber
var/obj/machinery/atmospherics/unary/vent_scrubber/S = new(src.loc)
S.dir = dir
@@ -709,4 +788,7 @@ Buildable meters
#undef PIPE_VOLUME_PUMP
#undef PIPE_OUTLET_INJECT
#undef PIPE_MTVALVE
+#undef PIPE_GAS_FILTER_M
+#undef PIPE_GAS_MIXER_T
+#undef PIPE_GAS_MIXER_M
//#undef PIPE_MANIFOLD4W
diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm
index bf6233f4d4..558f54118c 100644
--- a/code/game/machinery/pipe/pipe_dispenser.dm
+++ b/code/game/machinery/pipe/pipe_dispenser.dm
@@ -34,7 +34,10 @@
Scrubber
Meter
Gas Filter
+Gas Filter-Mirrored
Gas Mixer
+Gas Mixer-Mirrored
+Gas Mixer-T
Heat exchange:
Pipe
Bent Pipe
diff --git a/icons/obj/atmospherics/m_filter.dmi b/icons/obj/atmospherics/m_filter.dmi
new file mode 100644
index 0000000000..70261633eb
Binary files /dev/null and b/icons/obj/atmospherics/m_filter.dmi differ
diff --git a/icons/obj/atmospherics/m_mixer.dmi b/icons/obj/atmospherics/m_mixer.dmi
new file mode 100644
index 0000000000..81c6bbb5e1
Binary files /dev/null and b/icons/obj/atmospherics/m_mixer.dmi differ
diff --git a/icons/obj/atmospherics/t_mixer.dmi b/icons/obj/atmospherics/t_mixer.dmi
new file mode 100644
index 0000000000..1535a52ee3
Binary files /dev/null and b/icons/obj/atmospherics/t_mixer.dmi differ
diff --git a/icons/obj/pipe-item.dmi b/icons/obj/pipe-item.dmi
index 7aad691051..65a10a3055 100644
Binary files a/icons/obj/pipe-item.dmi and b/icons/obj/pipe-item.dmi differ