Tile prying removes decals (#13363)
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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<IEntityManager>().System<TileSystem>();
|
||||
sys.PryTile(tile);
|
||||
return reactVolume;
|
||||
}
|
||||
}
|
||||
|
||||
88
Content.Server/Maps/TileSystem.cs
Normal file
88
Content.Server/Maps/TileSystem.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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}");
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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!;
|
||||
|
||||
/// <inheritdoc/>
|
||||
public override void Initialize()
|
||||
@@ -33,7 +35,7 @@ public sealed class ThrowArtifactSystem : EntitySystem
|
||||
if (!_random.Prob(component.TilePryChance))
|
||||
continue;
|
||||
|
||||
tile.PryTile();
|
||||
_tile.PryTile(tile);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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<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>
|
||||
/// Helper that returns all entities in a turf.
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user