perks/PerkHandouts.cs

A rare perk class 'PerkHandouts' that, when leveled, grants two random perk types to the player over time. It queues the perks, sends a local chat message, and spawns each perk item with a slight delay using Player.GivePerkItem.

NetworkingFile Access
using System;
using Sandbox;

[Perk( Rarity.Rare, alwaysOfferDebug: false )]
public class PerkHandouts : Perk
{
	private TimeSince _timeSincePerk;
	private List<TypeDescription> _perkTypes = new();

	public override float ImportanceMultiplier => 0.25f;

	static PerkHandouts()
	{
		Register<PerkHandouts>(
			name: "Grab Bag",
			imagePath: "textures/icons/vector/handouts.png",
			description: level => $"+2 random perks",
			upgradeDescription: level => $"+2 random perks"
		);
	}

	public override void Start()
	{
		base.Start();
	}

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

		ShouldUpdate = true;
		_timeSincePerk = 0f;

		List<TypeDescription> newPerks = new();
		for ( int i = 0; i < 2; i++ )
			newPerks.Add( Player.GetRandomPerkType( isReward: true ) );

		var perkTokens = "";
		foreach ( var p in newPerks ) perkTokens += $" {Perk.GetRichTextToken( p )}";
		Manager.Instance.Chat.AddLocalChatMessage( $"{Perk.GetRichTextToken( GetType() )} Got 2 random perks:{perkTokens}", from: "" );

		_perkTypes.AddRange( newPerks );
	}

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

	}

	public override void Update( float dt )
	{
		base.Update( dt );

		if ( _perkTypes.Count > 0 && _timeSincePerk > 0.33f )
		{
			Player.GivePerkItem( _perkTypes[0], dir: Utils.GetRandomVectorInCone( -Player.FacingDir ) );

			_perkTypes.RemoveAt( 0 );

			if ( _perkTypes.Count <= 0 )
				ShouldUpdate = false;

			_timeSincePerk = 0f;
		}
	}
}