From e519419f333d3d25d06c62fa0deab88a7bc97331 Mon Sep 17 00:00:00 2001 From: LTS-FFXIV <127939494+LTS-FFXIV@users.noreply.github.com> Date: Sat, 28 Sep 2024 18:45:13 -0500 Subject: [PATCH] Nuget bump and moved all ability call logic to rotations --- BasicRotations/Melee/MNK_Default.cs | 30 ++++++++++++++++++++++++++- BasicRotations/Melee/RPR_Default.cs | 8 +++---- BasicRotations/Melee/SAM_Default.cs | 8 +++---- BasicRotations/Melee/VPR_Default.cs | 4 ++-- BasicRotations/Ranged/BRD_Default.cs | 21 +++++++++++++++++++ BasicRotations/Ranged/DNC_Default.cs | 22 ++++++++++++++++++++ BasicRotations/Ranged/MCH_Default.cs | 8 +++++++ BasicRotations/Ranged/zMCH_Beta.cs | 12 +++++++++++ BasicRotations/Ranged/zMCH_Beta_2.cs | 8 +++++++ BasicRotations/RebornRotations.csproj | 2 +- BasicRotations/Tank/PLD_Default.cs | 17 +++++++++++++++ 11 files changed, 128 insertions(+), 12 deletions(-) diff --git a/BasicRotations/Melee/MNK_Default.cs b/BasicRotations/Melee/MNK_Default.cs index 163eee0..6e0ef63 100644 --- a/BasicRotations/Melee/MNK_Default.cs +++ b/BasicRotations/Melee/MNK_Default.cs @@ -61,6 +61,34 @@ protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) return base.EmergencyAbility(nextGCD, out act); } + [RotationDesc(ActionID.ThunderclapPvE)] + protected override bool MoveForwardAbility(IAction nextGCD, out IAction? act) + { + if (ThunderclapPvE.CanUse(out act)) return true; + return base.MoveForwardAbility(nextGCD, out act); + } + + [RotationDesc(ActionID.FeintPvE)] + protected override bool DefenseAreaAbility(IAction nextGCD, out IAction? act) + { + if (FeintPvE.CanUse(out act)) return true; + return base.DefenseAreaAbility(nextGCD, out act); + } + + [RotationDesc(ActionID.MantraPvE)] + protected override bool HealAreaAbility(IAction nextGCD, out IAction? act) + { + if (MantraPvE.CanUse(out act)) return true; + return base.HealAreaAbility(nextGCD, out act); + } + + [RotationDesc(ActionID.RiddleOfEarthPvE)] + protected override bool DefenseSingleAbility(IAction nextGCD, out IAction? act) + { + if (RiddleOfEarthPvE.CanUse(out act, usedUp: true)) return true; + return base.DefenseSingleAbility(nextGCD, out act); + } + protected override bool AttackAbility(IAction nextGCD, out IAction? act) { act = null; @@ -68,7 +96,7 @@ protected override bool AttackAbility(IAction nextGCD, out IAction? act) { return false; } - + // you need to position yourself in the centre of the mobs if they are large, that range is only 3 yarms if (AutoPB_AOE && NumberOfHostilesInRange >= 2) { diff --git a/BasicRotations/Melee/RPR_Default.cs b/BasicRotations/Melee/RPR_Default.cs index 4205fe2..783cbff 100644 --- a/BasicRotations/Melee/RPR_Default.cs +++ b/BasicRotations/Melee/RPR_Default.cs @@ -148,8 +148,8 @@ protected override bool GeneralGCD(out IAction? act) } // Try using Gallows/Gibbet that player is in position for when without Enchanced status - if (GallowsPvE.CanUse(out act, skipComboCheck: true) && CanHitPositional(EnemyPositional.Rear, GallowsPvE.Target.Target)) return true; - if (GibbetPvE.CanUse(out act, skipComboCheck: true) && CanHitPositional(EnemyPositional.Flank, GibbetPvE.Target.Target)) return true; + if (GallowsPvE.CanUse(out act, skipComboCheck: true) && GallowsPvE.Target.Target != null && CanHitPositional(EnemyPositional.Rear, GallowsPvE.Target.Target)) return true; + if (GibbetPvE.CanUse(out act, skipComboCheck: true) && GibbetPvE.Target.Target != null && CanHitPositional(EnemyPositional.Flank, GibbetPvE.Target.Target)) return true; if (GallowsPvE.CanUse(out act, skipComboCheck: true)) return true; if (GibbetPvE.CanUse(out act, skipComboCheck: true)) return true; @@ -205,8 +205,8 @@ private bool ItsGluttonyTime(out IAction? act) } // Try using Executioners Gallows/Gibbet that player is in position for when without Enchanced status - if (ExecutionersGallowsPvE.CanUse(out act, skipComboCheck: true) && CanHitPositional(EnemyPositional.Rear, ExecutionersGallowsPvE.Target.Target)) return true; - if (ExecutionersGibbetPvE.CanUse(out act, skipComboCheck: true) && CanHitPositional(EnemyPositional.Flank, ExecutionersGibbetPvE.Target.Target)) return true; + if (ExecutionersGallowsPvE.CanUse(out act, skipComboCheck: true) && ExecutionersGallowsPvE.Target.Target != null && CanHitPositional(EnemyPositional.Rear, ExecutionersGallowsPvE.Target.Target)) return true; + if (ExecutionersGibbetPvE.CanUse(out act, skipComboCheck: true) && ExecutionersGibbetPvE.Target.Target != null && CanHitPositional(EnemyPositional.Flank, ExecutionersGibbetPvE.Target.Target)) return true; if (ExecutionersGallowsPvE.CanUse(out act, skipComboCheck: true)) return true; if (ExecutionersGibbetPvE.CanUse(out act, skipComboCheck: true)) return true; diff --git a/BasicRotations/Melee/SAM_Default.cs b/BasicRotations/Melee/SAM_Default.cs index 8f7c331..8e50394 100644 --- a/BasicRotations/Melee/SAM_Default.cs +++ b/BasicRotations/Melee/SAM_Default.cs @@ -164,15 +164,15 @@ protected override bool GeneralGCD(out IAction? act) YukikazePvE.CanUse(out act, skipComboCheck: HaveMeikyoShisui && HasGetsu && HasKa)) return true; // single target 123 combo's 3 or used 3 directly during burst when MeikyoShisui is active, while also trying to start with the one that player is in position for extra DMG - if (GekkoPvE.CanUse(out act, skipComboCheck: HaveMeikyoShisui && !HasGetsu) && CanHitPositional(EnemyPositional.Rear, GekkoPvE.Target.Target)) return true; - if (KashaPvE.CanUse(out act, skipComboCheck: HaveMeikyoShisui && !HasKa) && CanHitPositional(EnemyPositional.Flank, KashaPvE.Target.Target)) return true; + if (GekkoPvE.CanUse(out act, skipComboCheck: HaveMeikyoShisui && !HasGetsu) && GekkoPvE.Target.Target != null && CanHitPositional(EnemyPositional.Rear, GekkoPvE.Target.Target)) return true; + if (KashaPvE.CanUse(out act, skipComboCheck: HaveMeikyoShisui && !HasKa) && KashaPvE.Target.Target != null && CanHitPositional(EnemyPositional.Flank, KashaPvE.Target.Target)) return true; if (GekkoPvE.CanUse(out act, skipComboCheck: HaveMeikyoShisui && !HasGetsu)) return true; if (KashaPvE.CanUse(out act, skipComboCheck: HaveMeikyoShisui && !HasKa)) return true; // single target 123 combo's 2, while also trying to start with the one that player is in position for extra DMG - if (!HasGetsu && JinpuPvE.CanUse(out act) && (CanHitPositional(EnemyPositional.Rear, JinpuPvE.Target.Target) || (!HasMoon && HasFlower))) return true; - if (!HasKa && ShifuPvE.CanUse(out act) && (CanHitPositional(EnemyPositional.Flank, ShifuPvE.Target.Target) || (!HasFlower && HasMoon))) return true; + if (!HasGetsu && JinpuPvE.CanUse(out act) && JinpuPvE.Target.Target != null && (CanHitPositional(EnemyPositional.Rear, JinpuPvE.Target.Target) || (!HasMoon && HasFlower))) return true; + if (!HasKa && ShifuPvE.CanUse(out act) && ShifuPvE.Target.Target != null && (CanHitPositional(EnemyPositional.Flank, ShifuPvE.Target.Target) || (!HasFlower && HasMoon))) return true; if ((!HasMoon || IsMoonTimeLessThanFlower || !ShifuPvE.EnoughLevel) && JinpuPvE.CanUse(out act)) return true; if ((!HasFlower || !IsMoonTimeLessThanFlower) && ShifuPvE.CanUse(out act)) return true; diff --git a/BasicRotations/Melee/VPR_Default.cs b/BasicRotations/Melee/VPR_Default.cs index f10889c..dcb0687 100644 --- a/BasicRotations/Melee/VPR_Default.cs +++ b/BasicRotations/Melee/VPR_Default.cs @@ -167,8 +167,8 @@ protected override bool GeneralGCD(out IAction? act) ////Single Target Dread Combo // Try using Coil that player is in position for extra damage first - if (HuntersCoilPvE.CanUse(out act, skipComboCheck: true) && CanHitPositional(EnemyPositional.Flank, HuntersCoilPvE.Target.Target)) return true; - if (SwiftskinsCoilPvE.CanUse(out act, skipComboCheck: true) && CanHitPositional(EnemyPositional.Rear, SwiftskinsCoilPvE.Target.Target)) return true; + if (HuntersCoilPvE.CanUse(out act, skipComboCheck: true) && HuntersCoilPvE.Target.Target != null && CanHitPositional(EnemyPositional.Flank, HuntersCoilPvE.Target.Target)) return true; + if (SwiftskinsCoilPvE.CanUse(out act, skipComboCheck: true) && SwiftskinsCoilPvE.Target.Target != null && CanHitPositional(EnemyPositional.Rear, SwiftskinsCoilPvE.Target.Target)) return true; if (HuntersCoilPvE.CanUse(out act, skipComboCheck: true)) return true; if (SwiftskinsCoilPvE.CanUse(out act, skipComboCheck: true)) return true; diff --git a/BasicRotations/Ranged/BRD_Default.cs b/BasicRotations/Ranged/BRD_Default.cs index a6f9c3b..a48b67c 100644 --- a/BasicRotations/Ranged/BRD_Default.cs +++ b/BasicRotations/Ranged/BRD_Default.cs @@ -68,6 +68,27 @@ protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) return base.EmergencyAbility(nextGCD, out act); } + [RotationDesc(ActionID.TheWardensPaeanPvE)] + protected override bool DispelGCD(out IAction? act) + { + if (TheWardensPaeanPvE.CanUse(out act)) return true; + return base.DispelGCD(out act); + } + + [RotationDesc(ActionID.NaturesMinnePvE)] + protected override bool HealSingleAbility(IAction nextGCD, out IAction? act) + { + if (NaturesMinnePvE.CanUse(out act)) return true; + return base.HealSingleAbility(nextGCD, out act); + } + + [RotationDesc(ActionID.TroubadourPvE)] + protected override bool DefenseAreaAbility(IAction nextGCD, out IAction act) + { + if (TroubadourPvE.CanUse(out act)) return true; + return false; + } + protected override bool AttackAbility(IAction nextGCD, out IAction? act) { act = null; diff --git a/BasicRotations/Ranged/DNC_Default.cs b/BasicRotations/Ranged/DNC_Default.cs index 7291adb..90bd9b1 100644 --- a/BasicRotations/Ranged/DNC_Default.cs +++ b/BasicRotations/Ranged/DNC_Default.cs @@ -67,6 +67,28 @@ protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) return false; } + [RotationDesc(ActionID.CuringWaltzPvE, ActionID.ImprovisationPvE)] + protected override bool HealAreaAbility(IAction nextGCD, out IAction act) + { + if (CuringWaltzPvE.CanUse(out act, usedUp: true)) return true; + if (ImprovisationPvE.CanUse(out act, usedUp: true)) return true; + return false; + } + + [RotationDesc(ActionID.ShieldSambaPvE)] + protected override bool DefenseAreaAbility(IAction nextGCD, out IAction act) + { + if (ShieldSambaPvE.CanUse(out act, usedUp: true)) return true; + return false; + } + + [RotationDesc(ActionID.EnAvantPvE)] + protected override bool MoveForwardAbility(IAction nextGCD, out IAction act) + { + if (EnAvantPvE.CanUse(out act, usedUp: true)) return true; + return false; + } + // Override the method for handling attack abilities protected override bool AttackAbility(IAction nextGCD, out IAction? act) { diff --git a/BasicRotations/Ranged/MCH_Default.cs b/BasicRotations/Ranged/MCH_Default.cs index 4f30a7a..0989b6e 100644 --- a/BasicRotations/Ranged/MCH_Default.cs +++ b/BasicRotations/Ranged/MCH_Default.cs @@ -65,6 +65,14 @@ protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) return base.EmergencyAbility(nextGCD, out act); } + [RotationDesc(ActionID.TacticianPvE, ActionID.DismantlePvE)] + protected override bool DefenseAreaAbility(IAction nextGCD, out IAction act) + { + if (TacticianPvE.CanUse(out act, skipAoeCheck: true)) return true; + if (DismantlePvE.CanUse(out act, skipAoeCheck: true)) return true; + return false; + } + // Logic for using attack abilities outside of GCD, focusing on burst windows and cooldown management. protected override bool AttackAbility(IAction nextGCD, out IAction? act) { diff --git a/BasicRotations/Ranged/zMCH_Beta.cs b/BasicRotations/Ranged/zMCH_Beta.cs index 0264f7f..0cf6d9a 100644 --- a/BasicRotations/Ranged/zMCH_Beta.cs +++ b/BasicRotations/Ranged/zMCH_Beta.cs @@ -20,6 +20,9 @@ public sealed class zMCH_Beta : MachinistRotation [RotationConfig(CombatType.PvE, Name = "Use burst medicine when available for midfight burst phase (requires auto burst option on)")] private bool MidfightBurstMeds { get; set; } = false; + + [RotationConfig(CombatType.PvE, Name = "Prevent the use of defense abilties during hypercharge burst")] + private bool BurstDefense { get; set; } = false; #endregion #region Countdown logic @@ -58,6 +61,15 @@ protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) return base.EmergencyAbility(nextGCD, out act); } + [RotationDesc(ActionID.TacticianPvE, ActionID.DismantlePvE)] + protected override bool DefenseAreaAbility(IAction nextGCD, out IAction? act) + { + if ((!BurstDefense || (BurstDefense && !IsOverheated)) && TacticianPvE.CanUse(out act, skipAoeCheck: true)) return true; + if ((!BurstDefense || (BurstDefense && !IsOverheated)) && DismantlePvE.CanUse(out act, skipAoeCheck: true)) return true; + + return base.DefenseAreaAbility(nextGCD, out 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) { diff --git a/BasicRotations/Ranged/zMCH_Beta_2.cs b/BasicRotations/Ranged/zMCH_Beta_2.cs index 9976270..c36fde7 100644 --- a/BasicRotations/Ranged/zMCH_Beta_2.cs +++ b/BasicRotations/Ranged/zMCH_Beta_2.cs @@ -71,6 +71,14 @@ protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) return base.EmergencyAbility(nextGCD, out act); } + [RotationDesc(ActionID.TacticianPvE, ActionID.DismantlePvE)] + protected override bool DefenseAreaAbility(IAction nextGCD, out IAction act) + { + if (TacticianPvE.CanUse(out act, skipAoeCheck: true)) return true; + if (DismantlePvE.CanUse(out act, skipAoeCheck: true)) return true; + return false; + } + // Logic for using attack abilities outside of GCD, focusing on burst windows and cooldown management. protected override bool AttackAbility(IAction nextGCD, out IAction? act) { diff --git a/BasicRotations/RebornRotations.csproj b/BasicRotations/RebornRotations.csproj index fa8c621..b9f5cf8 100644 --- a/BasicRotations/RebornRotations.csproj +++ b/BasicRotations/RebornRotations.csproj @@ -16,7 +16,7 @@ - + diff --git a/BasicRotations/Tank/PLD_Default.cs b/BasicRotations/Tank/PLD_Default.cs index 8757d10..7bc4830 100644 --- a/BasicRotations/Tank/PLD_Default.cs +++ b/BasicRotations/Tank/PLD_Default.cs @@ -83,6 +83,9 @@ protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) { if (Player.HasStatus(true, StatusID.Cover) && HallowedWithCover && HallowedGroundPvE.CanUse(out act)) return true; + if (HallowedGroundPvE.CanUse(out act) + && Player.GetHealthRatio() <= HealthForDyingTanks) return true; + if ((Player.HasStatus(true, StatusID.Rampart) || Player.HasStatus(true, StatusID.Sentinel)) && InterventionPvE.CanUse(out act) && InterventionPvE.Target.Target?.GetHealthRatio() < 0.6) return true; @@ -93,6 +96,13 @@ protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) return base.EmergencyAbility(nextGCD, out act); } + [RotationDesc(ActionID.IntervenePvE)] + protected override bool MoveForwardAbility(IAction nextGCD, out IAction? act) + { + if (IntervenePvE.CanUse(out act)) return true; + return base.MoveForwardAbility(nextGCD, out act); + } + [RotationDesc(ActionID.SentinelPvE, ActionID.RampartPvE, ActionID.BulwarkPvE, ActionID.SheltronPvE, ActionID.ReprisalPvE)] protected override bool DefenseSingleAbility(IAction nextGCD, out IAction? act) { @@ -218,6 +228,13 @@ protected override bool GeneralGCD(out IAction? act) return base.GeneralGCD(out act); } + + [RotationDesc(ActionID.ClemencyPvE)] + protected override bool HealSingleGCD(out IAction? act) + { + if (ClemencyPvE.CanUse(out act)) return true; + return base.HealSingleGCD(out act); + } #endregion #region Extra Methods