ArtifactMagnetTriggerSystem.cs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using System.Linq;
  2. using Content.Server.Salvage;
  3. using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components;
  4. using Content.Shared.Clothing;
  5. using Content.Shared.Item.ItemToggle.Components;
  6. namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems;
  7. /// <summary>
  8. /// This handles artifacts that are activated by magnets, both salvage and magboots.
  9. /// </summary>
  10. public sealed class ArtifactMagnetTriggerSystem : EntitySystem
  11. {
  12. [Dependency] private readonly ArtifactSystem _artifact = default!;
  13. private readonly List<EntityUid> _toActivate = new();
  14. /// <inheritdoc/>
  15. public override void Initialize()
  16. {
  17. SubscribeLocalEvent<SalvageMagnetActivatedEvent>(OnMagnetActivated);
  18. }
  19. public override void Update(float frameTime)
  20. {
  21. base.Update(frameTime);
  22. if (!EntityQuery<ArtifactMagnetTriggerComponent>().Any())
  23. return;
  24. _toActivate.Clear();
  25. //assume that there's more magboots than artifacts
  26. var query = EntityQueryEnumerator<MagbootsComponent, TransformComponent, ItemToggleComponent>();
  27. while (query.MoveNext(out _, out var magboot, out var magXform, out var toggle))
  28. {
  29. if (!toggle.Activated)
  30. continue;
  31. var artiQuery = EntityQueryEnumerator<ArtifactMagnetTriggerComponent, TransformComponent>();
  32. while (artiQuery.MoveNext(out var artifactUid, out var trigger, out var xform))
  33. {
  34. if (!magXform.Coordinates.TryDistance(EntityManager, xform.Coordinates, out var distance))
  35. continue;
  36. if (distance > trigger.MagbootRange)
  37. continue;
  38. _toActivate.Add(artifactUid);
  39. }
  40. }
  41. foreach (var a in _toActivate)
  42. {
  43. _artifact.TryActivateArtifact(a);
  44. }
  45. }
  46. private void OnMagnetActivated(ref SalvageMagnetActivatedEvent ev)
  47. {
  48. var magXform = Transform(ev.Magnet);
  49. var query = EntityQueryEnumerator<ArtifactMagnetTriggerComponent, TransformComponent>();
  50. while (query.MoveNext(out var uid, out var artifact, out var xform))
  51. {
  52. if (!magXform.Coordinates.TryDistance(EntityManager, xform.Coordinates, out var distance))
  53. continue;
  54. if (distance > artifact.Range)
  55. continue;
  56. _toActivate.Add(uid);
  57. }
  58. foreach (var a in _toActivate)
  59. {
  60. _artifact.TryActivateArtifact(a);
  61. }
  62. }
  63. }