#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; }; /** * */ UCLASS(BlueprintType) class DTFLUXCORESUBSYSTEM_API UDTFluxPursuitManager : public UObject { GENERATED_BODY() public: UDTFluxPursuitManager(const FObjectInitializer& ObjectInitializer); 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; 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(); };