Gas pipe sensors (#33128)
* Initial commit * Monitored pipe node is now referenced by name * Review changes * Simplified construction * Tweaked deconstruction to match other binary atmos devices * Helper function removal * Updated attribution
This commit is contained in:
@@ -48,7 +48,9 @@ public sealed partial class AtmosMonitorComponent : Component
|
||||
[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;
|
||||
|
||||
@@ -65,4 +67,19 @@ public sealed partial class AtmosMonitorComponent : Component
|
||||
/// </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";
|
||||
}
|
||||
|
||||
@@ -4,6 +4,9 @@ using Content.Server.Atmos.Piping.Components;
|
||||
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;
|
||||
@@ -25,6 +28,7 @@ public sealed class AtmosMonitorSystem : EntitySystem
|
||||
[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";
|
||||
@@ -56,8 +60,15 @@ public sealed class AtmosMonitorSystem : EntitySystem
|
||||
|
||||
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)
|
||||
@@ -206,7 +217,7 @@ public sealed class AtmosMonitorSystem : EntitySystem
|
||||
if (!this.IsPowered(uid, EntityManager))
|
||||
return;
|
||||
|
||||
if (args.Grid == null)
|
||||
if (args.Grid == null)
|
||||
return;
|
||||
|
||||
// if we're not monitoring atmos, don't bother
|
||||
@@ -215,6 +226,10 @@ public sealed class AtmosMonitorSystem : EntitySystem
|
||||
&& 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);
|
||||
}
|
||||
|
||||
|
||||
5
Resources/Locale/en-US/atmos/gas-pipe-sensor.ftl
Normal file
5
Resources/Locale/en-US/atmos/gas-pipe-sensor.ftl
Normal file
@@ -0,0 +1,5 @@
|
||||
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
|
||||
@@ -0,0 +1,84 @@
|
||||
- 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
|
||||
@@ -0,0 +1,29 @@
|
||||
- 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
|
||||
@@ -366,6 +366,21 @@
|
||||
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
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 248 B |
Binary file not shown.
|
After Width: | Height: | Size: 83 B |
Binary file not shown.
|
After Width: | Height: | Size: 523 B |
Binary file not shown.
|
After Width: | Height: | Size: 183 B |
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"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
|
||||
]
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user