/// <summary> /// Gets if the position is safe or not /// </summary> /// <param name="vec">Vector3 position</param> /// <returns><c>True</c> if position is safe</returns> public static bool IsPositionSafe(this Vector3 vec) { var player = Player.Instance; var enemy = EntityManager.Heroes.Enemies.Where(index => index.IsValidTarget(1500)); var allies = player.ServerPosition.CountAlliesInRange(1500); var enemies = player.ServerPosition.CountEnemiesInRange(1500); var meeles = CountMeelesInRange(1500); var ignoreallchecks = Config.TumbleMenu.IgnoreAllChecks; var dangerouspells = Config.TumbleMenu.DangerousSpells; var dangerlevel = Program.DangerLevel; var vector = vec.ExtendPlayerVector(); if (ignoreallchecks || enemies == 0) { return(true); } if (vector.IsVectorUnderEnemyTower()) { return(false); } if (dangerouspells) { if (dangerlevel == 0) { var playerhp = Player.Instance.HealthPercent; if (enemies == 1 && meeles == 0) { return(true); } if (enemies == 1 && meeles == 1) { var closest = enemy.OrderBy(x => x.Distance(vector)).FirstOrDefault(); var positionAfter = Prediction.PredictUnitPosition(closest, 250); if (closest != null && (vector.Distance(positionAfter, true) > 250 * 250 && closest.HealthPercent > playerhp)) { return(true); } if (closest != null && playerhp > closest.HealthPercent) { return(true); } } else if (enemies > allies) { return((from enemyTarget in EntityManager.Heroes.Enemies.Where(x => x.IsValidTarget(1200)) let positionAfter = Prediction.PredictUnitPosition(enemyTarget, 250) select new Geometry.Polygon.Circle(positionAfter, enemyTarget.IsMelee ? enemyTarget.GetAutoAttackRange() + 350 : enemyTarget.GetAutoAttackRange() + 150)).Any( polygonCircle => polygonCircle.IsOutside(vector.To2D()))); } else if (enemies <= allies) { return((from enemyTarget in EntityManager.Heroes.Enemies.Where(x => x.IsValidTarget(1200)) let positionAfter = Prediction.PredictUnitPosition(enemyTarget, 250) select new Geometry.Polygon.Circle(positionAfter, enemyTarget.IsMelee ? enemyTarget.GetAutoAttackRange() + 150 : enemyTarget.GetAutoAttackRange())).Any( polygonCircle => polygonCircle.IsOutside(vector.To2D()))); } } else if (dangerlevel > 0 && dangerlevel < 150) { var playerhp = Player.Instance.HealthPercent; if (enemies == 1 && meeles == 0) { return(true); } if (enemies == 1 && meeles == 1) { var closest = enemy.OrderBy(x => x.Distance(vector)).FirstOrDefault(); var positionAfter = Prediction.PredictUnitPosition(closest, 250); if (closest != null && (vector.Distance(positionAfter, true) > 300 * 300 && closest.HealthPercent > playerhp)) { return(true); } if (closest != null && playerhp > closest.HealthPercent) { return(true); } } else if (enemies > allies) { return((from enemyTarget in EntityManager.Heroes.Enemies.Where(x => x.IsValidTarget(2000)) let positionAfter = Prediction.PredictUnitPosition(enemyTarget, 500) select new Geometry.Polygon.Circle(positionAfter, enemyTarget.IsMelee ? enemyTarget.GetAutoAttackRange() + 600 : enemyTarget.GetAutoAttackRange() + 150)).Any( polygonCircle => polygonCircle.IsOutside(vector.To2D()))); } else if (enemies <= allies) { return((from enemyTarget in EntityManager.Heroes.Enemies.Where(x => x.IsValidTarget(2000)) let positionAfter = Prediction.PredictUnitPosition(enemyTarget, 500) select new Geometry.Polygon.Circle(positionAfter, enemyTarget.IsMelee ? enemyTarget.GetAutoAttackRange() + 450 : enemyTarget.GetAutoAttackRange() + 150)).Any( polygonCircle => polygonCircle.IsOutside(vector.To2D()))); } } else if (dangerlevel > 150 && dangerlevel < 200) { if (vector.IsInsideEnemyRange(800, true) == 0) { return(true); } if (GetTumbleEndPos(vector).Distance(Player.Instance) < 280) { return(false); } var playerhp = Player.Instance.HealthPercent; if (enemies == 1 && meeles == 0) { return(true); } if (enemies == 1 && meeles == 1) { var closest = enemy.OrderBy(x => x.Distance(vector)).FirstOrDefault(); var positionAfter = Prediction.PredictUnitPosition(closest, 250); if (closest != null && (vector.Distance(positionAfter, true) > 400 * 400 && closest.HealthPercent > playerhp)) { return(true); } if (closest != null && playerhp > closest.HealthPercent) { return(true); } } else if (enemies > allies) { return((from enemyTarget in EntityManager.Heroes.Enemies.Where(x => x.IsValidTarget(2000)) let positionAfter = Prediction.PredictUnitPosition(enemyTarget, 500) select new Geometry.Polygon.Circle(positionAfter, enemyTarget.IsMelee ? enemyTarget.GetAutoAttackRange() + 600 : enemyTarget.GetAutoAttackRange() + 300)).Any( polygonCircle => polygonCircle.IsOutside(vector.To2D()))); } else if (enemies <= allies) { return((from enemyTarget in EntityManager.Heroes.Enemies.Where(x => x.IsValidTarget(2000)) let positionAfter = Prediction.PredictUnitPosition(enemyTarget, 500) select new Geometry.Polygon.Circle(positionAfter, enemyTarget.IsMelee ? enemyTarget.GetAutoAttackRange() + 450 : enemyTarget.GetAutoAttackRange() + 300)).Any( polygonCircle => polygonCircle.IsOutside(vector.To2D()))); } } } else { var playerhp = Player.Instance.HealthPercent; if (enemies == 1 && meeles == 0) { return(true); } if (enemies == 1 && meeles == 1) { var closest = enemy.OrderBy(x => x.Distance(vector)).FirstOrDefault(); var positionAfter = Prediction.PredictUnitPosition(closest, 250); if (closest != null && (vector.Distance(positionAfter, true) > 250 * 250 && closest.HealthPercent > playerhp)) { return(true); } if (closest != null && playerhp > closest.HealthPercent) { return(true); } } else if (enemies > allies) { return((from enemyTarget in EntityManager.Heroes.Enemies.Where(x => x.IsValidTarget(1200)) let positionAfter = Prediction.PredictUnitPosition(enemyTarget, 250) select new Geometry.Polygon.Circle(positionAfter, enemyTarget.IsMelee ? enemyTarget.GetAutoAttackRange() + 350 : enemyTarget.GetAutoAttackRange() + 150)).Any( polygonCircle => polygonCircle.IsOutside(vector.To2D()))); } else if (enemies <= allies) { return((from enemyTarget in EntityManager.Heroes.Enemies.Where(x => x.IsValidTarget(1200)) let positionAfter = Prediction.PredictUnitPosition(enemyTarget, 250) select new Geometry.Polygon.Circle(positionAfter, enemyTarget.IsMelee ? enemyTarget.GetAutoAttackRange() + 150 : enemyTarget.GetAutoAttackRange())).Any( polygonCircle => polygonCircle.IsOutside(vector.To2D()))); } } return(false); }
/// <summary> /// Returns true if all 3 condemn vectors have wall collision flags /// </summary> /// <param name="unit">Target</param> /// <param name="range">Push distance</param> /// <returns>Returns true if vectors have wall collision flags</returns> public static bool CanICastE(AIHeroClient unit, float range) { if (unit == null || !unit.IsECastableOnEnemy() || unit.IsDashing()) { return(false); } var accuracy = Config.CondemnMenu.EMethod; var position = Prediction.PredictUnitPosition(unit, 200); if (!unit.CanMove) { for (var i = 25; i < range + 50; i += 50) { var vec = unit.ServerPosition.Extend(Player.Instance.ServerPosition, -Math.Min(i, range)); if (vec.IsWall()) { return(true); } } } else { switch (accuracy) { case 0: { for (var i = Config.CondemnMenu.PushDistance; i >= 100; i -= 100) { var vec = position.Extend(Player.Instance.ServerPosition, -i); var left = new Vector2[5]; var right = new Vector2[5]; var var = 18 * i / 100; for (var x = 0; x < 5; x++) { left[x] = position.Extend( vec + (position - vec).Normalized().Rotated((float)ToRadian(Math.Max(0, var))) * Math.Abs(i < 200 ? 50 : 45 * x), i); right[x] = position.Extend( vec + (position - vec).Normalized().Rotated((float)ToRadian(-Math.Max(0, var))) * Math.Abs(i < 200 ? 50 : 45 * x), i); } if (left[0].IsWall() && right[0].IsWall() && left[1].IsWall() && right[1].IsWall() && left[2].IsWall() && right[2].IsWall() && left[3].IsWall() && right[3].IsWall() && left[4].IsWall() && right[4].IsWall() && vec.IsWall()) { return(true); } } break; } case 1: { for (var i = 25; i < range + 50; i += 50) { var vec = position.Extend(Player.Instance.ServerPosition, -Math.Min(i, range)); if (vec.IsWall()) { return(true); } } break; } default: { return(false); } } } return(false); }