#include "Subsystems/RRDADataAssetSubsystem.h" #include "RefinedRDApi.h" #include "DataAssets/RRDADirtDataAsset.h" #include "Engine/AssetManager.h" #include "AssetRegistry/AssetRegistryModule.h" #include "DataAssets/RRDABoilerDataAsset.h" #include "DataAssets/RRDACoolerDataAsset.h" #include "DataAssets/RRDAHeaterDataAsset.h" #include "DataAssets/RRDATurbineDataAsset.h" URRDADataAssetSubsystem::URRDADataAssetSubsystem() {} URRDADataAssetSubsystem* URRDADataAssetSubsystem::Get(UObject* Context) { if (IsValid(Context)) { return Context->GetWorld()->GetGameInstance()->GetSubsystem(); } 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(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(); mEnabledDataAssets.Empty(); mDisabledDataAssets.Empty(); mDirtAssets.Empty(); mTurbineAssets.Empty(); mBoilerAssets.Empty(); mCoolerAssets.Empty(); mHeaterAssets.Empty(); } void URRDADataAssetSubsystem::StartScanForDataAssets() { UAssetManager& Manager = UAssetManager::Get(); Manager.LoadPrimaryAssetsWithType(FPrimaryAssetType("RRDADataAsset")); mDisabledDataAssets.Empty(); mEnabledDataAssets.Empty(); ReCacheBoilerDataAssets(); ReCacheCoolerDataAssets(); ReCacheDirtDataAssets(); ReCacheHeaterDataAssets(); ReCacheTurbineDataAssets(); } void URRDADataAssetSubsystem::ReCacheDirtDataAssets() { mDirtAssets.Empty(); TSet DataAssets; if(FindAllDataAssetsOfClass(DataAssets)) { for (URRDADirtDataAsset* DataAsset : DataAssets) { mDirtAssets.Add(DataAsset->mItem, DataAsset); } } UE_LOG(LogRRDApi, Log, TEXT("ReCacheDirtDataAssets: %d"), mDirtAssets.Num()); } void URRDADataAssetSubsystem::ReCacheTurbineDataAssets() { mTurbineAssets.Empty(); TSet DataAssets; if(FindAllDataAssetsOfClass(DataAssets)) { for (URRDATurbineDataAsset* DataAsset : DataAssets) { if(!mTurbineAssets.Contains(DataAsset->mTier)) { mTurbineAssets.Add(DataAsset->mTier, TMap, URRDATurbineDataAsset*>()); } if(!DataAsset->mItem.ItemClass) { UE_LOG(LogRRDApi, Fatal, TEXT("TurbineDataAsset %s has no ItemClass"), *DataAsset->GetPathName()); continue; } mTurbineAssets[DataAsset->mTier].Add(DataAsset->mItem.ItemClass, DataAsset); } } UE_LOG(LogRRDApi, Log, TEXT("ReCacheTurbineDataAssets: %d"), mTurbineAssets.Num()); } void URRDADataAssetSubsystem::ReCacheBoilerDataAssets() { mBoilerAssets.Empty(); TSet DataAssets; if(FindAllDataAssetsOfClass(DataAssets)) { for (URRDABoilerDataAsset* DataAsset : DataAssets) { if(!mBoilerAssets.Contains(DataAsset->mTier)) { mBoilerAssets.Add(DataAsset->mTier, TMap, URRDABoilerDataAsset*>()); } if(!DataAsset->mInput.ItemClass) { UE_LOG(LogRRDApi, Fatal, TEXT("BoilerDataAsset %s has no ItemClass"), *DataAsset->GetPathName()); continue; } mBoilerAssets[DataAsset->mTier].Add(DataAsset->mInput.ItemClass, DataAsset); } } UE_LOG(LogRRDApi, Log, TEXT("ReCacheBoilerDataAssets: %d"), mTurbineAssets.Num()); } void URRDADataAssetSubsystem::ReCacheCoolerDataAssets() { mCoolerAssets.Empty(); TSet DataAssets; if(FindAllDataAssetsOfClass(DataAssets)) { for (URRDACoolerDataAsset* DataAsset : DataAssets) { if(!mCoolerAssets.Contains(DataAsset->mType)) { mCoolerAssets.Add(DataAsset->mType, TMap, URRDACoolerDataAsset*>()); } if(!DataAsset->mItem) { UE_LOG(LogRRDApi, Fatal, TEXT("CoolerDataAsset %s has no ItemClass"), *DataAsset->GetPathName()); continue; } mCoolerAssets[DataAsset->mType].Add(DataAsset->mItem, DataAsset); } } UE_LOG(LogRRDApi, Log, TEXT("ReCacheCoolerDataAssets: %d"), mTurbineAssets.Num()); } void URRDADataAssetSubsystem::ReCacheHeaterDataAssets() { mHeaterAssets.Empty(); TSet DataAssets; if(FindAllDataAssetsOfClass(DataAssets)) { for (URRDAHeaterDataAsset* DataAsset : DataAssets) { if(!mHeaterAssets.Contains(DataAsset->mType)) { mHeaterAssets.Add(DataAsset->mType, TMap, URRDAHeaterDataAsset*>()); } if(!DataAsset->mInput.ItemClass) { UE_LOG(LogRRDApi, Fatal, TEXT("HeaterDataAsset %s has no ItemClass"), *DataAsset->GetPathName()); continue; } mHeaterAssets[DataAsset->mType].Add(DataAsset->mInput.ItemClass, DataAsset); } } UE_LOG(LogRRDApi, Log, TEXT("ReCacheHeaterDataAssets: %d"), mTurbineAssets.Num()); } int32 URRDADataAssetSubsystem::GetAllDirtItems(TArray>& Items) const { return mDirtAssets.GetKeys(Items); } URRDADirtDataAsset* URRDADataAssetSubsystem::GetDataForDirtItem(TSubclassOf Item) const { if(!Item) return nullptr; URRDADirtDataAsset* const* Desc = mDirtAssets.Find(Item); if(!Desc) return nullptr; return *Desc; }