Fixing Various Bugs On Delegates

This commit is contained in:
2025-07-11 19:04:37 +02:00
parent 73413e44b4
commit f1f300a351
12 changed files with 2765 additions and 1207 deletions

View File

@ -13,35 +13,6 @@ UDTFluxPursuitManager::UDTFluxPursuitManager(const FObjectInitializer& ObjectIni
{
}
// TODO : Add way to pass MaxSimultaneousPursuit and MassStartDelay
// For now it's done in UPROPERTIES
void UDTFluxPursuitManager::InitPursuitForContests(const TArray<FDTFluxContest> InContests)
{
if (InitSubSystems())
{
for (const auto Contest : InContests)
{
FRequestData RequestData;
RequestData.ContestId = Contest.ContestId;
uint8 StageId = Contest.Stages.Last().StageId;
FGuid Guid = NetworkSubsystem->SendTrackedRequestWithCallback(EDTFluxApiDataType::StageRanking,
Contest.ContestId, StageId, -1,
FOnDTFluxTrackedRequestResponse::CreateUObject(
this,
&UDTFluxPursuitManager::OnRequestResponse),
FOnDTFluxTrackedRequestTimeout::CreateUObject(
this,
&UDTFluxPursuitManager::OnRequestTimeoutResponse),
FOnDTFluxRequestResponseError::CreateUObject(
this,
&UDTFluxPursuitManager::OnRequestError));
RequestData.RequestIds.Add(Guid);
PendingRequestData.Add(RequestData);
}
}
}
void UDTFluxPursuitManager::InitPursuit(const TArray<int> InContestIds, const int MaxSimultaneousPursuit)
{
CoreSubsystem = Cast<UDTFluxCoreSubsystem>(GetOuter());
@ -50,14 +21,19 @@ void UDTFluxPursuitManager::InitPursuit(const TArray<int> InContestIds, const in
UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("CoreSubsystem is not Available !!!"));
return;
}
TArray<FDTFluxContest> Contests = TArray<FDTFluxContest>();
AllRankings.Reset();
for (const auto& ContestId : InContestIds)
{
FDTFluxContest Contest;
CoreSubsystem->GetContestForId(ContestId, Contest);
Contests.Add(Contest);
InitPursuitForContests(Contests);
if (CoreSubsystem->GetContestForId(ContestId, Contest))
{
BindRankings();
FDTFluxStageKey StageKey = FDTFluxStageKey(ContestId, Contest.GetLastStageId());
FDTFluxStageRankings TempStageRankings;
//Obtenir les ranking Frais.
CoreSubsystem->GetStageRankingsWithKey(StageKey, TempStageRankings, false);
PendingStageRanking.Add(StageKey, false);
}
}
}
@ -127,49 +103,6 @@ void UDTFluxPursuitManager::GetPursuit(TArray<FDTFluxPursuitInfo>& OutPursuitFoc
}
}
void UDTFluxPursuitManager::OnRequestResponse(const FGuid& RequestId, FDTFluxServerResponse& Response)
{
UE_LOG(logDTFluxCoreSubsystem, Log,
TEXT("UDTFluxPursuitManager::OnRequestResponse() Received Ranking For Stage %i"), Response.StageID)
UE_LOG(logDTFluxCoreSubsystem, Log, TEXT("Response is %s"), *UEnum::GetValueAsString(Response.GetResponseType()))
//check if request
if (Response.GetResponseType() == EDTFluxApiDataType::StageRanking)
{
FDTFluxStageRankings Rankings;
if (Response.ParseStageRankingResponse(Rankings))
{
FRequestData FoundData = FRequestData();
for (auto& PendingReq : PendingRequestData)
{
// Check for a matching PendingReq
if (PendingReq.IsWaitingFor(RequestId, Rankings))
{
FoundData = PendingReq;
// A request Is Terminated
UE_LOG(logDTFluxCoreSubsystem, Log,
TEXT("UDTFluxPursuitManager::OnRequestResponse() Ranking for Stage %i is complete"),
Response.StageID)
break;
}
}
if (InitPursuitForRequest(FoundData))
{
OnPursuitSequenceReady.Broadcast(MassStartTime, NextFocusPursuits, NextFocusPursuits, bFocusIsTruncate);
}
}
}
}
void UDTFluxPursuitManager::OnRequestTimeoutResponse(const FGuid& RequestId, const FString& TimeoutMessage)
{
UE_LOG(logDTFluxCoreSubsystem, Warning, TEXT("Request Timeout [%s]"), *TimeoutMessage);
}
void UDTFluxPursuitManager::OnRequestError(const FGuid& RequestId, const FString& ErrorMessage)
{
UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("Request Error [%s]"), *ErrorMessage);
}
bool UDTFluxPursuitManager::InitSubSystems()
{
if (NetworkSubsystem)
@ -180,23 +113,64 @@ bool UDTFluxPursuitManager::InitSubSystems()
return NetworkSubsystem != nullptr;
}
bool UDTFluxPursuitManager::InitPursuitForRequest(FRequestData Data)
bool UDTFluxPursuitManager::BindRankings()
{
if (CoreSubsystem)
{
if (!bIsRankingBounded)
{
CoreSubsystem->OnRequestedStageRankings.AddDynamic(this, &UDTFluxPursuitManager::OnRankingsReceived);
bIsRankingBounded = true;
}
return bIsRankingBounded;
}
UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("CoreSubsystem is not Available !!!"));
return bIsRankingBounded = false;
}
void UDTFluxPursuitManager::UnbindRankings()
{
if (CoreSubsystem)
{
if (bIsRankingBounded)
{
CoreSubsystem->OnRequestedStageRankings.RemoveDynamic(this, &UDTFluxPursuitManager::OnRankingsReceived);
bIsRankingBounded = false;
return;
}
}
bIsRankingBounded = false;
UE_LOG(logDTFluxCoreSubsystem, Error, TEXT("CoreSubsystem is not Available !!!"));
}
void UDTFluxPursuitManager::OnRankingsReceived(const FDTFluxStageKey NewStageKey,
const FDTFluxStageRankings NewStageRankings)
{
if (PendingStageRanking.Contains(NewStageKey))
{
PendingStageRanking.Remove(NewStageKey);
AllRankings.Add(NewStageRankings);
if (PendingStageRanking.IsEmpty())
{
//everything is ready to go compute and start
UnbindRankings();
LaunchPursuitSequence();
}
}
}
bool UDTFluxPursuitManager::LaunchPursuitSequence()
{
//Clean Data
NextFocusPursuits.Empty();
NextPursuits.Empty();
GroupedPursuit.Empty();
TArray<FDTFluxDetailedRankingItem> AllRankings;
TArray<FDTFluxPursuitInfo> AllPursuits;
TMap<FDateTime, FDTFluxPursuitGroup> TempGroups;
bIsSequenceDone = false;
// Full the Array Of Rankings
for (auto& KeyPair : Data.StageRankings)
for (auto& Ranking : AllRankings)
{
for (auto StageRanking : KeyPair.Value.Rankings)
for (auto StageRanking : Ranking.Rankings)
{
int ContestId = KeyPair.Value.ContestId;
int ContestId = Ranking.ContestId;
FDTFluxPursuitInfo PursuitInfo;
PursuitInfo.StartTime = StageRanking.StartTime;
PursuitInfo.Bib = StageRanking.Bib;
@ -204,11 +178,6 @@ bool UDTFluxPursuitManager::InitPursuitForRequest(FRequestData Data)
AllPursuits.Add(PursuitInfo);
}
}
// Sort Rankings
// AllPursuits.Sort([](const FDTFluxPursuitInfo& A, const FDTFluxPursuitInfo& B) {
// return A.StartTime < B.StartTime;
// });
for (auto& Pursuit : AllPursuits)
{
if (TempGroups.Contains(Pursuit.StartTime))
@ -251,5 +220,13 @@ bool UDTFluxPursuitManager::InitPursuitForRequest(FRequestData Data)
{
return A.StartTimeGlobal < B.StartTimeGlobal;
});
TArray<FDTFluxPursuitInfo> FocusPursuits;
TArray<FDTFluxPursuitInfo> NextPursuits;
bool bIsFocusTruncate = false;
GetPursuit(FocusPursuits, NextPursuits, bIsFocusTruncate);
FPursuitStaterData PursuitData = FPursuitStaterData(FocusPursuits, NextPursuits, MassStartTime, bIsFocusTruncate);
CoreSubsystem->OnPursuitSequenceReady.Broadcast(PursuitData);
return true;
}