Improves AirtightComponent.

- Atmos now nulls air in fully airblocked tiles ONLY if one of the airtight entities in it has NoAirWhenFullyAirBlocked to true.
- Fixes edge firelocks atmos airtight direction
- Fixes atmos debug overlay not accounting for angle 0 being south.
This commit is contained in:
Vera Aguilera Puerto
2021-03-08 14:57:05 +01:00
parent ca8a2e4502
commit d86623eed7
7 changed files with 35 additions and 10 deletions

View File

@@ -105,7 +105,8 @@ namespace Content.Client.Atmos
{
if (data.BlockDirection.HasFlag(dir))
{
var atmosAngle = dir.ToAngle();
// Account for South being 0.
var atmosAngle = dir.ToAngle() - Angle.FromDegrees(90);
var atmosAngleOfs = atmosAngle.ToVec() * 0.45f;
var atmosAngleOfsR90 = new Vector2(atmosAngleOfs.Y, -atmosAngleOfs.X);
var tileCentre = new Vector2(tile.X + 0.5f, tile.Y + 0.5f);
@@ -121,7 +122,8 @@ namespace Content.Client.Atmos
// -- Pressure Direction --
if (data.PressureDirection != AtmosDirection.Invalid)
{
var atmosAngle = data.PressureDirection.ToAngle();
// Account for South being 0.
var atmosAngle = data.PressureDirection.ToAngle() - Angle.FromDegrees(90);
var atmosAngleOfs = atmosAngle.ToVec() * 0.4f;
var tileCentre = new Vector2(tile.X + 0.5f, tile.Y + 0.5f);
var basisA = mapGrid.LocalToWorld(tileCentre);

View File

@@ -39,6 +39,10 @@ namespace Content.Server.GameObjects.Components.Atmos
[DataField("fixAirBlockedDirectionInitialize")]
private bool _fixAirBlockedDirectionInitialize = true;
[ViewVariables]
[field: DataField("noAirWhenFullyAirBlocked")]
public bool NoAirWhenFullyAirBlocked { get; } = true;
[ViewVariables(VVAccess.ReadWrite)]
public bool AirBlocked
{
@@ -78,7 +82,7 @@ namespace Content.Server.GameObjects.Components.Atmos
Owner.EnsureComponentWarn(out SnapGridComponent _);
if (_fixAirBlockedDirectionInitialize)
RotateEvent(new RotateEvent(Owner, Angle.Zero, Owner.Transform.LocalRotation));
RotateEvent(new RotateEvent(Owner, Angle.Zero, Owner.Transform.WorldRotation));
UpdatePosition();
}

View File

@@ -288,7 +288,19 @@ namespace Content.Server.GameObjects.Components.Atmos
} else if (isAirBlocked)
{
tile.Air = null;
var nullAir = false;
foreach (var airtight in GetObstructingComponents(indices))
{
if (airtight.NoAirWhenFullyAirBlocked)
{
nullAir = true;
break;
}
}
if(nullAir)
tile.Air = null;
}
else
{

View File

@@ -90,12 +90,12 @@ namespace Content.Shared.Atmos
{
AtmosDirection.East => Angle.FromDegrees(90),
AtmosDirection.North => Angle.FromDegrees(180),
AtmosDirection.West => Angle.FromDegrees(-90),
AtmosDirection.West => Angle.FromDegrees(270),
AtmosDirection.South => Angle.FromDegrees(0),
AtmosDirection.NorthEast => Angle.FromDegrees(135),
AtmosDirection.NorthWest => Angle.FromDegrees(-135),
AtmosDirection.SouthWest => Angle.FromDegrees(-45),
AtmosDirection.NorthWest => Angle.FromDegrees(205),
AtmosDirection.SouthWest => Angle.FromDegrees(315),
AtmosDirection.SouthEast => Angle.FromDegrees(45),
_ => throw new ArgumentOutOfRangeException(nameof(direction), $"It was {direction}."),

View File

@@ -0,0 +1,4 @@
author: Zumorica
changes:
- type: Fix
message: Having four edge firelocks in a single tile no longer destroys any air within it.

View File

@@ -53,6 +53,7 @@
openTimeTwo: 0.6
startOpen: true
bumpOpen: false
inhibitCrush: false
- type: Firelock
- type: Appearance
visuals:
@@ -88,6 +89,7 @@
components:
- type: Door
occludes: false
inhibitCrush: false
- type: Occluder
enabled: false
- type: Sprite
@@ -100,13 +102,14 @@
components:
- type: Door
occludes: false
inhibitCrush: true
inhibitCrush: false
- type: Sprite
sprite: Constructible/Structures/Doors/edge_door_hazard.rsi
- type: Airtight
fixVacuum: true
noAirWhenFullyAirBlocked: false
airBlockedDirection:
- East
- South
- type: Physics
fixtures:
- shape:

View File

@@ -18,7 +18,7 @@ void fragment() {
highp vec4 grad = vec4(0.8 - length( uv - center )/res_xy.y * gradientfalloffwidth);
highp vec4 layer1 = vec4(vec3(255.0),0.0);
highp vec4 layer2 = circle(uv, center, radius, grad.rgb);
COLOR = mix(layer1, layer2, layer2.a);