perks/PerkDodgeAoe.cs

A common perk called Counterattack that triggers when the player dodges. It calculates an AOE damage percentage based on perk level, adds a dodge-AOE damage percent modifier to the player stats on Refresh, and on dodge spawns a visual ring and damages nearby enemies.

NetworkingFile Access
using System;
using Sandbox;

[Perk( Rarity.Common, includedAtStart: false, alwaysOfferDebug: false, IncludedCategories = new[] { PerkCategory.Aoe })]
public class PerkDodgeAoe : Perk
{
	private const float DAMAGE_RADIUS = 90f;

	private enum Mod { DamagePercent };


	static PerkDodgeAoe()
	{
		Register<PerkDodgeAoe>(
			name: "Counterattack",
			imagePath: "textures/icons/vector/dodge_aoe.png",
			description: level => $"Do {(int)GetValue( level, Mod.DamagePercent, true )}% of dodged dmg\nto nearby enemies",
			upgradeDescription: level => $"Do {(int)GetValue( level - 1, Mod.DamagePercent, true )}%→{(int)GetValue( level, Mod.DamagePercent, true )}% of dodged dmg\nto nearby enemies"
		);
	}

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

	}

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

		Player.Modify( this, PlayerStat.DodgeAoeDamagePercent, GetValue( Level, Mod.DamagePercent ), ModifierType.Add );
	}

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

	public override void OnDodged( float damage, DamageType damageType, Vector2 dir, Enemy enemySource )
	{
		base.OnDodged( damage, damageType, dir, enemySource );

		Vector2 pos = Player.Position2D;
		float dmg = damage * GetValue( Level, Mod.DamagePercent );
		float radius = DAMAGE_RADIUS * Player.Stats[PlayerStat.RadiusMultiplier];

		Manager.Instance.SpawnRingRpc( pos, radius, new Color( 1f, 1f, 1f, 0.2f ), lifetime: Game.Random.Float( 0.15f, 0.2f ), path: "ring_spiky_2" );

		Manager.Instance.DamageNearbyEnemies( Player.Position2D, radius, dmg, force: dmg * 0.5f, DamageType.Aoe, Player );
	}
}