297 lines
11 KiB
C++
297 lines
11 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 "Buildables/FGBuildableFactory.h"
|
|
#include "DataAssets/RRDADataAssetBase.h"
|
|
#include "DataAssets/RRDADirtDataAsset.h"
|
|
#include "DataAssets/RRDABoilerDataAsset.h"
|
|
#include "DataAssets/RRDAGeneratorDataAsset.h"
|
|
#include "DataAssets/RRDAHeaterDataAsset.h"
|
|
#include "DataAssets/RRDATurbineDataAsset.h"
|
|
#include "DataAssets/RRDACoolerDataAsset.h"
|
|
#include "DataAssets/RRDADataAssetDSItemFilter.h"
|
|
#include "DataAssets/RRDADataAssetDSModAdapter.h"
|
|
#include "DataAssets/RRDADataAssetSolarPower.h"
|
|
#include "Enums/RRDARPEnums.h"
|
|
#include "Resources/FGItemDescriptor.h"
|
|
|
|
#include "RRDADataAssetSubsystem.generated.h"
|
|
|
|
// We need this otherwise some of the cache will GC'd
|
|
USTRUCT(BlueprintType)
|
|
struct FRRDADataHolderTurbineData
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
UPROPERTY(BlueprintReadOnly)
|
|
TMap<TSubclassOf<UFGItemDescriptor>, URRDATurbineDataAsset*> Data;
|
|
};
|
|
|
|
USTRUCT(BlueprintType)
|
|
struct FRRDADataHolderBoilerData
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
UPROPERTY(BlueprintReadOnly)
|
|
TMap<TSubclassOf<UFGItemDescriptor>, URRDABoilerDataAsset*> Data;
|
|
};
|
|
|
|
USTRUCT(BlueprintType)
|
|
struct FRRDADataHolderCoolerData
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
UPROPERTY(BlueprintReadOnly)
|
|
TMap<TSubclassOf<UFGItemDescriptor>, URRDACoolerDataAsset*> Data;
|
|
};
|
|
|
|
USTRUCT(BlueprintType)
|
|
struct FRRDADataHolderHeaterData
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
UPROPERTY(BlueprintReadOnly)
|
|
TMap<TSubclassOf<UFGItemDescriptor>, URRDAHeaterDataAsset*> Data;
|
|
};
|
|
|
|
USTRUCT(BlueprintType)
|
|
struct FRRDADataHolderDSBuildingData
|
|
{
|
|
GENERATED_BODY()
|
|
|
|
UPROPERTY()
|
|
URRDADataAssetDSAdapterCovers* AdapterCovers;
|
|
|
|
UPROPERTY()
|
|
URRDADataAssetDSModAdapter* ModAdapter;
|
|
|
|
UPROPERTY()
|
|
TArray<URRDADataAssetDSItemFilter*> ItemFilters;
|
|
};
|
|
|
|
UCLASS()
|
|
class REFINEDRDAPI_API URRDADataAssetSubsystem : public UGameInstanceSubsystem
|
|
{
|
|
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();
|
|
void ReCacheGeneratorDataAssets();
|
|
void ReCacheDSModAdapterDataAssets();
|
|
void ReCacheDSAdapterCoversDataAssets();
|
|
void ReCacheDSItemFilters();
|
|
void ReCacheSolarPowerDataAssets();
|
|
|
|
public:
|
|
// Dirt Functions
|
|
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;
|
|
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|FF")
|
|
TArray<URRDADirtDataAsset*> GetAllDirtAssets() const;
|
|
|
|
// DS Mod Adapter Functions
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|DS")
|
|
int32 GetAllDSBuildingClasses(TArray<TSubclassOf<AFGBuildableFactory>>& OutBuildingClasses) const;
|
|
|
|
UFUNCTION(BlueprintCallable, Category = "RRDA|DataAsset|DS")
|
|
URRDADataAssetDSModAdapter* GetModAdapterDataAssetForBuildingClass(TSubclassOf<AFGBuildableFactory> BuildingClass) const;
|
|
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|DS")
|
|
TArray<URRDADataAssetDSModAdapter*> GetAllModAdapterDataAssets() const;
|
|
|
|
UFUNCTION(BlueprintCallable, Category = "RRDA|DataAsset|DS")
|
|
bool HasDSModAdapterForBuildingClass(TSubclassOf<AFGBuildableFactory> BuildingClass);
|
|
|
|
// DS Adapter Covers Functions
|
|
UFUNCTION(BlueprintCallable, Category = "RRDA|DataAsset|DS")
|
|
URRDADataAssetDSAdapterCovers* GetDSAdapterCoverDataAssetForBuildingClass(TSubclassOf<AFGBuildableFactory> BuildingClass) const;
|
|
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|DS")
|
|
TArray<URRDADataAssetDSAdapterCovers*> GetAllDSAdapterCoverDataAssets() const;
|
|
|
|
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;
|
|
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP")
|
|
URRDATurbineDataAsset* GetTurbineItemData(TSubclassOf<UFGItemDescriptor> Item, int32 Tier) const;
|
|
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP")
|
|
bool GetAllTurbineRelevantItems(TArray<TSubclassOf<UFGItemDescriptor>>& Items, int32 Tier) const;
|
|
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP")
|
|
URRDATurbineDataAsset* GetDefaultTurbineAsset(int32 Tier) const;
|
|
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP")
|
|
TArray<URRDATurbineDataAsset*> GetAllTurbineAssets(int32 Tier) const;
|
|
|
|
// Cooler Functions
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP")
|
|
bool GetAllCoolerItems(TArray<TSubclassOf<UFGItemDescriptor>>& Items, ERRDACoolerType Type) const;
|
|
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP")
|
|
URRDACoolerDataAsset* GetCoolerItemData(TSubclassOf<UFGItemDescriptor> Item, ERRDACoolerType Type) const;
|
|
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP")
|
|
URRDACoolerDataAsset* GetDefaultCoolerAsset(ERRDACoolerType Type) const;
|
|
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP")
|
|
TArray<URRDACoolerDataAsset*> GetAllCoolerAssets(ERRDACoolerType Type) const;
|
|
|
|
// Generator Functions
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP")
|
|
URRDAGeneratorDataAsset* GetGeneratorItemData(int32 Tier) const;
|
|
|
|
// Boiler Functions
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP")
|
|
bool GetAllBoilerItems(TArray<TSubclassOf<UFGItemDescriptor>>& Items, int32 Tier) const;
|
|
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP")
|
|
URRDABoilerDataAsset* GetBoilerItemData(TSubclassOf<UFGItemDescriptor> Item, int32 Tier) const;
|
|
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP")
|
|
bool GetAllBoilerRelevantItems(TArray<TSubclassOf<UFGItemDescriptor>>& Items, int32 Tier) const;
|
|
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP")
|
|
URRDABoilerDataAsset* GetDefaultBoilerAsset(int32 Tier) const;
|
|
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP")
|
|
TArray<URRDABoilerDataAsset*> GetAllBoilerAssets(int32 Tier) const;
|
|
|
|
// Heater Functions
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP")
|
|
bool GetAllHeaterItems(TArray<TSubclassOf<UFGItemDescriptor>>& Items, ERRDAHeaterType Type) const;
|
|
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP")
|
|
URRDAHeaterDataAsset* GetHeaterItemData(TSubclassOf<UFGItemDescriptor> Item, ERRDAHeaterType Type) const;
|
|
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP")
|
|
bool GetAllHeaterRelevantItems(TArray<TSubclassOf<UFGItemDescriptor>>& Items, ERRDAHeaterType Type) const;
|
|
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP")
|
|
URRDAHeaterDataAsset* GetDefaultHeaterAsset(ERRDAHeaterType Type) const;
|
|
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP")
|
|
TArray<URRDAHeaterDataAsset*> GetAllHeaterAssets(ERRDAHeaterType Type) const;
|
|
|
|
UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|Solar")
|
|
TArray<URRDADataAssetSolarPower*> GetAllSolarPowerAssets() 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);
|
|
|
|
public:
|
|
UPROPERTY(BlueprintReadOnly, Category = "RRDA|DataAsset")
|
|
TMap<TSubclassOf<UFGItemDescriptor>, URRDADirtDataAsset*> mDirtAssets;
|
|
|
|
UPROPERTY(BlueprintReadOnly, Category = "RRDA|DataAsset")
|
|
TMap<TSubclassOf<AFGBuildableFactory>, FRRDADataHolderDSBuildingData> mDSBuildingData;
|
|
|
|
UPROPERTY(BlueprintReadOnly, Category = "RRDA|DataAsset")
|
|
TMap<int32, URRDAGeneratorDataAsset*> mGeneratorAssets;
|
|
|
|
UPROPERTY(BlueprintReadOnly, Category = "RRDA|DataAsset")
|
|
TMap<int32, FRRDADataHolderTurbineData> mTurbineAssets;
|
|
|
|
UPROPERTY(BlueprintReadOnly, Category = "RRDA|DataAsset")
|
|
TMap<int32, FRRDADataHolderBoilerData> mBoilerAssets;
|
|
|
|
UPROPERTY(BlueprintReadOnly, Category = "RRDA|DataAsset")
|
|
TMap<ERRDACoolerType, FRRDADataHolderCoolerData> mCoolerAssets;
|
|
|
|
UPROPERTY(BlueprintReadOnly, Category = "RRDA|DataAsset")
|
|
TMap<ERRDAHeaterType, FRRDADataHolderHeaterData> mHeaterAssets;
|
|
|
|
UPROPERTY(BlueprintReadOnly, Category = "RRDA|DataAsset")
|
|
TArray<URRDADataAssetSolarPower*> mSolarPowerAssets;
|
|
|
|
UPROPERTY(BlueprintReadOnly, Category = "RRDA|DataAsset")
|
|
TSet<URRDADataAssetBase*> mDisabledDataAssets;
|
|
|
|
UPROPERTY(BlueprintReadOnly, Category = "RRDA|DataAsset")
|
|
TSet<URRDADataAssetBase*> mEnabledDataAssets;
|
|
};
|
|
|
|
template <class T>
|
|
bool URRDADataAssetSubsystem::FindAllDataAssetsOfClass(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(T::StaticClass()->GetClassPathName(), AssetList, true);
|
|
|
|
// Split assets into separate arrays.
|
|
for (const FAssetData& Asset : AssetList) {
|
|
UObject* Obj = Asset.GetAsset();
|
|
|
|
T* CastedAsset = Cast<T>(Obj);
|
|
if (!CastedAsset) {
|
|
UE_LOG(LogRRDApi, Warning, TEXT("Invalid asset type: %s"), *Asset.AssetName.ToString());
|
|
continue;
|
|
}
|
|
|
|
if (URRDADataAssetBase* BaseAsset = Cast<URRDADataAssetBase>(Obj)) {
|
|
if (URRDADataAssetBase::IsEnabled(BaseAsset, GetWorld())) {
|
|
UE_LOG(LogRRDApi, Log, TEXT("Found %s"), *BaseAsset->GetPathName());
|
|
OutDataAssets.Add(CastedAsset);
|
|
mEnabledDataAssets.Add(BaseAsset);
|
|
continue;
|
|
}
|
|
|
|
UE_LOG(LogRRDApi, Warning, TEXT("Asset Disabled: %s"), *BaseAsset->GetPathName());
|
|
mDisabledDataAssets.Add(BaseAsset);
|
|
}
|
|
}
|
|
|
|
UE_LOG(LogRRDApi, Warning, TEXT("Found %d of: %s"), OutDataAssets.Num(), *T::StaticClass()->GetPathName());
|
|
return OutDataAssets.Num() > 0;
|
|
}
|