using System; using System.Runtime.CompilerServices; using Content.Server.GameObjects.Components.Mobs; using Content.Server.Interfaces.GameObjects; using Content.Shared.Alert; using Content.Shared.Atmos; using Content.Shared.Damage; using Content.Shared.GameObjects.Components.Damage; using Robust.Shared.GameObjects; namespace Content.Server.GameObjects.Components.Atmos { /// /// Barotrauma: injury because of changes in air pressure. /// [RegisterComponent] public class BarotraumaComponent : Component { public override string Name => "Barotrauma"; [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Update(float airPressure) { if (!Owner.TryGetComponent(out IDamageableComponent? damageable)) return; var status = Owner.GetComponentOrNull(); var highPressureMultiplier = 1f; var lowPressureMultiplier = 1f; foreach (var protection in Owner.GetAllComponents()) { highPressureMultiplier *= protection.HighPressureMultiplier; lowPressureMultiplier *= protection.LowPressureMultiplier; } var pressure = MathF.Max(airPressure, 1f); switch (pressure) { // Low pressure. case var p when p <= Atmospherics.WarningLowPressure: pressure *= lowPressureMultiplier; if(pressure > Atmospherics.WarningLowPressure) goto default; damageable.ChangeDamage(DamageType.Blunt, Atmospherics.LowPressureDamage, false, Owner); if (status == null) break; if (pressure <= Atmospherics.HazardLowPressure) { status.ShowAlert(AlertType.LowPressure, 2); break; } status.ShowAlert(AlertType.LowPressure, 1); break; // High pressure. case var p when p >= Atmospherics.WarningHighPressure: pressure *= highPressureMultiplier; if(pressure < Atmospherics.WarningHighPressure) goto default; var damage = (int) MathF.Min((pressure / Atmospherics.HazardHighPressure) * Atmospherics.PressureDamageCoefficient, Atmospherics.MaxHighPressureDamage); damageable.ChangeDamage(DamageType.Blunt, damage, false, Owner); if (status == null) break; if (pressure >= Atmospherics.HazardHighPressure) { status.ShowAlert(AlertType.HighPressure, 2); break; } status.ShowAlert(AlertType.HighPressure, 1); break; // Normal pressure. default: status?.ClearAlertCategory(AlertCategory.Pressure); break; } } } }