LogoArcana  0.0.1
ArcanaWorldSubsystem.h
Go to the documentation of this file.
1// MIT
2
3#pragma once
4
5#include "CoreMinimal.h"
6#include "Subsystems/WorldSubsystem.h"
8#include "Engine/StreamableManager.h"
9#include "Interfaces/IHttpRequest.h"
10#include "Interfaces/IHttpResponse.h"
11#include "Async/AsyncWork.h"
12#include "ArcanaWorldSubsystem.generated.h"
13
14DECLARE_MULTICAST_DELEGATE(FOnSpawnDefinitionsReady);
15
16class FAsyncStreamingWorker : public FNonAbandonableTask
17{
18public:
19 FAsyncStreamingWorker(const TArray<FVector>& InPlayerLocations, const TArray<FVector>& InPointPositions, float InRadiusSq)
20 : PlayerLocations(InPlayerLocations), PointPositions(InPointPositions), RadiusSq(InRadiusSq) {}
21
22 TArray<FVector> PlayerLocations;
23 TArray<FVector> PointPositions;
24 TArray<bool> OutProximityResults;
25 float RadiusSq;
26
27 void DoWork();
28 FORCEINLINE TStatId GetStatId() const { RETURN_QUICK_DECLARE_CYCLE_STAT(FAsyncStreamingWorker, STATGROUP_ThreadPoolAsyncTasks); }
29};
30
34UCLASS()
35class ARCANA_API UArcanaWorldSubsystem : public UWorldSubsystem
36{
37 GENERATED_BODY()
38
39 public:
40 virtual void OnWorldBeginPlay(UWorld& InWorld) override;
41 virtual void Deinitialize() override;
42
43 void RegisterDirectPoints(uint32 SourceID, const TArray<FTransform>& Transforms, const FGameplayTagContainer& ZoneFilters, const FGameplayTagContainer& RarityFilters, float MinDelay, float MaxDelay);
44 void UnregisterSource(uint32 SourceID);
45
46 // Event hooks to delay initial spatial volume allocations until data fetches complete
47 FOnSpawnDefinitionsReady OnDefinitionsReady;
48 bool AreDefinitionsLoaded() const { return bDefinitionsLoaded; }
49
50private:
51 UPROPERTY(EditDefaultsOnly, Category = "Spawner Settings")
52 EDataFetchMode BackendMode = EDataFetchMode::RemoteDatabaseAPI;
53
54 UPROPERTY(EditDefaultsOnly, Category = "Spawner Settings")
55 FString RemoteDatabaseURL = TEXT("yourgame.com");
56
57 UPROPERTY()
58 UDataTable* LocalSpawnDataTable;
59
60 FStreamableManager StreamableManager;
61 FTimerHandle EvaluationTimerHandle;
62 bool bWorkerThreadActive = false;
63 bool bDefinitionsLoaded = false;
64
65 TArray<FPackedSpawnInstance> MasterRegistry;
66 TArray<FSpawnableItemDefinition> CompiledDefinitions;
67
68 TMap<FGameplayTag, int32> GlobalLimits;
69 TMap<FGameplayTag, int32> CurrentGlobalCounts;
70
71 const float StreamRadiusSq = 144000000.0f; // 120 Meters
72
73 void InitializeDataFetch();
74 void LoadFromLocalDataTable();
75 void FetchFromRemoteAPI();
76 void OnRemoteResponseReceived(FHttpRequestPtr Request, FHttpResponsePtr Response, bool bWasSuccessful);
77 void ProcessRawJsonPayload(const FString& JsonString);
78 void FinalizeDefinitionsLoad();
79
80 void RunParallelStreamingCheck();
81 void ApplyParallelStreamingResults(TArray<bool> ProximityResults);
82
83 const FSpawnableItemDefinition* SelectRandomRow(const FGameplayTagContainer& Zones, const FGameplayTagContainer& Rarities) const;
84 void RequestAsyncMaterialize(int32 TargetIndex, TSoftClassPtr<AActor> ClassPtr);
85
86 UFUNCTION()
87 void OnPhysicalActorDestroyed(AActor* DestroyedActor);
88 void ExecuteRespawnLogic(uint32 InstanceHash, FGameplayTag ItemTag, uint32 SourceID, float MinDelay, float MaxDelay);
89};
EDataFetchMode
Definition: ArcanaVirtualizedSpawnTypes.h:19
DECLARE_MULTICAST_DELEGATE(FOnSpawnDefinitionsReady)
Definition: ArcanaWorldSubsystem.h:17
TArray< FVector > PointPositions
Definition: ArcanaWorldSubsystem.h:23
TArray< FVector > PlayerLocations
Definition: ArcanaWorldSubsystem.h:22
float RadiusSq
Definition: ArcanaWorldSubsystem.h:25
void DoWork()
Definition: ArcanaWorldSubsystem.cpp:14
FAsyncStreamingWorker(const TArray< FVector > &InPlayerLocations, const TArray< FVector > &InPointPositions, float InRadiusSq)
Definition: ArcanaWorldSubsystem.h:19
TArray< bool > OutProximityResults
Definition: ArcanaWorldSubsystem.h:24
FORCEINLINE TStatId GetStatId() const
Definition: ArcanaWorldSubsystem.h:28
Definition: ArcanaWorldSubsystem.h:36
bool AreDefinitionsLoaded() const
Definition: ArcanaWorldSubsystem.h:48
FOnSpawnDefinitionsReady OnDefinitionsReady
Definition: ArcanaWorldSubsystem.h:47
Definition: ArcanaVirtualizedSpawnTypes.h:70
Definition: ArcanaVirtualizedSpawnTypes.h:27