UI/GameUI.razor
@using Sandbox;
@using Sandbox.UI;
@inherits PanelComponent
@namespace CryptidHunt

<root>
    <div class="ItemPrompt" style="display: @(Interactable.IsValid() && Interactable.Active ? "flex" : "none")">
        <div class="itemContainer" style="left:@(ItemPromptPosition.x)px; top:@(ItemPromptPosition.y)px">
            <div class="image" style="background-image: url(@((Interactable?.Locked ?? false) ? "ui/lock.png" : "ui/hand.png"))"></div>
            <div class="promptContainer">
                <div class="prompt">@Interactable?.InteractDescription</div>
            </div>
        </div>
    </div>
</root>

@code
{
    public static GameUI Instance { get; private set; }
    public Interactable Interactable { get; set; }
    public Vector2 ItemPromptPosition { get; set; } = new Vector2(0, 0);

    protected override void OnStart()
    {
        base.OnStart();
        Instance = this;
    }

    protected override void OnUpdate()
    {
        base.OnUpdate();
        Interactable = Player.Instance?.InteractingWith;

        if (Interactable.IsValid() && Interactable.Active)
            ItemPromptPosition = (Scene.Camera.PointToScreenPixels(Interactable.WorldTransform.PointToWorld(Interactable.PromptOffset3D)) + Interactable.PromptOffset2D) * Panel.ScaleFromScreen;
    }

    public static void OpenNote( string text, bool handprint = false )
    {
        var note = Instance.Panel.AddChild<Note>();
        note.Text = text;
        note.Handprint = handprint;
    }

    public static void CloseNote()
    {
        foreach (var note in Instance.Panel.Children.OfType<Note>())
            note?.Delete();
    }

    public static void OpenZoneHint(string text, float lifeSpan = 5f)
    {
        var zoneHint = Instance.Panel.AddChild<ZoneHint>();
        zoneHint.Text = text;
        zoneHint.LifeSpan = lifeSpan;
    }

    public static void BlackScreen(float lifeSpan = 5f)
    {
        var blackScreen = Instance.Panel.AddChild<BlackScreen>();
        blackScreen.LifeSpan = lifeSpan;
    }

    public static void OpenInputHint(string text, string input = "attack1", float lifeSpan = 5f)
    {
        var inputHint = Instance.Panel.AddChild<InputHint>();
        inputHint.Text = text;
        inputHint.ButtonHint = input;
        inputHint.LifeSpan = lifeSpan;
    }

    protected override int BuildHash() => System.HashCode.Combine( Time.Now );

    [ConCmd("input")]
    public static void OpenInputHintDebug( string text )
    {
        OpenInputHint( text );

    }
}