ConcurrentBag <UnitCalculation> GetTargettedAttacks(UnitCalculation unitCalculation) { var attacks = new ConcurrentBag <UnitCalculation>(); Parallel.ForEach(unitCalculation.EnemiesInRangeOf, (enemyAttack) => { if (DamageService.CanDamage(enemyAttack, unitCalculation) && CollisionCalculator.Collides(unitCalculation.Position, unitCalculation.Unit.Radius, enemyAttack.Start, enemyAttack.End)) { attacks.Add(enemyAttack); } }); return(attacks); }
protected override UnitCalculation GetBestDpsReduction(UnitCommander commander, Weapon weapon, IEnumerable <UnitCalculation> primaryTargets, IEnumerable <UnitCalculation> secondaryTargets) { float splashRadius = 0.3f; var dpsReductions = new Dictionary <ulong, float>(); foreach (var enemyAttack in primaryTargets) { float dpsReduction = 0; var attackLine = GetAttackLine(commander.UnitCalculation.Unit.Pos, enemyAttack.Unit.Pos); foreach (var splashedEnemy in secondaryTargets) { if (CollisionCalculator.Collides(splashedEnemy.Position, splashedEnemy.Unit.Radius + splashRadius, attackLine.Start, attackLine.End)) { dpsReduction += splashedEnemy.Dps / TimeToKill(weapon, splashedEnemy.Unit, SharkyUnitData.UnitData[(UnitTypes)splashedEnemy.Unit.UnitType]); } } dpsReductions[enemyAttack.Unit.Tag] = dpsReduction; } var best = dpsReductions.OrderByDescending(x => x.Value).FirstOrDefault().Key; return(primaryTargets.FirstOrDefault(t => t.Unit.Tag == best)); }