diff --git a/Content.Server/Tools/Components/LayerChangeOnWeldComponent.cs b/Content.Server/Tools/Components/LayerChangeOnWeldComponent.cs new file mode 100644 index 0000000000..d7da170c00 --- /dev/null +++ b/Content.Server/Tools/Components/LayerChangeOnWeldComponent.cs @@ -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; +} diff --git a/Content.Server/Tools/Systems/WeldableSystem.cs b/Content.Server/Tools/Systems/WeldableSystem.cs index ced618ad02..994a4c5e8f 100644 --- a/Content.Server/Tools/Systems/WeldableSystem.cs +++ b/Content.Server/Tools/Systems/WeldableSystem.cs @@ -5,6 +5,8 @@ using Content.Shared.Examine; using Content.Shared.Interaction; using Content.Shared.Tools; using Content.Shared.Tools.Components; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Systems; namespace Content.Server.Tools.Systems; @@ -13,6 +15,7 @@ public sealed class WeldableSystem : EntitySystem [Dependency] private readonly IAdminLogManager _adminLogger = default!; [Dependency] private readonly SharedToolSystem _toolSystem = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedPhysicsSystem _physics = default!; public override void Initialize() { @@ -20,6 +23,7 @@ public sealed class WeldableSystem : EntitySystem SubscribeLocalEvent(OnInteractUsing); SubscribeLocalEvent(OnWeldFinished); SubscribeLocalEvent(OnWeldCanceled); + SubscribeLocalEvent(OnWeldChanged); SubscribeLocalEvent(OnExamine); } @@ -96,6 +100,26 @@ public sealed class WeldableSystem : EntitySystem component.BeingWelded = false; } + private void OnWeldChanged(EntityUid uid, LayerChangeOnWeldComponent component, WeldableChangedEvent args) + { + if (!TryComp(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) { if (!Resolve(uid, ref component)) diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/airlocks.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/airlocks.yml index ac83941153..6d7324edf7 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/airlocks.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/airlocks.yml @@ -114,6 +114,9 @@ - FullTileMask layer: #removed opaque from the layer, allowing lasers to pass through glass airlocks - GlassAirlockLayer + - type: LayerChangeOnWeld + unWeldedLayer: GlassAirlockLayer + weldedLayer: GlassLayer - type: Construction graph: Airlock node: glassAirlock diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml index 87ae5619e0..97a4023a01 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml @@ -41,6 +41,9 @@ - FullTileMask layer: - AirlockLayer + - type: LayerChangeOnWeld + unWeldedLayer: AirlockLayer + weldedLayer: WallLayer - type: ContainerFill containers: board: [ DoorElectronics ]