gems/GemMagnet.cs

A Gem subclass that grants the player a repeated perk on run start. It defines item id, descriptions for UI, and in OnRunStart adds PerkXpAttractRange to the player Level times, then posts a local chat message reporting the granted perk.

Reflection
using Sandbox;

public class GemMagnet : Gem
{
	public const string ItemId = "gem_magnet";

	public static string Description( int level ) => $"Start with {Perk.GetRichTextNameToken( typeof( PerkXpAttractRange ) )} {Perk.GetRichTextToken( nameof( PerkXpAttractRange ), level )} Lvl {level}";
	public static string UpgradeDescription( int level ) => $"Start with {Perk.GetRichTextNameToken( typeof( PerkXpAttractRange ) )} {Perk.GetRichTextToken( nameof( PerkXpAttractRange ), level )} Lvl [+]{level - 1}[/+]→Lvl [+]{level}[/+]";

	public override void OnRunStart()
	{
		var perkType = TypeLibrary.GetType<PerkXpAttractRange>();
		for ( int i = 0; i < Level; i++ )
			Player.AddPerk( perkType );

		Manager.Instance.Chat.AddLocalChatMessage( $"Got {Perk.GetRichTextNameToken( typeof( PerkXpAttractRange ) )} {Perk.GetRichTextToken( nameof( PerkXpAttractRange ), Level )} Lvl {Level}", from: "" );
	}
}