Procedural map list - Pak's, packages, files....

What I want to do is to procedural generate a list of maps available in my game menu.

I found some code in GameMapsSettingsCustomization.h:

const FString MapFileWildCard = FString::Printf(TEXT("*%s"), *FPackageName::GetMapPackageExtension());
	//TArray<FString> MapNames;
	IFileManager::Get().FindFilesRecursive(MapNames, *FPaths::GameContentDir(), *MapFileWildCard, true, false);
	MapNames.Sort(](const FString& A, const FString& B) { return FPaths::GetBaseFilename(A) < FPaths::GetBaseFilename(B); });

	for (int i = 0; i < MapNames.Num(); ++i)
		UE_LOG(LogClass, Log, TEXT("GameContentDir map: %s"), *MapNames*);

But stepping through FindFilesRecursive I find it is using the windows file system to look for files, so this isn’t going to look inside pak files for files?

I made a custom pak file that has a umap in it, and it is not showing up in FindFilesRecursive, I can see my Pak file is mounted at load time.
Is there something similar to FindFilesRecursive that searches Pak files?

And does a UPackage represent a file that is inside a Pak file? From my searching through the code this appears to be the case but I’m not sure.

anyone have any clue?

I ended with something like this, this piece of code had to load list of maps that are in the specified pak, but then I realized that I didn’t get “friendly/localized” map name with this solution:) And I wrote another solution with simple pak/mod/plugin descriptor.

Of course it need some code hacking at the engine side. This:

TArray<FPakPlatformFile::FPakListEntry> MountedPaks; can't be declared outside engine dll, because it isn't exported from it.

FPakPlatformFile* PakPlatformFile = new FPakPlatformFile();
PakPlatformFile->Initialize(&InnerPlatformFile, TEXT(""));

PakPlatformFile->Mount(*PakToLoad, 0, *(ModDir /*+ TEXT("/") + ModPakFileName*/));

TArray<FPakPlatformFile::FPakListEntry> MountedPaks;

//ignore first pak, because it is default game pak and we don't need iterate over it
for (int32 i = 1; i < MountedPaks.Num();i++)
	const FPakPlatformFile::FPakListEntry& mountedPak = MountedPaks*;
	const TMap<FString, FPakDirectory>& pakDirectoryMap = mountedPak.PakFile->GetIndex();

        for (TMap<FString, FPakDirectory>::TConstIterator It(pakDirectoryMap); It; ++It)
		FString Key = It.Key();
		const FPakDirectory& Val = It.Value();

		for (FPakDirectory::TConstIterator It2(Val); It2; ++It2)
			FString Key2 = It2.Key();
			FPakEntry* pakEntry = It2.Value();

	         	if (Key2.Contains(TEXT(".umap")))
                                //this is where you will get map name of course if your map have *.umap extension:)
				Key2 = Key2;

Thanks, that is working great!