public override Action <ProceduralSpell, Player, Vector2, Vector2, Entity> GetCastAction() { return(delegate(ProceduralSpell spell, Player player, Vector2 origin, Vector2 target, Entity caster) { if (caster is Player) { PlayerCharacter character = ((Player)caster).GetModPlayer <PlayerCharacter>(); foreach (ProceduralSpellProj proj in character.circlingProtection) { if (proj.projectile.modProjectile is ProceduralSpellProj) { proj.projectile.Kill(); } } character.circlingProtection.Clear(); } else if (caster is Projectile) { ProceduralMinion minion = (ProceduralMinion)((Projectile)caster).modProjectile; foreach (ProceduralSpellProj proj in minion.circlingProtection) { if (proj.projectile.modProjectile is ProceduralSpellProj) { proj.projectile.Kill(); } } minion.circlingProtection.Clear(); } float spread = GetSpread(spell.projCount); Vector2 velocity = new Vector2(0f, -1.5f); for (int i = 0; i < spell.projCount; i += 1) { ProceduralSpellProj proj = spell.CreateProjectile(player, Vector2.Zero, spread * i, origin, caster); proj.projectile.timeLeft = RotTimeLeft; proj.displacementVelocity = velocity.RotatedBy(i * spread * API.Tau); proj.displacementAngle = i * spread * (float)API.Tau; if (caster is Player) { player.GetModPlayer <PlayerCharacter>().circlingProtection.Add(proj); } else if (caster is Projectile) { ((ProceduralMinion)((Projectile)caster).modProjectile).circlingProtection.Add(proj); } } }); }