diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index d28292416..a8a9733e0 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -1489,62 +1489,64 @@ public enum CustomComboPreset #region Advanced ST [ConflictingCombos(GNB_ST_Simple)] [ReplaceSkill(GNB.KeenEdge)] - [CustomComboInfo("Advanced Mode - Single Target", "Replace Keen Edge with its combo chain.\n Uses Burst Strike when you have 3 cartridges & your last combo action was Brutal Shell.", GNB.JobID)] + [CustomComboInfo("Advanced Mode - Single Target", "Replace Keen Edge with its combo chain.\nThis is the ideal selection for experienced users of the job.", GNB.JobID)] GNB_ST_Advanced = 7003, - #region Lightning Shot - [ParentCombo(GNB_ST_Advanced)] - [CustomComboInfo("Lightning Shot Uptime Option", "Adds Lightning Shot to the main combo when you are out of range.", GNB.JobID)] - GNB_ST_RangedUptime = 7004, - #endregion - - #region Gnashing Fang - [ParentCombo(GNB_ST_Advanced)] - [CustomComboInfo("Continuation Option", "Adds Continuation to the main combo.\n 'Gnashing Fang Starter' option must be enabled or started manually.", GNB.JobID)] - GNB_ST_Continuation = 7005, - - [ParentCombo(GNB_ST_Continuation)] - [CustomComboInfo("Gnashing Fang Starter Option", "Begins Gnashing Fang for you on the main combo.", GNB.JobID)] - GNB_ST_GnashingStarter = 7006, - #endregion - #region Cooldowns [ParentCombo(GNB_ST_Advanced)] - [CustomComboInfo("Cooldowns Option", "Adds various cooldowns to the main combo.", GNB.JobID)] + [CustomComboInfo("Cooldowns Option", "Adds various cooldowns into the rotation.", GNB.JobID)] GNB_ST_Advanced_CooldownsGroup = 7007, [ConflictingCombos(GNB_NM_Features)] [ParentCombo(GNB_ST_Advanced_CooldownsGroup)] - [CustomComboInfo("No Mercy Option", "Adds No Mercy to the main combo when at full ammo.", GNB.JobID)] + [CustomComboInfo("No Mercy Option", "Adds No Mercy into the rotation when appropriate.", GNB.JobID)] GNB_ST_NoMercy = 7008, [ParentCombo(GNB_ST_Advanced_CooldownsGroup)] - [CustomComboInfo("Danger/Blasting Zone Option", "Adds Danger/Blasting Zone to the main combo.", GNB.JobID)] + [CustomComboInfo("Sonic Break Option", "Adds Sonic Break into the rotation when appropriate.", GNB.JobID)] + GNB_ST_SonicBreak = 7012, + + [ParentCombo(GNB_ST_Advanced_CooldownsGroup)] + [CustomComboInfo("Danger/Blasting Zone Option", "Adds Danger/Blasting Zone into the rotation when available.", GNB.JobID)] GNB_ST_BlastingZone = 7009, [ParentCombo(GNB_ST_Advanced_CooldownsGroup)] - [CustomComboInfo("Bow Shock Option", "Adds Bow Shock to the main combo.", GNB.JobID)] + [CustomComboInfo("Bow Shock Option", "Adds Bow Shock into the rotation when appropriate.", GNB.JobID)] GNB_ST_BowShock = 7010, [ParentCombo(GNB_ST_Advanced_CooldownsGroup)] - [CustomComboInfo("Bloodfest Option", "Adds Bloodfest to the main combo when ammo is 0.", GNB.JobID)] + [CustomComboInfo("Bloodfest Option", "Adds Bloodfest into the rotation when appropriate.", GNB.JobID)] GNB_ST_Bloodfest = 7011, [ParentCombo(GNB_ST_Advanced_CooldownsGroup)] - [CustomComboInfo("Sonic Break Option", "Adds Sonic Break to the main combo.", GNB.JobID)] - GNB_ST_SonicBreak = 7012, + [CustomComboInfo("Gnashing Fang Option", "Adds Gnashing Fang combo into the rotation.", GNB.JobID)] + GNB_ST_Gnashing = 7016, + + [ParentCombo(GNB_ST_Gnashing)] + [CustomComboInfo("Continuation Option", "Adds Continuation & Hypervelocity into the rotation.\n'Gnashing Fang' option must be enabled or started manually.", GNB.JobID)] + GNB_ST_Continuation = 7005, [ParentCombo(GNB_ST_Advanced_CooldownsGroup)] - [CustomComboInfo("Double Down Option", "Adds Double Down to the main combo when under No Mercy buff.", GNB.JobID)] - GNB_ST_DoubleDown = 7013, + [CustomComboInfo("Double Down Option", "Adds Double Down into the rotation when appropriate.", GNB.JobID)] + GNB_ST_DoubleDown = 7017, [ParentCombo(GNB_ST_Advanced_CooldownsGroup)] - [CustomComboInfo("Reign combo Option", "Adds Reign/Noble/Lionheart to the main combo.", GNB.JobID)] + [CustomComboInfo("Reign Combo Option", "Adds Reign/Noble/Lionheart into the rotation when appropriate.", GNB.JobID)] GNB_ST_Reign = 7014, [ParentCombo(GNB_ST_Advanced_CooldownsGroup)] - [CustomComboInfo("Burst Strike Option", "Adds Burst Strike and Hypervelocity (when available) to the main combo when under No Mercy and Gnashing Fang is over.", GNB.JobID)] + [CustomComboInfo("Burst Strike Option", "Adds Burst Strike into the rotation when appropriate.", GNB.JobID)] GNB_ST_BurstStrike = 7015, + + [ParentCombo(GNB_ST_Advanced)] + [CustomComboInfo("Ammo Overcap Option", "Adds Burst Strike into the rotation if you have max cartridges & your last combo action was Brutal Shell.", GNB.JobID)] + GNB_ST_Overcap = 7018, + #endregion + + #region Lightning Shot + [ParentCombo(GNB_ST_Advanced)] + [CustomComboInfo("Lightning Shot Uptime Option", "Adds Lightning Shot to the main combo when you are out of range.", GNB.JobID)] + GNB_ST_RangedUptime = 7004, #endregion #endregion @@ -1552,45 +1554,53 @@ public enum CustomComboPreset #region Advanced AoE [ConflictingCombos(GNB_AoE_Simple)] [ReplaceSkill(GNB.DemonSlice)] - [CustomComboInfo("Advanced Mode - AoE", "Replace Demon Slice with its combo chain.", GNB.JobID)] + [CustomComboInfo("Advanced Mode - AoE", "Replace Demon Slice with its combo chain.\nThis is the ideal selection for experienced users of the job.", GNB.JobID)] GNB_AoE_Advanced = 7200, [ConflictingCombos(GNB_NM_Features)] [ParentCombo(GNB_AoE_Advanced)] - [CustomComboInfo("No Mercy Option", "Adds No Mercy to the AoE combo when appropriate.", GNB.JobID)] + [CustomComboInfo("No Mercy Option", "Adds No Mercy into the AoE rotation when appropriate.", GNB.JobID)] GNB_AoE_NoMercy = 7201, [ParentCombo(GNB_AoE_Advanced)] - [CustomComboInfo("Danger/Blasting Zone Option", "Adds Danger/Blasting Zone to the AoE combo when appropriate.", GNB.JobID)] + [CustomComboInfo("Danger/Blasting Zone Option", "Adds Danger/Blasting Zone into the AoE rotation when appropriate.", GNB.JobID)] GNB_AoE_DangerZone = 7202, [ParentCombo(GNB_AoE_Advanced)] - [CustomComboInfo("Bow Shock Option", "Adds Bow Shock onto the AoE combo when appropriate.", GNB.JobID)] + [CustomComboInfo("Bow Shock Option", "Adds Bow Shock oninto the AoE rotation when appropriate.", GNB.JobID)] GNB_AoE_BowShock = 7203, [ParentCombo(GNB_AoE_Advanced)] - [CustomComboInfo("Bloodfest Option", "Adds Bloodfest to the AoE combo when appropriate.", GNB.JobID)] + [CustomComboInfo("Bloodfest Option", "Adds Bloodfest into the AoE rotation when appropriate.", GNB.JobID)] GNB_AoE_Bloodfest = 7204, [ParentCombo(GNB_AoE_Advanced)] - [CustomComboInfo("Sonic Break Option", "Adds Sonic Break to the AoE combo when appropriate.", GNB.JobID)] + [CustomComboInfo("Sonic Break Option", "Adds Sonic Break into the AoE rotation when appropriate.", GNB.JobID)] GNB_AoE_SonicBreak = 7205, [ParentCombo(GNB_AoE_Advanced)] - [CustomComboInfo("Double Down Option", "Adds Double Down to the AoE combo when appropriate.", GNB.JobID)] + [CustomComboInfo("Double Down Option", "Adds Double Down into the AoE rotation when appropriate.", GNB.JobID)] GNB_AoE_DoubleDown = 7206, [ParentCombo(GNB_AoE_Advanced)] - [CustomComboInfo("Reign Combo Option", "Adds Reign/Noble/LionHeart to the AoE combo when appropriate.", GNB.JobID)] + [CustomComboInfo("Reign Combo Option", "Adds Reign/Noble/LionHeart into the AoE rotation when appropriate.", GNB.JobID)] GNB_AoE_Reign = 7207, [ParentCombo(GNB_AoE_Advanced)] - [CustomComboInfo("Fated Circle Option", "Adds Fated Circle to the AoE combo when appropriate.", GNB.JobID)] + [CustomComboInfo("Fated Circle Option", "Adds Fated Circle into the AoE rotation when appropriate.", GNB.JobID)] GNB_AoE_FatedCircle = 7208, + [ParentCombo(GNB_AoE_FatedCircle)] + [CustomComboInfo("Burst Strike Option", "Adds Burst Strike into the AoE rotation if you do not have Fated Circle unlocked yet.", GNB.JobID)] + GNB_AoE_noFatedCircle = 7212, + [ParentCombo(GNB_AoE_Advanced)] - [CustomComboInfo("Ammo Overcap Option", "Adds Fated Circle to the AoE combo when about to overcap.", GNB.JobID)] + [CustomComboInfo("Ammo Overcap Option", "Adds Fated Circle into the AoE rotation if you have max cartridges & your last combo action was Demon Slice.", GNB.JobID)] GNB_AoE_Overcap = 7209, + + [ParentCombo(GNB_AoE_Overcap)] + [CustomComboInfo("Ammo Overcap Burst Strike Option", "Adds Burst Strike into the AoE rotation if you have max cartridges, your last combo action was Demon Slice, & you do not have Fated Circle unlocked yet.", GNB.JobID)] + GNB_AoE_BSOvercap = 7211, #endregion #region Gnashing Fang @@ -1602,7 +1612,7 @@ public enum CustomComboPreset [CustomComboInfo("Continuation Option", "Adds Continuation to Gnashing Fang when available.", GNB.JobID)] GNB_GF_Continuation = 7301, - [ConflictingCombos(GNB_ST_NoMercy)] + [ConflictingCombos(GNB_NM_Features)] [ParentCombo(GNB_GF_Features)] [CustomComboInfo("No Mercy Option", "Adds No Mercy to Gnashing Fang when available.", GNB.JobID)] GNB_GF_NoMercy = 7302, @@ -1660,7 +1670,7 @@ public enum CustomComboPreset #endregion #region No Mercy - [ConflictingCombos(GNB_ST_Simple, GNB_AoE_Simple, GNB_ST_NoMercy, GNB_AoE_NoMercy, GNB_GF_NoMercy)] + [ConflictingCombos(GNB_ST_Simple, GNB_AoE_Simple, GNB_GF_Features)] [ReplaceSkill(GNB.NoMercy)] [CustomComboInfo("No Mercy Features", "Collection of No Mercy related features.", GNB.JobID)] GNB_NM_Features = 7500, diff --git a/XIVSlothCombo/Combos/PvE/GNB.cs b/XIVSlothCombo/Combos/PvE/GNB.cs index c207360bb..91afa4119 100644 --- a/XIVSlothCombo/Combos/PvE/GNB.cs +++ b/XIVSlothCombo/Combos/PvE/GNB.cs @@ -1,7 +1,9 @@ using Dalamud.Game.ClientState.JobGauge.Types; using Dalamud.Game.ClientState.Statuses; using XIVSlothCombo.Combos.PvE.Content; +using XIVSlothCombo.Core; using XIVSlothCombo.CustomComboNS; +using XIVSlothCombo.CustomComboNS.Functions; using XIVSlothCombo.Data; namespace XIVSlothCombo.Combos.PvE @@ -68,7 +70,12 @@ public static class Config { public const string GNB_VariantCure = "GNB_VariantCure"; + + public static UserInt + GNB_ST_NoMercyStop = new("GNB_ST_NoMercyStop"), + GNB_AoE_NoMercyStop = new ("GNB_AoE_NoMercyStop"); } + internal class GNB_ST_SimpleMode : CustomCombo { @@ -95,7 +102,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return LightningShot; //NoMercy - if (ActionReady(NoMercy)) + if (ActionReady(NoMercy) && GetCooldownRemainingTime(DoubleDown) < GCD * 2 && GetCooldownRemainingTime(GnashingFang) < GCD * 3) { if (CanWeave(actionID)) { @@ -112,6 +119,10 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } } + //Bloodfest + if (ActionReady(Bloodfest) && Ammo is 0 && (JustUsed(NoMercy, 20f))) + return Bloodfest; + //oGCDs if (CanWeave(actionID)) { @@ -126,10 +137,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsEnabled(CustomComboPreset.GNB_Variant_Ultimatum) && IsEnabled(Variant.VariantUltimatum) && ActionReady(Variant.VariantUltimatum)) return Variant.VariantUltimatum; - //Bloodfest - if (ActionReady(Bloodfest) && Ammo is 0 && (JustUsed(NoMercy, 20f))) - return Bloodfest; - //Zone if (ActionReady(DangerZone) && !JustUsed(NoMercy)) { @@ -218,7 +225,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } //Lv90-Lv99 - if (!LevelChecked(ReignOfBeasts) && LevelChecked(DoubleDown) && GetCooldownRemainingTime(DoubleDown) <= 0.6f) + if (!LevelChecked(ReignOfBeasts) && LevelChecked(DoubleDown) && GetCooldownRemainingTime(DoubleDown) <= 0.3f) { if ((Ammo >= 2 && !HasEffect(Buffs.ReadyToBreak) && JustUsed(SonicBreak, 3f) && (bfCD < GCD * 6 || ActionReady(Bloodfest))) //2min NM 3 carts || (!HasEffect(Buffs.ReadyToBreak) && Ammo == 3 && JustUsed(SonicBreak, 3f) && bfCD is < 90 and > 15) //1min NM 3 carts @@ -257,14 +264,12 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { if (GetBuffRemainingTime(Buffs.ReadyToReign) > 0 && !ActionReady(GnashingFang) && !ActionReady(DoubleDown) && GunStep == 0) { - if (JustUsed(WickedTalon) || (JustUsed(EyeGouge))) + if (JustUsed(WickedTalon, 6f) || (JustUsed(EyeGouge, 5f))) return OriginalHook(ReignOfBeasts); } - if (JustUsed(ReignOfBeasts) || JustUsed(NobleBlood)) - { + if (GunStep is 3 or 4) return OriginalHook(ReignOfBeasts); - } } //BurstStrike @@ -294,7 +299,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return BrutalShell; if (lastComboMove == BrutalShell && LevelChecked(SolidBarrel)) { - if (LevelChecked(Hypervelocity) && HasEffect(Buffs.ReadyToBlast) && nmCD > 1) //Lv100 Hypervelocity fit into NM check + if (LevelChecked(Hypervelocity) && HasEffect(Buffs.ReadyToBlast) && (nmCD is > 1 or <= 0.1f)) //Lv100 Hypervelocity fit into NM check return Hypervelocity; if (LevelChecked(BurstStrike) && Ammo == MaxCartridges(level)) return BurstStrike; @@ -327,6 +332,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim var nmCD = GetCooldownRemainingTime(NoMercy); //NoMercy's cooldown; 60s total var bfCD = GetCooldownRemainingTime(Bloodfest); // Bloodfest's cooldown; 120s total float GCD = GetCooldown(KeenEdge).CooldownTotal; //2.5 is base SkS, but can work with 2.4x + int nmStop = PluginConfiguration.GetCustomIntValue(Config.GNB_ST_NoMercyStop); //Variant Cure if (IsEnabled(CustomComboPreset.GNB_Variant_Cure) && IsEnabled(Variant.VariantCure) @@ -341,7 +347,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //NoMercy if (IsEnabled(CustomComboPreset.GNB_ST_Advanced_CooldownsGroup) && IsEnabled(CustomComboPreset.GNB_ST_NoMercy)) { - if (ActionReady(NoMercy)) + if (ActionReady(NoMercy) && GetTargetHPPercent() >= nmStop && GetCooldownRemainingTime(DoubleDown) < GCD * 2 && GetCooldownRemainingTime(GnashingFang) < GCD * 3) { if (CanWeave(actionID)) { @@ -359,6 +365,10 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } } + //Bloodfest - Forced to prevent combo from spazzing out due to next action possibly requiring Ammo + if (IsEnabled(CustomComboPreset.GNB_ST_Bloodfest) && ActionReady(Bloodfest) && Ammo is 0 && (JustUsed(NoMercy, 20f))) + return Bloodfest; + //oGCDs if (CanWeave(actionID)) { @@ -376,10 +386,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //CDs if (IsEnabled(CustomComboPreset.GNB_ST_Advanced_CooldownsGroup)) { - //Bloodfest - if (IsEnabled(CustomComboPreset.GNB_ST_Bloodfest) && ActionReady(Bloodfest) && Ammo is 0 && (JustUsed(NoMercy, 20f))) - return Bloodfest; - //Zone if (IsEnabled(CustomComboPreset.GNB_ST_BlastingZone) && ActionReady(DangerZone) && !JustUsed(NoMercy)) { @@ -388,7 +394,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim !LevelChecked(GnashingFang))) // 17)) + if (LevelChecked(ReignOfBeasts) && (JustUsed(DoubleDown, 5f) || nmCD > 17)) return OriginalHook(DangerZone); } @@ -418,7 +424,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } //Hypervelocity - if (IsEnabled(CustomComboPreset.GNB_ST_Continuation) && JustUsed(BurstStrike) && LevelChecked(Hypervelocity) && HasEffect(Buffs.ReadyToBlast) && nmCD > 1) + if (IsEnabled(CustomComboPreset.GNB_ST_Continuation) && JustUsed(BurstStrike, 5f) && LevelChecked(Hypervelocity) && HasEffect(Buffs.ReadyToBlast) && nmCD > 1) return Hypervelocity; //GF combo @@ -434,7 +440,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if ((Ammo == 2 && JustUsed(NoMercy, 3f) && !HasEffect(Buffs.ReadyToBlast) && (bfCD < GCD * 12 || ActionReady(Bloodfest))) //2min || (JustUsed(GnashingFang, 3f) && bfCD is < 90 and > 15 && !ActionReady(DoubleDown) && Ammo == 0 && !HasEffect(Buffs.ReadyToRip) && HasEffect(Buffs.ReadyToBreak)) //1min 2cart || (Ammo == 3 && (bfCD is < 90 and > 15 && JustUsed(NoMercy, 3f)) //1min 3cart - || (JustUsed(Bloodfest, 2f) && JustUsed(BrutalShell)))) //opener + || (JustUsed(Bloodfest, 3f) && JustUsed(BrutalShell, 3f)))) //opener return SonicBreak; } @@ -444,7 +450,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (JustUsed(NoMercy, 3f) && ((!HasEffect(Buffs.ReadyToBlast) && Ammo == 3 && bfCD < GCD * 12 || ActionReady(Bloodfest)) //2min || (bfCD is < 90 and > 15 && Ammo == 3) //1min 3 carts - || (JustUsed(Bloodfest, 2f) && JustUsed(BrutalShell)))) //opener + || (JustUsed(Bloodfest, 3f) && JustUsed(BrutalShell)))) //opener return SonicBreak; } @@ -463,14 +469,14 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //Lv100 if (LevelChecked(ReignOfBeasts) && GetCooldownRemainingTime(DoubleDown) < 0.7f) { - if ((JustUsed(SonicBreak, 3f) && !HasEffect(Buffs.ReadyToBreak) && bfCD < GCD * 6 || ActionReady(Bloodfest)) //2min - || (JustUsed(SonicBreak, 3f) && Ammo == 3) //1min NM 3 carts + if ((JustUsed(SonicBreak, 10f) && !HasEffect(Buffs.ReadyToBreak) && bfCD < GCD * 6 || ActionReady(Bloodfest)) //2min + || (JustUsed(SonicBreak, 10f) && Ammo == 3) //1min NM 3 carts || (JustUsed(SolidBarrel, 3f) && Ammo == 3 && HasEffect(Buffs.ReadyToBreak) && HasEffect(Buffs.NoMercy))) //1min NM 2 carts return DoubleDown; } //Lv90-Lv99 - if (!LevelChecked(ReignOfBeasts) && LevelChecked(DoubleDown) && GetCooldownRemainingTime(DoubleDown) <= 0.6f) + if (!LevelChecked(ReignOfBeasts) && LevelChecked(DoubleDown) && GetCooldownRemainingTime(DoubleDown) <= 0.3f) { if ((Ammo >= 2 && !HasEffect(Buffs.ReadyToBreak) && JustUsed(SonicBreak, 3f) && (bfCD < GCD * 6 || ActionReady(Bloodfest))) //2min NM 3 carts || (!HasEffect(Buffs.ReadyToBreak) && Ammo == 3 && JustUsed(SonicBreak, 3f) && bfCD is < 90 and > 15) //1min NM 3 carts @@ -490,7 +496,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } //GnashingFang - if (IsEnabled(CustomComboPreset.GNB_ST_GnashingStarter) && LevelChecked(GnashingFang) && GetCooldownRemainingTime(GnashingFang) < 0.7f && Ammo > 0) + if (IsEnabled(CustomComboPreset.GNB_ST_Gnashing) && LevelChecked(GnashingFang) && GetCooldownRemainingTime(GnashingFang) < 0.7f && Ammo > 0) { if (!HasEffect(Buffs.ReadyToBlast) && GunStep == 0 && ActionReady(GnashingFang) && (LevelChecked(ReignOfBeasts) && HasEffect(Buffs.NoMercy) && JustUsed(DoubleDown, 3f)) //Lv100 odd/even minute use @@ -509,14 +515,12 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { if (GetBuffRemainingTime(Buffs.ReadyToReign) > 0 && !ActionReady(GnashingFang) && !ActionReady(DoubleDown) && GunStep == 0) { - if (JustUsed(WickedTalon) || (JustUsed(EyeGouge))) + if (JustUsed(WickedTalon, 6f) || (JustUsed(EyeGouge, 5f))) return OriginalHook(ReignOfBeasts); } - if (JustUsed(ReignOfBeasts) || JustUsed(NobleBlood)) - { + if (GunStep is 3 or 4) return OriginalHook(ReignOfBeasts); - } } //BurstStrike @@ -532,12 +536,12 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } //Lv100 2cart 2min starter - if (IsEnabled(CustomComboPreset.GNB_ST_Advanced_CooldownsGroup) && IsEnabled(CustomComboPreset.GNB_ST_BurstStrike) && + if (IsEnabled(CustomComboPreset.GNB_ST_Advanced_CooldownsGroup) && IsEnabled(CustomComboPreset.GNB_ST_BurstStrike) && GetTargetHPPercent() > nmStop && LevelChecked(ReignOfBeasts) && ((nmCD <= GCD || ActionReady(NoMercy)) && Ammo is 3 && (bfCD < GCD * 12 || ActionReady(Bloodfest)))) return BurstStrike; //GnashingFang combo safety net - if (IsEnabled(CustomComboPreset.GNB_ST_Continuation) && GunStep is 1 or 2) + if (IsEnabled(CustomComboPreset.GNB_ST_Gnashing) && GunStep is 1 or 2) return OriginalHook(GnashingFang); //123 (overcap included) @@ -547,9 +551,9 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return BrutalShell; if (lastComboMove == BrutalShell && LevelChecked(SolidBarrel)) { - if (LevelChecked(Hypervelocity) && HasEffect(Buffs.ReadyToBlast) && nmCD > 1) //Lv100 Hypervelocity fit into NM check + if (IsEnabled(CustomComboPreset.GNB_ST_Continuation) && LevelChecked(Hypervelocity) && HasEffect(Buffs.ReadyToBlast) && (nmCD is > 1 or <= 0.1f || GetTargetHPPercent() < nmStop)) //Lv100 Hypervelocity fit into NM check return Hypervelocity; - if (LevelChecked(BurstStrike) && Ammo == MaxCartridges(level)) + if (IsEnabled(CustomComboPreset.GNB_ST_Overcap) && LevelChecked(BurstStrike) && Ammo == MaxCartridges(level)) return BurstStrike; return SolidBarrel; } @@ -702,7 +706,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } //Lv90 - if (!LevelChecked(ReignOfBeasts) && LevelChecked(DoubleDown) && GetCooldownRemainingTime(DoubleDown) <= 0.6f) + if (!LevelChecked(ReignOfBeasts) && LevelChecked(DoubleDown) && GetCooldownRemainingTime(DoubleDown) <= 0.3f) { if ((Ammo >= 2 && !HasEffect(Buffs.ReadyToBreak) && JustUsed(SonicBreak, 3f) && (bfCD < GCD * 6 || ActionReady(Bloodfest))) //2min NM 3 carts || (!HasEffect(Buffs.ReadyToBreak) && Ammo == 3 && JustUsed(SonicBreak, 3f) && bfCD is < 90 and > 15) //1min NM 3 carts @@ -740,15 +744,10 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsEnabled(CustomComboPreset.GNB_GF_Features) && IsEnabled(CustomComboPreset.GNB_GF_Reign) && (LevelChecked(ReignOfBeasts))) { if (GetBuffRemainingTime(Buffs.ReadyToReign) > 0 && !ActionReady(GnashingFang) && !ActionReady(DoubleDown) && GunStep == 0) - { - if (JustUsed(WickedTalon) || (JustUsed(EyeGouge))) - return OriginalHook(ReignOfBeasts); - } + return OriginalHook(ReignOfBeasts); - if (JustUsed(ReignOfBeasts) || JustUsed(NobleBlood)) - { + if (GunStep is 3 or 4) return OriginalHook(ReignOfBeasts); - } } //Burst Strike @@ -837,7 +836,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (LevelChecked(ReignOfBeasts)) //because leaving this out anywhere is a waste { if ((GetBuffRemainingTime(Buffs.ReadyToReign) > 0 && !ActionReady(DoubleDown) && GunStep == 0) || - (JustUsed(ReignOfBeasts) || JustUsed(NobleBlood))) + (GunStep is 3 or 4)) return OriginalHook(ReignOfBeasts); } //FatedCircle - if not unlocked, use BurstStrike @@ -888,6 +887,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim var GunStep = GetJobGauge().AmmoComboStep; // For GnashingFang & (possibly) ReignCombo purposes var bfCD = GetCooldownRemainingTime(Bloodfest); // Bloodfest's cooldown; 120s total float GCD = GetCooldown(KeenEdge).CooldownTotal; //2.5 is base SkS, but can work with 2.4x + int nmStop = PluginConfiguration.GetCustomIntValue(Config.GNB_AoE_NoMercyStop); //Variant Cure if (IsEnabled(CustomComboPreset.GNB_Variant_Cure) && IsEnabled(Variant.VariantCure) && PlayerHealthPercentageHp() <= GetOptionValue(Config.GNB_VariantCure)) @@ -909,7 +909,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return Variant.VariantUltimatum; //NoMercy - if (IsEnabled(CustomComboPreset.GNB_AoE_NoMercy) && ActionReady(NoMercy)) //use on CD + if (IsEnabled(CustomComboPreset.GNB_AoE_NoMercy) && ActionReady(NoMercy) && GetTargetHPPercent() > nmStop) //use on CD return NoMercy; //BowShock if (IsEnabled(CustomComboPreset.GNB_AoE_BowShock) && ActionReady(BowShock) && LevelChecked(BowShock) && HasEffect(Buffs.NoMercy)) //use on CD under NM @@ -935,7 +935,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsEnabled(CustomComboPreset.GNB_AoE_Reign) && LevelChecked(ReignOfBeasts)) //because leaving this out anywhere is a waste { if ((GetBuffRemainingTime(Buffs.ReadyToReign) > 0 && !ActionReady(DoubleDown) && GunStep == 0) || - (JustUsed(ReignOfBeasts) || JustUsed(NobleBlood))) + (GunStep is 3 or 4)) return OriginalHook(ReignOfBeasts); } //FatedCircle - if not unlocked, use BurstStrike @@ -943,7 +943,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim ((IsEnabled(CustomComboPreset.GNB_AoE_FatedCircle) && HasEffect(Buffs.NoMercy) && !ActionReady(DoubleDown) && GunStep == 0) || //use when under NM after DD & ignores GF (IsEnabled(CustomComboPreset.GNB_AoE_Bloodfest) && bfCD < 6))) // Bloodfest prep return FatedCircle; - if (Ammo > 0 && !LevelChecked(FatedCircle) && LevelChecked(BurstStrike) && + if (IsEnabled(CustomComboPreset.GNB_AoE_noFatedCircle) && Ammo > 0 && !LevelChecked(FatedCircle) && LevelChecked(BurstStrike) && (HasEffect(Buffs.NoMercy) && GunStep == 0)) // Bloodfest prep return BurstStrike; } @@ -955,9 +955,9 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { if (Ammo == MaxCartridges(level)) { - if (LevelChecked(FatedCircle)) + if (IsEnabled(CustomComboPreset.GNB_AoE_Overcap) && LevelChecked(FatedCircle)) return FatedCircle; - if (!LevelChecked(FatedCircle)) + if (IsEnabled(CustomComboPreset.GNB_AoE_BSOvercap) && !LevelChecked(FatedCircle)) return BurstStrike; } if (Ammo != MaxCartridges(level)) @@ -988,22 +988,15 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsEnabled(CustomComboPreset.GNB_BS_Continuation) && HasEffect(Buffs.ReadyToBlast) && LevelChecked(Hypervelocity)) return Hypervelocity; - if (IsEnabled(CustomComboPreset.GNB_BS_Bloodfest) && Ammo is 0 && LevelChecked(Bloodfest) && !HasEffect(Buffs.ReadyToBlast) && bfCD < 0.6f) + if (IsEnabled(CustomComboPreset.GNB_BS_Bloodfest) && Ammo is 0 && LevelChecked(Bloodfest) && !HasEffect(Buffs.ReadyToBlast) && bfCD < 0.3f) return Bloodfest; if (IsEnabled(CustomComboPreset.GNB_BS_DoubleDown) && HasEffect(Buffs.NoMercy) && GetCooldownRemainingTime(DoubleDown) < 2 && Ammo >= 2 && LevelChecked(DoubleDown)) return DoubleDown; if (IsEnabled(CustomComboPreset.GNB_BS_Reign) && (LevelChecked(ReignOfBeasts))) { - if (HasEffect(Buffs.ReadyToReign) && GetBuffRemainingTime(Buffs.ReadyToReign) > 0 && !ActionReady(DoubleDown) && GunStep == 0) - { - if (JustUsed(WickedTalon) || (JustUsed(EyeGouge))) - return OriginalHook(ReignOfBeasts); - } - - if (JustUsed(ReignOfBeasts) || JustUsed(NobleBlood)) - { + if ((HasEffect(Buffs.ReadyToReign) && GetBuffRemainingTime(Buffs.ReadyToReign) > 0 && !ActionReady(DoubleDown) && GunStep == 0) || + (GunStep is 3 or 4)) return OriginalHook(ReignOfBeasts); - } } } @@ -1061,17 +1054,11 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return SonicBreak; if (IsEnabled(CustomComboPreset.GNB_NM_DD) && LevelChecked(DoubleDown) && ActionReady(DoubleDown) && Ammo >= 2 && LevelChecked(DoubleDown)) return DoubleDown; - if (IsEnabled(CustomComboPreset.GNB_NM_Reign) && LevelChecked(ReignOfBeasts)) + if (IsEnabled(CustomComboPreset.GNB_NM_Reign) && (LevelChecked(ReignOfBeasts))) { - if (GetBuffRemainingTime(Buffs.ReadyToReign) > 0 && !ActionReady(GnashingFang) && !ActionReady(DoubleDown) && GunStep == 0) - { - return OriginalHook(ReignOfBeasts); - } - - if (JustUsed(ReignOfBeasts) || JustUsed(NobleBlood)) - { + if ((HasEffect(Buffs.ReadyToReign) && GetBuffRemainingTime(Buffs.ReadyToReign) > 0 && !ActionReady(DoubleDown) && GunStep == 0) || + (GunStep is 3 or 4)) return OriginalHook(ReignOfBeasts); - } } } } diff --git a/XIVSlothCombo/Window/Functions/UserConfig.cs b/XIVSlothCombo/Window/Functions/UserConfig.cs index 1d64d8ece..6419ee93f 100644 --- a/XIVSlothCombo/Window/Functions/UserConfig.cs +++ b/XIVSlothCombo/Window/Functions/UserConfig.cs @@ -1518,6 +1518,10 @@ internal static void Draw(CustomComboPreset preset, bool enabled) if (preset == CustomComboPreset.GNB_Variant_Cure) UserConfig.DrawSliderInt(1, 100, GNB.Config.GNB_VariantCure, "HP% to be at or under", 200); + if (preset == CustomComboPreset.GNB_ST_NoMercy) + UserConfig.DrawSliderInt(0, 25, GNB.Config.GNB_ST_NoMercyStop, "Stop Usage if Target HP% is below set value.\nTo Disable this option, set to 0."); + if (preset == CustomComboPreset.GNB_AoE_NoMercy) + UserConfig.DrawSliderInt(0, 25, GNB.Config.GNB_AoE_NoMercyStop, "Stop Usage if Target HP% is below set value.\nTo Disable this option, set to 0."); #endregion // ====================================================================================