// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "RefinedRDApi.h" #include "AssetRegistry/AssetRegistryModule.h" #include "DataAssets/RRDADataAssetBase.h" #include "DataAssets/RRDADirtDataAsset.h" #include "Enums/RRDARPEnums.h" #include "Resources/FGItemDescriptor.h" #include "RRDADataAssetSubsystem.generated.h" class IAssetRegistry; UCLASS() class REFINEDRDAPI_API URRDADataAssetSubsystem : public UWorldSubsystem { GENERATED_BODY() public: URRDADataAssetSubsystem(); static URRDADataAssetSubsystem* Get(UObject* Context); static URRDADataAssetSubsystem* GetChecked(UObject* Context); /** Implement this for initialization of instances of the system */ virtual void Initialize(FSubsystemCollectionBase& Collection) override; virtual void Deinitialize() override; /** * Note: call this function only in the constructor of the subsystem OR if you change some mDisabled value in runtime to refresh cached data */ UFUNCTION(BlueprintCallable, Category = "RRDA|DataAsset") void StartScanForDataAssets(); void ReCacheDirtDataAssets(); void ReCacheTurbineDataAssets(); void ReCacheBoilerDataAssets(); void ReCacheCoolerDataAssets(); void ReCacheHeaterDataAssets(); public: UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|FF") int32 GetAllDirtItems(TArray>& Items) const; UFUNCTION(BlueprintCallable, Category = "RRDA|DataAsset|FF") URRDADirtDataAsset* GetDataForDirtItem(TSubclassOf Item) const; public: /** * Find all data assets of a specific class * @param OutDataAssets - Set of data assets * @return true if found any data assets */ template bool FindAllDataAssetsOfClass(TSet& OutDataAssets); /** * @note For testing purposes only it currently finds 0 assets * @deprecated Use FindAllDataAssetsOfClass instead it uses GetDerivedClasses and get all assets of a specific class */ template bool FindAllDataAssetsOfClassUseRegistry(TSet& OutDataAssets); private: UPROPERTY() TMap, class URRDADirtDataAsset*> mDirtAssets; TMap, class URRDATurbineDataAsset*>> mTurbineAssets; TMap, class URRDABoilerDataAsset*>> mBoilerAssets; TMap, class URRDACoolerDataAsset*>> mCoolerAssets; TMap, class URRDAHeaterDataAsset*>> mHeaterAssets; public: UPROPERTY(BlueprintReadOnly, Transient, Category = "RRDA|DataAsset") TSet mDisabledDataAssets; UPROPERTY(BlueprintReadOnly, Transient, Category = "RRDA|DataAsset") TSet mEnabledDataAssets; }; template bool URRDADataAssetSubsystem::FindAllDataAssetsOfClass(TSet& OutDataAssets) { TArray FoundClasses; GetDerivedClasses(T::StaticClass(), FoundClasses, true); for (UClass* FoundClass : FoundClasses) { if(FoundClass->IsNative()) continue; if(URRDADataAssetBase* Asset = FoundClass->GetDefaultObject()) { if(!URRDADataAssetBase::IsEnabled(Asset, GetWorld())) { UE_LOG(LogRRDApi, Error, TEXT("Asset Disabled: %s"), *FoundClass->GetPathName()); continue; } OutDataAssets.Add(FoundClass->GetDefaultObject()); UE_LOG(LogRRDApi, Log, TEXT("Found %s"), *FoundClass->GetPathName()); } } return OutDataAssets.Num() > 0; } template bool URRDADataAssetSubsystem::FindAllDataAssetsOfClassUseRegistry(TSet& OutDataAssets) { OutDataAssets.Empty(); // Find list of all UStat, and USkill assets in Content Browser. FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked(FName("AssetRegistry")); IAssetRegistry& AssetRegistry = AssetRegistryModule.Get(); TArray AssetList; AssetRegistry.GetAssetsByClass(URRDADataAssetBase::StaticClass()->GetClassPathName(), AssetList, true); // Split assets into separate arrays. for (const FAssetData& Asset : AssetList) { UObject* Obj = Asset.GetAsset(); if(URRDADataAssetBase* BaseAsset = Cast(Obj)) { if(URRDADataAssetBase::IsEnabled(BaseAsset, GetWorld())) { UE_LOG(LogRRDApi, Log, TEXT("Found %s"), *BaseAsset->GetPathName()); OutDataAssets.Add(Cast(BaseAsset)); mEnabledDataAssets.Add(BaseAsset); } UE_LOG(LogRRDApi, Warning, TEXT("Asset Disabled: %s"), *BaseAsset->GetPathName()); mDisabledDataAssets.Add(BaseAsset); } } return OutDataAssets.Num() > 0; }