// 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 "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, URRDATurbineDataAsset*> Data; }; USTRUCT(BlueprintType) struct FRRDADataHolderBoilerData { GENERATED_BODY() UPROPERTY(BlueprintReadOnly) TMap, URRDABoilerDataAsset*> Data; }; USTRUCT(BlueprintType) struct FRRDADataHolderCoolerData { GENERATED_BODY() UPROPERTY(BlueprintReadOnly) TMap, URRDACoolerDataAsset*> Data; }; USTRUCT(BlueprintType) struct FRRDADataHolderHeaterData { GENERATED_BODY() UPROPERTY(BlueprintReadOnly) TMap, URRDAHeaterDataAsset*> Data; }; USTRUCT(BlueprintType) struct FRRDADataHolderDSBuildingData { GENERATED_BODY() UPROPERTY() URRDADataAssetDSAdapterCovers* AdapterCovers; UPROPERTY() URRDADataAssetDSModAdapter* ModAdapter; UPROPERTY() TArray 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(); public: // Dirt Functions UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|FF") int32 GetAllDirtItems(TArray>& Items) const; UFUNCTION(BlueprintCallable, Category = "RRDA|DataAsset|FF") URRDADirtDataAsset* GetDataForDirtItem(TSubclassOf Item) const; UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|FF") TArray GetAllDirtAssets() const; // DS Mod Adapter Functions UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|DS") int32 GetAllDSBuildingClasses(TArray>& OutBuildingClasses) const; UFUNCTION(BlueprintCallable, Category = "RRDA|DataAsset|DS") URRDADataAssetDSModAdapter* GetModAdapterDataAssetForBuildingClass(TSubclassOf BuildingClass) const; UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|DS") TArray GetAllModAdapterDataAssets() const; UFUNCTION(BlueprintCallable, Category = "RRDA|DataAsset|DS") bool HasDSModAdapterForBuildingClass(TSubclassOf BuildingClass); // DS Adapter Covers Functions UFUNCTION(BlueprintCallable, Category = "RRDA|DataAsset|DS") URRDADataAssetDSAdapterCovers* GetDSAdapterCoverDataAssetForBuildingClass(TSubclassOf BuildingClass) const; UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|DS") TArray GetAllDSAdapterCoverDataAssets() const; 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; UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP") URRDATurbineDataAsset* GetTurbineItemData(TSubclassOf Item, int32 Tier) const; UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP") bool GetAllTurbineRelevantItems(TArray>& Items, int32 Tier) const; UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP") URRDATurbineDataAsset* GetDefaultTurbineAsset(int32 Tier) const; UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP") TArray GetAllTurbineAssets(int32 Tier) const; // Cooler Functions UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP") bool GetAllCoolerItems(TArray>& Items, ERRDACoolerType Type) const; UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP") URRDACoolerDataAsset* GetCoolerItemData(TSubclassOf Item, ERRDACoolerType Type) const; UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP") URRDACoolerDataAsset* GetDefaultCoolerAsset(ERRDACoolerType Type) const; UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP") TArray 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>& Items, int32 Tier) const; UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP") URRDABoilerDataAsset* GetBoilerItemData(TSubclassOf Item, int32 Tier) const; UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP") bool GetAllBoilerRelevantItems(TArray>& Items, int32 Tier) const; UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP") URRDABoilerDataAsset* GetDefaultBoilerAsset(int32 Tier) const; UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP") TArray GetAllBoilerAssets(int32 Tier) const; // Heater Functions UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP") bool GetAllHeaterItems(TArray>& Items, ERRDAHeaterType Type) const; UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP") URRDAHeaterDataAsset* GetHeaterItemData(TSubclassOf Item, ERRDAHeaterType Type) const; UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP") bool GetAllHeaterRelevantItems(TArray>& Items, ERRDAHeaterType Type) const; UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP") URRDAHeaterDataAsset* GetDefaultHeaterAsset(ERRDAHeaterType Type) const; UFUNCTION(BlueprintPure, Category = "RRDA|DataAsset|RP|MP") TArray GetAllHeaterAssets(ERRDAHeaterType Type) const; public: /** * Find all data assets of a specific class * @param OutDataAssets - Set of data assets * @return true if found any data assets */ template bool FindAllDataAssetsOfClass(TSet& OutDataAssets); public: UPROPERTY(BlueprintReadOnly, Category = "RRDA|DataAsset") TMap, URRDADirtDataAsset*> mDirtAssets; UPROPERTY(BlueprintReadOnly, Category = "RRDA|DataAsset") TMap, FRRDADataHolderDSBuildingData> mDSBuildingData; UPROPERTY(BlueprintReadOnly, Category = "RRDA|DataAsset") TMap mGeneratorAssets; UPROPERTY(BlueprintReadOnly, Category = "RRDA|DataAsset") TMap mTurbineAssets; UPROPERTY(BlueprintReadOnly, Category = "RRDA|DataAsset") TMap mBoilerAssets; UPROPERTY(BlueprintReadOnly, Category = "RRDA|DataAsset") TMap mCoolerAssets; UPROPERTY(BlueprintReadOnly, Category = "RRDA|DataAsset") TMap mHeaterAssets; UPROPERTY(BlueprintReadOnly, Category = "RRDA|DataAsset") TSet mDisabledDataAssets; UPROPERTY(BlueprintReadOnly, Category = "RRDA|DataAsset") TSet mEnabledDataAssets; }; template bool URRDADataAssetSubsystem::FindAllDataAssetsOfClass(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(T::StaticClass()->GetClassPathName(), AssetList, true); // Split assets into separate arrays. for (const FAssetData& Asset : AssetList) { UObject* Obj = Asset.GetAsset(); T* CastedAsset = Cast(Obj); if (!CastedAsset) { UE_LOG(LogRRDApi, Warning, TEXT("Invalid asset type: %s"), *Asset.AssetName.ToString()); continue; } if (URRDADataAssetBase* BaseAsset = Cast(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; }