feat: RP Data Assets

This commit is contained in:
Kyrium 2024-10-25 14:45:06 +02:00
parent 90ac5dca32
commit bfd977e1e1
6 changed files with 194 additions and 67 deletions

View File

@ -4,6 +4,10 @@
#include "DataAssets/RRDADirtDataAsset.h" #include "DataAssets/RRDADirtDataAsset.h"
#include "Engine/AssetManager.h" #include "Engine/AssetManager.h"
#include "AssetRegistry/AssetRegistryModule.h" #include "AssetRegistry/AssetRegistryModule.h"
#include "DataAssets/RRDABoilerDataAsset.h"
#include "DataAssets/RRDACoolerDataAsset.h"
#include "DataAssets/RRDAHeaterDataAsset.h"
#include "DataAssets/RRDATurbineDataAsset.h"
URRDADataAssetSubsystem::URRDADataAssetSubsystem() {} URRDADataAssetSubsystem::URRDADataAssetSubsystem() {}
@ -29,6 +33,7 @@ void URRDADataAssetSubsystem::Initialize(FSubsystemCollectionBase& Collection)
FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(FName("AssetRegistry")); FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked<FAssetRegistryModule>(FName("AssetRegistry"));
IAssetRegistry& AssetRegistry = AssetRegistryModule.Get(); IAssetRegistry& AssetRegistry = AssetRegistryModule.Get();
// Must wait until all assets are discovered before populating list of assets. // Must wait until all assets are discovered before populating list of assets.
if (AssetRegistry.IsLoadingAssets()) { if (AssetRegistry.IsLoadingAssets()) {
AssetRegistry.OnFilesLoaded().AddUObject(this, &URRDADataAssetSubsystem::StartScanForDataAssets); AssetRegistry.OnFilesLoaded().AddUObject(this, &URRDADataAssetSubsystem::StartScanForDataAssets);
@ -36,40 +41,28 @@ void URRDADataAssetSubsystem::Initialize(FSubsystemCollectionBase& Collection)
else { else {
StartScanForDataAssets(); StartScanForDataAssets();
} }
} }
void URRDADataAssetSubsystem::Deinitialize() void URRDADataAssetSubsystem::Deinitialize()
{ {
Super::Deinitialize(); Super::Deinitialize();
mEnabledDataAssets.Empty();
mDisabledDataAssets.Empty();
mDirtAssets.Empty();
mTurbineAssets.Empty();
mBoilerAssets.Empty();
mCoolerAssets.Empty();
mHeaterAssets.Empty();
} }
void URRDADataAssetSubsystem::StartScanForDataAssets() void URRDADataAssetSubsystem::StartScanForDataAssets()
{ {
/*UAssetManager& Manager = UAssetManager::Get(); UAssetManager& Manager = UAssetManager::Get();
Manager.LoadPrimaryAssetsWithType(FPrimaryAssetType("RRDADataAsset"));*/ Manager.LoadPrimaryAssetsWithType(FPrimaryAssetType("RRDADataAsset"));
// 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(FName("RRDADataAssetBase"), AssetList);
// Split assets into separate arrays.
for (const FAssetData& Asset : AssetList) {
UObject* Obj = Asset.GetAsset();
// Cast the Obj to other data asset classes
if (Obj->GetClass()->IsChildOf(URRDADirtDataAsset::StaticClass())) {
auto DirtDataAsset = Cast<URRDADirtDataAsset>(Obj);
mDirtAssets.Add(DirtDataAsset->mItem, DirtDataAsset);
}
}
mDisabledDataAssets.Empty(); mDisabledDataAssets.Empty();
mAllDataAssets.Empty(); mEnabledDataAssets.Empty();
ReCacheBoilerDataAssets(); ReCacheBoilerDataAssets();
ReCacheCoolerDataAssets(); ReCacheCoolerDataAssets();
@ -81,12 +74,12 @@ void URRDADataAssetSubsystem::StartScanForDataAssets()
void URRDADataAssetSubsystem::ReCacheDirtDataAssets() void URRDADataAssetSubsystem::ReCacheDirtDataAssets()
{ {
mDirtAssets.Empty(); mDirtAssets.Empty();
TSet<URRDADirtDataAsset*> DirtDataAssets; TSet<URRDADirtDataAsset*> DataAssets;
if(FindAllDataAssetsOfClass(DirtDataAssets)) if(FindAllDataAssetsOfClass(DataAssets))
{ {
for (URRDADirtDataAsset* DirtDataAsset : DirtDataAssets) for (URRDADirtDataAsset* DataAsset : DataAssets)
{ {
mDirtAssets.Add(DirtDataAsset->mItem, DirtDataAsset); mDirtAssets.Add(DataAsset->mItem, DataAsset);
} }
} }
UE_LOG(LogRRDApi, Log, TEXT("ReCacheDirtDataAssets: %d"), mDirtAssets.Num()); UE_LOG(LogRRDApi, Log, TEXT("ReCacheDirtDataAssets: %d"), mDirtAssets.Num());
@ -94,19 +87,95 @@ void URRDADataAssetSubsystem::ReCacheDirtDataAssets()
void URRDADataAssetSubsystem::ReCacheTurbineDataAssets() void URRDADataAssetSubsystem::ReCacheTurbineDataAssets()
{ {
UE_LOG(LogRRDApi, Log, TEXT("ReCacheTurbineDataAssets")); mTurbineAssets.Empty();
TSet<URRDATurbineDataAsset*> DataAssets;
if(FindAllDataAssetsOfClass(DataAssets))
{
for (URRDATurbineDataAsset* DataAsset : DataAssets)
{
if(!mTurbineAssets.Contains(DataAsset->mTier)) {
mTurbineAssets.Add(DataAsset->mTier, TMap<TSubclassOf<UFGItemDescriptor>, 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() { void URRDADataAssetSubsystem::ReCacheBoilerDataAssets() {
UE_LOG(LogRRDApi, Log, TEXT("ReCacheBoilerDataAssets")); mBoilerAssets.Empty();
TSet<URRDABoilerDataAsset*> DataAssets;
if(FindAllDataAssetsOfClass(DataAssets))
{
for (URRDABoilerDataAsset* DataAsset : DataAssets)
{
if(!mBoilerAssets.Contains(DataAsset->mTier)) {
mBoilerAssets.Add(DataAsset->mTier, TMap<TSubclassOf<UFGItemDescriptor>, 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() { void URRDADataAssetSubsystem::ReCacheCoolerDataAssets() {
UE_LOG(LogRRDApi, Log, TEXT("ReCacheCoolerDataAssets")); mCoolerAssets.Empty();
TSet<URRDACoolerDataAsset*> DataAssets;
if(FindAllDataAssetsOfClass(DataAssets))
{
for (URRDACoolerDataAsset* DataAsset : DataAssets)
{
if(!mCoolerAssets.Contains(DataAsset->mType)) {
mCoolerAssets.Add(DataAsset->mType, TMap<TSubclassOf<UFGItemDescriptor>, 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() { void URRDADataAssetSubsystem::ReCacheHeaterDataAssets() {
UE_LOG(LogRRDApi, Log, TEXT("ReCacheHeaterDataAssets")); mHeaterAssets.Empty();
TSet<URRDAHeaterDataAsset*> DataAssets;
if(FindAllDataAssetsOfClass(DataAssets))
{
for (URRDAHeaterDataAsset* DataAsset : DataAssets)
{
if(!mHeaterAssets.Contains(DataAsset->mType)) {
mHeaterAssets.Add(DataAsset->mType, TMap<TSubclassOf<UFGItemDescriptor>, 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());
} }
int32 URRDADataAssetSubsystem::GetAllDirtItems(TArray<TSubclassOf<UFGItemDescriptor>>& Items) const int32 URRDADataAssetSubsystem::GetAllDirtItems(TArray<TSubclassOf<UFGItemDescriptor>>& Items) const

View File

@ -14,15 +14,27 @@ class REFINEDRDAPI_API URRDABoilerDataAsset : public URRDADataAssetBase
GENERATED_BODY() GENERATED_BODY()
public: public:
/**
* Fuel item that this heater uses
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Turbine", meta=( UIMin = "1", UIMax = "2" ))
int32 mTier = 1;
/** /**
* Fuel item that this heater uses * Fuel item that this heater uses
*/ */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Boiler") UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Boiler")
FItemAmount mItem; FItemAmount mInput;
/** /**
* What this boiler produces * What this boiler produces
*/ */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Boiler") UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Boiler")
FItemAmount mOutputItem; FItemAmount mOutput;
/**
* Duration for one production
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Boiler")
float mDuration = 6.f;
}; };

View File

@ -5,6 +5,7 @@
#include "CoreMinimal.h" #include "CoreMinimal.h"
#include "ItemAmount.h" #include "ItemAmount.h"
#include "RRDADataAssetBase.h" #include "RRDADataAssetBase.h"
#include "Enums/RRDARPEnums.h"
#include "RRDACoolerDataAsset.generated.h" #include "RRDACoolerDataAsset.generated.h"
@ -14,9 +15,27 @@ class REFINEDRDAPI_API URRDACoolerDataAsset : public URRDADataAssetBase
GENERATED_BODY() GENERATED_BODY()
public: public:
/**
* What type of heater this is
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Heater")
ERRDACoolerType mType = ERRDACoolerType::Chemical;
/** /**
* Fuel item that this heater uses * Fuel item that this heater uses
*/ */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Cooler") UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Cooler")
FItemAmount mItem; TSubclassOf<UFGItemDescriptor> mItem;
/**
* How much of the item is used
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Cooler")
int32 mAmount = 1000;
/**
* Duration for one production
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Boiler")
float mDuration = 6.f;
}; };

View File

@ -19,7 +19,7 @@ public:
* What type of heater this is * What type of heater this is
*/ */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Heater") UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Heater")
ERRDAHeaterType mHeaterType; ERRDAHeaterType mType = ERRDAHeaterType::Biomass;
/** /**
* Fuel item that this heater uses * Fuel item that this heater uses
@ -33,4 +33,10 @@ public:
*/ */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Heater") UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Heater")
FItemAmount mOutput; FItemAmount mOutput;
/**
* Duration for one production
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Heater")
float mDuration = 6.f;
}; };

View File

@ -14,6 +14,12 @@ class REFINEDRDAPI_API URRDATurbineDataAsset : public URRDADataAssetBase
GENERATED_BODY() GENERATED_BODY()
public: public:
/**
* Fuel item that this heater uses
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Turbine", meta=( UIMin = "1", UIMax = "2" ))
int32 mTier = 1;
/** /**
* Fuel item that this heater uses * Fuel item that this heater uses
*/ */
@ -26,4 +32,10 @@ public:
*/ */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Turbine") UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Turbine")
FItemAmount mWasteItem; FItemAmount mWasteItem;
/**
* Duration for one production
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Turbine")
float mDuration = 6.f;
}; };

View File

@ -7,7 +7,6 @@
#include "AssetRegistry/AssetRegistryModule.h" #include "AssetRegistry/AssetRegistryModule.h"
#include "DataAssets/RRDADataAssetBase.h" #include "DataAssets/RRDADataAssetBase.h"
#include "DataAssets/RRDADirtDataAsset.h" #include "DataAssets/RRDADirtDataAsset.h"
#include "Engine/AssetManager.h"
#include "Enums/RRDARPEnums.h" #include "Enums/RRDARPEnums.h"
#include "Resources/FGItemDescriptor.h" #include "Resources/FGItemDescriptor.h"
@ -59,6 +58,13 @@ public:
template<class T> template<class T>
bool FindAllDataAssetsOfClass(TSet<T*>& OutDataAssets); 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: private:
UPROPERTY() UPROPERTY()
TMap<TSubclassOf<UFGItemDescriptor>, class URRDADirtDataAsset*> mDirtAssets; TMap<TSubclassOf<UFGItemDescriptor>, class URRDADirtDataAsset*> mDirtAssets;
@ -73,42 +79,12 @@ public:
TSet<URRDADataAssetBase*> mDisabledDataAssets; TSet<URRDADataAssetBase*> mDisabledDataAssets;
UPROPERTY(BlueprintReadOnly, Transient, Category = "RRDA|DataAsset") UPROPERTY(BlueprintReadOnly, Transient, Category = "RRDA|DataAsset")
TSet<URRDADataAssetBase*> mAllDataAssets; TSet<URRDADataAssetBase*> mEnabledDataAssets;
}; };
template <class T> template <class T>
bool URRDADataAssetSubsystem::FindAllDataAssetsOfClass(TSet<T*>& OutDataAssets) 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; TArray<UClass*> FoundClasses;
GetDerivedClasses(T::StaticClass(), FoundClasses, true); GetDerivedClasses(T::StaticClass(), FoundClasses, true);
@ -130,3 +106,36 @@ bool URRDADataAssetSubsystem::FindAllDataAssetsOfClass(TSet<T*>& OutDataAssets)
return OutDataAssets.Num() > 0; 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;
}