perks/PerkHurtNextShotDamage.cs

A Perk class for a game, named Pain Packer. When the player is hit it temporarily increases next-shot damage by applying a multiplicative modifier to ShotDamageMult until the player shoots, and it updates a small display/highlight.

Networking
using System;
using Sandbox;

[Perk( Rarity.Epic, locked: true, alwaysOfferDebug: false )]
public class PerkHurtNextShotDamage : Perk
{
	private enum Mod { DamageMult, RechargeTime };

	private bool _isActive;

	static PerkHurtNextShotDamage()
	{
		Register<PerkHurtNextShotDamage>(
			name: "Pain Packer",
			imagePath: "textures/icons/vector/next_shot_damage.png",
			description: level => $"+{(int)GetValue( level, Mod.DamageMult, true )}% dmg for your\nnext shot when you take dmg\n(doesn't stack)",
			upgradeDescription: level => $"+{(int)GetValue( level - 1, Mod.DamageMult, true )}%→{(int)GetValue( level, Mod.DamageMult, true )}% dmg for your\nnext shot when you take dmg\n(doesn't stack)"
		);
	}

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

		ShouldUpdate = true;

		HighlightColor = new Color( 0.6f, 0.6f, 1f );
		HighlightDuration = 0.2f;
		HighlightOpacity = 1.5f;
	}

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

	}

	private static float GetValue( int level, Mod mod, bool isPercent = false )
	{
		switch ( mod )
		{
			case Mod.DamageMult:
			default:
				return isPercent
					? 10f + 30f * level
					: 1f + (0.10f + 0.30f * level);
		}
	}

	public override void OnHit( float amount, DamageType damageType, bool isSelfInflicted, Vector2 dir, float force, Enemy enemySource, EnemyType enemyType, float previousHealth )
	{
		base.OnHit( amount, damageType, isSelfInflicted, dir, force, enemySource, enemyType, previousHealth );

		//if ( damageType == DamageType.Self )
		//	return;

		if ( !_isActive )
			Highlight();

		Player.Modify( this, PlayerStat.ShotDamageMult, 2f, ModifierType.Mult );

		_isActive = true;

		//Player.Stats[PlayerStat.NextShotDamageMult] = GetValue( Level, Mod.DamageMult );
		DisplayText = $"+{GetValue( Level, Mod.DamageMult, true )}%";
	}

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

		DisplayText = " ";

		Player.StopModifying( this, PlayerStat.ShotDamageMult );

		_isActive = false;
	}
}