#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" 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) { }; /** * * @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_ThreeParams(FOnPursuitSequenceReady_internal, 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() // TArray TargetStages; UPROPERTY() int MaxSimultaneousPursuit = 7; UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="DTFlux|Pursuit", meta=(ClampMin="1", ClampMax="60", UIMin="0", UIMax="60")) int MassStartDelay = 10; UPROPERTY() TArray PursuitGrouped; UPROPERTY() int CurrentIndex = -1; UPROPERTY(BlueprintAssignable, Category="DTFlux|Pursuit") FOnPursuitSequenceReady_internal OnPursuitSequenceReady_Internal; UFUNCTION(BlueprintCallable, Category="DTFlux|Pursuit", meta=(Keywords="pursuit, launch, poursuite")) void LaunchPursuitSequenceFor(const TArray InContests); 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; public: UFUNCTION() bool InitPursuit(FRequestData Data); private: UDTFluxNetworkSubsystem* NetworkSubsystem = nullptr; };