// 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 "Engine/AssetManager.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); 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 mAllDataAssets; }; template bool URRDADataAssetSubsystem::FindAllDataAssetsOfClass(TSet& OutDataAssets) { OutDataAssets.Empty(); // This doesn't work the AssetDatas are always invalid /*UAssetManager& Manager = UAssetManager::Get(); TArray AssetDatas; Manager.GetPrimaryAssetDataList(FPrimaryAssetType("RRDADataAsset"), AssetDatas); for (FAssetData AssetData : AssetDatas) { if(AssetData.IsValid()) { if(URRDADataAssetBase* Asset = Cast(AssetData.GetAsset())) { if(!URRDADataAssetBase::IsEnabled(Asset, GetWorld())) { UE_LOG(LogRRDApi, Error, TEXT("Asset Disabled: %s"), *AssetData.AssetName.ToString()); continue; } OutDataAssets.Add(Cast(Asset)); UE_LOG(LogRRDApi, Log, TEXT("Found %s"), *AssetData.GetAsset()->GetPathName()); } } else { UE_LOG(LogRRDApi, Error, TEXT("Invalid AssetData: %s"), *AssetData.AssetName.ToString()); return false; } }*/ 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; }