public static 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 position.IsSafeCheck() ? 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 ((Vector3)Variables._Player.ServerPosition.Extend(Game.CursorPos, 300f)).IsSafeCheck()
? 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 && position.IsSafeCheck())
{
bestWeightedAvg = weightedAvg;
BestPosition = position.To2D();
}
}
}
var endPosition = (BestPosition.To3D().IsSafeCheck()) ? 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 (tempPosition.IsSafeCheck())
{
endPosition = tempPosition;
}
}
}
}
if (endPosition == Vector3.Zero)
{
var mousePosition = Variables._Player.ServerPosition.Extend(Game.CursorPos, 300f);
if (mousePosition.To3D().IsSafeCheck())
{
endPosition = mousePosition.To3D();
}
}
return endPosition;
}