A Razor UI panel that renders a perk icon in rich text. It parses a perk tag (optionally with :level), looks up the perk TypeDescription, displays its rarity tint and image, and updates a shared Manager with hover state.
@namespace Sandbox
@using Sandbox;
@using Sandbox.UI;
@using System;
@inherits Panel
@implements IRichTextPanel
@attribute [RichTextPanel( @"\[perk:([\w]+(?::\d+)?)\]" )]
<root class="richtext-perk-icon">
@if ( _perkType != null )
{
var attrib = _perkType.GetAttribute<PerkAttribute>();
var rarity = attrib.Rarity;
var curse = attrib.Curse;
var highlightColor = PerkManager.GetCardRarityColor( rarity, curse, alpha: 0.7f );
var rarityBgTint = PerkManager.GetCardRarityColor( rarity, curse );
<div class="rarity" style="background-color: @highlightColor.Rgba; background-image-tint:@rarityBgTint.Rgba;">
<div class="image" style="background-image: url( @Perk.GetImagePath( _perkType.TargetType ) )"></div>
</div>
}
</root>
<style>
.richtext-perk-icon {
position: relative;
width: 24px;
height: 24px;
flex-shrink: 0;
pointer-events: all;
cursor: default;
.rarity {
position: relative;
width: 100%;
height: 100%;
background-size: cover;
background-image: url(textures/ui/gradient/gradient.png);
}
.image {
position: relative;
width: 100%;
height: 100%;
background-position: center;
background-size: cover;
}
}
</style>
@code
{
TypeDescription _perkType;
int _hoverLevel = 1;
public float? ImageSize { get; set; }
public void ParseRichText( string text )
{
_hoverLevel = 1;
var perkName = text;
if ( !string.IsNullOrWhiteSpace( text ) )
{
var splitIndex = text.LastIndexOf( ':' );
if ( splitIndex > 0 && splitIndex < text.Length - 1 )
{
var levelText = text[(splitIndex + 1)..];
if ( int.TryParse( levelText, out var parsedLevel ) )
{
_hoverLevel = parsedLevel;
perkName = text[..splitIndex];
}
}
}
if ( _hoverLevel <= 0 )
_hoverLevel = 1;
_perkType = TypeLibrary.GetType( perkName );
}
protected override void OnMouseOver( MousePanelEvent e )
{
if ( _perkType == null )
return;
Manager.Instance.HoveredPerkType = _perkType;
Manager.Instance.HoveredPerkPanel = this;
Manager.Instance.HoveredPerkLevel = _hoverLevel;
Manager.Instance.IsHoveredPerkAChoice = false;
Manager.Instance.IsHoveredPerkBanished = false;
Manager.Instance.IsHoveredPerkHidden = false;
Manager.Instance.HoveredPlayer = null;
Manager.Instance.HoveredPlayerIcon = null;
}
protected override void OnMouseOut( MousePanelEvent e )
{
if ( Manager.Instance.HoveredPerkPanel != this ) return;
Manager.Instance.HoveredPerkType = null;
Manager.Instance.HoveredPerkPanel = null;
Manager.Instance.IsHoveredPerkBanished = false;
Manager.Instance.IsHoveredPerkHidden = false;
}
public override void OnDeleted()
{
base.OnDeleted();
if ( Manager.Instance.HoveredPerkPanel != this ) return;
Manager.Instance.HoveredPerkType = null;
Manager.Instance.HoveredPerkPanel = null;
Manager.Instance.IsHoveredPerkBanished = false;
Manager.Instance.IsHoveredPerkHidden = false;
}
protected override int BuildHash()
{
return HashCode.Combine( _perkType, _hoverLevel );
}
}