From 7b30868183d06d7380981e3d94336ddec938c178 Mon Sep 17 00:00:00 2001 From: LTS-FFXIV <127939494+LTS-FFXIV@users.noreply.github.com> Date: Fri, 10 Jan 2025 16:00:07 -0600 Subject: [PATCH] Deleted the wrong GNB rotaiton woops resolved --- BasicRotations/RebornRotations.csproj | 4 +- BasicRotations/Tank/GNB_Default.cs | 127 +++++++++-------- .../{GNB_Default_Old => GNB_Default_Old2} | 129 +++++++++--------- 3 files changed, 131 insertions(+), 129 deletions(-) rename BasicRotations/Tank/{GNB_Default_Old => GNB_Default_Old2} (69%) diff --git a/BasicRotations/RebornRotations.csproj b/BasicRotations/RebornRotations.csproj index a4ddcdbec..e1c2d2739 100644 --- a/BasicRotations/RebornRotations.csproj +++ b/BasicRotations/RebornRotations.csproj @@ -26,9 +26,11 @@ - + + + $(DalamudLibPath)Dalamud.dll diff --git a/BasicRotations/Tank/GNB_Default.cs b/BasicRotations/Tank/GNB_Default.cs index 7d9f20050..a9657707c 100644 --- a/BasicRotations/Tank/GNB_Default.cs +++ b/BasicRotations/Tank/GNB_Default.cs @@ -1,12 +1,18 @@ -namespace DefaultRotations.Tank; +namespace DefaultRotations.Tank; -[Rotation("Beta", CombatType.PvE, GameVersion = "7.15")] +[Rotation("Default", CombatType.PvE, GameVersion = "7.15")] [SourceCode(Path = "main/BasicRotations/Tank/GNB_Default.cs")] [Api(4)] -public sealed class GNB_Default : GunbreakerRotation +public sealed class GNB_Default_Old : GunbreakerRotation { - #region Countdown Logic + #region Config Options + [RotationConfig(CombatType.PvE, Name = "Use experimental No Mercy logic for burst")] + public bool NoMercyLogic { get; set; } = false; + #endregion + + private static bool InBurstStatus => !Player.WillStatusEnd(0, true, StatusID.NoMercy); + #region Countdown Logic protected override IAction? CountDownAction(float remainTime) { if (remainTime <= 0.7 && LightningShotPvE.CanUse(out var act)) return act; @@ -15,33 +21,30 @@ public sealed class GNB_Default : GunbreakerRotation } #endregion - #region Additional oGCD Logic - - [RotationDesc] + #region oGCD Logic protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) { - // Attempt to align Bloodfest with No Mercy during opener + if (base.EmergencyAbility(nextGCD, out act)) return true; + if (InCombat && CombatElapsedLess(30)) { if (!CombatElapsedLessGCD(2) && NoMercyPvE.CanUse(out act, skipAoeCheck: true)) return true; - if (Player.HasStatus(true, StatusID.NoMercy) && BloodfestPvE.CanUse(out act, skipAoeCheck: true)) return true; + if (InBurstStatus && BloodfestPvE.CanUse(out act, skipAoeCheck: true)) return true; } - return base.EmergencyAbility(nextGCD, out act); - } + if (AbdomenTearPvE.CanUse(out act)) return true; + if (EyeGougePvE.CanUse(out act)) return true; + if (FatedBrandPvE.CanUse(out act)) return true; + if (HypervelocityPvE.CanUse(out act)) return true; - [RotationDesc(ActionID.TrajectoryPvE)] - protected override bool MoveForwardAbility(IAction nextGCD, out IAction? act) - { - if (TrajectoryPvE.CanUse(out act)) return true; - return base.MoveForwardAbility(nextGCD, out act); + return base.EmergencyAbility(nextGCD, out act); } [RotationDesc(ActionID.HeartOfLightPvE, ActionID.ReprisalPvE)] - protected sealed override bool DefenseAreaAbility(IAction nextGCD, out IAction? act) + protected override bool DefenseAreaAbility(IAction nextGCD, out IAction? act) { - if (!Player.HasStatus(true, StatusID.NoMercy) && HeartOfLightPvE.CanUse(out act, skipAoeCheck: true)) return true; - if (!Player.HasStatus(true, StatusID.NoMercy) && ReprisalPvE.CanUse(out act, skipAoeCheck: true)) return true; + if (!InBurstStatus && HeartOfLightPvE.CanUse(out act, skipAoeCheck: true)) return true; + if (!InBurstStatus && ReprisalPvE.CanUse(out act, skipAoeCheck: true)) return true; return base.DefenseAreaAbility(nextGCD, out act); } @@ -69,21 +72,11 @@ protected override bool HealSingleAbility(IAction nextGCD, out IAction? act) if (AuroraPvE.CanUse(out act, usedUp: true)) return true; return base.HealSingleAbility(nextGCD, out act); } - #endregion - - #region oGCD Logic - - protected override bool GeneralAbility(IAction nextGCD, out IAction? act) - { - if (!CombatElapsedLessGCD(5) && NoMercyPvE.CanUse(out act, skipAoeCheck: true)) return true; - return base.GeneralAbility(nextGCD, out act); - } - protected override bool AttackAbility(IAction nextGCD, out IAction? act) { - //if (IsBurst && CanUseNoMercy(out act)) return true; + if (NoMercyLogic && IsBurst && CanUseNoMercy(out act)) return true; - if (!CombatElapsedLessGCD(5) && NoMercyPvE.CanUse(out act, skipAoeCheck: true)) return true; + if (!NoMercyLogic && !CombatElapsedLessGCD(5) && NoMercyPvE.CanUse(out act, skipAoeCheck: true)) return true; if (JugularRipPvE.CanUse(out act)) return true; @@ -92,48 +85,47 @@ protected override bool AttackAbility(IAction nextGCD, out IAction? act) if (!IsFullParty && !(DangerZonePvE.Target.Target?.IsBossFromTTK() ?? false)) return true; - if (!GnashingFangPvE.EnoughLevel && (Player.HasStatus(true, StatusID.NoMercy) || !NoMercyPvE.Cooldown.WillHaveOneCharge(15))) return true; + if (!GnashingFangPvE.EnoughLevel && (InBurstStatus || !NoMercyPvE.Cooldown.WillHaveOneCharge(15))) return true; - if (Player.HasStatus(true, StatusID.NoMercy) && GnashingFangPvE.Cooldown.IsCoolingDown) return true; + if (InBurstStatus && GnashingFangPvE.Cooldown.IsCoolingDown) return true; - if (!Player.HasStatus(true, StatusID.NoMercy) && !GnashingFangPvE.Cooldown.WillHaveOneCharge(20)) return true; + if (!InBurstStatus && !GnashingFangPvE.Cooldown.WillHaveOneCharge(20)) return true; } - if (Player.HasStatus(true, StatusID.NoMercy) && CanUseBowShock(out act)) return true; + if (InBurstStatus && CanUseBowShock(out act)) return true; //if (TrajectoryPvE.CanUse(out act) && !IsMoving) return true; if (GnashingFangPvE.Cooldown.IsCoolingDown && DoubleDownPvE.Cooldown.IsCoolingDown && Ammo == 0 && BloodfestPvE.CanUse(out act)) return true; - if (AbdomenTearPvE.CanUse(out act)) return true; - if (EyeGougePvE.CanUse(out act)) return true; - if (FatedBrandPvE.CanUse(out act)) return true; - if (HypervelocityPvE.CanUse(out act)) return true; + bool areDDTargetsInRange = AllHostileTargets.Any(hostile => hostile.DistanceToPlayer() < 4.5f); + + if (areDDTargetsInRange) + { + if (InBurstStatus && IsLastGCD(ActionID.DoubleDownPvE) && BlastingZonePvE.CanUse(out act)) return true; + } + if (NoMercyPvE.Cooldown.IsCoolingDown && BloodfestPvE.Cooldown.IsCoolingDown && BlastingZonePvE.CanUse(out act)) return true; return base.AttackAbility(nextGCD, out act); } #endregion #region GCD Logic - protected override bool GeneralGCD(out IAction? act) { bool areDDTargetsInRange = AllHostileTargets.Any(hostile => hostile.DistanceToPlayer() < 4.5f); - if (Player.HasStatus(true, StatusID.NoMercy) && BloodfestPvE.CanUse(out act)) return true; + if (InBurstStatus && BloodfestPvE.CanUse(out act)) return true; if (IsLastGCD(false, NobleBloodPvE) && LionHeartPvE.CanUse(out act, skipComboCheck: true)) return true; if (IsLastGCD(false, ReignOfBeastsPvE) && NobleBloodPvE.CanUse(out act, skipComboCheck: true)) return true; - if (ReignOfBeastsPvE.CanUse(out act, skipAoeCheck: true)) return true; + if (!InGnashingFang && ReignOfBeastsPvE.CanUse(out act, skipAoeCheck: true)) return true; - if (Player.HasStatus(true, StatusID.NoMercy) && SonicBreakPvE.CanUse(out act)) return true; + if (InBurstStatus && SonicBreakPvE.CanUse(out act)) return true; if (areDDTargetsInRange) { - if (Player.HasStatus(true, StatusID.NoMercy) && CanUseDoubleDown(out act)) return true; - if (Player.HasStatus(true, StatusID.NoMercy) && IsLastGCD(ActionID.DoubleDownPvE) && BlastingZonePvE.CanUse(out act)) return true; + if (InBurstStatus && CanUseDoubleDown(out act)) return true; } - if (NoMercyPvE.Cooldown.IsCoolingDown && BloodfestPvE.Cooldown.IsCoolingDown && BlastingZonePvE.CanUse(out act)) return true; - if (CanUseGnashingFang(out act)) return true; if (SavageClawPvE.CanUse(out act, skipComboCheck: true)) return true; @@ -147,15 +139,17 @@ protected override bool GeneralGCD(out IAction? act) if (Ammo == MaxAmmo && IsLastGCD(ActionID.BrutalShellPvE) && BurstStrikePvE.CanUse(out act)) return true; - if (SolidBarrelPvE.CanUse(out act)) return true; - if (BrutalShellPvE.CanUse(out act)) return true; - if (KeenEdgePvE.CanUse(out act)) return true; + if (!InGnashingFang) + { + if (SolidBarrelPvE.CanUse(out act)) return true; + if (BrutalShellPvE.CanUse(out act)) return true; + if (KeenEdgePvE.CanUse(out act)) return true; + } if (LightningShotPvE.CanUse(out act)) return true; return base.GeneralGCD(out act); } - #endregion #region Extra Methods @@ -163,24 +157,25 @@ protected override bool GeneralGCD(out IAction? act) public override bool CanHealAreaSpell => false; - //private bool CanUseNoMercy(out IAction act) - //{ - // if (!NoMercy.CanUse(out act, CanUseOption.OnLastAbility)) return false; + private bool CanUseNoMercy(out IAction act) + { + var IsTargetBoss = HostileTarget?.IsBossFromIcon() ?? false; - // if (!IsFullParty && !IsTargetBoss && !IsMoving && DemonSlice.CanUse(out _)) return true; + if (!NoMercyPvE.CanUse(out act)) return false; - // if (!BurstStrike.EnoughLevel) return true; + if (!IsFullParty && !IsTargetBoss && !IsMoving && DemonSlicePvE.CanUse(out _)) return true; - // if (BurstStrike.EnoughLevel) - // { - // if (IsLastGCD((ActionID)KeenEdge.ID) && Ammo == 1 && !GnashingFang.IsCoolingDown && !BloodFest.IsCoolingDown) return true; - // else if (Ammo == (Level >= 88 ? 3 : 2)) return true; - // else if (Ammo == 2 && GnashingFang.IsCoolingDown) return true; - // } + if (!BurstStrikePvE.EnoughLevel) return true; - // act = null; - // return false; - //} + if (BurstStrikePvE.EnoughLevel) + { + if (IsLastGCD(ActionID.KeenEdgePvE) && Ammo == 1 && !GnashingFangPvE.Cooldown.IsCoolingDown && !BloodfestPvE.Cooldown.IsCoolingDown) return true; + else if (Ammo == MaxAmmo) return true; + else if (Ammo == 2 && GnashingFangPvE.Cooldown.IsCoolingDown) return true; + } + + return false; + } private bool CanUseGnashingFang(out IAction? act) { @@ -263,4 +258,4 @@ private bool CanUseBowShock(out IAction act) return false; } #endregion -} +} \ No newline at end of file diff --git a/BasicRotations/Tank/GNB_Default_Old b/BasicRotations/Tank/GNB_Default_Old2 similarity index 69% rename from BasicRotations/Tank/GNB_Default_Old rename to BasicRotations/Tank/GNB_Default_Old2 index a9657707c..b179d1640 100644 --- a/BasicRotations/Tank/GNB_Default_Old +++ b/BasicRotations/Tank/GNB_Default_Old2 @@ -1,18 +1,12 @@ -namespace DefaultRotations.Tank; +namespace DefaultRotations.Tank; -[Rotation("Default", CombatType.PvE, GameVersion = "7.15")] -[SourceCode(Path = "main/BasicRotations/Tank/GNB_Default.cs")] +[Rotation("Old", CombatType.PvE, GameVersion = "7.15")] +[SourceCode(Path = "main/BasicRotations/Tank/GNB_Default_old2.cs")] [Api(4)] -public sealed class GNB_Default_Old : GunbreakerRotation +public sealed class GNB_Default_old2 : GunbreakerRotation { - #region Config Options - [RotationConfig(CombatType.PvE, Name = "Use experimental No Mercy logic for burst")] - public bool NoMercyLogic { get; set; } = false; - #endregion - - private static bool InBurstStatus => !Player.WillStatusEnd(0, true, StatusID.NoMercy); - #region Countdown Logic + protected override IAction? CountDownAction(float remainTime) { if (remainTime <= 0.7 && LightningShotPvE.CanUse(out var act)) return act; @@ -21,30 +15,33 @@ public sealed class GNB_Default_Old : GunbreakerRotation } #endregion - #region oGCD Logic + #region Additional oGCD Logic + + [RotationDesc] protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) { - if (base.EmergencyAbility(nextGCD, out act)) return true; - + // Attempt to align Bloodfest with No Mercy during opener if (InCombat && CombatElapsedLess(30)) { if (!CombatElapsedLessGCD(2) && NoMercyPvE.CanUse(out act, skipAoeCheck: true)) return true; - if (InBurstStatus && BloodfestPvE.CanUse(out act, skipAoeCheck: true)) return true; + if (Player.HasStatus(true, StatusID.NoMercy) && BloodfestPvE.CanUse(out act, skipAoeCheck: true)) return true; } - if (AbdomenTearPvE.CanUse(out act)) return true; - if (EyeGougePvE.CanUse(out act)) return true; - if (FatedBrandPvE.CanUse(out act)) return true; - if (HypervelocityPvE.CanUse(out act)) return true; - return base.EmergencyAbility(nextGCD, out act); } + [RotationDesc(ActionID.TrajectoryPvE)] + protected override bool MoveForwardAbility(IAction nextGCD, out IAction? act) + { + if (TrajectoryPvE.CanUse(out act)) return true; + return base.MoveForwardAbility(nextGCD, out act); + } + [RotationDesc(ActionID.HeartOfLightPvE, ActionID.ReprisalPvE)] - protected override bool DefenseAreaAbility(IAction nextGCD, out IAction? act) + protected sealed override bool DefenseAreaAbility(IAction nextGCD, out IAction? act) { - if (!InBurstStatus && HeartOfLightPvE.CanUse(out act, skipAoeCheck: true)) return true; - if (!InBurstStatus && ReprisalPvE.CanUse(out act, skipAoeCheck: true)) return true; + if (!Player.HasStatus(true, StatusID.NoMercy) && HeartOfLightPvE.CanUse(out act, skipAoeCheck: true)) return true; + if (!Player.HasStatus(true, StatusID.NoMercy) && ReprisalPvE.CanUse(out act, skipAoeCheck: true)) return true; return base.DefenseAreaAbility(nextGCD, out act); } @@ -72,11 +69,21 @@ public sealed class GNB_Default_Old : GunbreakerRotation if (AuroraPvE.CanUse(out act, usedUp: true)) return true; return base.HealSingleAbility(nextGCD, out act); } + #endregion + + #region oGCD Logic + + protected override bool GeneralAbility(IAction nextGCD, out IAction? act) + { + if (!CombatElapsedLessGCD(5) && NoMercyPvE.CanUse(out act, skipAoeCheck: true)) return true; + return base.GeneralAbility(nextGCD, out act); + } + protected override bool AttackAbility(IAction nextGCD, out IAction? act) { - if (NoMercyLogic && IsBurst && CanUseNoMercy(out act)) return true; + //if (IsBurst && CanUseNoMercy(out act)) return true; - if (!NoMercyLogic && !CombatElapsedLessGCD(5) && NoMercyPvE.CanUse(out act, skipAoeCheck: true)) return true; + if (!CombatElapsedLessGCD(5) && NoMercyPvE.CanUse(out act, skipAoeCheck: true)) return true; if (JugularRipPvE.CanUse(out act)) return true; @@ -85,47 +92,48 @@ public sealed class GNB_Default_Old : GunbreakerRotation if (!IsFullParty && !(DangerZonePvE.Target.Target?.IsBossFromTTK() ?? false)) return true; - if (!GnashingFangPvE.EnoughLevel && (InBurstStatus || !NoMercyPvE.Cooldown.WillHaveOneCharge(15))) return true; + if (!GnashingFangPvE.EnoughLevel && (Player.HasStatus(true, StatusID.NoMercy) || !NoMercyPvE.Cooldown.WillHaveOneCharge(15))) return true; - if (InBurstStatus && GnashingFangPvE.Cooldown.IsCoolingDown) return true; + if (Player.HasStatus(true, StatusID.NoMercy) && GnashingFangPvE.Cooldown.IsCoolingDown) return true; - if (!InBurstStatus && !GnashingFangPvE.Cooldown.WillHaveOneCharge(20)) return true; + if (!Player.HasStatus(true, StatusID.NoMercy) && !GnashingFangPvE.Cooldown.WillHaveOneCharge(20)) return true; } - if (InBurstStatus && CanUseBowShock(out act)) return true; + if (Player.HasStatus(true, StatusID.NoMercy) && CanUseBowShock(out act)) return true; //if (TrajectoryPvE.CanUse(out act) && !IsMoving) return true; if (GnashingFangPvE.Cooldown.IsCoolingDown && DoubleDownPvE.Cooldown.IsCoolingDown && Ammo == 0 && BloodfestPvE.CanUse(out act)) return true; - bool areDDTargetsInRange = AllHostileTargets.Any(hostile => hostile.DistanceToPlayer() < 4.5f); - - if (areDDTargetsInRange) - { - if (InBurstStatus && IsLastGCD(ActionID.DoubleDownPvE) && BlastingZonePvE.CanUse(out act)) return true; - } - if (NoMercyPvE.Cooldown.IsCoolingDown && BloodfestPvE.Cooldown.IsCoolingDown && BlastingZonePvE.CanUse(out act)) return true; + if (AbdomenTearPvE.CanUse(out act)) return true; + if (EyeGougePvE.CanUse(out act)) return true; + if (FatedBrandPvE.CanUse(out act)) return true; + if (HypervelocityPvE.CanUse(out act)) return true; return base.AttackAbility(nextGCD, out act); } #endregion #region GCD Logic + protected override bool GeneralGCD(out IAction? act) { bool areDDTargetsInRange = AllHostileTargets.Any(hostile => hostile.DistanceToPlayer() < 4.5f); - if (InBurstStatus && BloodfestPvE.CanUse(out act)) return true; + if (Player.HasStatus(true, StatusID.NoMercy) && BloodfestPvE.CanUse(out act)) return true; if (IsLastGCD(false, NobleBloodPvE) && LionHeartPvE.CanUse(out act, skipComboCheck: true)) return true; if (IsLastGCD(false, ReignOfBeastsPvE) && NobleBloodPvE.CanUse(out act, skipComboCheck: true)) return true; - if (!InGnashingFang && ReignOfBeastsPvE.CanUse(out act, skipAoeCheck: true)) return true; + if (ReignOfBeastsPvE.CanUse(out act, skipAoeCheck: true)) return true; - if (InBurstStatus && SonicBreakPvE.CanUse(out act)) return true; + if (Player.HasStatus(true, StatusID.NoMercy) && SonicBreakPvE.CanUse(out act)) return true; if (areDDTargetsInRange) { - if (InBurstStatus && CanUseDoubleDown(out act)) return true; + if (Player.HasStatus(true, StatusID.NoMercy) && CanUseDoubleDown(out act)) return true; + if (Player.HasStatus(true, StatusID.NoMercy) && IsLastGCD(ActionID.DoubleDownPvE) && BlastingZonePvE.CanUse(out act)) return true; } + if (NoMercyPvE.Cooldown.IsCoolingDown && BloodfestPvE.Cooldown.IsCoolingDown && BlastingZonePvE.CanUse(out act)) return true; + if (CanUseGnashingFang(out act)) return true; if (SavageClawPvE.CanUse(out act, skipComboCheck: true)) return true; @@ -139,17 +147,15 @@ public sealed class GNB_Default_Old : GunbreakerRotation if (Ammo == MaxAmmo && IsLastGCD(ActionID.BrutalShellPvE) && BurstStrikePvE.CanUse(out act)) return true; - if (!InGnashingFang) - { - if (SolidBarrelPvE.CanUse(out act)) return true; - if (BrutalShellPvE.CanUse(out act)) return true; - if (KeenEdgePvE.CanUse(out act)) return true; - } + if (SolidBarrelPvE.CanUse(out act)) return true; + if (BrutalShellPvE.CanUse(out act)) return true; + if (KeenEdgePvE.CanUse(out act)) return true; if (LightningShotPvE.CanUse(out act)) return true; return base.GeneralGCD(out act); } + #endregion #region Extra Methods @@ -157,25 +163,24 @@ public sealed class GNB_Default_Old : GunbreakerRotation public override bool CanHealAreaSpell => false; - private bool CanUseNoMercy(out IAction act) - { - var IsTargetBoss = HostileTarget?.IsBossFromIcon() ?? false; + //private bool CanUseNoMercy(out IAction act) + //{ + // if (!NoMercy.CanUse(out act, CanUseOption.OnLastAbility)) return false; - if (!NoMercyPvE.CanUse(out act)) return false; + // if (!IsFullParty && !IsTargetBoss && !IsMoving && DemonSlice.CanUse(out _)) return true; - if (!IsFullParty && !IsTargetBoss && !IsMoving && DemonSlicePvE.CanUse(out _)) return true; + // if (!BurstStrike.EnoughLevel) return true; - if (!BurstStrikePvE.EnoughLevel) return true; + // if (BurstStrike.EnoughLevel) + // { + // if (IsLastGCD((ActionID)KeenEdge.ID) && Ammo == 1 && !GnashingFang.IsCoolingDown && !BloodFest.IsCoolingDown) return true; + // else if (Ammo == (Level >= 88 ? 3 : 2)) return true; + // else if (Ammo == 2 && GnashingFang.IsCoolingDown) return true; + // } - if (BurstStrikePvE.EnoughLevel) - { - if (IsLastGCD(ActionID.KeenEdgePvE) && Ammo == 1 && !GnashingFangPvE.Cooldown.IsCoolingDown && !BloodfestPvE.Cooldown.IsCoolingDown) return true; - else if (Ammo == MaxAmmo) return true; - else if (Ammo == 2 && GnashingFangPvE.Cooldown.IsCoolingDown) return true; - } - - return false; - } + // act = null; + // return false; + //} private bool CanUseGnashingFang(out IAction? act) { @@ -258,4 +263,4 @@ public sealed class GNB_Default_Old : GunbreakerRotation return false; } #endregion -} \ No newline at end of file +}