diff --git a/Content.Server/Atmos/Components/PressureProtectionComponent.cs b/Content.Server/Atmos/Components/PressureProtectionComponent.cs
index a3a2842159..e1f13bca79 100644
--- a/Content.Server/Atmos/Components/PressureProtectionComponent.cs
+++ b/Content.Server/Atmos/Components/PressureProtectionComponent.cs
@@ -1,18 +1,33 @@
-namespace Content.Server.Atmos.Components
+using Content.Server.Atmos.EntitySystems;
+
+namespace Content.Server.Atmos.Components;
+
+[RegisterComponent]
+[Access(typeof(BarotraumaSystem))]
+public sealed partial class PressureProtectionComponent : Component
{
- [RegisterComponent]
- public sealed partial class PressureProtectionComponent : Component
- {
- [DataField("highPressureMultiplier")]
- public float HighPressureMultiplier { get; private set; } = 1f;
+ [DataField]
+ public float HighPressureMultiplier = 1f;
- [DataField("highPressureModifier")]
- public float HighPressureModifier { get; private set; } = 0f;
+ [DataField]
+ public float HighPressureModifier;
- [DataField("lowPressureMultiplier")]
- public float LowPressureMultiplier { get; private set; } = 1f;
+ [DataField]
+ public float LowPressureMultiplier = 1f;
- [DataField("lowPressureModifier")]
- public float LowPressureModifier { get; private set; } = 0f;
- }
+ [DataField]
+ public float LowPressureModifier;
}
+
+///
+/// Event raised on an entity with in order to adjust its default values.
+///
+[ByRefEvent]
+public record struct GetPressureProtectionValuesEvent
+{
+ public float HighPressureMultiplier;
+ public float HighPressureModifier;
+ public float LowPressureMultiplier;
+ public float LowPressureModifier;
+}
+
diff --git a/Content.Server/Atmos/Components/TemperatureProtectionComponent.cs b/Content.Server/Atmos/Components/TemperatureProtectionComponent.cs
index 3f9d7bc771..bdee5ff514 100644
--- a/Content.Server/Atmos/Components/TemperatureProtectionComponent.cs
+++ b/Content.Server/Atmos/Components/TemperatureProtectionComponent.cs
@@ -1,11 +1,20 @@
-namespace Content.Server.Atmos.Components;
+using Content.Server.Temperature.Systems;
+
+namespace Content.Server.Atmos.Components;
[RegisterComponent]
+[Access(typeof(TemperatureSystem))]
public sealed partial class TemperatureProtectionComponent : Component
{
///
/// How much to multiply temperature deltas by.
///
- [DataField("coefficient")]
+ [DataField]
public float Coefficient = 1.0f;
}
+
+///
+/// Event raised on an entity with to determine the actual value of the coefficient.
+///
+[ByRefEvent]
+public record struct GetTemperatureProtectionEvent(float Coefficient);
diff --git a/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs
index 1b3e1b07a6..023ac28763 100644
--- a/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs
+++ b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs
@@ -1,3 +1,4 @@
+using System.Diagnostics.CodeAnalysis;
using Content.Server.Administration.Logs;
using Content.Server.Atmos.Components;
using Content.Shared.Alert;
@@ -97,7 +98,11 @@ namespace Content.Server.Atmos.EntitySystems
foreach (var slot in barotrauma.ProtectionSlots)
{
if (!_inventorySystem.TryGetSlotEntity(uid, slot, out var equipment, inv, contMan)
- || !TryComp(equipment, out PressureProtectionComponent? protection))
+ || !TryGetPressureProtectionValues(equipment.Value,
+ out var itemHighMultiplier,
+ out var itemHighModifier,
+ out var itemLowMultiplier,
+ out var itemLowModifier))
{
// Missing protection, skin is exposed.
hPModifier = 0f;
@@ -108,10 +113,10 @@ namespace Content.Server.Atmos.EntitySystems
}
// The entity is as protected as its weakest part protection
- hPModifier = Math.Max(hPModifier, protection.HighPressureModifier);
- hPMultiplier = Math.Max(hPMultiplier, protection.HighPressureMultiplier);
- lPModifier = Math.Min(lPModifier, protection.LowPressureModifier);
- lPMultiplier = Math.Min(lPMultiplier, protection.LowPressureMultiplier);
+ hPModifier = Math.Max(hPModifier, itemHighModifier.Value);
+ hPMultiplier = Math.Max(hPMultiplier, itemHighMultiplier.Value);
+ lPModifier = Math.Min(lPModifier, itemLowModifier.Value);
+ lPMultiplier = Math.Min(lPMultiplier, itemLowMultiplier.Value);
}
barotrauma.HighPressureModifier = hPModifier;
@@ -121,12 +126,16 @@ namespace Content.Server.Atmos.EntitySystems
}
// any innate pressure resistance ?
- if (TryComp(uid, out var innatePressureProtection))
+ if (TryGetPressureProtectionValues(uid,
+ out var highMultiplier,
+ out var highModifier,
+ out var lowMultiplier,
+ out var lowModifier))
{
- barotrauma.HighPressureModifier += innatePressureProtection.HighPressureModifier;
- barotrauma.HighPressureMultiplier *= innatePressureProtection.HighPressureMultiplier;
- barotrauma.LowPressureModifier += innatePressureProtection.LowPressureModifier;
- barotrauma.LowPressureMultiplier *= innatePressureProtection.LowPressureMultiplier;
+ barotrauma.HighPressureModifier += highModifier.Value;
+ barotrauma.HighPressureMultiplier *= highMultiplier.Value;
+ barotrauma.LowPressureModifier += lowModifier.Value;
+ barotrauma.LowPressureMultiplier *= lowMultiplier.Value;
}
}
@@ -156,6 +165,36 @@ namespace Content.Server.Atmos.EntitySystems
return (environmentPressure + barotrauma.HighPressureModifier) * (barotrauma.HighPressureMultiplier);
}
+ public bool TryGetPressureProtectionValues(
+ Entity ent,
+ [NotNullWhen(true)] out float? highMultiplier,
+ [NotNullWhen(true)] out float? highModifier,
+ [NotNullWhen(true)] out float? lowMultiplier,
+ [NotNullWhen(true)] out float? lowModifier)
+ {
+ highMultiplier = null;
+ highModifier = null;
+ lowMultiplier = null;
+ lowModifier = null;
+ if (!Resolve(ent, ref ent.Comp, false))
+ return false;
+
+ var comp = ent.Comp;
+ var ev = new GetPressureProtectionValuesEvent
+ {
+ HighPressureMultiplier = comp.HighPressureMultiplier,
+ HighPressureModifier = comp.HighPressureModifier,
+ LowPressureMultiplier = comp.LowPressureMultiplier,
+ LowPressureModifier = comp.LowPressureModifier
+ };
+ RaiseLocalEvent(ent, ref ev);
+ highMultiplier = ev.HighPressureMultiplier;
+ highModifier = ev.HighPressureModifier;
+ lowMultiplier = ev.LowPressureMultiplier;
+ lowModifier = ev.LowPressureModifier;
+ return true;
+ }
+
public override void Update(float frameTime)
{
_timer += frameTime;
diff --git a/Content.Server/Temperature/Systems/TemperatureSystem.cs b/Content.Server/Temperature/Systems/TemperatureSystem.cs
index 9f7057d9b6..aef4b89d50 100644
--- a/Content.Server/Temperature/Systems/TemperatureSystem.cs
+++ b/Content.Server/Temperature/Systems/TemperatureSystem.cs
@@ -293,7 +293,10 @@ public sealed class TemperatureSystem : EntitySystem
private void OnTemperatureChangeAttempt(EntityUid uid, TemperatureProtectionComponent component,
InventoryRelayedEvent args)
{
- args.Args.TemperatureDelta *= component.Coefficient;
+ var ev = new GetTemperatureProtectionEvent(component.Coefficient);
+ RaiseLocalEvent(uid, ref ev);
+
+ args.Args.TemperatureDelta *= ev.Coefficient;
}
private void OnParentChange(EntityUid uid, TemperatureComponent component,