コード例 #1
0
ファイル: Dancer.cs プロジェクト: hyskylord/MagitekRoutine
        public static async Task <bool> Combat()
        {
            if (BotManager.Current.IsAutonomous)
            {
                if (Core.Me.HasTarget)
                {
                    Movement.NavigateToUnitLos(Core.Me.CurrentTarget, 3 + Core.Me.CurrentTarget.CombatReach);
                }
            }

            if (!SpellQueueLogic.SpellQueue.Any())
            {
                SpellQueueLogic.InSpellQueue = false;
            }

            if (SpellQueueLogic.SpellQueue.Any())
            {
                if (await SpellQueueLogic.SpellQueueMethod())
                {
                    return(true);
                }
            }

            if (!Core.Me.HasTarget || !Core.Me.CurrentTarget.ThoroughCanAttack())
            {
                return(false);
            }

            if (await CustomOpenerLogic.Opener())
            {
                return(true);
            }
            if (await GambitLogic.Gambit())
            {
                return(true);
            }

            if (await Buff.DancePartner())
            {
                return(true);
            }

            if (await Aoe.StarfallDance())
            {
                return(true);
            }
            if (await Dances.Tillana())
            {
                return(true);
            }
            if (await Dances.StandardStep())
            {
                return(true);
            }
            if (await Dances.TechnicalStep())
            {
                return(true);
            }
            if (await Dances.DanceStep())
            {
                return(true);
            }

            if (Core.Me.HasAura(Auras.StandardStep) || Core.Me.HasAura(Auras.TechnicalStep))
            {
                return(false);
            }

            if (DancerRoutine.GlobalCooldown.CanWeave())
            {
                if (await PhysicalDps.Interrupt(DancerSettings.Instance))
                {
                    return(true);
                }
                if (await PhysicalDps.SecondWind(DancerSettings.Instance))
                {
                    return(true);
                }
                if (await Buff.CuringWaltz())
                {
                    return(true);
                }
                if (await Buff.PreTechnicalDevilment())
                {
                    return(true);
                }
                if (await Aoe.FanDance3())
                {
                    return(true);
                }
                if (await Aoe.FanDance2())
                {
                    return(true);
                }
                if (await SingleTarget.FanDance())
                {
                    return(true);
                }
                if (await Aoe.FanDance4())
                {
                    return(true);
                }
                if (await Buff.Flourish())
                {
                    return(true);
                }
                if (await Buff.Devilment())
                {
                    return(true);
                }
                if (await Buff.Improvisation())
                {
                    return(true);
                }
            }

            if (await Aoe.SaberDance())
            {
                return(true);
            }
            if (await Aoe.Bloodshower())
            {
                return(true);
            }
            if (await Aoe.RisingWindmill())
            {
                return(true);
            }
            if (await SingleTarget.Fountainfall())
            {
                return(true);
            }
            if (await SingleTarget.ReverseCascade())
            {
                return(true);
            }
            if (await Aoe.Bladeshower())
            {
                return(true);
            }
            if (await Aoe.Windmill())
            {
                return(true);
            }
            if (await SingleTarget.Fountain())
            {
                return(true);
            }
            return(await SingleTarget.Cascade());
        }
コード例 #2
0
        public static async Task <bool> Combat()
        {
            if (BotManager.Current.IsAutonomous)
            {
                if (Core.Me.HasTarget)
                {
                    Movement.NavigateToUnitLos(Core.Me.CurrentTarget, 23);
                }
            }

            if (!Core.Me.HasTarget || !Core.Me.CurrentTarget.ThoroughCanAttack())
            {
                return(false);
            }

            if (await CustomOpenerLogic.Opener())
            {
                return(true);
            }

            if (MachinistSettings.Instance.UseFlamethrower && Core.Me.HasAura(Auras.Flamethrower))
            {
                // First check movement otherwise Flamethrower can be executed whereas you are moving
                if (MovementManager.IsMoving)
                {
                    return(false);
                }

                if (!MachinistSettings.Instance.UseFlamethrower)
                {
                    return(true);
                }

                if (Core.Me.EnemiesInCone(8) >= MachinistSettings.Instance.FlamethrowerEnemyCount)
                {
                    return(true);
                }
            }

            //oGCDs

            //Utility
            if (await Utility.Tactician())
            {
                return(true);
            }
            if (await PhysicalDps.ArmsLength(MachinistSettings.Instance))
            {
                return(true);
            }
            if (await PhysicalDps.SecondWind(MachinistSettings.Instance))
            {
                return(true);
            }
            if (await Utility.HeadGraze())
            {
                return(true);
            }

            if (Weaving.GetCurrentWeavingCounter() < 2)
            {
                //Pets
                if (await Pet.RookQueen())
                {
                    return(true);
                }
                if (await Pet.RookQueenOverdrive())
                {
                    return(true);
                }

                //Cooldowns
                if (await Cooldowns.Wildfire())
                {
                    return(true);
                }
                if (await Cooldowns.Hypercharge())
                {
                    return(true);
                }
                if (await Cooldowns.Reassemble())
                {
                    return(true);
                }
                if (await Cooldowns.BarrelStabilizer())
                {
                    return(true);
                }

                //oGCDs
                if (await SingleTarget.GaussRound())
                {
                    return(true);
                }
                if (await MultiTarget.Ricochet())
                {
                    return(true);
                }
            }

            //GCDs - Top Hypercharge Priority
            if (await MultiTarget.AutoCrossbow())
            {
                return(true);
            }
            if (await SingleTarget.HeatBlast())
            {
                return(true);
            }

            //Use On CD
            if (await MultiTarget.BioBlaster())
            {
                return(true);
            }
            if (await SingleTarget.Drill())
            {
                return(true);
            }
            if (await SingleTarget.HotAirAnchor())
            {
                return(true);
            }
            if (await MultiTarget.Flamethrower())
            {
                return(true);
            }
            if (await MultiTarget.SpreadShot())
            {
                return(true);
            }

            //Default Combo

            if (Core.Me.ClassLevel > 58)
            {
                if (Spells.Drill.Cooldown.TotalMilliseconds > 100)
                {
                    if (await SingleTarget.HeatedCleanShot())
                    {
                        return(true);
                    }
                    if (await SingleTarget.HeatedSlugShot())
                    {
                        return(true);
                    }
                }
            }
            else
            {
                if (await SingleTarget.HeatedCleanShot())
                {
                    return(true);
                }
                if (await SingleTarget.HeatedSlugShot())
                {
                    return(true);
                }
            }

            return(await SingleTarget.HeatedSplitShot());
        }
コード例 #3
0
ファイル: Combat.cs プロジェクト: thadeusb/MagitekRoutine
        public static async Task <bool> Execute()
        {
            if (BotManager.Current.IsAutonomous)
            {
                Movement.NavigateToUnitLos(Core.Me.CurrentTarget, 3 + Core.Me.CurrentTarget.CombatReach);
            }

            if (!SpellQueueLogic.SpellQueue.Any())
            {
                SpellQueueLogic.InSpellQueue = false;
            }

            if (SpellQueueLogic.SpellQueue.Any())
            {
                if (await SpellQueueLogic.SpellQueueMethod())
                {
                    return(true);
                }
            }

            if (!Core.Me.HasTarget || !Core.Me.CurrentTarget.ThoroughCanAttack())
            {
                return(false);
            }

            if (await CustomOpenerLogic.Opener())
            {
                return(true);
            }


            if (await PhysicalDps.Interrupt(NinjaSettings.Instance))
            {
                return(true);
            }

            if (!Core.Me.HasTarget || !Core.Me.CurrentTarget.ThoroughCanAttack())
            {
                return(false);
            }

            if (Utilities.Routines.Ninja.OnGcd)
            {
                if (await PhysicalDps.SecondWind(NinjaSettings.Instance))
                {
                    return(true);
                }
                if (await PhysicalDps.Bloodbath(NinjaSettings.Instance))
                {
                    return(true);
                }
                if (await PhysicalDps.Feint(NinjaSettings.Instance))
                {
                    return(true);
                }

                if (Core.Me.HasAura(Auras.Suiton))
                {
                    if (await PhysicalDps.TrueNorth(NinjaSettings.Instance))
                    {
                        return(true);
                    }
                }

                if (await Buff.ShadeShift())
                {
                    return(true);
                }
                if (await Buff.Bunshin())
                {
                    return(true);
                }
                if (await SingleTarget.Assassinate())
                {
                    return(true);
                }
                if (await SingleTarget.Mug())
                {
                    return(true);
                }
                if (await Buff.Kassatsu())
                {
                    return(true);
                }
                if (await SingleTarget.TrickAttack())
                {
                    return(true);
                }
                if (await SingleTarget.DreamWithinADream())
                {
                    return(true);
                }
                if (await Aoe.HellfrogMedium())
                {
                    return(true);
                }
                if (await SingleTarget.Bhavacakra())
                {
                    return(true);
                }
                if (await Ninjutsu.TenChiJin())
                {
                    return(true);
                }
            }

            if (Ninjutsu.Huton())
            {
                return(true);
            }
            if (Ninjutsu.GokaMekkyaku())
            {
                return(true);
            }
            if (Ninjutsu.Doton())
            {
                return(true);
            }
            if (Ninjutsu.Katon())
            {
                return(true);
            }
            if (Ninjutsu.Suiton())
            {
                return(true);
            }
            if (Ninjutsu.HyoshoRanryu())
            {
                return(true);
            }
            if (Ninjutsu.Raiton())
            {
                return(true);
            }
            if (Ninjutsu.FumaShuriken())
            {
                return(true);
            }

            if (await Aoe.HakkeMujinsatsu())
            {
                return(true);
            }
            if (await Aoe.DeathBlossom())
            {
                return(true);
            }
            if (await SingleTarget.ShadowFang())
            {
                return(true);
            }
            if (await SingleTarget.ArmorCrush())
            {
                return(true);
            }
            if (await SingleTarget.AeolianEdge())
            {
                return(true);
            }
            if (await SingleTarget.GustSlash())
            {
                return(true);
            }
            return(await SingleTarget.SpinningEdge());
        }
コード例 #4
0
        public static async Task <bool> Execute()
        {
            Group.UpdateAllies();

            if (BotManager.Current.IsAutonomous)
            {
                Movement.NavigateToUnitLos(Core.Me.CurrentTarget, 3 + Core.Me.CurrentTarget.CombatReach);
            }

            if (await GambitLogic.Gambit())
            {
                return(true);
            }


            if (!SpellQueueLogic.SpellQueue.Any())
            {
                SpellQueueLogic.InSpellQueue = false;
            }

            if (SpellQueueLogic.SpellQueue.Any())
            {
                if (await SpellQueueLogic.SpellQueueMethod())
                {
                    return(true);
                }
            }

            if (!Core.Me.HasTarget || !Core.Me.CurrentTarget.ThoroughCanAttack())
            {
                return(false);
            }

            if (await CustomOpenerLogic.Opener())
            {
                return(true);
            }

            if (await Buff.DancePartner())
            {
                return(true);
            }

            if (await Dances.StartTechnicalDance())
            {
                return(true);
            }
            if (Dances.TechnicalStep())
            {
                return(true);
            }

            if (await Dances.StartStandardDance())
            {
                return(true);
            }
            if (Dances.StandardStep())
            {
                return(true);
            }


            if (Utilities.Routines.Dancer.OnGcd)
            {
                //Only cast spells that are instant/off gcd
                if (await Buff.PreTechnicalDevilment())
                {
                    return(true);
                }
                if (await Aoe.FanDance3())
                {
                    return(true);
                }
                if (await Aoe.FanDance2())
                {
                    return(true);
                }
                if (await SingleTarget.FanDance())
                {
                    return(true);
                }
                if (await Buff.Flourish())
                {
                    return(true);
                }
                if (await Buff.Devilment())
                {
                    return(true);
                }
                if (await Buff.CuringWaltz())
                {
                    return(true);
                }
                if (await Buff.Improvisation())
                {
                    return(true);
                }
                if (await PhysicalDps.SecondWind(DancerSettings.Instance))
                {
                    return(true);
                }
            }

            if (await Aoe.SaberDance())
            {
                return(true);
            }

            if (await Aoe.Bloodshower())
            {
                return(true);
            }
            if (await Aoe.RisingWindmill())
            {
                return(true);
            }

            if (await SingleTarget.Fountainfall())
            {
                return(true);
            }
            if (await SingleTarget.ReverseCascade())
            {
                return(true);
            }

            if (await Aoe.Bladeshower())
            {
                return(true);
            }
            if (await Aoe.Windmill())
            {
                return(true);
            }

            if (await SingleTarget.Fountain())
            {
                return(true);
            }

            return(await SingleTarget.Cascade());
        }
コード例 #5
0
        public static async Task <bool> Combat()
        {
            if (BotManager.Current.IsAutonomous)
            {
                Movement.NavigateToUnitLos(Core.Me.CurrentTarget, 3 + Core.Me.CurrentTarget.CombatReach);
            }

            Utilities.Routines.Monk.RefreshVars();

            if (!SpellQueueLogic.SpellQueue.Any())
            {
                SpellQueueLogic.InSpellQueue = false;
            }

            if (SpellQueueLogic.SpellQueue.Any())
            {
                if (await SpellQueueLogic.SpellQueueMethod())
                {
                    return(true);
                }
            }

            if (!Core.Me.HasTarget || !Core.Me.CurrentTarget.ThoroughCanAttack())
            {
                return(false);
            }

            if (await CustomOpenerLogic.Opener())
            {
                return(true);
            }

            if (await Buff.FistsOf())
            {
                return(true);
            }

            if (await Buff.Meditate())
            {
                return(true);
            }

            //var count = Utilities.Combat.Enemies.Count;
            //if (2 >= count && count < 5)
            //{
            //    //TODO: Add 2-4 target DPS rotation
            //}
            //else if (count >= 5)
            //{
            //    //TODO: Add 5+ target DPS rotation
            //}
            if (!Core.Me.HasAura(Auras.Anatman) || MonkSettings.Instance.UseManualPB && Core.Me.HasAura(Auras.PerfectBalance))
            {
                if (Weaving.GetCurrentWeavingCounter() < 2 && Spells.Bootshine.Cooldown.TotalMilliseconds > 750 + BaseSettings.Instance.UserLatencyOffset)
                {
                    if (await PhysicalDps.Interrupt(MonkSettings.Instance))
                    {
                        return(true);
                    }
                    if (await PhysicalDps.SecondWind(MonkSettings.Instance))
                    {
                        return(true);
                    }
                    if (await PhysicalDps.Bloodbath(MonkSettings.Instance))
                    {
                        return(true);
                    }
                    if (await PhysicalDps.Feint(MonkSettings.Instance))
                    {
                        return(true);
                    }
                    if (await Buff.RiddleOfFire())
                    {
                        return(true);
                    }
                    if (await Buff.Brotherhood())
                    {
                        return(true);
                    }
                    if (await SingleTarget.TornadoKick())
                    {
                        return(true);
                    }
                    if (await Aoe.Enlightenment())
                    {
                        return(true);
                    }
                    if (await SingleTarget.TheForbiddenChakra())
                    {
                        return(true);
                    }
                    if (await SingleTarget.ShoulderTackle())
                    {
                        return(true);
                    }
                    if (await Buff.PerfectBalance())
                    {
                        return(true);
                    }
                    if (await Buff.TrueNorthRiddleOfEarth())
                    {
                        return(true);
                    }
                    //if (await Buff.RiddleOfFire()) return true;
                    //if (await Buff.Brotherhood()) return true;
                    if (await SingleTarget.ElixirField())
                    {
                        return(true);
                    }
                }
                if (await Aoe.Rockbreaker())
                {
                    return(true);
                }
                if (await Aoe.FourPointStrike())
                {
                    return(true);
                }
                if (await Aoe.ArmOfDestroyer())
                {
                    return(true);
                }
                if (await SingleTarget.PerfectBalanceRoT())
                {
                    return(true);
                }
                //if (await Aoe.Rockbreaker()) return true;
                //if (await Aoe.FourPointStrike()) return true;
                //if (await Aoe.ArmOfDestroyer()) return true;
                if (await SingleTarget.Demolish())
                {
                    return(true);
                }
                if (await SingleTarget.SnapPunch())
                {
                    return(true);
                }
                if (await SingleTarget.TwinSnakes())
                {
                    return(true);
                }
                if (await SingleTarget.TrueStrike())
                {
                    return(true);
                }
                if (await SingleTarget.Bootshine())
                {
                    return(true);
                }
                if (await SingleTarget.DragonKick())
                {
                    return(true);
                }
                return(await Buff.FormShiftIC());
            }

            return(false);
        }
コード例 #6
0
        public static async Task <bool> Combat()
        {
            if (BotManager.Current.IsAutonomous)
            {
                Movement.NavigateToUnitLos(Core.Me.CurrentTarget, 3 + Core.Me.CurrentTarget.CombatReach);
            }

            if (Core.Me.CurrentTarget == null)
            {
                return(false);
            }

            if (!Core.Me.CurrentTarget.ThoroughCanAttack())
            {
                return(false);
            }

            if (await CustomOpenerLogic.Opener())
            {
                return(true);
            }

            #region Positional Overlay
            if (BaseSettings.Instance.UsePositionalOverlay)
            {
                if (Core.Me.HasAura(Auras.SharperFangandClaw))
                {
                    if (!Core.Me.CurrentTarget.IsFlanking)
                    {
                        ViewModels.BaseSettings.Instance.PositionalStatus = "OutOfPosition";
                        ViewModels.BaseSettings.Instance.PositionalText   = "Move To Flank";
                    }
                    else
                    {
                        ViewModels.BaseSettings.Instance.PositionalStatus = "InPosition";
                        ViewModels.BaseSettings.Instance.PositionalText   = "You're In Position";
                    }
                }

                if (Core.Me.HasAura(Auras.EnhancedWheelingThrust))
                {
                    if (!Core.Me.CurrentTarget.IsBehind)
                    {
                        ViewModels.BaseSettings.Instance.PositionalStatus = "OutOfPosition";
                        ViewModels.BaseSettings.Instance.PositionalText   = "Move Behind";
                    }
                    else
                    {
                        ViewModels.BaseSettings.Instance.PositionalStatus = "InPosition";
                        ViewModels.BaseSettings.Instance.PositionalText   = "You're In Position";
                    }
                }

                if (ActionManager.LastSpell == Spells.Disembowel)
                {
                    if (!Core.Me.CurrentTarget.IsBehind)
                    {
                        ViewModels.BaseSettings.Instance.PositionalStatus = "OutOfPosition";
                        ViewModels.BaseSettings.Instance.PositionalText   = "Move Behind";
                    }
                    else
                    {
                        ViewModels.BaseSettings.Instance.PositionalStatus = "InPosition";
                        ViewModels.BaseSettings.Instance.PositionalText   = "You're In Position";
                    }
                }
            }
            #endregion

            #region Off GCD debugging
            if (Utilities.Routines.Dragoon.Jumps.Contains(Casting.LastSpell))
            {
                // Check to see if we're OFF GCD
                if (Spells.TrueThrust.Cooldown == TimeSpan.Zero)
                {
                    // Start the stopwatch if it isn't running
                    if (!JumpGcdTimer.IsRunning)
                    {
                        JumpGcdTimer.Restart();
                    }
                }
            }
            else
            {
                // We didn't use a Jump last, check to see if the stopwatch is running
                if (JumpGcdTimer.IsRunning)
                {
                    // We'll give a 50ms buffer for the time it takes to tick
                    if (JumpGcdTimer.ElapsedMilliseconds > 50)
                    {
                        Logger.WriteInfo($@"We wasted {JumpGcdTimer.ElapsedMilliseconds} ms off GCD");
                    }

                    // Stop the stopwatch
                    JumpGcdTimer.Stop();
                }
            }
            #endregion

            if (await PhysicalDps.Interrupt(DragoonSettings.Instance))
            {
                return(true);
            }
            if (await PhysicalDps.SecondWind(DragoonSettings.Instance))
            {
                return(true);
            }
            if (await PhysicalDps.Bloodbath(DragoonSettings.Instance))
            {
                return(true);
            }

            Utilities.Routines.Dragoon.EnemiesInView = Utilities.Combat.Enemies.Count(r => r.Distance(Core.Me) <= 10 + r.CombatReach && r.InView());

            if (Utilities.Routines.Dragoon.OnGcd && !_usedJumpDuringGcd)
            {
                if (await Jumps.MirageDive())
                {
                    _usedJumpDuringGcd = true;
                    return(true);
                }

                if (await Jumps.Execute())
                {
                    _usedJumpDuringGcd = true;
                    return(true);
                }

                if (await SingleTarget.Geirskogul())
                {
                    return(true);
                }

                if (await Buff.LanceCharge())
                {
                    return(true);
                }
                if (await Aoe.Nastrond())
                {
                    return(true);
                }
                if (await Buff.BloodOfTheDragon())
                {
                    return(true);
                }
                if (await Buff.DragonSight())
                {
                    return(true);
                }
                if (await Buff.BattleLitany())
                {
                    return(true);
                }
                return(await Buff.TrueNorth());
            }

            if (await OffGlobalCooldownRotation())
            {
                _usedJumpDuringGcd = false;
                return(true);
            }

            return(false);
        }
コード例 #7
0
ファイル: Bard.cs プロジェクト: hyskylord/MagitekRoutine
        public static async Task <bool> Combat()
        {
            if (BotManager.Current.IsAutonomous)
            {
                if (Core.Me.HasTarget)
                {
                    Movement.NavigateToUnitLos(Core.Me.CurrentTarget, 20 + Core.Me.CurrentTarget.CombatReach);
                }
            }

            if (await Casting.TrackSpellCast())
            {
                return(true);
            }

            await Casting.CheckForSuccessfulCast();

            BardRoutine.RefreshVars();

            if (!Core.Me.HasTarget || !Core.Me.CurrentTarget.ThoroughCanAttack())
            {
                return(false);
            }

            if (await CustomOpenerLogic.Opener())
            {
                return(true);
            }

            if (BardRoutine.GlobalCooldown.CanWeave())
            {
                // Utility
                if (await Utility.RepellingShot())
                {
                    return(true);
                }
                if (await Utility.WardensPaean())
                {
                    return(true);
                }
                if (await Utility.NaturesMinne())
                {
                    return(true);
                }
                if (await Utility.Troubadour())
                {
                    return(true);
                }
                if (await PhysicalDps.ArmsLength(BardSettings.Instance))
                {
                    return(true);
                }
                if (await PhysicalDps.SecondWind(BardSettings.Instance))
                {
                    return(true);
                }
                if (await PhysicalDps.Interrupt(BardSettings.Instance))
                {
                    return(true);
                }

                // Damage
                if (await SingleTarget.LastPossiblePitchPerfectDuringWM())
                {
                    return(true);
                }
                if (await Songs.LetMeSingYouTheSongOfMyPeople())
                {
                    return(true);
                }
                if (await Cooldowns.RagingStrikes())
                {
                    return(true);
                }
                if (await Cooldowns.BattleVoice())
                {
                    return(true);
                }
                if (await Cooldowns.RadiantFinale())
                {
                    return(true);
                }
                if (await Cooldowns.Barrage())
                {
                    return(true);
                }
                if (await SingleTarget.PitchPerfect())
                {
                    return(true);
                }
                if (await Aoe.RainOfDeathDuringMagesBallard())
                {
                    return(true);
                }
                if (await SingleTarget.BloodletterInMagesBallard())
                {
                    return(true);
                }
                if (await SingleTarget.EmpyrealArrow())
                {
                    return(true);
                }
                if (await SingleTarget.Sidewinder())
                {
                    return(true);
                }
                if (await Aoe.RainOfDeath())
                {
                    return(true);
                }
                if (await SingleTarget.Bloodletter())
                {
                    return(true);
                }
            }

            if (await DamageOverTime.IronJawsOnCurrentTarget())
            {
                return(true);
            }
            if (await DamageOverTime.SnapShotIronJawsOnCurrentTarget())
            {
                return(true);
            }
            if (await SingleTarget.StraightShotAfterBarrage())
            {
                return(true);
            }
            if (await DamageOverTime.WindbiteOnCurrentTarget())
            {
                return(true);
            }
            if (await DamageOverTime.VenomousBiteOnCurrentTarget())
            {
                return(true);
            }
            if (await Aoe.BlastArrow())
            {
                return(true);
            }
            if (await Aoe.ApexArrow())
            {
                return(true);
            }
            if (await Aoe.ShadowBite())
            {
                return(true);
            }
            if (await DamageOverTime.IronJawsOnOffTarget())
            {
                return(true);
            }
            if (await DamageOverTime.WindbiteOnOffTarget())
            {
                return(true);
            }
            if (await DamageOverTime.VenomousBiteOnOffTarget())
            {
                return(true);
            }
            if (await Aoe.LadonsBite())
            {
                return(true);
            }
            if (await SingleTarget.StraightShot())
            {
                return(true);
            }
            return(await SingleTarget.HeavyShot());
        }
コード例 #8
0
        public static async Task <bool> Combat()
        {
            if (Core.Me.IsCasting)
            {
                return(true);
            }

            if (await Casting.TrackSpellCast())
            {
                return(true);
            }

            await Casting.CheckForSuccessfulCast();

            Utilities.Routines.Reaper.RefreshVars();

            if (!Core.Me.HasTarget || !Core.Me.CurrentTarget.ThoroughCanAttack())
            {
                if (await Utility.Soulsow())
                {
                    return(true);
                }
                return(false);
            }

            if (await CustomOpenerLogic.Opener())
            {
                return(true);
            }


            if (BotManager.Current.IsAutonomous)
            {
                if (Core.Me.HasTarget)
                {
                    Movement.NavigateToUnitLos(Core.Me.CurrentTarget, 3 + Core.Me.CurrentTarget.CombatReach);
                }
            }

            if (await Buff.FightLogic_ArcaneCrest())
            {
                return(true);
            }
            if (await Buff.FightLogic_Feint())
            {
                return(true);
            }

            if (Core.Me.HasAura(Auras.Enshrouded)) //Enshroud Mode
            {
                if (ReaperRoutine.GlobalCooldown.CanWeave(1))
                {
                    if (await Enshroud.AoE.LemuresScythe())
                    {
                        return(true);
                    }
                    if (await Enshroud.SingleTarget.LemuresSlice())
                    {
                        return(true);
                    }
                }

                if (await Enshroud.AoE.Communio())
                {
                    return(true);
                }
                if (await Enshroud.AoE.GrimReaping())
                {
                    return(true);
                }
                if (await Enshroud.SingleTarget.VoidReaping())
                {
                    return(true);
                }
                if (await Enshroud.SingleTarget.CrossReaping())
                {
                    return(true);
                }
                if (await Enshroud.SingleTarget.LemuresSliceOfFWeave())
                {
                    return(true);
                }
            }
            else
            {
                if (ReaperRoutine.GlobalCooldown.CanWeave())
                {
                    if (await PhysicalDps.Interrupt(ReaperSettings.Instance))
                    {
                        return(true);
                    }
                    if (await PhysicalDps.SecondWind(ReaperSettings.Instance))
                    {
                        return(true);
                    }
                    if (await PhysicalDps.Bloodbath(ReaperSettings.Instance))
                    {
                        return(true);
                    }
                    if (await Cooldown.ArcaneCircle())
                    {
                        return(true);
                    }
                    if (await Cooldown.Enshroud())
                    {
                        return(true);
                    }
                    if (await Cooldown.Gluttony())
                    {
                        return(true);
                    }
                    if (await AoE.GrimSwathe())
                    {
                        return(true);
                    }
                    if (await SingleTarget.BloodStalk())
                    {
                        return(true);
                    }
                    if (await Utility.TrueNorth())
                    {
                        return(true);
                    }
                }

                if (await Utility.Soulsow())
                {
                    return(true);
                }
                if (await AoE.WhorlofDeath())
                {
                    return(true);
                }
                if (await SingleTarget.ShadowOfDeath())
                {
                    return(true);
                }
                if (await AoE.HarvestMoon())
                {
                    return(true);
                }
                if (await AoE.PlentifulHarvest())
                {
                    return(true);
                }
                if (await AoE.Guillotine())
                {
                    return(true);
                }
                if (await SingleTarget.GibbetAndGallows())
                {
                    return(true);
                }
                if (await AoE.SoulScythe())
                {
                    return(true);
                }
                if (await SingleTarget.SoulSlice())
                {
                    return(true);
                }

                if (await AoE.NightmareScythe())
                {
                    return(true);
                }
                if (await SingleTarget.InfernalSlice())
                {
                    return(true);
                }
                if (await SingleTarget.WaxingSlice())
                {
                    return(true);
                }
                if (await AoE.WhorlofDeathIdle())
                {
                    return(true);
                }
                if (await AoE.SpinningScythe())
                {
                    return(true);
                }
                if (await SingleTarget.ShadowOfDeathIdle())
                {
                    return(true);
                }
                if (await SingleTarget.Slice())
                {
                    return(true);
                }
                if (await SingleTarget.HarvestMoon())
                {
                    return(true);
                }
                return(await SingleTarget.EnhancedHarpe());
            }

            return(false);
        }
コード例 #9
0
ファイル: Combat.cs プロジェクト: nishalp/MagitekRoutine
        public static async Task <bool> Execute()
        {
            Group.UpdateAllies();

            if (Core.Me.IsCasting)
            {
                return(true);
            }

            if (await Casting.TrackSpellCast())
            {
                return(true);
            }

            await Casting.CheckForSuccessfulCast();

            Globals.InParty       = PartyManager.IsInParty;
            Globals.PartyInCombat = Globals.InParty && Utilities.Combat.Enemies.Any(r => r.TaggerType == 2) || Core.Me.InCombat;
            Utilities.Routines.Bard.RefreshVars();

            if (!Core.Me.HasTarget || !Core.Me.CurrentTarget.ThoroughCanAttack())
            {
                return(false);
            }

            if (await CustomOpenerLogic.Opener())
            {
                return(true);
            }

            if (BotManager.Current.IsAutonomous)
            {
                if (Core.Me.HasTarget)
                {
                    Movement.NavigateToUnitLos(Core.Me.CurrentTarget, 20);
                }
            }

            if (Weaving.GetCurrentWeavingCounter() < 2 && Spells.HeavyShot.Cooldown.TotalMilliseconds > 650 + BaseSettings.Instance.UserLatencyOffset)
            {
                // Utility
                if (await Utility.RepellingShot())
                {
                    return(true);
                }
                if (await Utility.WardensPaean())
                {
                    return(true);
                }
                if (await Utility.NaturesMinne())
                {
                    return(true);
                }
                if (await Utility.Troubadour())
                {
                    return(true);
                }
                if (await PhysicalDps.ArmsLength(BardSettings.Instance))
                {
                    return(true);
                }
                if (await PhysicalDps.SecondWind(BardSettings.Instance))
                {
                    return(true);
                }
                if (await Utility.HeadGraze())
                {
                    return(true);
                }

                // Damage
                if (await SingleTarget.LastPossiblePitchPerfectDuringWM())
                {
                    return(true);
                }
                if (await Songs.LetMeSingYouTheSongOfMyPeople())
                {
                    return(true);
                }
                if (await Cooldowns.BattleVoice())
                {
                    return(true);
                }
                if (await Cooldowns.RagingStrikes())
                {
                    return(true);
                }
                if (await Cooldowns.Barrage())
                {
                    return(true);
                }
                if (await SingleTarget.PitchPerfect())
                {
                    return(true);
                }
                if (await Aoe.RainOfDeathDuringMagesBallard())
                {
                    return(true);
                }
                if (await SingleTarget.BloodletterInMagesBallard())
                {
                    return(true);
                }
                if (await SingleTarget.EmpyrealArrow())
                {
                    return(true);
                }
                if (await Aoe.ShadowBite())
                {
                    return(true);
                }
                if (await SingleTarget.Sidewinder())
                {
                    return(true);
                }
                if (await Aoe.RainOfDeath())
                {
                    return(true);
                }
                if (await SingleTarget.Bloodletter())
                {
                    return(true);
                }
            }

            if (await SingleTarget.StraightShotAfterBarrage())
            {
                return(true);
            }
            if (await DamageOverTime.IronJawsOnCurrentTarget())
            {
                return(true);
            }
            if (await DamageOverTime.SnapShotIronJawsOnCurrentTarget())
            {
                return(true);
            }
            if (await DamageOverTime.WindbiteOnCurrentTarget())
            {
                return(true);
            }
            if (await DamageOverTime.VenomousBiteOnCurrentTarget())
            {
                return(true);
            }
            if (await Aoe.ApexArrow())
            {
                return(true);
            }
            if (await DamageOverTime.IronJawsOnOffTarget())
            {
                return(true);
            }
            if (await DamageOverTime.WindbiteOnOffTarget())
            {
                return(true);
            }
            if (await DamageOverTime.VenomousBiteOnOffTarget())
            {
                return(true);
            }
            if (await Aoe.QuickNock())
            {
                return(true);
            }
            if (await SingleTarget.StraightShot())
            {
                return(true);
            }
            return(await SingleTarget.HeavyShot());
        }
コード例 #10
0
ファイル: Machinist.cs プロジェクト: hyskylord/MagitekRoutine
        public static async Task <bool> Combat()
        {
            if (BotManager.Current.IsAutonomous)
            {
                if (Core.Me.HasTarget)
                {
                    Movement.NavigateToUnitLos(Core.Me.CurrentTarget, 20 + Core.Me.CurrentTarget.CombatReach);
                }
            }

            if (!Core.Me.HasTarget || !Core.Me.CurrentTarget.ThoroughCanAttack())
            {
                return(false);
            }

            if (await CustomOpenerLogic.Opener())
            {
                return(true);
            }

            if (MachinistSettings.Instance.UseFlamethrower && Core.Me.HasAura(Auras.Flamethrower))
            {
                // First check movement otherwise Flamethrower can be executed whereas you are moving
                if (MovementManager.IsMoving)
                {
                    return(false);
                }

                if (!MachinistSettings.Instance.UseFlamethrower)
                {
                    return(true);
                }

                if (Core.Me.EnemiesInCone(8) >= MachinistSettings.Instance.FlamethrowerEnemyCount)
                {
                    return(true);
                }
            }

            if (ActionResourceManager.Machinist.OverheatRemaining != TimeSpan.Zero)
            {
                if (MachinistRoutine.GlobalCooldown.CanWeave(1))
                {
                    //Utility
                    if (await PhysicalDps.ArmsLength(MachinistSettings.Instance))
                    {
                        return(true);
                    }
                    if (await PhysicalDps.Interrupt(MachinistSettings.Instance))
                    {
                        return(true);
                    }

                    //Pets
                    if (await Pet.RookQueen())
                    {
                        return(true);
                    }

                    //Cooldowns
                    if (await Cooldowns.BarrelStabilizer())
                    {
                        return(true);
                    }

                    //oGCDs
                    if (await SingleTarget.GaussRound())
                    {
                        return(true);
                    }
                    if (await MultiTarget.Ricochet())
                    {
                        return(true);
                    }

                    //Cooldowns
                    if (await Cooldowns.Reassemble())
                    {
                        return(true);
                    }
                }
            }
            else
            {
                if (MachinistRoutine.GlobalCooldown.CanWeave())
                {
                    //Utility
                    if (await Utility.Tactician())
                    {
                        return(true);
                    }
                    if (await PhysicalDps.ArmsLength(MachinistSettings.Instance))
                    {
                        return(true);
                    }
                    if (await PhysicalDps.SecondWind(MachinistSettings.Instance))
                    {
                        return(true);
                    }
                    if (await PhysicalDps.Interrupt(MachinistSettings.Instance))
                    {
                        return(true);
                    }

                    //Pets
                    if (await Pet.RookQueen())
                    {
                        return(true);
                    }
                    if (await Pet.RookQueenOverdrive())
                    {
                        return(true);
                    }

                    //Cooldowns
                    if (await Cooldowns.Wildfire())
                    {
                        return(true);
                    }
                    if (await Cooldowns.Hypercharge())
                    {
                        return(true);
                    }
                    if (await Cooldowns.Reassemble())
                    {
                        return(true);
                    }
                    if (await Cooldowns.BarrelStabilizer())
                    {
                        return(true);
                    }

                    //oGCDs
                    if (await SingleTarget.GaussRound())
                    {
                        return(true);
                    }
                    if (await MultiTarget.Ricochet())
                    {
                        return(true);
                    }
                }
            }

            //GCDs - Top Hypercharge Priority
            if (await MultiTarget.AutoCrossbow())
            {
                return(true);
            }
            if (await SingleTarget.HeatBlast())
            {
                return(true);
            }

            //Use On CD
            if (await MultiTarget.ChainSaw())
            {
                return(true);
            }
            if (await MultiTarget.BioBlaster())
            {
                return(true);
            }
            if (await SingleTarget.Drill())
            {
                return(true);
            }
            if (await SingleTarget.HotAirAnchor())
            {
                return(true);
            }
            if (await MultiTarget.Flamethrower())
            {
                return(true);
            }
            if (await MultiTarget.Scattergun())
            {
                return(true);
            }

            //Default Combo
            if (await SingleTarget.HeatedCleanShot())
            {
                return(true);
            }
            if (await SingleTarget.HeatedSlugShot())
            {
                return(true);
            }

            return(await SingleTarget.HeatedSplitShot());
        }
コード例 #11
0
ファイル: Ninja.cs プロジェクト: newb23/MagitekRoutine
        public static async Task <bool> Combat()
        {
            Utilities.Routines.Ninja.RefreshVars();
            //Logger.Write("Ninki:" + Utilities.Routines.Ninja.ninki);
            if (BotManager.Current.IsAutonomous)
            {
                Movement.NavigateToUnitLos(Core.Me.CurrentTarget, 3 + Core.Me.CurrentTarget.CombatReach);
            }

            if (!SpellQueueLogic.SpellQueue.Any())
            {
                SpellQueueLogic.InSpellQueue = false;
            }

            if (SpellQueueLogic.SpellQueue.Any())
            {
                if (await SpellQueueLogic.SpellQueueMethod())
                {
                    return(true);
                }
            }

            if (!Core.Me.HasTarget || !Core.Me.CurrentTarget.ThoroughCanAttack())
            {
                return(false);
            }

            if (await CustomOpenerLogic.Opener())
            {
                return(true);
            }

            if (!Core.Me.HasTarget || !Core.Me.CurrentTarget.ThoroughCanAttack())
            {
                return(false);
            }

            if (await PhysicalDps.Interrupt(NinjaSettings.Instance))
            {
                return(true);
            }

            //if (Core.Me.HasAura(Auras.TenChiJin))
            //{
            //    Logger.Error("Capturd TCJ");
            //    //Let's check which TCJ we will do. 1=Suiton/2-Doton
            //    if (Utilities.Routines.Ninja.AoeEnemies5Yards > 1 && Utilities.Routines.Ninja.TCJState == 0 && !Core.Me.HasAura(Auras.Doton))
            //    {
            //        Utilities.Routines.Ninja.TCJState = 2;
            //    }
            //    if (Utilities.Routines.Ninja.AoeEnemies5Yards < 2 && Utilities.Routines.Ninja.TCJState == 0)
            //    {
            //        Utilities.Routines.Ninja.TCJState = 1;
            //    }

            //    if (Utilities.Routines.Ninja.TCJState == 1)
            //    {
            //        if (Casting.LastSpell == Spells.Chi)
            //        {
            //            Utilities.Routines.Ninja.TCJState = 0;
            //            return await Spells.Jin.Cast(Core.Me.CurrentTarget);
            //        }

            //        if (Casting.LastSpell == Spells.Ten)
            //        {
            //            return await Spells.Chi.Cast(Core.Me.CurrentTarget);
            //        }

            //        return await Spells.Ten.Cast(Core.Me.CurrentTarget);
            //    }

            //    if (Utilities.Routines.Ninja.TCJState == 2)
            //    {
            //        if (Casting.LastSpell == Spells.Jin)
            //        {
            //            Utilities.Routines.Ninja.TCJState = 0;
            //            return await Spells.Chi.Cast(Core.Me);
            //        }

            //        if (Casting.LastSpell == Spells.Ten)
            //        {
            //            return await Spells.Jin.Cast(Core.Me.CurrentTarget);
            //        }

            //        return await Spells.Ten.Cast(Core.Me.CurrentTarget);
            //    }
            //}
            if (Ninjutsu.ForceRaiton())
            {
                return(true);
            }
            if (Spells.SpinningEdge.Cooldown.TotalMilliseconds > 650)
            {
                //Utility Force Toggle
                if (await PhysicalDps.ArmsLength(NinjaSettings.Instance))
                {
                    return(true);
                }
                if (await Utility.SecondWindForce())
                {
                    return(true);
                }
                if (await Utility.ShadeShift())
                {
                    return(true);
                }
                if (await Utility.TrueNorth())
                {
                    return(true);
                }
                if (await Utility.Feint())
                {
                    return(true);
                }
                if (await Utility.BloodBath())
                {
                    return(true);
                }

                if (await PhysicalDps.SecondWind(NinjaSettings.Instance))
                {
                    return(true);
                }

                //if (await PhysicalDps.SecondWind(NinjaSettings.Instance)) return true;
                if (await SingleTarget.TrickAttack())
                {
                    return(true);
                }
                if (await Ninjutsu.TenChiJin())
                {
                    return(true);
                }
                if (await Buff.Meisui())
                {
                    return(true);
                }
                //if (await Buff.TrueNorth()) return true;
                //if (await Buff.ShadeShift()) return true;
                if (await Buff.Bunshin())
                {
                    return(true);
                }
                if (await SingleTarget.Assassinate())
                {
                    return(true);
                }
                if (await Aoe.HellfrogMedium())
                {
                    return(true);
                }
                if (await SingleTarget.Bhavacakra())
                {
                    return(true);
                }
                if (await SingleTarget.Mug())
                {
                    return(true);
                }
                if (await Buff.Kassatsu())
                {
                    return(true);
                }
                if (await SingleTarget.DreamWithinADream())
                {
                    return(true);
                }
            }
            if (await SingleTarget.ShadowFang())
            {
                return(true);
            }

            //Ninjutsu
            if (NinjutsuCheck())
            {
                if (Ninjutsu.Huton())
                {
                    return(true);
                }
                if (Ninjutsu.GokaMekkyaku())
                {
                    return(true);
                }
                if (Ninjutsu.Doton())
                {
                    return(true);
                }
                if (Ninjutsu.Katon())
                {
                    return(true);
                }
                if (Ninjutsu.Suiton())
                {
                    return(true);
                }
                if (Ninjutsu.HyoshoRanryu())
                {
                    return(true);
                }
                if (Ninjutsu.Raiton())
                {
                    return(true);
                }
                //if (Ninjutsu.FumaShuriken()) return true;
            }

            if (await Aoe.HakkeMujinsatsu())
            {
                return(true);
            }
            if (await Aoe.DeathBlossom())
            {
                return(true);
            }
            if (await SingleTarget.ArmorCrush())
            {
                return(true);
            }
            if (await SingleTarget.AeolianEdge())
            {
                return(true);
            }
            if (await SingleTarget.GustSlash())
            {
                return(true);
            }
            return(await SingleTarget.SpinningEdge());
        }
コード例 #12
0
ファイル: Combat.cs プロジェクト: CimmeriaCode/MagitekRoutine
        public static async Task <bool> Execute()
        {
            if (BotManager.Current.IsAutonomous)
            {
                if (Core.Me.HasTarget)
                {
                    Movement.NavigateToUnitLos(Core.Me.CurrentTarget, 23);
                }
            }

            if (!Core.Me.HasTarget || !Core.Me.CurrentTarget.ThoroughCanAttack())
            {
                return(false);
            }

            if (await CustomOpenerLogic.Opener())
            {
                return(true);
            }

            if (MachinistSettings.Instance.UseFlameThrower && Core.Me.HasAura(Auras.Flamethrower))
            {
                // Did someone use this manually? Make sure we don't cancel it...
                if (!MachinistSettings.Instance.UseFlameThrower)
                {
                    return(true);
                }

                if (MovementManager.IsMoving)
                {
                    return(false);
                }

                // Keep using it for the AOE benefit if we need to
                if (Core.Me.EnemiesInCone(8) >= MachinistSettings.Instance.FlamethrowerEnemies)
                {
                    return(true);
                }
            }

            if (await PhysicalDps.SecondWind(MachinistSettings.Instance))
            {
                return(true);
            }
            if (await PhysicalDps.Interrupt(MachinistSettings.Instance))
            {
                return(true);
            }

            if (Utilities.Routines.Machinist.OnGcd)
            {
                if (await Buff.BarrelStabilizer())
                {
                    return(true);
                }
                if (await Buff.Wildfire())
                {
                    return(true);
                }
                if (await Buff.Hypercharge())
                {
                    return(true);
                }
                if (await Turret.AutomationQueen())
                {
                    return(true);
                }
                if (await Turret.Rook())
                {
                    return(true);
                }
                if (await Aoe.Flamethrower())
                {
                    return(true);
                }
                if (await Buff.Reassemble())
                {
                    return(true);
                }
                if (await SingleTarget.GaussRound())
                {
                    return(true);
                }

                if (MachinistSettings.Instance.UseAoe)
                {
                    if (await Aoe.Ricochet())
                    {
                        return(true);
                    }
                }

                if (await Buff.Tactician())
                {
                    return(true);
                }
                return(true);
            }

            if (MachinistSettings.Instance.UseAoe)
            {
                if (Core.Me.EnemiesInCone(12) < MachinistSettings.Instance.AoeEnemies)
                {
                    if (await Aoe.Bioblaster())
                    {
                        return(true);
                    }
                    if (await SingleTarget.Drill())
                    {
                        return(true);
                    }
                }
            }

            if (await SingleTarget.AirAnchor())
            {
                return(true);
            }
            if (await SingleTarget.HeatBlast())
            {
                return(true);
            }

            if (MachinistSettings.Instance.UseAoe)
            {
                if (await Aoe.AutoCrossbow())
                {
                    return(true);
                }
                if (await Aoe.SpreadShot())
                {
                    return(true);
                }
            }

            if (await SingleTarget.HotShot())
            {
                return(true);
            }
            if (await SingleTarget.CleanShot())
            {
                return(true);
            }
            if (await SingleTarget.SlugShot())
            {
                return(true);
            }
            return(await SingleTarget.SplitShot());
        }
コード例 #13
0
        public static async Task <bool> Execute()
        {
            Group.UpdateAllies();

            if (Core.Me.IsCasting)
            {
                return(true);
            }

            if (await Casting.TrackSpellCast())
            {
                return(true);
            }

            await Casting.CheckForSuccessfulCast();

            Globals.InParty       = PartyManager.IsInParty;
            Globals.PartyInCombat = Globals.InParty && Utilities.Combat.Enemies.Any(r => r.TaggerType == 2);
            Utilities.Routines.Bard.RefreshVars();

            if (!Core.Me.HasTarget || !Core.Me.CurrentTarget.ThoroughCanAttack())
            {
                return(false);
            }

            if (await CustomOpenerLogic.Opener())
            {
                return(true);
            }

            if (BotManager.Current.IsAutonomous)
            {
                if (Core.Me.HasTarget)
                {
                    Movement.NavigateToUnitLos(Core.Me.CurrentTarget, 20);
                }
            }

            if (await PhysicalDps.SecondWind(BardSettings.Instance))
            {
                return(true);
            }
            if (await Buff.NaturesMinne())
            {
                return(true);
            }
            if (await Dispel.Execute())
            {
                return(true);
            }

            if (await Dot.IronJaws())
            {
                return(true);
            }
            if (await Buff.BattleVoice())
            {
                return(true);
            }
            if (await Buff.RagingStrikes())
            {
                return(true);
            }
            if (await SingleTarget.RefulgentBarrage())
            {
                return(true);
            }
            if (await SingleTarget.StraightShot())
            {
                return(true);
            }
            if (await SingleTarget.EmpyrealArrow())
            {
                return(true);
            }
            if (await SingleTarget.PitchPerfect())
            {
                return(true);
            }

            if (Utilities.Routines.Bard.OnGcd)
            {
                if (await Songs.Sing())
                {
                    return(true);
                }
                if (await SingleTarget.SidewinderAndShadowbite())
                {
                    return(true);
                }
                if (await Aoe.RainOfDeath())
                {
                    return(true);
                }
                if (await SingleTarget.Bloodletter())
                {
                    return(true);
                }
                if (await SingleTarget.RepellingShot())
                {
                    return(true);
                }
                if (await SingleTarget.Feint())
                {
                    return(true);
                }
            }

            if (await Aoe.ApexArrow())
            {
                return(true);
            }
            if (await Aoe.QuickNock())
            {
                return(true);
            }
            if (await Dot.Windbite())
            {
                return(true);
            }
            if (await Dot.VenomousBite())
            {
                return(true);
            }
            if (await Dot.DotMultipleTargets())
            {
                return(true);
            }
            return(await SingleTarget.HeavyShot());
        }
コード例 #14
0
        public static async Task <bool> Combat()
        {
            if (BotManager.Current.IsAutonomous)
            {
                if (Core.Me.HasTarget)
                {
                    Movement.NavigateToUnitLos(Core.Me.CurrentTarget, 3 + Core.Me.CurrentTarget.CombatReach);
                }
            }

            if (!Core.Me.HasTarget && !Core.Me.InCombat)
            {
                return(false);
            }

            if (!Core.Me.CurrentTarget.ThoroughCanAttack())
            {
                return(false);
            }

            if (await CustomOpenerLogic.Opener())
            {
                return(true);
            }


            #region Off GCD debugging
            if (DragoonRoutine.JumpsList.Contains(Casting.LastSpell))
            {
                // Check to see if we're OFF GCD
                if (Spells.TrueThrust.Cooldown == TimeSpan.Zero)
                {
                    // Start the stopwatch if it isn't running
                    if (!JumpGcdTimer.IsRunning)
                    {
                        JumpGcdTimer.Restart();
                    }
                }
            }
            else
            {
                // We didn't use a Jump last, check to see if the stopwatch is running
                if (JumpGcdTimer.IsRunning)
                {
                    // We'll give a 50ms buffer for the time it takes to tick
                    if (JumpGcdTimer.ElapsedMilliseconds > 50)
                    {
                        Logger.WriteInfo($@"We wasted {JumpGcdTimer.ElapsedMilliseconds} ms off GCD");
                    }

                    // Stop the stopwatch
                    JumpGcdTimer.Stop();
                }
            }
            #endregion

            //Utility
            if (await PhysicalDps.Interrupt(DragoonSettings.Instance))
            {
                return(true);
            }
            if (await PhysicalDps.SecondWind(DragoonSettings.Instance))
            {
                return(true);
            }
            if (await PhysicalDps.Bloodbath(DragoonSettings.Instance))
            {
                return(true);
            }

            if (DragoonRoutine.GlobalCooldown.CanWeave() && !DragoonRoutine.SingleWeaveJumpsList.Contains(Casting.LastSpell))
            {
                //Buffs
                if (await Buff.ForceDragonSight())
                {
                    return(true);
                }
                if (await Buff.LanceCharge())
                {
                    return(true);
                }
                if (await Buff.DragonSight())
                {
                    return(true);
                }
                if (await Buff.BattleLitany())
                {
                    return(true);
                }
                if (await Buff.LifeSurge())
                {
                    return(true);
                }
                if (await Utility.TrueNorth())
                {
                    return(true);
                }

                //oGCD - Jump
                if (await Aoe.WyrmwindThrust())
                {
                    return(true);
                }
                if (await Jumps.MirageDive())
                {
                    return(true);                          //DoubleWeave
                }
                if (await Aoe.Geirskogul())
                {
                    return(true);
                }
                if (await Aoe.Nastrond())
                {
                    return(true);
                }

                if (DragoonRoutine.GlobalCooldown.CanWeave(1))
                {
                    if (await Jumps.HighJump())
                    {
                        return(true);                         //SingleWeave
                    }
                    if (await Jumps.DragonfireDive())
                    {
                        return(true);                              //SingleWeave
                    }
                    if (await Jumps.SpineshatterDive())
                    {
                        return(true);                                //SingleWeave
                    }
                    if (await Jumps.Stardiver())
                    {
                        return(true);                         //SingleWeave
                    }
                }
            }

            if (await Aoe.DraconianFury())
            {
                return(true);
            }
            if (await Aoe.CoerthanTorment())
            {
                return(true);
            }
            if (await Aoe.SonicThrust())
            {
                return(true);
            }
            if (await Aoe.DoomSpike())
            {
                return(true);
            }

            if (await SingleTarget.RaidenThrust())
            {
                return(true);
            }

            // Combo 2
            if (await SingleTarget.FangAndClaw())
            {
                return(true);
            }
            if (await SingleTarget.HeavensThrust())
            {
                return(true);
            }
            if (await SingleTarget.VorpalThrust())
            {
                return(true);
            }

            // Combo 1 + DOT
            if (await SingleTarget.WheelingThrust())
            {
                return(true);
            }
            if (await SingleTarget.ChaoticSpring())
            {
                return(true);
            }
            if (await SingleTarget.Disembowel())
            {
                return(true);
            }

            return(await SingleTarget.TrueThrust());
        }