UI/NameTags/PlayerNameTag.razor
@using Sandbox.UI
@inherits PanelComponent

<root>
    @if ( _visible )
    {
        <img class="target" src="ui/crosshair/target.png" />
        <label class="name">@_name</label>
    }
</root>

<style>
    PlayerNameTag {
        width: 100%;
        height: 100%;
        display: flex;
        flex-direction: column;
        align-items: center;
        justify-content: center;
        pointer-events: none;
    }

    .target {
        width: 1024px;
        height: 1024px;
        background-tint: #ff4444;
    }

    .name {
        font-family: "AzeretMono-Medium";
        font-size: 64px;
        color: white;
        text-shadow: 3px 3px 6px black;
        white-space: nowrap;
    }
</style>

@code
{
    private string _name = "";
    private bool _visible = false;

    protected override void OnUpdate()
    {
        var pawn = GameObject.Parent?.Components.Get<PlayerPawn>();
        if ( pawn == null ) return;

        _visible = pawn != LocalPlayer.Pawn && pawn.IsAlive;
        _name = pawn.IsBot ? (pawn.BotName.Length > 0 ? pawn.BotName : "Bot") : (pawn.Network.Owner?.DisplayName ?? pawn.GameObject.Name);
    }

    protected override int BuildHash() => HashCode.Combine( _name, _visible, Time.Now );
}