From ce4dce69bad0d080f4f6d599ff2890ae40f3c1fd Mon Sep 17 00:00:00 2001 From: Tykku Date: Fri, 19 Apr 2024 02:42:11 -0400 Subject: [PATCH] Moving PhysRange Beta to Live --- BasicRotations/Ranged/BRD_Beta.cs | 220 ------------------------- BasicRotations/Ranged/BRD_Default.cs | 38 +++-- BasicRotations/Ranged/DNC_Beta.cs | 232 --------------------------- BasicRotations/Ranged/DNC_Default.cs | 52 ++++-- BasicRotations/Ranged/MCH_Beta.cs | 195 ---------------------- BasicRotations/Ranged/MCH_Default.cs | 118 ++++++++------ 6 files changed, 134 insertions(+), 721 deletions(-) delete mode 100644 BasicRotations/Ranged/BRD_Beta.cs delete mode 100644 BasicRotations/Ranged/DNC_Beta.cs delete mode 100644 BasicRotations/Ranged/MCH_Beta.cs diff --git a/BasicRotations/Ranged/BRD_Beta.cs b/BasicRotations/Ranged/BRD_Beta.cs deleted file mode 100644 index 358869f..0000000 --- a/BasicRotations/Ranged/BRD_Beta.cs +++ /dev/null @@ -1,220 +0,0 @@ -namespace DefaultRotations.Ranged; - -[Rotation("Beta Rotations", CombatType.PvE, GameVersion = "6.58", - Description = "Please make sure that the three song times add up to 120 seconds!")] -[SourceCode(Path = "main/DefaultRotations/Ranged/BRD_Beta.cs")] -[Api(1)] -public sealed class BRD_Beta : BardRotation -{ - #region Config Options - [RotationConfig(CombatType.PvE, Name = @"Use Raging Strikes on ""Wanderer's Minuet""")] - public bool BindWAND { get; set; } = false; - - [Range(1, 45, ConfigUnitType.Seconds, 1)] - [RotationConfig(CombatType.PvE, Name = "Wanderer's Minuet Uptime")] - public float WANDTime { get; set; } = 43; - - [Range(0, 45, ConfigUnitType.Seconds, 1)] - [RotationConfig(CombatType.PvE, Name = "Mage's Ballad Uptime")] - public float MAGETime { get; set; } = 34; - - [Range(0, 45, ConfigUnitType.Seconds, 1)] - [RotationConfig(CombatType.PvE, Name = "Army's Paeon Uptime")] - public float ARMYTime { get; set; } = 43; - - [RotationConfig(CombatType.PvE, Name = "First Song")] - private Song FirstSong { get; set; } = Song.WANDERER; - - private bool BindWANDEnough => BindWAND && this.TheWanderersMinuetPvE.EnoughLevel; - private float WANDRemainTime => 45 - WANDTime; - private float MAGERemainTime => 45 - MAGETime; - private float ARMYRemainTime => 45 - ARMYTime; - #endregion - - #region Emergency Logic - protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) - { - if (nextGCD.IsTheSameTo(true, StraightShotPvE, VenomousBitePvE, WindbitePvE, IronJawsPvE)) - { - return base.EmergencyAbility(nextGCD, out act); - } - else if ((!RagingStrikesPvE.EnoughLevel || Player.HasStatus(true, StatusID.RagingStrikes)) && (!BattleVoicePvE.EnoughLevel || Player.HasStatus(true, StatusID.BattleVoice))) - { - if ((EmpyrealArrowPvE.Cooldown.IsCoolingDown && !EmpyrealArrowPvE.Cooldown.WillHaveOneChargeGCD(1) || !EmpyrealArrowPvE.EnoughLevel) && Repertoire != 3) - { - if (!Player.HasStatus(true, StatusID.StraightShotReady) && BarragePvE.CanUse(out act)) return true; - } - } - - return base.EmergencyAbility(nextGCD, out act); - } - #endregion - - #region oGCD Logic - protected override bool AttackAbility(IAction nextGCD, out IAction? act) - { - act = null; - if (Song == Song.NONE) - { - switch (FirstSong) - { - case Song.WANDERER: - if (TheWanderersMinuetPvE.CanUse(out act)) return true; - break; - - case Song.ARMY: - if (ArmysPaeonPvE.CanUse(out act)) return true; - break; - - case Song.MAGE: - if (MagesBalladPvE.CanUse(out act)) return true; - break; - } - if (TheWanderersMinuetPvE.CanUse(out act)) return true; - if (MagesBalladPvE.CanUse(out act)) return true; - if (ArmysPaeonPvE.CanUse(out act)) return true; - } - - if (IsBurst && Song != Song.NONE && MagesBalladPvE.EnoughLevel) - { - if (RagingStrikesPvE.CanUse(out act)) - { - if (BindWANDEnough && Song == Song.WANDERER && TheWanderersMinuetPvE.EnoughLevel) return true; - if (!BindWANDEnough) return true; - } - - if (RadiantFinalePvE.CanUse(out act, skipAoeCheck: true)) - { - if (Player.HasStatus(true, StatusID.RagingStrikes) && RagingStrikesPvE.Cooldown.ElapsedOneChargeAfterGCD(1)) return true; - } - - if (BattleVoicePvE.CanUse(out act, skipAoeCheck: true)) - { - if (IsLastAction(true, RadiantFinalePvE)) return true; - - if (Player.HasStatus(true, StatusID.RagingStrikes) && RagingStrikesPvE.Cooldown.ElapsedOneChargeAfterGCD(1)) return true; - } - } - - if (RadiantFinalePvE.EnoughLevel && RadiantFinalePvE.Cooldown.IsCoolingDown && BattleVoicePvE.EnoughLevel && !BattleVoicePvE.Cooldown.IsCoolingDown) return false; - - if (TheWanderersMinuetPvE.CanUse(out act, onLastAbility: true)) - { - if (SongEndAfter(ARMYRemainTime) && (Song != Song.NONE || Player.HasStatus(true, StatusID.ArmysEthos))) return true; - } - - if (Song != Song.NONE && EmpyrealArrowPvE.CanUse(out act)) return true; - - if (PitchPerfectPvE.CanUse(out act)) - { - if (SongEndAfter(3) && Repertoire > 0) return true; - - if (Repertoire == 3) return true; - - if (Repertoire == 2 && EmpyrealArrowPvE.Cooldown.WillHaveOneChargeGCD()) return true; - } - - if (MagesBalladPvE.CanUse(out act)) - { - if (Song == Song.WANDERER && SongEndAfter(WANDRemainTime) && Repertoire == 0) return true; - if (Song == Song.ARMY && SongEndAfterGCD(2) && TheWanderersMinuetPvE.Cooldown.IsCoolingDown) return true; - } - - if (ArmysPaeonPvE.CanUse(out act)) - { - if (TheWanderersMinuetPvE.EnoughLevel && SongEndAfter(MAGERemainTime) && Song == Song.MAGE) return true; - if (TheWanderersMinuetPvE.EnoughLevel && SongEndAfter(2) && MagesBalladPvE.Cooldown.IsCoolingDown && Song == Song.WANDERER) return true; - if (!TheWanderersMinuetPvE.EnoughLevel && SongEndAfter(2)) return true; - } - - if (SidewinderPvE.CanUse(out act)) - { - if (Player.HasStatus(true, StatusID.BattleVoice) && (Player.HasStatus(true, StatusID.RadiantFinale) || !RadiantFinalePvE.EnoughLevel)) return true; - - if (!BattleVoicePvE.Cooldown.WillHaveOneCharge(10) && !RadiantFinalePvE.Cooldown.WillHaveOneCharge(10)) return true; - - if (RagingStrikesPvE.Cooldown.IsCoolingDown && !Player.HasStatus(true, StatusID.RagingStrikes)) return true; - } - - if (BloodletterLogic(out act)) return true; - - return base.AttackAbility(nextGCD, out act); - } - #endregion - - #region GCD Logic - protected override bool GeneralGCD(out IAction? act) - { - if (IronJawsPvE.CanUse(out act)) return true; - if (IronJawsPvE.CanUse(out act, skipStatusProvideCheck: true) && (IronJawsPvE.Target.Target?.WillStatusEnd(30, true, IronJawsPvE.Setting.TargetStatusProvide ?? []) ?? false)) - { - if (Player.HasStatus(true, StatusID.RagingStrikes) && Player.WillStatusEndGCD(1, 0, true, StatusID.RagingStrikes)) return true; - } - - if (CanUseApexArrow(out act)) return true; - - if (BlastArrowPvE.CanUse(out act, skipAoeCheck: true)) - { - if (!Player.HasStatus(true, StatusID.RagingStrikes)) return true; - if (Player.HasStatus(true, StatusID.RagingStrikes) && BarragePvE.Cooldown.IsCoolingDown) return true; - } - - if (ShadowbitePvE.CanUse(out act)) return true; - if (QuickNockPvE.CanUse(out act)) return true; - - if (WindbitePvE.CanUse(out act)) return true; - if (VenomousBitePvE.CanUse(out act)) return true; - - if (StraightShotPvE.CanUse(out act)) return true; - if (HeavyShotPvE.CanUse(out act)) return true; - - return base.GeneralGCD(out act); - } - #endregion - - #region Extra Methods - private bool CanUseApexArrow(out IAction act) - { - if (!ApexArrowPvE.CanUse(out act, skipAoeCheck: true)) return false; - - if (QuickNockPvE.CanUse(out _) && SoulVoice == 100) return true; - - if (SoulVoice == 100 && BattleVoicePvE.Cooldown.WillHaveOneCharge(25)) return false; - - if (SoulVoice >= 80 && Player.HasStatus(true, StatusID.RagingStrikes) && Player.WillStatusEnd(10, false, StatusID.RagingStrikes)) return true; - - if (SoulVoice == 100 && Player.HasStatus(true, StatusID.RagingStrikes) && Player.HasStatus(true, StatusID.BattleVoice)) return true; - - if (Song == Song.MAGE && SoulVoice >= 80 && SongEndAfter(22) && SongEndAfter(18)) return true; - - if (!Player.HasStatus(true, StatusID.RagingStrikes) && SoulVoice == 100) return true; - - return false; - } - private bool BloodletterLogic(out IAction? act) - { - bool isBattleVoice = BattleVoicePvE.CanUse(out _); - bool isRadiantFinale = RadiantFinalePvE.CanUse(out _); - bool isRagingNow = Player.HasStatus(true, StatusID.RagingStrikes); - bool isRagingSoon = RagingStrikesPvE.Cooldown.WillHaveOneCharge(30); - bool isBloodTrait = EnhancedBloodletterTrait.EnoughLevel && BloodletterPvE.Cooldown.CurrentCharges < 3; - bool isNoBloodTrait = !EnhancedBloodletterTrait.EnoughLevel && BloodletterPvE.Cooldown.CurrentCharges < 2; - bool isEmpyrealArrowCD = EmpyrealArrowPvE.Cooldown.IsCoolingDown; - bool isEmpyrealSoon = !EmpyrealArrowPvE.Cooldown.WillHaveOneChargeGCD(); - bool isEmpyrealLevel = !EmpyrealArrowPvE.EnoughLevel; - bool isRepertoire = Repertoire != 3; - - if (RainOfDeathPvE.CanUse(out act, usedUp: true)) - { - if (isEmpyrealArrowCD || isEmpyrealSoon || isEmpyrealLevel || isRepertoire) return true; - } - - if (BloodletterPvE.CanUse(out act, usedUp: true)) - { - if (isBattleVoice || isRadiantFinale || (isRagingSoon && (isBloodTrait || isNoBloodTrait))) return false; - if (isEmpyrealArrowCD || isEmpyrealSoon || isEmpyrealLevel || isRepertoire) return true; - } - return false; - } - #endregion -} \ No newline at end of file diff --git a/BasicRotations/Ranged/BRD_Default.cs b/BasicRotations/Ranged/BRD_Default.cs index 8f49736..43bce72 100644 --- a/BasicRotations/Ranged/BRD_Default.cs +++ b/BasicRotations/Ranged/BRD_Default.cs @@ -111,9 +111,7 @@ protected override bool AttackAbility(IAction nextGCD, out IAction? act) if (Repertoire == 3) return true; - if (Repertoire == 2 && EmpyrealArrowPvE.Cooldown.WillHaveOneChargeGCD(1) && NextAbilityToNextGCD < PitchPerfectPvE.AnimationLockTime + Ping) return true; - - if (Repertoire == 2 && EmpyrealArrowPvE.Cooldown.WillHaveOneChargeGCD() && NextAbilityToNextGCD > PitchPerfectPvE.AnimationLockTime + Ping) return true; + if (Repertoire == 2 && EmpyrealArrowPvE.Cooldown.WillHaveOneChargeGCD()) return true; } if (MagesBalladPvE.CanUse(out act)) @@ -138,12 +136,7 @@ protected override bool AttackAbility(IAction nextGCD, out IAction? act) if (RagingStrikesPvE.Cooldown.IsCoolingDown && !Player.HasStatus(true, StatusID.RagingStrikes)) return true; } - if (EmpyrealArrowPvE.Cooldown.IsCoolingDown || !EmpyrealArrowPvE.Cooldown.WillHaveOneChargeGCD() || Repertoire != 3 || !EmpyrealArrowPvE.EnoughLevel) - { - if (RainOfDeathPvE.CanUse(out act, usedUp: true)) return true; - - if (BloodletterPvE.CanUse(out act, usedUp: true)) return true; - } + if (BloodletterLogic(out act)) return true; return base.AttackAbility(nextGCD, out act); } @@ -198,5 +191,30 @@ private bool CanUseApexArrow(out IAction act) return false; } + private bool BloodletterLogic(out IAction? act) + { + bool isBattleVoice = BattleVoicePvE.CanUse(out _); + bool isRadiantFinale = RadiantFinalePvE.CanUse(out _); + bool isRagingNow = Player.HasStatus(true, StatusID.RagingStrikes); + bool isRagingSoon = RagingStrikesPvE.Cooldown.WillHaveOneCharge(30); + bool isBloodTrait = EnhancedBloodletterTrait.EnoughLevel && BloodletterPvE.Cooldown.CurrentCharges < 3; + bool isNoBloodTrait = !EnhancedBloodletterTrait.EnoughLevel && BloodletterPvE.Cooldown.CurrentCharges < 2; + bool isEmpyrealArrowCD = EmpyrealArrowPvE.Cooldown.IsCoolingDown; + bool isEmpyrealSoon = !EmpyrealArrowPvE.Cooldown.WillHaveOneChargeGCD(); + bool isEmpyrealLevel = !EmpyrealArrowPvE.EnoughLevel; + bool isRepertoire = Repertoire != 3; + + if (RainOfDeathPvE.CanUse(out act, usedUp: true)) + { + if (isEmpyrealArrowCD || isEmpyrealSoon || isEmpyrealLevel || isRepertoire) return true; + } + + if (BloodletterPvE.CanUse(out act, usedUp: true)) + { + if (isBattleVoice || isRadiantFinale || (isRagingSoon && (isBloodTrait || isNoBloodTrait))) return false; + if (isEmpyrealArrowCD || isEmpyrealSoon || isEmpyrealLevel || isRepertoire) return true; + } + return false; + } #endregion -} +} \ No newline at end of file diff --git a/BasicRotations/Ranged/DNC_Beta.cs b/BasicRotations/Ranged/DNC_Beta.cs deleted file mode 100644 index b3cd77f..0000000 --- a/BasicRotations/Ranged/DNC_Beta.cs +++ /dev/null @@ -1,232 +0,0 @@ -namespace DefaultRotations.Ranged; - -[Rotation("Beta Rotations", CombatType.PvE, GameVersion = "6.58", Description = "Additonal contributions to this rotation thanks to Toshi!")] -[SourceCode(Path = "main/DefaultRotations/Ranged/DNC_Beta.cs")] -[Api(1)] -public sealed class DNC_Beta : DancerRotation -{ - #region Config Options - [RotationConfig(CombatType.PvE, Name = "Holds Tech Step if no targets in range (Warning, will drift)")] - public bool HoldTechForTargets { get; set; } = true; - - [RotationConfig(CombatType.PvE, Name = "Holds Standard Step if no targets in range (Warning, will drift & Buff may fall off)")] - public bool HoldStepForTargets { get; set; } = false; - - // Override the method for actions to be taken during countdown phase of combat - protected override IAction? CountDownAction(float remainTime) - { - // If there are 15 or fewer seconds remaining in the countdown - if (remainTime <= 15) - { - // Attempt to use Standard Step if applicable - if (StandardStepPvE.CanUse(out var act, skipAoeCheck: true)) return act; - // Fallback to executing step GCD action if Standard Step is not used - if (ExecuteStepGCD(out act)) return act; - } - // If none of the above conditions are met, fallback to the base class method - return base.CountDownAction(remainTime); - } - #endregion - - #region Emergency Logic - // Override the method for handling emergency abilities - protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) - { - // Special handling if the last action was Quadruple Technical Finish and level requirement is met - if (IsLastGCD(ActionID.QuadrupleTechnicalFinishPvE) && TechnicalStepPvE.EnoughLevel) - { - // Attempt to use Devilment ignoring clipping checks - if (DevilmentPvE.CanUse(out act, skipClippingCheck: true)) return true; - } - // Similar handling for Double Standard Finish when level requirement is not met - else if (IsLastGCD(ActionID.DoubleStandardFinishPvE) && !TechnicalStepPvE.EnoughLevel) - { - if (DevilmentPvE.CanUse(out act, skipClippingCheck: true)) return true; - } - - // If currently dancing, defer to the base class emergency handling - if (IsDancing) - { - return base.EmergencyAbility(nextGCD, out act); - } - - // Use burst medicine if cooldown for Technical Step has elapsed sufficiently - if (TechnicalStepPvE.Cooldown.ElapsedAfter(115) - && UseBurstMedicine(out act)) return true; - - // Attempt to use Fan Dance III if available - if (FanDanceIiiPvE.CanUse(out act, skipAoeCheck: true)) return true; - - // Fallback to base class method if none of the above conditions are met - return base.EmergencyAbility(nextGCD, out act); - } - #endregion - - #region oGCD Logic - // Override the method for handling attack abilities - protected override bool AttackAbility(IAction nextGCD, out IAction? act) - { - act = null; - - // If currently in the middle of a dance, no attack ability should be executed - if (IsDancing) return false; - - // Logic for using Fan Dance abilities based on certain conditions - if ((Player.HasStatus(true, StatusID.Devilment) || Feathers > 3 || !TechnicalStepPvE.EnoughLevel) && !FanDanceIiiPvE.CanUse(out _, skipAoeCheck: true)) - { - if (FanDancePvE.CanUse(out act, skipAoeCheck: true)) return true; - if (FanDanceIiPvE.CanUse(out act)) return true; - } - - // Check for conditions to use Flourish - if (((Player.HasStatus(true, StatusID.Devilment)) && (Player.HasStatus(true, StatusID.TechnicalFinish))) || ((!Player.HasStatus(true, StatusID.Devilment)) && (!Player.HasStatus(true, StatusID.TechnicalFinish)))) - { - if (!Player.HasStatus(true, StatusID.ThreefoldFanDance) && FlourishPvE.CanUse(out act)) - { - return true; - } - } - - // Attempt to use Fan Dance IV if available - if (FanDanceIvPvE.CanUse(out act, skipAoeCheck: true)) return true; - - // Attempt to use Closed Position if applicable - if (UseClosedPosition(out act)) return true; - - // Fallback to base class attack ability method if none of the above conditions are met - return base.AttackAbility(nextGCD, out act); - } - #endregion - - #region GCD Logic - // Override the method for handling general Global Cooldown (GCD) actions - protected override bool GeneralGCD(out IAction? act) - { - // If not in combat and lacking the Closed Position status, attempt to use Closed Position - if (!InCombat && !Player.HasStatus(true, StatusID.ClosedPosition) && ClosedPositionPvE.CanUse(out act)) return true; - - // Attempt to execute Dance Finish GCD or Step GCD actions - if (FinishTheDance(out act)) return true; - if (ExecuteStepGCD(out act)) return true; - - // Attempt to use Technical Step in burst mode and if in combat, checks for hostiles if bool is true - if (HoldTechForTargets) - { - if (HasHostilesInMaxRange && IsBurst && InCombat && TechnicalStepPvE.CanUse(out act, skipAoeCheck: true)) return true; - } - if (!HoldTechForTargets) - { - if (IsBurst && InCombat && TechnicalStepPvE.CanUse(out act, skipAoeCheck: true)) return true; - } - - // Delegate to AttackGCD method to handle attack actions during GCD - if (AttackGCD(out act, Player.HasStatus(true, StatusID.Devilment))) return true; - - // Fallback to base class general GCD method if none of the above conditions are met - return base.GeneralGCD(out act); - } - #endregion - - #region Extra Methods - // Helper method to handle attack actions during GCD based on certain conditions - private bool AttackGCD(out IAction? act, bool burst) - { - act = null; - - // Prevent action if currently dancing or holding too many feathers - if (IsDancing || Feathers > 3) return false; - - // Logic for using Saber Dance and Starfall Dance based on burst mode or Esprit levels - if ((burst || Esprit >= 85) && SaberDancePvE.CanUse(out act, skipAoeCheck: true)) return true; - - // Additional logic for using Tillana and Standard Step based on various checks - if (!DevilmentPvE.CanUse(out _, skipComboCheck: true)) - { - if (TillanaPvE.CanUse(out act, skipAoeCheck: true)) return true; - } - - if (StarfallDancePvE.CanUse(out act, skipAoeCheck: true)) return true; - - if (HoldStepForTargets) - { - if (HasHostilesInMaxRange && UseStandardStep(out act)) return true; - - } - if (!HoldStepForTargets) - { - if (UseStandardStep(out act)) return true; - } - // Attempt to use various dance moves based on availability and conditions - if (BloodshowerPvE.CanUse(out act)) return true; - if (FountainfallPvE.CanUse(out act)) return true; - if (RisingWindmillPvE.CanUse(out act)) return true; - if (ReverseCascadePvE.CanUse(out act)) return true; - if (BladeshowerPvE.CanUse(out act)) return true; - if (WindmillPvE.CanUse(out act)) return true; - if (FountainPvE.CanUse(out act)) return true; - if (CascadePvE.CanUse(out act)) return true; - - // Return false if no action is determined to be taken - return false; - } - // Method for Standard Step Logic - private bool UseStandardStep(out IAction act) - { - // Attempt to use Standard Step if available and certain conditions are met - if (!StandardStepPvE.CanUse(out act, skipAoeCheck: true)) return false; - if (Player.WillStatusEndGCD(2, 0, true, StatusID.StandardFinish)) return true; - - // Check for hostiles in range and technical step conditions - if (!HasHostilesInRange) return false; - if (Player.HasStatus(true, StatusID.TechnicalFinish) && Player.WillStatusEndGCD(2, 0, true, StatusID.TechnicalFinish) || TechnicalStepPvE.Cooldown.IsCoolingDown && TechnicalStepPvE.Cooldown.WillHaveOneChargeGCD(2)) return false; - - return true; - } - - // Helper method to decide usage of Closed Position based on specific conditions - private bool UseClosedPosition(out IAction act) - { - // Attempt to use Closed Position if available and certain conditions are met - if (!ClosedPositionPvE.CanUse(out act)) return false; - - if (InCombat && Player.HasStatus(true, StatusID.ClosedPosition)) - { - // Check for party members with Closed Position status - foreach (var friend in PartyMembers) - { - if (friend.HasStatus(true, StatusID.ClosedPosition_2026)) - { - // Use Closed Position if target is not the same as the friend with the status - if (ClosedPositionPvE.Target.Target != friend) return true; - break; - } - } - } - return false; - } - // Rewrite of method to hold dance finish until target is in range 14 yalms - private bool FinishTheDance(out IAction? act) - { - bool areDanceTargetsInRange = AllHostileTargets.Any(hostile => hostile.DistanceToPlayer() < 14); - - // Check for Standard Step if targets are in range or status is about to end. - if (Player.HasStatus(true, StatusID.StandardStep) && CompletedSteps == 2 && - (areDanceTargetsInRange || Player.WillStatusEnd(1f, true, StatusID.StandardStep)) && - DoubleStandardFinishPvE.CanUse(out act, skipAoeCheck: true)) - { - return true; - } - - // Check for Technical Step if targets are in range or status is about to end. - if (Player.HasStatus(true, StatusID.TechnicalStep) && CompletedSteps == 4 && - (areDanceTargetsInRange || Player.WillStatusEnd(1f, true, StatusID.TechnicalStep)) && - QuadrupleTechnicalFinishPvE.CanUse(out act, skipAoeCheck: true)) - { - return true; - } - - act = null; - return false; - } - #endregion -} diff --git a/BasicRotations/Ranged/DNC_Default.cs b/BasicRotations/Ranged/DNC_Default.cs index a97fa27..2ae303a 100644 --- a/BasicRotations/Ranged/DNC_Default.cs +++ b/BasicRotations/Ranged/DNC_Default.cs @@ -5,6 +5,13 @@ namespace DefaultRotations.Ranged; [Api(1)] public sealed class DNC_Default : DancerRotation { + #region Config Options + [RotationConfig(CombatType.PvE, Name = "Holds Tech Step if no targets in range (Warning, will drift)")] + public bool HoldTechForTargets { get; set; } = true; + + [RotationConfig(CombatType.PvE, Name = "Holds Standard Step if no targets in range (Warning, will drift & Buff may fall off)")] + public bool HoldStepForTargets { get; set; } = false; + // Override the method for actions to be taken during countdown phase of combat protected override IAction? CountDownAction(float remainTime) { @@ -19,19 +26,20 @@ public sealed class DNC_Default : DancerRotation // If none of the above conditions are met, fallback to the base class method return base.CountDownAction(remainTime); } + #endregion + #region Emergency Logic // Override the method for handling emergency abilities protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) { - act = null; // Special handling if the last action was Quadruple Technical Finish and level requirement is met - if (IsLastAction(ActionID.QuadrupleTechnicalFinishPvE) && TechnicalStepPvE.EnoughLevel) + if (IsLastGCD(ActionID.QuadrupleTechnicalFinishPvE) && TechnicalStepPvE.EnoughLevel) { // Attempt to use Devilment ignoring clipping checks if (DevilmentPvE.CanUse(out act, skipClippingCheck: true)) return true; } // Similar handling for Double Standard Finish when level requirement is not met - else if (IsLastAction(ActionID.DoubleStandardFinishPvE) && !TechnicalStepPvE.EnoughLevel) + else if (IsLastGCD(ActionID.DoubleStandardFinishPvE) && !TechnicalStepPvE.EnoughLevel) { if (DevilmentPvE.CanUse(out act, skipClippingCheck: true)) return true; } @@ -52,7 +60,9 @@ protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) // Fallback to base class method if none of the above conditions are met return base.EmergencyAbility(nextGCD, out act); } + #endregion + #region oGCD Logic // Override the method for handling attack abilities protected override bool AttackAbility(IAction nextGCD, out IAction? act) { @@ -62,7 +72,7 @@ protected override bool AttackAbility(IAction nextGCD, out IAction? act) if (IsDancing) return false; // Logic for using Fan Dance abilities based on certain conditions - if ((Player.HasStatus(true, StatusID.Devilment) || Feathers > 3 || !TechnicalStepPvE.EnoughLevel) && !FanDanceIiiPvE.CanUse(out act, skipAoeCheck: true)) + if ((Player.HasStatus(true, StatusID.Devilment) || Feathers > 3 || !TechnicalStepPvE.EnoughLevel) && !FanDanceIiiPvE.CanUse(out _, skipAoeCheck: true)) { if (FanDancePvE.CanUse(out act, skipAoeCheck: true)) return true; if (FanDanceIiPvE.CanUse(out act)) return true; @@ -86,11 +96,12 @@ protected override bool AttackAbility(IAction nextGCD, out IAction? act) // Fallback to base class attack ability method if none of the above conditions are met return base.AttackAbility(nextGCD, out act); } + #endregion + #region GCD Logic // Override the method for handling general Global Cooldown (GCD) actions protected override bool GeneralGCD(out IAction? act) { - act = null; // If not in combat and lacking the Closed Position status, attempt to use Closed Position if (!InCombat && !Player.HasStatus(true, StatusID.ClosedPosition) && ClosedPositionPvE.CanUse(out act)) return true; @@ -98,8 +109,15 @@ protected override bool GeneralGCD(out IAction? act) if (FinishTheDance(out act)) return true; if (ExecuteStepGCD(out act)) return true; - // Attempt to use Technical Step in burst mode and if in combat - if (IsBurst && InCombat && TechnicalStepPvE.CanUse(out act, skipAoeCheck: true)) return true; + // Attempt to use Technical Step in burst mode and if in combat, checks for hostiles if bool is true + if (HoldTechForTargets) + { + if (HasHostilesInMaxRange && IsBurst && InCombat && TechnicalStepPvE.CanUse(out act, skipAoeCheck: true)) return true; + } + if (!HoldTechForTargets) + { + if (IsBurst && InCombat && TechnicalStepPvE.CanUse(out act, skipAoeCheck: true)) return true; + } // Delegate to AttackGCD method to handle attack actions during GCD if (AttackGCD(out act, Player.HasStatus(true, StatusID.Devilment))) return true; @@ -107,7 +125,9 @@ protected override bool GeneralGCD(out IAction? act) // Fallback to base class general GCD method if none of the above conditions are met return base.GeneralGCD(out act); } + #endregion + #region Extra Methods // Helper method to handle attack actions during GCD based on certain conditions private bool AttackGCD(out IAction? act, bool burst) { @@ -120,15 +140,22 @@ private bool AttackGCD(out IAction? act, bool burst) if ((burst || Esprit >= 85) && SaberDancePvE.CanUse(out act, skipAoeCheck: true)) return true; // Additional logic for using Tillana and Standard Step based on various checks - if (!DevilmentPvE.CanUse(out act, skipComboCheck: true)) + if (!DevilmentPvE.CanUse(out _, skipComboCheck: true)) { if (TillanaPvE.CanUse(out act, skipAoeCheck: true)) return true; } if (StarfallDancePvE.CanUse(out act, skipAoeCheck: true)) return true; - if (UseStandardStep(out act)) return true; + if (HoldStepForTargets) + { + if (HasHostilesInMaxRange && UseStandardStep(out act)) return true; + } + if (!HoldStepForTargets) + { + if (UseStandardStep(out act)) return true; + } // Attempt to use various dance moves based on availability and conditions if (BloodshowerPvE.CanUse(out act)) return true; if (FountainfallPvE.CanUse(out act)) return true; @@ -142,7 +169,7 @@ private bool AttackGCD(out IAction? act, bool burst) // Return false if no action is determined to be taken return false; } - + // Method for Standard Step Logic private bool UseStandardStep(out IAction act) { // Attempt to use Standard Step if available and certain conditions are met @@ -177,6 +204,7 @@ private bool UseClosedPosition(out IAction act) } return false; } + // Rewrite of method to hold dance finish until target is in range 14 yalms private bool FinishTheDance(out IAction? act) { bool areDanceTargetsInRange = AllHostileTargets.Any(hostile => hostile.DistanceToPlayer() < 14); @@ -200,5 +228,5 @@ private bool FinishTheDance(out IAction? act) act = null; return false; } - -} + #endregion +} \ No newline at end of file diff --git a/BasicRotations/Ranged/MCH_Beta.cs b/BasicRotations/Ranged/MCH_Beta.cs deleted file mode 100644 index db2f5e8..0000000 --- a/BasicRotations/Ranged/MCH_Beta.cs +++ /dev/null @@ -1,195 +0,0 @@ -namespace DefaultRotations.Ranged; - -[Rotation("Beta Rotations", CombatType.PvE, GameVersion = "6.58", Description = "Additonal contributions to this rotation thanks to Toshi!")] -[SourceCode(Path = "main/DefaultRotations/Ranged/MCH_Beta.cs")] -[Api(1)] -public sealed class MCH_Beta : MachinistRotation -{ - [RotationConfig(CombatType.PvE, Name = "Uses Rook Autoturret/Automaton Queen immediately whenever you get 50 battery")] - public bool UseQueenWhenever { get; set; } = true; - - #region Countdown logic - // Defines logic for actions to take during the countdown before combat starts. - protected override IAction? CountDownAction(float remainTime) - { - if (remainTime < 5) - { - if (ReassemblePvE.CanUse(out var act)) return act; - } - if (remainTime < 2) - { - if (UseBurstMedicine(out var act)) return act; - } - return base.CountDownAction(remainTime); - } - #endregion - - #region Emergency Logic - // Determines emergency actions to take based on the next planned GCD action. - protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) - { - // Reassemble Logic - // Check next GCD action and conditions for Reassemble. - bool isReassembleUsable = - //Reassemble current # of charges and double proc protection - ReassemblePvE.Cooldown.CurrentCharges > 0 && !Player.HasStatus(true, StatusID.Reassembled) && - //Chainsaw Level Check and NextGCD Check - ((ChainSawPvE.EnoughLevel && nextGCD.IsTheSameTo(true, ChainSawPvE)) || - //AirAnchor Logic - (AirAnchorPvE.EnoughLevel && nextGCD.IsTheSameTo(true, AirAnchorPvE)) || - //Drill Logic - (DrillPvE.EnoughLevel && !ChainSawPvE.EnoughLevel && nextGCD.IsTheSameTo(true, DrillPvE)) || - //Cleanshot Logic - (!DrillPvE.EnoughLevel && CleanShotPvE.EnoughLevel && nextGCD.IsTheSameTo(true, CleanShotPvE)) || - //HotShot Logic - (!CleanShotPvE.EnoughLevel && nextGCD.IsTheSameTo(true, HotShotPvE))); - - // Keeps Ricochet and Gauss cannon Even - bool isRicochetMore = (GaussRoundPvE.Cooldown.CurrentCharges <= RicochetPvE.Cooldown.CurrentCharges); - bool isGaussMore = (GaussRoundPvE.Cooldown.CurrentCharges > RicochetPvE.Cooldown.CurrentCharges); - - // Attempt to use Reassemble if it's ready - if (isReassembleUsable) - { - if (ReassemblePvE.CanUse(out act, onLastAbility: true, skipClippingCheck: true, skipComboCheck: true, usedUp: true)) return true; - } - // Use Ricochet - if (isRicochetMore && ((!IsLastAction(true, GaussRoundPvE) && !IsLastAction(true, RicochetPvE) && Player.HasStatus(true, StatusID.Overheated)) || !Player.HasStatus(true, StatusID.Overheated))) - - { - return RicochetPvE.CanUse(out act, skipAoeCheck: true, usedUp: true); - } - // Use Gause - if (isGaussMore && ((!IsLastAction(true, GaussRoundPvE) && !IsLastAction(true, RicochetPvE) && Player.HasStatus(true, StatusID.Overheated)) || !Player.HasStatus(true, StatusID.Overheated))) - { - return GaussRoundPvE.CanUse(out act, usedUp: true); - } - return base.EmergencyAbility(nextGCD, out act); - } - #endregion - - #region oGCD Logic - // Logic for using attack abilities outside of GCD, focusing on burst windows and cooldown management. - protected override bool AttackAbility(IAction nextGCD, out IAction? act) - { - // Define conditions under which the Rook Autoturret/Queen can be used. - bool OpenerQueen = !CombatElapsedLess(20f) && CombatElapsedLess(25f); - bool CombatTimeQueen = CombatElapsedLess(60f) && !CombatElapsedLess(45f); - bool WildfireCooldownQueen = WildfirePvE.Cooldown.IsCoolingDown && WildfirePvE.Cooldown.ElapsedAfter(105f) && Battery == 100 && - (nextGCD.IsTheSameTo(true, AirAnchorPvE) || nextGCD.IsTheSameTo(true, CleanShotPvE)) || nextGCD.IsTheSameTo(true, HeatedCleanShotPvE) || nextGCD.IsTheSameTo(true, ChainSawPvE); - bool BatteryCheckQueen = Battery >= 90 && !WildfirePvE.Cooldown.ElapsedAfter(70f); - bool LastGCDCheckQueen = Battery >= 80 && !WildfirePvE.Cooldown.ElapsedAfter(77.5f) && IsLastGCD(true, AirAnchorPvE); - - // If Wildfire is active, use Hypercharge.....Period - if (Player.HasStatus(true, StatusID.Wildfire_1946)) - { - return HyperchargePvE.CanUse(out act, skipClippingCheck: true); - } - // Burst - if (IsBurst) - { - if (UseBurstMedicine(out act)) return true; - - { - if ((IsLastAbility(false, HyperchargePvE) || Heat >= 50) && !CombatElapsedLess(10) && CanUseHyperchargePvE(out _) - && WildfirePvE.CanUse(out act, onLastAbility: true, skipComboCheck: true)) return true; - } - } - // Use Hypercharge if at least 12 seconds of combat and (if wildfire will not be up in 30 seconds or if you hit 100 heat) - if (!CombatElapsedLess(12) && !Player.HasStatus(true, StatusID.Reassembled) && (!WildfirePvE.Cooldown.WillHaveOneCharge(30) || (Heat == 100))) - { - if (CanUseHyperchargePvE(out act)) return true; - } - // Rook Autoturret/Queen Logic toggle on - if (UseQueenWhenever && (OpenerQueen || CombatTimeQueen || WildfireCooldownQueen || BatteryCheckQueen || LastGCDCheckQueen)) - { - return RookAutoturretPvE.CanUse(out act, skipComboCheck: true); - } - // Rook Autoturret/Queen Logic toggle off - if (!UseQueenWhenever) - { - return RookAutoturretPvE.CanUse(out act, skipComboCheck: true); - } - // Use Barrel Stabilizer on CD if won't cap - if (BarrelStabilizerPvE.CanUse(out act)) return true; - - return base.AttackAbility(nextGCD, out act); - } - #endregion - - #region GCD Logic - // Defines the general logic for determining which global cooldown (GCD) action to take. - protected override bool GeneralGCD(out IAction? act) - { - // Checks and executes AutoCrossbow or HeatBlast if conditions are met (overheated state). - if (AutoCrossbowPvE.CanUse(out act)) return true; - if (HeatBlastPvE.CanUse(out act)) return true; - - // Executes Bioblaster, and then checks for AirAnchor or HotShot, and Drill based on availability and conditions. - if (BioblasterPvE.CanUse(out act)) return true; - // Check if SpreadShot cannot be used - if (!SpreadShotPvE.CanUse(out _)) - { - // Check if AirAnchor can be used - if (AirAnchorPvE.CanUse(out act)) return true; - - // If not at the required level for AirAnchor and HotShot can be used - if (!AirAnchorPvE.EnoughLevel && HotShotPvE.CanUse(out act)) return true; - - // Check if Drill can be used - if (DrillPvE.CanUse(out act)) return true; - } - - // Special condition for using ChainSaw outside of AoE checks if no action is chosen within 4 GCDs. - if (!CombatElapsedLessGCD(4) && ChainSawPvE.CanUse(out act, skipAoeCheck: true)) return true; - - // AoE actions: ChainSaw and SpreadShot based on their usability. - if (SpreadShotPvE.CanUse(out _)) - { - if (ChainSawPvE.CanUse(out act)) return true; - } - if (SpreadShotPvE.CanUse(out act)) return true; - - // Single target actions: CleanShot, SlugShot, and SplitShot based on their usability. - if (CleanShotPvE.CanUse(out act)) return true; - if (SlugShotPvE.CanUse(out act)) return true; - if (SplitShotPvE.CanUse(out act)) return true; - - return base.GeneralGCD(out act); - } - #endregion - - #region Extra Methods - // Extra private helper methods for determining the usability of specific abilities under certain conditions. - // These methods simplify the main logic by encapsulating specific checks related to abilities' cooldowns and prerequisites. - // Logic for Hypercharge - private bool CanUseHyperchargePvE(out IAction? act) - { - float REST_TIME = 6f; - if - //Cannot AOE - ((!SpreadShotPvE.CanUse(out _)) - && - // AirAnchor Enough Level % AirAnchor - ((AirAnchorPvE.EnoughLevel && AirAnchorPvE.Cooldown.WillHaveOneCharge(REST_TIME)) - || - // HotShot Charge Detection - (!AirAnchorPvE.EnoughLevel && HotShotPvE.EnoughLevel && HotShotPvE.Cooldown.WillHaveOneCharge(REST_TIME)) - || - // Drill Charge Detection - (DrillPvE.EnoughLevel && DrillPvE.Cooldown.WillHaveOneCharge(REST_TIME)) - || - // Chainsaw Charge Detection - (ChainSawPvE.EnoughLevel && ChainSawPvE.Cooldown.WillHaveOneCharge(REST_TIME)))) - { - act = null; - return false; - } - else - { - // Use Hypercharge - return HyperchargePvE.CanUse(out act); - } - } - #endregion -} diff --git a/BasicRotations/Ranged/MCH_Default.cs b/BasicRotations/Ranged/MCH_Default.cs index f312802..fefe014 100644 --- a/BasicRotations/Ranged/MCH_Default.cs +++ b/BasicRotations/Ranged/MCH_Default.cs @@ -7,18 +7,21 @@ namespace DefaultRotations.Ranged; [Api(1)] public sealed class MCH_Default : MachinistRotation { + [RotationConfig(CombatType.PvE, Name = "Uses Rook Autoturret/Automaton Queen immediately whenever you get 50 battery")] + public bool UseQueenWhenever { get; set; } = true; + #region Countdown logic // Defines logic for actions to take during the countdown before combat starts. protected override IAction? CountDownAction(float remainTime) { - if (remainTime < 2) - { - if (UseBurstMedicine(out var act)) return act; - } if (remainTime < 5) { if (ReassemblePvE.CanUse(out var act)) return act; } + if (remainTime < 2) + { + if (UseBurstMedicine(out var act)) return act; + } return base.CountDownAction(remainTime); } #endregion @@ -43,26 +46,27 @@ protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) //HotShot Logic (!CleanShotPvE.EnoughLevel && nextGCD.IsTheSameTo(true, HotShotPvE))); + // Keeps Ricochet and Gauss cannon Even + bool isRicochetMore = (GaussRoundPvE.Cooldown.CurrentCharges <= RicochetPvE.Cooldown.CurrentCharges); + bool isGaussMore = (GaussRoundPvE.Cooldown.CurrentCharges > RicochetPvE.Cooldown.CurrentCharges); + // Attempt to use Reassemble if it's ready if (isReassembleUsable) { if (ReassemblePvE.CanUse(out act, onLastAbility: true, skipClippingCheck: true, skipComboCheck: true, usedUp: true)) return true; } + // Use Ricochet + if (isRicochetMore && ((!IsLastAction(true, GaussRoundPvE) && !IsLastAction(true, RicochetPvE) && Player.HasStatus(true, StatusID.Overheated)) || !Player.HasStatus(true, StatusID.Overheated))) - // Prioritizes Ricochet and Gauss Round based on their current charges. - if (GaussRoundPvE.Cooldown.CurrentCharges <= RicochetPvE.Cooldown.CurrentCharges && RicochetPvE.CanUse(out act, skipClippingCheck: true, skipAoeCheck: true, usedUp: true)) { - return true; + return RicochetPvE.CanUse(out act, skipAoeCheck: true, usedUp: true); } - - // Use GaussRound if it's available, regardless of Ricochet's status. - else if (GaussRoundPvE.CanUse(out act, skipClippingCheck: true, skipAoeCheck: true, usedUp: true)) + // Use Gause + if (isGaussMore && ((!IsLastAction(true, GaussRoundPvE) && !IsLastAction(true, RicochetPvE) && Player.HasStatus(true, StatusID.Overheated)) || !Player.HasStatus(true, StatusID.Overheated))) { - return true; + return GaussRoundPvE.CanUse(out act, usedUp: true); } - return base.EmergencyAbility(nextGCD, out act); - } #endregion @@ -70,11 +74,20 @@ protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) // Logic for using attack abilities outside of GCD, focusing on burst windows and cooldown management. protected override bool AttackAbility(IAction nextGCD, out IAction? act) { + // Define conditions under which the Rook Autoturret/Queen can be used. + bool OpenerQueen = !CombatElapsedLess(20f) && CombatElapsedLess(25f); + bool CombatTimeQueen = CombatElapsedLess(60f) && !CombatElapsedLess(45f); + bool WildfireCooldownQueen = WildfirePvE.Cooldown.IsCoolingDown && WildfirePvE.Cooldown.ElapsedAfter(105f) && Battery == 100 && + (nextGCD.IsTheSameTo(true, AirAnchorPvE) || nextGCD.IsTheSameTo(true, CleanShotPvE)) || nextGCD.IsTheSameTo(true, HeatedCleanShotPvE) || nextGCD.IsTheSameTo(true, ChainSawPvE); + bool BatteryCheckQueen = Battery >= 90 && !WildfirePvE.Cooldown.ElapsedAfter(70f); + bool LastGCDCheckQueen = Battery >= 80 && !WildfirePvE.Cooldown.ElapsedAfter(77.5f) && IsLastGCD(true, AirAnchorPvE); + + // If Wildfire is active, use Hypercharge.....Period if (Player.HasStatus(true, StatusID.Wildfire_1946)) { return HyperchargePvE.CanUse(out act, skipClippingCheck: true); } - + // Burst if (IsBurst) { if (UseBurstMedicine(out act)) return true; @@ -84,18 +97,24 @@ protected override bool AttackAbility(IAction nextGCD, out IAction? act) && WildfirePvE.CanUse(out act, onLastAbility: true, skipComboCheck: true)) return true; } } - - if (!CombatElapsedLess(12) && (!WildfirePvE.Cooldown.WillHaveOneCharge(30) || (Heat == 100))) + // Use Hypercharge if at least 12 seconds of combat and (if wildfire will not be up in 30 seconds or if you hit 100 heat) + if (!CombatElapsedLess(12) && !Player.HasStatus(true, StatusID.Reassembled) && (!WildfirePvE.Cooldown.WillHaveOneCharge(30) || (Heat == 100))) { - if (!CombatElapsedLess(12) && (!Player.HasStatus(true, StatusID.Reassembled)) && CanUseHyperchargePvE(out act)) return true; + if (CanUseHyperchargePvE(out act)) return true; } - if (CanUseRookAutoturretPvE(out act)) return true; - + // Rook Autoturret/Queen Logic toggle on + if (UseQueenWhenever && (OpenerQueen || CombatTimeQueen || WildfireCooldownQueen || BatteryCheckQueen || LastGCDCheckQueen)) + { + return RookAutoturretPvE.CanUse(out act, skipComboCheck: true); + } + // Rook Autoturret/Queen Logic toggle off + if (!UseQueenWhenever) + { + return RookAutoturretPvE.CanUse(out act, skipComboCheck: true); + } + // Use Barrel Stabilizer on CD if won't cap if (BarrelStabilizerPvE.CanUse(out act)) return true; - // Skips further actions if the combat elapsed time is less than 8 seconds. - if (CombatElapsedLess(8)) return false; - return base.AttackAbility(nextGCD, out act); } #endregion @@ -110,11 +129,16 @@ protected override bool GeneralGCD(out IAction? act) // Executes Bioblaster, and then checks for AirAnchor or HotShot, and Drill based on availability and conditions. if (BioblasterPvE.CanUse(out act)) return true; + // Check if SpreadShot cannot be used if (!SpreadShotPvE.CanUse(out _)) { + // Check if AirAnchor can be used if (AirAnchorPvE.CanUse(out act)) return true; - else if (!AirAnchorPvE.EnoughLevel && HotShotPvE.CanUse(out act)) return true; + // If not at the required level for AirAnchor and HotShot can be used + if (!AirAnchorPvE.EnoughLevel && HotShotPvE.CanUse(out act)) return true; + + // Check if Drill can be used if (DrillPvE.CanUse(out act)) return true; } @@ -122,7 +146,10 @@ protected override bool GeneralGCD(out IAction? act) if (!CombatElapsedLessGCD(4) && ChainSawPvE.CanUse(out act, skipAoeCheck: true)) return true; // AoE actions: ChainSaw and SpreadShot based on their usability. - if (ChainSawPvE.CanUse(out act)) return true; + if (SpreadShotPvE.CanUse(out _)) + { + if (ChainSawPvE.CanUse(out act)) return true; + } if (SpreadShotPvE.CanUse(out act)) return true; // Single target actions: CleanShot, SlugShot, and SplitShot based on their usability. @@ -137,37 +164,25 @@ protected override bool GeneralGCD(out IAction? act) #region Extra Methods // Extra private helper methods for determining the usability of specific abilities under certain conditions. // These methods simplify the main logic by encapsulating specific checks related to abilities' cooldowns and prerequisites. - private bool CanUseRookAutoturretPvE(out IAction? act) - { - - if (AirAnchorPvE.EnoughLevel && !AirAnchorPvE.Cooldown.IsCoolingDown || AirAnchorPvE.Cooldown.ElapsedAfter(18) || - (!AirAnchorPvE.EnoughLevel && !HotShotPvE.Cooldown.IsCoolingDown || HotShotPvE.Cooldown.ElapsedAfter(18))) - { - act = null; - return false; - } - - // Use Rook Auto Turret - return RookAutoturretPvE.CanUse(out act); - } - - // Logic for Hypercharge private bool CanUseHyperchargePvE(out IAction? act) { float REST_TIME = 6f; if - - //Cannot AOE - ((!SpreadShotPvE.CanUse(out _)) && - // AirAnchor Enough Level % AirAnchor - ((AirAnchorPvE.EnoughLevel && AirAnchorPvE.Cooldown.WillHaveOneCharge(REST_TIME)) || - // HotShot Charge Detection - (!AirAnchorPvE.EnoughLevel && HotShotPvE.EnoughLevel && HotShotPvE.Cooldown.WillHaveOneCharge(REST_TIME)) || - // Drill Charge Detection - (DrillPvE.EnoughLevel && DrillPvE.Cooldown.WillHaveOneCharge(REST_TIME)) || - // Chainsaw Charge Detection - (ChainSawPvE.EnoughLevel && ChainSawPvE.Cooldown.WillHaveOneCharge(REST_TIME)))) + //Cannot AOE + ((!SpreadShotPvE.CanUse(out _)) + && + // AirAnchor Enough Level % AirAnchor + ((AirAnchorPvE.EnoughLevel && AirAnchorPvE.Cooldown.WillHaveOneCharge(REST_TIME)) + || + // HotShot Charge Detection + (!AirAnchorPvE.EnoughLevel && HotShotPvE.EnoughLevel && HotShotPvE.Cooldown.WillHaveOneCharge(REST_TIME)) + || + // Drill Charge Detection + (DrillPvE.EnoughLevel && DrillPvE.Cooldown.WillHaveOneCharge(REST_TIME)) + || + // Chainsaw Charge Detection + (ChainSawPvE.EnoughLevel && ChainSawPvE.Cooldown.WillHaveOneCharge(REST_TIME)))) { act = null; return false; @@ -178,6 +193,5 @@ private bool CanUseHyperchargePvE(out IAction? act) return HyperchargePvE.CanUse(out act); } } - #endregion -} +} \ No newline at end of file