using Content.Server.Salvage; using Content.Server.Xenoarchaeology.Artifact.XAT.Components; using Content.Shared.Clothing; using Content.Shared.Item.ItemToggle.Components; using Content.Shared.Xenoarchaeology.Artifact.Components; using Content.Shared.Xenoarchaeology.Artifact.XAT; namespace Content.Server.Xenoarchaeology.Artifact.XAT; /// /// System for checking if magnets-related xeno artifact node should be triggered. /// Works with magboots and salvage magnet, salvage magnet triggers only upon pulsing on activation. /// public sealed class XATMagnetSystem : BaseQueryUpdateXATSystem { [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!; /// Pre-allocated and re-used collection. private HashSet> _magbootEntities = new(); /// public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnMagnetActivated); } /// protected override void UpdateXAT(Entity artifact, Entity node, float frameTime) { var coords = Transform(artifact.Owner).Coordinates; _magbootEntities.Clear(); _lookup.GetEntitiesInRange(coords, node.Comp1.MagbootsRange, _magbootEntities); foreach (var ent in _magbootEntities) { if(!TryComp(ent, out var itemToggle) || !itemToggle.Activated) continue; Trigger(artifact, node); break; } } private void OnMagnetActivated(ref SalvageMagnetActivatedEvent args) { var magnetCoordinates = Transform(args.Magnet).Coordinates; var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var comp, out var node)) { if (node.Attached == null) continue; var artifact = _xenoArtifactQuery.Get(GetEntity(node.Attached.Value)); if (!CanTrigger(artifact, (uid, node))) continue; var artifactCoordinates = Transform(artifact).Coordinates; if (_transform.InRange(magnetCoordinates, artifactCoordinates, comp.MagnetRange)) Trigger(artifact, (uid, comp, node)); } } }