using Content.Server.Clothing.Components; using Content.Server.Items; using Content.Shared.Interaction; using Content.Shared.Light.Component; using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Player; using Robust.Shared.ViewVariables; namespace Content.Server.Light.Components { /// /// Component that represents a handheld expendable light which can be activated and eventually dies over time. /// [RegisterComponent] public class ExpendableLightComponent : SharedExpendableLightComponent, IUse { /// /// Status of light, whether or not it is emitting light. /// [ViewVariables] public bool Activated => CurrentState == ExpendableLightState.Lit || CurrentState == ExpendableLightState.Fading; [ViewVariables] private float _stateExpiryTime = default; private AppearanceComponent? _appearance = default; bool IUse.UseEntity(UseEntityEventArgs eventArgs) { return TryActivate(); } protected override void Initialize() { base.Initialize(); if (IoCManager.Resolve().TryGetComponent(Owner, out var item)) { item.EquippedPrefix = "unlit"; } CurrentState = ExpendableLightState.BrandNew; Owner.EnsureComponent(); IoCManager.Resolve().TryGetComponent(Owner, out _appearance); } /// /// Enables the light if it is not active. Once active it cannot be turned off. /// public bool TryActivate() { if (!Activated && CurrentState == ExpendableLightState.BrandNew) { if (IoCManager.Resolve().TryGetComponent(Owner, out var item)) { item.EquippedPrefix = "lit"; } CurrentState = ExpendableLightState.Lit; _stateExpiryTime = GlowDuration; UpdateSpriteAndSounds(Activated); UpdateVisualizer(); return true; } return false; } private void UpdateVisualizer() { _appearance?.SetData(ExpendableLightVisuals.State, CurrentState); switch (CurrentState) { case ExpendableLightState.Lit: _appearance?.SetData(ExpendableLightVisuals.Behavior, TurnOnBehaviourID); break; case ExpendableLightState.Fading: _appearance?.SetData(ExpendableLightVisuals.Behavior, FadeOutBehaviourID); break; case ExpendableLightState.Dead: _appearance?.SetData(ExpendableLightVisuals.Behavior, string.Empty); break; } } private void UpdateSpriteAndSounds(bool on) { if (IoCManager.Resolve().TryGetComponent(Owner, out SpriteComponent? sprite)) { switch (CurrentState) { case ExpendableLightState.Lit: { SoundSystem.Play(Filter.Pvs(Owner), LitSound.GetSound(), Owner); if (IconStateLit != string.Empty) { sprite.LayerSetState(2, IconStateLit); sprite.LayerSetShader(2, "shaded"); } sprite.LayerSetVisible(1, true); break; } case ExpendableLightState.Fading: { break; } default: case ExpendableLightState.Dead: { if (DieSound != null) SoundSystem.Play(Filter.Pvs(Owner), DieSound.GetSound(), Owner); sprite.LayerSetState(0, IconStateSpent); sprite.LayerSetShader(0, "shaded"); sprite.LayerSetVisible(1, false); break; } } } if (IoCManager.Resolve().TryGetComponent(Owner, out ClothingComponent? clothing)) { clothing.ClothingEquippedPrefix = on ? "Activated" : string.Empty; } } public void Update(float frameTime) { if (!Activated) return; _stateExpiryTime -= frameTime; if (_stateExpiryTime <= 0f) { switch (CurrentState) { case ExpendableLightState.Lit: CurrentState = ExpendableLightState.Fading; _stateExpiryTime = FadeOutDuration; UpdateVisualizer(); break; default: case ExpendableLightState.Fading: CurrentState = ExpendableLightState.Dead; IoCManager.Resolve().GetComponent(Owner).EntityName = SpentName; IoCManager.Resolve().GetComponent(Owner).EntityDescription = SpentDesc; UpdateSpriteAndSounds(Activated); UpdateVisualizer(); if (IoCManager.Resolve().TryGetComponent(Owner, out var item)) { item.EquippedPrefix = "unlit"; } break; } } } } }