diff --git a/BasicRotations/Magical/SMN_Default.cs b/BasicRotations/Magical/SMN_Default.cs index c5333653..994e3699 100644 --- a/BasicRotations/Magical/SMN_Default.cs +++ b/BasicRotations/Magical/SMN_Default.cs @@ -21,10 +21,14 @@ public enum SummonOrderType : byte [Description("Ruby-Emerald-Topaz")] RubyEmeraldTopaz, } - [RotationConfig(CombatType.PvE, Name = "Use Crimson Cyclone. Will use at any range, regardless of saftey use with caution.")] + [RotationConfig(CombatType.PvE, Name = "Use Crimson Cyclone at any range, regardless of saftey use with caution (Enabling this ignores the below distance setting).")] public bool AddCrimsonCyclone { get; set; } = true; - [RotationConfig(CombatType.PvE, Name = "Use Crimson Cyclone. Even When MOVING")] + [Range(1, 20, ConfigUnitType.Yalms)] + [RotationConfig(CombatType.PvE, Name = "Max distance you can be from the target for Crimson Cyclone use")] + public float CrimsonCycloneDistance { get; set; } = 3.0f; + + [RotationConfig(CombatType.PvE, Name = "Use Crimson Cyclone when moving")] public bool AddCrimsonCycloneMoving { get; set; } = false; [RotationConfig(CombatType.PvE, Name = "Use Swiftcast on Garuda")] @@ -190,7 +194,7 @@ protected override bool GeneralGCD(out IAction? act) if (GemshinePvE.CanUse(out act)) return true; - if ((!IsMoving || AddCrimsonCycloneMoving) && AddCrimsonCyclone && CrimsonCyclonePvE.CanUse(out act, skipAoeCheck: true)) return true; + if ((!IsMoving || AddCrimsonCycloneMoving) && (AddCrimsonCyclone || CrimsonCyclonePvE.Target.Target?.DistanceToPlayer() <= CrimsonCycloneDistance) && CrimsonCyclonePvE.CanUse(out act, skipAoeCheck: true)) return true; if (!SummonBahamutPvE.EnoughLevel && HasHostilesInRange && AetherchargePvE.CanUse(out act)) return true; diff --git a/BasicRotations/Tank/PLD_Default.cs b/BasicRotations/Tank/PLD_Default.cs index 5d932231..a9724d8c 100644 --- a/BasicRotations/Tank/PLD_Default.cs +++ b/BasicRotations/Tank/PLD_Default.cs @@ -83,7 +83,8 @@ protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) if (!RageOfHalonePvE.EnoughLevel && nextGCD.IsTheSameTo(true, RiotBladePvE, TotalEclipsePvE) && FightOrFlightPvE.CanUse(out act)) return true; if (!ProminencePvE.EnoughLevel && nextGCD.IsTheSameTo(true, RageOfHalonePvE, TotalEclipsePvE) && FightOrFlightPvE.CanUse(out act)) return true; if (!AtonementPvE.EnoughLevel && nextGCD.IsTheSameTo(true, RoyalAuthorityPvE, ProminencePvE) && FightOrFlightPvE.CanUse(out act)) return true; - if (AtonementPvE.EnoughLevel && (Player.HasStatus(true, StatusID.AtonementReady) || IsLastAction(true, RoyalAuthorityPvE)) && FightOrFlightPvE.CanUse(out act)) return true; + if (AtonementPvE.EnoughLevel && (Player.HasStatus(true, StatusID.AtonementReady, StatusID.SepulchreReady, StatusID.SupplicationReady, StatusID.DivineMight) || IsLastAction(true, RoyalAuthorityPvE)) && FightOrFlightPvE.CanUse(out act)) return true; + // if requiscat is able to proc confiteor, use it immediately after Fight or Flight if (RequiescatMasteryTrait.EnoughLevel) @@ -215,9 +216,16 @@ protected override bool GeneralGCD(out IAction? act) if (GoringBladePvE.CanUse(out act)) return true; // Atonement Combo - if (SepulchrePvE.CanUse(out act)) return true; - if (SupplicationPvE.CanUse(out act)) return true; - if (AtonementPvE.CanUse(out act)) return true; + if ((!FightOrFlightPvE.Cooldown.WillHaveOneCharge(1) || HasFightOrFlight || Player.WillStatusEndGCD(1, 0, true, StatusID.AtonementReady)) && AtonementPvE.CanUse(out act)) return true; + if (((!HasAtonementReady && (SepulchreReady || SupplicationReady || HasDivineMight)) || + (HasAtonementReady && !HasDivineMight)) && + !Player.HasStatus(true, StatusID.Medicated) && !HasFightOrFlight && !RageOfHalonePvE.CanUse(out act, skipComboCheck: false)) + { + if (RiotBladePvE.CanUse(out act) || FastBladePvE.CanUse(out act)) return true; + } + if ((RageOfHalonePvE.CanUse(out _, skipComboCheck: false) || HasFightOrFlight || Player.WillStatusEndGCD(1, 0, true, StatusID.SupplicationReady)) && SupplicationPvE.CanUse(out act)) return true; + if (RequiescatStacks > 0 && IsLastGCD(true, SupplicationPvE) && !HasFightOrFlight && HolySpiritPvE.CanUse(out act, skipCastingCheck: true)) return true; + if ((RageOfHalonePvE.CanUse(out _, skipComboCheck: false) || HasFightOrFlight || Player.WillStatusEndGCD(1, 0, true, StatusID.SepulchreReady)) && SepulchrePvE.CanUse(out act)) return true; //AoE if ((HasDivineMight || RequiescatStacks > 0) && HolyCirclePvE.CanUse(out act, skipCastingCheck: true)) return true; @@ -227,7 +235,7 @@ protected override bool GeneralGCD(out IAction? act) //Single Target if ((HasDivineMight || RequiescatStacks > 0) && HolySpiritPvE.CanUse(out act, skipCastingCheck: true)) return true; - if (RoyalAuthorityPvE.CanUse(out act)) return true; + if (!SupplicationReady && !SepulchreReady && !HasAtonementReady && !HasDivineMight && RoyalAuthorityPvE.CanUse(out act)) return true; if (RageOfHalonePvE.CanUse(out act)) return true; if (RiotBladePvE.CanUse(out act)) return true; if (FastBladePvE.CanUse(out act)) return true; diff --git a/RotationSolver.Basic/Helpers/IActionHelper.cs b/RotationSolver.Basic/Helpers/IActionHelper.cs index 581b848b..e6a4f646 100644 --- a/RotationSolver.Basic/Helpers/IActionHelper.cs +++ b/RotationSolver.Basic/Helpers/IActionHelper.cs @@ -154,4 +154,34 @@ private static ActionID[] GetIDFromActions(bool isAdjust, params IAction[] actio } return result; } + + /// + /// Determines if the last combo action matches any of the provided actions. + /// + /// Whether to use the adjusted ID. + /// The actions to check against. + /// True if the last combo action matches any of the provided actions, otherwise false. + internal static bool IsLastComboAction(bool isAdjust, params IAction[] actions) + { + return actions != null && IsLastComboAction(GetIDFromActions(isAdjust, actions)); + } + + /// + /// Determines if the last combo action matches any of the provided action IDs. + /// + /// The action IDs to check against. + /// True if the last combo action matches any of the provided action IDs, otherwise false. + internal static bool IsLastComboAction(params ActionID[] ids) + { + return IsActionID(DataCenter.LastComboAction, ids); + } + + /// + /// Determines if the last action was a combo action. + /// + /// True if the last action was a combo action, otherwise false. + public static bool IsLastActionCombo() + { + return DataCenter.LastAction == DataCenter.LastComboAction; + } } \ No newline at end of file diff --git a/RotationSolver.Basic/Rotations/Basic/PaladinRotation.cs b/RotationSolver.Basic/Rotations/Basic/PaladinRotation.cs index a79403e7..7dd80a65 100644 --- a/RotationSolver.Basic/Rotations/Basic/PaladinRotation.cs +++ b/RotationSolver.Basic/Rotations/Basic/PaladinRotation.cs @@ -34,7 +34,6 @@ public static byte RequiescatStacks public static byte OathGauge => JobGauge.OathGauge; #endregion - #region Status Tracking /// diff --git a/RotationSolver.Basic/Rotations/CustomRotation_OtherInfo.cs b/RotationSolver.Basic/Rotations/CustomRotation_OtherInfo.cs index 6ab48033..238ff255 100644 --- a/RotationSolver.Basic/Rotations/CustomRotation_OtherInfo.cs +++ b/RotationSolver.Basic/Rotations/CustomRotation_OtherInfo.cs @@ -182,6 +182,11 @@ public static bool CanHitPositional(EnemyPositional positional, IBattleChara ene /// protected static IEnumerable AllHostileTargets => DataCenter.AllHostileTargets; + /// + /// All targets. This includes both hostile and friendly targets. + /// + protected static IEnumerable AllTargets => DataCenter.AllTargets; + /// /// Average time to kill for all targets. /// @@ -501,6 +506,32 @@ public static bool IsLastAction(params ActionID[] ids) return IActionHelper.IsLastAction(ids); } + /// + /// Last used Combo Action. + ///
WARNING: Do Not make this method the main of your rotation.
+ ///
+ /// Check for adjust id not raw id. + /// True if any of this is matched. + /// + [Description("Just used Combo Action")] + public static bool IsLastComboAction(bool isAdjust, params IAction[] actions) + { + CountingOfLastUsing++; + return IActionHelper.IsLastComboAction(isAdjust, actions); + } + + /// + /// Last used Combo Action. + ///
WARNING: Do Not make this method the main of your rotation.
+ ///
+ /// True if any of this is matched. + /// + public static bool IsLastComboAction(params ActionID[] ids) + { + CountingOfLastUsing++; + return IActionHelper.IsLastComboAction(ids); + } + /// ///
WARNING: Do Not make this method the main of your rotation.
///