Tile prying removes decals (#13363)

This commit is contained in:
Kara
2023-01-07 04:24:50 -06:00
committed by GitHub
parent c3e16e8efa
commit 572b762f2c
9 changed files with 109 additions and 93 deletions

View File

@@ -1,5 +1,6 @@
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using Content.Server.Atmos.Components; using Content.Server.Atmos.Components;
using Content.Server.Maps;
using Content.Shared.Atmos; using Content.Shared.Atmos;
using Content.Shared.Atmos.Components; using Content.Shared.Atmos.Components;
using Content.Shared.Maps; using Content.Shared.Maps;
@@ -105,6 +106,6 @@ public partial class AtmosphereSystem
if (!mapGrid.TryGetTileRef(tile, out var tileRef)) if (!mapGrid.TryGetTileRef(tile, out var tileRef))
return; return;
tileRef.PryTile(_mapManager, _tileDefinitionManager, EntityManager, _robustRandom); _tile.PryTile(tileRef);
} }
} }

View File

@@ -1,6 +1,7 @@
using Content.Server.Administration.Logs; using Content.Server.Administration.Logs;
using Content.Server.Atmos.Components; using Content.Server.Atmos.Components;
using Content.Server.Body.Systems; using Content.Server.Body.Systems;
using Content.Server.Maps;
using Content.Server.NodeContainer.EntitySystems; using Content.Server.NodeContainer.EntitySystems;
using Content.Shared.Atmos.EntitySystems; using Content.Shared.Atmos.EntitySystems;
using Content.Shared.Maps; using Content.Shared.Maps;
@@ -28,7 +29,7 @@ public sealed partial class AtmosphereSystem : SharedAtmosphereSystem
[Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!;
[Dependency] private readonly GasTileOverlaySystem _gasTileOverlaySystem = default!; [Dependency] private readonly GasTileOverlaySystem _gasTileOverlaySystem = default!;
[Dependency] private readonly TransformSystem _transformSystem = default!; [Dependency] private readonly TransformSystem _transformSystem = default!;
[Dependency] private readonly TileSystem _tile = default!;
private const float ExposedUpdateDelay = 1f; private const float ExposedUpdateDelay = 1f;
private float _exposedTimer = 0f; private float _exposedTimer = 0f;

View File

@@ -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.Chemistry.Reagent;
using Content.Shared.FixedPoint; using Content.Shared.FixedPoint;
using Content.Shared.Maps; using Content.Shared.Maps;
@@ -13,7 +14,8 @@ public sealed class PryTileReaction : ITileReaction
{ {
public FixedPoint2 TileReact(TileRef tile, ReagentPrototype reagent, FixedPoint2 reactVolume) public FixedPoint2 TileReact(TileRef tile, ReagentPrototype reagent, FixedPoint2 reactVolume)
{ {
tile.PryTile(); var sys = IoCManager.Resolve<IEntityManager>().System<TileSystem>();
sys.PryTile(tile);
return reactVolume; return reactVolume;
} }
} }

View File

@@ -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;
/// <summary>
/// Handles server-side tile manipulation like prying/deconstructing tiles.
/// </summary>
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;
}
}

View File

@@ -24,6 +24,7 @@ using System.Linq;
using Content.Server.Beam; using Content.Server.Beam;
using Content.Server.Emag; using Content.Server.Emag;
using Content.Server.Humanoid; using Content.Server.Humanoid;
using Content.Server.Maps;
using Content.Server.Revenant.Components; using Content.Server.Revenant.Components;
using Content.Server.Store.Components; using Content.Server.Store.Components;
using Content.Shared.FixedPoint; using Content.Shared.FixedPoint;
@@ -43,6 +44,7 @@ public sealed partial class RevenantSystem
[Dependency] private readonly EmagSystem _emag = default!; [Dependency] private readonly EmagSystem _emag = default!;
[Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
[Dependency] private readonly GhostSystem _ghost = default!; [Dependency] private readonly GhostSystem _ghost = default!;
[Dependency] private readonly TileSystem _tile = default!;
private void InitializeAbilities() private void InitializeAbilities()
{ {
@@ -233,7 +235,7 @@ public sealed partial class RevenantSystem
{ {
if (!tiles.TryGetValue(i, out var value)) if (!tiles.TryGetValue(i, out var value))
continue; continue;
value.PryTile(); _tile.PryTile(value);
} }
var lookup = _lookup.GetEntitiesInRange(uid, component.DefileRadius, LookupFlags.Approximate | LookupFlags.Static); var lookup = _lookup.GetEntitiesInRange(uid, component.DefileRadius, LookupFlags.Approximate | LookupFlags.Static);

View File

@@ -1,5 +1,6 @@
using System.Threading; using System.Threading;
using Content.Server.Administration.Logs; using Content.Server.Administration.Logs;
using Content.Server.Maps;
using Content.Server.Tools.Components; using Content.Server.Tools.Components;
using Content.Shared.Database; using Content.Shared.Database;
using Content.Shared.Interaction; using Content.Shared.Interaction;
@@ -12,6 +13,7 @@ namespace Content.Server.Tools;
public sealed partial class ToolSystem public sealed partial class ToolSystem
{ {
[Dependency] private readonly IAdminLogManager _adminLogger = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!;
[Dependency] private readonly TileSystem _tile = default!;
private void InitializeLatticeCutting() private void InitializeLatticeCutting()
{ {
@@ -40,7 +42,7 @@ public sealed partial class ToolSystem
|| tile.IsBlockedTurf(true)) || tile.IsBlockedTurf(true))
return; 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}"); _adminLogger.Add(LogType.LatticeCut, LogImpact.Medium, $"{ToPrettyString(args.User):user} cut the lattice at {args.Coordinates:target}");
} }

View File

@@ -37,7 +37,8 @@ public sealed partial class ToolSystem
return; 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) private void OnTilePryingAfterInteract(EntityUid uid, TilePryingComponent component, AfterInteractEvent args)

View File

@@ -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.Server.Xenoarchaeology.XenoArtifacts.Events;
using Content.Shared.Maps; using Content.Shared.Maps;
using Content.Shared.Throwing; using Content.Shared.Throwing;
@@ -13,6 +14,7 @@ public sealed class ThrowArtifactSystem : EntitySystem
[Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IRobustRandom _random = default!;
[Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!;
[Dependency] private readonly ThrowingSystem _throwing = default!; [Dependency] private readonly ThrowingSystem _throwing = default!;
[Dependency] private readonly TileSystem _tile = default!;
/// <inheritdoc/> /// <inheritdoc/>
public override void Initialize() public override void Initialize()
@@ -33,7 +35,7 @@ public sealed class ThrowArtifactSystem : EntitySystem
if (!_random.Prob(component.TilePryChance)) if (!_random.Prob(component.TilePryChance))
continue; continue;
tile.PryTile(); _tile.PryTile(tile);
} }
} }

View File

@@ -1,6 +1,7 @@
using System.Linq; using System.Linq;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using Content.Shared.Decals;
using Content.Shared.Physics; using Content.Shared.Physics;
using Robust.Shared.Map; using Robust.Shared.Map;
using Robust.Shared.Physics.Components; using Robust.Shared.Physics.Components;
@@ -87,90 +88,6 @@ namespace Content.Shared.Maps
return tile.Tile.IsSpace(tileDefinitionManager); 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<IMapManager>();
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<ITileDefinitionManager>();
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<ITileDefinitionManager>();
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<IMapManager>();
tileDefinitionManager ??= IoCManager.Resolve<ITileDefinitionManager>();
entityManager ??= IoCManager.Resolve<IEntityManager>();
robustRandom ??= IoCManager.Resolve<IRobustRandom>();
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<TransformComponent>(tileItem).LocalRotation
= robustRandom.NextDouble() * Math.Tau;
var plating = tileDefinitionManager[tileDef.BaseTurfs[^1]];
mapGrid.SetTile(tileRef.GridIndices, new Tile(plating.TileId));
return true;
}
/// <summary> /// <summary>
/// Helper that returns all entities in a turf. /// Helper that returns all entities in a turf.
/// </summary> /// </summary>