Unreal Engine Module - Add an all time high score leaderboard - Put it all together
Last updated on January 13, 2024
Connecting UI with Get Leaderboard Rankings Implementation
Open the
LeaderboardAllTimeWidget_Starter
class CPP file, navigate toGetRankings()
function, and replace the current code with the following. It will get the leaderboard rankings using theLeaderboardSubsystem_Starter
and then display it upon completion.void ULeaderboardAllTimeWidget_Starter::GetRankings()
{
FUniqueNetIdRepl PlayerNetId = GetOwningPlayer()->GetLocalPlayer()->GetPreferredUniqueNetId();
if (!PlayerNetId.IsValid())
{
return;
}
Ws_Leaderboard->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Loading);
LeaderboardSubsystem->GetRankings(
GetOwningPlayer(),
LeaderboardCode,
ResultLimit,
FOnGetLeaderboardRankingComplete::CreateWeakLambda(this, [this, PlayerNetId](bool bWasSuccessful, const TArray<ULeaderboardRank*> Rankings)
{
if (!bWasSuccessful)
{
Ws_Leaderboard->SetWidgetState(EAccelByteWarsWidgetSwitcherState::Empty);
return;
}
// Add rankings to the leaderboard ranking list.
Lv_Leaderboard->SetListItems(Rankings);
// Get the logged-in player's rank if it is not included in the leaderboard.
const TArray<ULeaderboardRank*> FilteredRank = Rankings.FilterByPredicate([PlayerNetId](const ULeaderboardRank* Temp) { return Temp && Temp->UserId == PlayerNetId; });
const ULeaderboardRank* PlayerRank = FilteredRank.IsEmpty() ? nullptr : FilteredRank[0];
if (!PlayerRank)
{
GetPlayerRanking();
}
// Display the rankings if it is not empty.
else
{
DisplayPlayerRank(PlayerRank);
Ws_Leaderboard->SetWidgetState(
Lv_Leaderboard->GetNumItems() <= 0 ?
EAccelByteWarsWidgetSwitcherState::Empty :
EAccelByteWarsWidgetSwitcherState::Not_Empty);
}
}
));
}Next, navigate to
GetPlayerRanking()
and replace the current code with the following code. It will only be called if the currently logged-in player is not included in the rankings retrieved by theGetRankings()
function.void ULeaderboardAllTimeWidget_Starter::GetPlayerRanking()
{
LeaderboardSubsystem->GetPlayerRanking(
GetOwningPlayer(),
LeaderboardCode,
FOnGetLeaderboardRankingComplete::CreateWeakLambda(this, [this](bool bWasSuccessful, const TArray<ULeaderboardRank*> Rankings)
{
// Get and display the logged-in player's rank.
DisplayPlayerRank((!bWasSuccessful || Rankings.IsEmpty()) ? nullptr : Rankings[0]);
// Display the rankings if it is not empty.
Ws_Leaderboard->SetWidgetState(
Lv_Leaderboard->GetNumItems() <= 0 ?
EAccelByteWarsWidgetSwitcherState::Empty :
EAccelByteWarsWidgetSwitcherState::Not_Empty);
}
));
}Congratulations! You have connected the widget to get and display the leaderboard.
Resources
The files used in this tutorial section are available in the Byte Wars GitHub repository.