ArtifactMusicTriggerSystem.cs 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. using System.Linq;
  2. using Content.Server.Instruments;
  3. using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components;
  4. namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems;
  5. /// <summary>
  6. /// This handles activating an artifact when music is playing nearby
  7. /// </summary>
  8. public sealed class ArtifactMusicTriggerSystem : EntitySystem
  9. {
  10. [Dependency] private readonly ArtifactSystem _artifact = default!;
  11. private readonly List<Entity<ArtifactMusicTriggerComponent, TransformComponent>> _artifacts = new();
  12. public override void Update(float frameTime)
  13. {
  14. base.Update(frameTime);
  15. _artifacts.Clear();
  16. var artifactQuery = EntityQueryEnumerator<ArtifactMusicTriggerComponent, TransformComponent>();
  17. while (artifactQuery.MoveNext(out var uid, out var trigger, out var xform))
  18. {
  19. _artifacts.Add((uid, trigger, xform));
  20. }
  21. if (!_artifacts.Any())
  22. return;
  23. List<EntityUid> toActivate = new();
  24. var query = EntityQueryEnumerator<ActiveInstrumentComponent, TransformComponent>();
  25. //assume that there's more instruments than artifacts
  26. while (query.MoveNext(out _, out var instXform))
  27. {
  28. foreach (var (uid, trigger, xform) in _artifacts)
  29. {
  30. if (!instXform.Coordinates.TryDistance(EntityManager, xform.Coordinates, out var distance))
  31. continue;
  32. if (distance > trigger.Range)
  33. continue;
  34. toActivate.Add(uid);
  35. }
  36. }
  37. foreach (var a in toActivate)
  38. {
  39. _artifact.TryActivateArtifact(a);
  40. }
  41. }
  42. }