TArray AmbitWorldHelpers::GetActorsByMatchBy()

in Ambit/Source/Ambit/Utils/AmbitWorldHelpers.cpp [37:82]


TArray<AActor*> AmbitWorldHelpers::GetActorsByMatchBy(const EMatchBy& MatchBy, const FString& NamePattern,
                                                      const TArray<FName>& TagsList, const bool bMatchExactName)
{
    TArray<AActor*> AllActors;
    UGameplayStatics::GetAllActorsOfClass(GEngine->GetWorldContexts()[0].World(), AActor::StaticClass(), AllActors);

    // Filter actors to just those matching criteria.
    bool bNamePatternIsEmpty = NamePattern.IsEmpty();
    bool bTagsListIsEmpty = TagsList.Num() == 0;

    return AllActors.FilterByPredicate(
        [MatchBy, NamePattern, TagsList, bNamePatternIsEmpty, bTagsListIsEmpty, bMatchExactName](const AActor* Actor)
        {
            // if name pattern is empty, default to false. Else match to the name pattern.
            bool bMatchesName = false;

            if (!bNamePatternIsEmpty && (bMatchExactName && Actor->GetName() == NamePattern || Actor->GetName().
                Contains(NamePattern)))
            {
                bMatchesName = true;
            }

            // if the tags list is empty, default to false. Else match to tags.
            bool bMatchesTags = !bTagsListIsEmpty;
            for (FName Tag : TagsList)
            {
                if (!Actor->Tags.Contains(Tag))
                {
                    bMatchesTags = false;
                    break;
                }
            }

            switch (MatchBy)
            {
                case EMatchBy::NameAndTags:
                    return bMatchesName && bMatchesTags;

                case EMatchBy::NameOrTags:
                    return bMatchesName || bMatchesTags;

                default:
                    return false;
            }
        });
}