sasalka/Code/UI/Scoreboard.razor
2025-06-10 02:09:21 +03:00

107 lines
2.4 KiB
Plaintext

@using Sandbox;
@using Sandbox.UI;
@inherits PanelComponent
<root class="@( Visible ? "" : "hidden" )">
@* <div class="decoration top-left"></div> *@
@* <div class="decoration top-right"></div> *@
@* <div class="decoration bottom-left"></div> *@
@* <div class="decoration bottom-right"></div> *@
<label class="title">Players</label>
<div class="content">
<div class="header">
<label class="column nick">Player</label>
<label class="column status">Status</label>
<label class="column ping">Ping</label>
</div>
<div class="player-list">
@if ( Dedugan.All is not null )
{
foreach ( var ded in Dedugan.All )
{
<div class="player" onclick="@( () => OpenProfile( ded.Connection ) )">
<div class="avatar">
<img src="avatar:@ded.SteamID"/>
</div>
<label class="column nick">@ded.Connection.DisplayName</label>
<label class="column status">@GetPlayerStatus( ded.Connection )</label>
<label class="column ping">@ded.Connection.Ping</label>
</div>
}
}
</div>
</div>
</root>
@code
{
public static bool Visible = false;
private NetworkManager _networkManager;
private NetworkManager NetworkManager
{
get
{
if ( _networkManager == null || !_networkManager.IsValid )
{
_networkManager = Scene.Directory.FindByName( "Network Manager" )
.FirstOrDefault()?
.GetComponent<NetworkManager>();
}
return _networkManager;
}
}
protected override void OnUpdate()
{
if ( Input.Pressed( "Score" ) )
{
Visible = !Visible;
}
}
protected override void OnEnabled()
{
// Кэшируем NetworkManager при включении компонента
_networkManager = Scene.Directory.FindByName( "Network Manager" )
.FirstOrDefault()?
.GetComponent<NetworkManager>();
}
private string GetPlayerStatus( Connection conn )
{
var playerObj = Dedugan.GetByID( conn.Id ).GameObject;
return playerObj?.IsValid == true ? "In Game" : "Connecting";
}
private void OpenProfile( Connection connection )
{
Log.Info( $"Opening profile: {connection.SteamId}" );
Game.Overlay.ShowPlayer( connection.SteamId );
}
protected override int BuildHash()
{
base.BuildHash();
if ( !Visible || Dedugan.All == null )
return -1;
var hash = new System.HashCode();
hash.Add( Visible );
foreach ( var ded in Dedugan.All )
{
hash.Add( ded.Id );
hash.Add( ded.Connection.Ping );
hash.Add( ded.Name );
}
return hash.ToHashCode();
}
}