using System.Threading.Tasks; using Content.Shared.Audio; using Content.Shared.Interaction; using Content.Shared.Smoking; using Content.Shared.Sound; using Content.Shared.Temperature; using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.GameObjects; using Robust.Shared.Player; using Robust.Shared.Serialization.Manager.Attributes; using Robust.Shared.ViewVariables; namespace Content.Server.Light.Components { [RegisterComponent] [ComponentReference(typeof(IHotItem))] public class MatchstickComponent : Component, IHotItem, IInteractUsing { public override string Name => "Matchstick"; private SharedBurningStates _currentState = SharedBurningStates.Unlit; /// /// How long will matchstick last in seconds. /// [ViewVariables(VVAccess.ReadOnly)] [DataField("duration")] private int _duration = 10; /// /// Sound played when you ignite the matchstick. /// [DataField("igniteSound")] private SoundSpecifier _igniteSound = default!; /// /// Point light component. Gives matches a glow in dark effect. /// [ComponentDependency] private readonly PointLightComponent? _pointLightComponent = default!; /// /// Current state to matchstick. Can be Unlit, Lit or Burnt. /// [ViewVariables] public SharedBurningStates CurrentState { get => _currentState; private set { _currentState = value; if (_pointLightComponent != null) { _pointLightComponent.Enabled = _currentState == SharedBurningStates.Lit; } if (Owner.TryGetComponent(out AppearanceComponent? appearance)) { appearance.SetData(SmokingVisuals.Smoking, _currentState); } } } bool IHotItem.IsCurrentlyHot() { return CurrentState == SharedBurningStates.Lit; } public void Ignite(IEntity user) { // Play Sound if (_igniteSound.TryGetSound(out var igniteSound)) { SoundSystem.Play(Filter.Pvs(Owner), igniteSound, Owner, AudioHelpers.WithVariation(0.125f).WithVolume(-0.125f)); } // Change state CurrentState = SharedBurningStates.Lit; Owner.SpawnTimer(_duration * 1000, () => CurrentState = SharedBurningStates.Burnt); } async Task IInteractUsing.InteractUsing(InteractUsingEventArgs eventArgs) { if (eventArgs.Target.TryGetComponent(out var hotItem) && hotItem.IsCurrentlyHot() && CurrentState == SharedBurningStates.Unlit) { Ignite(eventArgs.User); return true; } return false; } } }