using System.Linq;
using Content.Shared.Chemistry.Components;
using Content.Shared.Fluids;
using Content.Shared.FootPrint;
namespace Content.Server.Fluids.EntitySystems;
public sealed partial class AbsorbentSystem
{
[Dependency] private readonly EntityLookupSystem _lookup = default!;
///
/// Tries to clean a number of footprints in a range determined by the component. Returns the number of cleaned footprints.
///
private int TryCleanNearbyFootprints(EntityUid user, EntityUid target, Entity used, Entity absorbentSoln)
{
var footprintQuery = GetEntityQuery();
var targetCoords = Transform(target).Coordinates;
var entities = _lookup.GetEntitiesInRange(targetCoords, used.Comp.FootprintCleaningRange, LookupFlags.Uncontained);
// Take up to [MaxCleanedFootprints] footprints closest to the target
var cleaned = entities.AsEnumerable()
.Select(uid => (uid, dst: Transform(uid).Coordinates.TryDistance(EntityManager, _transform, targetCoords, out var dst) ? dst : 0f))
.Where(ent => ent.dst > 0f)
.OrderBy(ent => ent.dst)
.Select(ent => (ent.uid, comp: footprintQuery.GetComponent(ent.uid)));
// And try to interact with each one of them, ignoring useDelay
var processed = 0;
foreach (var (uid, footprintComp) in cleaned)
{
if (TryPuddleInteract(user, used.Owner, uid, used.Comp, useDelay: null, absorbentSoln))
processed++;
if (processed >= used.Comp.MaxCleanedFootprints)
break;
}
return processed;
}
}