2025-07-09 03:27:23 +02:00
|
|
|
|
#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"
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-11 13:09:18 +02:00
|
|
|
|
class UDTFluxCoreSubsystem;
|
|
|
|
|
|
|
2025-07-09 03:27:23 +02:00
|
|
|
|
USTRUCT()
|
|
|
|
|
|
struct FRequestData
|
|
|
|
|
|
{
|
|
|
|
|
|
GENERATED_BODY()
|
|
|
|
|
|
|
|
|
|
|
|
UPROPERTY()
|
|
|
|
|
|
TArray<FGuid> RequestIds;
|
|
|
|
|
|
UPROPERTY()
|
|
|
|
|
|
TMap<FGuid, FDTFluxStageRankings> StageRankings;
|
|
|
|
|
|
UPROPERTY()
|
|
|
|
|
|
int ContestId;
|
|
|
|
|
|
|
|
|
|
|
|
UPROPERTY()
|
|
|
|
|
|
bool bIsReady = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
FRequestData() = default;
|
|
|
|
|
|
|
|
|
|
|
|
FRequestData(const TArray<FGuid>& InRequestIds, const TMap<FGuid, FDTFluxStageRankings>& InStageRankings)
|
2025-07-11 13:09:18 +02:00
|
|
|
|
: RequestIds(InRequestIds), StageRankings(InStageRankings), ContestId(-1)
|
2025-07-09 03:27:23 +02:00
|
|
|
|
{
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
*
|
|
|
|
|
|
* @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<FDTFluxPursuitInfo> PursuitGroup = TArray<FDTFluxPursuitInfo>();
|
|
|
|
|
|
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()
|
2025-07-11 13:09:18 +02:00
|
|
|
|
int PursuitMaxSimultaneousPursuit = 7;
|
|
|
|
|
|
|
2025-07-09 03:27:23 +02:00
|
|
|
|
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category="DTFlux|Pursuit",
|
|
|
|
|
|
meta=(ClampMin="1", ClampMax="60", UIMin="0", UIMax="60"))
|
|
|
|
|
|
int MassStartDelay = 10;
|
|
|
|
|
|
|
|
|
|
|
|
UPROPERTY()
|
2025-07-11 13:09:18 +02:00
|
|
|
|
FDateTime MassStartTime = FDateTime::MinValue();
|
|
|
|
|
|
|
|
|
|
|
|
UPROPERTY()
|
|
|
|
|
|
TArray<FDTFluxPursuitGroup> GroupedPursuit;
|
2025-07-09 03:27:23 +02:00
|
|
|
|
|
|
|
|
|
|
UPROPERTY()
|
|
|
|
|
|
int CurrentIndex = -1;
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-07-11 13:09:18 +02:00
|
|
|
|
UFUNCTION(BlueprintCallable, Category="DTFlux|Pursuit", meta=(Keywords="pursuit, launch, poursuite"))
|
|
|
|
|
|
void InitPursuit(const TArray<int> InContestIds, const int MaxSimultaneousPursuit = 7);
|
2025-07-09 03:27:23 +02:00
|
|
|
|
|
|
|
|
|
|
UFUNCTION(BlueprintCallable, Category="DTFlux|Pursuit", meta=(Keywords="pursuit, launch, poursuite"))
|
2025-07-11 13:09:18 +02:00
|
|
|
|
void GetPursuit(TArray<FDTFluxPursuitInfo>& OutPursuitFocusNext, TArray<FDTFluxPursuitInfo>& OutPursuitNext,
|
|
|
|
|
|
bool& BIsFocusTruncate, const int MaxSimultaneousPursuit = 7);
|
2025-07-09 03:27:23 +02:00
|
|
|
|
|
|
|
|
|
|
UFUNCTION()
|
2025-07-11 19:04:37 +02:00
|
|
|
|
bool InitSubSystems();
|
2025-07-09 03:27:23 +02:00
|
|
|
|
|
|
|
|
|
|
UFUNCTION()
|
2025-07-11 19:04:37 +02:00
|
|
|
|
bool BindRankings();
|
2025-07-09 03:27:23 +02:00
|
|
|
|
|
|
|
|
|
|
UFUNCTION()
|
2025-07-11 19:04:37 +02:00
|
|
|
|
void UnbindRankings();
|
2025-07-09 03:27:23 +02:00
|
|
|
|
|
|
|
|
|
|
UFUNCTION()
|
2025-07-11 19:04:37 +02:00
|
|
|
|
void OnRankingsReceived(const FDTFluxStageKey NewStageKey, const FDTFluxStageRankings NewStageRankings);
|
2025-07-09 03:27:23 +02:00
|
|
|
|
|
|
|
|
|
|
private:
|
2025-07-11 19:04:37 +02:00
|
|
|
|
TMap<FDTFluxStageKey, bool> PendingStageRanking;
|
|
|
|
|
|
TArray<FDTFluxStageRankings> AllRankings;
|
2025-07-11 13:09:18 +02:00
|
|
|
|
UDTFluxCoreSubsystem* CoreSubsystem = nullptr;
|
|
|
|
|
|
UDTFluxNetworkSubsystem* NetworkSubsystem = nullptr;
|
2025-07-09 03:27:23 +02:00
|
|
|
|
|
2025-07-11 13:09:18 +02:00
|
|
|
|
UPROPERTY()
|
|
|
|
|
|
bool bIsSequenceDone = true;
|
2025-07-11 19:04:37 +02:00
|
|
|
|
UPROPERTY()
|
|
|
|
|
|
bool bIsRankingBounded = false;
|
2025-07-09 03:27:23 +02:00
|
|
|
|
UFUNCTION()
|
2025-07-11 13:09:18 +02:00
|
|
|
|
void SetPursuitInfoIsMassStart(FDTFluxPursuitGroup NextFocusGroup);
|
|
|
|
|
|
UFUNCTION()
|
2025-07-11 19:04:37 +02:00
|
|
|
|
bool LaunchPursuitSequence();
|
2025-07-09 03:27:23 +02:00
|
|
|
|
};
|