Skip to content

Commit

Permalink
Merge pull request #541 from FFXIV-CombatReborn/GNBPVP
Browse files Browse the repository at this point in the history
Update GNB and PLD classes for new PvP abilities and fixes
  • Loading branch information
LTS-FFXIV authored Jan 7, 2025
2 parents 69f64bf + 1f3c006 commit be96abf
Show file tree
Hide file tree
Showing 3 changed files with 164 additions and 7 deletions.
38 changes: 34 additions & 4 deletions BasicRotations/PVPRotations/Tank/GNB_Default.PVP.cs
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -79,31 +79,61 @@ 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;
if (GuardCancel && Player.HasStatus(true, StatusID.Guard)) return false;

return base.GeneralAbility(nextGCD, out act);
}

protected override bool GeneralGCD(out IAction? act)
{
act = null;
// Early exits for Guard status or Sprint usage
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);
}
Expand Down
1 change: 0 additions & 1 deletion BasicRotations/Tank/PLD_Default.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
132 changes: 130 additions & 2 deletions RotationSolver.Basic/Rotations/Basic/GunbreakerRotation.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
using Dalamud.Interface.Colors;

namespace RotationSolver.Basic.Rotations.Basic;

partial class GunbreakerRotation
Expand Down Expand Up @@ -36,6 +38,9 @@ partial class GunbreakerRotation
/// Gets the max combo time of the Gnashing Fang combo.
/// </summary>
public static short MaxTimerDuration => JobGauge.MaxTimerDuration;
#endregion

#region Debug Status

/// <inheritdoc/>
public override void DisplayStatus()
Expand All @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -298,13 +313,126 @@ static partial void ModifyLionHeartPvE(ref ActionSetting setting)

#endregion

#region PvP Actions Unassignable

/// <summary>
/// Gnashing Fang 2
/// </summary>
public static bool SavageClawPvPReady => Service.GetAdjustedActionId(ActionID.GnashingFangPvP) == ActionID.SavageClawPvP;

/// <summary>
/// Gnashing Fang 3
/// </summary>
public static bool WickedTalonPvPReady => Service.GetAdjustedActionId(ActionID.GnashingFangPvP) == ActionID.WickedTalonPvP;

/// <summary>
///
/// </summary>
public static bool HypervelocityPvPReady => Service.GetAdjustedActionId(ActionID.ContinuationPvP) == ActionID.HypervelocityPvP;

/// <summary>
///
/// </summary>
public static bool FatedBrandPvPReady => Service.GetAdjustedActionId(ActionID.ContinuationPvP) == ActionID.FatedBrandPvP;

/// <summary>
///
/// </summary>
public static bool JugularRipPvPReady => Service.GetAdjustedActionId(ActionID.ContinuationPvP) == ActionID.JugularRipPvP;

/// <summary>
///
/// </summary>
public static bool AbdomenTearPvPReady => Service.GetAdjustedActionId(ActionID.ContinuationPvP) == ActionID.AbdomenTearPvP;

/// <summary>
///
/// </summary>
public static bool EyeGougePvPReady => Service.GetAdjustedActionId(ActionID.ContinuationPvP) == ActionID.EyeGougePvP;
#endregion

/// <summary>
///
/// </summary>
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;
}

/// <inheritdoc/>
protected override bool EmergencyAbility(IAction nextGCD, out IAction? act)
{
Expand Down

0 comments on commit be96abf

Please sign in to comment.