diff --git a/Source/RefinedRDApi/Private/Subsystems/RRDADataAssetSubsystem.cpp b/Source/RefinedRDApi/Private/Subsystems/RRDADataAssetSubsystem.cpp index 39fa8b0..bca1d5d 100644 --- a/Source/RefinedRDApi/Private/Subsystems/RRDADataAssetSubsystem.cpp +++ b/Source/RefinedRDApi/Private/Subsystems/RRDADataAssetSubsystem.cpp @@ -4,6 +4,10 @@ #include "DataAssets/RRDADirtDataAsset.h" #include "Engine/AssetManager.h" #include "AssetRegistry/AssetRegistryModule.h" +#include "DataAssets/RRDABoilerDataAsset.h" +#include "DataAssets/RRDACoolerDataAsset.h" +#include "DataAssets/RRDAHeaterDataAsset.h" +#include "DataAssets/RRDATurbineDataAsset.h" URRDADataAssetSubsystem::URRDADataAssetSubsystem() {} @@ -29,6 +33,7 @@ void URRDADataAssetSubsystem::Initialize(FSubsystemCollectionBase& Collection) FAssetRegistryModule& AssetRegistryModule = FModuleManager::LoadModuleChecked(FName("AssetRegistry")); IAssetRegistry& AssetRegistry = AssetRegistryModule.Get(); + // Must wait until all assets are discovered before populating list of assets. if (AssetRegistry.IsLoadingAssets()) { AssetRegistry.OnFilesLoaded().AddUObject(this, &URRDADataAssetSubsystem::StartScanForDataAssets); @@ -36,40 +41,28 @@ void URRDADataAssetSubsystem::Initialize(FSubsystemCollectionBase& Collection) else { StartScanForDataAssets(); } - - } void URRDADataAssetSubsystem::Deinitialize() { Super::Deinitialize(); + + mEnabledDataAssets.Empty(); + mDisabledDataAssets.Empty(); + mDirtAssets.Empty(); + mTurbineAssets.Empty(); + mBoilerAssets.Empty(); + mCoolerAssets.Empty(); + mHeaterAssets.Empty(); } void URRDADataAssetSubsystem::StartScanForDataAssets() { - /*UAssetManager& Manager = UAssetManager::Get(); - Manager.LoadPrimaryAssetsWithType(FPrimaryAssetType("RRDADataAsset"));*/ - - // 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(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(Obj); - mDirtAssets.Add(DirtDataAsset->mItem, DirtDataAsset); - } - } + UAssetManager& Manager = UAssetManager::Get(); + Manager.LoadPrimaryAssetsWithType(FPrimaryAssetType("RRDADataAsset")); mDisabledDataAssets.Empty(); - mAllDataAssets.Empty(); + mEnabledDataAssets.Empty(); ReCacheBoilerDataAssets(); ReCacheCoolerDataAssets(); @@ -81,12 +74,12 @@ void URRDADataAssetSubsystem::StartScanForDataAssets() void URRDADataAssetSubsystem::ReCacheDirtDataAssets() { mDirtAssets.Empty(); - TSet DirtDataAssets; - if(FindAllDataAssetsOfClass(DirtDataAssets)) + TSet DataAssets; + 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()); @@ -94,19 +87,95 @@ void URRDADataAssetSubsystem::ReCacheDirtDataAssets() void URRDADataAssetSubsystem::ReCacheTurbineDataAssets() { - UE_LOG(LogRRDApi, Log, TEXT("ReCacheTurbineDataAssets")); + mTurbineAssets.Empty(); + TSet DataAssets; + if(FindAllDataAssetsOfClass(DataAssets)) + { + for (URRDATurbineDataAsset* DataAsset : DataAssets) + { + if(!mTurbineAssets.Contains(DataAsset->mTier)) { + mTurbineAssets.Add(DataAsset->mTier, TMap, 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() { - UE_LOG(LogRRDApi, Log, TEXT("ReCacheBoilerDataAssets")); + mBoilerAssets.Empty(); + TSet DataAssets; + if(FindAllDataAssetsOfClass(DataAssets)) + { + for (URRDABoilerDataAsset* DataAsset : DataAssets) + { + if(!mBoilerAssets.Contains(DataAsset->mTier)) { + mBoilerAssets.Add(DataAsset->mTier, TMap, 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() { - UE_LOG(LogRRDApi, Log, TEXT("ReCacheCoolerDataAssets")); + mCoolerAssets.Empty(); + TSet DataAssets; + if(FindAllDataAssetsOfClass(DataAssets)) + { + for (URRDACoolerDataAsset* DataAsset : DataAssets) + { + if(!mCoolerAssets.Contains(DataAsset->mType)) { + mCoolerAssets.Add(DataAsset->mType, TMap, 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() { - UE_LOG(LogRRDApi, Log, TEXT("ReCacheHeaterDataAssets")); + mHeaterAssets.Empty(); + TSet DataAssets; + if(FindAllDataAssetsOfClass(DataAssets)) + { + for (URRDAHeaterDataAsset* DataAsset : DataAssets) + { + if(!mHeaterAssets.Contains(DataAsset->mType)) { + mHeaterAssets.Add(DataAsset->mType, TMap, 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>& Items) const diff --git a/Source/RefinedRDApi/Public/DataAssets/RRDABoilerDataAsset.h b/Source/RefinedRDApi/Public/DataAssets/RRDABoilerDataAsset.h index 8b7673a..89894f6 100644 --- a/Source/RefinedRDApi/Public/DataAssets/RRDABoilerDataAsset.h +++ b/Source/RefinedRDApi/Public/DataAssets/RRDABoilerDataAsset.h @@ -14,15 +14,27 @@ class REFINEDRDAPI_API URRDABoilerDataAsset : public URRDADataAssetBase GENERATED_BODY() 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 */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Boiler") - FItemAmount mItem; + FItemAmount mInput; /** * What this boiler produces */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Boiler") - FItemAmount mOutputItem; + FItemAmount mOutput; + + /** + * Duration for one production + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Boiler") + float mDuration = 6.f; }; \ No newline at end of file diff --git a/Source/RefinedRDApi/Public/DataAssets/RRDACoolerDataAsset.h b/Source/RefinedRDApi/Public/DataAssets/RRDACoolerDataAsset.h index ae02739..99731e6 100644 --- a/Source/RefinedRDApi/Public/DataAssets/RRDACoolerDataAsset.h +++ b/Source/RefinedRDApi/Public/DataAssets/RRDACoolerDataAsset.h @@ -5,6 +5,7 @@ #include "CoreMinimal.h" #include "ItemAmount.h" #include "RRDADataAssetBase.h" +#include "Enums/RRDARPEnums.h" #include "RRDACoolerDataAsset.generated.h" @@ -14,9 +15,27 @@ class REFINEDRDAPI_API URRDACoolerDataAsset : public URRDADataAssetBase GENERATED_BODY() public: + /** + * What type of heater this is + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Heater") + ERRDACoolerType mType = ERRDACoolerType::Chemical; + /** * Fuel item that this heater uses */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Cooler") - FItemAmount mItem; + TSubclassOf 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; }; \ No newline at end of file diff --git a/Source/RefinedRDApi/Public/DataAssets/RRDAHeaterDataAsset.h b/Source/RefinedRDApi/Public/DataAssets/RRDAHeaterDataAsset.h index d565c3f..47121e7 100644 --- a/Source/RefinedRDApi/Public/DataAssets/RRDAHeaterDataAsset.h +++ b/Source/RefinedRDApi/Public/DataAssets/RRDAHeaterDataAsset.h @@ -19,7 +19,7 @@ public: * What type of heater this is */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Heater") - ERRDAHeaterType mHeaterType; + ERRDAHeaterType mType = ERRDAHeaterType::Biomass; /** * Fuel item that this heater uses @@ -33,4 +33,10 @@ public: */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Heater") FItemAmount mOutput; + + /** + * Duration for one production + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Heater") + float mDuration = 6.f; }; \ No newline at end of file diff --git a/Source/RefinedRDApi/Public/DataAssets/RRDATurbineDataAsset.h b/Source/RefinedRDApi/Public/DataAssets/RRDATurbineDataAsset.h index 38ef9c6..be9a3a6 100644 --- a/Source/RefinedRDApi/Public/DataAssets/RRDATurbineDataAsset.h +++ b/Source/RefinedRDApi/Public/DataAssets/RRDATurbineDataAsset.h @@ -14,6 +14,12 @@ class REFINEDRDAPI_API URRDATurbineDataAsset : public URRDADataAssetBase GENERATED_BODY() 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 */ @@ -26,4 +32,10 @@ public: */ UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Turbine") FItemAmount mWasteItem; + + /** + * Duration for one production + */ + UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Turbine") + float mDuration = 6.f; }; \ No newline at end of file diff --git a/Source/RefinedRDApi/Public/Subsystems/RRDADataAssetSubsystem.h b/Source/RefinedRDApi/Public/Subsystems/RRDADataAssetSubsystem.h index a7d75ed..a227004 100644 --- a/Source/RefinedRDApi/Public/Subsystems/RRDADataAssetSubsystem.h +++ b/Source/RefinedRDApi/Public/Subsystems/RRDADataAssetSubsystem.h @@ -7,7 +7,6 @@ #include "AssetRegistry/AssetRegistryModule.h" #include "DataAssets/RRDADataAssetBase.h" #include "DataAssets/RRDADirtDataAsset.h" -#include "Engine/AssetManager.h" #include "Enums/RRDARPEnums.h" #include "Resources/FGItemDescriptor.h" @@ -59,6 +58,13 @@ public: 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; @@ -73,42 +79,12 @@ public: TSet mDisabledDataAssets; UPROPERTY(BlueprintReadOnly, Transient, Category = "RRDA|DataAsset") - TSet mAllDataAssets; + TSet mEnabledDataAssets; }; 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); @@ -130,3 +106,36 @@ bool URRDADataAssetSubsystem::FindAllDataAssetsOfClass(TSet& OutDataAssets) 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; +}