using System.Linq; using Content.Server.Salvage; using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; using Content.Shared.Clothing; using Content.Shared.Item.ItemToggle.Components; namespace Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Systems; /// /// This handles artifacts that are activated by magnets, both salvage and magboots. /// public sealed class ArtifactMagnetTriggerSystem : EntitySystem { [Dependency] private readonly ArtifactSystem _artifact = default!; private readonly List _toActivate = new(); /// public override void Initialize() { SubscribeLocalEvent(OnMagnetActivated); } public override void Update(float frameTime) { base.Update(frameTime); if (!EntityQuery().Any()) return; _toActivate.Clear(); //assume that there's more magboots than artifacts var query = EntityQueryEnumerator(); while (query.MoveNext(out _, out var magboot, out var magXform, out var toggle)) { if (!toggle.Activated) continue; var artiQuery = EntityQueryEnumerator(); while (artiQuery.MoveNext(out var artifactUid, out var trigger, out var xform)) { if (!magXform.Coordinates.TryDistance(EntityManager, xform.Coordinates, out var distance)) continue; if (distance > trigger.MagbootRange) continue; _toActivate.Add(artifactUid); } } foreach (var a in _toActivate) { _artifact.TryActivateArtifact(a); } } private void OnMagnetActivated(ref SalvageMagnetActivatedEvent ev) { var magXform = Transform(ev.Magnet); var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var artifact, out var xform)) { if (!magXform.Coordinates.TryDistance(EntityManager, xform.Coordinates, out var distance)) continue; if (distance > artifact.Range) continue; _toActivate.Add(uid); } foreach (var a in _toActivate) { _artifact.TryActivateArtifact(a); } } }