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:
@@ -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);
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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}."),
|
||||
|
||||
4
Resources/Changelog/Parts/edge_firelocks.yml
Normal file
4
Resources/Changelog/Parts/edge_firelocks.yml
Normal 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.
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user