-
Notifications
You must be signed in to change notification settings - Fork 87
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Revert "Revert "Prevent stacking pipes (#28308)" (#43)"
This reverts commit af626ce
- Loading branch information
Showing
9 changed files
with
147 additions
and
9 deletions.
There are no files selected for viewing
9 changes: 9 additions & 0 deletions
9
Content.Server/Atmos/Components/PipeRestrictOverlapComponent.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
using Content.Server.Atmos.EntitySystems; | ||
|
||
namespace Content.Server.Atmos.Components; | ||
|
||
/// <summary> | ||
/// This is used for restricting anchoring pipes so that they do not overlap. | ||
/// </summary> | ||
[RegisterComponent, Access(typeof(PipeRestrictOverlapSystem))] | ||
public sealed partial class PipeRestrictOverlapComponent : Component; |
123 changes: 123 additions & 0 deletions
123
Content.Server/Atmos/EntitySystems/PipeRestrictOverlapSystem.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,123 @@ | ||
using System.Linq; | ||
using Content.Server.Atmos.Components; | ||
using Content.Server.NodeContainer; | ||
using Content.Server.NodeContainer.Nodes; | ||
using Content.Server.Popups; | ||
using Content.Shared.Atmos; | ||
using Content.Shared.Construction.Components; | ||
using JetBrains.Annotations; | ||
using Robust.Server.GameObjects; | ||
using Robust.Shared.Map.Components; | ||
|
||
namespace Content.Server.Atmos.EntitySystems; | ||
|
||
/// <summary> | ||
/// This handles restricting pipe-based entities from overlapping outlets/inlets with other entities. | ||
/// </summary> | ||
public sealed class PipeRestrictOverlapSystem : EntitySystem | ||
{ | ||
[Dependency] private readonly MapSystem _map = default!; | ||
[Dependency] private readonly PopupSystem _popup = default!; | ||
[Dependency] private readonly TransformSystem _xform = default!; | ||
|
||
private readonly List<EntityUid> _anchoredEntities = new(); | ||
private EntityQuery<NodeContainerComponent> _nodeContainerQuery; | ||
|
||
/// <inheritdoc/> | ||
public override void Initialize() | ||
{ | ||
SubscribeLocalEvent<PipeRestrictOverlapComponent, AnchorStateChangedEvent>(OnAnchorStateChanged); | ||
SubscribeLocalEvent<PipeRestrictOverlapComponent, AnchorAttemptEvent>(OnAnchorAttempt); | ||
|
||
_nodeContainerQuery = GetEntityQuery<NodeContainerComponent>(); | ||
} | ||
|
||
private void OnAnchorStateChanged(Entity<PipeRestrictOverlapComponent> ent, ref AnchorStateChangedEvent args) | ||
{ | ||
if (!args.Anchored) | ||
return; | ||
|
||
if (HasComp<AnchorableComponent>(ent) && CheckOverlap(ent)) | ||
{ | ||
_popup.PopupEntity(Loc.GetString("pipe-restrict-overlap-popup-blocked", ("pipe", ent.Owner)), ent); | ||
_xform.Unanchor(ent, Transform(ent)); | ||
} | ||
} | ||
|
||
private void OnAnchorAttempt(Entity<PipeRestrictOverlapComponent> ent, ref AnchorAttemptEvent args) | ||
{ | ||
if (args.Cancelled) | ||
return; | ||
|
||
if (!_nodeContainerQuery.TryComp(ent, out var node)) | ||
return; | ||
|
||
var xform = Transform(ent); | ||
if (CheckOverlap((ent, node, xform))) | ||
{ | ||
_popup.PopupEntity(Loc.GetString("pipe-restrict-overlap-popup-blocked", ("pipe", ent.Owner)), ent, args.User); | ||
args.Cancel(); | ||
} | ||
} | ||
|
||
[PublicAPI] | ||
public bool CheckOverlap(EntityUid uid) | ||
{ | ||
if (!_nodeContainerQuery.TryComp(uid, out var node)) | ||
return false; | ||
|
||
return CheckOverlap((uid, node, Transform(uid))); | ||
} | ||
|
||
public bool CheckOverlap(Entity<NodeContainerComponent, TransformComponent> ent) | ||
{ | ||
if (ent.Comp2.GridUid is not { } grid || !TryComp<MapGridComponent>(grid, out var gridComp)) | ||
return false; | ||
|
||
var indices = _map.TileIndicesFor(grid, gridComp, ent.Comp2.Coordinates); | ||
_anchoredEntities.Clear(); | ||
_map.GetAnchoredEntities((grid, gridComp), indices, _anchoredEntities); | ||
|
||
foreach (var otherEnt in _anchoredEntities) | ||
{ | ||
// this should never actually happen but just for safety | ||
if (otherEnt == ent.Owner) | ||
continue; | ||
|
||
if (!_nodeContainerQuery.TryComp(otherEnt, out var otherComp)) | ||
continue; | ||
|
||
if (PipeNodesOverlap(ent, (otherEnt, otherComp, Transform(otherEnt)))) | ||
return true; | ||
} | ||
|
||
return false; | ||
} | ||
|
||
public bool PipeNodesOverlap(Entity<NodeContainerComponent, TransformComponent> ent, Entity<NodeContainerComponent, TransformComponent> other) | ||
{ | ||
var entDirs = GetAllDirections(ent).ToList(); | ||
var otherDirs = GetAllDirections(other).ToList(); | ||
|
||
foreach (var dir in entDirs) | ||
{ | ||
foreach (var otherDir in otherDirs) | ||
{ | ||
if ((dir & otherDir) != 0) | ||
return true; | ||
} | ||
} | ||
|
||
return false; | ||
|
||
IEnumerable<PipeDirection> GetAllDirections(Entity<NodeContainerComponent, TransformComponent> pipe) | ||
{ | ||
foreach (var node in pipe.Comp1.Nodes.Values) | ||
{ | ||
// we need to rotate the pipe manually like this because the rotation doesn't update for pipes that are unanchored. | ||
if (node is PipeNode pipeNode) | ||
yield return pipeNode.OriginalPipeDirection.RotatePipeDirection(pipe.Comp2.LocalRotation); | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
1 change: 1 addition & 0 deletions
1
Resources/Locale/en-US/construction/conditions/no-unstackable-in-tile.ftl
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,2 @@ | ||
construction-step-condition-no-unstackable-in-tile = You cannot make a stack of similar devices. | ||
pipe-restrict-overlap-popup-blocked = { CAPITALIZE(THE($pipe))} doesn't fit over the other pipes! |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters