diff --git a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs
index d042b654496..3d8787d367d 100644
--- a/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs
+++ b/Content.Server/Explosion/EntitySystems/ExplosionSystem.cs
@@ -14,6 +14,7 @@
using Content.Shared.GameTicking;
using Content.Shared.Inventory;
using Content.Shared.Throwing;
+using Content.Shared.Tiles;
using Robust.Server.GameStates;
using Robust.Server.Player;
using Robust.Shared.Audio;
@@ -23,6 +24,8 @@
using Robust.Shared.Prototypes;
using Robust.Shared.Random;
using Robust.Shared.Utility;
+using Content.Shared.Maps;
+using Robust.Shared.Map.Components;
namespace Content.Server.Explosion.EntitySystems;
@@ -46,6 +49,8 @@ public sealed partial class ExplosionSystem : EntitySystem
[Dependency] private readonly PvsOverrideSystem _pvsSys = default!;
[Dependency] private readonly SharedTransformSystem _transformSystem = default!;
+ [Dependency] private readonly IMapManager _mapMan = default!;
+
///
/// "Tile-size" for space when there are no nearby grids to use as a reference.
///
@@ -301,8 +306,6 @@ public void QueueExplosion(MapCoordinates epicenter,
var (area, iterationIntensity, spaceData, gridData, spaceMatrix) = results.Value;
- var visualEnt = CreateExplosionVisualEntity(epicenter, type.ID, spaceMatrix, spaceData, gridData.Values, iterationIntensity);
-
// camera shake
CameraShake(iterationIntensity.Count * 2.5f, epicenter, totalIntensity);
@@ -314,6 +317,25 @@ public void QueueExplosion(MapCoordinates epicenter,
var filter = Filter.Pvs(epicenter).AddInRange(epicenter, audioRange);
SoundSystem.Play(type.Sound.GetSound(), filter, mapEntityCoords, _audioParams);
+ // Block explosions on safe zone
+ var location = mapEntityCoords;
+ var gridId = location.GetGridUid(EntityManager);
+ if (!HasComp(gridId))
+ {
+ location = location.AlignWithClosestGridTile();
+ gridId = location.GetGridUid(EntityManager);
+ // Check if fixing it failed / get final grid ID
+ if (!HasComp(gridId))
+ return null;
+ }
+ var mapGrid = _mapMan.GetGrid(gridId.Value);
+ var gridUid = mapGrid.Owner;
+ var ev = new FloorTileAttemptEvent();
+ if (HasComp(gridUid) || ev.Cancelled)
+ return null;
+
+ var visualEnt = CreateExplosionVisualEntity(epicenter, type.ID, spaceMatrix, spaceData, gridData.Values, iterationIntensity);
+
return new Explosion(this,
type,
spaceData,