UI/Hud.razor
@using Sandbox;
@using Sandbox.UI;
@inherits PanelComponent
@implements ILocalPlayerEvent

<root>

    <div class="vitals">
        <div class="health">@HealthValue()</div>
    </div>

</root>

@code
{
    public int HealthValue()
    {
        var p = Player.FindLocalPlayer();
        if (p is null) return 0;
        return p.Health.FloorToInt();
    }

    protected override int BuildHash() => HashCode.Combine( HealthValue() );

    void ILocalPlayerEvent.OnJump()
    {
        Panel.FlashClass("jump", 0.1f);
    }

    void ILocalPlayerEvent.OnLand(float distance, Vector3 velocity)
    {
        if (distance < 32) return;

        Panel.FlashClass("land", 0.1f);
    }

    void ILocalPlayerEvent.OnTakeDamage(float damage)
    {
        Panel.FlashClass( "damage", 0.1f );
    }

    protected override void OnUpdate()
    {
        base.OnUpdate();

        var player = Player.FindLocalPlayer();
        Panel.SetClass("is-dead", player is null);
        Panel.SetClass("is-dying", (player?.Health ?? 0 ) < 40.0f );
        Panel.SetClass("is-almost-dead", (player?.Health ?? 0 ) < 11.0f );
    }
}