Tile prying removes decals (#13363)
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
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.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);
|
||||||
|
|||||||
@@ -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}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user