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.
///