From 572b762f2c2ac6b48254f1a3a17268b06ecde386 Mon Sep 17 00:00:00 2001 From: Kara Date: Sat, 7 Jan 2023 04:24:50 -0600 Subject: [PATCH] Tile prying removes decals (#13363) --- .../EntitySystems/AtmosphereSystem.Utils.cs | 3 +- .../Atmos/EntitySystems/AtmosphereSystem.cs | 3 +- .../TileReactions/PryTileReaction.cs | 6 +- Content.Server/Maps/TileSystem.cs | 88 +++++++++++++++++++ .../EntitySystems/RevenantSystem.Abilities.cs | 4 +- .../Tools/ToolSystem.LatticeCutting.cs | 4 +- Content.Server/Tools/ToolSystem.TilePrying.cs | 3 +- .../Effects/Systems/ThrowArtifactSystem.cs | 6 +- Content.Shared/Maps/TurfHelpers.cs | 85 +----------------- 9 files changed, 109 insertions(+), 93 deletions(-) create mode 100644 Content.Server/Maps/TileSystem.cs diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs index b0b06fd07a..699c2a70ae 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs @@ -1,5 +1,6 @@ using System.Runtime.CompilerServices; using Content.Server.Atmos.Components; +using Content.Server.Maps; using Content.Shared.Atmos; using Content.Shared.Atmos.Components; using Content.Shared.Maps; @@ -105,6 +106,6 @@ public partial class AtmosphereSystem if (!mapGrid.TryGetTileRef(tile, out var tileRef)) return; - tileRef.PryTile(_mapManager, _tileDefinitionManager, EntityManager, _robustRandom); + _tile.PryTile(tileRef); } } diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs index c05768c6a9..7767cce965 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.cs @@ -1,6 +1,7 @@ using Content.Server.Administration.Logs; using Content.Server.Atmos.Components; using Content.Server.Body.Systems; +using Content.Server.Maps; using Content.Server.NodeContainer.EntitySystems; using Content.Shared.Atmos.EntitySystems; using Content.Shared.Maps; @@ -28,7 +29,7 @@ public sealed partial class AtmosphereSystem : SharedAtmosphereSystem [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly GasTileOverlaySystem _gasTileOverlaySystem = default!; [Dependency] private readonly TransformSystem _transformSystem = default!; - + [Dependency] private readonly TileSystem _tile = default!; private const float ExposedUpdateDelay = 1f; private float _exposedTimer = 0f; diff --git a/Content.Server/Chemistry/TileReactions/PryTileReaction.cs b/Content.Server/Chemistry/TileReactions/PryTileReaction.cs index 3b2c6af18d..5598634e26 100644 --- a/Content.Server/Chemistry/TileReactions/PryTileReaction.cs +++ b/Content.Server/Chemistry/TileReactions/PryTileReaction.cs @@ -1,4 +1,5 @@ -using Content.Shared.Chemistry.Reaction; +using Content.Server.Maps; +using Content.Shared.Chemistry.Reaction; using Content.Shared.Chemistry.Reagent; using Content.Shared.FixedPoint; using Content.Shared.Maps; @@ -13,7 +14,8 @@ public sealed class PryTileReaction : ITileReaction { public FixedPoint2 TileReact(TileRef tile, ReagentPrototype reagent, FixedPoint2 reactVolume) { - tile.PryTile(); + var sys = IoCManager.Resolve().System(); + sys.PryTile(tile); return reactVolume; } } diff --git a/Content.Server/Maps/TileSystem.cs b/Content.Server/Maps/TileSystem.cs new file mode 100644 index 0000000000..0b888cf225 --- /dev/null +++ b/Content.Server/Maps/TileSystem.cs @@ -0,0 +1,88 @@ +using Content.Server.Coordinates.Helpers; +using Content.Server.Decals; +using Content.Shared.Decals; +using Content.Shared.Maps; +using Robust.Shared.Map; +using Robust.Shared.Random; + +namespace Content.Server.Maps; + +/// +/// Handles server-side tile manipulation like prying/deconstructing tiles. +/// +public sealed class TileSystem : EntitySystem +{ + [Dependency] private readonly IMapManager _mapManager = default!; + [Dependency] private readonly ITileDefinitionManager _tileDefinitionManager = default!; + [Dependency] private readonly IRobustRandom _robustRandom = default!; + [Dependency] private readonly DecalSystem _decal = default!; + + public bool PryTile(Vector2i indices, EntityUid gridId) + { + var grid = _mapManager.GetGrid(gridId); + var tileRef = grid.GetTileRef(indices); + return PryTile(tileRef); + } + + public bool PryTile(TileRef tileRef) + { + var tile = tileRef.Tile; + + if (tile.IsEmpty) + return false; + + var tileDef = (ContentTileDefinition) _tileDefinitionManager[tile.TypeId]; + + if (!tileDef.CanCrowbar) + return false; + + return DeconstructTile(tileRef); + } + + public bool CutTile(TileRef tileRef) + { + var tile = tileRef.Tile; + + if (tile.IsEmpty) + return false; + + var tileDef = (ContentTileDefinition) _tileDefinitionManager[tile.TypeId]; + + if (!tileDef.CanWirecutter) + return false; + + return DeconstructTile(tileRef); + } + + private bool DeconstructTile(TileRef tileRef) + { + var indices = tileRef.GridIndices; + + var tileDef = (ContentTileDefinition) _tileDefinitionManager[tileRef.Tile.TypeId]; + var mapGrid = _mapManager.GetGrid(tileRef.GridUid); + + const float margin = 0.1f; + var bounds = mapGrid.TileSize - margin * 2; + var coordinates = mapGrid.GridTileToLocal(indices) + .Offset(new Vector2( + (_robustRandom.NextFloat() - 0.5f) * bounds, + (_robustRandom.NextFloat() - 0.5f) * bounds)); + + //Actually spawn the relevant tile item at the right position and give it some random offset. + var tileItem = Spawn(tileDef.ItemDropPrototypeName, coordinates); + Transform(tileItem).LocalRotation = _robustRandom.NextDouble() * Math.Tau; + + // Destroy any decals on the tile + var decals = _decal.GetDecalsInRange(tileRef.GridUid, coordinates.SnapToGrid(EntityManager, _mapManager).Position, 0.5f); + foreach (var (id, _) in decals) + { + _decal.RemoveDecal(tileRef.GridUid, id); + } + + var plating = _tileDefinitionManager[tileDef.BaseTurfs[^1]]; + + mapGrid.SetTile(tileRef.GridIndices, new Tile(plating.TileId)); + + return true; + } +} diff --git a/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs b/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs index a0e7682b66..b2b8c04bf8 100644 --- a/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs +++ b/Content.Server/Revenant/EntitySystems/RevenantSystem.Abilities.cs @@ -24,6 +24,7 @@ using System.Linq; using Content.Server.Beam; using Content.Server.Emag; using Content.Server.Humanoid; +using Content.Server.Maps; using Content.Server.Revenant.Components; using Content.Server.Store.Components; using Content.Shared.FixedPoint; @@ -43,6 +44,7 @@ public sealed partial class RevenantSystem [Dependency] private readonly EmagSystem _emag = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly GhostSystem _ghost = default!; + [Dependency] private readonly TileSystem _tile = default!; private void InitializeAbilities() { @@ -233,7 +235,7 @@ public sealed partial class RevenantSystem { if (!tiles.TryGetValue(i, out var value)) continue; - value.PryTile(); + _tile.PryTile(value); } var lookup = _lookup.GetEntitiesInRange(uid, component.DefileRadius, LookupFlags.Approximate | LookupFlags.Static); diff --git a/Content.Server/Tools/ToolSystem.LatticeCutting.cs b/Content.Server/Tools/ToolSystem.LatticeCutting.cs index 1e9b2d6b47..165e5708b2 100644 --- a/Content.Server/Tools/ToolSystem.LatticeCutting.cs +++ b/Content.Server/Tools/ToolSystem.LatticeCutting.cs @@ -1,5 +1,6 @@ using System.Threading; using Content.Server.Administration.Logs; +using Content.Server.Maps; using Content.Server.Tools.Components; using Content.Shared.Database; using Content.Shared.Interaction; @@ -12,6 +13,7 @@ namespace Content.Server.Tools; public sealed partial class ToolSystem { [Dependency] private readonly IAdminLogManager _adminLogger = default!; + [Dependency] private readonly TileSystem _tile = default!; private void InitializeLatticeCutting() { @@ -40,7 +42,7 @@ public sealed partial class ToolSystem || tile.IsBlockedTurf(true)) return; - tile.CutTile(_mapManager, _tileDefinitionManager, EntityManager); + _tile.CutTile(tile); _adminLogger.Add(LogType.LatticeCut, LogImpact.Medium, $"{ToPrettyString(args.User):user} cut the lattice at {args.Coordinates:target}"); } diff --git a/Content.Server/Tools/ToolSystem.TilePrying.cs b/Content.Server/Tools/ToolSystem.TilePrying.cs index d6a79e3707..fcb0d7e0a3 100644 --- a/Content.Server/Tools/ToolSystem.TilePrying.cs +++ b/Content.Server/Tools/ToolSystem.TilePrying.cs @@ -37,7 +37,8 @@ public sealed partial class ToolSystem return; } - grid.GetTileRef(args.Coordinates).PryTile(_mapManager, _tileDefinitionManager, EntityManager); + var tile = grid.GetTileRef(args.Coordinates); + _tile.PryTile(tile); } private void OnTilePryingAfterInteract(EntityUid uid, TilePryingComponent component, AfterInteractEvent args) diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ThrowArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ThrowArtifactSystem.cs index b210bb053f..e2af7ef335 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ThrowArtifactSystem.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/ThrowArtifactSystem.cs @@ -1,4 +1,5 @@ -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; +using Content.Server.Maps; +using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; using Content.Server.Xenoarchaeology.XenoArtifacts.Events; using Content.Shared.Maps; using Content.Shared.Throwing; @@ -13,6 +14,7 @@ public sealed class ThrowArtifactSystem : EntitySystem [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly ThrowingSystem _throwing = default!; + [Dependency] private readonly TileSystem _tile = default!; /// public override void Initialize() @@ -33,7 +35,7 @@ public sealed class ThrowArtifactSystem : EntitySystem if (!_random.Prob(component.TilePryChance)) continue; - tile.PryTile(); + _tile.PryTile(tile); } } diff --git a/Content.Shared/Maps/TurfHelpers.cs b/Content.Shared/Maps/TurfHelpers.cs index b5b705de4c..ea9b0f9e2f 100644 --- a/Content.Shared/Maps/TurfHelpers.cs +++ b/Content.Shared/Maps/TurfHelpers.cs @@ -1,6 +1,7 @@ using System.Linq; using System.Runtime.CompilerServices; using System.Diagnostics.CodeAnalysis; +using Content.Shared.Decals; using Content.Shared.Physics; using Robust.Shared.Map; using Robust.Shared.Physics.Components; @@ -87,90 +88,6 @@ namespace Content.Shared.Maps return tile.Tile.IsSpace(tileDefinitionManager); } - public static bool PryTile(this Vector2i indices, EntityUid gridId, - IMapManager? mapManager = null, ITileDefinitionManager? tileDefinitionManager = null, IEntityManager? entityManager = null) - { - mapManager ??= IoCManager.Resolve(); - var grid = mapManager.GetGrid(gridId); - var tileRef = grid.GetTileRef(indices); - return tileRef.PryTile(mapManager, tileDefinitionManager, entityManager); - } - - public static bool PryTile(this TileRef tileRef, - IMapManager? mapManager = null, - ITileDefinitionManager? tileDefinitionManager = null, - IEntityManager? entityManager = null, - IRobustRandom? robustRandom = null) - { - var tile = tileRef.Tile; - - // If the arguments are null, resolve the needed dependencies. - tileDefinitionManager ??= IoCManager.Resolve(); - - if (tile.IsEmpty) return false; - - var tileDef = (ContentTileDefinition) tileDefinitionManager[tile.TypeId]; - - if (!tileDef.CanCrowbar) return false; - - return DeconstructTile(tileRef, mapManager, tileDefinitionManager, entityManager, robustRandom); - } - - public static bool CutTile(this TileRef tileRef, - IMapManager? mapManager = null, - ITileDefinitionManager? tileDefinitionManager = null, - IEntityManager? entityManager = null, - IRobustRandom? robustRandom = null) - { - var tile = tileRef.Tile; - - // If the arguments are null, resolve the needed dependencies. - tileDefinitionManager ??= IoCManager.Resolve(); - - if (tile.IsEmpty) return false; - - var tileDef = (ContentTileDefinition) tileDefinitionManager[tile.TypeId]; - - if (!tileDef.CanWirecutter) return false; - - return DeconstructTile(tileRef, mapManager, tileDefinitionManager, entityManager, robustRandom); - } - - private static bool DeconstructTile(this TileRef tileRef, - IMapManager? mapManager = null, - ITileDefinitionManager? tileDefinitionManager = null, - IEntityManager? entityManager = null, - IRobustRandom? robustRandom = null) - { - var indices = tileRef.GridIndices; - - mapManager ??= IoCManager.Resolve(); - tileDefinitionManager ??= IoCManager.Resolve(); - entityManager ??= IoCManager.Resolve(); - robustRandom ??= IoCManager.Resolve(); - - var tileDef = (ContentTileDefinition) tileDefinitionManager[tileRef.Tile.TypeId]; - var mapGrid = mapManager.GetGrid(tileRef.GridUid); - - const float margin = 0.1f; - var bounds = mapGrid.TileSize - margin * 2; - var coordinates = mapGrid.GridTileToLocal(indices) - .Offset(new Vector2( - (robustRandom.NextFloat() - 0.5f) * bounds, - (robustRandom.NextFloat() - 0.5f) * bounds)); - - //Actually spawn the relevant tile item at the right position and give it some random offset. - var tileItem = entityManager.SpawnEntity(tileDef.ItemDropPrototypeName, coordinates); - entityManager.GetComponent(tileItem).LocalRotation - = robustRandom.NextDouble() * Math.Tau; - - var plating = tileDefinitionManager[tileDef.BaseTurfs[^1]]; - - mapGrid.SetTile(tileRef.GridIndices, new Tile(plating.TileId)); - - return true; - } - /// /// Helper that returns all entities in a turf. ///