How to find blueprints by parent BP?

Hi.

I need to find in my game package all blueprints, wich has same parent BP.

For example, my Wood_Table_Blueprint has parent BP, named as FurnitureMainClass.

I need to finds all BPs in game package. Please do not confuse this task with finding BPs, that placed at the scene and could be founded by Get All Actors By Class.

My task is different. I need to find BPs in game package (ie, in file system) and build.

I need it for building my Game Inventory Menu.

Solved with the code

UObject * AMyNativePlayerController::MyGetAsset(FAssetData & asset) {
	if (!asset.IsValid())
	{
		return NULL;
	}

	UObject * Asset = FindObject<UObject>(NULL, *asset.ObjectPath.ToString());
	if (Asset == NULL)
	{
		FString tmpstring = asset.ObjectPath.ToString();
		UObject * InOuter = NULL;
		ResolveName(InOuter, tmpstring, true, true);

		GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Magenta, TEXT("Now string is ") + tmpstring);
		if (InOuter) {
			GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Magenta, TEXT("InOuter->GetName is ") + InOuter->GetName());
			Asset = StaticFindObjectFast(UObject::StaticClass(), InOuter, *tmpstring);
		}
		if (Asset) {
			GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Black, TEXT("WOW I Have Load Something with StaticFindObjectFast!") + Asset->GetName());
			return Asset;
		}

		Asset = (UObject *)StaticLoadObject(UBlueprint::StaticClass(), NULL, *asset.ObjectPath.ToString());
		if (!Asset)
			GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Red, TEXT(" FAILED LOAD Object like BLUEPRINT By StaticLoadObject"));
		else {
			GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Blue, TEXT(" LOADED like BLUEPRINT By StaticLoadObject"));
			return Asset;
		}

		Asset = (UObject *)StaticLoadObject(UObject::StaticClass(), NULL, *asset.ObjectPath.ToString());
		if (!Asset)
			GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Red, TEXT(" FAILED LOAD Object like UOBJECT By StaticLoadObject"));
		else {
			GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Blue, TEXT(" LOADED like UOBJECT By StaticLoadObject"));
			return Asset;
		}

		Asset = (UObject *)LoadObject<UBlueprint>(NULL, *asset.ObjectPath.ToString());
		if (!Asset)
			GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Red, TEXT(" FAILED LOAD Object like BLUERPRINT "));
		else {
			GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Blue, TEXT(" LOADED like BLUEPRINT By LoadObject"));
			return Asset;
		}

		Asset = LoadObject<UObject>(NULL, *asset.ObjectPath.ToString());
		if (!Asset)
			GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Red, TEXT(" EVEN FAILED LOAD Object like UOBJECT "));
		else {
			GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Blue, TEXT(" LOADED like UOBJECT By LoadObject"));
			return Asset;
		}
	}

	return (UObject*)Asset;
}


void AMyNativePlayerController::IndexGameObjects() {

	TArray<FString> controlArray;

	TArray<FString> GameObjects_ClassNamesLocal;
	TArray<FString> GameObjects_PathToBlueprintLocal;
	TArray<FString> GameObjects_PathToLogoLocal;



	UObjectLibrary * lib = UObjectLibrary::CreateLibrary(AMyFurnitureActor::StaticClass(), true, true);

	lib->AddToRoot();
	int32 loaded = lib->LoadBlueprintAssetDataFromPath("/Game/");
	//GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Cyan, FString::FromInt(loaded) + TEXT(" objects loaded for lib  "));

	TArray<FAssetData> Assets;
	lib->GetAssetDataList(Assets);
	for (int32 i = 0; i < Assets.Num(); ++i) {
		FAssetData& assetData = Assets[i];
		//GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("Get ship: check obj - ") + assetData.AssetName.ToString());

		if (!MyGetAsset(assetData))
			GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Red, TEXT("Get ship: Failed to load object by GetAsset - ") + assetData.AssetName.ToString());


		//GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Green, TEXT("INFO Class Name - ") + assetData.GetClass()->GetName());
		//GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Green, TEXT("INFO FullName - ") + assetData.GetFullName());
		//GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Green, TEXT("INFO AssetClass - ") + assetData.AssetClass.ToString());
		//GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Green, TEXT("INFO ObjectPath - ") + assetData.ObjectPath.ToString());
		//GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Green, TEXT("INFO IsAssetLoaded - ") + (assetData.IsAssetLoaded() ? FString("YES") : FString("NO")));
		//GEngine->AddOnScreenDebugMessage(-1, 15.f, FColor::Green, TEXT("INFO IsValid - ") + (assetData.IsValid() ? FString("YES") : FString("NO")));

		FString assetDataObjectPath = assetData.ObjectPath.ToString();

		if (assetDataObjectPath.Contains(TEXT("forBuildMode"))) {

			if (!controlArray.Contains(assetDataObjectPath)) {

				controlArray.Add(assetDataObjectPath);

				auto cls = StaticLoadObject(UObject::StaticClass(), nullptr, *assetDataObjectPath);

				//GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("assetDataObjectPath ") + assetDataObjectPath);

				if (!cls) {
					GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("Failed to load UClass ") + assetDataObjectPath);
					GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("----------------------------- "));
				}

				FString p = assetDataObjectPath.Left(assetDataObjectPath.Find(TEXT("_Blueprint."), ESearchCase::CaseSensitive, ESearchDir::FromStart));
				
				GameObjects_PathToBlueprintLocal.Add(p + "_Blueprint");
				GameObjects_PathToLogoLocal.Add(p + "_logo");

				int32 pos = p.Find(TEXT("/"), ESearchCase::IgnoreCase, ESearchDir::FromEnd) + 1;
				pos = p.Len() - pos;
				p = p.Right(pos);
				p = p + "_Blueprint_C";

				/*GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("pos= ") + FString::FromInt(pos));
				GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("p= ")+p);*/

				GameObjects_ClassNamesLocal.Add(p);

			}

		}
	}

	// ----------------------------------------------------



	UMyFurnitureSaveDB* SaveGameInstance = Cast<UMyFurnitureSaveDB>(UGameplayStatics::CreateSaveGameObject(UMyFurnitureSaveDB::StaticClass()));
	SaveGameInstance->GameObjects_ClassNames = GameObjects_ClassNamesLocal;
	SaveGameInstance->GameObjects_PathToBlueprint = GameObjects_PathToBlueprintLocal;
	SaveGameInstance->GameObjects_PathToLogo = GameObjects_PathToLogoLocal;
	UGameplayStatics::SaveGameToSlot(SaveGameInstance, SaveGameInstance->SaveSlotName, SaveGameInstance->UserIndex);

}

In this example will be selected items, which parented by AMyFurnitureActor BP.