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.
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;
}
}
}