public Vector3 AkaQPosition()
{
#region Variables
var positions = GetRotatedQPositions();
var enemyPositions = GetEnemyPoints();
var safePositions = positions.Where(pos => !enemyPositions.Contains(pos.To2D()));
var BestPosition = Variables._Player.ServerPosition.Extend(Game.CursorPos, 300f);
var AverageDistanceWeight = .60f;
var ClosestDistanceWeight = .40f;
var bestWeightedAvg = 0f;
var enemiesNear =
EntityManager.Heroes.Enemies.Where(
m => m.IsValidTarget(Variables._Player.GetAutoAttackRange(m) + 300f + 65f));
var highHealthEnemiesNear =
EntityManager.Heroes.Enemies.Where(m => !m.IsMelee && m.IsValidTarget(1300f) && m.HealthPercent > 7)
;
var closeNonMeleeEnemy = GetClosestEnemy((Vector3)Variables._Player.ServerPosition.Extend(Game.CursorPos, 300f));
#endregion
if (Variables._Player.CountEnemiesInRange(1500f) <= 1)
{
//Logic for 1 enemy near
var position = (Vector3)Variables._Player.ServerPosition.Extend(Game.CursorPos, 300f);
return IsSafeCheck(position) ? position : Vector3.Zero;
}
if (
enemiesNear.Any(
t =>
t.Health + 15 <
ObjectManager.Player.GetAutoAttackDamage(t) * 2 + Variables._Player.GetSpellDamage(t, SpellSlot.Q)
&& t.Distance(ObjectManager.Player) < Variables._Player.GetAutoAttackRange(t) + 80f))
{
var QPosition =
ObjectManager.Player.ServerPosition.Extend(
enemiesNear.OrderBy(t => t.Health).First().ServerPosition, 300f);
if (!Variables.UnderEnemyTower(QPosition))
{
return (Vector3)QPosition;
}
}
if (enemiesNear.Count() <= 2)
{
if (
enemiesNear.Any(
t =>
t.Health + 15 <
Variables._Player.GetAutoAttackDamage(t) +
Variables._Player.GetSpellDamage(t, SpellSlot.Q)
&& t.Distance(Variables._Player) < Variables._Player.GetAutoAttackRange(t) + 80f))
{
var QPosition =
Variables._Player.ServerPosition.Extend(
highHealthEnemiesNear.OrderBy(t => t.Health).FirstOrDefault().ServerPosition, 300f);
if (!Variables.UnderEnemyTower(QPosition))
{
return (Vector3)QPosition;
}
}
}
if (closeNonMeleeEnemy != null
&& Variables._Player.Distance(closeNonMeleeEnemy) <= closeNonMeleeEnemy.AttackRange - 85
&& !closeNonMeleeEnemy.IsMelee)
{
return IsSafeCheck(((Vector3)Variables._Player.ServerPosition.Extend(Game.CursorPos, 300f)))
? Variables._Player.ServerPosition.Extend(Game.CursorPos, 300f).To3D()
: Vector3.Zero;
}
foreach (var position in safePositions)
{
var enemy = GetClosestEnemy(position);
if (!enemy.IsValidTarget())
{
continue;
}
var avgDist = GetAvgDistance(position);
if (avgDist > -1)
{
var closestDist = Variables._Player.ServerPosition.Distance(enemy.ServerPosition);
var weightedAvg = closestDist * ClosestDistanceWeight + avgDist * AverageDistanceWeight;
if (weightedAvg > bestWeightedAvg && IsSafeCheck(position))
{
bestWeightedAvg = weightedAvg;
BestPosition = position.To2D();
}
}
}
var endPosition = (IsSafeCheck(BestPosition.To3D())) ? BestPosition.To3D() : Vector3.Zero;
if (endPosition == Vector3.Zero)
{
//Try to find another suitable position. This usually means we are already near too much enemies turrets so just gtfo and tumble
//to the closest ally ordered by most health.
var alliesClose =
EntityManager.Heroes.Allies.Where(ally => !ally.IsMe && ally.IsValidTarget(1500, false));
if (alliesClose.Any() && enemiesNear.Any())
{
var closestMostHealth =
alliesClose.OrderBy(m => m.Distance(Variables._Player))
.ThenByDescending(m => m.Health)
.FirstOrDefault();
if (closestMostHealth != null
&&
closestMostHealth.Distance(
enemiesNear.OrderBy(m => m.Distance(Variables._Player)).FirstOrDefault())
>
Variables._Player.Distance(
enemiesNear.OrderBy(m => m.Distance(Variables._Player)).FirstOrDefault()))
{
var tempPosition = (Vector3)Variables._Player.ServerPosition.Extend(closestMostHealth.ServerPosition,
300f);
if (IsSafeCheck(tempPosition))
{
endPosition = tempPosition;
}
}
}
}
if (endPosition == Vector3.Zero)
{
var mousePosition = Variables._Player.ServerPosition.Extend(Game.CursorPos, 300f);
if (IsSafeCheck(mousePosition.To3D()))
{
endPosition = mousePosition.To3D();
}
}
return endPosition;
}