From b05f5555b3cd0771912c231a5aa8229873e49246 Mon Sep 17 00:00:00 2001 From: Will <7099514+Willburd@users.noreply.github.com> Date: Sun, 24 May 2026 11:42:06 -0400 Subject: [PATCH] meters on any pipe layer (#19484) --- code/ATMOSPHERICS/pipes/pipe_base.dm | 3 +- code/_helpers/atmospherics.dm | 3 +- code/game/machinery/atmoalter/meter.dm | 75 +++++++++++++++++++++----- 3 files changed, 67 insertions(+), 14 deletions(-) diff --git a/code/ATMOSPHERICS/pipes/pipe_base.dm b/code/ATMOSPHERICS/pipes/pipe_base.dm index 1f0745acd4a..f2e6ac3ca4f 100644 --- a/code/ATMOSPHERICS/pipes/pipe_base.dm +++ b/code/ATMOSPHERICS/pipes/pipe_base.dm @@ -116,7 +116,8 @@ if(air_temporary) loc.assume_air(air_temporary) for(var/obj/machinery/meter/meter in loc) - if(meter.target == src) + var/obj/machinery/atmospherics/pipe/target = meter.select_target() + if(target == src) var/obj/item/pipe_meter/PM = new /obj/item/pipe_meter(loc) meter.transfer_fingerprints_to(PM) qdel(meter) diff --git a/code/_helpers/atmospherics.dm b/code/_helpers/atmospherics.dm index 12d68d78f67..129e52d4233 100644 --- a/code/_helpers/atmospherics.dm +++ b/code/_helpers/atmospherics.dm @@ -72,9 +72,10 @@ return atmosanalyzer_scan(src, src.output.air, user) /obj/machinery/meter/atmosanalyze(mob/user) + var/obj/machinery/atmospherics/pipe/target = select_target() var/datum/gas_mixture/mixture = null if(target && target.parent) - mixture = src.target.parent.air + mixture = target.parent.air return atmosanalyzer_scan(src, mixture, user) /obj/machinery/power/rad_collector/atmosanalyze(mob/user) diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index b45aece97fd..b344793d932 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -3,7 +3,6 @@ desc = "It measures something." icon = 'icons/obj/meter.dmi' icon_state = "meterX" - var/obj/machinery/atmospherics/pipe/target = null var/list/pipes_on_turf = list() anchored = TRUE power_channel = ENVIRON @@ -12,27 +11,52 @@ var/open = FALSE use_power = USE_POWER_IDLE idle_power_usage = 15 + var/piping_layer = PIPING_LAYER_DEFAULT + var/datum/weakref/cached_pipe = null -/obj/machinery/meter/Initialize(mapload) +/obj/machinery/meter/Initialize(mapload, pipe_layer_selected) . = ..() - if (!target) - target = select_target() + // Check if we should attach to a pipe OTHER than the regular. + // Don't do this if we have a mapper set pipe layer, or if we are not maploaded. + if(mapload && piping_layer == PIPING_LAYER_DEFAULT) + for(var/obj/machinery/atmospherics/pipe/P in get_turf(src)) + pipe_layer_selected = P.piping_layer // First come first serve + break + // Offset the icon as needed + if(pipe_layer_selected != PIPING_LAYER_DEFAULT) + piping_layer = pipe_layer_selected + update_icon() + // Rename automagically based on the pipelayer it's being made at. + if(!mapload || name == initial(name)) // Check if we have a map edited name first + switch(piping_layer) + if(PIPING_LAYER_SUPPLY) + name = "supply-meter" + if(PIPING_LAYER_SCRUBBER) + name = "scrubber-meter" + if(PIPING_LAYER_FUEL) + name = "fuel-meter" + if(PIPING_LAYER_AUX) + name = "aux-meter" /obj/machinery/meter/Destroy() pipes_on_turf.Cut() - target = null + cached_pipe = null return ..() /obj/machinery/meter/proc/select_target() - var/obj/machinery/atmospherics/pipe/P - for(P in loc) + var/obj/machinery/atmospherics/pipe/P = cached_pipe?.resolve() + if(P) + return P + for(P in get_turf(src)) + if(P.piping_layer != piping_layer) + continue if(!P.hides_under_flooring()) - break - if(!P) - P = locate(/obj/machinery/atmospherics/pipe) in loc - return P + cached_pipe = WEAKREF(P) + return P + return null /obj/machinery/meter/process() + var/obj/machinery/atmospherics/pipe/target = select_target() if(!target) icon_state = "meterX" return 0 @@ -80,7 +104,8 @@ /obj/machinery/meter/examine(mob/user) . = ..() - if(get_dist(user, src) > 3 && !(isAI(user) || isobserver(user))) + var/obj/machinery/atmospherics/pipe/target = select_target() + if(get_dist(user, src) > 6 && !(isAI(user) || isobserver(user))) . += span_warning("You are too far away to read it.") else if(stat & (NOPOWER|BROKEN)) @@ -135,6 +160,7 @@ pipes_on_turf |= P if(!pipes_on_turf.len) return + var/obj/machinery/atmospherics/pipe/target = select_target() target = pipes_on_turf[1] pipes_on_turf.Remove(target) pipes_on_turf.Add(target) @@ -143,6 +169,31 @@ return ..() +/obj/machinery/meter/update_icon() + . = ..() + // Use offsets instead of custom icons + switch(piping_layer) + if(PIPING_LAYER_SUPPLY) + pixel_x = -4 + pixel_y = -4 + name = "supply-meter" + if(PIPING_LAYER_SCRUBBER) + pixel_x = 4 + pixel_y = 4 + name = "scrubber-meter" + if(PIPING_LAYER_FUEL) + pixel_x = 8 + pixel_y = 8 + name = "fuel-meter" + if(PIPING_LAYER_AUX) + pixel_x = -8 + pixel_y = -8 + name = "aux-meter" + else + pixel_x = 0 + pixel_y = 0 + name = initial(name) + // TURF METER - REPORTS A TILE'S AIR CONTENTS /obj/machinery/meter/turf/select_target()