Block some subfloor anchor attempts (#6765)

This commit is contained in:
Leon Friedrich
2022-02-18 15:01:15 +13:00
committed by GitHub
parent 79586e3675
commit 81caa8fa06
3 changed files with 36 additions and 9 deletions

View File

@@ -1,7 +1,34 @@
using Content.Server.Construction.Components;
using Content.Shared.SubFloor; using Content.Shared.SubFloor;
namespace Content.Server.SubFloor; namespace Content.Server.SubFloor;
public sealed class SubFloorHideSystem : SharedSubFloorHideSystem public sealed class SubFloorHideSystem : SharedSubFloorHideSystem
{ {
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<SubFloorHideComponent, AnchorAttemptEvent>(OnAnchorAttempt);
SubscribeLocalEvent<SubFloorHideComponent, UnanchorAttemptEvent>(OnUnanchorAttempt);
}
private void OnAnchorAttempt(EntityUid uid, SubFloorHideComponent component, AnchorAttemptEvent args)
{
// No teleporting entities through floor tiles when anchoring them.
var xform = Transform(uid);
if (MapManager.TryGetGrid(xform.GridID, out var grid)
&& HasFloorCover(grid, grid.TileIndicesFor(xform.Coordinates)))
{
args.Cancel();
}
}
private void OnUnanchorAttempt(EntityUid uid, SubFloorHideComponent component, UnanchorAttemptEvent args)
{
// No un-anchoring things under the floor. Only required for something like vents, which are still interactable
// despite being partially under the floor.
if (component.IsUnderCover)
args.Cancel();
}
} }

View File

@@ -13,7 +13,7 @@ namespace Content.Shared.SubFloor
[UsedImplicitly] [UsedImplicitly]
public abstract class SharedSubFloorHideSystem : EntitySystem public abstract class SharedSubFloorHideSystem : EntitySystem
{ {
[Dependency] private readonly IMapManager _mapManager = default!; [Dependency] protected readonly IMapManager MapManager = default!;
[Dependency] private readonly ITileDefinitionManager _tileDefinitionManager = default!; [Dependency] private readonly ITileDefinitionManager _tileDefinitionManager = default!;
[Dependency] private readonly TrayScannerSystem _trayScannerSystem = default!; [Dependency] private readonly TrayScannerSystem _trayScannerSystem = default!;
@@ -21,8 +21,8 @@ namespace Content.Shared.SubFloor
{ {
base.Initialize(); base.Initialize();
_mapManager.GridChanged += MapManagerOnGridChanged; MapManager.GridChanged += MapManagerOnGridChanged;
_mapManager.TileChanged += MapManagerOnTileChanged; MapManager.TileChanged += MapManagerOnTileChanged;
SubscribeLocalEvent<SubFloorHideComponent, ComponentStartup>(OnSubFloorStarted); SubscribeLocalEvent<SubFloorHideComponent, ComponentStartup>(OnSubFloorStarted);
SubscribeLocalEvent<SubFloorHideComponent, ComponentShutdown>(OnSubFloorTerminating); SubscribeLocalEvent<SubFloorHideComponent, ComponentShutdown>(OnSubFloorTerminating);
@@ -34,8 +34,8 @@ namespace Content.Shared.SubFloor
{ {
base.Shutdown(); base.Shutdown();
_mapManager.GridChanged -= MapManagerOnGridChanged; MapManager.GridChanged -= MapManagerOnGridChanged;
_mapManager.TileChanged -= MapManagerOnTileChanged; MapManager.TileChanged -= MapManagerOnTileChanged;
} }
private void OnInteractionAttempt(EntityUid uid, SubFloorHideComponent component, GettingInteractedWithAttemptEvent args) private void OnInteractionAttempt(EntityUid uid, SubFloorHideComponent component, GettingInteractedWithAttemptEvent args)
@@ -89,7 +89,7 @@ namespace Content.Shared.SubFloor
if (e.NewTile.Tile.IsEmpty) if (e.NewTile.Tile.IsEmpty)
return; // Anything that was here will be unanchored anyways. return; // Anything that was here will be unanchored anyways.
UpdateTile(_mapManager.GetGrid(e.NewTile.GridIndex), e.NewTile.GridIndices); UpdateTile(MapManager.GetGrid(e.NewTile.GridIndex), e.NewTile.GridIndices);
} }
private void MapManagerOnGridChanged(object? sender, GridChangedEventArgs e) private void MapManagerOnGridChanged(object? sender, GridChangedEventArgs e)
@@ -108,7 +108,7 @@ namespace Content.Shared.SubFloor
if (!Resolve(uid, ref component, ref xform)) if (!Resolve(uid, ref component, ref xform))
return; return;
if (xform.Anchored && _mapManager.TryGetGrid(xform.GridID, out var grid)) if (xform.Anchored && MapManager.TryGetGrid(xform.GridID, out var grid))
component.IsUnderCover = HasFloorCover(grid, grid.TileIndicesFor(xform.Coordinates)); component.IsUnderCover = HasFloorCover(grid, grid.TileIndicesFor(xform.Coordinates));
else else
component.IsUnderCover = false; component.IsUnderCover = false;
@@ -116,7 +116,7 @@ namespace Content.Shared.SubFloor
UpdateAppearance(uid, component); UpdateAppearance(uid, component);
} }
private bool HasFloorCover(IMapGrid grid, Vector2i position) public bool HasFloorCover(IMapGrid grid, Vector2i position)
{ {
// TODO Redo this function. Currently wires on an asteroid are always "below the floor" // TODO Redo this function. Currently wires on an asteroid are always "below the floor"
var tileDef = (ContentTileDefinition) _tileDefinitionManager[grid.GetTileRef(position).Tile.TypeId]; var tileDef = (ContentTileDefinition) _tileDefinitionManager[grid.GetTileRef(position).Tile.TypeId];

View File

@@ -24,7 +24,7 @@ namespace Content.Shared.SubFloor
/// Whether interactions with this entity should be blocked while it is under floor tiles. /// Whether interactions with this entity should be blocked while it is under floor tiles.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Useful for entities like vents, which are only partially hidden. /// Useful for entities like vents, which are only partially hidden. Anchor attempts will still be blocked.
/// </remarks> /// </remarks>
[DataField("blockInteractions")] [DataField("blockInteractions")]
public bool BlockInteractions { get; set; } = true; public bool BlockInteractions { get; set; } = true;