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