Welding airlocks changes their layer (#13440)
This commit is contained in:
@@ -0,0 +1,17 @@
|
|||||||
|
using Content.Server.Tools.Systems;
|
||||||
|
using Content.Shared.Physics;
|
||||||
|
|
||||||
|
namespace Content.Server.Tools.Components;
|
||||||
|
|
||||||
|
[RegisterComponent]
|
||||||
|
[Access(typeof(WeldableSystem))]
|
||||||
|
public sealed class LayerChangeOnWeldComponent : Component
|
||||||
|
{
|
||||||
|
[DataField("unWeldedLayer")]
|
||||||
|
[ViewVariables]
|
||||||
|
public CollisionGroup UnWeldedLayer = CollisionGroup.AirlockLayer;
|
||||||
|
|
||||||
|
[DataField("weldedLayer")]
|
||||||
|
[ViewVariables]
|
||||||
|
public CollisionGroup WeldedLayer = CollisionGroup.WallLayer;
|
||||||
|
}
|
||||||
@@ -5,6 +5,8 @@ using Content.Shared.Examine;
|
|||||||
using Content.Shared.Interaction;
|
using Content.Shared.Interaction;
|
||||||
using Content.Shared.Tools;
|
using Content.Shared.Tools;
|
||||||
using Content.Shared.Tools.Components;
|
using Content.Shared.Tools.Components;
|
||||||
|
using Robust.Shared.Physics;
|
||||||
|
using Robust.Shared.Physics.Systems;
|
||||||
|
|
||||||
namespace Content.Server.Tools.Systems;
|
namespace Content.Server.Tools.Systems;
|
||||||
|
|
||||||
@@ -13,6 +15,7 @@ public sealed class WeldableSystem : EntitySystem
|
|||||||
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
|
[Dependency] private readonly IAdminLogManager _adminLogger = default!;
|
||||||
[Dependency] private readonly SharedToolSystem _toolSystem = default!;
|
[Dependency] private readonly SharedToolSystem _toolSystem = default!;
|
||||||
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
[Dependency] private readonly SharedAppearanceSystem _appearance = default!;
|
||||||
|
[Dependency] private readonly SharedPhysicsSystem _physics = default!;
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
{
|
{
|
||||||
@@ -20,6 +23,7 @@ public sealed class WeldableSystem : EntitySystem
|
|||||||
SubscribeLocalEvent<WeldableComponent, InteractUsingEvent>(OnInteractUsing);
|
SubscribeLocalEvent<WeldableComponent, InteractUsingEvent>(OnInteractUsing);
|
||||||
SubscribeLocalEvent<WeldableComponent, WeldFinishedEvent>(OnWeldFinished);
|
SubscribeLocalEvent<WeldableComponent, WeldFinishedEvent>(OnWeldFinished);
|
||||||
SubscribeLocalEvent<WeldableComponent, WeldCancelledEvent>(OnWeldCanceled);
|
SubscribeLocalEvent<WeldableComponent, WeldCancelledEvent>(OnWeldCanceled);
|
||||||
|
SubscribeLocalEvent<LayerChangeOnWeldComponent, WeldableChangedEvent>(OnWeldChanged);
|
||||||
SubscribeLocalEvent<WeldableComponent, ExaminedEvent>(OnExamine);
|
SubscribeLocalEvent<WeldableComponent, ExaminedEvent>(OnExamine);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -96,6 +100,26 @@ public sealed class WeldableSystem : EntitySystem
|
|||||||
component.BeingWelded = false;
|
component.BeingWelded = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnWeldChanged(EntityUid uid, LayerChangeOnWeldComponent component, WeldableChangedEvent args)
|
||||||
|
{
|
||||||
|
if (!TryComp<FixturesComponent>(uid, out var fixtures))
|
||||||
|
return;
|
||||||
|
|
||||||
|
foreach (var fixture in fixtures.Fixtures.Values)
|
||||||
|
{
|
||||||
|
switch (args.IsWelded)
|
||||||
|
{
|
||||||
|
case true when fixture.CollisionLayer == (int) component.UnWeldedLayer:
|
||||||
|
_physics.SetCollisionLayer(uid, fixture, (int) component.WeldedLayer);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case false when fixture.CollisionLayer == (int) component.WeldedLayer:
|
||||||
|
_physics.SetCollisionLayer(uid, fixture, (int) component.UnWeldedLayer);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void UpdateAppearance(EntityUid uid, WeldableComponent? component = null)
|
private void UpdateAppearance(EntityUid uid, WeldableComponent? component = null)
|
||||||
{
|
{
|
||||||
if (!Resolve(uid, ref component))
|
if (!Resolve(uid, ref component))
|
||||||
|
|||||||
@@ -114,6 +114,9 @@
|
|||||||
- FullTileMask
|
- FullTileMask
|
||||||
layer: #removed opaque from the layer, allowing lasers to pass through glass airlocks
|
layer: #removed opaque from the layer, allowing lasers to pass through glass airlocks
|
||||||
- GlassAirlockLayer
|
- GlassAirlockLayer
|
||||||
|
- type: LayerChangeOnWeld
|
||||||
|
unWeldedLayer: GlassAirlockLayer
|
||||||
|
weldedLayer: GlassLayer
|
||||||
- type: Construction
|
- type: Construction
|
||||||
graph: Airlock
|
graph: Airlock
|
||||||
node: glassAirlock
|
node: glassAirlock
|
||||||
|
|||||||
@@ -41,6 +41,9 @@
|
|||||||
- FullTileMask
|
- FullTileMask
|
||||||
layer:
|
layer:
|
||||||
- AirlockLayer
|
- AirlockLayer
|
||||||
|
- type: LayerChangeOnWeld
|
||||||
|
unWeldedLayer: AirlockLayer
|
||||||
|
weldedLayer: WallLayer
|
||||||
- type: ContainerFill
|
- type: ContainerFill
|
||||||
containers:
|
containers:
|
||||||
board: [ DoorElectronics ]
|
board: [ DoorElectronics ]
|
||||||
|
|||||||
Reference in New Issue
Block a user