31 TArray<FAssetData> Worlds;
32 if (!IsInGameThread())
36 IAssetRegistry *AssetRegistry = IAssetRegistry::Get();
37 if (AssetRegistry ==
nullptr)
42 Filter.ClassPaths.Add(UWorld::StaticClass()->GetClassPathName());
43 AssetRegistry->GetAssets(Filter, Worlds);
48 Roots.Add(TEXT(
"/Game/"));
49 for (
const TSharedRef<IPlugin> &Plugin : IPluginManager::Get().GetEnabledPluginsWithContent())
51 if (Plugin->GetLoadedFrom() != EPluginLoadedFrom::Engine)
53 Roots.Add(FString::Printf(TEXT(
"/%s/"), *Plugin->GetName()));
60 Worlds.RemoveAll([&Roots](
const FAssetData &World)
62 const FString PackageName = World.PackageName.ToString();
63 int32 SecondSlash = INDEX_NONE;
64 const bool bHasRoot = PackageName.FindChar(TEXT(
'/'), SecondSlash) &&
65 PackageName.Len() > 1 && PackageName.RightChop(1).FindChar(TEXT(
'/'), SecondSlash);
66 const FString Root = bHasRoot ? PackageName.Left(SecondSlash + 2) : FString();
67 return !Roots.Contains(Root) ||
68 (World.PackageFlags & PKG_CookGenerated) != 0 ||
69 PackageName.Contains(TEXT(
"/_Generated_/")) ||
70 !FPackageName::DoesPackageExist(PackageName);
114 TArray<FString> OutContentDirs;
115 const TArray<TSharedRef<IPlugin>> Plugins = IPluginManager::Get().GetDiscoveredPlugins();
116 for (
const TSharedRef<IPlugin>& Plugin : Plugins)
118 if (Plugin->GetLoadedFrom() == EPluginLoadedFrom::Engine)
124 if (!Plugin->IsEnabled())
129 FString ContentDir = Plugin->GetContentDir();
130 if (FPaths::DirectoryExists(ContentDir))
132 OutContentDirs.Add(ContentDir);
135 return OutContentDirs;
145 if (PathOrPackage.Contains(
"TestMaps"))
147 return FPaths::GetBaseFilename(PathOrPackage) != TEXT(
"EmptyMap");
149 if (PathOrPackage.Contains(
"OpenDriveMap") || PathOrPackage.Contains(
"Sublevels") ||
150 PathOrPackage.Contains(
"/BaseMap/") || PathOrPackage.Contains(
"/BaseLargeMap/") ||
151 PathOrPackage.Contains(
"_Tile_"))
158 const FString Base = FPaths::GetBaseFilename(PathOrPackage);
159 const FString Parent = FPaths::GetCleanFilename(FPaths::GetPath(PathOrPackage));
160 return Parent != TEXT(
"Maps") && Parent != Base;
168 MapNameList.RemoveAll([](
const FString& Name) {
172 for (
int i = 0; i < MapNameList.Num(); i++) {
173 MapNameList[i] = FPaths::GetBaseFilename(*MapNameList[i]);
180 const FString PackageName = World.PackageName.ToString();
185 MapNameList.AddUnique(World.AssetName.ToString());
192 for (
const FString &PackMap : ContentPacks->GetPackMapNames())
194 MapNameList.AddUnique(PackMap);
203 if (MapName.IsEmpty())
211 FString FileName = FPaths::GetBaseFilename(FilePath);
212 if (FileName.Equals(MapName, ESearchCase::IgnoreCase))
221 const FString ProjectMapPackage = FString::Printf(
222 TEXT(
"/Game/Carla/Maps/%s"), *MapName);
223 if (FPackageName::DoesPackageExist(ProjectMapPackage))
225 return ProjectMapPackage;
234 const FString CanonicalWP = FString::Printf(TEXT(
"/Game/Carla/Maps/%s/%s"), *MapName, *MapName);
236 for (
const FAssetData &World : Worlds)
238 if (!World.AssetName.ToString().Equals(MapName, ESearchCase::IgnoreCase))
242 const FString PackageName = World.PackageName.ToString();
243 if (PackageName.Equals(CanonicalWP, ESearchCase::IgnoreCase))
247 if (FirstMatch.IsEmpty())
249 FirstMatch = PackageName;
252 if (!FirstMatch.IsEmpty())
262 const FString PackMapPackage = ContentPacks->FindMapPackage(MapName);
263 if (!PackMapPackage.IsEmpty())
265 return PackMapPackage;
Mounts CARLA content packs (content-only Unreal plugins cooked as DLC against a base release,...
static UCarlaContentPackManager * Get()