status/XpHealStatus.cs
using System;
using System.Collections.Generic;
using System.Linq;
using Sandbox;
using static Sandbox.VertexLayout;

[Status(7, 0, 1f, 0, false )]
public class XpHealStatus : Status
{
	public XpHealStatus()
    {
		Title = "XP Recovery";
		IconPath = "textures/icons/xp_heal.png";
	}

	public override void Init(Player player)
	{
		base.Init(player);
	}

	public override void Refresh()
    {
		Description = GetDescription(Level);
    }

	public override string GetDescription(int newLevel)
	{
		return string.Format("When you gain XP, heal for {0}% of the amount", GetPercentForLevel(Level));
	}

	public override string GetUpgradeDescription(int newLevel)
	{
		return newLevel > 1 ? string.Format( "When you gain XP, heal for {0}%→{1}% of the amount", GetPercentForLevel( newLevel - 1), GetPercentForLevel( newLevel)) : GetDescription(newLevel);
	}

    public override void OnGainExperience(int xp)
    {
		float amount = xp * GetAmountForLevel( Level );
		
		if( Player.Health < Player.Stats[PlayerStat.MaxHp] )
			Player.TimeSinceChangeHP = 0f;

		Player.RegenHealth( amount );
	}

	public float GetAmountForLevel(int level)
	{
		return 0.15f + level * 0.20f + (level == 7 ? 0.2f : 0f);
	}

	public float GetPercentForLevel( int level )
	{
		return 15f + level * 20f + (level == 7 ? 20f : 0f);
	}

	//public string GetPrintAmountForLevel(int level)
 //   {
 //       return string.Format("{0:0.0}", GetAmountForLevel(level));
 //   }
}