feat: Item filters

This commit is contained in:
mrhid6 2024-11-27 13:15:40 +00:00
parent 8e6378208c
commit 0d976de526
4 changed files with 95 additions and 0 deletions

View File

@ -0,0 +1,5 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "DataAssets/RRDADataAssetDSItemFilter.h"

View File

@ -67,6 +67,7 @@ void URRDADataAssetSubsystem::StartScanForDataAssets() {
ReCacheGeneratorDataAssets();
mDSBuildingData.Empty();
ReCacheDSItemFilters();
ReCacheDSModAdapterDataAssets();
ReCacheDSAdapterCoversDataAssets();
}
@ -178,6 +179,8 @@ void URRDADataAssetSubsystem::ReCacheDSModAdapterDataAssets() {
TSet<URRDADataAssetDSModAdapter*> 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<URRDADataAssetDSAdapterCovers*> 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<URRDADataAssetDSItemFilter*> 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<TSubclassOf<UFGItemDescriptor>>& Items) const {
if (!mDirtAssets.Num()) {
UE_LOG(LogRRDApi, Error, TEXT("No Dirts found!"));
@ -308,6 +333,27 @@ bool URRDADataAssetSubsystem::HasDSAdaperCoversForBuildingClass(TSubclassOf<AFGB
return IsValid(GetDSAdapterCoverDataAssetForBuildingClass(BuildingClass));
}
TArray<URRDADataAssetDSItemFilter*> URRDADataAssetSubsystem::GetDSItemFiltersDataAssetsForBuildingClass(TSubclassOf<AFGBuildableFactory> BuildingClass) const {
if (!BuildingClass) return TArray<URRDADataAssetDSItemFilter*>{};
const FRRDADataHolderDSBuildingData* data = mDSBuildingData.Find(BuildingClass);
if (data == nullptr) return TArray<URRDADataAssetDSItemFilter*>{};
return data->ItemFilters;
}
TArray<URRDADataAssetDSItemFilter*> URRDADataAssetSubsystem::GetAllDSItemFiltersDataAssets() const {
TArray<URRDADataAssetDSItemFilter*> Assets;
TArray<FRRDADataHolderDSBuildingData> buildingDatas;
mDSBuildingData.GenerateValueArray(buildingDatas);
for (FRRDADataHolderDSBuildingData& buildingData : buildingDatas) {
Assets.Append(buildingData.ItemFilters);
}
return Assets;
}
bool URRDADataAssetSubsystem::GetAllTurbineItems(TArray<TSubclassOf<UFGItemDescriptor>>& Items, int32 Tier) const {
if (!mTurbineAssets.Contains(Tier)) {
return false;

View File

@ -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<AFGBuildableFactory> mBuildingClass;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="ItemFilter")
int mInventoryIndex = 0;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="ItemFilter")
int mInventorySlotIndex = 0;
UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category="ItemFilter")
TArray<TSubclassOf<UFGItemDescriptor>> mItemFilterClasses;
};

View File

@ -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<URRDADataAssetDSItemFilter*> 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<AFGBuildableFactory> BuildingClass);
// DS Item Filters
UFUNCTION(BlueprintCallable, Category = "RRDA|DataAsset|DS")
TArray<URRDADataAssetDSItemFilter*> GetDSItemFiltersDataAssetsForBuildingClass(TSubclassOf<AFGBuildableFactory> BuildingClass) const;
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|DS")
TArray<URRDADataAssetDSItemFilter*> GetAllDSItemFiltersDataAssets() const;
// Turbine Functions
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP")
bool GetAllTurbineItems(TArray<TSubclassOf<UFGItemDescriptor>>& Items, int32 Tier) const;