ui/LeaderboardPanel.razor
@using Sandbox;
@using Sandbox.UI;
@inherits Panel
@attribute [StyleSheet("LeaderboardPanel.razor.scss")]
<root>
@if(Leaderboard is null) return;
@* <div class="upper"> *@
@* <label class="header">Leaderboard</label> *@
@if(Leaderboard.Entries.Count() > 0)
{
var offset = 0;
var rowNum = 0;
<div class="entries">
@foreach(var entry in Leaderboard.Entries)
{
@if(entry.Value <= 1f)
{
offset++;
continue;
}
float scorePerLevel = 1000000f;
int levelsBeat = 10 - MathX.FloorToInt((float)entry.Value / scorePerLevel);
float runTime = (float)entry.Value - (MathX.FloorToInt((float)entry.Value / scorePerLevel) * scorePerLevel);
TimeSpan time = TimeSpan.FromSeconds(runTime);
string timeString = time.TotalSeconds > 3600 ? time.ToString(@"hh\:mm\:ss") : time.ToString(@"mm\:ss");
string lvlString = levelsBeat == 10 ? "Victory" : $"Beat {levelsBeat}/10 Levels";
string valueStr = $"{lvlString} in {timeString}";
var nameStr = entry.DisplayName.Length > 32 ? $"{entry.DisplayName.Truncate(32)}..." : entry.DisplayName;
<div class="entry @(rowNum % 2 == 0 ? "even_row" : "odd_row")">
<label class="rank">##@(entry.Rank - offset)</label>
<label class="name">@nameStr</label>
<label class="@(levelsBeat == 10 ? "value_victory" : "value")">@valueStr</label>
</div>
rowNum++;
}
</div>
}
@* </div> *@
<div class="button" style="margin-top: 20px;" onmouseover=@(() => OnMouseOverButton() ) onclick=@(() => BackButtonClicked() )>
<div class="button_icon" style="background-image:url(@($"textures/ui_x_border.png"));"></div>
<div class="button_text">Back</div>
</div>
</root>
@code
{
Sandbox.Services.Leaderboards.Board2 Leaderboard;
protected override void OnAfterTreeRender(bool firstTime)
{
base.OnAfterTreeRender(firstTime);
if(firstTime)
{
Leaderboard = Sandbox.Services.Leaderboards.GetFromStat("facepunch.memory", "total_score");
Refresh();
}
}
async void Refresh()
{
Leaderboard.SetAggregationMin(); // select the lowest value from each player
Leaderboard.SetSortAscending(); // order by the lowest value first
Leaderboard.CenterOnMe(); // offset so I'm in the middle of the results
Leaderboard.MaxEntries = 500;
await Leaderboard.Refresh();
// foreach(var entry in Leaderboard.Entries)
// {
// Log.Info($"{entry.Rank} - {entry.DisplayName} - {entry.Value} [{entry.Timestamp}]");
// }
StateHasChanged();
}
public void BackButtonClicked()
{
Manager.Instance.PlaySfx("click_0");
Manager.Instance.IsLeaderboardOpen = false;
}
void OnMouseOverButton()
{
Manager.Instance.PlaySfx("click_1");
}
}