From 0d976de5267102a2964fbe4010718fd2eac6dcd3 Mon Sep 17 00:00:00 2001 From: mrhid6 Date: Wed, 27 Nov 2024 13:15:40 +0000 Subject: [PATCH] feat: Item filters --- .../DataAssets/RRDADataAssetDSItemFilter.cpp | 5 ++ .../Subsystems/RRDADataAssetSubsystem.cpp | 46 +++++++++++++++++++ .../DataAssets/RRDADataAssetDSItemFilter.h | 31 +++++++++++++ .../Subsystems/RRDADataAssetSubsystem.h | 13 ++++++ 4 files changed, 95 insertions(+) create mode 100644 Source/RefinedRDApi/Private/DataAssets/RRDADataAssetDSItemFilter.cpp create mode 100644 Source/RefinedRDApi/Public/DataAssets/RRDADataAssetDSItemFilter.h diff --git a/Source/RefinedRDApi/Private/DataAssets/RRDADataAssetDSItemFilter.cpp b/Source/RefinedRDApi/Private/DataAssets/RRDADataAssetDSItemFilter.cpp new file mode 100644 index 0000000..bb09e16 --- /dev/null +++ b/Source/RefinedRDApi/Private/DataAssets/RRDADataAssetDSItemFilter.cpp @@ -0,0 +1,5 @@ +// Fill out your copyright notice in the Description page of Project Settings. + + +#include "DataAssets/RRDADataAssetDSItemFilter.h" + diff --git a/Source/RefinedRDApi/Private/Subsystems/RRDADataAssetSubsystem.cpp b/Source/RefinedRDApi/Private/Subsystems/RRDADataAssetSubsystem.cpp index ebe2bbd..e16ba73 100644 --- a/Source/RefinedRDApi/Private/Subsystems/RRDADataAssetSubsystem.cpp +++ b/Source/RefinedRDApi/Private/Subsystems/RRDADataAssetSubsystem.cpp @@ -67,6 +67,7 @@ void URRDADataAssetSubsystem::StartScanForDataAssets() { ReCacheGeneratorDataAssets(); mDSBuildingData.Empty(); + ReCacheDSItemFilters(); ReCacheDSModAdapterDataAssets(); ReCacheDSAdapterCoversDataAssets(); } @@ -178,6 +179,8 @@ void URRDADataAssetSubsystem::ReCacheDSModAdapterDataAssets() { TSet DataAssets; if (FindAllDataAssetsOfClass(DataAssets)) { for (URRDADataAssetDSModAdapter* DataAsset : DataAssets) { + if (DataAsset->mBuildingClass == nullptr) continue; + FRRDADataHolderDSBuildingData* existingData = mDSBuildingData.Find(DataAsset->mBuildingClass); if (existingData == nullptr) { FRRDADataHolderDSBuildingData newData = FRRDADataHolderDSBuildingData(); @@ -197,6 +200,8 @@ void URRDADataAssetSubsystem::ReCacheDSAdapterCoversDataAssets() { TSet DataAssets; if (FindAllDataAssetsOfClass(DataAssets)) { for (URRDADataAssetDSAdapterCovers* DataAsset : DataAssets) { + if (DataAsset->mBuildingClass == nullptr) continue; + FRRDADataHolderDSBuildingData* existingData = mDSBuildingData.Find(DataAsset->mBuildingClass); if (existingData == nullptr) { FRRDADataHolderDSBuildingData newData = FRRDADataHolderDSBuildingData(); @@ -211,6 +216,26 @@ void URRDADataAssetSubsystem::ReCacheDSAdapterCoversDataAssets() { UE_LOGFMT(LogRRDApi, Log, "ReCacheDSAdapterCoversDataAssets: {0}", mDSBuildingData.Num()); } +void URRDADataAssetSubsystem::ReCacheDSItemFilters() { + TSet DataAssets; + if (FindAllDataAssetsOfClass(DataAssets)) { + for (URRDADataAssetDSItemFilter* DataAsset : DataAssets) { + if (DataAsset->mBuildingClass == nullptr) continue; + + FRRDADataHolderDSBuildingData* existingData = mDSBuildingData.Find(DataAsset->mBuildingClass); + if (existingData == nullptr) { + FRRDADataHolderDSBuildingData newData = FRRDADataHolderDSBuildingData(); + newData.ItemFilters.AddUnique(DataAsset); + mDSBuildingData.Add(DataAsset->mBuildingClass, newData); + } + else { + existingData->ItemFilters.AddUnique(DataAsset); + } + } + } + UE_LOGFMT(LogRRDApi, Log, "ReCacheDSItemFilters: {0}", mDSBuildingData.Num()); +} + int32 URRDADataAssetSubsystem::GetAllDirtItems(TArray>& Items) const { if (!mDirtAssets.Num()) { UE_LOG(LogRRDApi, Error, TEXT("No Dirts found!")); @@ -308,6 +333,27 @@ bool URRDADataAssetSubsystem::HasDSAdaperCoversForBuildingClass(TSubclassOf URRDADataAssetSubsystem::GetDSItemFiltersDataAssetsForBuildingClass(TSubclassOf BuildingClass) const { + if (!BuildingClass) return TArray{}; + + const FRRDADataHolderDSBuildingData* data = mDSBuildingData.Find(BuildingClass); + if (data == nullptr) return TArray{}; + + return data->ItemFilters; +} + +TArray URRDADataAssetSubsystem::GetAllDSItemFiltersDataAssets() const { + TArray Assets; + TArray buildingDatas; + + mDSBuildingData.GenerateValueArray(buildingDatas); + + for (FRRDADataHolderDSBuildingData& buildingData : buildingDatas) { + Assets.Append(buildingData.ItemFilters); + } + return Assets; +} + bool URRDADataAssetSubsystem::GetAllTurbineItems(TArray>& Items, int32 Tier) const { if (!mTurbineAssets.Contains(Tier)) { return false; diff --git a/Source/RefinedRDApi/Public/DataAssets/RRDADataAssetDSItemFilter.h b/Source/RefinedRDApi/Public/DataAssets/RRDADataAssetDSItemFilter.h new file mode 100644 index 0000000..44f9708 --- /dev/null +++ b/Source/RefinedRDApi/Public/DataAssets/RRDADataAssetDSItemFilter.h @@ -0,0 +1,31 @@ +// Fill out your copyright notice in the Description page of Project Settings. + +#pragma once + +#include "CoreMinimal.h" +#include "DataAssets/RRDADataAssetBase.h" +#include "Resources/FGItemDescriptor.h" +#include "RRDADataAssetDSItemFilter.generated.h" + +/** + * + */ +UCLASS() +class REFINEDRDAPI_API URRDADataAssetDSItemFilter : public URRDADataAssetBase +{ + GENERATED_BODY() + +public: + /* The Building class this item filter should be used on */ + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="ItemFilter") + TSubclassOf mBuildingClass; + + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="ItemFilter") + int mInventoryIndex = 0; + + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="ItemFilter") + int mInventorySlotIndex = 0; + + UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="ItemFilter") + TArray> mItemFilterClasses; +}; diff --git a/Source/RefinedRDApi/Public/Subsystems/RRDADataAssetSubsystem.h b/Source/RefinedRDApi/Public/Subsystems/RRDADataAssetSubsystem.h index f5ba402..e9777ba 100644 --- a/Source/RefinedRDApi/Public/Subsystems/RRDADataAssetSubsystem.h +++ b/Source/RefinedRDApi/Public/Subsystems/RRDADataAssetSubsystem.h @@ -13,6 +13,7 @@ #include "DataAssets/RRDAHeaterDataAsset.h" #include "DataAssets/RRDATurbineDataAsset.h" #include "DataAssets/RRDACoolerDataAsset.h" +#include "DataAssets/RRDADataAssetDSItemFilter.h" #include "DataAssets/RRDADataAssetDSModAdapter.h" #include "Enums/RRDARPEnums.h" #include "Resources/FGItemDescriptor.h" @@ -66,6 +67,9 @@ struct FRRDADataHolderDSBuildingData UPROPERTY() URRDADataAssetDSModAdapter* ModAdapter; + + UPROPERTY() + TArray ItemFilters; }; UCLASS() @@ -98,6 +102,7 @@ public: void ReCacheGeneratorDataAssets(); void ReCacheDSModAdapterDataAssets(); void ReCacheDSAdapterCoversDataAssets(); + void ReCacheDSItemFilters(); public: // Dirt Functions @@ -133,6 +138,14 @@ public: UFUNCTION(BlueprintCallable, Category = "RRDA|DataAsset|DS") bool HasDSAdaperCoversForBuildingClass(TSubclassOf BuildingClass); + // DS Item Filters + + UFUNCTION(BlueprintCallable, Category = "RRDA|DataAsset|DS") + TArray GetDSItemFiltersDataAssetsForBuildingClass(TSubclassOf BuildingClass) const; + + UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|DS") + TArray GetAllDSItemFiltersDataAssets() const; + // Turbine Functions UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP") bool GetAllTurbineItems(TArray>& Items, int32 Tier) const;