diff --git a/BasicRotations/PVPRotations/Tank/GNB_Default.PVP.cs b/BasicRotations/PVPRotations/Tank/GNB_Default.PVP.cs index e088d344e..1a7d52cc6 100644 --- a/BasicRotations/PVPRotations/Tank/GNB_Default.PVP.cs +++ b/BasicRotations/PVPRotations/Tank/GNB_Default.PVP.cs @@ -1,6 +1,6 @@ namespace DefaultRotations.Tank; -[Rotation("Default PVP", CombatType.PvP, GameVersion = "7.00", Description = "Beta Rotation")] +[Rotation("Default PVP", CombatType.PvP, GameVersion = "7.15", Description = "Beta Rotation")] [SourceCode(Path = "main/BasicRotations/PVPRotations/Tank/GNB_Default.PvP.cs")] [Api(4)] public sealed class GNB_DefaultPvP : GunbreakerRotation @@ -79,13 +79,32 @@ protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) return base.EmergencyAbility(nextGCD, out act); } + protected override bool DefenseSingleAbility(IAction nextGCD, out IAction? act) + { + act = null; + if (GuardCancel && Player.HasStatus(true, StatusID.Guard)) return false; + + if (HeartOfCorundumPvP.CanUse(out act)) return true; + + return base.DefenseSingleAbility(nextGCD, out act); + } + protected override bool AttackAbility(IAction nextGCD, out IAction? act) { act = null; if (GuardCancel && Player.HasStatus(true, StatusID.Guard)) return false; + if (JugularRipPvP.CanUse(out act)) return true; + if (AbdomenTearPvE.CanUse(out act, usedUp: true)) return true; + if (EyeGougePvP.CanUse(out act)) return true; + if (FatedBrandPvP.CanUse(out act, usedUp: true)) return true; + + if (BlastingZonePvP.CanUse(out act)) return true; + if (RoughDividePvP.CanUse(out act, usedUp: true)) return true; + return base.AttackAbility(nextGCD, out act); } + protected override bool GeneralAbility(IAction nextGCD, out IAction? act) { act = null; @@ -93,6 +112,7 @@ protected override bool GeneralAbility(IAction nextGCD, out IAction? act) return base.GeneralAbility(nextGCD, out act); } + protected override bool GeneralGCD(out IAction? act) { act = null; @@ -100,10 +120,20 @@ protected override bool GeneralGCD(out IAction? act) if (GuardCancel && Player.HasStatus(true, StatusID.Guard)) return false; if (!Player.HasStatus(true, StatusID.Guard) && UseSprintPvP && !Player.HasStatus(true, StatusID.Sprint) && !InCombat && SprintPvP.CanUse(out act)) return true; - if (SolidBarrelPvP.CanUse(out act)) return true; - if (BrutalShellPvP.CanUse(out act)) return true; - if (KeenEdgePvP.CanUse(out act)) return true; + if (!JugularRipPvPReady && !AbdomenTearPvPReady && !EyeGougePvPReady && !FatedBrandPvPReady + && FatedCirclePvP.CanUse(out act)) return true; + if (WickedTalonPvE.CanUse(out act, usedUp: true)) return true; + if (SavageClawPvP.CanUse(out act, usedUp: true)) return true; + if (GnashingFangPvP.CanUse(out act, usedUp: true)) return true; + + if (!SavageClawPvPReady && !WickedTalonPvPReady) + { + if (BurstStrikePvP.CanUse(out act)) return true; + if (SolidBarrelPvP.CanUse(out act)) return true; + if (BrutalShellPvP.CanUse(out act)) return true; + if (KeenEdgePvP.CanUse(out act)) return true; + } return base.GeneralGCD(out act); } diff --git a/BasicRotations/Tank/PLD_Default.cs b/BasicRotations/Tank/PLD_Default.cs index 3fb5f8a23..fc4df56ee 100644 --- a/BasicRotations/Tank/PLD_Default.cs +++ b/BasicRotations/Tank/PLD_Default.cs @@ -50,7 +50,6 @@ public class PLD_Default : PaladinRotation [RotationConfig(CombatType.PvE, Name = "Health threshold for Cover (Set to 0 to disable)")] private float CoverRatio { get; set; } = 0.3f; - private bool HasAtonementReady => Player.HasStatus(true, StatusID.AtonementReady); private bool HasSupplicationReady => Player.HasStatus(true, StatusID.SupplicationReady); private bool HasSepulchreReady => Player.HasStatus(true, StatusID.SepulchreReady); private bool HasHonorReady => Player.HasStatus(true, StatusID.BladeOfHonorReady); diff --git a/RotationSolver.Basic/Rotations/Basic/GunbreakerRotation.cs b/RotationSolver.Basic/Rotations/Basic/GunbreakerRotation.cs index 9840e2b4b..5e4dbefad 100644 --- a/RotationSolver.Basic/Rotations/Basic/GunbreakerRotation.cs +++ b/RotationSolver.Basic/Rotations/Basic/GunbreakerRotation.cs @@ -1,3 +1,5 @@ +using Dalamud.Interface.Colors; + namespace RotationSolver.Basic.Rotations.Basic; partial class GunbreakerRotation @@ -36,6 +38,9 @@ partial class GunbreakerRotation /// Gets the max combo time of the Gnashing Fang combo. /// public static short MaxTimerDuration => JobGauge.MaxTimerDuration; + #endregion + + #region Debug Status /// public override void DisplayStatus() @@ -44,10 +49,20 @@ public override void DisplayStatus() ImGui.Text("AmmoComboStep: " + AmmoComboStep.ToString()); ImGui.Text("MaxAmmo: " + MaxAmmo.ToString()); ImGui.Text("MaxTimerDuration: " + MaxTimerDuration.ToString()); + ImGui.TextColored(ImGuiColors.DalamudYellow, "PvP Actions"); + ImGui.Text("SavageClawPvPReady: " + SavageClawPvPReady.ToString()); + ImGui.Text("WickedTalonPvPReady: " + WickedTalonPvPReady.ToString()); + ImGui.Spacing(); + ImGui.Text("HypervelocityPvPReady: " + HypervelocityPvPReady.ToString()); + ImGui.Text("FatedBrandPvPReady: " + FatedBrandPvPReady.ToString()); + ImGui.Text("JugularRipPvPReady: " + JugularRipPvPReady.ToString()); + ImGui.Text("AbdomenTearPvPReady: " + AbdomenTearPvPReady.ToString()); + ImGui.Text("EyeGougePvPReady: " + EyeGougePvPReady.ToString()); + ImGui.Spacing(); + ImGui.Text("HasTerminalTrigger: " + HasTerminalTrigger.ToString()); } #endregion - #region PvE Actions static partial void ModifyKeenEdgePvE(ref ActionSetting setting) @@ -71,7 +86,7 @@ static partial void ModifyBrutalShellPvE(ref ActionSetting setting) static partial void ModifyCamouflagePvE(ref ActionSetting setting) { - setting.ActionCheck = () => Player.IsTargetOnSelf(); + setting.TargetType = TargetType.Self; } static partial void ModifyDemonSlicePvE(ref ActionSetting setting) @@ -298,13 +313,126 @@ static partial void ModifyLionHeartPvE(ref ActionSetting setting) #endregion + #region PvP Actions Unassignable + + /// + /// Gnashing Fang 2 + /// + public static bool SavageClawPvPReady => Service.GetAdjustedActionId(ActionID.GnashingFangPvP) == ActionID.SavageClawPvP; + + /// + /// Gnashing Fang 3 + /// + public static bool WickedTalonPvPReady => Service.GetAdjustedActionId(ActionID.GnashingFangPvP) == ActionID.WickedTalonPvP; + + /// + /// + /// + public static bool HypervelocityPvPReady => Service.GetAdjustedActionId(ActionID.ContinuationPvP) == ActionID.HypervelocityPvP; + + /// + /// + /// + public static bool FatedBrandPvPReady => Service.GetAdjustedActionId(ActionID.ContinuationPvP) == ActionID.FatedBrandPvP; + + /// + /// + /// + public static bool JugularRipPvPReady => Service.GetAdjustedActionId(ActionID.ContinuationPvP) == ActionID.JugularRipPvP; + + /// + /// + /// + public static bool AbdomenTearPvPReady => Service.GetAdjustedActionId(ActionID.ContinuationPvP) == ActionID.AbdomenTearPvP; + + /// + /// + /// + public static bool EyeGougePvPReady => Service.GetAdjustedActionId(ActionID.ContinuationPvP) == ActionID.EyeGougePvP; + #endregion + + /// + /// + /// + public static bool HasTerminalTrigger => !Player.WillStatusEndGCD(0, 0, true, StatusID.RelentlessRush); + #region PvP Actions + static partial void ModifyGnashingFangPvP(ref ActionSetting setting) + { + + } + + static partial void ModifyFatedCirclePvP(ref ActionSetting setting) + { + setting.CreateConfig = () => new ActionConfig() + { + AoeCount = 1, + }; + } + + static partial void ModifyContinuationPvP(ref ActionSetting setting) + { + setting.CreateConfig = () => new ActionConfig() + { + AoeCount = 1, + }; + } + static partial void ModifyRoughDividePvP(ref ActionSetting setting) { setting.SpecialType = SpecialActionType.MovingForward; } + static partial void ModifyBlastingZonePvP(ref ActionSetting setting) + { + + } + + static partial void ModifyHeartOfCorundumPvP(ref ActionSetting setting) + { + + } + + static partial void ModifySavageClawPvP(ref ActionSetting setting) + { + setting.ActionCheck = () => SavageClawPvPReady; + } + + static partial void ModifyWickedTalonPvP(ref ActionSetting setting) + { + setting.ActionCheck = () => WickedTalonPvPReady; + } + + static partial void ModifyHypervelocityPvP(ref ActionSetting setting) + { + setting.ActionCheck = () => HypervelocityPvPReady; + } + + static partial void ModifyFatedBrandPvP(ref ActionSetting setting) + { + setting.ActionCheck = () => FatedBrandPvPReady; + setting.CreateConfig = () => new ActionConfig() + { + AoeCount = 1, + }; + } + + static partial void ModifyJugularRipPvP(ref ActionSetting setting) + { + setting.ActionCheck = () => JugularRipPvPReady; + } + + static partial void ModifyAbdomenTearPvP(ref ActionSetting setting) + { + setting.ActionCheck = () => AbdomenTearPvPReady; + } + + static partial void ModifyEyeGougePvP(ref ActionSetting setting) + { + setting.ActionCheck = () => EyeGougePvPReady; + } + /// protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) {