Exemplo n.º 1
0
        public static async Task <bool> PitchPerfect()
        {
            if (!BardSettings.Instance.UsePitchPerfect)
            {
                return(false);
            }

            if (!Spells.PitchPerfect.IsReady())
            {
                return(false);
            }

            if (ActionResourceManager.Bard.ActiveSong != BardSong.WanderersMinuet)
            {
                return(false);
            }

            if (ActionResourceManager.Bard.Repertoire == 0)
            {
                return(false);
            }

            if (BardRoutine.NextTickUnderCurrentSong() < 550)
            {
                return(await Spells.PitchPerfect.Cast(Core.Me.CurrentTarget));
            }

            if (ActionResourceManager.Bard.Repertoire < BardSettings.Instance.UsePitchPerfectAtRepertoire)
            {
                return(false);
            }

            return(await Spells.PitchPerfect.Cast(Core.Me.CurrentTarget));
        }
Exemplo n.º 2
0
        public static async Task <bool> ApexArrow()
        {
            if (!BardSettings.Instance.UseApexArrow)
            {
                return(false);
            }

            if (BardSettings.Instance.UseBuffedApexArrow)
            {
                //Delay to use it inside Burst windows
                if (Spells.RagingStrikes.IsKnownAndReady(7000))
                {
                    return(false);
                }

                //Use Apex in Buff windows under WM and delay it as much as possible at the end of buff
                if (BardSong.WanderersMinuet.Equals(ActionResourceManager.Bard.ActiveSong) &&
                    Core.Me.HasAura(Auras.RagingStrikes) && Core.Me.HasAura(Auras.RadiantFinale) && Core.Me.HasAura(Auras.BattleVoice))
                {
                    if (ActionResourceManager.Bard.SoulVoice == 100)
                    {
                        return(await Spells.ApexArrow.Cast(Core.Me.CurrentTarget));
                    }

                    if (BardRoutine.CheckCurrentDamageIncrease(BardSettings.Instance.UseBuffedApexArrowWithAtLeastXBonusDamage) &&
                        ActionResourceManager.Bard.SoulVoice >= BardSettings.Instance.UseBuffedApexArrowWithAtLeastXSoulVoice &&
                        (Core.Me.Auras.Any(x => x.Id == Auras.RagingStrikes && x.TimespanLeft.TotalMilliseconds < 6000) ||
                         Core.Me.Auras.Any(x => x.Id == Auras.RadiantFinale && x.TimespanLeft.TotalMilliseconds < 6000) ||
                         Core.Me.Auras.Any(x => x.Id == Auras.BattleVoice && x.TimespanLeft.TotalMilliseconds < 6000)))
                    {
                        return(await Spells.ApexArrow.Cast(Core.Me.CurrentTarget));
                    }
                }

                //Force Apex in MB at 22sec if soulgauge >= 80
                if (BardSong.MagesBallad.Equals(ActionResourceManager.Bard.ActiveSong) &&
                    (ActionResourceManager.Bard.SoulVoice == 100 || ActionResourceManager.Bard.SoulVoice >= 80 && ActionResourceManager.Bard.Timer.TotalMilliseconds - Spells.HeavyShot.Cooldown.TotalMilliseconds - 24000 <= 1))
                {
                    if (await Spells.ApexArrow.Cast(Core.Me.CurrentTarget))
                    {
                        Logger.WriteInfo($@"[ApexArrow] Execution with SoulVoice = {ActionResourceManager.Bard.SoulVoice} at {ActionResourceManager.Bard.Timer.TotalMilliseconds}");
                        return(true);
                    }
                }
                return(false);
            }

            if (ActionResourceManager.Bard.SoulVoice < BardSettings.Instance.UseApexArrowWithAtLeastXSoulVoice)
            {
                return(false);
            }

            return(await Spells.ApexArrow.Cast(Core.Me.CurrentTarget));
        }
Exemplo n.º 3
0
        public static async Task <bool> EmpyrealArrow()
        {
            if (!BardSettings.Instance.UseEmpyrealArrow)
            {
                return(false);
            }

            if (!Spells.EmpyrealArrow.IsKnown())
            {
                return(false);
            }

            switch (ActionResourceManager.Bard.ActiveSong)
            {
            case BardSong.None:
                return(false);

            case BardSong.MagesBallad:
                if (Spells.Bloodletter.Cooldown == TimeSpan.Zero)
                {
                    return(false);
                }
                break;

            case BardSong.WanderersMinuet:
                if (ActionResourceManager.Bard.Repertoire == 3)
                {
                    return(false);
                }

                if (ActionResourceManager.Bard.Repertoire == 0 &&
                    BardRoutine.CurrentSongDuration() <= 1000 &&
                    BardRoutine.NextTickUnderCurrentSong() <= 0)
                {
                    return(false);
                }
                break;

            case BardSong.ArmysPaeon:
                if (BardSettings.Instance.CurrentSongPlaylist == SongStrategyEnum.WM_MB_AP)
                {
                    if (BardRoutine.CurrentSongDuration() <= BardSettings.Instance.DontUseEmpyrealArrowWhenSongEndsInXSeconds)
                    {
                        return(false);
                    }
                }
                break;

            default:
                break;
            }
            return(await Spells.EmpyrealArrow.Cast(Core.Me.CurrentTarget));
        }
Exemplo n.º 4
0
        public static async Task <bool> Pull()
        {
            BardRoutine.RefreshVars();

            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();

            return(await Combat());
        }
Exemplo n.º 5
0
        public static async Task <bool> LastPossiblePitchPerfectDuringWM()
        {
            if (!BardSettings.Instance.UsePitchPerfect)
            {
                return(false);
            }

            if (!Spells.PitchPerfect.IsReady())
            {
                return(false);
            }

            if (!BardSong.WanderersMinuet.Equals(ActionResourceManager.Bard.ActiveSong))
            {
                return(false);
            }

            if (BardRoutine.NextTickUnderCurrentSong() > 500)
            {
                return(false);
            }

            return(await Spells.PitchPerfect.Cast(Core.Me.CurrentTarget));
        }
Exemplo n.º 6
0
        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());
        }