diff --git a/Content.Server/Security/Components/DeployableBarrierComponent.cs b/Content.Server/Security/Components/DeployableBarrierComponent.cs deleted file mode 100644 index a380eaea7f..0000000000 --- a/Content.Server/Security/Components/DeployableBarrierComponent.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Content.Server.Security.Components; - -[RegisterComponent] -public sealed partial class DeployableBarrierComponent : Component -{ -} - diff --git a/Content.Server/Security/Systems/DeployableBarrierSystem.cs b/Content.Server/Security/Systems/DeployableBarrierSystem.cs deleted file mode 100644 index 729159a8af..0000000000 --- a/Content.Server/Security/Systems/DeployableBarrierSystem.cs +++ /dev/null @@ -1,49 +0,0 @@ -using Content.Server.Pulling; -using Content.Server.Security.Components; -using Content.Shared.Lock; -using Content.Shared.Pulling.Components; -using Content.Shared.Security; -using Robust.Server.GameObjects; - -namespace Content.Server.Security.Systems -{ - public sealed class DeployableBarrierSystem : EntitySystem - { - [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - [Dependency] private readonly PullingSystem _pulling = default!; - - public override void Initialize() - { - base.Initialize(); - SubscribeLocalEvent(OnStartup); - SubscribeLocalEvent(OnLockToggled); - } - - private void OnStartup(EntityUid uid, DeployableBarrierComponent component, ComponentStartup args) - { - if (!TryComp(uid, out LockComponent? lockComponent)) - return; - - ToggleBarrierDeploy(uid, lockComponent.Locked); - } - - private void OnLockToggled(EntityUid uid, DeployableBarrierComponent component, ref LockToggledEvent args) - { - ToggleBarrierDeploy(uid, args.Locked); - } - - private void ToggleBarrierDeploy(EntityUid uid, bool isDeployed) - { - Transform(uid).Anchored = isDeployed; - - var state = isDeployed ? DeployableBarrierState.Deployed : DeployableBarrierState.Idle; - _appearance.SetData(uid, DeployableBarrierVisuals.State, state); - - if (TryComp(uid, out var pullable)) - _pulling.TryStopPull(pullable); - - if (TryComp(uid, out PointLightComponent? light)) - light.Enabled = isDeployed; - } - } -} diff --git a/Content.Shared/Security/Components/DeployableBarrierComponent.cs b/Content.Shared/Security/Components/DeployableBarrierComponent.cs new file mode 100644 index 0000000000..2afcc3c2a9 --- /dev/null +++ b/Content.Shared/Security/Components/DeployableBarrierComponent.cs @@ -0,0 +1,14 @@ +using Content.Shared.Security.Systems; +using Robust.Shared.GameStates; + +namespace Content.Shared.Security.Components; + +[RegisterComponent, NetworkedComponent] +[Access(typeof(DeployableBarrierSystem))] +public sealed partial class DeployableBarrierComponent : Component +{ + /// + /// The fixture to change collision on. + /// + [DataField("fixture", required: true)] public string FixtureId = string.Empty; +} diff --git a/Content.Shared/Security/Systems/DeployableBarrierSystem.cs b/Content.Shared/Security/Systems/DeployableBarrierSystem.cs new file mode 100644 index 0000000000..699889586a --- /dev/null +++ b/Content.Shared/Security/Systems/DeployableBarrierSystem.cs @@ -0,0 +1,67 @@ +using Content.Shared.Lock; +using Content.Shared.Pulling; +using Content.Shared.Pulling.Components; +using Content.Shared.Security.Components; +using Robust.Shared.Physics.Systems; + +namespace Content.Shared.Security.Systems; + +public sealed class DeployableBarrierSystem : EntitySystem +{ + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly FixtureSystem _fixtures = default!; + [Dependency] private readonly SharedPointLightSystem _pointLight = default!; + [Dependency] private readonly SharedPhysicsSystem _physics = default!; + [Dependency] private readonly SharedPullingSystem _pulling = default!; + [Dependency] private readonly SharedTransformSystem _transform = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnLockToggled); + } + + private void OnMapInit(EntityUid uid, DeployableBarrierComponent component, MapInitEvent args) + { + if (!TryComp(uid, out LockComponent? lockComponent)) + return; + + ToggleBarrierDeploy(uid, lockComponent.Locked, component); + } + + private void OnLockToggled(EntityUid uid, DeployableBarrierComponent component, ref LockToggledEvent args) + { + ToggleBarrierDeploy(uid, args.Locked, component); + } + + private void ToggleBarrierDeploy(EntityUid uid, bool isDeployed, DeployableBarrierComponent? component) + { + if (!Resolve(uid, ref component)) + return; + + var transform = Transform(uid); + var fixture = _fixtures.GetFixtureOrNull(uid, component.FixtureId); + + if (isDeployed && transform.GridUid != null) + { + _transform.AnchorEntity(uid, transform); + if (fixture != null) + _physics.SetHard(uid, fixture, true); + } + else + { + _transform.Unanchor(uid, transform); + if (fixture != null) + _physics.SetHard(uid, fixture, false); + } + + var state = isDeployed ? DeployableBarrierState.Deployed : DeployableBarrierState.Idle; + _appearance.SetData(uid, DeployableBarrierVisuals.State, state); + + if (TryComp(uid, out SharedPullableComponent? pullable)) + _pulling.TryStopPull(pullable); + + if (TryComp(uid, out SharedPointLightComponent? light)) + _pointLight.SetEnabled(uid, isDeployed, light); + } +} diff --git a/Resources/Prototypes/Entities/Objects/Specific/Security/barrier.yml b/Resources/Prototypes/Entities/Objects/Specific/Security/barrier.yml index 049a7bb94a..b83b2c8ee2 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Security/barrier.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Security/barrier.yml @@ -5,6 +5,7 @@ parent: BaseStructure components: - type: Transform + anchored: false noRot: true - type: Sprite sprite: Objects/Specific/Security/barrier.rsi @@ -24,21 +25,26 @@ canCollide: false - type: Fixtures fixtures: - fix1: + base: shape: !type:PhysShapeCircle radius: 0.45 density: 75 mask: - MachineMask + barrier: + shape: + !type:PhysShapeCircle + radius: 0.45 layer: - WallLayer + - type: DeployableBarrier + fixture: barrier - type: AccessReader access: [["Security"]] - type: Lock locked: false lockOnClick: true # toggle lock just by clicking on barrier - - type: DeployableBarrier - type: Damageable damageContainer: Inorganic damageModifierSet: Metallic