Untitled diff
573 lines
//In trunk
//Modified
using System;
using System;
using System.Linq;
using System.Linq;
using Trinity.Config.Combat;
using Trinity.Config.Combat;
using Trinity.Reference;
using Trinity.Reference;
using Trinity.Technicals;
using Trinity.Technicals;
using Zeta.Bot;
using Zeta.Bot;
using Zeta.Common;
using Zeta.Common;
using Zeta.Game;
using Zeta.Game;
using Zeta.Game.Internals.Actors;
using Zeta.Game.Internals.Actors;
using Zeta.Game.Internals.SNO;
using Zeta.Game.Internals.SNO;
using Logger = Trinity.Technicals.Logger;
using Logger = Trinity.Technicals.Logger;
namespace Trinity.Combat.Abilities
namespace Trinity.Combat.Abilities
{
{
    class BarbarianCombat : CombatBase
    class BarbarianCombat : CombatBase
    {
    {
        private static bool _allowSprintOoc = true;
        private static bool _allowSprintOoc = true;
        private const float MaxFuriousChargeDistance = 300f;
        private const float MaxFuriousChargeDistance = 70f;
        private static TrinityPower QueuedPower { get; set; }
        private static TrinityPower QueuedPower { get; set; }
        public static TrinityPower GetPower()
        public static TrinityPower GetPower()
        {
        {
            if (UseDestructiblePower)
            if (UseDestructiblePower)
                return DestroyObjectPower;
                return DestroyObjectPower;
            if (UseOOCBuff)
            if (UseOOCBuff)
            {
            {
                // Call of The Ancients
                // Call of The Ancients
                if (CanUseCallOfTheAncients && Sets.ImmortalKingsCall.IsFullyEquipped)
                if (CanUseCallOfTheAncients && Sets.ImmortalKingsCall.IsFullyEquipped)
                    return PowerCallOfTheAncients;
                    return PowerCallOfTheAncients;
                // Sprint OOC
                // Sprint OOC
                if (CanUseSprintOOC)
                if (CanUseSprintOOC)
                    return PowerSprint;
                    return PowerSprint;
            }
            }
            else
            else
            {
            {
                if (QueuedPower != null && !Player.IsIncapacitated && PowerManager.CanCast(QueuedPower.SNOPower) && !Player.IsCastingOrLoading)
                if (QueuedPower != null && !Player.IsIncapacitated && PowerManager.CanCast(QueuedPower.SNOPower) && !Player.IsCastingOrLoading)
                {
                {
                    Logger.LogVerbose(LogCategory.Behavior, "Casting Queued Power {0}", QueuedPower);
                    Logger.LogVerbose(LogCategory.Behavior, "Casting Queued Power {0}", QueuedPower);
                    var next = QueuedPower;
                    var next = QueuedPower;
                    QueuedPower.MaxFailedCastReTryAttempts = 5;
                    QueuedPower.MaxFailedCastReTryAttempts = 5;
                    QueuedPower.WaitBeforeUseDelay = 750;
                    QueuedPower.WaitBeforeUseDelay = 750;
                    QueuedPower = null;
                    QueuedPower = null;
                    return next;
                    return next;
                }
                }
            }
            }
            // Ignore Pain when near Frozen
            // Ignore Pain when near Frozen
            if ((ZetaDia.Me.IsFrozen || ZetaDia.Me.IsRooted || Trinity.ObjectCache.Any(o => o.AvoidanceType == AvoidanceType.IceBall)) && CanCastIgnorePain)
            if ((ZetaDia.Me.IsFrozen || ZetaDia.Me.IsRooted || Trinity.ObjectCache.Any(o => o.AvoidanceType == AvoidanceType.IceBall)) && CanCastIgnorePain)
            {
            {
                Logger.Log("Used Ignore Pain to prevent Frozen");
                Logger.Log("Used Ignore Pain to prevent Frozen");
                return PowerIgnorePain;
                return PowerIgnorePain;
            }
            }
            if (!UseOOCBuff)
            if (!UseOOCBuff)
            {
            {
                // Refresh Frenzy
                // Refresh Frenzy
                if (CanCast(SNOPower.Barbarian_Frenzy) && TimeSincePowerUse(SNOPower.Barbarian_Frenzy) > 3000 && TimeSincePowerUse(SNOPower.Barbarian_Frenzy) < 4000)
                if (CanCast(SNOPower.Barbarian_Frenzy) && TimeSincePowerUse(SNOPower.Barbarian_Frenzy) > 3000 && TimeSincePowerUse(SNOPower.Barbarian_Frenzy) < 4000)
                    return PowerFrenzy;
                    return PowerFrenzy;
                // Refresh Bash - Punish
                // Refresh Bash - Punish
                if (CanCast(SNOPower.Barbarian_Bash) && TimeSincePowerUse(SNOPower.Barbarian_Bash) > 4000 && TimeSincePowerUse(SNOPower.Barbarian_Bash) < 5000)
                if (CanCast(SNOPower.Barbarian_Bash) && TimeSincePowerUse(SNOPower.Barbarian_Bash) > 4000 && TimeSincePowerUse(SNOPower.Barbarian_Bash) < 5000)
                    return PowerBash;
                    return PowerBash;
            }
            }
            // Ignore Pain when low on health
            // Ignore Pain when low on health
            if (CanCastIgnorePain)
            if (CanCastIgnorePain)
                return PowerIgnorePain;
                return PowerIgnorePain;
            // WOTB
            // WOTB
            if (CanUseWrathOfTheBerserker)
            if (CanUseWrathOfTheBerserker)
                return PowerWrathOfTheBerserker;
                return PowerWrathOfTheBerserker;
            // Call of the Ancients
            // Call of the Ancients
            if (CanUseCallOfTheAncients)
            if (CanUseCallOfTheAncients)
                return PowerCallOfTheAncients;
                return PowerCallOfTheAncients;
            // Leap with Earth Set.
            // Leap with Earth Set.
            if (CanUseLeap && Sets.MightOfTheEarth.IsThirdBonusActive)
            if (CanUseLeap && Sets.MightOfTheEarth.IsThirdBonusActive)
                return PowerLeap;
                return PowerLeap;
            // Earthquake
            // Earthquake
            if (CanUseEarthquake)
            if (CanUseEarthquake)
                return PowerEarthquake;
                return PowerEarthquake;
            // Avalanche
            // Avalanche
            if (CanUseAvalanche)
            if (CanUseAvalanche)
                return PowerAvalanche;
                return PowerAvalanche;
            // War Cry
            // War Cry
            if (CanUseWarCry)
            if (CanUseWarCry)
                return PowerWarCry;
                return PowerWarCry;
            // Battle Rage
            // Battle Rage
            if (CanUseBattleRage)
            if (CanUseBattleRage)
                return PowerBattleRage;
                return PowerBattleRage;
            // Rend
            // Rend
            if (CanUseRend)
            if (CanUseRend)
                return PowerRend;
                return PowerRend;
            // Overpower
            // Overpower
            if (CanUseOverPower)
            if (CanUseOverPower)
                return PowerOverpower;
                return PowerOverpower;
            // Threatening Shout
            // Threatening Shout
            if (CanUseThreatingShout)
            if (CanUseThreatingShout)
                return PowerThreateningShout;
                return PowerThreateningShout;
            // Ground Stomp
            // Ground Stomp
            if (CanUseGroundStomp)
            if (CanUseGroundStomp)
                return PowerGroundStomp;
                return PowerGroundStomp;
            // Revenge
            // Revenge
            if (CanUseRevenge)
            if (CanUseRevenge)
                return PowerRevenge;
                return PowerRevenge;
            // Ancient Spear
            // Ancient Spear
            if (CanUseAncientSpear)
            if (CanUseAncientSpear)
                return PowerAncientSpear;
                return PowerAncientSpear;
            // Sprint
            // Sprint
            if (CanUseSprint)
            if (CanUseSprint)
                return PowerSprint;
                return PowerSprint;
            // Furious Charge
            // Furious Charge
            if (CanUseFuriousCharge)
            if (CanUseFuriousCharge)
                return PowerFuriousCharge;
                return PowerFuriousCharge;
            // Leap
            // Leap
            if (CanUseLeap)
            if (CanUseLeap)
                return PowerLeap;
                return PowerLeap;
            // Seismic Slam
            // Seismic Slam
            if (CanUseSeismicSlam)
            if (CanUseSeismicSlam)
                return PowerSeismicSlam;
                return PowerSeismicSlam;
            // Bash to 3 stacks (Punish)
            // Bash to 3 stacks (Punish)
            if (CanUseBashTo3)
            if (CanUseBashTo3)
                return PowerBash;
                return PowerBash;
            // Frenzy to 5 stacks (Maniac)
            // Frenzy to 5 stacks (Maniac)
            if (CanUseFrenzyTo5)
            if (CanUseFrenzyTo5)
                return PowerFrenzy;
                return PowerFrenzy;
            // HOTA Elites
            // HOTA Elites
            if (CanUseHammerOfTheAncientsElitesOnly)
            if (CanUseHammerOfTheAncientsElitesOnly)
                return PowerHammerOfTheAncients;
                return PowerHammerOfTheAncients;
            // Whirlwind
            // Whirlwind
            if (CanUseWhirlwind)
            if (CanUseWhirlwind)
                return PowerWhirlwind;
                return PowerWhirlwind;
            // Hammer of the Ancients
            // Hammer of the Ancients
            if (CanUseHammerOfTheAncients)
            if (CanUseHammerOfTheAncients)
                return PowerHammerOfTheAncients;
                return PowerHammerOfTheAncients;
            // Weapon Throw
            // Weapon Throw
            if (CanUseWeaponThrow)
            if (CanUseWeaponThrow)
                return PowerWeaponThrow;
                return PowerWeaponThrow;
            // Frenzy Fury Generator
            // Frenzy Fury Generator
            if (CanUseFrenzy)
            if (CanUseFrenzy)
                return PowerFrenzy;
                return PowerFrenzy;
            // Bash Fury Generator
            // Bash Fury Generator
            if (CanUseBash)
            if (CanUseBash)
                return PowerBash;
                return PowerBash;
            // Cleave Fury Generator
            // Cleave Fury Generator
            if (CanUseCleave)
            if (CanUseCleave)
                return PowerCleave;
                return PowerCleave;
            // Default Attacks
            // Default Attacks
            return DefaultPower;
            return DefaultPower;
        }
        }
        public static bool CanCastIgnorePain
        public static bool CanCastIgnorePain
        {
        {
            get
            get
            {
            {
                if (UseOOCBuff)
                if (UseOOCBuff)
                    return false;
                    return false;
                if (GetHasBuff(SNOPower.Barbarian_IgnorePain))
                if (GetHasBuff(SNOPower.Barbarian_IgnorePain))
                    return false;
                    return false;
                if (!CanCast(SNOPower.Barbarian_IgnorePain))
                if (!CanCast(SNOPower.Barbarian_IgnorePain))
                    return false;
                    return false;
                if (Settings.Combat.Barbarian.IgnorePainOffCooldown)
                if (Settings.Combat.Barbarian.IgnorePainOffCooldown)
                    return true;
                    return true;
                if (Player.CurrentHealthPct <= Settings.Combat.Barbarian.IgnorePainMinHealthPct)
                if (Player.CurrentHealthPct <= Settings.Combat.Barbarian.IgnorePainMinHealthPct)
                    return true;
                    return true;
                if (Player.IsFrozen || Player.IsRooted || Player.IsJailed || Trinity.ObjectCache.Any(o => o.AvoidanceType == AvoidanceType.IceBall))
                if (Player.IsFrozen || Player.IsRooted || Player.IsJailed || Trinity.ObjectCache.Any(o => o.AvoidanceType == AvoidanceType.IceBall))
                    return true;
                    return true;
                return Sets.TheLegacyOfRaekor.IsFullyEquipped && ShouldFuryDump;
                return Sets.TheLegacyOfRaekor.IsFullyEquipped && ShouldFuryDump;
            }
            }
        }
        }
        public static bool CanUseCallOfTheAncients
        public static bool CanUseCallOfTheAncients
        {
        {
            get
            get
            {
            {
                return !UseOOCBuff &&
                return //!UseOOCBuff &&
                    !IsCurrentlyAvoiding &&
                    //!IsCurrentlyAvoiding &&
                    CanCast(SNOPower.Barbarian_CallOfTheAncients) &&
                    CanCast(SNOPower.Barbarian_CallOfTheAncients) &&
                    !Player.IsIncapacitated &&
                    !Player.IsIncapacitated &&
                    !GetHasBuff(SNOPower.Barbarian_CallOfTheAncients) &&
                    //!GetHasBuff(SNOPower.Barbarian_CallOfTheAncients) &&
                    (Sets.ImmortalKingsCall.IsFullyEquipped && Trinity.PlayerOwnedAncientCount < 3 ||
                    (Sets.ImmortalKingsCall.IsFullyEquipped && Trinity.PlayerOwnedAncientCount < 3);// ||
                    CurrentTarget.IsEliteRareUnique ||
                //CurrentTarget.IsEliteRareUnique ||
                    TargetUtil.EliteOrTrashInRange(V.F("Barbarian.CallOfTheAncients.MinEliteRange")) ||
                //TargetUtil.EliteOrTrashInRange(V.F("Barbarian.CallOfTheAncients.MinEliteRange")) ||
                    TargetUtil.AnyMobsInRange(V.F("Barbarian.CallOfTheAncients.MinEliteRange"), 3) ||
                //TargetUtil.AnyMobsInRange(V.F("Barbarian.CallOfTheAncients.MinEliteRange"), 3) ||
                    TargetUtil.AnyElitesInRange(V.F("Barbarian.CallOfTheAncients.MinEliteRange")));
                //TargetUtil.AnyElitesInRange(V.F("Barbarian.CallOfTheAncients.MinEliteRange")));
            }
            }
        }
        }
        public static bool CanUseWrathOfTheBerserker
        public static bool CanUseWrathOfTheBerserker
        {
        {
            get
            get
            {
            {
                /* WOTB should be used when the following conditions are met:
                /* WOTB should be used when the following conditions are met:
                 * If ignoring elites, when 3 monsters in 25 yards or 10 monsters in 50 yards are present, OR
                 * If ignoring elites, when 3 monsters in 25 yards or 10 monsters in 50 yards are present, OR
                 * If using on hard elites only, when an elite with the required affix is present, OR
                 * If using on hard elites only, when an elite with the required affix is present, OR
                 * If normal mode, when any elite is within 20 yards, OR
                 * If normal mode, when any elite is within 20 yards, OR
                 * If we have low health (use potion health)
                 * If we have low health (use potion health)
                 * And not on the Heart of sin
                 * And not on the Heart of sin
                 */
                 */
                var anyTime = Settings.Combat.Barbarian.WOTBMode == BarbarianWOTBMode.WhenReady && !Player.IsInTown;
                var anyTime = Settings.Combat.Barbarian.WOTBMode == BarbarianWOTBMode.WhenReady && !Player.IsInTown;
                var whenInCombat = Settings.Combat.Barbarian.WOTBMode == BarbarianWOTBMode.WhenInCombat &&
                var whenInCombat = Settings.Combat.Barbarian.WOTBMode == BarbarianWOTBMode.WhenInCombat &&
                                    TargetUtil.AnyMobsInRange(50) && !UseOOCBuff;
                                    TargetUtil.AnyMobsInRange(50) && !UseOOCBuff;
                var hasBuff = GetHasBuff(SNOPower.Barbarian_WrathOfTheBerserker);
                var hasBuff = GetHasBuff(SNOPower.Barbarian_WrathOfTheBerserker);
                var hasInfiniteCasting = GetHasBuff(SNOPower.Pages_Buff_Infinite_Casting);
                var hasInfiniteCasting = GetHasBuff(SNOPower.Pages_Buff_Infinite_Casting);
                var emergencyHealth = Player.CurrentHealthPct <= V.F("Barbarian.WOTB.EmergencyHealth") && Settings.Combat.Barbarian.WOTBEmergencyHealth;
                var emergencyHealth = Player.CurrentHealthPct <= V.F("Barbarian.WOTB.EmergencyHealth") && Settings.Combat.Barbarian.WOTBEmergencyHealth;
                var result =
                var result =
                    //Player.PrimaryResource >= V.I("Barbarian.WOTB.MinFury") && // WOTB is "free" !
                    //Player.PrimaryResource >= V.I("Barbarian.WOTB.MinFury") && // WOTB is "free" !
                    // Don't still have the buff
                    // Don't still have the buff
                    !hasBuff && CanCast(SNOPower.Barbarian_WrathOfTheBerserker) &&
                    !hasBuff && CanCast(SNOPower.Barbarian_WrathOfTheBerserker) &&
                    (WOTBGoblins || WOTBIgnoreElites || WOTBElitesPresent || emergencyHealth || hasInfiniteCasting ||
                    (WOTBGoblins || WOTBIgnoreElites || WOTBElitesPresent || emergencyHealth || hasInfiniteCasting ||
                     anyTime || whenInCombat);
                     anyTime || whenInCombat);
                return result;
                return result;
            }
            }
        }
        }
        /// <summary>
        /// <summary>
        /// If using WOTB on all elites, or if we should only use on "hard" affixes
        /// If using WOTB on all elites, or if we should only use on "hard" affixes
        /// </summary>
        /// </summary>
        public static bool WOTBElitesPresent
        public static bool WOTBElitesPresent
        {
        {
            get
            get
            {
            {
                //bool hardEliteOverride = Trinity.ObjectCache.Any(o => DataDictionary.ForceUseWOTBIds.Contains(o.ActorSNO)) ||
                //bool hardEliteOverride = Trinity.ObjectCache.Any(o => DataDictionary.ForceUseWOTBIds.Contains(o.ActorSnoId)) ||
                //        TargetUtil.AnyElitesInRange(V.F("Barbarian.WOTB.HardEliteRangeOverride"), V.I("Barbarian.WOTB.HardEliteCountOverride"));
                //        TargetUtil.AnyElitesInRange(V.F("Barbarian.WOTB.HardEliteRangeOverride"), V.I("Barbarian.WOTB.HardEliteCountOverride"));
                //// WotB only used on Arcane, Frozen, Jailer, Molten, Electrified+Reflect Damage elites, or bosses and ubers, or when more than 4 elites are present
                //// WotB only used on Arcane, Frozen, Jailer, Molten, Electrified+Reflect Damage elites, or bosses and ubers, or when more than 4 elites are present
                //bool wotbHardElitesPresent = HardElitesPresent || hardEliteOverride;
                //bool wotbHardElitesPresent = HardElitesPresent || hardEliteOverride;
                bool hardElitesOnly = Settings.Combat.Barbarian.WOTBMode == BarbarianWOTBMode.HardElitesOnly;
                bool hardElitesOnly = Settings.Combat.Barbarian.WOTBMode == BarbarianWOTBMode.HardElitesOnly;
                bool elitesPresent = TargetUtil.AnyElitesInRange(V.F("Barbarian.WOTB.MinRange"), V.I("Barbarian.WOTB.MinCount"));
                bool elitesPresent = TargetUtil.AnyElitesInRange(V.F("Barbarian.WOTB.MinRange"), V.I("Barbarian.WOTB.MinCount"));
                return ((!hardElitesOnly && elitesPresent) || (hardElitesOnly && HardElitesPresent));
                return ((!hardElitesOnly && elitesPresent) || (hardElitesOnly && HardElitesPresent));
            }
            }
        }
        }
        /// <summary>
        /// <summary>
        /// Make sure we are allowed to use wrath on goblins, else make sure this isn't a goblin
        /// Make sure we are allowed to use wrath on goblins, else make sure this isn't a goblin
        /// </summary>
        /// </summary>
        public static bool WOTBGoblins
        public static bool WOTBGoblins
        {
        {
            get
            get
            {
            {
                if (CurrentTarget == null)
                if (CurrentTarget == null)
                    return false;
                    return false;
                return CurrentTarget.IsTreasureGoblin && Settings.Combat.Barbarian.UseWOTBGoblin;
                return CurrentTarget.IsTreasureGoblin && Settings.Combat.Barbarian.UseWOTBGoblin;
            }
            }
        }
        }
        /// <summary>
        /// <summary>
        /// If ignoring elites completely, trigger on 3 trash within 25 yards, or 10 trash in 50 yards
        /// If ignoring elites completely, trigger on 3 trash within 25 yards, or 10 trash in 50 yards
        /// </summary>
        /// </summary>
        public static bool WOTBIgnoreElites
        public static bool WOTBIgnoreElites
        {
        {
            get
            get
            {
            {
                return
                return
                    IgnoringElites &&
                    IgnoringElites &&
                    (TargetUtil.AnyMobsInRange(V.F("Barbarian.WOTB.RangeNear"), V.I("Barbarian.WOTB.CountNear")) ||
                    (TargetUtil.AnyMobsInRange(V.F("Barbarian.WOTB.RangeNear"), V.I("Barbarian.WOTB.CountNear")) ||
                    TargetUtil.AnyMobsInRange(V.F("Barbarian.WOTB.RangeFar"), V.I("Barbarian.WOTB.CountFar")) ||
                    TargetUtil.AnyMobsInRange(V.F("Barbarian.WOTB.RangeFar"), V.I("Barbarian.WOTB.CountFar")) ||
                    TargetUtil.AnyMobsInRange(Settings.Combat.Misc.TrashPackClusterRadius, Settings.Combat.Misc.TrashPackSize));
                    TargetUtil.AnyMobsInRange(Settings.Combat.Misc.TrashPackClusterRadius, Settings.Combat.Misc.TrashPackSize));
            }
            }
        }
        }
        public static bool CanUseEarthquake
        public static bool CanUseEarthquake
        {
        {
            get
            get
            {
            {
                double minFury = 50f;
                double minFury = 50f;
                bool hasCaveIn = CacheData.Hotbar.ActiveSkills.Any(p => p.Power == SNOPower.Barbarian_Earthquake && p.RuneIndex == 4);
                bool hasCaveIn = CacheData.Hotbar.ActiveSkills.Any(p => p.Power == SNOPower.Barbarian_Earthquake && p.RuneIndex == 4);
                float range = hasCaveIn ? 24f : 14f;
                float range = hasCaveIn ? 24f : 14f;
                return
                return
                       !UseOOCBuff &&
                       !UseOOCBuff &&
                       !IsCurrentlyAvoiding &&
                       !IsCurrentlyAvoiding &&
                       !Player.IsIncapacitated &&
                       !Player.IsIncapacitated &&
                       CanCast(SNOPower.Barbarian_Earthquake) &&
                       CanCast(SNOPower.Barbarian_Earthquake) &&
                       Player.PrimaryResource >= minFury &&
                       Player.PrimaryResource >= minFury &&
                       (TargetUtil.IsEliteTargetInRange(range) || TargetUtil.AnyMobsInRange(range, 10));
                       (TargetUtil.IsEliteTargetInRange(range) || TargetUtil.AnyMobsInRange(range, 10));
            }
            }
        }
        }
        public static bool CanUseBattleRage
        public static bool CanUseBattleRage
        {
        {
            get
            get
            {
            {
                var shouldRefreshTaeguk = GetHasBuff(SNOPower.ItemPassive_Unique_Gem_015_x1) && !Hotbar.Contains(SNOPower.Barbarian_Whirlwind) &&
                var shouldRefreshTaeguk = Gems.Taeguk.IsEquipped /*GetHasBuff(SNOPower.ItemPassive_Unique_Gem_015_x1)*/ && !Hotbar.Contains(SNOPower.Barbarian_Whirlwind) &&
                    Skills.Barbarian.BattleRage.TimeSinceUse >= 2300 && Skills.Barbarian.BattleRage.TimeSinceUse <= 3000;
                    /*Skills.Barbarian.BattleRage.TimeSinceUse >= 1500 && Skills.Barbarian.BattleRage.TimeSinceUse <= 3000 &&*/ Skills.Barbarian.HammerOfTheAncients.TimeSinceUse >= 1000;
                return !Player.IsIncapacitated && CanCast(SNOPower.Barbarian_BattleRage, CanCastFlags.NoTimer) &&
                return !Player.IsIncapacitated && CanCast(SNOPower.Barbarian_BattleRage, CanCastFlags.NoTimer) &&
                    (!GetHasBuff(SNOPower.Barbarian_BattleRage) || ShouldFuryDump || shouldRefreshTaeguk) &&
                       (!GetHasBuff(SNOPower.Barbarian_BattleRage) /*|| Player.CurrentHealthPct < 0.8f*/ || shouldRefreshTaeguk) && //ShouldFuryDump || ) &&
                    Player.PrimaryResource >= V.F("Barbarian.BattleRage.MinFury");
                       Player.PrimaryResource >= 40;
            }
            }
        }
        }
        public static bool CanUseSprintOOC
        public static bool CanUseSprintOOC
        {
        {
            get
            get
            {
            {
                return
                return
                (Settings.Combat.Barbarian.SprintMode != BarbarianSprintMode.CombatOnly) &&
                (Settings.Combat.Barbarian.SprintMode != BarbarianSprintMode.CombatOnly) &&
                AllowSprintOOC &&
                AllowSprintOOC &&
                !Player.IsIncapacitated &&
                !Player.IsIncapacitated &&
                CanCast(SNOPower.Barbarian_Sprint) &&
                CanCast(SNOPower.Barbarian_Sprint) &&
                (Settings.Combat.Misc.AllowOOCMovement || GetHasBuff(SNOPower.Barbarian_WrathOfTheBerserker)) &&
                (Settings.Combat.Misc.AllowOOCMovement || GetHasBuff(SNOPower.Barbarian_WrathOfTheBerserker)) &&
                !GetHasBuff(SNOPower.Barbarian_Sprint) &&
                !GetHasBuff(SNOPower.Barbarian_Sprint) &&
                Player.PrimaryResource >= V.F("Barbarian.Sprint.MinFury");
                Player.PrimaryResource >= V.F("Barbarian.Sprint.MinFury");
            }
            }
        }
        }
        public static bool CanUseWarCry
        public static bool CanUseWarCry
        {
        {
            get
            get
            {
            {
                return
                return
                    CanCast(SNOPower.X1_Barbarian_WarCry_v2, CanCastFlags.NoTimer) && !Player.IsIncapacitated &&
                    CanCast(SNOPower.X1_Barbarian_WarCry_v2, CanCastFlags.NoTimer) && !Player.IsIncapacitated &&
                    (Player.PrimaryResource <= V.F("Barbarian.WarCry.MaxFury") ||
                    (Player.PrimaryResource <= V.F("Barbarian.WarCry.MaxFury") ||
                    Skills.Barbarian.WarCry.TimeSinceUse >= Settings.Combat.Barbarian.WarCryWaitDelay) &&
                    Skills.Barbarian.WarCry.TimeSinceUse >= Settings.Combat.Barbarian.WarCryWaitDelay) &&
                    (!Legendary.BladeoftheTribes.IsEquipped || TargetUtil.AnyMobsInRange(20f));
                    (!Legendary.BladeoftheTribes.IsEquipped || TargetUtil.AnyMobsInRange(20f));
            }
            }
        }
        }
        public static bool CanUseThreatingShout
        public static bool CanUseThreatingShout
        {
        {
            get
            get
            {
            {
                var range = V.F("Barbarian.ThreatShout.Range");
                var range = V.F("Barbarian.ThreatShout.Range");
                bool inCombat = !UseOOCBuff &&
                bool inCombat = !UseOOCBuff &&
                    CanCast(SNOPower.Barbarian_ThreateningShout) &&
                    CanCast(SNOPower.Barbarian_ThreateningShout) &&
                    !Player.IsIncapacitated && Skills.Barbarian.ThreateningShout.TimeSinceUse > Settings.Combat.Barbarian.ThreateningShoutWaitDelay &&
                    !Player.IsIncapacitated && Skills.Barbarian.ThreateningShout.TimeSinceUse > Settings.Combat.Barbarian.ThreateningShoutWaitDelay &&
                    ((TargetUtil.AnyMobsInRange(range, Settings.Combat.Barbarian.MinThreatShoutMobCount, false)) || TargetUtil.IsEliteTargetInRange(range) ||
                    ((TargetUtil.AnyMobsInRange(range, Settings.Combat.Barbarian.MinThreatShoutMobCount, false)) || TargetUtil.IsEliteTargetInRange(range) ||
                        (Hotbar.Contains(SNOPower.Barbarian_Whirlwind) && Player.PrimaryResource <= V.I("Barbarian.Whirlwind.MinFury")) ||
                        (Hotbar.Contains(SNOPower.Barbarian_Whirlwind) && Player.PrimaryResource <= V.I("Barbarian.Whirlwind.MinFury")) ||
                        (IsWaitingForSpecial && Player.PrimaryResource <= MinEnergyReserve)
                        (IsWaitingForSpecial && Player.PrimaryResource <= MinEnergyReserve)
                    );
                    );
                bool outOfCombat = UseOOCBuff &&
                bool outOfCombat = UseOOCBuff &&
                     !Player.IsIncapacitated &&
                     !Player.IsIncapacitated &&
                     Settings.Combat.Barbarian.ThreatShoutOOC && CanCast(SNOPower.Barbarian_ThreateningShout) &&
                     Settings.Combat.Barbarian.ThreatShoutOOC && CanCast(SNOPower.Barbarian_ThreateningShout) &&
                     Player.PrimaryResource < V.D("Barbarian.ThreatShout.OOCMaxFury");
                     Player.PrimaryResource < V.D("Barbarian.ThreatShout.OOCMaxFury");
                return inCombat || outOfCombat;
                return inCombat || outOfCombat;
            }
            }
        }
        }
        public static bool CanUseGroundStomp
        public static bool CanUseGroundStomp
        {
        {
            get
            get
            {
            {
                return
                return
                    !UseOOCBuff &&
                    !UseOOCBuff &&
                    !Player.IsIncapacitated &&
                    !Player.IsIncapacitated &&
                    CanCast(SNOPower.Barbarian_GroundStomp) &&
                    CanCast(SNOPower.Barbarian_GroundStomp) &&
                    (
                    (
                        TargetUtil.AnyElitesInRange(V.F("Barbarian.GroundStomp.EliteRange"), V.I("Barbarian.GroundStomp.EliteCount")) ||
                        TargetUtil.AnyElitesInRange(V.F("Barbarian.GroundStomp.EliteRange"), V.I("Barbarian.GroundStomp.EliteCount")) ||
                        TargetUtil.AnyMobsInRange(V.F("Barbarian.GroundStomp.TrashRange"), V.I("Barbarian.GroundStomp.TrashCount")) ||
                        TargetUtil.AnyMobsInRange(V.F("Barbarian.GroundStomp.TrashRange"), V.I("Barbarian.GroundStomp.TrashCount")) ||
                        (Player.CurrentHealthPct <= V.F("Barbarian.GroundStomp.UseBelowHealthPct") && TargetUtil.AnyMobsInRange(V.F("Barbarian.GroundStomp.TrashRange")))
                        (Player.CurrentHealthPct <= V.F("Barbarian.GroundStomp.UseBelowHealthPct") && TargetUtil.AnyMobsInRange(V.F("Barbarian.GroundStomp.TrashRange")))
                    );
                    );
            }
            }
        }
        }
        public static bool CanUseRevenge
        public static bool CanUseRevenge
        {
        {
            get
            get
            {
            {
                return
                return
                    !UseOOCBuff &&
                    !UseOOCBuff &&
                    CanCast(SNOPower.Barbarian_Revenge) &&
                    CanCast(SNOPower.Barbarian_Revenge) &&
                    !Player.IsIncapacitated &&
                    !Player.IsIncapacitated &&
                    // Don't use revenge on goblins, too slow!
                    // Don't use revenge on goblins, too slow!
                    (!CurrentTarget.IsTreasureGoblin || TargetUtil.AnyMobsInRange(V.F("Barbarian.Revenge.TrashRange"), V.I("Barbarian.Revenge.TrashCount")));
                    (!CurrentTarget.IsTreasureGoblin || TargetUtil.AnyMobsInRange(V.F("Barbarian.Revenge.TrashRange"), V.I("Barbarian.Revenge.TrashCount")));
            }
            }
        }
        }
        public static bool CanUseFuriousCharge
        public static bool CanUseFuriousCharge
        {
        {
            get
            get
            {
            {
                if (UseOOCBuff)
                if (UseOOCBuff)
                    return false;
                    return false;
                var bestTarget = TargetUtil.GetBestPierceTarget(MaxFuriousChargeDistance);
                return CanCast(SNOPower.Barbarian_FuriousCharge, CanCastFlags.NoTimer) && !IsCurrentlyAvoiding && Skills.Barbarian.FuriousCharge.Charges > 0;
                var bestClusterTarget = TargetUtil.GetBestClusterUnit(15f, MaxFuriousChargeDistance, 1, false, true);
                var bestTarget = TargetUtil.GetBestPierceTarget(MaxFuriousChargeDistance); ;
                var unitsInFrontOfBestTarget = 0;
                var unitsInFrontOfBestTarget = 0;
                if (bestTarget != null)
                if (bestTarget != null)
                    unitsInFrontOfBestTarget = bestTarget.CountUnitsInFront();
                    unitsInFrontOfBestTarget = bestTarget.CountUnitsInFront();
                var currentEliteTargetInRange = CurrentTarget.RadiusDistance > 7f && CurrentTarget.IsBossOrEliteRareUnique && CurrentTarget.RadiusDistance <= 35f;
                if (unitsInFrontOfBestTarget < 2 && bestClusterTarget != null)
                var shouldRegenFury = CurrentTarget.NearbyUnitsWithinDistance(10) >= 3 && Player.PrimaryResource <= 40;
                    unitsInFrontOfBestTarget = bestClusterTarget.NearbyUnitsWithinDistance(15f);
                if ((Sets.BastionsOfWill.IsFullyEquipped || Legendary.StrongarmBracers.IsEquipped) && !Sets.TheLegacyOfRaekor.IsFullyEquipped)
                var currentEliteTargetInRange = (CurrentTarget.NearbyUnitsWithinDistance(15f) == 0 && CurrentTarget.CountUnitsInFront() == 0 && CurrentTarget.HitPointsPct <= 0.3) || CurrentTarget.IsBossOrEliteRareUnique || CurrentTarget.IsTreasureGoblin;
                    return CanCast(SNOPower.Barbarian_FuriousCharge, CanCastFlags.NoTimer) && !IsCurrentlyAvoiding &&
                var shouldRegenFury = CurrentTarget.NearbyUnitsWithinDistance(10) >= 2 && Player.PrimaryResource <= 40;
                        Skills.Barbarian.FuriousCharge.Charges > 0 && (TimeSincePowerUse(SNOPower.Barbarian_FuriousCharge) > 4000 || shouldRegenFury);
                return CanCast(SNOPower.Barbarian_FuriousCharge, CanCastFlags.NoTimer) && !IsCurrentlyAvoiding && Skills.Barbarian.FuriousCharge.Charges > 0 &&
                //if ((Sets.BastionsOfWill.IsFullyEquipped || Legendary.StrongarmBracers.IsEquipped) && !Sets.TheLegacyOfRaekor.IsFullyEquipped)
                    (currentEliteTargetInRange || unitsInFrontOfBestTarget >= 3 || Sets.TheLegacyOfRaekor.IsFullyEquipped);
                //    return CanCast(SNOPower.Barbarian_FuriousCharge, CanCastFlags.NoTimer) && !IsCurrentlyAvoiding &&
                //        Skills.Barbarian.FuriousCharge.Charges > 0 && (TimeSincePowerUse(SNOPower.Barbarian_FuriousCharge) > 4000 || shouldRegenFury);
                 /*&&
                       (currentEliteTargetInRange || unitsInFrontOfBestTarget >= 2); // || Sets.TheLegacyOfRaekor.IsFullyEquipped);*/
            }
            }
        }
        }
        public static bool CanUseLeap
        public static bool CanUseLeap
        {
        {
            get
            get
            {
            {
                bool leapresult = !UseOOCBuff && !Player.IsIncapacitated && CanCast(SNOPower.Barbarian_Leap);
                bool leapresult = !UseOOCBuff && !Player.IsIncapacitated && CanCast(SNOPower.Barbarian_Leap);
                // This will now cast whenever leap is available and an enemy is around. 
                // This will now cast whenever leap is available and an enemy is around. 
                // Disable Leap OOC option. The last line will prevent you from leaping on destructibles
                // Disable Leap OOC option. The last line will prevent you from leaping on destructibles
                if (Legendary.LutSocks.IsEquipped)
                if (Legendary.LutSocks.IsEquipped)
                {
                {
                    return leapresult && TargetUtil.AnyMobsInRange(15f, 1);
                    return leapresult && TargetUtil.AnyMobsInRange(15f, 1);
                }
                }
                return leapresult && (TargetUtil.ClusterExists(15f, 35f, V.I("Barbarian.Leap.TrashCount")) || CurrentTarget.IsBossOrEliteRareUnique);
                return leapresult && (TargetUtil.ClusterExists(15f, 35f, V.I("Barbarian.Leap.TrashCount")) || CurrentTarget.IsBossOrEliteRareUnique);
            }
            }
        }
        }
        public static bool CanUseRend
        public static bool CanUseRend
        {
        {
            get
            get
            {
            {
                if (UseOOCBuff || IsCurrentlyAvoiding || Player.IsIncapacitated || !CanCast(SNOPower.Barbarian_Rend))
                if (UseOOCBuff || IsCurrentlyAvoiding || Player.IsIncapacitated || !CanCast(SNOPower.Barbarian_Rend))
                    return false;
                    return false;
                if (!CanCast(SNOPower.Barbarian_Rend))
                if (!CanCast(SNOPower.Barbarian_Rend))
                    return false;
                    return false;
                bool hasReserveEnergy = (!IsWaitingForSpecial && Player.PrimaryResource >= 20) || (IsWaitingForSpecial && Player.PrimaryResource > MinEnergyReserve);
                bool hasReserveEnergy = (!IsWaitingForSpecial && Player.PrimaryResource >= 20) || (IsWaitingForSpecial && Player.PrimaryResource > MinEnergyReserve);
                var mobCountThreshold = Trinity.ObjectCache.Count(o => o.IsUnit && (!o.HasDebuff(SNOPower.Barbarian_Rend)) && o.RadiusDistance <= 12) >= 3 || CurrentTarget.IsEliteRareUnique;
                var mobCountThreshold = Trinity.ObjectCache.Count(o => o.IsUnit && (!o.HasDebuff(SNOPower.Barbarian_Rend)) && o.RadiusDistance <= 12) >= 3 || CurrentTarget.IsEliteRareUnique;
                if (!mobCountThreshold)
                if (!mobCountThreshold)
                    return false;
                    return false;
                // Spam with Bloodlust
                // Spam with Bloodlust
                if (Runes.Barbarian.BloodLust.IsActive && Player.CurrentHealthPct <= .25)
                if (Runes.Barbarian.BloodLust.IsActive && Player.CurrentHealthPct <= .25)
                    return true;
                    return true;
                // If lamentation is equipped, cast twice in a row and then wait
                // If lamentation is equipped, cast twice in a row and then wait
                if (Legendary.Lamentation.IsEquipped)
                if (Legendary.Lamentation.IsEquipped)
                {
                {
                    var castsWithinTime = SpellHistory.SpellUseCountInTime(SNOPower.Barbarian_Rend, TimeSpan.FromMilliseconds(Settings.Combat.Barbarian.RendWaitDelay));
                    var castsWithinTime = SpellHistory.SpellUseCountInTime(SNOPower.Barbarian_Rend, TimeSpan.FromMilliseconds(Settings.Combat.Barbarian.RendWaitDelay));
                    Logger.LogVerbose(LogCategory.Behavior, "Casts within {0}ms = {1}", Settings.Combat.Barbarian.RendWaitDelay, castsWithinTime);
                    Logger.LogVerbose(LogCategory.Behavior, "Casts within {0}ms = {1}", Settings.Combat.Barbarian.RendWaitDelay, castsWithinTime);
                    if (hasReserveEnergy && QueuedPower != PowerRend && castsWithinTime == 0)
                    if (hasReserveEnergy && QueuedPower != PowerRend && castsWithinTime == 0)
                    {
                    {
                        Logger.LogVerbose("Double Rend!");
                        Logger.LogVerbose("Double Rend!");
                        QueuedPower = PowerRend;
                        QueuedPower = PowerRend;
                        return true;
                        return true;
                    }
                    }
                    return false;                     
                    return false;                     
                }
                }
                return Skills.Barbarian.Rend.TimeSinceUse > Settings.Combat.Barbarian.RendWaitDelay && hasReserveEnergy;
                return Skills.Barbarian.Rend.TimeSinceUse > Settings.Combat.Barbarian.RendWaitDelay && hasReserveEnergy;
            }
            }
        }
        }
        public static bool CanUseOverPower
        public static bool CanUseOverPower
        {
        {
            get
            get
            {
            {
                if (CurrentTarget == null || Player.IsIncapacitated || Player.IsInTown || !CanCast(SNOPower.Barbarian_Overpower))
                if (CurrentTarget == null || Player.IsIncapacitated || Player.IsInTown || !CanCast(SNOPower.Barbarian_Overpower))
                    return false;
                    return false;
                var overPowerHasBuffEffect = (Runes.Barbarian.KillingSpree.IsActive ||
                var overPowerHasBuffEffect = (Runes.Barbarian.KillingSpree.IsActive ||
                                        Runes.Barbarian.CrushingAdvance.IsActive);
                                        Runes.Barbarian.CrushingAdvance.IsActive);
                if (!GetHasBuff(SNOPower.Barbarian_Overpower) && overPowerHasBuffEffect)
                if (!GetHasBuff(SNOPower.Barbarian_Overpower) && overPowerHasBuffEffect)
                    return true;
                    return true;
                return  CurrentTarget.RadiusDistance <= V.F("Barbarian.OverPower.MaxRange") && !overPowerHasBuffEffect &&
                return  CurrentTarget.RadiusDistance <= V.F("Barbarian.OverPower.MaxRange") && !overPowerHasBuffEffect &&
                        TargetUtil.AnyMobsInRange(V.F("Barbarian.OverPower.MaxRange")) &&
                        TargetUtil.AnyMobsInRange(V.F("Barbarian.OverPower.MaxRange")) &&
                        (CurrentTarget.IsEliteRareUnique || CurrentTarget.IsMinion || CurrentTarget.IsBoss || TargetUtil.NumMobsInRangeOfPosition(Trinity.Player.Position, 9) >= 4);
                        (CurrentTarget.IsEliteRareUnique || CurrentTarget.IsMinion || CurrentTarget.IsBoss || TargetUtil.NumMobsInRangeOfPosition(Trinity.Player.Position, 9) >= 4);
            }
            }
        }
        }
        public static bool CanUseSeismicSlam
        public static bool CanUseSeismicSlam
        {
        {
            get
            get
            {
            {
                return !UseOOCBuff && !IsWaitingForSpecial && CanCast(SNOPower.Barbarian_SeismicSlam) && !Player.IsIncapacitated &&
                return !UseOOCBuff && !IsWaitingForSpecial && CanCast(SNOPower.Barbarian_SeismicSlam) && !Player.IsIncapacitated &&
                    (!Hotbar.Contains(SNOPower.Barbarian_BattleRage) || (Hotbar.Contains(SNOPower.Barbarian_BattleRage) && GetHasBuff(SNOPower.Barbarian_BattleRage))) &&
                    (!Hotbar.Contains(SNOPower.Barbarian_BattleRage) || (Hotbar.Contains(SNOPower.Barbarian_BattleRage) && GetHasBuff(SNOPower.Barbarian_BattleRage))) &&
                    Player.PrimaryResource >= V.I("Barbarian.SeismicSlam.MinFury") && CurrentTarget.Distance <= V.F("Barbarian.SeismicSlam.CurrentTargetRange") &&
                    Player.PrimaryResource >= V.I("Barbarian.SeismicSlam.MinFury") && CurrentTarget.Distance <= V.F("Barbarian.SeismicSlam.CurrentTargetRange") &&
                    (TargetUtil.AnyMobsInRange(V.F("Barbarian.SeismicSlam.TrashRange")) ||
                    (TargetUtil.AnyMobsInRange(V.F("Barbarian.SeismicSlam.TrashRange")) ||
                     TargetUtil.IsEliteTargetInRange(V.F("Barbarian.SeismicSlam.EliteRange")));
                     TargetUtil.IsEliteTargetInRange(V.F("Barbarian.SeismicSlam.EliteRange")));
            }
            }
        }
        }
        public static bool CanUseAncientSpear
        public static bool CanUseAncientSpear
        {
        {
            get
            get
            {
            {
                return !UseOOCBuff && !IsWaitingForSpecial && !IsCurrentlyAvoiding && CanCast(SNOPower.X1_Barbarian_AncientSpear) && Player.PrimaryResource >= 25 &&
                return !UseOOCBuff && !IsWaitingForSpecial && !IsCurrentlyAvoiding && CanCast(SNOPower.X1_Barbarian_AncientSpear) &&
                    (/*Skills.Barbarian.AncientSpear.TimeSinceUse > Settings.Combat.Barbarian.AncientSpearWaitDelay || */Player.CurrentHealthPct < 0.9f && Player.PrimaryResourcePct > 0.5 || (!CacheData.Buffs.HasBuff(SNOPower.ItemPassive_Unique_Ring_735_x1, 2)) && Player.PrimaryResource > 20);
                    // Only boulder toss as a rage dump if we have excess resource
                    // Only boulder toss as a rage dump if we have excess resource
                    (!Runes.Barbarian.BoulderToss.IsActive || Player.PrimaryResourcePct > 0.8) &&
                    //(!Runes.Barbarian.BoulderToss.IsActive || Player.PrimaryResourcePct > 0.8) &&
                    // Raekor - don't toss if below 5 stacks
                    // Raekor - don't toss if below 5 stacks
                    (!Sets.TheLegacyOfRaekor.IsFullyEquipped || GetBuffStacks(SNOPower.P2_ItemPassive_Unique_Ring_026) >= 5) &&
                    //(!Sets.TheLegacyOfRaekor.IsFullyEquipped || GetBuffStacks(SNOPower.P2_ItemPassive_Unique_Ring_026) >= 5) &&
                    // Check delay slider
                    // Check delay slider                    
                    Skills.Barbarian.AncientSpear.TimeSinceUse > Settings.Combat.Barbarian.AncientSpearWaitDelay;
            }
            }
        }
        }
        public static bool CanUseSprint
        public static bool CanUseSprint
        {
        {
            get
            get
            {
            {
                return Trinity.Settings.Combat.Barbarian.SprintMode != BarbarianSprintMode.MovementOnly &&
                return CanCast(SNOPower.Barbarian_Sprint, CanCastFlags.NoTimer) && !Player.IsIncapacitated &&
                       TimeSincePowerUse(SNOPower.Barbarian_Sprint) >= V.I("Barbarian.Sprint.MinUseDelay") &&
                       Player.PrimaryResource >= V.F("Barbarian.Sprint.MinFury");
                /*return Trinity.Settings.Combat.Barbarian.SprintMode != BarbarianSprintMode.MovementOnly &&
                    !UseOOCBuff && CanCast(SNOPower.Barbarian_Sprint, CanCastFlags.NoTimer) && !Player.IsIncapacitated &&
                    !UseOOCBuff && CanCast(SNOPower.Barbarian_Sprint, CanCastFlags.NoTimer) && !Player.IsIncapacitated &&
                    (
                    (
                        // last power used was whirlwind and we don't have sprint up
                        // last power used was whirlwind and we don't have sprint up
                        (LastPowerUsed == SNOPower.Barbarian_Whirlwind && !GetHasBuff(SNOPower.Barbarian_Sprint)) ||
                        (LastPowerUsed == SNOPower.Barbarian_Whirlwind && !GetHasBuff(SNOPower.Barbarian_Sprint)) ||
                        // Fury Dump Options for sprint: use at max energy constantly
                        // Fury Dump Options for sprint: use at max energy constantly
                        ShouldFuryDump ||
                        ShouldFuryDump ||
                        // or on a timer
                        // or on a timer
                        (
                        (
                         (SNOPowerUseTimer(SNOPower.Barbarian_Sprint) && !GetHasBuff(SNOPower.Barbarian_Sprint)) &&
                         (SNOPowerUseTimer(SNOPower.Barbarian_Sprint) && !GetHasBuff(SNOPower.Barbarian_Sprint)) &&
                         // Always keep up if we are whirlwinding, if the target is a goblin, or if we are more than 16 feet away from the target
                         // Always keep up if we are whirlwinding, if the target is a goblin, or if we are more than 16 feet away from the target
                         (Hotbar.Contains(SNOPower.Barbarian_Whirlwind) || CurrentTarget.IsTreasureGoblin ||
                         (Hotbar.Contains(SNOPower.Barbarian_Whirlwind) || CurrentTarget.IsTreasureGoblin ||
                          (CurrentTarget.Distance >= V.F("Barbarian.Sprint.SingleTargetRange") && Player.PrimaryResource >= V.F("Barbarian.Sprint.SingleTargetMinFury"))
                          (CurrentTarget.Distance >= V.F("Barbarian.Sprint.SingleTargetRange") && Player.PrimaryResource >= V.F("Barbarian.Sprint.SingleTargetMinFury"))
                         )
                         )
                        )
                        )
                    ) &&
                    ) &&
                    // minimum time between uses
                    // minimum time between uses
                    TimeSincePowerUse(SNOPower.Barbarian_Sprint) >= V.I("Barbarian.Sprint.MinUseDelay") &&
                    // If they have battle-rage, make sure it's up
                    (!Hotbar.Contains(SNOPower.Barbarian_BattleRage) || (Hotbar.Contains(SNOPower.Barbarian_BattleRage) && GetHasBuff(SNOPower.Barbarian_BattleRage))) &&
                    // Check for minimum energy
                    Player.PrimaryResource >= V.F("Barbarian.Sprint.MinFury");
            }
        }
        public static bool CanUseFrenzyTo5
        {
            get
            {
                return !UseOOCBuff && !IsCurrentlyAvoiding && !Player.IsRooted && Hotbar.Contains(SNOPower.Barbarian_Frenzy) &&
                    !TargetUtil.AnyMobsInRange(15f, 3) && GetBuffStacks(SNOPower.Barbarian_Frenzy) < 5;
            }
        }
        public static bool CanUseBashTo3
        {
            get
            {
                return !UseOOCBuff && !IsCurrentlyAvoiding && !Player.IsRooted && Hotbar.Contains(SN