using Content.Client.Atmos.Components; using Content.Shared.Atmos; using Robust.Client.GameObjects; namespace Content.Client.Atmos.EntitySystems; /// /// This handles the display of fire effects on flammable entities. /// public sealed class FireVisualizerSystem : VisualizerSystem { public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnComponentInit); } private void OnComponentInit(EntityUid uid, FireVisualsComponent component, ComponentInit args) { if (!TryComp(uid, out var sprite)) return; sprite.LayerMapReserveBlank(FireVisualLayers.Fire); sprite.LayerSetVisible(FireVisualLayers.Fire, false); sprite.LayerSetShader(FireVisualLayers.Fire, "unshaded"); } protected override void OnAppearanceChange(EntityUid uid, FireVisualsComponent component, ref AppearanceChangeEvent args) { if (!args.Component.TryGetData(FireVisuals.OnFire, out bool onFire) || !TryComp(component.Owner, out var sprite)) return; var fireStacks = 0f; if (args.Component.TryGetData(FireVisuals.FireStacks, out float stacks)) fireStacks = stacks; SetOnFire(sprite, args.Component, component, onFire, fireStacks); } private void SetOnFire(SpriteComponent sprite, AppearanceComponent appearance, FireVisualsComponent component, bool onFire, float fireStacks) { if (component.Sprite != null) sprite.LayerSetRSI(FireVisualLayers.Fire, component.Sprite); sprite.LayerSetVisible(FireVisualLayers.Fire, onFire); if(fireStacks > component.FireStackAlternateState && !string.IsNullOrEmpty(component.AlternateState)) sprite.LayerSetState(FireVisualLayers.Fire, component.AlternateState); else sprite.LayerSetState(FireVisualLayers.Fire, component.NormalState); } } public enum FireVisualLayers : byte { Fire }