125 lines
3.5 KiB
C++

#include "Subsystems/RRDADataAssetSubsystem.h"
#include "RefinedRDApi.h"
#include "DataAssets/RRDADirtDataAsset.h"
#include "Engine/AssetManager.h"
#include "AssetRegistry/AssetRegistryModule.h"
URRDADataAssetSubsystem::URRDADataAssetSubsystem() {}
URRDADataAssetSubsystem* URRDADataAssetSubsystem::Get(UObject* Context)
{
if (IsValid(Context))
{
return Context->GetWorld()->GetSubsystem<URRDADataAssetSubsystem>();
}
return nullptr;
}
URRDADataAssetSubsystem* URRDADataAssetSubsystem::GetChecked(UObject* Context)
{
URRDADataAssetSubsystem* Subsystem = Get(Context);
fgcheck(Subsystem);
return Subsystem;
}
void URRDADataAssetSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
Super::Initialize(Collection);
FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(FName("AssetRegistry"));
IAssetRegistry& AssetRegistry = AssetRegistryModule.Get();
// Must wait until all assets are discovered before populating list of assets.
if (AssetRegistry.IsLoadingAssets()) {
AssetRegistry.OnFilesLoaded().AddUObject(this, &URRDADataAssetSubsystem::StartScanForDataAssets);
}
else {
StartScanForDataAssets();
}
}
void URRDADataAssetSubsystem::Deinitialize()
{
Super::Deinitialize();
}
void URRDADataAssetSubsystem::StartScanForDataAssets()
{
/*UAssetManager& Manager = UAssetManager::Get();
Manager.LoadPrimaryAssetsWithType(FPrimaryAssetType("RRDADataAsset"));*/
// Find list of all UStat, and USkill assets in Content Browser.
FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(FName("AssetRegistry"));
IAssetRegistry& AssetRegistry = AssetRegistryModule.Get();
TArray<FAssetData> AssetList;
AssetRegistry.GetAssetsByClass(FName("RRDADataAssetBase"), AssetList);
// Split assets into separate arrays.
for (const FAssetData& Asset : AssetList) {
UObject* Obj = Asset.GetAsset();
// Cast the Obj to other data asset classes
if (Obj->GetClass()->IsChildOf(URRDADirtDataAsset::StaticClass())) {
auto DirtDataAsset = Cast<URRDADirtDataAsset>(Obj);
mDirtAssets.Add(DirtDataAsset->mItem, DirtDataAsset);
}
}
mDisabledDataAssets.Empty();
mAllDataAssets.Empty();
ReCacheBoilerDataAssets();
ReCacheCoolerDataAssets();
ReCacheDirtDataAssets();
ReCacheHeaterDataAssets();
ReCacheTurbineDataAssets();
}
void URRDADataAssetSubsystem::ReCacheDirtDataAssets()
{
mDirtAssets.Empty();
TSet<URRDADirtDataAsset*> DirtDataAssets;
if(FindAllDataAssetsOfClass(DirtDataAssets))
{
for (URRDADirtDataAsset* DirtDataAsset : DirtDataAssets)
{
mDirtAssets.Add(DirtDataAsset->mItem, DirtDataAsset);
}
}
UE_LOG(LogRRDApi, Log, TEXT("ReCacheDirtDataAssets: %d"), mDirtAssets.Num());
}
void URRDADataAssetSubsystem::ReCacheTurbineDataAssets()
{
UE_LOG(LogRRDApi, Log, TEXT("ReCacheTurbineDataAssets"));
}
void URRDADataAssetSubsystem::ReCacheBoilerDataAssets() {
UE_LOG(LogRRDApi, Log, TEXT("ReCacheBoilerDataAssets"));
}
void URRDADataAssetSubsystem::ReCacheCoolerDataAssets() {
UE_LOG(LogRRDApi, Log, TEXT("ReCacheCoolerDataAssets"));
}
void URRDADataAssetSubsystem::ReCacheHeaterDataAssets() {
UE_LOG(LogRRDApi, Log, TEXT("ReCacheHeaterDataAssets"));
}
int32 URRDADataAssetSubsystem::GetAllDirtItems(TArray<TSubclassOf<UFGItemDescriptor>>& Items) const
{
return mDirtAssets.GetKeys(Items);
}
URRDADirtDataAsset* URRDADataAssetSubsystem::GetDataForDirtItem(TSubclassOf<UFGItemDescriptor> Item) const
{
if(!Item) return nullptr;
URRDADirtDataAsset* const* Desc = mDirtAssets.Find(Item);
if(!Desc) return nullptr;
return *Desc;
}