Make pipes leak when destroyed (#20928)

This plugs a meta where atmos techs were fireaxing pipes to remove them without leaking their contents.
This commit is contained in:
Kevin Zheng 2023-12-10 23:51:45 -08:00 committed by Debug
parent 3e1b67be59
commit ce2a7222d6
5 changed files with 82 additions and 3 deletions

View File

@ -5,6 +5,7 @@ using Content.Server.NodeContainer.Nodes;
using Content.Server.Popups;
using Content.Shared.Atmos;
using Content.Shared.Construction.Components;
using Content.Shared.Destructible;
using Content.Shared.Popups;
using JetBrains.Annotations;
using Robust.Shared.Player;
@ -21,6 +22,7 @@ namespace Content.Server.Atmos.Piping.EntitySystems
{
SubscribeLocalEvent<AtmosUnsafeUnanchorComponent, BeforeUnanchoredEvent>(OnBeforeUnanchored);
SubscribeLocalEvent<AtmosUnsafeUnanchorComponent, UnanchorAttemptEvent>(OnUnanchorAttempt);
SubscribeLocalEvent<AtmosUnsafeUnanchorComponent, BreakageEventArgs>(OnBreak);
}
private void OnUnanchorAttempt(EntityUid uid, AtmosUnsafeUnanchorComponent component, UnanchorAttemptEvent args)
@ -48,7 +50,24 @@ namespace Content.Server.Atmos.Piping.EntitySystems
private void OnBeforeUnanchored(EntityUid uid, AtmosUnsafeUnanchorComponent component, BeforeUnanchoredEvent args)
{
if (!component.Enabled || !EntityManager.TryGetComponent(uid, out NodeContainerComponent? nodes))
if (component.Enabled)
LeakGas(uid);
}
private void OnBreak(EntityUid uid, AtmosUnsafeUnanchorComponent component, BreakageEventArgs args)
{
LeakGas(uid);
// Can't use DoActsBehavior["Destruction"] in the same trigger because that would prevent us
// from leaking. So we make up for this by queueing deletion here.
QueueDel(uid);
}
/// <summary>
/// Leak gas from the uid's NodeContainer into the tile atmosphere.
/// </summary>
public void LeakGas(EntityUid uid)
{
if (!EntityManager.TryGetComponent(uid, out NodeContainerComponent? nodes))
return;
if (_atmosphere.GetContainingMixture(uid, true, true) is not {} environment)

View File

@ -21,12 +21,27 @@
- type: Rotatable
- type: Destructible
thresholds:
- trigger:
- trigger: # for nukes
!type:DamageTrigger
damage: 100
damage: 200
behaviors:
- !type:DoActsBehavior
acts: ["Destruction"]
- trigger: # regular damage trigger (replace with broken pipe)
!type:DamageTrigger
damage: 100
behaviors:
- !type:PlaySoundBehavior
sound:
path: /Audio/Effects/metalbreak.ogg
- !type:SpawnEntitiesBehavior
spawn:
GasPipeBroken:
min: 1
max: 1
offset: 0
- !type:DoActsBehavior
acts: ["Breakage"]
- type: Sprite
sprite: Structures/Piping/Atmospherics/pipe.rsi
drawdepth: ThinPipe
@ -149,3 +164,28 @@
- type: Construction
graph: GasPipe
node: fourway
- type: entity
id: GasPipeBroken
parent: GasPipeBase
name: broken pipe
description: It used to hold gas.
components:
- type: Sprite
sprite: Structures/Piping/Atmospherics/pipe.rsi
drawdepth: ThinPipe
state: pipeBroken
layers:
- state: pipeBroken
map: [ "enum.PipeVisualLayers.Pipe" ]
- type: Construction
graph: GasPipe
node: broken
- type: Destructible
thresholds: # override parent to avoid recursive destruction
- trigger:
!type:DamageTrigger
damage: 100
behaviors:
- !type:DoActsBehavior
acts: ["Destruction"]

View File

@ -113,3 +113,19 @@
steps:
- tool: Welding
doAfter: 1
- node: broken
entity: GasPipeBroken
edges:
- to: start
conditions:
- !type:EntityAnchored
anchored: false
completed:
- !type:SpawnPrototype
prototype: SheetSteel1
amount: 1
- !type:DeleteEntity
steps:
- tool: Welding
doAfter: 1

View File

@ -7,6 +7,10 @@
"license":"CC-BY-SA-3.0",
"copyright":"pipeTrinaryConnectors made by Menshin for SS14 based on pipeTJunction, the rest is taken from https://github.com/tgstation/tgstation at commit 57cd1d59ca019dd0e7811ac451f295f818e573da",
"states":[
{
"name":"pipeBroken",
"directions":1
},
{
"name":"pipeTJunction",
"directions":4

Binary file not shown.

After

Width:  |  Height:  |  Size: 643 B