using Content.Client.Atmos.Components; using Content.Shared.Atmos.Components; using Content.Shared.Atmos.EntitySystems; using Content.Shared.Rounding; using Robust.Client.GameObjects; namespace Content.Client.Atmos.EntitySystems; /// /// This system handles sprite changes for a /// with a when its changes. /// public sealed partial class MaxPressureVisualsSystem : EntitySystem { [Dependency] private SpriteSystem _sprite = default!; /// public override void Initialize() { SubscribeLocalEvent(OnMaxPressureInit); SubscribeLocalEvent(OnAppearanceChange); } private void OnMaxPressureInit(Entity entity, ref ComponentInit args) { if (!TryComp(entity, out var sprite)) return; ArgumentOutOfRangeException.ThrowIfNegativeOrZero(entity.Comp.IntegritySteps); if (_sprite.LayerMapTryGet((entity, sprite), MaxPressureVisualLayers.Base, out _, false)) { _sprite.LayerSetRsiState((entity, sprite), MaxPressureVisualLayers.Base, $"{entity.Comp.IntegrityMask}"); _sprite.LayerSetVisible((entity, sprite), MaxPressureVisualLayers.Base, false); } if (_sprite.LayerMapTryGet((entity, sprite), MaxPressureVisualLayers.BaseUnshaded, out _, false)) { _sprite.LayerSetRsiState((entity, sprite), MaxPressureVisualLayers.BaseUnshaded, $"{entity.Comp.IntegrityState}-unshaded-0"); _sprite.LayerSetVisible((entity, sprite), MaxPressureVisualLayers.BaseUnshaded, false); } } private void OnAppearanceChange(Entity entity, ref AppearanceChangeEvent args) { if (args.Sprite is not { } sprite) return; if (!args.AppearanceData.TryGetValue(GasIntegrity.Integrity, out var obj) || obj is not float integrity) return; if (!args.AppearanceData.TryGetValue(GasIntegrity.MaxIntegrity, out obj) || obj is not float maxIntegrity) return; // We don't want visuals at max integrity, so we return if we're at max. if (integrity >= maxIntegrity) { _sprite.LayerSetVisible((entity, sprite), MaxPressureVisualLayers.Base, false); _sprite.LayerSetVisible((entity, sprite), MaxPressureVisualLayers.BaseUnshaded, false); return; } _sprite.LayerSetVisible((entity, sprite), MaxPressureVisualLayers.Base, true); _sprite.LayerSetVisible((entity, sprite), MaxPressureVisualLayers.BaseUnshaded, true); // Subtract our integrity + 1 to get an accurate step count. if (entity.Comp.IntegritySteps > 1) { var step = ContentHelpers.RoundToEqualLevels(maxIntegrity - integrity - 1, maxIntegrity, entity.Comp.IntegritySteps); _sprite.LayerSetRsiState((entity, sprite), MaxPressureVisualLayers.BaseUnshaded, $"{entity.Comp.IntegrityState}-unshaded-{step}"); } else { _sprite.LayerSetRsiState((entity, sprite), MaxPressureVisualLayers.BaseUnshaded, $"{entity.Comp.IntegrityState}-unshaded-0"); } } }