ui/LeaderboardPlayerIcon.razor

A UI component (Razor) that renders a leaderboard player icon with avatar, optional level badge and victory/defeat marker. It handles click to request showing the player's profile and mouse hover to set a hovered name on a Manager singleton.

Networking
@namespace Sandbox
@using Sandbox;
@using Sandbox.UI;
@using System;
@inherits Panel
@attribute [StyleSheet("LeaderboardPlayerIcon.razor.scss")]

<root class="@(IsSmall ? "small" : "")">
	<div class="icon" style="background-image: url( avatar:@PlayerInfo.steamId )">
	</div>

	@if(PlayerInfo.level >= 0)
	{
		<div class="playerlevel">@(PlayerInfo.level)</div>
	}

	@if(Icon == LeaderboardIconType.Victory)
	{
		<div class="crown"></div>
	}
	else if(Icon == LeaderboardIconType.Defeat)
	{
		<div class="skull"></div>
	}
</root>

@code
{
	public PlayerInfo PlayerInfo { get; set; }
	public bool ShowTooltip { get; set; }
	public bool IsSmall { get; set; }

	public enum LeaderboardIconType { None, Victory, Defeat }
	public LeaderboardIconType Icon { get; set; }

	protected override void OnClick(MousePanelEvent e)
	{
		base.OnClick(e);

		ShowPlayerProfile(PlayerInfo.displayName, PlayerInfo.steamId);

		e.StopPropagation();
	}

	protected override void OnMouseOver(MousePanelEvent e)
	{
		if(e.Target != this)
			return;

		if(ShowTooltip)
			Manager.Instance.LobbyHoveredPlayerName = PlayerInfo.displayName;
	}

	protected override void OnMouseOut(MousePanelEvent e)
	{
		Manager.Instance.LobbyHoveredPlayerName = null;
	}

	protected override int BuildHash()
	{
		return HashCode.Combine(
			PlayerInfo.displayName,
			PlayerInfo.steamId,
			PlayerInfo.level
		);
	}

	void ShowPlayerProfile(string displayName, long steamId)
	{
		Manager.Instance.LobbyHoveredPlayerName = null;
		Manager.Instance.PlayerProfileToShow = new PlayerInfo(displayName, steamId);
	}
}