| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- using Content.Server.Light.Components;
- using Content.Shared.Clothing.Components;
- using Content.Shared.Clothing.EntitySystems;
- using Content.Shared.IgnitionSource;
- using Content.Shared.Interaction.Events;
- using Content.Shared.Item;
- using Content.Shared.Light.Components;
- using Content.Shared.Tag;
- using Content.Shared.Verbs;
- using JetBrains.Annotations;
- using Robust.Server.GameObjects;
- using Robust.Shared.Audio.Systems;
- using Robust.Shared.Utility;
- namespace Content.Server.Light.EntitySystems
- {
- [UsedImplicitly]
- public sealed class ExpendableLightSystem : EntitySystem
- {
- [Dependency] private readonly SharedItemSystem _item = default!;
- [Dependency] private readonly ClothingSystem _clothing = default!;
- [Dependency] private readonly TagSystem _tagSystem = default!;
- [Dependency] private readonly SharedAudioSystem _audio = default!;
- [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
- [Dependency] private readonly MetaDataSystem _metaData = default!;
- public override void Initialize()
- {
- base.Initialize();
- SubscribeLocalEvent<ExpendableLightComponent, ComponentInit>(OnExpLightInit);
- SubscribeLocalEvent<ExpendableLightComponent, UseInHandEvent>(OnExpLightUse);
- SubscribeLocalEvent<ExpendableLightComponent, GetVerbsEvent<ActivationVerb>>(AddIgniteVerb);
- }
- public override void Update(float frameTime)
- {
- var query = EntityQueryEnumerator<ExpendableLightComponent>();
- while (query.MoveNext(out var uid, out var light))
- {
- UpdateLight((uid, light), frameTime);
- }
- }
- private void UpdateLight(Entity<ExpendableLightComponent> ent, float frameTime)
- {
- var component = ent.Comp;
- if (!component.Activated)
- return;
- component.StateExpiryTime -= frameTime;
- if (component.StateExpiryTime <= 0f)
- {
- switch (component.CurrentState)
- {
- case ExpendableLightState.Lit:
- component.CurrentState = ExpendableLightState.Fading;
- component.StateExpiryTime = component.FadeOutDuration;
- UpdateVisualizer(ent);
- break;
- default:
- case ExpendableLightState.Fading:
- component.CurrentState = ExpendableLightState.Dead;
- var meta = MetaData(ent);
- _metaData.SetEntityName(ent, Loc.GetString(component.SpentName), meta);
- _metaData.SetEntityDescription(ent, Loc.GetString(component.SpentDesc), meta);
- _tagSystem.AddTag(ent, "Trash");
- UpdateSounds(ent);
- UpdateVisualizer(ent);
- if (TryComp<ItemComponent>(ent, out var item))
- {
- _item.SetHeldPrefix(ent, "unlit", component: item);
- }
- break;
- }
- }
- }
- /// <summary>
- /// Enables the light if it is not active. Once active it cannot be turned off.
- /// </summary>
- public bool TryActivate(Entity<ExpendableLightComponent> ent)
- {
- var component = ent.Comp;
- if (!component.Activated && component.CurrentState == ExpendableLightState.BrandNew)
- {
- if (TryComp<ItemComponent>(ent, out var item))
- {
- _item.SetHeldPrefix(ent, "lit", component: item);
- }
- var ignite = new IgnitionEvent(true);
- RaiseLocalEvent(ent, ref ignite);
- component.CurrentState = ExpendableLightState.Lit;
- component.StateExpiryTime = component.GlowDuration;
- UpdateSounds(ent);
- UpdateVisualizer(ent);
- return true;
- }
- return false;
- }
- private void UpdateVisualizer(Entity<ExpendableLightComponent> ent, AppearanceComponent? appearance = null)
- {
- var component = ent.Comp;
- if (!Resolve(ent, ref appearance, false))
- return;
- _appearance.SetData(ent, ExpendableLightVisuals.State, component.CurrentState, appearance);
- switch (component.CurrentState)
- {
- case ExpendableLightState.Lit:
- _appearance.SetData(ent, ExpendableLightVisuals.Behavior, component.TurnOnBehaviourID, appearance);
- break;
- case ExpendableLightState.Fading:
- _appearance.SetData(ent, ExpendableLightVisuals.Behavior, component.FadeOutBehaviourID, appearance);
- break;
- case ExpendableLightState.Dead:
- _appearance.SetData(ent, ExpendableLightVisuals.Behavior, string.Empty, appearance);
- var ignite = new IgnitionEvent(false);
- RaiseLocalEvent(ent, ref ignite);
- break;
- }
- }
- private void UpdateSounds(Entity<ExpendableLightComponent> ent)
- {
- var component = ent.Comp;
- switch (component.CurrentState)
- {
- case ExpendableLightState.Lit:
- _audio.PlayPvs(component.LitSound, ent);
- break;
- case ExpendableLightState.Fading:
- break;
- default:
- _audio.PlayPvs(component.DieSound, ent);
- break;
- }
- if (TryComp<ClothingComponent>(ent, out var clothing))
- {
- _clothing.SetEquippedPrefix(ent, component.Activated ? "Activated" : string.Empty, clothing);
- }
- }
- private void OnExpLightInit(EntityUid uid, ExpendableLightComponent component, ComponentInit args)
- {
- if (TryComp<ItemComponent>(uid, out var item))
- {
- _item.SetHeldPrefix(uid, "unlit", component: item);
- }
- component.CurrentState = ExpendableLightState.BrandNew;
- EntityManager.EnsureComponent<PointLightComponent>(uid);
- }
- private void OnExpLightUse(Entity<ExpendableLightComponent> ent, ref UseInHandEvent args)
- {
- if (args.Handled)
- return;
- if (TryActivate(ent))
- args.Handled = true;
- }
- private void AddIgniteVerb(Entity<ExpendableLightComponent> ent, ref GetVerbsEvent<ActivationVerb> args)
- {
- if (!args.CanAccess || !args.CanInteract)
- return;
- if (ent.Comp.CurrentState != ExpendableLightState.BrandNew)
- return;
- // Ignite the flare or make the glowstick glow.
- // Also hot damn, those are some shitty glowsticks, we need to get a refund.
- ActivationVerb verb = new()
- {
- Text = Loc.GetString("expendable-light-start-verb"),
- Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/light.svg.192dpi.png")),
- Act = () => TryActivate(ent)
- };
- args.Verbs.Add(verb);
- }
- }
- }
|