#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/RRDAGeneratorDataAsset.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(); ReCacheGeneratorDataAssets(); } 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()); } void URRDADataAssetSubsystem::ReCacheGeneratorDataAssets() { mHeaterAssets.Empty(); TSet DataAssets; if(FindAllDataAssetsOfClass(DataAssets)) { for (URRDAGeneratorDataAsset* DataAsset : DataAssets) { mGeneratorAssets.Add(DataAsset->mTier, 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; } TArray URRDADataAssetSubsystem::GetAllDirtAssets() const { TArray Assets; mDirtAssets.GenerateValueArray(Assets); return Assets; } bool URRDADataAssetSubsystem::GetAllTurbineItems(TArray>& Items, int32 Tier) const { if(!mTurbineAssets.Contains(Tier)) { return false; } Items.Empty(); mTurbineAssets[Tier].GetKeys(Items); return true; } bool URRDADataAssetSubsystem::GetAllTurbineRelevantItems(TArray>& Items, int32 Tier) const { if(!mTurbineAssets.Contains(Tier)) { return false; } Items.Empty(); for (TTuple, URRDATurbineDataAsset*> TurbineAsset : mTurbineAssets[Tier]) { Items.AddUnique(TurbineAsset.Key); if(TurbineAsset.Value->mWasteItem.ItemClass) { Items.AddUnique(TurbineAsset.Value->mWasteItem.ItemClass); } } return true; } TArray URRDADataAssetSubsystem::GetAllTurbineAssets(int32 Tier) const { if(!mTurbineAssets.Contains(Tier)) { return TArray(); } TArray Assets; mTurbineAssets[Tier].GenerateValueArray(Assets); return Assets; } URRDATurbineDataAsset* URRDADataAssetSubsystem::GetDefaultTurbineAsset(int32 Tier) const { return GetAllTurbineAssets(Tier)[0]; } URRDATurbineDataAsset* URRDADataAssetSubsystem::GetTurbineItemData(TSubclassOf Item, int32 Tier) const { if(!mTurbineAssets.Contains(Tier)) { return nullptr; } return mTurbineAssets[Tier].FindRef(Item); } bool URRDADataAssetSubsystem::GetAllCoolerItems(TArray>& Items, ERRDACoolerType Type) const { if(!mCoolerAssets.Contains(Type)) return false; Items.Empty(); mCoolerAssets[Type].GetKeys(Items); return true; } URRDACoolerDataAsset* URRDADataAssetSubsystem::GetCoolerItemData(TSubclassOf Item, ERRDACoolerType Type) const { if(!mCoolerAssets.Contains(Type)) return nullptr; return mCoolerAssets[Type].FindRef(Item); } URRDACoolerDataAsset* URRDADataAssetSubsystem::GetDefaultCoolerAsset(ERRDACoolerType Type) const { return GetAllCoolerAssets(Type)[0]; } TArray URRDADataAssetSubsystem::GetAllCoolerAssets(ERRDACoolerType Type) const { if(!mCoolerAssets.Contains(Type)) return TArray(); TArray Assets; mCoolerAssets[Type].GenerateValueArray(Assets); return Assets; }