UI/PlayerHud.razor
@using Sandbox;
@using Sandbox.UI;
@using Sandbox.Network;
@inherits PanelComponent
@namespace Sandbox

<root>

	<div class="header">

		<div class="players">
		@foreach (var player in Connection.All)
		{
			<div class="player">
				@if( player.IsHost )
				{
					<div class="name">@player.DisplayName</div>
					<div class="score">@HostScore</div>
				}
				else
				{
					<div class="name">@player.DisplayName</div>
					<div class="score">@GuestScore</div>
				}
			</div>
		}
		@if ( Connection.All.Count < 2 )
		{
			<div class="player">
				<div class="name">#hud.bot</div>
				<div class="score">@GuestScore</div>
			</div>
		}
		</div>

	</div>
</root>

@code
{
	public Connection PlayerHost { get; set; } 
	public Connection PlayerGuest { get; set; } 
	[Property] GameObject gameManager;
	[Sync] public int HostScore {get; set;}
	[Sync] public int GuestScore {get; set;}

	protected override void OnEnabled()
	{
		gameManager = Scene.FindAllWithTag("GameManager")?.FirstOrDefault();

		PlayerHost = Connection.All.FirstOrDefault( p => p.IsHost );
		PlayerGuest = Connection.All.FirstOrDefault( p => !p.IsHost );
	}

	protected override void OnUpdate()
	{
		HostScore = gameManager.GetComponent<GameManager>().HostScore;
		GuestScore = gameManager.GetComponent<GameManager>().GuestScore;
	}

	/// <summary>
	/// the hash determines if the system should be rebuilt. If it changes, it will be rebuilt
	/// </summary>
	protected override int BuildHash() => System.HashCode.Combine( 
		PlayerHost, 
		PlayerGuest, 
		HostScore, 
		GuestScore
		);
}