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,