--- /dev/null
+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;
+}
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;
[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()
{
SubscribeLocalEvent<WeldableComponent, InteractUsingEvent>(OnInteractUsing);
SubscribeLocalEvent<WeldableComponent, WeldFinishedEvent>(OnWeldFinished);
SubscribeLocalEvent<WeldableComponent, WeldCancelledEvent>(OnWeldCanceled);
+ SubscribeLocalEvent<LayerChangeOnWeldComponent, WeldableChangedEvent>(OnWeldChanged);
SubscribeLocalEvent<WeldableComponent, ExaminedEvent>(OnExamine);
}
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)
{
if (!Resolve(uid, ref component))