UI/InventorySlot.razor

A Blazor-style Razor UI panel for an inventory slot. It lists weapons from a PlayerInventory that match this slot index, renders a label with the slot number, and creates InventoryWeapon child components for each weapon. It tracks Active and Hovered carryables and sets an "active" CSS class during Tick.

File Access
@using Sandbox;
@using Sandbox.UI;
@inherits Panel

@if ( GetWeapons().Count() < 1 )
{
    return;
}

<root>
    <div class="index">
        <label>@(Index+1)</label>
    </div>

    <div class="list">
    @foreach ( var weapon in GetWeapons() )
    {
        <InventoryWeapon Carryable="@weapon" [email protected]() IsHovered="@(weapon == Hovered)" />
    }
    </div>

</root>

@code
{
    public PlayerInventory Inventory { get; set; }
    public Carryable Active { get; set; }
    public Carryable Hovered { get; set; }

    public int Index { get; set; }

    IEnumerable<Carryable> GetWeapons()
    {
        if (!Inventory.IsValid()) return Enumerable.Empty<Carryable>();

        return Inventory.Carryables.Where(x => x.PreferredSlot == Index).OrderBy(x => x.SlotOrder);
    }

    public override void Tick()
    {
        base.Tick();

        SetClass("active", Hovered?.PreferredSlot == Index || Active?.PreferredSlot == Index);
    }

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

}