using Content.Shared.Radiation.Systems;
using Content.Shared.Stacks;
using Robust.Shared.Collections;
-using Robust.Shared.Map;
+using Robust.Shared.Containers;
using Robust.Shared.Map.Components;
using Robust.Shared.Timing;
using Robust.Shared.Utility;
+using System.Linq;
namespace Content.Server.Radiation.Systems;
public partial class RadiationSystem
{
[Dependency] private readonly SharedStackSystem _stack = default!;
+ [Dependency] private readonly SharedContainerSystem _container = default!;
+
+ private EntityQuery<RadiationBlockingContainerComponent> _radiationBlockingContainers;
private void UpdateGridcast()
{
var gridQuery = GetEntityQuery<MapGridComponent>();
var stackQuery = GetEntityQuery<StackComponent>();
+ _radiationBlockingContainers = GetEntityQuery<RadiationBlockingContainerComponent>();
+
// precalculate world positions for each source
// so we won't need to calc this in cycle over and over again
var sourcesData = new ValueList<(EntityUid, RadiationSourceComponent, TransformComponent, Vector2)>();
rads += ray.Rads;
}
+ // Apply modifier if the destination entity is hidden within a radiation blocking container
+ rads = GetAdjustedRadiationIntensity(dest.Owner, rads);
+
receiversTotalRads.Add((dest, rads));
}
// also send an event with combination of total rad
if (rads > 0)
- IrradiateEntity(receiver.Owner, rads,GridcastUpdateRate);
+ IrradiateEntity(receiver.Owner, rads, GridcastUpdateRate);
}
// raise broadcast event that radiation system has updated
// check if receiver is too far away
if (dist > GridcastMaxDistance)
return null;
+
// will it even reach destination considering distance penalty
var rads = incomingRads - slope * dist;
+
+ // Apply rad modifier if the source is enclosed within a radiation blocking container
+ rads = GetAdjustedRadiationIntensity(sourceUid, rads);
+
if (rads <= MinIntensity)
return null;
return ray;
}
+
+ private float GetAdjustedRadiationIntensity(EntityUid uid, float rads)
+ {
+ var radblockingComps = new List<RadiationBlockingContainerComponent>();
+ if (_container.TryFindComponentsOnEntityContainerOrParent(uid, _radiationBlockingContainers, radblockingComps))
+ {
+ rads -= radblockingComps.Sum(x => x.RadResistance);
+ }
+
+ return float.Max(rads, 0);
+ }
}