[DataField("gasThresholds")]
public Dictionary<Gas, AtmosAlarmThreshold>? GasThresholds;
- // Stores a reference to the gas on the tile this is on.
+ /// <summary>
+ /// Stores a reference to the gas on the tile this entity is on (or the pipe network it monitors; see <see cref="MonitorsPipeNet"/>).
+ /// </summary>
[ViewVariables]
public GasMixture? TileGas;
/// </summary>
[DataField("registeredDevices")]
public HashSet<string> RegisteredDevices = new();
+
+ /// <summary>
+ /// Specifies whether this device monitors its own internal pipe network rather than the surrounding atmosphere.
+ /// </summary>
+ /// <remarks>
+ /// If 'true', the entity will require a NodeContainerComponent with one or more PipeNodes to function.
+ /// </remarks>
+ [DataField]
+ public bool MonitorsPipeNet = false;
+
+ /// <summary>
+ /// Specifies the name of the pipe node that this device is monitoring.
+ /// </summary>
+ [DataField]
+ public string NodeNameMonitoredPipe = "monitored";
}
using Content.Server.Atmos.Piping.EntitySystems;
using Content.Server.DeviceNetwork;
using Content.Server.DeviceNetwork.Systems;
+using Content.Server.NodeContainer;
+using Content.Server.NodeContainer.EntitySystems;
+using Content.Server.NodeContainer.Nodes;
using Content.Server.Power.Components;
using Content.Server.Power.EntitySystems;
using Content.Shared.Atmos;
[Dependency] private readonly AtmosDeviceSystem _atmosDeviceSystem = default!;
[Dependency] private readonly DeviceNetworkSystem _deviceNetSystem = default!;
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
+ [Dependency] private readonly NodeContainerSystem _nodeContainerSystem = default!;
// Commands
public const string AtmosMonitorSetThresholdCmd = "atmos_monitor_set_threshold";
private void OnAtmosDeviceEnterAtmosphere(EntityUid uid, AtmosMonitorComponent atmosMonitor, ref AtmosDeviceEnabledEvent args)
{
+ if (atmosMonitor.MonitorsPipeNet && _nodeContainerSystem.TryGetNode<PipeNode>(uid, atmosMonitor.NodeNameMonitoredPipe, out var pipeNode))
+ {
+ atmosMonitor.TileGas = pipeNode.Air;
+ return;
+ }
+
atmosMonitor.TileGas = _atmosphereSystem.GetContainingMixture(uid, true);
}
+
private void OnMapInit(EntityUid uid, AtmosMonitorComponent component, MapInitEvent args)
{
if (component.TemperatureThresholdId != null)
if (!this.IsPowered(uid, EntityManager))
return;
- if (args.Grid == null)
+ if (args.Grid == null)
return;
// if we're not monitoring atmos, don't bother
&& component.GasThresholds == null)
return;
+ // If monitoring a pipe network, get its most recent gas mixture
+ if (component.MonitorsPipeNet && _nodeContainerSystem.TryGetNode<PipeNode>(uid, component.NodeNameMonitoredPipe, out var pipeNode))
+ component.TileGas = pipeNode.Air;
+
UpdateState(uid, component.TileGas, component);
}
--- /dev/null
+gas-pipe-sensor-distribution-loop = Distribution loop
+gas-pipe-sensor-waste-loop = Waste loop
+gas-pipe-sensor-mixed-air = Mixed air
+gas-pipe-sensor-teg-hot-loop = TEG hot loop
+gas-pipe-sensor-teg-cold-loop = TEG cold loop
--- /dev/null
+- type: entity
+ parent: [AirSensorBase, GasPipeBase]
+ id: GasPipeSensor
+ name: gas pipe sensor
+ description: Reports on the status of the gas in the attached pipe network.
+ placement:
+ mode: SnapgridCenter
+ components:
+ - type: Sprite
+ sprite: Structures/Piping/Atmospherics/gas_pipe_sensor.rsi
+ drawdepth: BelowFloor
+ layers:
+ - sprite: Structures/Piping/Atmospherics/pipe.rsi
+ map: [ "enum.PipeVisualLayers.Pipe" ]
+ state: pipeStraight
+ - map: ["base"]
+ state: base
+ - map: [ "enum.PowerDeviceVisualLayers.Powered" ]
+ state: lights
+ shader: unshaded
+ - type: Appearance
+ - type: GenericVisualizer
+ visuals:
+ enum.PowerDeviceVisuals.Powered:
+ enum.PowerDeviceVisualLayers.Powered:
+ False: { state: blank }
+ True: { state: lights }
+ - type: AtmosMonitor
+ monitorsPipeNet: true
+ - type: ApcPowerReceiver
+ - type: ExtensionCableReceiver
+ - type: Construction
+ graph: GasPipeSensor
+ node: sensor
+ - type: NodeContainer
+ nodes:
+ monitored:
+ !type:PipeNode
+ nodeGroupID: Pipe
+ pipeDirection: Longitudinal
+ - type: Tag
+ tags:
+ - AirSensor
+ - Unstackable
+
+- type: entity
+ parent: GasPipeSensor
+ id: GasPipeSensorDistribution
+ suffix: Distribution
+ components:
+ - type: Label
+ currentLabel: gas-pipe-sensor-distribution-loop
+
+- type: entity
+ parent: GasPipeSensor
+ id: GasPipeSensorWaste
+ suffix: Waste
+ components:
+ - type: Label
+ currentLabel: gas-pipe-sensor-waste-loop
+
+- type: entity
+ parent: GasPipeSensor
+ id: GasPipeSensorMixedAir
+ suffix: Mixed air
+ components:
+ - type: Label
+ currentLabel: gas-pipe-sensor-mixed-air
+
+- type: entity
+ parent: GasPipeSensor
+ id: GasPipeSensorTEGHot
+ suffix: TEG hot
+ components:
+ - type: Label
+ currentLabel: gas-pipe-sensor-teg-hot-loop
+
+- type: entity
+ parent: GasPipeSensor
+ id: GasPipeSensorTEGCold
+ suffix: TEG cold
+ components:
+ - type: Label
+ currentLabel: gas-pipe-sensor-teg-cold-loop
\ No newline at end of file
--- /dev/null
+- type: constructionGraph
+ id: GasPipeSensor
+ start: start
+ graph:
+ - node: start
+ edges:
+ - to: sensor
+ steps:
+ - material: Steel
+ amount: 2
+ doAfter: 1
+
+ - node: sensor
+ entity: GasPipeSensor
+ actions:
+ - !type:SetAnchor
+ edges:
+ - to: start
+ completed:
+ - !type:SpawnPrototype
+ prototype: SheetSteel1
+ amount: 2
+ - !type:DeleteEntity
+ conditions:
+ - !type:EntityAnchored
+ anchored: false
+ steps:
+ - tool: Welding
+ doAfter: 1
\ No newline at end of file
objectType: Structure
canRotate: true
+- type: construction
+ name: gas pipe sensor
+ id: GasPipeSensor
+ graph: GasPipeSensor
+ startNode: start
+ targetNode: sensor
+ category: construction-category-structures
+ description: Reports on the status of the gas within the attached pipe network.
+ icon:
+ sprite: Structures/Piping/Atmospherics/gas_pipe_sensor.rsi
+ state: icon
+ placementMode: SnapgridCenter
+ objectType: Structure
+ canRotate: true
+
# ATMOS PIPES
- type: construction
name: gas pipe half
--- /dev/null
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Created by chromiumboy (github) for SS14, based on the digital valve from /tg/, taken from https://github.com/tgstation/tgstation at commit 57cd1d59ca019dd0e7811ac451f295f818e573da.",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ },
+ {
+ "name": "base"
+ },
+ {
+ "name": "blank"
+ },
+ {
+ "name": "lights",
+ "delays": [
+ [
+ 1.0,
+ 0.25
+ ]
+ ]
+ }
+ ]
+}