diff --git a/Content.Server/VentCraw/VentCrawTubeSystem.cs b/Content.Server/VentCraw/VentCrawTubeSystem.cs index ed39eeb549c6..2e298236daf1 100644 --- a/Content.Server/VentCraw/VentCrawTubeSystem.cs +++ b/Content.Server/VentCraw/VentCrawTubeSystem.cs @@ -20,7 +20,7 @@ public sealed class VentCrawTubeSystem : EntitySystem { [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly SharedMapSystem _mapSystem = default!; - [Dependency] private readonly VentCrawableSystem _ventCrawableSystemSystem = default!; + [Dependency] private readonly SharedVentCrawableSystem _ventCrawableSystemSystem = default!; [Dependency] private readonly SharedContainerSystem _containerSystem = default!; [Dependency] private readonly VentCrawTubeSystem _ventCrawTubeSystem = default!; [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; @@ -49,7 +49,7 @@ public override void Initialize() private void AddClimbedVerb(EntityUid uid, VentCrawEntryComponent component, GetVerbsEvent args) { - if (!TryComp(args.User, out var ventCrawlerComponent)) + if (!TryComp(args.User, out var ventCrawlerComponent) || HasComp(args.User)) return; if (TryComp(uid, out var transformComponent) && !transformComponent.Anchored) @@ -170,43 +170,6 @@ private void UpdateAnchored(EntityUid uid, VentCrawTubeComponent component, bool } } - public EntityUid? NextTubeFor(EntityUid target, Direction nextDirection, VentCrawTubeComponent? targetTube = null) - { - if (!Resolve(target, ref targetTube)) - return null; - var oppositeDirection = nextDirection.GetOpposite(); - - var xform = Transform(target); - if (!TryComp(xform.GridUid, out var grid)) - return null; - - if (xform.GridUid == null) - return null; - - var position = xform.Coordinates; - foreach (EntityUid entity in _mapSystem.GetInDir(xform.GridUid.Value, grid ,position, nextDirection)) - { - if (!TryComp(entity, out VentCrawTubeComponent? tube)) - { - continue; - } - - if (!CanConnect(entity, tube, oppositeDirection)) - { - continue; - } - - if (!CanConnect(target, targetTube, nextDirection)) - { - continue; - } - - return entity; - } - - return null; - } - private static void ConnectTube(EntityUid _, VentCrawTubeComponent tube) { if (tube.Connected) @@ -231,20 +194,11 @@ private void DisconnectTube(EntityUid _, VentCrawTubeComponent tube) foreach (var entity in tube.Contents.ContainedEntities.ToArray()) { if (query.TryGetComponent(entity, out var holder)) - _ventCrawableSystemSystem.ExitVentCraws(entity, holder); - } - } - - private bool CanConnect(EntityUid tubeId, VentCrawTubeComponent tube, Direction direction) - { - if (!tube.Connected) - { - return false; + { + var Exitev = new VentCrawExitEvent(); + RaiseLocalEvent(entity, ref Exitev); + } } - - var ev = new GetVentCrawsConnectableDirectionsEvent(); - RaiseLocalEvent(tubeId, ref ev); - return ev.Connectable.Contains(direction); } private bool TryInsert(EntityUid uid, EntityUid entity, VentCrawEntryComponent? entry = null) diff --git a/Content.Server/VentCraw/VentCrawableSystem.cs b/Content.Server/VentCraw/VentCrawableSystem.cs index 56a11835a948..6bcdf6826760 100644 --- a/Content.Server/VentCraw/VentCrawableSystem.cs +++ b/Content.Server/VentCraw/VentCrawableSystem.cs @@ -1,303 +1,75 @@ using System.Linq; using Content.Shared.VentCraw.Tube.Components; using Content.Shared.VentCraw.Components; -using Content.Shared.Body.Components; -using Content.Shared.Tools.Components; -using Content.Shared.Item; -using Content.Shared.Movement.Events; using Content.Shared.VentCraw; -using Robust.Shared.Audio.Systems; -using Robust.Shared.Containers; using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Systems; -using Robust.Shared.Timing; +using Robust.Shared.Containers; + +namespace Content.Server.VentCraw; -namespace Content.Server.VentCraw +public sealed class VentCrawableSystem : EntitySystem { + [Dependency] private readonly SharedPhysicsSystem _physicsSystem = default!; + [Dependency] private readonly SharedContainerSystem _containerSystem = default!; + [Dependency] private readonly SharedTransformSystem _xformSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnVentCrawExitEvent); + } + /// - /// A system that handles the crawling behavior for vent creatures. + /// Exits the vent craws for the specified VentCrawHolderComponent, removing it and any contained entities from the craws. /// - public sealed class VentCrawableSystem : EntitySystem + /// The EntityUid of the VentCrawHolderComponent. + /// The VentCrawHolderComponent instance. + /// The TransformComponent instance for the VentCrawHolderComponent. + private void OnVentCrawExitEvent(EntityUid uid, VentCrawHolderComponent holder, ref VentCrawExitEvent args) { - [Dependency] private readonly VentCrawTubeSystem _ventCrawTubeSystem = default!; - [Dependency] private readonly SharedPhysicsSystem _physicsSystem = default!; - [Dependency] private readonly SharedContainerSystem _containerSystem = default!; - [Dependency] private readonly SharedTransformSystem _xformSystem = default!; - [Dependency] private readonly IGameTiming _gameTiming = default!; - [Dependency] private readonly SharedAudioSystem _audioSystem = default!; - - public override void Initialize() - { - base.Initialize(); + var holderTransform = args.holderTransform; + + if (Terminating(uid)) + return; - SubscribeLocalEvent(OnComponentStartup); - SubscribeLocalEvent(OnMoveInput); - } + if (!Resolve(uid, ref holderTransform)) + return; - /// - /// Handles the MoveInputEvent for VentCrawHolderComponent. - /// - /// The EntityUid of the VentCrawHolderComponent. - /// The VentCrawHolderComponent instance. - /// The MoveInputEvent arguments. - private void OnMoveInput(EntityUid uid, VentCrawHolderComponent component, ref MoveInputEvent args) + if (holder.IsExitingVentCraws) { - if (!TryComp(uid, out var holder)) - return; - - if (!EntityManager.EntityExists(holder.CurrentTube)) - { - ExitVentCraws(uid, holder); - } - - component.IsMoving = args.State; - component.CurrentDirection = args.Dir; + Log.Error("Tried exiting VentCraws twice. This should never happen."); + return; } - /// - /// Handles the ComponentStartup event for VentCrawHolderComponent. - /// - /// The EntityUid of the VentCrawHolderComponent. - /// The VentCrawHolderComponent instance. - /// The ComponentStartup arguments. - private void OnComponentStartup(EntityUid uid, VentCrawHolderComponent holder, ComponentStartup args) - { - holder.Container = _containerSystem.EnsureContainer(uid, nameof(VentCrawHolderComponent)); - } - - /// - /// Tries to insert an entity into the VentCrawHolderComponent container. - /// - /// The EntityUid of the VentCrawHolderComponent. - /// The EntityUid of the entity to insert. - /// The VentCrawHolderComponent instance. - /// True if the insertion was successful, otherwise False. - public bool TryInsert(EntityUid uid, EntityUid toInsert, VentCrawHolderComponent? holder = null) - { - if (!Resolve(uid, ref holder)) - return false; - - if (!CanInsert(uid, toInsert, holder)) - return false; - - if (!_containerSystem.Insert(toInsert, holder.Container)) - return false; - - if (TryComp(toInsert, out var physBody)) - _physicsSystem.SetCanCollide(toInsert, false, body: physBody); - - return true; - } + holder.IsExitingVentCraws = true; - /// - /// Checks whether the specified entity can be inserted into the container of the VentCrawHolderComponent. - /// - /// The EntityUid of the VentCrawHolderComponent. - /// The EntityUid of the entity to be inserted. - /// The VentCrawHolderComponent instance. - /// True if the entity can be inserted into the container; otherwise, False. - private bool CanInsert(EntityUid uid, EntityUid toInsert, VentCrawHolderComponent? holder = null) + foreach (var entity in holder.Container.ContainedEntities.ToArray()) { - if (!Resolve(uid, ref holder)) - return false; + RemComp(entity); - if (!_containerSystem.CanInsert(toInsert, holder.Container)) - { - return false; - } + var meta = MetaData(entity); + _containerSystem.Remove(entity, holder.Container, reparent: false, force: true); - return HasComp(toInsert) || - HasComp(toInsert); - } + var xform = Transform(entity); + if (xform.ParentUid != uid) + continue; - /// - /// Exits the vent craws for the specified VentCrawHolderComponent, removing it and any contained entities from the craws. - /// - /// The EntityUid of the VentCrawHolderComponent. - /// The VentCrawHolderComponent instance. - /// The TransformComponent instance for the VentCrawHolderComponent. - public void ExitVentCraws(EntityUid uid, VentCrawHolderComponent? holder = null, TransformComponent? holderTransform = null) - { - if (Terminating(uid)) - return; + _xformSystem.AttachToGridOrMap(entity, xform); - if (!Resolve(uid, ref holder, ref holderTransform)) - return; - - if (holder.IsExitingVentCraws) + if (TryComp(entity, out var ventCrawComp)) { - Log.Error("Tried exiting VentCraws twice. This should never happen."); - return; + ventCrawComp.InTube = false; + Dirty(entity , ventCrawComp); } - holder.IsExitingVentCraws = true; - - foreach (var entity in holder.Container.ContainedEntities.ToArray()) + if (EntityManager.TryGetComponent(entity, out PhysicsComponent? physics)) { - RemComp(entity); - - var meta = MetaData(entity); - _containerSystem.Remove(entity, holder.Container, reparent: false, force: true); - - var xform = Transform(entity); - if (xform.ParentUid != uid) - continue; - - _xformSystem.AttachToGridOrMap(entity, xform); - - if (TryComp(entity, out var ventCrawComp)) - { - ventCrawComp.InTube = false; - Dirty(entity , ventCrawComp); - } - - if (EntityManager.TryGetComponent(entity, out PhysicsComponent? physics)) - { - _physicsSystem.WakeBody(entity, body: physics); - } - } - - EntityManager.DeleteEntity(uid); - } - - /// - /// Attempts to make the VentCrawHolderComponent enter a VentCrawTubeComponent. - /// - /// The EntityUid of the VentCrawHolderComponent. - /// The EntityUid of the VentCrawTubeComponent to enter. - /// The VentCrawHolderComponent instance. - /// The TransformComponent instance for the VentCrawHolderComponent. - /// The VentCrawTubeComponent instance to enter. - /// The TransformComponent instance for the VentCrawTubeComponent. - /// True if the VentCrawHolderComponent successfully enters the VentCrawTubeComponent; otherwise, False. - public bool EnterTube(EntityUid holderUid, EntityUid toUid, VentCrawHolderComponent? holder = null, TransformComponent? holderTransform = null, VentCrawTubeComponent? to = null, TransformComponent? toTransform = null) - { - if (!Resolve(holderUid, ref holder, ref holderTransform)) - return false; - if (holder.IsExitingVentCraws) - { - Log.Error("Tried entering tube after exiting VentCraws. This should never happen."); - return false; - } - if (!Resolve(toUid, ref to, ref toTransform)) - { - ExitVentCraws(holderUid, holder, holderTransform); - return false; - } - - foreach (var ent in holder.Container.ContainedEntities) - { - var comp = EnsureComp(ent); - comp.Holder = holderUid; - } - - if (!_containerSystem.Insert(holderUid, to.Contents)) - { - ExitVentCraws(holderUid, holder, holderTransform); - return false; - } - - if (holder.CurrentTube != null) - { - holder.PreviousTube = holder.CurrentTube; - holder.PreviousDirection = holder.CurrentDirection; - } - holder.CurrentTube = toUid; - - return true; - } - - /// - /// Magic... - /// - public override void Update(float frameTime) - { - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var holder)) - { - if (holder.CurrentDirection == Direction.Invalid) - return; - - var currentTube = holder.CurrentTube!.Value; - - if (holder.IsMoving && holder.NextTube == null) - { - var nextTube = _ventCrawTubeSystem.NextTubeFor(currentTube, holder.CurrentDirection); - - if (nextTube != null) - { - if (!EntityManager.EntityExists(holder.CurrentTube)) - { - ExitVentCraws(uid, holder); - continue; - } - - holder.NextTube = nextTube; - holder.StartingTime = holder.Speed; - holder.TimeLeft = holder.Speed; - } - else - { - var ev = new GetVentCrawsConnectableDirectionsEvent(); - RaiseLocalEvent(currentTube, ref ev); - if (ev.Connectable.Contains(holder.CurrentDirection)) - { - ExitVentCraws(uid, holder); - continue; - } - } - } - - if (holder.NextTube != null && holder.TimeLeft > 0) - { - var time = frameTime; - if (time > holder.TimeLeft) - { - time = holder.TimeLeft; - } - - var progress = 1 - holder.TimeLeft / holder.StartingTime; - var origin = Transform(currentTube).Coordinates; - var target = Transform(holder.NextTube.Value).Coordinates; - var newPosition = (target.Position - origin.Position) * progress; - - _xformSystem.SetCoordinates(uid, origin.Offset(newPosition).WithEntityId(currentTube)); - - holder.TimeLeft -= time; - frameTime -= time; - } - else if (holder.NextTube != null && holder.TimeLeft == 0) - { - if (HasComp(holder.NextTube.Value) && !holder.FirstEntry) - { - var welded = false; - if (TryComp(holder.NextTube.Value, out var weldableComponent)) - { - welded = weldableComponent.IsWelded; - } - if (!welded) - { - ExitVentCraws(uid, holder); - } - } - else - { - _containerSystem.Remove(uid, Comp(currentTube).Contents ,reparent: false, force: true); - - if (holder.FirstEntry) - holder.FirstEntry = false; - - if (_gameTiming.CurTime > holder.LastCrawl + VentCrawHolderComponent.CrawlDelay) - { - holder.LastCrawl = _gameTiming.CurTime; - _audioSystem.PlayPvs(holder.CrawlSound, uid); - } - - EnterTube(uid, holder.NextTube.Value, holder); - holder.NextTube = null; - } - } + _physicsSystem.WakeBody(entity, body: physics); } } + + EntityManager.DeleteEntity(uid); } -} +} \ No newline at end of file diff --git a/Content.Shared/VentCraw/Components/VentCrawHolderComponent.cs b/Content.Shared/VentCraw/Components/VentCrawHolderComponent.cs index 61908317a31b..683f432b46de 100644 --- a/Content.Shared/VentCraw/Components/VentCrawHolderComponent.cs +++ b/Content.Shared/VentCraw/Components/VentCrawHolderComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.VentCraw.Components; using Robust.Shared.Audio; using Robust.Shared.Containers; @@ -47,3 +48,9 @@ public sealed partial class VentCrawHolderComponent : Component [DataField("speed")] public float Speed = 0.15f; } + +[ByRefEvent] +public record struct VentCrawExitEvent +{ + public TransformComponent? holderTransform; +} diff --git a/Content.Shared/VentCraw/SharedVentCrawableSystem.cs b/Content.Shared/VentCraw/SharedVentCrawableSystem.cs new file mode 100644 index 000000000000..929fde6e2f30 --- /dev/null +++ b/Content.Shared/VentCraw/SharedVentCrawableSystem.cs @@ -0,0 +1,260 @@ +using System.Linq; +using Content.Shared.Body.Components; +using Content.Shared.Tools.Components; +using Content.Shared.Item; +using Content.Shared.Movement.Events; +using Content.Shared.VentCraw.Tube.Components; +using Content.Shared.VentCraw.Components; +using Robust.Shared.Audio.Systems; +using Robust.Shared.Containers; +using Robust.Shared.Physics.Components; +using Robust.Shared.Physics.Systems; +using Robust.Shared.Timing; + +namespace Content.Shared.VentCraw; + +/// +/// A system that handles the crawling behavior for vent creatures. +/// +public sealed class SharedVentCrawableSystem : EntitySystem +{ + [Dependency] private readonly SharedVentTubeSystem _ventCrawTubeSystem = default!; + [Dependency] private readonly SharedPhysicsSystem _physicsSystem = default!; + [Dependency] private readonly SharedContainerSystem _containerSystem = default!; + [Dependency] private readonly SharedTransformSystem _xformSystem = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly SharedAudioSystem _audioSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnComponentStartup); + SubscribeLocalEvent(OnMoveInput); + } + + /// + /// Handles the MoveInputEvent for VentCrawHolderComponent. + /// + /// The EntityUid of the VentCrawHolderComponent. + /// The VentCrawHolderComponent instance. + /// The MoveInputEvent arguments. + private void OnMoveInput(EntityUid uid, VentCrawHolderComponent component, ref MoveInputEvent args) + { + if (!TryComp(uid, out var holder)) + return; + + if (!EntityManager.EntityExists(holder.CurrentTube)) + { + var ev = new VentCrawExitEvent(); + RaiseLocalEvent(uid, ref ev); + } + + component.IsMoving = args.State; + component.CurrentDirection = args.Dir; + } + + /// + /// Handles the ComponentStartup event for VentCrawHolderComponent. + /// + /// The EntityUid of the VentCrawHolderComponent. + /// The VentCrawHolderComponent instance. + /// The ComponentStartup arguments. + private void OnComponentStartup(EntityUid uid, VentCrawHolderComponent holder, ComponentStartup args) + { + holder.Container = _containerSystem.EnsureContainer(uid, nameof(VentCrawHolderComponent)); + } + + /// + /// Tries to insert an entity into the VentCrawHolderComponent container. + /// + /// The EntityUid of the VentCrawHolderComponent. + /// The EntityUid of the entity to insert. + /// The VentCrawHolderComponent instance. + /// True if the insertion was successful, otherwise False. + public bool TryInsert(EntityUid uid, EntityUid toInsert, VentCrawHolderComponent? holder = null) + { + if (!Resolve(uid, ref holder)) + return false; + + if (!CanInsert(uid, toInsert, holder)) + return false; + + if (!_containerSystem.Insert(toInsert, holder.Container)) + return false; + + if (TryComp(toInsert, out var physBody)) + _physicsSystem.SetCanCollide(toInsert, false, body: physBody); + + return true; + } + + /// + /// Checks whether the specified entity can be inserted into the container of the VentCrawHolderComponent. + /// + /// The EntityUid of the VentCrawHolderComponent. + /// The EntityUid of the entity to be inserted. + /// The VentCrawHolderComponent instance. + /// True if the entity can be inserted into the container; otherwise, False. + private bool CanInsert(EntityUid uid, EntityUid toInsert, VentCrawHolderComponent? holder = null) + { + if (!Resolve(uid, ref holder)) + return false; + + if (!_containerSystem.CanInsert(toInsert, holder.Container)) + return false; + + return HasComp(toInsert) || + HasComp(toInsert); + } + + /// + /// Attempts to make the VentCrawHolderComponent enter a VentCrawTubeComponent. + /// + /// The EntityUid of the VentCrawHolderComponent. + /// The EntityUid of the VentCrawTubeComponent to enter. + /// The VentCrawHolderComponent instance. + /// The TransformComponent instance for the VentCrawHolderComponent. + /// The VentCrawTubeComponent instance to enter. + /// The TransformComponent instance for the VentCrawTubeComponent. + /// True if the VentCrawHolderComponent successfully enters the VentCrawTubeComponent; otherwise, False. + public bool EnterTube(EntityUid holderUid, EntityUid toUid, VentCrawHolderComponent? holder = null, TransformComponent? holderTransform = null, VentCrawTubeComponent? to = null, TransformComponent? toTransform = null) + { + if (!Resolve(holderUid, ref holder, ref holderTransform)) + return false; + if (holder.IsExitingVentCraws) + { + Log.Error("Tried entering tube after exiting VentCraws. This should never happen."); + return false; + } + if (!Resolve(toUid, ref to, ref toTransform)) + { + var ev = new VentCrawExitEvent(); + RaiseLocalEvent(holderUid, ref ev); + return false; + } + + foreach (var ent in holder.Container.ContainedEntities) + { + var comp = EnsureComp(ent); + comp.Holder = holderUid; + } + + if (!_containerSystem.Insert(holderUid, to.Contents)) + { + var ev = new VentCrawExitEvent(); + RaiseLocalEvent(holderUid, ref ev); + return false; + } + + if (holder.CurrentTube != null) + { + holder.PreviousTube = holder.CurrentTube; + holder.PreviousDirection = holder.CurrentDirection; + } + holder.CurrentTube = toUid; + + return true; + } + + /// + /// Magic... + /// + public override void Update(float frameTime) + { + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var uid, out var holder)) + { + if (holder.CurrentDirection == Direction.Invalid) + return; + + if (holder.CurrentTube == null) + { + continue; + } + + var currentTube = holder.CurrentTube.Value; + + if (holder.IsMoving && holder.NextTube == null) + { + var nextTube = _ventCrawTubeSystem.NextTubeFor(currentTube, holder.CurrentDirection); + + if (nextTube != null) + { + if (!EntityManager.EntityExists(holder.CurrentTube)) + { + var ev = new VentCrawExitEvent(); + RaiseLocalEvent(uid, ref ev); + continue; + } + + holder.NextTube = nextTube; + holder.StartingTime = holder.Speed; + holder.TimeLeft = holder.Speed; + } + else + { + var ev = new GetVentCrawsConnectableDirectionsEvent(); + RaiseLocalEvent(currentTube, ref ev); + if (ev.Connectable.Contains(holder.CurrentDirection)) + { + var Exitev = new VentCrawExitEvent(); + RaiseLocalEvent(uid, ref Exitev); + continue; + } + } + } + + if (holder.NextTube != null && holder.TimeLeft > 0) + { + var time = frameTime; + if (time > holder.TimeLeft) + { + time = holder.TimeLeft; + } + + var progress = 1 - holder.TimeLeft / holder.StartingTime; + var origin = Transform(currentTube).Coordinates; + var target = Transform(holder.NextTube.Value).Coordinates; + var newPosition = (target.Position - origin.Position) * progress; + + _xformSystem.SetCoordinates(uid, origin.Offset(newPosition).WithEntityId(currentTube)); + + holder.TimeLeft -= time; + frameTime -= time; + } + else if (holder.NextTube != null && holder.TimeLeft == 0) + { + if (HasComp(holder.NextTube.Value) && !holder.FirstEntry) + { + var welded = false; + if (TryComp(holder.NextTube.Value, out var weldableComponent)) + { + welded = weldableComponent.IsWelded; + } + if (!welded) + { + var ev = new VentCrawExitEvent(); + RaiseLocalEvent(uid, ref ev); + } + } + else + { + _containerSystem.Remove(uid, Comp(currentTube).Contents ,reparent: false, force: true); + + if (holder.FirstEntry) + holder.FirstEntry = false; + + if (_gameTiming.CurTime > holder.LastCrawl + VentCrawHolderComponent.CrawlDelay) + { + holder.LastCrawl = _gameTiming.CurTime; + _audioSystem.PlayPvs(holder.CrawlSound, uid); + } + + EnterTube(uid, holder.NextTube.Value, holder); + holder.NextTube = null; + } + } + } + } +} \ No newline at end of file diff --git a/Content.Shared/VentCraw/SharedVentTubeSystem.cs b/Content.Shared/VentCraw/SharedVentTubeSystem.cs new file mode 100644 index 000000000000..90eb9d2994cf --- /dev/null +++ b/Content.Shared/VentCraw/SharedVentTubeSystem.cs @@ -0,0 +1,51 @@ +using System.Linq; +using Content.Shared.VentCraw.Tube.Components; +using Robust.Shared.Map; +using Robust.Shared.Map.Components; + +namespace Content.Shared.VentCraw; + +public sealed class SharedVentTubeSystem : EntitySystem +{ + [Dependency] private readonly SharedMapSystem _mapSystem = default!; + + public EntityUid? NextTubeFor(EntityUid target, Direction nextDirection, VentCrawTubeComponent? targetTube = null) + { + if (!Resolve(target, ref targetTube)) + return null; + var oppositeDirection = nextDirection.GetOpposite(); + + var xform = Transform(target); + if (!TryComp(xform.GridUid, out var grid)) + return null; + + if (xform.GridUid == null) + return null; + + var position = xform.Coordinates; + foreach (EntityUid entity in _mapSystem.GetInDir(xform.GridUid.Value, grid ,position, nextDirection)) + { + + if (!TryComp(entity, out VentCrawTubeComponent? tube) + || !CanConnect(target, targetTube, nextDirection) + || !CanConnect(entity, tube, oppositeDirection)) + continue; + + return entity; + } + + return null; + } + + private bool CanConnect(EntityUid tubeId, VentCrawTubeComponent tube, Direction direction) + { + if (!tube.Connected) + { + return false; + } + + var ev = new GetVentCrawsConnectableDirectionsEvent(); + RaiseLocalEvent(tubeId, ref ev); + return ev.Connectable.Contains(direction); + } +} \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/pipes.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/pipes.yml index 04877409b09f..bf76d8836754 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/pipes.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/pipes.yml @@ -69,7 +69,7 @@ - type: entity id: VentCrawHolder categories: [ HideSpawnMenu ] - name: vent claw holder + name: vent craw holder components: - type: VentCrawHolder - type: InputMover