using Buddy.Coroutines; using ff14bot; using ff14bot.Managers; using System.Linq; using System.Threading.Tasks; using UltimaCR.Spells.Main; namespace UltimaCR.Rotations { public sealed partial class Ninja { private NinjaSpells _mySpells; private NinjaSpells MySpells { get { return _mySpells ?? (_mySpells = new NinjaSpells()); } } #region Class Spells private async Task SpinningEdge() { return await MySpells.SpinningEdge.Cast(); } private async Task ShadeShift() { return await MySpells.ShadeShift.Cast(); } private async Task GustSlash() { if (Actionmanager.LastSpell.Name == MySpells.SpinningEdge.Name) { return await MySpells.GustSlash.Cast(); } return false; } private async Task KissOfTheWasp() { if (Ultima.UltSettings.NinjaKissOfTheWasp || !Actionmanager.HasSpell(MySpells.KissOfTheViper.Name)) { if (!Core.Player.HasAura(MySpells.KissOfTheWasp.Name)) { return await MySpells.KissOfTheWasp.Cast(); } } return false; } private async Task Mutilate() { if (Core.Player.HasAura(MySpells.Huton.Name, true, 15000) && (!Actionmanager.HasSpell(MySpells.ShadowFang.Name) || Core.Player.CurrentTarget.HasAura(MySpells.ShadowFang.Name, true, 3000))) { if (Core.Player.CurrentTarget.HasAura(MySpells.DancingEdge.Name, true, 6000) || Core.Player.CurrentTarget.HasAura(MySpells.DancingEdge.Name, false) || Core.Player.CurrentTarget.HasAura("Storm's Eye")) { if (!Core.Player.CurrentTarget.HasAura("Mutilation", true, 4000)) { return await MySpells.Mutilate.Cast(); } } } return false; } private async Task Hide() { return await MySpells.Hide.Cast(); } private async Task Assassinate() { if (Ultima.UltSettings.NinjaAssassinate) { return await MySpells.Assassinate.Cast(); } return false; } private async Task ThrowingDagger() { if (Core.Player.TargetDistance(10)) { return await MySpells.ThrowingDagger.Cast(); } return false; } private async Task Mug() { if (Core.Player.CurrentTarget.HasAura("Mutilation")) { return await MySpells.Mug.Cast(); } return false; } private async Task Goad() { if (Ultima.UltSettings.NinjaGoad) { var target = Helpers.GoadManager.FirstOrDefault(); if (target != null) { return await MySpells.Goad.Cast(target); } } return false; } private async Task SneakAttack() { if (BotManager.Current.IsAutonomous && Core.Player.HasTarget && Core.Player.CurrentTarget.IsFacing(Core.Player) && Core.Player.HasAura("Suiton")) { return await MySpells.SneakAttack.Cast(); } return false; } private async Task AeolianEdge() { if (Core.Player.HasAura(MySpells.Huton.Name, true, 25000) && Actionmanager.LastSpell.Name == MySpells.GustSlash.Name && Core.Player.CurrentTarget.HasAura(MySpells.ShadowFang.Name, true, 4000)) { if (Core.Player.CurrentTarget.HasAura(MySpells.DancingEdge.Name, true, 6000) || Core.Player.CurrentTarget.HasAura(MySpells.DancingEdge.Name, false) || Core.Player.CurrentTarget.HasAura("Storm's Eye")) { if (await MySpells.Duality.Cast()) { await Coroutine.Wait(3000, () => Actionmanager.CanCast(MySpells.AeolianEdge.Name, Core.Player.CurrentTarget)); } return await MySpells.AeolianEdge.Cast(); } } return false; } private async Task KissOfTheViper() { if (Ultima.UltSettings.NinjaKissOfTheViper && !Core.Player.HasAura(MySpells.KissOfTheViper.Name)) { return await MySpells.KissOfTheViper.Cast(); } return false; } private async Task Jugulate() { if (Ultima.UltSettings.NinjaJugulate && Core.Player.CurrentTarget.HasAura("Mutilation")) { return await MySpells.Jugulate.Cast(); } return false; } private async Task DancingEdge() { if (Ultima.UltSettings.NinjaDancingEdge && Core.Player.HasAura(MySpells.Huton.Name, true, 15000) && Actionmanager.LastSpell.Name == MySpells.GustSlash.Name && !Core.Player.CurrentTarget.HasAura(MySpells.DancingEdge.Name, false, 6000) && !Core.Player.CurrentTarget.HasAura("Storm's Eye")) { return await MySpells.DancingEdge.Cast(); } return false; } private async Task DeathBlossom() { return await MySpells.DeathBlossom.Cast(); } private async Task ShadowFang() { if (Core.Player.HasAura(MySpells.Huton.Name, true, 15000)) { if (!Ultima.UltSettings.NinjaDancingEdge || (Core.Player.CurrentTarget.HasAura(MySpells.DancingEdge.Name, false, 6000) || Core.Player.CurrentTarget.HasAura("Storm's Eye"))) { if (!Core.Player.CurrentTarget.HasAura(MySpells.ShadowFang.Name, true, 4000) && Actionmanager.LastSpell.Name == MySpells.SpinningEdge.Name) { return await MySpells.ShadowFang.Cast(); } } } return false; } private async Task TrickAttack() { if (Core.Player.HasTarget && Core.Player.CurrentTarget.IsBehind && Core.Player.HasAura("Suiton")) { return await MySpells.TrickAttack.Cast(); } return false; } #endregion #region Cross Class Spells #region Lancer private async Task Feint() { if (Ultima.UltSettings.NinjaFeint) { return await MySpells.CrossClass.Feint.Cast(); } return false; } private async Task KeenFlurry() { if (Ultima.UltSettings.NinjaKeenFlurry) { return await MySpells.CrossClass.KeenFlurry.Cast(); } return false; } private async Task Invigorate() { if (Ultima.UltSettings.NinjaInvigorate && Core.Player.CurrentTP <= 540) { return await MySpells.CrossClass.Invigorate.Cast(); } return false; } private async Task BloodForBlood() { if (Ultima.UltSettings.NinjaBloodForBlood) { return await MySpells.CrossClass.BloodForBlood.Cast(); } return false; } #endregion #region Pugilist private async Task Featherfoot() { if (Ultima.UltSettings.NinjaFeatherfoot) { return await MySpells.CrossClass.Featherfoot.Cast(); } return false; } private async Task SecondWind() { if (Ultima.UltSettings.NinjaSecondWind) { return await MySpells.CrossClass.SecondWind.Cast(); } return false; } private async Task Haymaker() { if (Ultima.UltSettings.NinjaHaymaker) { return await MySpells.CrossClass.Haymaker.Cast(); } return false; } private async Task InternalRelease() { if (Ultima.UltSettings.NinjaInternalRelease) { return await MySpells.CrossClass.InternalRelease.Cast(); } return false; } private async Task Mantra() { if (Ultima.UltSettings.NinjaMantra) { return await MySpells.CrossClass.Mantra.Cast(); } return false; } #endregion #endregion #region Job Spells private async Task Ninjutsu() { if (Actionmanager.CanCast(MySpells.Ten.ID, Core.Player) && Core.Player.HasAura("Mudra")) { return await MySpells.Ninjutsu.Cast(); } return false; } private async Task Shukuchi() { if (Ultima.UltSettings.NinjaShukuchi && Core.Player.TargetDistance(10)) { return await MySpells.Shukuchi.Cast(); } return false; } private async Task Kassatsu() { if (Core.Player.CurrentTarget.HasAura("Vulnerability Up") || Ultima.UltSettings.SmartTarget && Helpers.EnemiesNearPlayer(5) > 2 || Ultima.UltSettings.MultiTarget) { return await MySpells.Kassatsu.Cast(); } return false; } private async Task FumaShuriken() { if (Ultima.UltSettings.NinjaFumaShuriken || Core.Player.ClassLevel < MySpells.Raiton.Level) { if (Actionmanager.CanCast(MySpells.Ten.ID, Core.Player) && DataManager.GetSpellData(2240).Cooldown.TotalMilliseconds <= 1500 && DataManager.GetSpellData(2240).Cooldown.TotalMilliseconds >= 500 && Core.Player.TargetDistance(25, false) && Core.Player.CurrentTarget.InLineOfSight() || Core.Player.HasAura("Mudra")) { if (Core.Player.CurrentTarget.HasAura(MySpells.DancingEdge.Name, false) || Core.Player.CurrentTarget.HasAura("Storm's Eye") && Ultima.LastSpell.ID != MySpells.Ten.ID && Ultima.LastSpell.ID != MySpells.Chi.ID && Ultima.LastSpell.ID != MySpells.Jin.ID && Ultima.LastSpell.ID != MySpells.Ninjutsu.ID) { if (await MySpells.Ten.Cast()) { await Coroutine.Wait(2000, () => Actionmanager.CanCast(MySpells.Ten.ID, Core.Player)); } } if (Ultima.LastSpell.ID == MySpells.Ten.ID) { if (await MySpells.FumaShuriken.Cast()) { await Coroutine.Wait(2000, () => !Core.Player.HasAura("Mudra")); } return true; } } } return false; } private async Task Katon() { if (Actionmanager.CanCast(MySpells.Chi.ID, Core.Player) && DataManager.GetSpellData(2240).Cooldown.TotalMilliseconds <= 1500 && DataManager.GetSpellData(2240).Cooldown.TotalMilliseconds >= 500 && Core.Player.TargetDistance(15, false) && Core.Player.CurrentTarget.CanAttack && Core.Player.CurrentTarget.InLineOfSight() || Core.Player.HasAura("Mudra")) { if (Helpers.EnemiesNearTarget(5) > 2 || Ultima.UltSettings.MultiTarget) { if (Ultima.LastSpell.ID != MySpells.Ten.ID && Ultima.LastSpell.ID != MySpells.Chi.ID && Ultima.LastSpell.ID != MySpells.Jin.ID && Ultima.LastSpell.ID != MySpells.Ninjutsu.ID) { if (await MySpells.Chi.Cast()) { await Coroutine.Wait(2000, () => Actionmanager.CanCast(MySpells.Chi.ID, Core.Player)); } } if (Ultima.LastSpell.ID == MySpells.Chi.ID) { if (await MySpells.Ten.Cast()) { await Coroutine.Wait(2000, () => Actionmanager.CanCast(MySpells.Ten.ID, Core.Player)); } } if (Ultima.LastSpell.ID == MySpells.Ten.ID) { if (await MySpells.Katon.Cast()) { await Coroutine.Wait(2000, () => !Core.Player.HasAura("Mudra")); } return true; } } } return false; } private async Task Raiton() { if (Ultima.UltSettings.NinjaRaiton) { if (Actionmanager.CanCast(MySpells.Chi.ID, Core.Player) && DataManager.GetSpellData(2240).Cooldown.TotalMilliseconds <= 1500 && DataManager.GetSpellData(2240).Cooldown.TotalMilliseconds >= 500 && Core.Player.TargetDistance(15, false) && Core.Player.CurrentTarget.CanAttack && Core.Player.CurrentTarget.InLineOfSight() || Core.Player.HasAura("Mudra")) { if (Ultima.LastSpell.ID != MySpells.Ten.ID && Ultima.LastSpell.ID != MySpells.Chi.ID && Ultima.LastSpell.ID != MySpells.Jin.ID && Ultima.LastSpell.ID != MySpells.Ninjutsu.ID) { if (await MySpells.Ten.Cast()) { await Coroutine.Wait(2000, () => Actionmanager.CanCast(MySpells.Ten.ID, Core.Player)); } } if (Ultima.LastSpell.ID == MySpells.Ten.ID) { if (await MySpells.Chi.Cast()) { await Coroutine.Wait(2000, () => Actionmanager.CanCast(MySpells.Chi.ID, Core.Player)); } } if (Ultima.LastSpell.ID == MySpells.Chi.ID) { if (await MySpells.Raiton.Cast()) { await Coroutine.Wait(2000, () => !Core.Player.HasAura("Mudra")); } return true; } } } return false; } private async Task Hyoton() { if (Actionmanager.CanCast(MySpells.Jin.ID, Core.Player) && DataManager.GetSpellData(2240).Cooldown.TotalMilliseconds <= 1500 && DataManager.GetSpellData(2240).Cooldown.TotalMilliseconds >= 500 && Core.Player.TargetDistance(25, false) && Core.Player.CurrentTarget.CanAttack && Core.Player.CurrentTarget.InLineOfSight() || Core.Player.HasAura("Mudra")) { if (Ultima.LastSpell.ID != MySpells.Ten.ID && Ultima.LastSpell.ID != MySpells.Chi.ID && Ultima.LastSpell.ID != MySpells.Jin.ID && Ultima.LastSpell.ID != MySpells.Ninjutsu.ID) { if (await MySpells.Ten.Cast()) { await Coroutine.Wait(2000, () => Actionmanager.CanCast(MySpells.Ten.ID, Core.Player)); } } if (Ultima.LastSpell.ID == MySpells.Ten.ID) { if (await MySpells.Jin.Cast()) { await Coroutine.Wait(2000, () => Actionmanager.CanCast(MySpells.Jin.ID, Core.Player)); } } if (Ultima.LastSpell.ID == MySpells.Jin.ID) { if (await MySpells.Hyoton.Cast()) { await Coroutine.Wait(2000, () => !Core.Player.HasAura("Mudra")); } return true; } } return false; } private async Task Huton() { if (Actionmanager.CanCast(MySpells.Jin.ID, Core.Player)) { if (!Core.Player.HasAura(MySpells.Huton.Name) && DataManager.GetSpellData(2240).Cooldown.TotalMilliseconds <= 1500 || !Actionmanager.HasSpell(MySpells.ArmorCrush.Name) && !Core.Player.HasAura(MySpells.Huton.Name, true, 1000) && DataManager.GetSpellData(2240).Cooldown.TotalMilliseconds <= 1500 && DataManager.GetSpellData(2240).Cooldown.TotalMilliseconds >= 500 || Core.Player.HasAura("Mudra")) { if (Ultima.LastSpell.ID != MySpells.Ten.ID && Ultima.LastSpell.ID != MySpells.Chi.ID && Ultima.LastSpell.ID != MySpells.Jin.ID && Ultima.LastSpell.ID != MySpells.Ninjutsu.ID) { if (await MySpells.Chi.Cast()) { await Coroutine.Wait(2000, () => Actionmanager.CanCast(MySpells.Chi.ID, Core.Player)); } } if (Ultima.LastSpell.ID == MySpells.Chi.ID) { if (await MySpells.Jin.Cast()) { await Coroutine.Wait(2000, () => Actionmanager.CanCast(MySpells.Jin.ID, Core.Player)); } } if (Ultima.LastSpell.ID == MySpells.Jin.ID) { if (await MySpells.Ten.Cast()) { await Coroutine.Wait(2000, () => Actionmanager.CanCast(MySpells.Ten.ID, Core.Player)); } } if (Ultima.LastSpell.ID == MySpells.Ten.ID) { if (await MySpells.Huton.Cast()) { await Coroutine.Wait(2000, () => !Core.Player.HasAura("Mudra")); } return true; } } } return false; } private async Task Doton() { if (Actionmanager.CanCast(MySpells.Jin.ID, Core.Player) && DataManager.GetSpellData(2240).Cooldown.TotalMilliseconds <= 1500 && DataManager.GetSpellData(2240).Cooldown.TotalMilliseconds >= 500 && Core.Player.HasAura(MySpells.Kassatsu.Name) || Core.Player.HasAura("Mudra")) { if (Helpers.EnemiesNearPlayer(5) > 2 || Ultima.UltSettings.MultiTarget) { if (Ultima.LastSpell.ID != MySpells.Ten.ID && Ultima.LastSpell.ID != MySpells.Chi.ID && Ultima.LastSpell.ID != MySpells.Jin.ID && Ultima.LastSpell.ID != MySpells.Ninjutsu.ID) { if (await MySpells.Ten.Cast()) { await Coroutine.Wait(2000, () => Actionmanager.CanCast(MySpells.Ten.ID, Core.Player)); } } if (Ultima.LastSpell.ID == MySpells.Ten.ID) { if (await MySpells.Jin.Cast()) { await Coroutine.Wait(2000, () => Actionmanager.CanCast(MySpells.Jin.ID, Core.Player)); } } if (Ultima.LastSpell.ID == MySpells.Jin.ID) { if (await MySpells.Chi.Cast()) { await Coroutine.Wait(2000, () => Actionmanager.CanCast(MySpells.Chi.ID, Core.Player)); } } if (Ultima.LastSpell.ID == MySpells.Chi.ID) { if (await MySpells.Doton.Cast()) { await Coroutine.Wait(2000, () => !Core.Player.HasAura("Mudra")); } return true; } } } return false; } private async Task Suiton() { if (Actionmanager.CanCast(MySpells.Jin.ID, Core.Player) && DataManager.GetSpellData(2240).Cooldown.TotalMilliseconds <= 1500 && DataManager.GetSpellData(2240).Cooldown.TotalMilliseconds >= 500 && DataManager.GetSpellData(MySpells.TrickAttack.ID).Cooldown.TotalMilliseconds == 0 && Core.Player.TargetDistance(15, false) && !Core.Player.CurrentTarget.HasAura(MySpells.TrickAttack.Name, true, 3000) && !Core.Player.CurrentTarget.HasAura(MySpells.TrickAttack.Name, false, 3000) || Core.Player.HasAura("Mudra")) { if (Core.Player.CurrentTarget.HasAura(MySpells.DancingEdge.Name, false) || Core.Player.CurrentTarget.HasAura("Storm's Eye") && Ultima.LastSpell.ID != MySpells.Ten.ID && Ultima.LastSpell.ID != MySpells.Chi.ID && Ultima.LastSpell.ID != MySpells.Jin.ID && Ultima.LastSpell.ID != MySpells.Ninjutsu.ID) { if (await MySpells.Ten.Cast()) { await Coroutine.Wait(2000, () => Actionmanager.CanCast(MySpells.Ten.ID, Core.Player)); } } if (Ultima.LastSpell.ID == MySpells.Ten.ID) { if (await MySpells.Chi.Cast()) { await Coroutine.Wait(2000, () => Actionmanager.CanCast(MySpells.Chi.ID, Core.Player)); } } if (Ultima.LastSpell.ID == MySpells.Chi.ID) { if (await MySpells.Jin.Cast()) { await Coroutine.Wait(2000, () => Actionmanager.CanCast(MySpells.Jin.ID, Core.Player)); } } if (Ultima.LastSpell.ID == MySpells.Jin.ID) { if (await MySpells.Suiton.Cast()) { await Coroutine.Wait(2000, () => !Core.Player.HasAura("Mudra")); } return true; } } return false; } private async Task SmokeScreen() { return await MySpells.SmokeScreen.Cast(); } private async Task ArmorCrushOne() { if (Actionmanager.LastSpell.Name == MySpells.GustSlash.Name && !Core.Player.HasAura(MySpells.Huton.Name, true, 15000)) { return await MySpells.ArmorCrush.Cast(); } return false; } private async Task ArmorCrush() { if (Actionmanager.LastSpell.Name == MySpells.GustSlash.Name && !Core.Player.HasAura(MySpells.Huton.Name, true, 25000)) { if (Core.Player.CurrentTarget.HasAura(MySpells.DancingEdge.Name, false, 6000) || Core.Player.CurrentTarget.HasAura("Storm's Eye")) { return await MySpells.ArmorCrush.Cast(); } } return false; } private async Task Shadewalker() { return await MySpells.Shadewalker.Cast(); } private async Task Duality() { if (Actionmanager.LastSpell.Name == MySpells.GustSlash.Name && Core.Player.CurrentTarget.HasAura(MySpells.ShadowFang.Name)) { return await MySpells.Duality.Cast(); } return false; } private async Task DreamWithinADream() { if (Ultima.UltSettings.NinjaDreamWithinADream && Core.Player.CurrentTarget.HasAura(MySpells.ShadowFang.Name)) { return await MySpells.DreamWithinADream.Cast(); } return false; } #endregion #region PvP Spells private async Task Detect() { return await MySpells.PvP.Detect.Cast(); } private async Task IllWind() { return await MySpells.PvP.IllWind.Cast(); } private async Task Malmsight() { return await MySpells.PvP.Malmsight.Cast(); } private async Task Overwhelm() { return await MySpells.PvP.Overwhelm.Cast(); } private async Task Purify() { return await MySpells.PvP.Purify.Cast(); } private async Task Recouperate() { return await MySpells.PvP.Recouperate.Cast(); } #endregion } }