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