#pragma once #include "CoreMinimal.h" #include "Subsystems/DTFluxNetworkSubsystem.h" #include "Types/Struct/DTFluxRaceDataStructs.h" #include "Types/Struct/FDTFluxPursuitInfo.h" #include "UObject/Object.h" #include "DTFluxPursuitManager.generated.h" class UDTFluxCoreSubsystem; USTRUCT() struct FRequestData { GENERATED_BODY() UPROPERTY() TArray RequestIds; UPROPERTY() TMap StageRankings; UPROPERTY() int ContestId; UPROPERTY() bool bIsReady = false; FRequestData() = default; FRequestData(const TArray& InRequestIds, const TMap& InStageRankings) : RequestIds(InRequestIds), StageRankings(InStageRankings), ContestId(-1) { }; /** * * @param RequestId * @param InRankings * @return True if all needed requests have responses */ bool IsWaitingFor(const FGuid& RequestId, const FDTFluxStageRankings& InRankings) { if (!StageRankings.Contains(RequestId)) { StageRankings.Add(RequestId, InRankings); } bIsReady = StageRankings.Num() <= RequestIds.Num(); return bIsReady; } }; USTRUCT() struct FDTFluxPursuitGroup { GENERATED_BODY() UPROPERTY() TArray PursuitGroup = TArray(); UPROPERTY() FDateTime StartTimeGlobal = FDateTime::MinValue(); UPROPERTY() bool bHasStarted = false; UPROPERTY() bool bIsFocus = false; }; DECLARE_DYNAMIC_MULTICAST_DELEGATE_FourParams(FOnPursuitSequenceReady, const FDateTime, MassStartTime, const TArray, NextFocusPursuits, const TArray, NextPursuit, bool, bIsTrtuncate); /** * */ UCLASS(BlueprintType) class DTFLUXCORESUBSYSTEM_API UDTFluxPursuitManager : public UObject { GENERATED_BODY() public: UDTFluxPursuitManager(const FObjectInitializer& ObjectInitializer); UPROPERTY(BlueprintReadOnly, VisibleAnywhere) TArray NextFocusPursuits; UPROPERTY(BlueprintReadOnly, VisibleAnywhere) TArray NextPursuits; UPROPERTY(BlueprintReadOnly, VisibleAnywhere) bool bFocusIsTruncate = false; UPROPERTY() int PursuitMaxSimultaneousPursuit = 7; UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="DTFlux|Pursuit", meta=(ClampMin="1", ClampMax="60", UIMin="0", UIMax="60")) int MassStartDelay = 10; UPROPERTY() FDateTime MassStartTime = FDateTime::MinValue(); UPROPERTY() TArray GroupedPursuit; UPROPERTY() int CurrentIndex = -1; UPROPERTY(BlueprintAssignable, Category="DTFlux|Pursuit") FOnPursuitSequenceReady OnPursuitSequenceReady; UFUNCTION(BlueprintCallable, Category="DTFlux|Pursuit", meta=(Keywords="pursuit, launch, poursuite")) void InitPursuit(const TArray InContestIds, const int MaxSimultaneousPursuit = 7); UFUNCTION(BlueprintCallable, Category="DTFlux|Pursuit", meta=(Keywords="pursuit, launch, poursuite")) void GetPursuit(TArray& OutPursuitFocusNext, TArray& OutPursuitNext, bool& BIsFocusTruncate, const int MaxSimultaneousPursuit = 7); UFUNCTION() void OnRequestResponse(const FGuid& RequestId, FDTFluxServerResponse& Response); UFUNCTION() void OnRequestTimeoutResponse(const FGuid& RequestId, const FString& TimeoutMessage); UFUNCTION() void OnRequestError(const FGuid& RequestId, const FString& ErrorMessage); UFUNCTION() bool InitSubSystems(); private: TArray PendingRequestData; UDTFluxCoreSubsystem* CoreSubsystem = nullptr; UDTFluxNetworkSubsystem* NetworkSubsystem = nullptr; UPROPERTY() bool bIsSequenceDone = true; UFUNCTION() void SetPursuitInfoIsMassStart(FDTFluxPursuitGroup NextFocusGroup); UFUNCTION() void InitPursuitForContests(const TArray InContests); UFUNCTION() bool InitPursuitForRequest(FRequestData Data); };