A legendary perk class 'PerkHandoutsRemove' that removes one random existing perk from the player when leveled up, then queues and dispenses three random reward perks over time as perk items with chat messages. It manages a list of perk TypeDescription entries and times their delivery in Update.
using System;
using Sandbox;
[Perk( Rarity.Legendary, includedAtStart: false, locked: true, alwaysOfferDebug: false )]
public class PerkHandoutsRemove : Perk
{
private List<TypeDescription> _perkTypes = new();
private TimeSince _timeSincePerk;
public override float ImportanceMultiplier => 0.75f;
static PerkHandoutsRemove()
{
Register<PerkHandoutsRemove>(
name: "Booster Pack",
imagePath: "textures/icons/vector/handouts_remove.png",
description: level => $"Remove a random perk\n+3 random perks",
upgradeDescription: level => $"Remove a random perk\n+3 random perks"
);
}
public override void Start()
{
base.Start();
}
public override void IncreaseLevel()
{
base.IncreaseLevel();
var type = Player.GetRandomExistingPerkType( ignoreType: this.GetType() );
if ( type == null )
return;
Player.RemovePerk( type );
Manager.Instance.Chat.AddLocalChatMessage( $"{Perk.GetRichTextToken( GetType() )} Removed perk: {Perk.GetRichTextToken( type )}", from: "" );
List<TypeDescription> newPerks = new();
for ( int i = 0; i < 3; 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 3 random perks:{perkTokens}", from: "" );
_perkTypes.AddRange( newPerks );
ShouldUpdate = true;
_timeSincePerk = 0f;
}
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;
}
}
}