#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(BlueprintType) struct FPursuitStarterData { GENERATED_BODY() public: FPursuitStarterData() = default; FPursuitStarterData(const TArray& InPursuitFocusNext, const TArray& InPursuitNext, const FDateTime& InMassStartTime, const bool InIsFocusTruncate) : PursuitFocusNext(InPursuitFocusNext), PursuitNext(InPursuitNext), MassStartTime(InMassStartTime), bIsFocusTruncate(InIsFocusTruncate) { }; UPROPERTY(BlueprintReadOnly, Category="DTFlux|Pursuit") TArray PursuitFocusNext = TArray(); UPROPERTY(BlueprintReadOnly, Category="DTFlux|Pursuit") TArray PursuitNext = TArray(); UPROPERTY(BlueprintReadOnly, Category="DTFlux|Pursuit") FDateTime MassStartTime = FDateTime::MinValue(); UPROPERTY(BlueprintReadOnly, Category="DTFlux|Pursuit") bool bIsFocusTruncate = false; }; USTRUCT() struct FDTFluxPursuitGroup { GENERATED_BODY() UPROPERTY() TArray PursuitGroup = TArray(); UPROPERTY() FDateTime StartTimeGlobal = FDateTime::MinValue(); UPROPERTY() bool bHasStarted = false; UPROPERTY() bool bIsFocus = false; }; /** * */ UCLASS(BlueprintType) class DTFLUXCORESUBSYSTEM_API UDTFluxPursuitManager : public UObject { GENERATED_BODY() public: UDTFluxPursuitManager(const FObjectInitializer& ObjectInitializer); DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FOnPursuitSequenceReady, const FPursuitStarterData, PursuitData); UPROPERTY(BlueprintAssignable, Category="DTFlux|Core Subsystem") FOnPursuitSequenceReady OnPursuitSequenceReady; UPROPERTY(BlueprintReadOnly, VisibleAnywhere) bool bFocusIsTruncate = false; UPROPERTY() int PursuitMaxSimultaneousPursuit = 7; UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="DTFlux|Pursuit") int MassStartDelay = 10; UPROPERTY() FDateTime MassStartTime = FDateTime::MinValue(); UPROPERTY() TArray GroupedPursuit; UPROPERTY() int CurrentIndex = -1; 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() bool InitSubSystems(); UFUNCTION() bool BindRankings(); UFUNCTION() void UnbindRankings(); UFUNCTION() void OnRankingsReceived(const FDTFluxStageKey NewStageKey, const FDTFluxStageRankings NewStageRankings); private: TMap PendingStageRanking; TArray AllRankings; UDTFluxCoreSubsystem* CoreSubsystem = nullptr; UDTFluxNetworkSubsystem* NetworkSubsystem = nullptr; UPROPERTY() bool bIsSequenceDone = true; UPROPERTY() bool bIsRankingBounded = false; UFUNCTION() void SetPursuitInfoIsMassStart(FDTFluxPursuitGroup NextFocusGroup); UFUNCTION() bool LaunchPursuitSequence(); };