Disposals air + new atmos expose event (#6798)

Co-authored-by: Vera Aguilera Puerto <6766154+Zumorica@users.noreply.github.com>
This commit is contained in:
mirrorcult
2022-02-19 17:42:01 -07:00
committed by GitHub
parent f23386ac55
commit 3e6bf54727
7 changed files with 77 additions and 5 deletions

View File

@@ -24,4 +24,10 @@ namespace Content.Server.Atmos.EntitySystems
GasMixture = mixture; GasMixture = mixture;
} }
} }
[ByRefEvent]
public struct AtmosExposedGetAirEvent
{
public GasMixture? Gas;
}
} }

View File

@@ -85,9 +85,15 @@ namespace Content.Server.Atmos.EntitySystems
foreach (var (exposed, transform) in EntityManager.EntityQuery<AtmosExposedComponent, TransformComponent>()) foreach (var (exposed, transform) in EntityManager.EntityQuery<AtmosExposedComponent, TransformComponent>())
{ {
var tile = GetTileMixture(transform.Coordinates); // Used for things like disposals/cryo to change which air people are exposed to.
if (tile == null) continue; var airEvent = new AtmosExposedGetAirEvent();
var updateEvent = new AtmosExposedUpdateEvent(transform.Coordinates, tile); RaiseLocalEvent(exposed.Owner, ref airEvent, false);
airEvent.Gas ??= GetTileMixture(transform.Coordinates);
if (airEvent.Gas == null)
continue;
var updateEvent = new AtmosExposedUpdateEvent(transform.Coordinates, airEvent.Gas);
RaiseLocalEvent(exposed.Owner, ref updateEvent); RaiseLocalEvent(exposed.Owner, ref updateEvent);
} }

View File

@@ -0,0 +1,11 @@
namespace Content.Server.Disposal.Unit.Components;
/// <summary>
/// A component added to entities that are currently in disposals.
/// </summary>
[RegisterComponent]
public sealed class BeingDisposedComponent : Component
{
[ViewVariables]
public EntityUid Holder;
}

View File

@@ -63,7 +63,7 @@ namespace Content.Server.Disposal.Unit.Components
[ViewVariables] [ViewVariables]
[DataField("air")] [DataField("air")]
public GasMixture Air { get; set; } = new GasMixture(Atmospherics.CellVolume); public GasMixture Air { get; set; } = new (70);
protected override void Initialize() protected override void Initialize()
{ {

View File

@@ -0,0 +1,40 @@
using Content.Server.Atmos.EntitySystems;
using Content.Server.Disposal.Unit.Components;
namespace Content.Server.Disposal.Unit.EntitySystems;
public sealed class BeingDisposedSystem : EntitySystem
{
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<BeingDisposedComponent, InhaleLocationEvent>(OnInhaleLocation);
SubscribeLocalEvent<BeingDisposedComponent, ExhaleLocationEvent>(OnExhaleLocation);
SubscribeLocalEvent<BeingDisposedComponent, AtmosExposedGetAirEvent>(OnGetAir);
}
private void OnGetAir(EntityUid uid, BeingDisposedComponent component, ref AtmosExposedGetAirEvent args)
{
if (TryComp<DisposalHolderComponent>(component.Holder, out var holder))
{
args.Gas = holder.Air;
}
}
private void OnInhaleLocation(EntityUid uid, BeingDisposedComponent component, InhaleLocationEvent args)
{
if (TryComp<DisposalHolderComponent>(component.Holder, out var holder))
{
args.Gas = holder.Air;
}
}
private void OnExhaleLocation(EntityUid uid, BeingDisposedComponent component, ExhaleLocationEvent args)
{
if (TryComp<DisposalHolderComponent>(component.Holder, out var holder))
{
args.Gas = holder.Air;
}
}
}

View File

@@ -47,6 +47,9 @@ namespace Content.Server.Disposal.Unit.EntitySystems
foreach (var entity in holder.Container.ContainedEntities.ToArray()) foreach (var entity in holder.Container.ContainedEntities.ToArray())
{ {
if (HasComp<BeingDisposedComponent>(entity))
RemComp <BeingDisposedComponent>(entity);
if (EntityManager.TryGetComponent(entity, out IPhysBody? physics)) if (EntityManager.TryGetComponent(entity, out IPhysBody? physics))
{ {
physics.CanCollide = true; physics.CanCollide = true;
@@ -101,6 +104,12 @@ namespace Content.Server.Disposal.Unit.EntitySystems
return false; return false;
} }
foreach (var ent in holder.Container.ContainedEntities)
{
var comp = EnsureComp<BeingDisposedComponent>(ent);
comp.Holder = holder.Owner;
}
// Insert into next tube // Insert into next tube
holderTransform.Coordinates = new EntityCoordinates(toUid, Vector2.Zero); holderTransform.Coordinates = new EntityCoordinates(toUid, Vector2.Zero);
if (!to.Contents.Insert(holder.Owner)) if (!to.Contents.Insert(holder.Owner))

View File

@@ -486,7 +486,7 @@ namespace Content.Server.Disposal.Unit.EntitySystems
if (_atmosSystem.GetTileMixture(EntityManager.GetComponent<TransformComponent>(component.Owner).Coordinates, true) is {Temperature: > 0} environment) if (_atmosSystem.GetTileMixture(EntityManager.GetComponent<TransformComponent>(component.Owner).Coordinates, true) is {Temperature: > 0} environment)
{ {
var transferMoles = 0.1f * (0.05f * Atmospherics.OneAtmosphere * 1.01f - air.Pressure) * air.Volume / (environment.Temperature * Atmospherics.R); var transferMoles = 0.1f * (0.25f * Atmospherics.OneAtmosphere * 1.01f - air.Pressure) * air.Volume / (environment.Temperature * Atmospherics.R);
component.Air = environment.Remove(transferMoles); component.Air = environment.Remove(transferMoles);
} }