public static async Task <bool> RotationSelector() { // we are playing manual, i am not alive, or I am mounted or on taxi, do not continue if (HK.manualOn || !Me.IsAlive || (Me.OnTaxi)) { return(true); } // face taret, ensure melee, interrupt and taunt do not need to return as they are off of global cooldown. await C.FaceTarget(CurrentTarget); await C.EnsureMeleeRange(CurrentTarget); await InterruptTarget(); if (await S.GCD(SB.Torment, C.CombatColor, !CurrentTarget.IsTargetingMeOrPet && VS.VengeanceAllowTaunt, string.Format($"CT:{CurrentTarget.SafeName} not targeting me. Taunting!"))) { return(true); } if (CurrentTarget.IsValidCombatUnit()) { if (await ActiveMitigation()) { return(true); } if (await GapCloser()) { return(true); } if ((HK.VengeanceAoEOn || U.activeEnemies(Me.Location, 8f).Count() >= 3)) { if (await MultipleTarget()) { return(true); } } // default to single target if nothing else return(await SingleTarget()); } return(false); }
//private static Stopwatch _check = new Stopwatch(); public override void Pulse() { if (!StyxWoW.IsInGame || !StyxWoW.IsInWorld || Me == null || !Me.IsValid || !Me.IsAlive || Me.Mounted || HK.manualOn) { return; } if (!Me.Combat) { return; } // if we have an oppsing faction, then clear the target. if (U.isOpposingFaction(Me.CurrentTarget) && GeneralSettings.Instance.GeneralIgnoreOpposingFaction) { Me.ClearTarget(); } // cache a few things like my fury/pain C.Cache(); // grab all enemies within 50 yards to find a valid target U.enemyAnnex(50f); // make sure we aren't using fel devastation or something before we try to grab targets for no good reason. if (!Me.IsCasting || !Me.IsChanneling) { // grab an interrupt target if (GetInterruptTarget()) { return; } // get a taunt target, if any if (GetTauntTarget()) { return; } // get a new target, if any if (GetNewTarget()) { return; } } }
public static async Task <bool> Pull() { if (CurrentTarget.IsValidCombatUnit()) { await C.EnsureMeleeRange(CurrentTarget); await C.FaceTarget(CurrentTarget); if (await S.Cast(SB.ThrowGlaive, C.CombatColor, CurrentTarget.Distance <= 30, "Pull - GlaiveTimer: " + glaiveTossTimer.ElapsedMilliseconds + "ms")) { glaiveTossTimer.Restart(); return(true); } // use to engage if you have the charges to do so if (await S.CastGround(SB.InfernalStrike, C.CombatColor, VS.VengeanceCombatInfernalStrikePull && CurrentTarget.Distance <= infernalStrikeRange && !CurrentTarget.IsWithinMeleeRangeOf(Me) && !VS.VengeancePreferPullWithFelblade , "Pull")) { return(true); } // need to change this to check to see if we want to pull with Fel Blade or Infernal Strike (or which we prefer) if (await S.Cast(SB.FelBlade, C.CombatColor, T.VengeanceFelblade && !CurrentTarget.IsWithinMeleeRangeOf(Me) && CurrentTarget.Distance <= 15, "Pull")) { return(true); } // now use in case felblade was on cd, but don't check prefer if (await S.CastGround(SB.InfernalStrike, C.CombatColor, CurrentTarget.Distance <= infernalStrikeRange && VS.VengeanceCombatInfernalStrikePull && !CurrentTarget.IsWithinMeleeRangeOf(Me) , "Pull")) { return(true); } } return(false); }
public static async Task <bool> Pull() { if (CurrentTarget.IsValidCombatUnit()) { if (!CurrentTarget.IsWithinMeleeRangeOf(Me) && GS.GeneralMovement) { //L.infoLog("Tried to pull"); await C.EnsureMeleeRange(CurrentTarget); } if (GS.GeneralFacing) { // check to see if we need to face target await C.FaceTarget(CurrentTarget); } // throw a glaive first if (await S.Cast(SB.ThrowGlaive, C.CombatColor, CurrentTarget.Distance <= 30)) { return(true); } if (await S.Cast(SB.FelBlade, C.CombatColor, CurrentTarget.Distance <= 15)) { return(true); } // use to engage return(await S.GCD(SB.FelRush, C.CombatColor, CurrentTarget.Distance <= 20 && HS.HavocFelRushOnPull)); } return(true); }
public static async Task <bool> RotationSelector() { // we are playing manual, i am not alive, or I am mounted or on taxi, do not continue if (HK.manualOn || !Me.IsAlive || (Me.OnTaxi) || Me.IsCasting || Me.IsChanneling) { return(true); } // if I // i don't want facing to interfere with vengeful retreat opener. if (openingRotationSkillsUsed != OpenerSteps.FaceAwayFromTarget && openingRotationSkillsUsed != OpenerSteps.VengefulRetreat) { if (GS.GeneralFacing) { // check to see if we need to face target await C.FaceTarget(CurrentTarget); } } if (GS.GeneralMovement) { // ensure we are in melee range and not too close await C.EnsureMeleeRange(CurrentTarget); } if (CurrentTarget.IsValidCombatUnit()) { if (await OpeningRotationSingleTarget()) { return(true); } #region Offensive Hotkey if (HK.HavocOffensiveOn) { // we have offensive cooldowns enabled, let's use them if they are available first. if (await I.UseItem(I.GetItemByID(HS.HavocHealthPotionID), HKS.HotkeyHavocOffensiveAgilityPotion)) { return(true); } if (await S.Cast(SB.MetamorphosisSpell, C.CombatColor, HKS.HotkeyHavocOffensiveMetamorphosis)) { return(true); } if (await S.Cast(SB.FuryOfTheIllidari, C.CombatColor, HKS.HotkeyHavocOffensiveFoTI)) { return(true); } if (await S.Cast(SB.Nemesis, C.CombatColor, HKS.HotkeyHavocOffensiveNemesis)) { return(true); } if (await S.Cast(SB.ChaosBlades, C.CombatColor, HKS.HotkeyHavocOffensiveChaosBlades)) { return(true); } } #endregion // see if we need any defensive cooldowns if (await SaveMe()) { return(true); } if ((HK.HavocAoEOn || U.activeEnemies(Me.Location, 8f).Count() >= 2)) { // try to use aoe abilities if (await AoE(U.activeEnemies(Me.Location, 8f).Count())) { return(true); } // we were supposed to aoe, but nothing to use for aoe (or jumped back out of melee), so use single target if (await AoEDashing(U.activeEnemies(Me.Location, 8f).Count())) { return(true); } } // default to single target if nothing else return(await SingleTarget()); } return(false); }