public static void OnCastTumble(Obj_AI_Base target, Vector3 position) { var mode = Manager.MenuManager.UseQMode; var afterTumblePosition = Variables._Player.ServerPosition.Extend(position, 300f); var distanceToTarget = afterTumblePosition.Distance(target.ServerPosition, true); if ((distanceToTarget < Math.Pow(Variables._Player.AttackRange + 65, 2) && distanceToTarget > 110 * 110) || Manager.MenuManager.SpamQ) { switch (mode) { case 0: //To mouse DefaultQCast(position, target); break; case 1: //smart logic! var smartQPosition = QECombo(); var smartQCheck = smartQPosition != Vector3.Zero; var QPosition = smartQCheck ? smartQPosition : Game.CursorPos; var QPosition2 = Provider.AkaQPosition() != Vector3.Zero ? Provider.AkaQPosition() : QPosition; if (!Variables.UnderEnemyTower((Vector2)QPosition2) || (Variables.UnderEnemyTower((Vector2)QPosition2) && Variables.UnderEnemyTower((Vector2)Variables._Player.Position))) { CastQ(QPosition2); } break; case 2: //Away from melee enemies if (Variables.MeleeEnemiesTowardsMe.Any() && !Variables.MeleeEnemiesTowardsMe.All(m => m.HealthPercent <= 15)) { var Closest = Variables.MeleeEnemiesTowardsMe.OrderBy(m => m.Distance(Variables._Player)).First(); var whereToQ = (Vector3)Closest.ServerPosition.Extend( Variables._Player.ServerPosition, Closest.Distance(Variables._Player) + 300f); if (whereToQ.IsTotallySafe()) { CastQ(whereToQ); } } else { DefaultQCast(position, target); } break; case 3: //Prada var Target = TargetSelector.GetTarget((int)Variables._Player.GetAutoAttackRange(), DamageType.Physical); if (Target == null) { return; } var tumblePosition = Target.GetTumblePos(); CastQ(tumblePosition); break; case 4: //Sebby CastDash(); break; } } }