feat: wip

This commit is contained in:
2024-10-24 18:06:58 +02:00
commit c7f5bd9326
35 changed files with 1226 additions and 0 deletions

View File

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

View File

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

View File

@@ -0,0 +1,30 @@
// Fill out your copyright notice in the Description page of Project Settings.
#include "DataAssets/RRDADirtDataAsset.h"
#include "RefinedRDApi.h"
TArray<FItemAmount> URRDADirtDataAsset::GetExtractableSeed(URRDADirtDataAsset* Asset)
{
if(!Asset)
{
return TArray<FItemAmount>();
}
return Asset->mExtractableSeed;
}
float URRDADirtDataAsset::GetExtractionCycleTime(URRDADirtDataAsset* Asset) {
if(!Asset)
{
return 0.f;
}
return Asset->mExtractionCycleTime;
}
int32 URRDADirtDataAsset::GetDirtConsume(URRDADirtDataAsset* Asset) {
if(!Asset)
{
return 0;
}
return Asset->mDirtConsume;
}

View File

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

View File

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

View File

@@ -0,0 +1,14 @@
#include "RefinedRDApi.h"
DEFINE_LOG_CATEGORY(LogRRDApi);
void FRefinedRDApiModule::StartupModule() {
// Nothing here... yet
}
void FRefinedRDApiModule::ShutdownModule() {
// Nothing here... yet
}
IMPLEMENT_MODULE(FRefinedRDApiModule, RefinedRDApi);

View File

@@ -0,0 +1,93 @@
#include "Subsystems/RRDADataAssetSubsystem.h"
#include "RefinedRDApi.h"
#include "DataAssets/RRDADirtDataAsset.h"
#include "Engine/AssetManager.h"
URRDADataAssetSubsystem::URRDADataAssetSubsystem() {}
URRDADataAssetSubsystem* URRDADataAssetSubsystem::Get(UObject* Context)
{
if (IsValid(Context))
{
return Context->GetWorld()->GetSubsystem<URRDADataAssetSubsystem>();
}
return nullptr;
}
URRDADataAssetSubsystem* URRDADataAssetSubsystem::GetChecked(UObject* Context)
{
URRDADataAssetSubsystem* Subsystem = Get(Context);
fgcheck(Subsystem);
return Subsystem;
}
void URRDADataAssetSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
Super::Initialize(Collection);
StartScanForDataAssets();
}
void URRDADataAssetSubsystem::Deinitialize()
{
Super::Deinitialize();
}
void URRDADataAssetSubsystem::StartScanForDataAssets()
{
UAssetManager& Manager = UAssetManager::Get();
Manager.LoadPrimaryAssetsWithType(FPrimaryAssetType("RRDADataAsset"));
mDisabledDataAssets.Empty();
mAllDataAssets.Empty();
ReCacheBoilerDataAssets();
ReCacheCoolerDataAssets();
ReCacheDirtDataAssets();
ReCacheHeaterDataAssets();
ReCacheTurbineDataAssets();
}
void URRDADataAssetSubsystem::ReCacheDirtDataAssets()
{
mDirtAssets.Empty();
TSet<URRDADirtDataAsset*> DirtDataAssets;
if(FindAllDataAssetsOfClass(DirtDataAssets))
{
for (URRDADirtDataAsset* DirtDataAsset : DirtDataAssets)
{
mDirtAssets.Add(DirtDataAsset->mItem, DirtDataAsset);
}
}
UE_LOG(LogRRDApi, Log, TEXT("ReCacheDirtDataAssets: %d"), mDirtAssets.Num());
}
void URRDADataAssetSubsystem::ReCacheTurbineDataAssets()
{
UE_LOG(LogRRDApi, Log, TEXT("ReCacheTurbineDataAssets"));
}
void URRDADataAssetSubsystem::ReCacheBoilerDataAssets() {
UE_LOG(LogRRDApi, Log, TEXT("ReCacheBoilerDataAssets"));
}
void URRDADataAssetSubsystem::ReCacheCoolerDataAssets() {
UE_LOG(LogRRDApi, Log, TEXT("ReCacheCoolerDataAssets"));
}
void URRDADataAssetSubsystem::ReCacheHeaterDataAssets() {
UE_LOG(LogRRDApi, Log, TEXT("ReCacheHeaterDataAssets"));
}
int32 URRDADataAssetSubsystem::GetAllDirtItems(TArray<TSubclassOf<UFGItemDescriptor>>& Items) const
{
return mDirtAssets.GetKeys(Items);
}
URRDADirtDataAsset* URRDADataAssetSubsystem::GetDataForDirtItem(TSubclassOf<UFGItemDescriptor> Item) const
{
if(!Item) return nullptr;
return *mDirtAssets.Find(Item);
}

View File

@@ -0,0 +1,28 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "RRDADataAssetBase.h"
#include "ItemAmount.h"
#include "RRDABoilerDataAsset.generated.h"
UCLASS( BlueprintType )
class REFINEDRDAPI_API URRDABoilerDataAsset : public URRDADataAssetBase
{
GENERATED_BODY()
public:
/**
* Fuel item that this heater uses
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Boiler")
FItemAmount mItem;
/**
* What this boiler produces
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Boiler")
FItemAmount mOutputItem;
};

View File

@@ -0,0 +1,22 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "ItemAmount.h"
#include "RRDADataAssetBase.h"
#include "RRDACoolerDataAsset.generated.h"
UCLASS( BlueprintType )
class REFINEDRDAPI_API URRDACoolerDataAsset : public URRDADataAssetBase
{
GENERATED_BODY()
public:
/**
* Fuel item that this heater uses
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Cooler")
FItemAmount mItem;
};

View File

@@ -0,0 +1,42 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "RRDADataAssetBase.generated.h"
UCLASS( BlueprintType )
class REFINEDRDAPI_API URRDADataAssetBase : public UPrimaryDataAsset
{
GENERATED_BODY()
protected:
/**
* Can be overridden to disable the asset or make some other checks
*/
virtual bool IsEnabled_Internal(UObject* WorldContextObject) const
{
return !mIsDisabled;
}
virtual FPrimaryAssetId GetPrimaryAssetId() const override
{
return FPrimaryAssetId(FPrimaryAssetType("RRDADataAsset"), GetFName());
}
public:
UFUNCTION( BlueprintPure, Category="FicsitFarming|Dirt" )
static bool IsEnabled(URRDADataAssetBase* Asset, UObject* WorldContextObject)
{
if(!Asset) return false;
return Asset->IsEnabled_Internal(WorldContextObject);
};
/**
* Disable this asset from being used in the game
* For example if a mod is disabling some content from another mod
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Asset")
bool mIsDisabled;
};

View File

@@ -0,0 +1,51 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "RRDADataAssetBase.h"
#include "ItemAmount.h"
#include "RRDADirtDataAsset.generated.h"
UCLASS( BlueprintType )
class REFINEDRDAPI_API URRDADirtDataAsset : public URRDADataAssetBase
{
GENERATED_BODY()
public:
UFUNCTION( BlueprintPure, Category="FicsitFarming|Dirt" )
static TArray<FItemAmount> GetExtractableSeed(URRDADirtDataAsset* Asset);
UFUNCTION( BlueprintPure, Category="FicsitFarming|Dirt" )
static float GetExtractionCycleTime(URRDADirtDataAsset* Asset);
UFUNCTION( BlueprintPure, Category="FicsitFarming|Dirt" )
static int32 GetDirtConsume(URRDADirtDataAsset* Asset);
public:
/**
* What Item should be a Dirt?
* @warning - If 2 DirtDataAssets have the same Item, the game will use the last one which was loaded
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "FicsitFarming")
TSubclassOf<UFGItemDescriptor> mItem;
/**
* Seeds that can be extracted from this dirt every cycle
*/
UPROPERTY( EditAnywhere, BlueprintReadWrite, Category="FicsitFarming" )
TArray<FItemAmount> mExtractableSeed;
/**
* Production time for the extraction of seeds
*/
UPROPERTY( EditAnywhere, BlueprintReadWrite, Category="FicsitFarming" )
float mExtractionCycleTime = 6.0f;
/**
* How much dirt should be consumed?
*/
UPROPERTY( EditAnywhere, BlueprintReadWrite, Category="FicsitFarming" )
int32 mDirtConsume = 2;
};

View File

@@ -0,0 +1,36 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "RRDADataAssetBase.h"
#include "ItemAmount.h"
#include "Enums/RRDARPEnums.h"
#include "RRDAHeaterDataAsset.generated.h"
UCLASS( BlueprintType )
class REFINEDRDAPI_API URRDAHeaterDataAsset : public URRDADataAssetBase
{
GENERATED_BODY()
public:
/**
* What type of heater this is
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Heater")
ERRDAHeaterType mHeaterType;
/**
* Fuel item that this heater uses
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Heater")
FItemAmount mInput;
/**
* Item that this turbine produces
* @Note - Can be nullptr
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Heater")
FItemAmount mOutput;
};

View File

@@ -0,0 +1,29 @@
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "RRDADataAssetBase.h"
#include "ItemAmount.h"
#include "RRDATurbineDataAsset.generated.h"
UCLASS( BlueprintType )
class REFINEDRDAPI_API URRDATurbineDataAsset : public URRDADataAssetBase
{
GENERATED_BODY()
public:
/**
* Fuel item that this heater uses
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Turbine")
FItemAmount mItem;
/**
* Item that this turbine produces
* @Note - Can be nullptr so that the turbine doesn't produce anything
*/
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "Turbine")
FItemAmount mWasteItem;
};

View File

@@ -0,0 +1,19 @@
#pragma once
#include "CoreMinimal.h"
UENUM(BlueprintType)
enum class ERRDAHeaterType : uint8
{
Biomass,
Coal,
Solution,
Nuclear
};
UENUM(BlueprintType)
enum class ERRDACoolerType : uint8
{
Chemical,
Steam
};

View File

@@ -0,0 +1,11 @@
#pragma once
DECLARE_LOG_CATEGORY_EXTERN(LogRRDApi, Log, All)
class FRefinedRDApiModule : public IModuleInterface
{
public:
/** IModuleInterface implementation */
virtual void StartupModule() override;
virtual void ShutdownModule() override;
};

View File

@@ -0,0 +1,132 @@
// 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 "DataAssets/RRDADataAssetBase.h"
#include "DataAssets/RRDADirtDataAsset.h"
#include "Engine/AssetManager.h"
#include "Enums/RRDARPEnums.h"
#include "Resources/FGItemDescriptor.h"
#include "RRDADataAssetSubsystem.generated.h"
class IAssetRegistry;
UCLASS()
class REFINEDRDAPI_API URRDADataAssetSubsystem : public UWorldSubsystem
{
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();
public:
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;
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);
private:
UPROPERTY()
TMap<TSubclassOf<UFGItemDescriptor>, class URRDADirtDataAsset*> mDirtAssets;
TMap<int32, TMap<TSubclassOf<UFGItemDescriptor>, class URRDATurbineDataAsset*>> mTurbineAssets;
TMap<int32, TMap<TSubclassOf<UFGItemDescriptor>, class URRDABoilerDataAsset*>> mBoilerAssets;
TMap<ERRDACoolerType, TMap<TSubclassOf<UFGItemDescriptor>, class URRDACoolerDataAsset*>> mCoolerAssets;
TMap<ERRDAHeaterType, TMap<TSubclassOf<UFGItemDescriptor>, class URRDAHeaterDataAsset*>> mHeaterAssets;
public:
UPROPERTY(BlueprintReadOnly, Transient, Category = "RRDA|DataAsset")
TSet<URRDADataAssetBase*> mDisabledDataAssets;
UPROPERTY(BlueprintReadOnly, Transient, Category = "RRDA|DataAsset")
TSet<URRDADataAssetBase*> mAllDataAssets;
};
template <class T>
bool URRDADataAssetSubsystem::FindAllDataAssetsOfClass(TSet<T*>& OutDataAssets)
{
OutDataAssets.Empty();
// This doesn't work the AssetDatas are always invalid
/*UAssetManager& Manager = UAssetManager::Get();
TArray<FAssetData> AssetDatas;
Manager.GetPrimaryAssetDataList(FPrimaryAssetType("RRDADataAsset"), AssetDatas);
for (FAssetData AssetData : AssetDatas)
{
if(AssetData.IsValid())
{
if(URRDADataAssetBase* Asset = Cast<URRDADataAssetBase>(AssetData.GetAsset()))
{
if(!URRDADataAssetBase::IsEnabled(Asset, GetWorld()))
{
UE_LOG(LogRRDApi, Error, TEXT("Asset Disabled: %s"), *AssetData.AssetName.ToString());
continue;
}
OutDataAssets.Add(Cast<T>(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<UClass*> FoundClasses;
GetDerivedClasses(T::StaticClass(), FoundClasses, true);
for (UClass* FoundClass : FoundClasses)
{
if(FoundClass->IsNative()) continue;
if(URRDADataAssetBase* Asset = FoundClass->GetDefaultObject<URRDADataAssetBase>())
{
if(!URRDADataAssetBase::IsEnabled(Asset, GetWorld()))
{
UE_LOG(LogRRDApi, Error, TEXT("Asset Disabled: %s"), *FoundClass->GetPathName());
continue;
}
OutDataAssets.Add(FoundClass->GetDefaultObject<T>());
UE_LOG(LogRRDApi, Log, TEXT("Found %s"), *FoundClass->GetPathName());
}
}
return OutDataAssets.Num() > 0;
}

View File

@@ -0,0 +1,65 @@
// Fill out your copyright notice in the Description page of Project Settings.
using UnrealBuildTool;
public class RefinedRDApi : ModuleRules
{
public RefinedRDApi(ReadOnlyTargetRules Target) : base(Target)
{
CppStandard = CppStandardVersion.Cpp20;
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
bLegacyPublicIncludePaths = false;
PublicDependencyModuleNames.AddRange(
new[]
{
"Json",
"Core",
"CoreUObject",
"Engine",
"DeveloperSettings",
"PhysicsCore",
"InputCore",
"OnlineSubsystem", "OnlineSubsystemNull", "OnlineSubsystemUtils",
"SignificanceManager",
"GeometryCollectionEngine",
"ChaosVehiclesCore", "ChaosVehicles", "ChaosSolverEngine",
"AnimGraphRuntime",
"AkAudio", "HTTP",
"AssetRegistry",
"NavigationSystem",
"ReplicationGraph",
"AIModule",
"GameplayTasks",
"SlateCore", "Slate", "UMG",
"RenderCore",
"CinematicCamera",
"Foliage",
"Niagara",
"EnhancedInput",
"GameplayCameras",
"TemplateSequence",
"NetCore",
"GameplayTags"
});
// FactoryGame plugins
PublicDependencyModuleNames.AddRange(new[]
{
"AbstractInstance",
"InstancedSplinesComponent",
"SignificanceISPC"
});
// Header stubs
PublicDependencyModuleNames.AddRange(new[]
{
"DummyHeaders"
});
if (Target.Type == TargetRules.TargetType.Editor)
PublicDependencyModuleNames.AddRange(new[] { "OnlineBlueprintSupport", "AnimGraph" });
PublicDependencyModuleNames.AddRange(new[] { "FactoryGame", "SML" });
}
}