2024-10-25 14:45:06 +02:00

142 lines
4.5 KiB
C++

// 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<TSubclassOf<UFGItemDescriptor>>& Items) const;
UFUNCTION(BlueprintCallable, Category = "RRDA|DataAsset|FF")
URRDADirtDataAsset* GetDataForDirtItem(TSubclassOf<UFGItemDescriptor> 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<class T>
bool FindAllDataAssetsOfClass(TSet<T*>& 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<class T>
bool FindAllDataAssetsOfClassUseRegistry(TSet<T*>& OutDataAssets);
private:
UPROPERTY()
TMap<TSubclassOf<UFGItemDescriptor>, class URRDADirtDataAsset*> mDirtAssets;
TMap<int32, TMap<TSubclassOf<UFGItemDescriptor>, class URRDATurbineDataAsset*>> mTurbineAssets;
TMap<int32, TMap<TSubclassOf<UFGItemDescriptor>, class URRDABoilerDataAsset*>> mBoilerAssets;
TMap<ERRDACoolerType, TMap<TSubclassOf<UFGItemDescriptor>, class URRDACoolerDataAsset*>> mCoolerAssets;
TMap<ERRDAHeaterType, TMap<TSubclassOf<UFGItemDescriptor>, class URRDAHeaterDataAsset*>> mHeaterAssets;
public:
UPROPERTY(BlueprintReadOnly, Transient, Category = "RRDA|DataAsset")
TSet<URRDADataAssetBase*> mDisabledDataAssets;
UPROPERTY(BlueprintReadOnly, Transient, Category = "RRDA|DataAsset")
TSet<URRDADataAssetBase*> mEnabledDataAssets;
};
template <class T>
bool URRDADataAssetSubsystem::FindAllDataAssetsOfClass(TSet<T*>& OutDataAssets)
{
TArray<UClass*> FoundClasses;
GetDerivedClasses(T::StaticClass(), FoundClasses, true);
for (UClass* FoundClass : FoundClasses)
{
if(FoundClass->IsNative()) continue;
if(URRDADataAssetBase* Asset = FoundClass->GetDefaultObject<URRDADataAssetBase>())
{
if(!URRDADataAssetBase::IsEnabled(Asset, GetWorld()))
{
UE_LOG(LogRRDApi, Error, TEXT("Asset Disabled: %s"), *FoundClass->GetPathName());
continue;
}
OutDataAssets.Add(FoundClass->GetDefaultObject<T>());
UE_LOG(LogRRDApi, Log, TEXT("Found %s"), *FoundClass->GetPathName());
}
}
return OutDataAssets.Num() > 0;
}
template <class T>
bool URRDADataAssetSubsystem::FindAllDataAssetsOfClassUseRegistry(TSet<T*>& OutDataAssets)
{
OutDataAssets.Empty();
// 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(URRDADataAssetBase::StaticClass()->GetClassPathName(), AssetList, true);
// Split assets into separate arrays.
for (const FAssetData& Asset : AssetList) {
UObject* Obj = Asset.GetAsset();
if(URRDADataAssetBase* BaseAsset = Cast<URRDADataAssetBase>(Obj))
{
if(URRDADataAssetBase::IsEnabled(BaseAsset, GetWorld()))
{
UE_LOG(LogRRDApi, Log, TEXT("Found %s"), *BaseAsset->GetPathName());
OutDataAssets.Add(Cast<T>(BaseAsset));
mEnabledDataAssets.Add(BaseAsset);
}
UE_LOG(LogRRDApi, Warning, TEXT("Asset Disabled: %s"), *BaseAsset->GetPathName());
mDisabledDataAssets.Add(BaseAsset);
}
}
return OutDataAssets.Num() > 0;
}