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));
}
}
}