using System.Diagnostics.CodeAnalysis;
using Content.Shared.EntityConditions;
using Content.Shared.Mind;
namespace Content.Shared.Objectives.Systems;
///
/// This is an abstract system which is intended to query a list of entities, and acquire a hashset of valid minds from them.
/// It uses EntityQueries to limit the amount of entities which need to be checked, by IComponent.
///
public abstract partial class MindTargetSystem : GenericTargetSystem
{
[Dependency] protected SharedMindSystem Mind = default!;
public HashSet> GetMinds(EntityUid? exclude = null, params EntityCondition[] conditions)
{
var minds = new HashSet>();
AddMinds(minds, exclude, conditions);
return minds;
}
public abstract void AddMinds(HashSet> minds, EntityUid? exclude = null, params EntityCondition[] conditions);
}
///
public abstract partial class MindTargetSystem : MindTargetSystem where T : IComponent
{
public override void AddMinds(HashSet> minds, EntityUid? exclude = null, params EntityCondition[] conditions)
{
var query = EntityQueryEnumerator();
while (query.MoveNext(out var uid, out var comp))
{
if (!ValidEntity(uid, exclude, conditions) || !ValidateEntity((uid, comp), out var mind))
continue;
minds.Add(mind.Value);
}
}
protected abstract bool ValidateEntity(Entity entity, [NotNullWhen(true)] out Entity? mind);
}
///
public abstract partial class MindTargetSystem : MindTargetSystem
where T1 : IComponent
where T2 : IComponent
{
public override void AddMinds(HashSet> minds, EntityUid? exclude = null, params EntityCondition[] conditions)
{
var query = EntityQueryEnumerator();
while (query.MoveNext(out var uid, out var comp1, out var comp2))
{
if (!ValidEntity(uid, exclude, conditions) || !ValidateEntity((uid, comp1, comp2), out var mind))
continue;
minds.Add(mind.Value);
}
}
protected abstract bool ValidateEntity(Entity entity, [NotNullWhen(true)] out Entity? mind);
}
///
public abstract partial class MindTargetSystem : MindTargetSystem
where T1 : IComponent
where T2 : IComponent
where T3 : IComponent
{
public override void AddMinds(HashSet> minds, EntityUid? exclude = null, params EntityCondition[] conditions)
{
var query = EntityQueryEnumerator();
while (query.MoveNext(out var uid, out var comp1, out var comp2, out var comp3))
{
if (!ValidEntity(uid, exclude, conditions) || !ValidateEntity((uid, comp1, comp2, comp3), out var mind))
continue;
minds.Add(mind.Value);
}
}
protected abstract bool ValidateEntity(Entity entity, [NotNullWhen(true)] out Entity? mind);
}
///
public abstract partial class MindTargetSystem : MindTargetSystem
where T1 : IComponent
where T2 : IComponent
where T3 : IComponent
where T4 : IComponent
{
public override void AddMinds(HashSet> minds, EntityUid? exclude = null, params EntityCondition[] conditions)
{
var query = EntityQueryEnumerator();
while (query.MoveNext(out var uid, out var comp1, out var comp2, out var comp3, out var comp4))
{
if (!ValidEntity(uid, exclude, conditions) || !ValidateEntity((uid, comp1, comp2, comp3, comp4), out var mind))
continue;
minds.Add(mind.Value);
}
}
protected abstract bool ValidateEntity(Entity entity, [NotNullWhen(true)] out Entity? mind);
}
///
/// A mind pool that can find minds to use for objectives etc.
/// Further filtered by .
///
[ImplicitDataDefinitionForInheritors]
public partial interface IMindPool
{
///
/// Add minds for this pool to a hashset.
/// The hashset gets reused and is cleared before this is called.
/// Further filtered by .
///
/// The hashset to add to
/// IDependencyCollection, needed to resolve the correct target entity system.
/// A mind entity that must not be returned
///
/// Optional set of conditions to check each mind against for further filtering.
/// These conditions must pass for the mind to be valid.
void FindMinds(HashSet> minds, IDependencyCollection dependency, EntityUid? exclude = null, params EntityCondition[] conditions);
}
///
/// A mind pool that can find minds to use for objectives etc.
/// Searches for minds using the corresponding
///
[ImplicitDataDefinitionForInheritors]
public abstract partial class MindPool : IMindPool where T : MindTargetSystem
{
protected T TargetSystem = default!;
public void FindMinds(HashSet> minds, IDependencyCollection dependency, EntityUid? exclude = null, params EntityCondition[] conditions)
{
dependency.Resolve(ref TargetSystem);
TargetSystem.AddMinds(minds, exclude, conditions);
}
}