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