A Razor UI panel listing s&box platform achievements from PlatformAchievementRules.All, showing icon, localized title and description, and one of three states: unlocked in s&box, requirement met, or not earned yet. Rebuilds its hash when the game's PlatformAchievementRevision or the Russian language preference changes.
@using Sandbox
@using Sandbox.UI
@using Socer
@using System
@inherits Panel
<root class="platform-achievements localized-text">
<label class="platform-title">@T("Достижения s&box","s&box achievements")</label>
<label class="platform-help">@T("Достижения сохраняются в профиле s&box. Награды клуба и сезонных заданий забираются отдельно.","Achievements belong to your s&box profile. Claim club and seasonal rewards separately.")</label>
<div class="platform-grid">
@foreach(var achievement in PlatformAchievementRules.All)
{
bool confirmed=Game?.ConfirmedPlatformAchievement(achievement.Id)==true;
bool earned=Game?.EarnedPlatformAchievement(achievement.Id)==true;
<div class="platform-achievement @(confirmed?"confirmed":earned?"earned":"locked")">
<img src="@($"/ui-icons/achievements/{achievement.Id}.png")" />
<div><label>@(GamePreferences.Russian?achievement.RussianTitle:achievement.EnglishTitle)</label><span>@(GamePreferences.Russian?achievement.RussianDescription:achievement.EnglishDescription)</span><small>@(confirmed?T("Получено в s&box","Unlocked in s&box"):earned?T("Условие выполнено","Requirement met"):T("Ещё не выполнено","Not earned yet"))</small></div>
</div>
}
</div>
</root>
@code {
[Parameter] public MatchController Game {get;set;}
static string T(string ru,string en)=>GamePreferences.Russian?ru:en;
protected override int BuildHash()=>HashCode.Combine(Game?.PlatformAchievementRevision,GamePreferences.Russian);
}