From e828d0139be9d16f5d3d0b505fa61e0bb48538c6 Mon Sep 17 00:00:00 2001 From: Kage Date: Sat, 6 Jul 2024 09:58:48 +0200 Subject: [PATCH 01/26] various fixes --- XIVSlothCombo/Combos/CustomComboPreset.cs | 2 +- XIVSlothCombo/Combos/PvE/MCH.cs | 4 ++-- XIVSlothCombo/Combos/PvE/VPR.cs | 12 ++++-------- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index b7a70d65a..b48faaff0 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -1551,7 +1551,7 @@ public enum CustomComboPreset #region Simple ST - [ReplaceSkill(MCH.SplitShot)] + [ReplaceSkill(MCH.SplitShot, MCH.HeatedSplitShot)] [ConflictingCombos(MCH_ST_AdvancedMode)] [CustomComboInfo("Simple Mode - Single Target", "Replaces Split Shot with a one-button full single target rotation.\nThis is ideal for newcomers to the job.", MCH.JobID)] MCH_ST_SimpleMode = 8001, diff --git a/XIVSlothCombo/Combos/PvE/MCH.cs b/XIVSlothCombo/Combos/PvE/MCH.cs index df419a595..9366cbd8b 100644 --- a/XIVSlothCombo/Combos/PvE/MCH.cs +++ b/XIVSlothCombo/Combos/PvE/MCH.cs @@ -102,7 +102,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim bool anchorCD = !ActionReady(OriginalHook(AirAnchor)) || (ActionReady(OriginalHook(AirAnchor)) && GetCooldownRemainingTime(OriginalHook(AirAnchor)) > heatblastRC * 6); bool sawCD = !ActionReady(OriginalHook(Chainsaw)) || (ActionReady(OriginalHook(Chainsaw)) && GetCooldownRemainingTime(OriginalHook(Chainsaw)) > heatblastRC * 6); - if (actionID is SplitShot) + if (actionID is SplitShot or HeatedSplitShot) { if (IsEnabled(CustomComboPreset.MCH_Variant_Cure) && IsEnabled(Variant.VariantCure) && PlayerHealthPercentageHp() <= Config.MCH_VariantCure) @@ -279,7 +279,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim bool anchorCD = !ActionReady(OriginalHook(AirAnchor)) || (ActionReady(OriginalHook(AirAnchor)) && GetCooldownRemainingTime(OriginalHook(AirAnchor)) > heatblastRC * 6); bool sawCD = !ActionReady(OriginalHook(Chainsaw)) || (ActionReady(OriginalHook(Chainsaw)) && GetCooldownRemainingTime(OriginalHook(Chainsaw)) > heatblastRC * 6); - if (actionID is SplitShot) + if (actionID is SplitShot or HeatedSplitShot) { if (IsEnabled(CustomComboPreset.MCH_Variant_Cure) && IsEnabled(Variant.VariantCure) && PlayerHealthPercentageHp() <= Config.MCH_VariantCure) diff --git a/XIVSlothCombo/Combos/PvE/VPR.cs b/XIVSlothCombo/Combos/PvE/VPR.cs index 605cb6763..532005a4e 100644 --- a/XIVSlothCombo/Combos/PvE/VPR.cs +++ b/XIVSlothCombo/Combos/PvE/VPR.cs @@ -325,8 +325,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } // Uncoiled combo - if (IsEnabled(CustomComboPreset.VPR_ST_UncoiledFury) && - IsEnabled(CustomComboPreset.VPR_ST_UncoiledFuryCombo)) + if (IsEnabled(CustomComboPreset.VPR_ST_UncoiledFuryCombo)) { if (HasEffect(Buffs.PoisedForTwinfang)) return OriginalHook(Twinfang); @@ -403,7 +402,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim // Dreadwinder combo if (IsEnabled(CustomComboPreset.VPR_ST_CDs) && - IsEnabled(CustomComboPreset.VPR_ST_Dreadwinder) && IsEnabled(CustomComboPreset.VPR_ST_DreadwinderCombo)) { if (HasEffect(Buffs.HuntersVenom)) @@ -725,8 +723,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (actionID is SteelMaw) { // Uncoiled combo - if (IsEnabled(CustomComboPreset.VPR_AoE_UncoiledFury) && - IsEnabled(CustomComboPreset.VPR_AoE_UncoiledFuryCombo)) + if (IsEnabled(CustomComboPreset.VPR_AoE_UncoiledFuryCombo)) { if (HasEffect(Buffs.PoisedForTwinfang)) return OriginalHook(Twinfang); @@ -797,8 +794,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim // Pit of Dread combo if (IsEnabled(CustomComboPreset.VPR_AoE_CDs) && - IsEnabled(CustomComboPreset.VPR_AoE_PitOfDread) && - IsEnabled(CustomComboPreset.VPR_AoE_PitOfDreadCombo)) + IsEnabled(CustomComboPreset.VPR_AoE_PitOfDreadCombo)) { if (HasEffect(Buffs.FellhuntersVenom)) return OriginalHook(Twinfang); @@ -862,7 +858,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return OriginalHook(SerpentsTail); //Reawakend Usage - if (IsEnabled(CustomComboPreset.VPR_ST_Reawaken) && + if (IsEnabled(CustomComboPreset.VPR_AoE_Reawaken) && (HasEffect(Buffs.ReadyToReawaken) || gauge.SerpentOffering >= 50) && HasEffect(Buffs.Swiftscaled) && HasEffect(Buffs.HuntersInstinct) && From 4560fb9c3cc051a48e96244d5bf3cfe4f3cab7f3 Mon Sep 17 00:00:00 2001 From: Kage Date: Sat, 6 Jul 2024 10:04:22 +0200 Subject: [PATCH 02/26] decoupled combo from dreadwinder/PitOfDread --- XIVSlothCombo/Combos/CustomComboPreset.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index b48faaff0..089976977 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -3564,7 +3564,7 @@ The three digets after RDM.JobID can be used to reorder items in the list [CustomComboInfo("Dreadwinder", "Adds Dreadwinder to the rotation.", VPR.JobID)] VPR_ST_Dreadwinder = 30006, - [ParentCombo(VPR_ST_Dreadwinder)] + [ParentCombo(VPR_ST_CDs)] [CustomComboInfo("Dreadwinder Combo", "Adds Swiftskin's Coil and Hunter's Coil to the rotation.", VPR.JobID)] VPR_ST_DreadwinderCombo = 30007, @@ -3578,7 +3578,7 @@ The three digets after RDM.JobID can be used to reorder items in the list [CustomComboInfo("Uncoiled Fury", "Adds Uncoiled Fury to the rotation.", VPR.JobID)] VPR_ST_UncoiledFury = 30009, - [ParentCombo(VPR_ST_UncoiledFury)] + [ParentCombo(VPR_ST_AdvancedMode)] [CustomComboInfo("Uncoiled Fury Combo", "Adds Uncoiled Twinfang and Uncoiled Twinblood to the rotation.", VPR.JobID)] VPR_ST_UncoiledFuryCombo = 30010, @@ -3638,7 +3638,7 @@ The three digets after RDM.JobID can be used to reorder items in the list [CustomComboInfo("Pit Of Dread", "Adds Pit Of Dread to the rotation.", VPR.JobID)] VPR_AoE_PitOfDread = 30105, - [ParentCombo(VPR_AoE_PitOfDread)] + [ParentCombo(VPR_AoE_CDs)] [CustomComboInfo("Pit Of Dread Combo", "Adds Swiftskin's Den and Hunter's Den to the rotation.", VPR.JobID)] VPR_AoE_PitOfDreadCombo = 30106, @@ -3652,7 +3652,7 @@ The three digets after RDM.JobID can be used to reorder items in the list [CustomComboInfo("Uncoiled Fury", "Adds Uncoiled Fury to the rotation.", VPR.JobID)] VPR_AoE_UncoiledFury = 30108, - [ParentCombo(VPR_AoE_UncoiledFury)] + [ParentCombo(VPR_AoE_AdvancedMode)] [CustomComboInfo("Uncoiled Fury Combo", "Adds Uncoiled Twinfang and Uncoiled Twinblood to the rotation.", VPR.JobID)] VPR_AoE_UncoiledFuryCombo = 30109, From 6be6d89a27e6f5852a74738c003372e8405be396 Mon Sep 17 00:00:00 2001 From: Kage Date: Sat, 6 Jul 2024 13:34:41 +0200 Subject: [PATCH 03/26] fix wildfire issue rewired some reassembles to be better used. --- XIVSlothCombo/Combos/PvE/MCH.cs | 83 +++++++++++++++++---------------- 1 file changed, 43 insertions(+), 40 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/MCH.cs b/XIVSlothCombo/Combos/PvE/MCH.cs index 9366cbd8b..293053514 100644 --- a/XIVSlothCombo/Combos/PvE/MCH.cs +++ b/XIVSlothCombo/Combos/PvE/MCH.cs @@ -100,7 +100,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim double heatblastRC = 1.5; bool drillCD = !ActionReady(Drill) || (ActionReady(Drill) && GetCooldownRemainingTime(Drill) > heatblastRC * 6); bool anchorCD = !ActionReady(OriginalHook(AirAnchor)) || (ActionReady(OriginalHook(AirAnchor)) && GetCooldownRemainingTime(OriginalHook(AirAnchor)) > heatblastRC * 6); - bool sawCD = !ActionReady(OriginalHook(Chainsaw)) || (ActionReady(OriginalHook(Chainsaw)) && GetCooldownRemainingTime(OriginalHook(Chainsaw)) > heatblastRC * 6); + bool sawCD = !ActionReady(Chainsaw) || (ActionReady(Chainsaw) && GetCooldownRemainingTime(Chainsaw) > heatblastRC * 6); if (actionID is SplitShot or HeatedSplitShot) { @@ -122,6 +122,10 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (interruptReady) return All.HeadGraze; + if (gauge.IsRobotActive && GetTargetHPPercent() <= 5 && + CanWeave(actionID) && ActionReady(OriginalHook(RookOverdrive))) + return OriginalHook(RookOverdrive); + // Wildfire if (CanWeave(actionID) && ActionReady(Wildfire) && WasLastAction(Hypercharge)) return Wildfire; @@ -135,7 +139,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (UseQueen(gauge)) return OriginalHook(RookAutoturret); - if (CanWeave(actionID) && (gauge.Heat >= 50 || HasEffect(Buffs.Hypercharged)) && LevelChecked(Hypercharge) && !gauge.IsOverheated) + if (CanWeave(actionID) && (gauge.Heat >= 50 || HasEffect(Buffs.Hypercharged)) && + LevelChecked(Hypercharge) && !gauge.IsOverheated && !WasLastAction(BarrelStabilizer)) { //Protection & ensures Hyper charged is double weaved with WF during reopener if (WasLastAction(FullMetalField) || @@ -143,7 +148,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim !LevelChecked(Wildfire)) return Hypercharge; - if (drillCD && anchorCD && sawCD && GetCooldownRemainingTime(Wildfire) > 10) + if (drillCD && anchorCD && sawCD) return Hypercharge; } @@ -161,11 +166,12 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (gauge.IsOverheated && LevelChecked(OriginalHook(Heatblast))) return OriginalHook(Heatblast); - if (ReassembledTools(ref actionID)) + if (ReassembledTools(ref actionID, gauge)) return actionID; //gauss and ricochet outside HC - if (CanWeave(actionID) && !gauge.IsOverheated && !HasEffect(Buffs.Wildfire)) + if (CanWeave(actionID) && !gauge.IsOverheated && !HasEffect(Buffs.Wildfire) && + ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability) { if (ActionReady(OriginalHook(GaussRound))) return OriginalHook(GaussRound); @@ -181,7 +187,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return OriginalHook(SlugShot); if (lastComboMove == OriginalHook(SlugShot) && - !LevelChecked(Drill) && !HasEffect(Buffs.Reassembled) && HasCharges(Reassemble)) + !LevelChecked(Drill) && !HasEffect(Buffs.Reassembled) && ActionReady(Reassemble)) return Reassemble; if (lastComboMove is SlugShot && LevelChecked(OriginalHook(CleanShot))) @@ -194,27 +200,27 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return actionID; } - private static bool ReassembledTools(ref uint actionId) + private static bool ReassembledTools(ref uint actionID, MCHGauge gauge) { bool battery = Svc.Gauges.Get().Battery == 100; // TOOLS!! Chainsaw Drill Air Anchor Excavator - if (!HasEffect(Buffs.Wildfire) && !ActionWatching.WasLast2ActionsAbilities() && - !HasEffect(Buffs.Reassembled) && HasCharges(Reassemble) && - GetRemainingCharges(Reassemble) > Config.MCH_ST_ReassemblePool && - ((LevelChecked(OriginalHook(Chainsaw)) && GetCooldownRemainingTime(Chainsaw) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) + 0.25) || ActionReady(OriginalHook(Chainsaw)) || - (LevelChecked(AirAnchor) && GetCooldownRemainingTime(AirAnchor) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) + 0.25) || ActionReady(AirAnchor) || - (!LevelChecked(AirAnchor) && LevelChecked(Drill) && GetCooldownRemainingTime(Drill) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) + 0.25) || ActionReady(Drill))) + if (!gauge.IsOverheated && !ActionWatching.WasLast2ActionsAbilities() && + !HasEffect(Buffs.Reassembled) && ActionReady(Reassemble) && CanWeave(actionID) && + ((GetCooldownRemainingTime(AirAnchor) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) && LevelChecked(AirAnchor) && !battery) || + (GetCooldownRemainingTime(Drill) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) && LevelChecked(Drill) && !LevelChecked(AirAnchor)) || + (GetCooldownRemainingTime(Chainsaw) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) && LevelChecked(Chainsaw) && !LevelChecked(Excavator) && !battery) || + (HasEffect(Buffs.ExcavatorReady) && LevelChecked(Excavator) && !battery))) { - actionId = Reassemble; + actionID = Reassemble; return true; } - if (LevelChecked(OriginalHook(Chainsaw)) && + if (LevelChecked(Chainsaw) && !battery && ((GetCooldownRemainingTime(Chainsaw) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) + 0.25) || ActionReady(Chainsaw))) { - actionId = OriginalHook(Chainsaw); + actionID = Chainsaw; return true; } @@ -222,14 +228,14 @@ private static bool ReassembledTools(ref uint actionId) !battery && ((GetCooldownRemainingTime(OriginalHook(AirAnchor)) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) + 0.25) || ActionReady(OriginalHook(AirAnchor)))) { - actionId = OriginalHook(AirAnchor); + actionID = OriginalHook(AirAnchor); return true; } if (LevelChecked(Drill) && !WasLastWeaponskill(Drill) && ((GetCooldownRemainingTime(Drill) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) + 0.25) || ActionReady(Drill))) { - actionId = Drill; + actionID = Drill; return true; } @@ -237,10 +243,9 @@ private static bool ReassembledTools(ref uint actionId) !battery && HasEffect(Buffs.ExcavatorReady)) { - actionId = OriginalHook(Chainsaw); + actionID = OriginalHook(Chainsaw); return true; } - return false; } @@ -260,7 +265,6 @@ private static bool UseQueen(MCHGauge gauge) if (queensUsed >= 2 && queensUsed % 2 == 1 && gauge.Battery >= 80) return true; } - return false; } } @@ -277,7 +281,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim double heatblastRC = 1.5; bool drillCD = !ActionReady(Drill) || (ActionReady(Drill) && GetCooldownRemainingTime(Drill) > heatblastRC * 6); bool anchorCD = !ActionReady(OriginalHook(AirAnchor)) || (ActionReady(OriginalHook(AirAnchor)) && GetCooldownRemainingTime(OriginalHook(AirAnchor)) > heatblastRC * 6); - bool sawCD = !ActionReady(OriginalHook(Chainsaw)) || (ActionReady(OriginalHook(Chainsaw)) && GetCooldownRemainingTime(OriginalHook(Chainsaw)) > heatblastRC * 6); + bool sawCD = !ActionReady(Chainsaw) || (ActionReady(Chainsaw) && GetCooldownRemainingTime(Chainsaw) > heatblastRC * 6); if (actionID is SplitShot or HeatedSplitShot) { @@ -322,7 +326,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return OriginalHook(RookAutoturret); if (IsEnabled(CustomComboPreset.MCH_ST_Adv_Hypercharge) && - CanWeave(actionID) && (gauge.Heat >= 50 || HasEffect(Buffs.Hypercharged)) && LevelChecked(Hypercharge) && !gauge.IsOverheated) + CanWeave(actionID) && (gauge.Heat >= 50 || HasEffect(Buffs.Hypercharged)) && + LevelChecked(Hypercharge) && !gauge.IsOverheated && !WasLastAction(BarrelStabilizer)) { //Protection & ensures Hyper charged is double weaved with WF during reopener if (WasLastAction(FullMetalField) || @@ -330,7 +335,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim !LevelChecked(Wildfire)) return Hypercharge; - if (drillCD && anchorCD && sawCD && GetCooldownRemainingTime(Wildfire) > 10) + if (drillCD && anchorCD && sawCD) return Hypercharge; } @@ -349,7 +354,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim gauge.IsOverheated && LevelChecked(OriginalHook(Heatblast))) return OriginalHook(Heatblast); - if (ReassembledTools(ref actionID)) + if (ReassembledTools(ref actionID, gauge)) return actionID; //gauss and ricochet outside HC @@ -375,20 +380,18 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return OriginalHook(SlugShot); if (IsEnabled(CustomComboPreset.MCH_ST_Adv_Reassemble) && Config.MCH_ST_Reassembled[4] && lastComboMove == OriginalHook(SlugShot) && - !LevelChecked(Drill) && !HasEffect(Buffs.Reassembled) && HasCharges(Reassemble)) + !LevelChecked(Drill) && !HasEffect(Buffs.Reassembled) && ActionReady(Reassemble)) return Reassemble; if (lastComboMove is SlugShot && LevelChecked(OriginalHook(CleanShot))) return OriginalHook(CleanShot); } - return OriginalHook(SplitShot); } - return actionID; } - private static bool ReassembledTools(ref uint actionId) + private static bool ReassembledTools(ref uint actionID, MCHGauge gauge) { bool battery = Svc.Gauges.Get().Battery == 100; bool reassembledAnchor = (IsEnabled(CustomComboPreset.MCH_ST_Adv_Reassemble) && Config.MCH_ST_Reassembled[0] && (HasEffect(Buffs.Reassembled) || !HasEffect(Buffs.Reassembled))) || (IsEnabled(CustomComboPreset.MCH_ST_Adv_Reassemble) && !Config.MCH_ST_Reassembled[0] && !HasEffect(Buffs.Reassembled)) || (!HasEffect(Buffs.Reassembled) && GetRemainingCharges(Reassemble) <= Config.MCH_ST_ReassemblePool) || (!IsEnabled(CustomComboPreset.MCH_ST_Adv_Reassemble)); @@ -397,24 +400,25 @@ private static bool ReassembledTools(ref uint actionId) bool reassembledExcavator = (IsEnabled(CustomComboPreset.MCH_ST_Adv_Reassemble) && Config.MCH_ST_Reassembled[3] && (HasEffect(Buffs.Reassembled) || !HasEffect(Buffs.Reassembled))) || (IsEnabled(CustomComboPreset.MCH_ST_Adv_Reassemble) && !Config.MCH_ST_Reassembled[3] && !HasEffect(Buffs.Reassembled)) || (!HasEffect(Buffs.Reassembled) && GetRemainingCharges(Reassemble) <= Config.MCH_ST_ReassemblePool) || (!IsEnabled(CustomComboPreset.MCH_ST_Adv_Reassemble)); // TOOLS!! Chainsaw Drill Air Anchor Excavator - if (IsEnabled(CustomComboPreset.MCH_ST_Adv_Reassemble) && !HasEffect(Buffs.Wildfire) && !ActionWatching.WasLast2ActionsAbilities() && - !HasEffect(Buffs.Reassembled) && HasCharges(Reassemble) && + if (IsEnabled(CustomComboPreset.MCH_ST_Adv_Reassemble) && !gauge.IsOverheated && !ActionWatching.WasLast2ActionsAbilities() && + !HasEffect(Buffs.Reassembled) && ActionReady(Reassemble) && CanWeave(actionID) && GetRemainingCharges(Reassemble) > Config.MCH_ST_ReassemblePool && ((GetCooldownRemainingTime(AirAnchor) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) && Config.MCH_ST_Reassembled[0] && LevelChecked(AirAnchor) && !battery) || - (GetCooldownRemainingTime(OriginalHook(Drill)) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) && Config.MCH_ST_Reassembled[1] && LevelChecked(Drill) && !LevelChecked(AirAnchor)) || - (GetCooldownRemainingTime(OriginalHook(Chainsaw)) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) && Config.MCH_ST_Reassembled[2] && LevelChecked(Excavator) && !battery))) + (GetCooldownRemainingTime(Drill) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) && Config.MCH_ST_Reassembled[1] && LevelChecked(Drill) && (!LevelChecked(AirAnchor) || !Config.MCH_ST_Reassembled[0])) || + (GetCooldownRemainingTime(Chainsaw) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) && Config.MCH_ST_Reassembled[2] && LevelChecked(Chainsaw) && (!LevelChecked(Excavator) || !Config.MCH_ST_Reassembled[3]) && !battery) || + (HasEffect(Buffs.ExcavatorReady) && Config.MCH_ST_Reassembled[3] && LevelChecked(Excavator) && !battery))) { - actionId = Reassemble; + actionID = Reassemble; return true; } if (IsEnabled(CustomComboPreset.MCH_ST_Adv_Chainsaw) && reassembledChainsaw && - LevelChecked(OriginalHook(Chainsaw)) && + LevelChecked(Chainsaw) && !battery && ((GetCooldownRemainingTime(Chainsaw) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) + 0.25) || ActionReady(Chainsaw))) { - actionId = OriginalHook(Chainsaw); + actionID = Chainsaw; return true; } @@ -424,7 +428,7 @@ private static bool ReassembledTools(ref uint actionId) !battery && ((GetCooldownRemainingTime(OriginalHook(AirAnchor)) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) + 0.25) || ActionReady(OriginalHook(AirAnchor)))) { - actionId = OriginalHook(AirAnchor); + actionID = OriginalHook(AirAnchor); return true; } @@ -433,7 +437,7 @@ private static bool ReassembledTools(ref uint actionId) LevelChecked(Drill) && !WasLastWeaponskill(Drill) && ((GetCooldownRemainingTime(Drill) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) + 0.25) || ActionReady(Drill))) { - actionId = Drill; + actionID = Drill; return true; } @@ -443,10 +447,9 @@ private static bool ReassembledTools(ref uint actionId) !battery && HasEffect(Buffs.ExcavatorReady)) { - actionId = OriginalHook(Chainsaw); + actionID = OriginalHook(Chainsaw); return true; } - return false; } From 3015eb5a201810616a3804454dad44ff76afa5e3 Mon Sep 17 00:00:00 2001 From: Kage Date: Sat, 6 Jul 2024 18:44:38 +0200 Subject: [PATCH 04/26] some default settings for MCH --- XIVSlothCombo/Combos/PvE/MCH.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/MCH.cs b/XIVSlothCombo/Combos/PvE/MCH.cs index 293053514..11424fab1 100644 --- a/XIVSlothCombo/Combos/PvE/MCH.cs +++ b/XIVSlothCombo/Combos/PvE/MCH.cs @@ -73,13 +73,13 @@ public const ushort public static class Config { public static UserInt - MCH_ST_SecondWindThreshold = new("MCH_ST_SecondWindThreshold"), - MCH_AoE_SecondWindThreshold = new("MCH_AoE_SecondWindThreshold"), + MCH_ST_SecondWindThreshold = new("MCH_ST_SecondWindThreshold",25), + MCH_AoE_SecondWindThreshold = new("MCH_AoE_SecondWindThreshold",25), MCH_VariantCure = new("MCH_VariantCure"), MCH_ST_TurretUsage = new("MCH_ST_Adv_TurretGauge"), MCH_AoE_TurretUsage = new("MCH_AoE_TurretUsage"), - MCH_ST_ReassemblePool = new("MCH_ST_ReassemblePool"), - MCH_AoE_ReassemblePool = new("MCH_AoE_ReassemblePool"), + MCH_ST_ReassemblePool = new("MCH_ST_ReassemblePool",0), + MCH_AoE_ReassemblePool = new("MCH_AoE_ReassemblePool",0), MCH_ST_QueenOverDrive = new("MCH_ST_QueenOverDrive"); public static UserBoolArray MCH_ST_Reassembled = new("MCH_ST_Reassembled"), From 641fa8266ec21da32b23d0c13354811fb6c585a8 Mon Sep 17 00:00:00 2001 From: Kage Date: Sat, 6 Jul 2024 21:28:53 +0200 Subject: [PATCH 05/26] UI cleanup --- XIVSlothCombo/Combos/PvE/VPR.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/VPR.cs b/XIVSlothCombo/Combos/PvE/VPR.cs index 532005a4e..8345611b5 100644 --- a/XIVSlothCombo/Combos/PvE/VPR.cs +++ b/XIVSlothCombo/Combos/PvE/VPR.cs @@ -198,7 +198,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } // Dreadwinder combo - if (HasEffect(Buffs.HuntersVenom)) return OriginalHook(Twinfang); @@ -221,7 +220,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return SwiftskinsCoil; } - // Uncoiled Fury usage if (LevelChecked(UncoiledFury) && gauge.RattlingCoilStacks > 1 && !DreadwinderReady && !HuntersCoilReady && !SwiftskinsCoilReady && @@ -547,7 +545,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim !IsEnabled(CustomComboPreset.VPR_ST_Dreadwinder))) ? OriginalHook(DreadFangs) : OriginalHook(SteelFangs); - } return IsEnabled(CustomComboPreset.VPR_ST_NoxiousGnash) ? OriginalHook(DreadFangs) @@ -572,7 +569,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (actionID is SteelMaw) { // Uncoiled combo - if (HasEffect(Buffs.PoisedForTwinfang)) return OriginalHook(Twinfang); From 6fb1cca6a92ea7495be9540368190da80824644e Mon Sep 17 00:00:00 2001 From: Kage Date: Sun, 7 Jul 2024 12:08:05 +0200 Subject: [PATCH 06/26] fix lvlchecks add 2 min burst window --- XIVSlothCombo/Combos/PvE/VPR.cs | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/VPR.cs b/XIVSlothCombo/Combos/PvE/VPR.cs index 8345611b5..d8c509412 100644 --- a/XIVSlothCombo/Combos/PvE/VPR.cs +++ b/XIVSlothCombo/Combos/PvE/VPR.cs @@ -273,6 +273,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //Reawakend Usage if ((HasEffect(Buffs.ReadyToReawaken) || gauge.SerpentOffering >= 50) && + GetCooldownRemainingTime(SerpentsIre) >= 30 && HasEffect(Buffs.Swiftscaled) && HasEffect(Buffs.HuntersInstinct) && TargetHasEffect(Debuffs.NoxiousGnash) && @@ -286,13 +287,15 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return Dreadwinder; } - return (GetDebuffRemainingTime(Debuffs.NoxiousGnash) < 20 && + return (GetDebuffRemainingTime(Debuffs.NoxiousGnash) < 20 && LevelChecked(DreadFangs) && (!ActionReady(Dreadwinder) || combatDuration.Seconds < 5)) ? OriginalHook(DreadFangs) : OriginalHook(SteelFangs); } - return OriginalHook(DreadFangs); + return LevelChecked(DreadFangs) + ? OriginalHook(DreadFangs) + : OriginalHook(SteelFangs); } return actionID; } @@ -524,6 +527,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //Reawakend Usage if (IsEnabled(CustomComboPreset.VPR_ST_Reawaken) && (HasEffect(Buffs.ReadyToReawaken) || gauge.SerpentOffering >= 50) && + GetCooldownRemainingTime(SerpentsIre) >= 30 && HasEffect(Buffs.Swiftscaled) && HasEffect(Buffs.HuntersInstinct) && TargetHasEffect(Debuffs.NoxiousGnash) && @@ -540,13 +544,13 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } return (IsEnabled(CustomComboPreset.VPR_ST_NoxiousGnash) && - GetDebuffRemainingTime(Debuffs.NoxiousGnash) < ST_NoxiousDebuffRefresh && + GetDebuffRemainingTime(Debuffs.NoxiousGnash) < ST_NoxiousDebuffRefresh && LevelChecked(DreadFangs) && ((IsEnabled(CustomComboPreset.VPR_ST_Dreadwinder) && !ActionReady(Dreadwinder)) || !IsEnabled(CustomComboPreset.VPR_ST_Dreadwinder))) ? OriginalHook(DreadFangs) : OriginalHook(SteelFangs); } - return IsEnabled(CustomComboPreset.VPR_ST_NoxiousGnash) + return IsEnabled(CustomComboPreset.VPR_ST_NoxiousGnash) && LevelChecked(DreadFangs) ? OriginalHook(DreadFangs) : OriginalHook(SteelFangs); } @@ -632,7 +636,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } // Pit of Dread combo - if (HasEffect(Buffs.FellhuntersVenom)) return OriginalHook(Twinfang); @@ -681,12 +684,13 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //Reawakend Usage if ((HasEffect(Buffs.ReadyToReawaken) || gauge.SerpentOffering >= 50) && + GetCooldownRemainingTime(SerpentsIre) >= 30 && HasEffect(Buffs.Swiftscaled) && HasEffect(Buffs.HuntersInstinct) && TargetHasEffect(Debuffs.NoxiousGnash) && !HasEffect(Buffs.FellhuntersVenom) && !HasEffect(Buffs.FellskinsVenom) && !HasEffect(Buffs.PoisedForTwinblood) && !HasEffect(Buffs.PoisedForTwinfang) && - !WasLastAction(SerpentsIre) && GetTargetHPPercent() >= Config.VPR_AoE_Reawaken_Usage) + !WasLastAction(SerpentsIre)) return Reawaken; //Pit of Dread Usage @@ -694,11 +698,13 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return PitofDread; } - return (GetDebuffRemainingTime(Debuffs.NoxiousGnash) < AoE_NoxiousDebuffRefresh && !ActionReady(PitofDread)) + return (GetDebuffRemainingTime(Debuffs.NoxiousGnash) < AoE_NoxiousDebuffRefresh && !ActionReady(PitofDread) && LevelChecked(DreadMaw)) ? OriginalHook(DreadMaw) : OriginalHook(SteelMaw); } - return OriginalHook(DreadMaw); + return LevelChecked(DreadMaw) + ? OriginalHook(DreadMaw) + : OriginalHook(SteelMaw); } return actionID; } @@ -790,7 +796,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim // Pit of Dread combo if (IsEnabled(CustomComboPreset.VPR_AoE_CDs) && - IsEnabled(CustomComboPreset.VPR_AoE_PitOfDreadCombo)) + IsEnabled(CustomComboPreset.VPR_AoE_PitOfDreadCombo)) { if (HasEffect(Buffs.FellhuntersVenom)) return OriginalHook(Twinfang); @@ -856,6 +862,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //Reawakend Usage if (IsEnabled(CustomComboPreset.VPR_AoE_Reawaken) && (HasEffect(Buffs.ReadyToReawaken) || gauge.SerpentOffering >= 50) && + GetCooldownRemainingTime(SerpentsIre) >= 30 && HasEffect(Buffs.Swiftscaled) && HasEffect(Buffs.HuntersInstinct) && TargetHasEffect(Debuffs.NoxiousGnash) && @@ -872,14 +879,14 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } return (IsEnabled(CustomComboPreset.VPR_AoE_NoxiousGnash) && - GetDebuffRemainingTime(Debuffs.NoxiousGnash) < AoE_NoxiousDebuffRefresh && + GetDebuffRemainingTime(Debuffs.NoxiousGnash) < AoE_NoxiousDebuffRefresh && LevelChecked(DreadMaw) && ((IsEnabled(CustomComboPreset.VPR_AoE_PitOfDread) && !ActionReady(PitofDread)) || !IsEnabled(CustomComboPreset.VPR_AoE_PitOfDread))) ? OriginalHook(DreadMaw) : OriginalHook(SteelMaw); } - return IsEnabled(CustomComboPreset.VPR_AoE_NoxiousGnash) + return IsEnabled(CustomComboPreset.VPR_AoE_NoxiousGnash) && LevelChecked(DreadMaw) ? OriginalHook(DreadMaw) : OriginalHook(SteelMaw); } From b88ba5293b93a02175917371e332f45a67c3643f Mon Sep 17 00:00:00 2001 From: Kage Date: Sun, 7 Jul 2024 12:14:33 +0200 Subject: [PATCH 07/26] fix doubleweave after HC --- XIVSlothCombo/Combos/PvE/MCH.cs | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/MCH.cs b/XIVSlothCombo/Combos/PvE/MCH.cs index 11424fab1..d06a08126 100644 --- a/XIVSlothCombo/Combos/PvE/MCH.cs +++ b/XIVSlothCombo/Combos/PvE/MCH.cs @@ -73,13 +73,13 @@ public const ushort public static class Config { public static UserInt - MCH_ST_SecondWindThreshold = new("MCH_ST_SecondWindThreshold",25), - MCH_AoE_SecondWindThreshold = new("MCH_AoE_SecondWindThreshold",25), + MCH_ST_SecondWindThreshold = new("MCH_ST_SecondWindThreshold", 25), + MCH_AoE_SecondWindThreshold = new("MCH_AoE_SecondWindThreshold", 25), MCH_VariantCure = new("MCH_VariantCure"), MCH_ST_TurretUsage = new("MCH_ST_Adv_TurretGauge"), MCH_AoE_TurretUsage = new("MCH_AoE_TurretUsage"), - MCH_ST_ReassemblePool = new("MCH_ST_ReassemblePool",0), - MCH_AoE_ReassemblePool = new("MCH_AoE_ReassemblePool",0), + MCH_ST_ReassemblePool = new("MCH_ST_ReassemblePool", 0), + MCH_AoE_ReassemblePool = new("MCH_AoE_ReassemblePool", 0), MCH_ST_QueenOverDrive = new("MCH_ST_QueenOverDrive"); public static UserBoolArray MCH_ST_Reassembled = new("MCH_ST_Reassembled"), @@ -326,7 +326,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return OriginalHook(RookAutoturret); if (IsEnabled(CustomComboPreset.MCH_ST_Adv_Hypercharge) && - CanWeave(actionID) && (gauge.Heat >= 50 || HasEffect(Buffs.Hypercharged)) && + CanWeave(actionID) && (gauge.Heat >= 50 || HasEffect(Buffs.Hypercharged)) && LevelChecked(Hypercharge) && !gauge.IsOverheated && !WasLastAction(BarrelStabilizer)) { //Protection & ensures Hyper charged is double weaved with WF during reopener @@ -359,7 +359,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //gauss and ricochet outside HC if (IsEnabled(CustomComboPreset.MCH_ST_Adv_GaussRicochet) && - CanWeave(actionID) && !gauge.IsOverheated && !HasEffect(Buffs.Wildfire)) + CanWeave(actionID) && !gauge.IsOverheated && !HasEffect(Buffs.Wildfire) && + ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability) { if (ActionReady(OriginalHook(GaussRound))) return OriginalHook(GaussRound); @@ -543,7 +544,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return OriginalHook(AutoCrossbow); //gauss and ricochet outside HC - if (CanWeave(actionID) && !gauge.IsOverheated && !HasEffect(Buffs.Wildfire)) + if (CanWeave(actionID) && !gauge.IsOverheated && !HasEffect(Buffs.Wildfire) && + ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability) { if (ActionReady(OriginalHook(GaussRound))) return OriginalHook(GaussRound); @@ -639,7 +641,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //AutoCrossbow, Gauss, Rico if (IsEnabled(CustomComboPreset.MCH_AoE_Adv_GaussRicochet) && CanWeave(actionID) && - (Config.MCH_AoE_Hypercharge || (!Config.MCH_AoE_Hypercharge && gauge.IsOverheated))) + (Config.MCH_AoE_Hypercharge || (!Config.MCH_AoE_Hypercharge && gauge.IsOverheated)) && + ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability) { if ((WasLastAction(SpreadShot) || WasLastAction(AutoCrossbow) || Config.MCH_AoE_Hypercharge) && ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability) @@ -657,7 +660,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //gauss and ricochet outside HC if (IsEnabled(CustomComboPreset.MCH_AoE_Adv_GaussRicochet) && - CanWeave(actionID) && !gauge.IsOverheated && !HasEffect(Buffs.Wildfire)) + CanWeave(actionID) && !gauge.IsOverheated && !HasEffect(Buffs.Wildfire) && + ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability) { if (ActionReady(OriginalHook(GaussRound))) return OriginalHook(GaussRound); From 6b468543c2153dcd95000b6521d913328230b5db Mon Sep 17 00:00:00 2001 From: Kage Date: Mon, 8 Jul 2024 22:53:04 +0200 Subject: [PATCH 08/26] fix doubleweaving after HC --- XIVSlothCombo/Combos/PvE/MCH.cs | 42 +++++++++++++++++---------------- 1 file changed, 22 insertions(+), 20 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/MCH.cs b/XIVSlothCombo/Combos/PvE/MCH.cs index d06a08126..87b6a5d47 100644 --- a/XIVSlothCombo/Combos/PvE/MCH.cs +++ b/XIVSlothCombo/Combos/PvE/MCH.cs @@ -170,13 +170,13 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return actionID; //gauss and ricochet outside HC - if (CanWeave(actionID) && !gauge.IsOverheated && !HasEffect(Buffs.Wildfire) && - ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability) + if (CanWeave(actionID) && !gauge.IsOverheated && + !HasEffect(Buffs.Wildfire) && !WasLastWeaponskill(OriginalHook(Heatblast))) { - if (ActionReady(OriginalHook(GaussRound))) + if (ActionReady(OriginalHook(GaussRound)) && !WasLastAction(OriginalHook(GaussRound))) return OriginalHook(GaussRound); - if (ActionReady(OriginalHook(Ricochet))) + if (ActionReady(OriginalHook(Ricochet)) && !WasLastAction(OriginalHook(Ricochet))) return OriginalHook(Ricochet); } @@ -359,13 +359,13 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //gauss and ricochet outside HC if (IsEnabled(CustomComboPreset.MCH_ST_Adv_GaussRicochet) && - CanWeave(actionID) && !gauge.IsOverheated && !HasEffect(Buffs.Wildfire) && - ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability) + CanWeave(actionID) && !gauge.IsOverheated && + !HasEffect(Buffs.Wildfire) && !WasLastWeaponskill(OriginalHook(Heatblast))) { - if (ActionReady(OriginalHook(GaussRound))) + if (ActionReady(OriginalHook(GaussRound)) && !WasLastAction(OriginalHook(GaussRound))) return OriginalHook(GaussRound); - if (ActionReady(OriginalHook(Ricochet))) + if (ActionReady(OriginalHook(Ricochet)) && !WasLastAction(OriginalHook(Ricochet))) return OriginalHook(Ricochet); } @@ -544,13 +544,13 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return OriginalHook(AutoCrossbow); //gauss and ricochet outside HC - if (CanWeave(actionID) && !gauge.IsOverheated && !HasEffect(Buffs.Wildfire) && - ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability) + if (CanWeave(actionID) && !gauge.IsOverheated && + !HasEffect(Buffs.Wildfire) && !WasLastWeaponskill(OriginalHook(AutoCrossbow))) { - if (ActionReady(OriginalHook(GaussRound))) + if (ActionReady(OriginalHook(GaussRound)) && !WasLastAction(OriginalHook(GaussRound))) return OriginalHook(GaussRound); - if (ActionReady(OriginalHook(Ricochet))) + if (ActionReady(OriginalHook(Ricochet)) && !WasLastAction(OriginalHook(Ricochet))) return OriginalHook(Ricochet); } } @@ -660,13 +660,13 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //gauss and ricochet outside HC if (IsEnabled(CustomComboPreset.MCH_AoE_Adv_GaussRicochet) && - CanWeave(actionID) && !gauge.IsOverheated && !HasEffect(Buffs.Wildfire) && - ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability) + CanWeave(actionID) && !gauge.IsOverheated && + !HasEffect(Buffs.Wildfire) && !WasLastWeaponskill(OriginalHook(AutoCrossbow))) { - if (ActionReady(OriginalHook(GaussRound))) + if (ActionReady(OriginalHook(GaussRound)) && !WasLastAction(OriginalHook(GaussRound))) return OriginalHook(GaussRound); - if (ActionReady(OriginalHook(Ricochet))) + if (ActionReady(OriginalHook(Ricochet)) && !WasLastAction(OriginalHook(Ricochet))) return OriginalHook(Ricochet); } @@ -731,11 +731,13 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (actionID is GaussRound or Ricochet && CanWeave(actionID)) { - if (ActionReady(OriginalHook(GaussRound))) - return OriginalHook(GaussRound); + { + if (ActionReady(OriginalHook(GaussRound)) && GetRemainingCharges(OriginalHook(GaussRound)) >= GetRemainingCharges(OriginalHook(Ricochet))) + return OriginalHook(GaussRound); - if (ActionReady(OriginalHook(Ricochet))) - return OriginalHook(Ricochet); + if (ActionReady(OriginalHook(Ricochet)) && GetRemainingCharges(OriginalHook(Ricochet)) > GetRemainingCharges(OriginalHook(GaussRound))) + return OriginalHook(Ricochet); + } } return actionID; From 88b01d810be91e0ef0558c05842f6faf9b6cb7ff Mon Sep 17 00:00:00 2001 From: Kage Date: Tue, 9 Jul 2024 12:11:25 +0200 Subject: [PATCH 09/26] add flamethrower warning --- XIVSlothCombo/Combos/CustomComboPreset.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index bc76319c5..ad880b407 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -1667,7 +1667,7 @@ public enum CustomComboPreset MCH_AoE_Adv_Queen = 8304, [ParentCombo(MCH_AoE_AdvancedMode)] - [CustomComboInfo("Flamethrower Option", "Adds Flamethrower to the rotation.", MCH.JobID)] + [CustomComboInfo("Flamethrower Option", "Adds Flamethrower to the rotation.\n Changes to Savage blade when in use to prevent cancelling.", MCH.JobID)] MCH_AoE_Adv_FlameThrower = 8305, [ParentCombo(MCH_AoE_AdvancedMode)] From be9b9a56c5ea0d6350da50b4c961db1a119093ab Mon Sep 17 00:00:00 2001 From: Kage Date: Tue, 9 Jul 2024 12:27:08 +0200 Subject: [PATCH 10/26] make simple use balance opener - vpr add %hp slider WF - MCH --- XIVSlothCombo/Combos/JobHelpers/VPR.cs | 2 +- XIVSlothCombo/Combos/PvE/MCH.cs | 4 +++- XIVSlothCombo/Window/Functions/UserConfig.cs | 3 +++ 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/XIVSlothCombo/Combos/JobHelpers/VPR.cs b/XIVSlothCombo/Combos/JobHelpers/VPR.cs index a70efb420..4a152ba3e 100644 --- a/XIVSlothCombo/Combos/JobHelpers/VPR.cs +++ b/XIVSlothCombo/Combos/JobHelpers/VPR.cs @@ -212,7 +212,7 @@ public bool DoFullOpener(ref uint actionID, bool simpleMode) { if (simpleMode) { - if (DoOpener(StandardOpenerRearFirst, ref actionID)) + if (DoOpener(StandardOpenerFlankFirst, ref actionID)) return true; } else diff --git a/XIVSlothCombo/Combos/PvE/MCH.cs b/XIVSlothCombo/Combos/PvE/MCH.cs index 87b6a5d47..8e1c17565 100644 --- a/XIVSlothCombo/Combos/PvE/MCH.cs +++ b/XIVSlothCombo/Combos/PvE/MCH.cs @@ -80,6 +80,7 @@ public static UserInt MCH_AoE_TurretUsage = new("MCH_AoE_TurretUsage"), MCH_ST_ReassemblePool = new("MCH_ST_ReassemblePool", 0), MCH_AoE_ReassemblePool = new("MCH_AoE_ReassemblePool", 0), + MCH_ST_WildfireHP = new("MCH_ST_WildfireHP", 1), MCH_ST_QueenOverDrive = new("MCH_ST_QueenOverDrive"); public static UserBoolArray MCH_ST_Reassembled = new("MCH_ST_Reassembled"), @@ -312,7 +313,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim // Wildfire if (IsEnabled(CustomComboPreset.MCH_ST_Adv_WildFire) && - CanWeave(actionID) && ActionReady(Wildfire) && WasLastAction(Hypercharge)) + CanWeave(actionID) && ActionReady(Wildfire) && WasLastAction(Hypercharge) && + GetTargetHPPercent() >= Config.MCH_ST_WildfireHP) return Wildfire; // BarrelStabilizer use and Full metal field diff --git a/XIVSlothCombo/Window/Functions/UserConfig.cs b/XIVSlothCombo/Window/Functions/UserConfig.cs index 0b5b4aa41..c2c0b73e1 100644 --- a/XIVSlothCombo/Window/Functions/UserConfig.cs +++ b/XIVSlothCombo/Window/Functions/UserConfig.cs @@ -1638,6 +1638,9 @@ internal static void Draw(CustomComboPreset preset, bool enabled) if (preset == CustomComboPreset.MCH_ST_Adv_QueenOverdrive) UserConfig.DrawSliderInt(1, 10, MCH.Config.MCH_ST_QueenOverDrive, "HP% for the target to be at or under"); + if (preset == CustomComboPreset.MCH_ST_Adv_WildFire) + UserConfig.DrawSliderInt(0, 10, MCH.Config.MCH_ST_WildfireHP, "Stop Using When Target HP% is at or Below (Set to 0 to Disable This Check)"); + #endregion // ==================================================================================== #region MONK From f67a8f0b342f183438adeb2ec864e4d066cd65c3 Mon Sep 17 00:00:00 2001 From: Kage Date: Tue, 9 Jul 2024 13:14:57 +0200 Subject: [PATCH 11/26] make slide 15 instead of 10 --- XIVSlothCombo/Window/Functions/UserConfig.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XIVSlothCombo/Window/Functions/UserConfig.cs b/XIVSlothCombo/Window/Functions/UserConfig.cs index c2c0b73e1..ae5b09d0f 100644 --- a/XIVSlothCombo/Window/Functions/UserConfig.cs +++ b/XIVSlothCombo/Window/Functions/UserConfig.cs @@ -1639,7 +1639,7 @@ internal static void Draw(CustomComboPreset preset, bool enabled) UserConfig.DrawSliderInt(1, 10, MCH.Config.MCH_ST_QueenOverDrive, "HP% for the target to be at or under"); if (preset == CustomComboPreset.MCH_ST_Adv_WildFire) - UserConfig.DrawSliderInt(0, 10, MCH.Config.MCH_ST_WildfireHP, "Stop Using When Target HP% is at or Below (Set to 0 to Disable This Check)"); + UserConfig.DrawSliderInt(0, 15, MCH.Config.MCH_ST_WildfireHP, "Stop Using When Target HP% is at or Below (Set to 0 to Disable This Check)"); #endregion // ==================================================================================== From b7ced3cdd45ace7a7aa4338cad7d582b04432fd5 Mon Sep 17 00:00:00 2001 From: Kage Date: Tue, 9 Jul 2024 15:10:02 +0200 Subject: [PATCH 12/26] modifiy tooltip heatblast solo --- XIVSlothCombo/Combos/CustomComboPreset.cs | 6 +++--- XIVSlothCombo/Combos/PvE/MCH.cs | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index ad880b407..e579e5406 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -1724,15 +1724,15 @@ public enum CustomComboPreset MCH_HotShotDrillChainsaw = 8004, [ReplaceSkill(MCH.Heatblast)] - [CustomComboInfo("Single Button Heat Blast Feature", "Turns Heat Blast into Hypercharge when at or above 50 heat.", MCH.JobID)] + [CustomComboInfo("Single Button Heat Blast Feature", "Turns Heat Blast into Hypercharge \nwhen u have 50 or more heat or when u got Hypercharged buff.", MCH.JobID)] MCH_Heatblast = 8006, [ParentCombo(MCH_Heatblast)] - [CustomComboInfo("Barrel Option", "Adds Barrel Stabilizer to the feature when below 50 Heat Gauge.", MCH.JobID)] + [CustomComboInfo("Barrel Option", "Adds Barrel Stabilizer to the feature when off cooldown.", MCH.JobID)] MCH_Heatblast_AutoBarrel = 8052, [ParentCombo(MCH_Heatblast)] - [CustomComboInfo("Wildfire Option", "Adds Wildfire to the feature when at or above 50 heat.", MCH.JobID)] + [CustomComboInfo("Wildfire Option", "Adds Wildfire to the feature when off cooldown and overheated.", MCH.JobID)] MCH_Heatblast_Wildfire = 8015, [ParentCombo(MCH_Heatblast)] diff --git a/XIVSlothCombo/Combos/PvE/MCH.cs b/XIVSlothCombo/Combos/PvE/MCH.cs index 8e1c17565..bb6467254 100644 --- a/XIVSlothCombo/Combos/PvE/MCH.cs +++ b/XIVSlothCombo/Combos/PvE/MCH.cs @@ -700,10 +700,11 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsEnabled(CustomComboPreset.MCH_Heatblast_Wildfire) && ActionReady(Hypercharge) && ActionReady(Wildfire) && - (gauge.Heat >= 50 || HasEffect(Buffs.Hypercharged))) + WasLastAction(Hypercharge)) return Wildfire; - if (!gauge.IsOverheated && LevelChecked(Hypercharge) && (gauge.Heat >= 50 || HasEffect(Buffs.Hypercharged))) + if (!gauge.IsOverheated && LevelChecked(Hypercharge) && + (gauge.Heat >= 50 || HasEffect(Buffs.Hypercharged))) return Hypercharge; //Heatblast, Gauss, Rico From 999f9be6c5294bef9b72d23c814c41af67e5a30e Mon Sep 17 00:00:00 2001 From: Kage Date: Wed, 10 Jul 2024 01:08:15 +0200 Subject: [PATCH 13/26] some reassemble fixes --- XIVSlothCombo/Combos/PvE/MCH.cs | 100 ++++++++++++++------------------ 1 file changed, 45 insertions(+), 55 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/MCH.cs b/XIVSlothCombo/Combos/PvE/MCH.cs index bb6467254..3a9479967 100644 --- a/XIVSlothCombo/Combos/PvE/MCH.cs +++ b/XIVSlothCombo/Combos/PvE/MCH.cs @@ -123,10 +123,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (interruptReady) return All.HeadGraze; - if (gauge.IsRobotActive && GetTargetHPPercent() <= 5 && - CanWeave(actionID) && ActionReady(OriginalHook(RookOverdrive))) - return OriginalHook(RookOverdrive); - // Wildfire if (CanWeave(actionID) && ActionReady(Wildfire) && WasLastAction(Hypercharge)) return Wildfire; @@ -155,7 +151,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //Heatblast, Gauss, Rico if (CanWeave(actionID) && WasLastAction(OriginalHook(Heatblast)) && - ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability) + (ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability)) { if (ActionReady(OriginalHook(GaussRound)) && GetRemainingCharges(OriginalHook(GaussRound)) >= GetRemainingCharges(OriginalHook(Ricochet))) return OriginalHook(GaussRound); @@ -171,8 +167,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return actionID; //gauss and ricochet outside HC - if (CanWeave(actionID) && !gauge.IsOverheated && - !HasEffect(Buffs.Wildfire) && !WasLastWeaponskill(OriginalHook(Heatblast))) + if (CanWeave(actionID) && !gauge.IsOverheated && !WasLastWeaponskill(OriginalHook(Heatblast))) { if (ActionReady(OriginalHook(GaussRound)) && !WasLastAction(OriginalHook(GaussRound))) return OriginalHook(GaussRound); @@ -204,19 +199,26 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim private static bool ReassembledTools(ref uint actionID, MCHGauge gauge) { bool battery = Svc.Gauges.Get().Battery == 100; - // TOOLS!! Chainsaw Drill Air Anchor Excavator if (!gauge.IsOverheated && !ActionWatching.WasLast2ActionsAbilities() && - !HasEffect(Buffs.Reassembled) && ActionReady(Reassemble) && CanWeave(actionID) && - ((GetCooldownRemainingTime(AirAnchor) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) && LevelChecked(AirAnchor) && !battery) || - (GetCooldownRemainingTime(Drill) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) && LevelChecked(Drill) && !LevelChecked(AirAnchor)) || - (GetCooldownRemainingTime(Chainsaw) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) && LevelChecked(Chainsaw) && !LevelChecked(Excavator) && !battery) || - (HasEffect(Buffs.ExcavatorReady) && LevelChecked(Excavator) && !battery))) + !HasEffect(Buffs.Reassembled) && ActionReady(Reassemble) && (CanWeave(actionID) || !InCombat()) && + ((LevelChecked(AirAnchor) && ((GetCooldownRemainingTime(AirAnchor) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) + 0.25) || ActionReady(AirAnchor)) && !battery) || + (LevelChecked(Drill) && ((GetCooldownRemainingTime(Drill) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) + 0.25) || ActionReady(Drill)) && !LevelChecked(AirAnchor)) || + (LevelChecked(Chainsaw) && ((GetCooldownRemainingTime(Chainsaw) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) + 0.25) || ActionReady(Chainsaw)) && !LevelChecked(Excavator) && !battery) || + (LevelChecked(Excavator) && HasEffect(Buffs.ExcavatorReady) && !battery))) { actionID = Reassemble; return true; } + if (LevelChecked(OriginalHook(Chainsaw)) && + !battery && + HasEffect(Buffs.ExcavatorReady)) + { + actionID = OriginalHook(Chainsaw); + return true; + } + if (LevelChecked(Chainsaw) && !battery && ((GetCooldownRemainingTime(Chainsaw) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) + 0.25) || ActionReady(Chainsaw))) @@ -239,17 +241,8 @@ private static bool ReassembledTools(ref uint actionID, MCHGauge gauge) actionID = Drill; return true; } - - if (LevelChecked(OriginalHook(Chainsaw)) && - !battery && - HasEffect(Buffs.ExcavatorReady)) - { - actionID = OriginalHook(Chainsaw); - return true; - } return false; } - private static bool UseQueen(MCHGauge gauge) { if (CanWeave(OriginalHook(SplitShot)) && !gauge.IsOverheated && !HasEffect(Buffs.Wildfire) && @@ -343,7 +336,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //Heatblast, Gauss, Rico if (IsEnabled(CustomComboPreset.MCH_ST_Adv_GaussRicochet) && CanWeave(actionID) && WasLastAction(OriginalHook(Heatblast)) && - ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability) + (ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability)) { if (ActionReady(OriginalHook(GaussRound)) && GetRemainingCharges(OriginalHook(GaussRound)) >= GetRemainingCharges(OriginalHook(Ricochet))) return OriginalHook(GaussRound); @@ -361,8 +354,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //gauss and ricochet outside HC if (IsEnabled(CustomComboPreset.MCH_ST_Adv_GaussRicochet) && - CanWeave(actionID) && !gauge.IsOverheated && - !HasEffect(Buffs.Wildfire) && !WasLastWeaponskill(OriginalHook(Heatblast))) + CanWeave(actionID) && !gauge.IsOverheated && !WasLastWeaponskill(OriginalHook(Heatblast))) { if (ActionReady(OriginalHook(GaussRound)) && !WasLastAction(OriginalHook(GaussRound))) return OriginalHook(GaussRound); @@ -404,17 +396,27 @@ private static bool ReassembledTools(ref uint actionID, MCHGauge gauge) // TOOLS!! Chainsaw Drill Air Anchor Excavator if (IsEnabled(CustomComboPreset.MCH_ST_Adv_Reassemble) && !gauge.IsOverheated && !ActionWatching.WasLast2ActionsAbilities() && - !HasEffect(Buffs.Reassembled) && ActionReady(Reassemble) && CanWeave(actionID) && + !HasEffect(Buffs.Reassembled) && ActionReady(Reassemble) && (CanWeave(actionID) || !InCombat()) && GetRemainingCharges(Reassemble) > Config.MCH_ST_ReassemblePool && - ((GetCooldownRemainingTime(AirAnchor) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) && Config.MCH_ST_Reassembled[0] && LevelChecked(AirAnchor) && !battery) || - (GetCooldownRemainingTime(Drill) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) && Config.MCH_ST_Reassembled[1] && LevelChecked(Drill) && (!LevelChecked(AirAnchor) || !Config.MCH_ST_Reassembled[0])) || - (GetCooldownRemainingTime(Chainsaw) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) && Config.MCH_ST_Reassembled[2] && LevelChecked(Chainsaw) && (!LevelChecked(Excavator) || !Config.MCH_ST_Reassembled[3]) && !battery) || - (HasEffect(Buffs.ExcavatorReady) && Config.MCH_ST_Reassembled[3] && LevelChecked(Excavator) && !battery))) + ((Config.MCH_ST_Reassembled[0] && LevelChecked(AirAnchor) && ((GetCooldownRemainingTime(AirAnchor) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) + 0.25) || ActionReady(AirAnchor)) && !battery) || + (Config.MCH_ST_Reassembled[1] && LevelChecked(Drill) && ((GetCooldownRemainingTime(Drill) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) + 0.25) || ActionReady(Drill)) && (!LevelChecked(AirAnchor) || !Config.MCH_ST_Reassembled[0])) || + (Config.MCH_ST_Reassembled[2] && LevelChecked(Chainsaw) && ((GetCooldownRemainingTime(Chainsaw) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) + 0.25) || ActionReady(Chainsaw)) && (!LevelChecked(Excavator) || !Config.MCH_ST_Reassembled[3]) && !battery) || + (Config.MCH_ST_Reassembled[3] && LevelChecked(Excavator) && HasEffect(Buffs.ExcavatorReady) && !battery))) { actionID = Reassemble; return true; } + if (IsEnabled(CustomComboPreset.MCH_ST_Adv_Excavator) && + reassembledExcavator && + LevelChecked(OriginalHook(Chainsaw)) && + !battery && + HasEffect(Buffs.ExcavatorReady)) + { + actionID = OriginalHook(Chainsaw); + return true; + } + if (IsEnabled(CustomComboPreset.MCH_ST_Adv_Chainsaw) && reassembledChainsaw && LevelChecked(Chainsaw) && @@ -443,16 +445,6 @@ private static bool ReassembledTools(ref uint actionID, MCHGauge gauge) actionID = Drill; return true; } - - if (IsEnabled(CustomComboPreset.MCH_ST_Adv_Excavator) && - reassembledExcavator && - LevelChecked(OriginalHook(Chainsaw)) && - !battery && - HasEffect(Buffs.ExcavatorReady)) - { - actionID = OriginalHook(Chainsaw); - return true; - } return false; } @@ -533,7 +525,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //AutoCrossbow, Gauss, Rico if ((WasLastAction(SpreadShot) || WasLastAction(AutoCrossbow) || Config.MCH_AoE_Hypercharge) && CanWeave(actionID) && - ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability) + (ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability)) { if (LevelChecked(OriginalHook(GaussRound)) && GetRemainingCharges(OriginalHook(GaussRound)) >= GetRemainingCharges(OriginalHook(Ricochet))) return OriginalHook(GaussRound); @@ -644,17 +636,14 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //AutoCrossbow, Gauss, Rico if (IsEnabled(CustomComboPreset.MCH_AoE_Adv_GaussRicochet) && CanWeave(actionID) && (Config.MCH_AoE_Hypercharge || (!Config.MCH_AoE_Hypercharge && gauge.IsOverheated)) && - ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability) + (WasLastAction(SpreadShot) || WasLastAction(AutoCrossbow) || Config.MCH_AoE_Hypercharge) && + (ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability)) { - if ((WasLastAction(SpreadShot) || WasLastAction(AutoCrossbow) || Config.MCH_AoE_Hypercharge) && - ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability) - { - if (ActionReady(OriginalHook(GaussRound)) && GetRemainingCharges(OriginalHook(GaussRound)) >= GetRemainingCharges(OriginalHook(Ricochet))) - return OriginalHook(GaussRound); - - if (ActionReady(OriginalHook(Ricochet)) && GetRemainingCharges(OriginalHook(Ricochet)) > GetRemainingCharges(OriginalHook(GaussRound))) - return OriginalHook(Ricochet); - } + if (ActionReady(OriginalHook(GaussRound)) && GetRemainingCharges(OriginalHook(GaussRound)) >= GetRemainingCharges(OriginalHook(Ricochet))) + return OriginalHook(GaussRound); + + if (ActionReady(OriginalHook(Ricochet)) && GetRemainingCharges(OriginalHook(Ricochet)) > GetRemainingCharges(OriginalHook(GaussRound))) + return OriginalHook(Ricochet); } if (gauge.IsOverheated && AutoCrossbow.LevelChecked()) @@ -703,13 +692,14 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim WasLastAction(Hypercharge)) return Wildfire; - if (!gauge.IsOverheated && LevelChecked(Hypercharge) && + if (!gauge.IsOverheated && LevelChecked(Hypercharge) && (gauge.Heat >= 50 || HasEffect(Buffs.Hypercharged))) return Hypercharge; //Heatblast, Gauss, Rico - if (IsEnabled(CustomComboPreset.MCH_Heatblast_GaussRound) && CanWeave(actionID) && WasLastAction(OriginalHook(Heatblast)) && - ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability) + if (IsEnabled(CustomComboPreset.MCH_Heatblast_GaussRound) && + CanWeave(actionID) && WasLastAction(OriginalHook(Heatblast)) && + (ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability)) { if (ActionReady(OriginalHook(GaussRound)) && GetRemainingCharges(OriginalHook(GaussRound)) >= GetRemainingCharges(OriginalHook(Ricochet))) return OriginalHook(GaussRound); @@ -821,7 +811,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //Heatblast, Gauss, Rico if (IsEnabled(CustomComboPreset.MCH_AutoCrossbow_GaussRound) && CanWeave(actionID) && WasLastAction(OriginalHook(AutoCrossbow)) && - ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability) + (ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability)) { if (ActionReady(OriginalHook(GaussRound)) && GetRemainingCharges(OriginalHook(GaussRound)) >= GetRemainingCharges(OriginalHook(Ricochet))) return OriginalHook(GaussRound); From a78f3898dc82683ca4dc75574b3849ae2d804925 Mon Sep 17 00:00:00 2001 From: Kage Date: Wed, 10 Jul 2024 01:17:17 +0200 Subject: [PATCH 14/26] make gauss/rico always doubleweave on big hitters --- XIVSlothCombo/Combos/PvE/MCH.cs | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/MCH.cs b/XIVSlothCombo/Combos/PvE/MCH.cs index 3a9479967..25b372fd7 100644 --- a/XIVSlothCombo/Combos/PvE/MCH.cs +++ b/XIVSlothCombo/Combos/PvE/MCH.cs @@ -163,11 +163,9 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (gauge.IsOverheated && LevelChecked(OriginalHook(Heatblast))) return OriginalHook(Heatblast); - if (ReassembledTools(ref actionID, gauge)) - return actionID; - //gauss and ricochet outside HC - if (CanWeave(actionID) && !gauge.IsOverheated && !WasLastWeaponskill(OriginalHook(Heatblast))) + if (CanWeave(actionID) && !gauge.IsOverheated && + (WasLastWeaponskill(OriginalHook(AirAnchor)) || WasLastWeaponskill(OriginalHook(Chainsaw)) || WasLastWeaponskill(Drill))) { if (ActionReady(OriginalHook(GaussRound)) && !WasLastAction(OriginalHook(GaussRound))) return OriginalHook(GaussRound); @@ -176,6 +174,9 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return OriginalHook(Ricochet); } + if (ReassembledTools(ref actionID, gauge)) + return actionID; + //1-2-3 Combo if (comboTime > 0) { @@ -243,6 +244,7 @@ private static bool ReassembledTools(ref uint actionID, MCHGauge gauge) } return false; } + private static bool UseQueen(MCHGauge gauge) { if (CanWeave(OriginalHook(SplitShot)) && !gauge.IsOverheated && !HasEffect(Buffs.Wildfire) && @@ -335,7 +337,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } //Heatblast, Gauss, Rico - if (IsEnabled(CustomComboPreset.MCH_ST_Adv_GaussRicochet) && CanWeave(actionID) && WasLastAction(OriginalHook(Heatblast)) && + if (IsEnabled(CustomComboPreset.MCH_ST_Adv_GaussRicochet) && + CanWeave(actionID) && WasLastAction(OriginalHook(Heatblast)) && (ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability)) { if (ActionReady(OriginalHook(GaussRound)) && GetRemainingCharges(OriginalHook(GaussRound)) >= GetRemainingCharges(OriginalHook(Ricochet))) @@ -349,12 +352,10 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim gauge.IsOverheated && LevelChecked(OriginalHook(Heatblast))) return OriginalHook(Heatblast); - if (ReassembledTools(ref actionID, gauge)) - return actionID; - //gauss and ricochet outside HC if (IsEnabled(CustomComboPreset.MCH_ST_Adv_GaussRicochet) && - CanWeave(actionID) && !gauge.IsOverheated && !WasLastWeaponskill(OriginalHook(Heatblast))) + CanWeave(actionID) && !gauge.IsOverheated && + (WasLastWeaponskill(OriginalHook(AirAnchor)) || WasLastWeaponskill(OriginalHook(Chainsaw)) || WasLastWeaponskill(Drill))) { if (ActionReady(OriginalHook(GaussRound)) && !WasLastAction(OriginalHook(GaussRound))) return OriginalHook(GaussRound); @@ -363,6 +364,9 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return OriginalHook(Ricochet); } + if (ReassembledTools(ref actionID, gauge)) + return actionID; + // healing if (IsEnabled(CustomComboPreset.MCH_ST_Adv_SecondWind) && CanWeave(actionID) && PlayerHealthPercentageHp() <= Config.MCH_ST_SecondWindThreshold && ActionReady(All.SecondWind)) From f0ef3c65bfb67671463921acbf4a62b505b3186b Mon Sep 17 00:00:00 2001 From: Kage Date: Wed, 10 Jul 2024 11:23:37 +0200 Subject: [PATCH 15/26] latewewave interrupt potential 2 min double HC --- XIVSlothCombo/Combos/PvE/MCH.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/MCH.cs b/XIVSlothCombo/Combos/PvE/MCH.cs index 25b372fd7..520c573cf 100644 --- a/XIVSlothCombo/Combos/PvE/MCH.cs +++ b/XIVSlothCombo/Combos/PvE/MCH.cs @@ -97,7 +97,7 @@ internal class MCH_ST_SimpleMode : CustomCombo protected override uint Invoke(uint actionID, uint lastComboMove, float comboTime, byte level) { MCHGauge? gauge = GetJobGauge(); - bool interruptReady = ActionReady(All.HeadGraze) && CanInterruptEnemy(); + bool interruptReady = ActionReady(All.HeadGraze) && CanInterruptEnemy() && CanDelayedWeave(actionID); double heatblastRC = 1.5; bool drillCD = !ActionReady(Drill) || (ActionReady(Drill) && GetCooldownRemainingTime(Drill) > heatblastRC * 6); bool anchorCD = !ActionReady(OriginalHook(AirAnchor)) || (ActionReady(OriginalHook(AirAnchor)) && GetCooldownRemainingTime(OriginalHook(AirAnchor)) > heatblastRC * 6); @@ -145,7 +145,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim !LevelChecked(Wildfire)) return Hypercharge; - if (drillCD && anchorCD && sawCD) + if (drillCD && anchorCD && sawCD && + ((GetCooldownRemainingTime(Wildfire) > 15 && LevelChecked(Wildfire)) || !LevelChecked(Wildfire))) return Hypercharge; } @@ -273,7 +274,7 @@ internal class MCH_ST_AdvancedMode : CustomCombo protected override uint Invoke(uint actionID, uint lastComboMove, float comboTime, byte level) { MCHGauge? gauge = GetJobGauge(); - bool interruptReady = ActionReady(All.HeadGraze) && CanInterruptEnemy(); + bool interruptReady = ActionReady(All.HeadGraze) && CanInterruptEnemy() && CanDelayedWeave(actionID); double heatblastRC = 1.5; bool drillCD = !ActionReady(Drill) || (ActionReady(Drill) && GetCooldownRemainingTime(Drill) > heatblastRC * 6); bool anchorCD = !ActionReady(OriginalHook(AirAnchor)) || (ActionReady(OriginalHook(AirAnchor)) && GetCooldownRemainingTime(OriginalHook(AirAnchor)) > heatblastRC * 6); @@ -332,12 +333,13 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim !LevelChecked(Wildfire)) return Hypercharge; - if (drillCD && anchorCD && sawCD) + if (drillCD && anchorCD && sawCD && + ((GetCooldownRemainingTime(Wildfire) > 15 && LevelChecked(Wildfire)) || !LevelChecked(Wildfire))) return Hypercharge; } //Heatblast, Gauss, Rico - if (IsEnabled(CustomComboPreset.MCH_ST_Adv_GaussRicochet) && + if (IsEnabled(CustomComboPreset.MCH_ST_Adv_GaussRicochet) && CanWeave(actionID) && WasLastAction(OriginalHook(Heatblast)) && (ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability)) { From e26d18830597f6b7fb00681e2fb259e00937dfae Mon Sep 17 00:00:00 2001 From: Kage Date: Wed, 10 Jul 2024 14:07:22 +0200 Subject: [PATCH 16/26] add excavator to big hit feature --- XIVSlothCombo/Combos/CustomComboPreset.cs | 6 +++--- XIVSlothCombo/Combos/PvE/MCH.cs | 7 +++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index e579e5406..85afbf435 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -1719,9 +1719,9 @@ public enum CustomComboPreset [CustomComboInfo("Gauss Round / Ricochet \nDouble Check / Checkmate Feature", "Replace Gauss Round and Ricochet or Double Check and Checkmate with one or the other depending on which has more charges.", MCH.JobID)] MCH_GaussRoundRicochet = 8003, - [ReplaceSkill(MCH.Drill, MCH.AirAnchor, MCH.HotShot)] - [CustomComboInfo("Drill/Air Anchor (Hot Shot) Feature", "Replace Drill and Air Anchor (Hot Shot) with one or the other (or Chain Saw) depending on which is on cooldown.", MCH.JobID)] - MCH_HotShotDrillChainsaw = 8004, + [ReplaceSkill(MCH.Drill, MCH.AirAnchor, MCH.HotShot,MCH.Chainsaw)] + [CustomComboInfo("Big Hitter Feature", "Replace Hot Shot, Drill, Air Anchor, Chainsaw and Excavator depending on which is on cooldown.", MCH.JobID)] + MCH_HotShotDrillChainsawExcavator = 8004, [ReplaceSkill(MCH.Heatblast)] [CustomComboInfo("Single Button Heat Blast Feature", "Turns Heat Blast into Hypercharge \nwhen u have 50 or more heat or when u got Hypercharged buff.", MCH.JobID)] diff --git a/XIVSlothCombo/Combos/PvE/MCH.cs b/XIVSlothCombo/Combos/PvE/MCH.cs index 520c573cf..3025dfc89 100644 --- a/XIVSlothCombo/Combos/PvE/MCH.cs +++ b/XIVSlothCombo/Combos/PvE/MCH.cs @@ -759,14 +759,17 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } } - internal class MCH_HotShotDrillChainsaw : CustomCombo + internal class MCH_HotShotDrillChainsawExcavator : CustomCombo { - protected internal override CustomComboPreset Preset { get; } = CustomComboPreset.MCH_HotShotDrillChainsaw; + protected internal override CustomComboPreset Preset { get; } = CustomComboPreset.MCH_HotShotDrillChainsawExcavator; protected override uint Invoke(uint actionID, uint lastComboMove, float comboTime, byte level) { if (actionID is Drill || actionID is HotShot || actionID is AirAnchor || actionID is Chainsaw) { + if (LevelChecked(Excavator)) + return CalcBestAction(actionID, Excavator, Chainsaw, AirAnchor, Drill); + if (LevelChecked(Chainsaw)) return CalcBestAction(actionID, Chainsaw, AirAnchor, Drill); From e3222903bb241be28fc4543014ea9276ac9864bb Mon Sep 17 00:00:00 2001 From: Kage Date: Wed, 10 Jul 2024 14:30:17 +0200 Subject: [PATCH 17/26] forgot buff check for excavator --- XIVSlothCombo/Combos/PvE/MCH.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XIVSlothCombo/Combos/PvE/MCH.cs b/XIVSlothCombo/Combos/PvE/MCH.cs index 3025dfc89..e18bc7434 100644 --- a/XIVSlothCombo/Combos/PvE/MCH.cs +++ b/XIVSlothCombo/Combos/PvE/MCH.cs @@ -767,7 +767,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { if (actionID is Drill || actionID is HotShot || actionID is AirAnchor || actionID is Chainsaw) { - if (LevelChecked(Excavator)) + if (LevelChecked(Excavator) && HasEffect(Buffs.ExcavatorReady)) return CalcBestAction(actionID, Excavator, Chainsaw, AirAnchor, Drill); if (LevelChecked(Chainsaw)) From 042bd776cff6e2594cc3e1c7d9c1b94608a3d0ab Mon Sep 17 00:00:00 2001 From: Kage Date: Wed, 10 Jul 2024 22:12:37 +0200 Subject: [PATCH 18/26] potential queen fix --- XIVSlothCombo/Combos/PvE/MCH.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/MCH.cs b/XIVSlothCombo/Combos/PvE/MCH.cs index e18bc7434..e2e65dd3e 100644 --- a/XIVSlothCombo/Combos/PvE/MCH.cs +++ b/XIVSlothCombo/Combos/PvE/MCH.cs @@ -132,10 +132,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim (HasEffect(Buffs.FullMetalMachinist) && WasLastWeaponskill(Excavator)))) return OriginalHook(BarrelStabilizer); - //Queen - if (UseQueen(gauge)) - return OriginalHook(RookAutoturret); - if (CanWeave(actionID) && (gauge.Heat >= 50 || HasEffect(Buffs.Hypercharged)) && LevelChecked(Hypercharge) && !gauge.IsOverheated && !WasLastAction(BarrelStabilizer)) { @@ -150,6 +146,10 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return Hypercharge; } + //Queen + if (UseQueen(gauge)) + return OriginalHook(RookAutoturret); + //Heatblast, Gauss, Rico if (CanWeave(actionID) && WasLastAction(OriginalHook(Heatblast)) && (ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability)) @@ -319,10 +319,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim (IsEnabled(CustomComboPreset.MCH_ST_Adv_Stabilizer_FullMetalField) && HasEffect(Buffs.FullMetalMachinist) && WasLastWeaponskill(Excavator)))) return OriginalHook(BarrelStabilizer); - //Queen - if (UseQueen(gauge)) - return OriginalHook(RookAutoturret); - if (IsEnabled(CustomComboPreset.MCH_ST_Adv_Hypercharge) && CanWeave(actionID) && (gauge.Heat >= 50 || HasEffect(Buffs.Hypercharged)) && LevelChecked(Hypercharge) && !gauge.IsOverheated && !WasLastAction(BarrelStabilizer)) @@ -338,6 +334,10 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return Hypercharge; } + //Queen + if (UseQueen(gauge)) + return OriginalHook(RookAutoturret); + //Heatblast, Gauss, Rico if (IsEnabled(CustomComboPreset.MCH_ST_Adv_GaussRicochet) && CanWeave(actionID) && WasLastAction(OriginalHook(Heatblast)) && From 7684560849807ed113de50d50badf1f664c70973 Mon Sep 17 00:00:00 2001 From: Kage Date: Thu, 11 Jul 2024 13:21:49 +0200 Subject: [PATCH 19/26] some gcd changes --- XIVSlothCombo/Combos/PvE/MCH.cs | 9 +++++---- XIVSlothCombo/Combos/PvE/VPR.cs | 14 +++++++++----- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/MCH.cs b/XIVSlothCombo/Combos/PvE/MCH.cs index e2e65dd3e..3522df3a5 100644 --- a/XIVSlothCombo/Combos/PvE/MCH.cs +++ b/XIVSlothCombo/Combos/PvE/MCH.cs @@ -102,6 +102,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim bool drillCD = !ActionReady(Drill) || (ActionReady(Drill) && GetCooldownRemainingTime(Drill) > heatblastRC * 6); bool anchorCD = !ActionReady(OriginalHook(AirAnchor)) || (ActionReady(OriginalHook(AirAnchor)) && GetCooldownRemainingTime(OriginalHook(AirAnchor)) > heatblastRC * 6); bool sawCD = !ActionReady(Chainsaw) || (ActionReady(Chainsaw) && GetCooldownRemainingTime(Chainsaw) > heatblastRC * 6); + float GCD = GetCooldown(OriginalHook(SplitShot)).CooldownTotal; if (actionID is SplitShot or HeatedSplitShot) { @@ -142,7 +143,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return Hypercharge; if (drillCD && anchorCD && sawCD && - ((GetCooldownRemainingTime(Wildfire) > 15 && LevelChecked(Wildfire)) || !LevelChecked(Wildfire))) + ((GetCooldownRemainingTime(Wildfire) > GCD * 5 && LevelChecked(Wildfire)) || !LevelChecked(Wildfire))) return Hypercharge; } @@ -279,6 +280,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim bool drillCD = !ActionReady(Drill) || (ActionReady(Drill) && GetCooldownRemainingTime(Drill) > heatblastRC * 6); bool anchorCD = !ActionReady(OriginalHook(AirAnchor)) || (ActionReady(OriginalHook(AirAnchor)) && GetCooldownRemainingTime(OriginalHook(AirAnchor)) > heatblastRC * 6); bool sawCD = !ActionReady(Chainsaw) || (ActionReady(Chainsaw) && GetCooldownRemainingTime(Chainsaw) > heatblastRC * 6); + float GCD = GetCooldown(OriginalHook(SplitShot)).CooldownTotal; if (actionID is SplitShot or HeatedSplitShot) { @@ -330,7 +332,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return Hypercharge; if (drillCD && anchorCD && sawCD && - ((GetCooldownRemainingTime(Wildfire) > 15 && LevelChecked(Wildfire)) || !LevelChecked(Wildfire))) + ((GetCooldownRemainingTime(Wildfire) > GCD * 5 && LevelChecked(Wildfire)) || !LevelChecked(Wildfire))) return Hypercharge; } @@ -485,7 +487,7 @@ internal class MCH_AoE_SimpleMode : CustomCombo protected internal override CustomComboPreset Preset { get; } = CustomComboPreset.MCH_AoE_SimpleMode; protected override uint Invoke(uint actionID, uint lastComboMove, float comboTime, byte level) - { + { if (actionID is SpreadShot) { MCHGauge? gauge = GetJobGauge(); @@ -673,7 +675,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return All.SecondWind; } } - return actionID; } } diff --git a/XIVSlothCombo/Combos/PvE/VPR.cs b/XIVSlothCombo/Combos/PvE/VPR.cs index d8c509412..044d52c34 100644 --- a/XIVSlothCombo/Combos/PvE/VPR.cs +++ b/XIVSlothCombo/Combos/PvE/VPR.cs @@ -122,6 +122,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim bool DreadwinderReady = gauge.DreadCombo == DreadCombo.Dreadwinder; bool HuntersCoilReady = gauge.DreadCombo == DreadCombo.HuntersCoil; bool SwiftskinsCoilReady = gauge.DreadCombo == DreadCombo.SwiftskinsCoil; + float GCD = GetCooldown(DreadFangs).CooldownTotal; if (actionID is SteelFangs) { @@ -273,7 +274,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //Reawakend Usage if ((HasEffect(Buffs.ReadyToReawaken) || gauge.SerpentOffering >= 50) && - GetCooldownRemainingTime(SerpentsIre) >= 30 && + GetCooldownRemainingTime(SerpentsIre) > GCD * 10 && HasEffect(Buffs.Swiftscaled) && HasEffect(Buffs.HuntersInstinct) && TargetHasEffect(Debuffs.NoxiousGnash) && @@ -315,6 +316,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim bool DreadwinderReady = gauge.DreadCombo == DreadCombo.Dreadwinder; bool HuntersCoilReady = gauge.DreadCombo == DreadCombo.HuntersCoil; bool SwiftskinsCoilReady = gauge.DreadCombo == DreadCombo.SwiftskinsCoil; + float GCD = GetCooldown(DreadFangs).CooldownTotal; if (actionID is SteelFangs) { @@ -527,7 +529,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //Reawakend Usage if (IsEnabled(CustomComboPreset.VPR_ST_Reawaken) && (HasEffect(Buffs.ReadyToReawaken) || gauge.SerpentOffering >= 50) && - GetCooldownRemainingTime(SerpentsIre) >= 30 && + GetCooldownRemainingTime(SerpentsIre) > GCD * 10 && HasEffect(Buffs.Swiftscaled) && HasEffect(Buffs.HuntersInstinct) && TargetHasEffect(Debuffs.NoxiousGnash) && @@ -539,7 +541,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //Dreadwinder Usage if (IsEnabled(CustomComboPreset.VPR_ST_CDs) && IsEnabled(CustomComboPreset.VPR_ST_Dreadwinder) && - ((LevelChecked(Dreadwinder) && GetCooldownRemainingTime(Dreadwinder) <= GetCooldownRemainingTime(OriginalHook(DreadFangs)) + 0.25) || ActionReady(Dreadwinder))) + LevelChecked(Dreadwinder) && ((GetCooldownRemainingTime(Dreadwinder) <= GetCooldownRemainingTime(OriginalHook(DreadFangs)) + 0.25) || ActionReady(Dreadwinder))) return Dreadwinder; } @@ -569,6 +571,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim bool PitOfDreadReady = gauge.DreadCombo == DreadCombo.PitOfDread; bool SwiftskinsDenReady = gauge.DreadCombo == DreadCombo.SwiftskinsDen; bool HuntersDenReady = gauge.DreadCombo == DreadCombo.HuntersDen; + float GCD = GetCooldown(DreadMaw).CooldownTotal; if (actionID is SteelMaw) { @@ -684,7 +687,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //Reawakend Usage if ((HasEffect(Buffs.ReadyToReawaken) || gauge.SerpentOffering >= 50) && - GetCooldownRemainingTime(SerpentsIre) >= 30 && + GetCooldownRemainingTime(SerpentsIre) > GCD * 10 && HasEffect(Buffs.Swiftscaled) && HasEffect(Buffs.HuntersInstinct) && TargetHasEffect(Debuffs.NoxiousGnash) && @@ -721,6 +724,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim bool PitOfDreadReady = gauge.DreadCombo == DreadCombo.PitOfDread; bool SwiftskinsDenReady = gauge.DreadCombo == DreadCombo.SwiftskinsDen; bool HuntersDenReady = gauge.DreadCombo == DreadCombo.HuntersDen; + float GCD = GetCooldown(DreadMaw).CooldownTotal; if (actionID is SteelMaw) { @@ -862,7 +866,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //Reawakend Usage if (IsEnabled(CustomComboPreset.VPR_AoE_Reawaken) && (HasEffect(Buffs.ReadyToReawaken) || gauge.SerpentOffering >= 50) && - GetCooldownRemainingTime(SerpentsIre) >= 30 && + GetCooldownRemainingTime(SerpentsIre) > GCD * 10 && HasEffect(Buffs.Swiftscaled) && HasEffect(Buffs.HuntersInstinct) && TargetHasEffect(Debuffs.NoxiousGnash) && From b07a2f7d93a645ff358ac9c00c5d5b56c36b6279 Mon Sep 17 00:00:00 2001 From: Kage Date: Thu, 11 Jul 2024 13:57:09 +0200 Subject: [PATCH 20/26] potential hunt fix vpr --- XIVSlothCombo/Combos/JobHelpers/VPR.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/XIVSlothCombo/Combos/JobHelpers/VPR.cs b/XIVSlothCombo/Combos/JobHelpers/VPR.cs index 4a152ba3e..86aab2271 100644 --- a/XIVSlothCombo/Combos/JobHelpers/VPR.cs +++ b/XIVSlothCombo/Combos/JobHelpers/VPR.cs @@ -184,7 +184,10 @@ private bool DoOpener(uint[] OpenerActions, ref uint actionID) CurrentState = OpenerState.FailedOpener; if (((actionID == SerpentsIre && CustomComboFunctions.IsOnCooldown(SerpentsIre)) || - (actionID == Dreadwinder && CustomComboFunctions.GetRemainingCharges(Dreadwinder) < 2)) && ActionWatching.TimeSinceLastAction.TotalSeconds >= 3) + (actionID == Dreadwinder && CustomComboFunctions.GetRemainingCharges(Dreadwinder) < 2) || + ((actionID is FirstGeneration or SecondGeneration or ThirdGeneration or FourthGeneration) && !CustomComboFunctions.HasEffect(Buffs.Reawakened)) || + ((actionID is FirstLegacy or SecondLegacy or ThirdLegacy or FourthLegacy) && !CustomComboFunctions.HasEffect(Buffs.Reawakened))) && + ActionWatching.TimeSinceLastAction.TotalSeconds >= 3) { CurrentState = OpenerState.FailedOpener; return false; @@ -212,7 +215,7 @@ public bool DoFullOpener(ref uint actionID, bool simpleMode) { if (simpleMode) { - if (DoOpener(StandardOpenerFlankFirst, ref actionID)) + if (DoOpener(StandardOpenerRearFirst, ref actionID)) return true; } else From 7c22ebc23ab6ad6c2fb6b27a3cbd81b830aa85f5 Mon Sep 17 00:00:00 2001 From: Kage Date: Thu, 11 Jul 2024 15:26:56 +0200 Subject: [PATCH 21/26] swap actions to weaponskills add better opener --- XIVSlothCombo/Combos/CustomComboPreset.cs | 2 +- XIVSlothCombo/Combos/JobHelpers/VPR.cs | 241 +++++++++++----------- XIVSlothCombo/Combos/PvE/VPR.cs | 40 ++-- 3 files changed, 144 insertions(+), 139 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index a392e5c60..47a75e10d 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -3563,7 +3563,7 @@ The three digets after RDM.JobID can be used to reorder items in the list VPR_ST_AdvancedMode = 30001, [ParentCombo(VPR_ST_AdvancedMode)] - [CustomComboInfo("Level 100 Opener", "Adds the Balance opener to the rotation.", VPR.JobID)] + [CustomComboInfo("Level 100 Opener", "Adds the Balance opener to the rotation.\n Does not check positional choice.\n Always does Hunter's Coil first ( FLANK )", VPR.JobID)] VPR_ST_Opener = 30002, [ParentCombo(VPR_ST_AdvancedMode)] diff --git a/XIVSlothCombo/Combos/JobHelpers/VPR.cs b/XIVSlothCombo/Combos/JobHelpers/VPR.cs index 86aab2271..f64df9efa 100644 --- a/XIVSlothCombo/Combos/JobHelpers/VPR.cs +++ b/XIVSlothCombo/Combos/JobHelpers/VPR.cs @@ -25,84 +25,6 @@ private static bool HasCooldowns() public uint OpenerStep = 0; - private static readonly uint[] StandardOpenerFlankFirst = [ - SerpentsIre, - SwiftskinsSting, - Dreadwinder, - HuntersCoil, - TwinfangBite, - TwinbloodBite, - SwiftskinsCoil, - TwinbloodBite, - TwinfangBite, - Reawaken, - FirstGeneration, - FirstLegacy, - SecondGeneration, - SecondLegacy, - ThirdGeneration, - ThirdLegacy, - FourthGeneration, - FourthLegacy, - Ouroboros, - UncoiledFury, - UncoiledTwinfang, - UncoiledTwinblood, - UncoiledFury, - UncoiledTwinfang, - UncoiledTwinblood, - HindstingStrike, - DeathRattle, - Dreadwinder, - UncoiledFury, - UncoiledTwinfang, - UncoiledTwinblood, - HuntersCoil, - TwinfangBite, - TwinbloodBite, - SwiftskinsCoil, - TwinbloodBite, - TwinfangBite]; - - private static readonly uint[] StandardOpenerRearFirst = [ - SerpentsIre, - SwiftskinsSting, - Dreadwinder, - SwiftskinsCoil, - TwinbloodBite, - TwinfangBite, - HuntersCoil, - TwinfangBite, - TwinbloodBite, - Reawaken, - FirstGeneration, - FirstLegacy, - SecondGeneration, - SecondLegacy, - ThirdGeneration, - ThirdLegacy, - FourthGeneration, - FourthLegacy, - Ouroboros, - UncoiledFury, - UncoiledTwinfang, - UncoiledTwinblood, - UncoiledFury, - UncoiledTwinfang, - UncoiledTwinblood, - HindstingStrike, - DeathRattle, - Dreadwinder, - UncoiledFury, - UncoiledTwinfang, - UncoiledTwinblood, - SwiftskinsCoil, - TwinbloodBite, - TwinfangBite, - HuntersCoil, - TwinfangBite, - TwinbloodBite]; - public static bool LevelChecked => CustomComboFunctions.LocalPlayer.Level >= OpenerLevel; private static bool CanOpener => HasCooldowns() && LevelChecked; @@ -123,7 +45,7 @@ public OpenerState CurrentState { Svc.Log.Debug($"Entered PrePull Opener"); } - if (value == OpenerState.InOpener) OpenerStep = 0; + if (value == OpenerState.InOpener) OpenerStep = 1; if (value == OpenerState.OpenerFinished || value == OpenerState.FailedOpener) { if (value == OpenerState.FailedOpener) @@ -140,18 +62,20 @@ public OpenerState CurrentState private bool DoPrePullSteps(ref uint actionID) { - if (!LevelChecked) - return false; + if (!LevelChecked) return false; if (CanOpener && PrePullStep == 0) + { PrePullStep = 1; + } if (!HasCooldowns()) + { PrePullStep = 0; + } if (CurrentState == OpenerState.PrePull && PrePullStep > 0) { - if (CustomComboFunctions.WasLastAction(DreadFangs) && PrePullStep == 1) CurrentState = OpenerState.InOpener; else if (PrePullStep == 1) actionID = DreadFangs; @@ -160,35 +84,133 @@ private bool DoPrePullSteps(ref uint actionID) return true; } - PrePullStep = 0; return false; } - private bool DoOpener(uint[] OpenerActions, ref uint actionID) + private bool DoOpener(ref uint actionID) { - if (!LevelChecked) - return false; + if (!LevelChecked) return false; if (currentState == OpenerState.InOpener) { - if (CustomComboFunctions.WasLastAction(OpenerActions[OpenerStep])) - OpenerStep++; + if (CustomComboFunctions.WasLastAction(SerpentsIre) && OpenerStep == 1) OpenerStep++; + else if (OpenerStep == 1) actionID = SerpentsIre; + + if (CustomComboFunctions.WasLastAction(SwiftskinsSting) && OpenerStep == 2) OpenerStep++; + else if (OpenerStep == 2) actionID = SwiftskinsSting; + + if (CustomComboFunctions.WasLastAction(Dreadwinder) && OpenerStep == 3) OpenerStep++; + else if (OpenerStep == 3) actionID = Dreadwinder; + + if (CustomComboFunctions.WasLastAction(HuntersCoil) && OpenerStep == 4) OpenerStep++; + else if (OpenerStep == 4) actionID = HuntersCoil; + + if (CustomComboFunctions.WasLastAction(TwinfangBite) && OpenerStep == 5) OpenerStep++; + else if (OpenerStep == 5) actionID = TwinfangBite; + + if (CustomComboFunctions.WasLastAction(TwinbloodBite) && OpenerStep == 6) OpenerStep++; + else if (OpenerStep == 6) actionID = TwinbloodBite; + + if (CustomComboFunctions.WasLastAction(SwiftskinsCoil) && OpenerStep == 7) OpenerStep++; + else if (OpenerStep == 7) actionID = SwiftskinsCoil; + + if (CustomComboFunctions.WasLastAction(TwinbloodBite) && OpenerStep == 8) OpenerStep++; + else if (OpenerStep == 8) actionID = TwinbloodBite; + + if (CustomComboFunctions.WasLastAction(TwinfangBite) && OpenerStep == 9) OpenerStep++; + else if (OpenerStep == 9) actionID = TwinfangBite; + + if (CustomComboFunctions.WasLastAction(Reawaken) && OpenerStep == 10) OpenerStep++; + else if (OpenerStep == 10) actionID = Reawaken; + + if (CustomComboFunctions.WasLastAction(FirstGeneration) && OpenerStep == 11) OpenerStep++; + else if (OpenerStep == 11) actionID = FirstGeneration; + + if (CustomComboFunctions.WasLastAction(FirstLegacy) && OpenerStep == 12) OpenerStep++; + else if (OpenerStep == 12) actionID = FirstLegacy; + + if (CustomComboFunctions.WasLastAction(SecondGeneration) && OpenerStep == 13) OpenerStep++; + else if (OpenerStep == 13) actionID = SecondGeneration; + + if (CustomComboFunctions.WasLastAction(SecondLegacy) && OpenerStep == 14) OpenerStep++; + else if (OpenerStep == 14) actionID = SecondLegacy; + + if (CustomComboFunctions.WasLastAction(ThirdGeneration) && OpenerStep == 15) OpenerStep++; + else if (OpenerStep == 15) actionID = ThirdGeneration; + + if (CustomComboFunctions.WasLastAction(ThirdLegacy) && OpenerStep == 16) OpenerStep++; + else if (OpenerStep == 16) actionID = ThirdLegacy; + + if (CustomComboFunctions.WasLastAction(FourthGeneration) && OpenerStep == 17) OpenerStep++; + else if (OpenerStep == 17) actionID = FourthGeneration; + + if (CustomComboFunctions.WasLastAction(FourthLegacy) && OpenerStep == 18) OpenerStep++; + else if (OpenerStep == 18) actionID = FourthLegacy; + + if (CustomComboFunctions.WasLastAction(Ouroboros) && OpenerStep == 19) OpenerStep++; + else if (OpenerStep == 19) actionID = Ouroboros; - if (OpenerStep == OpenerActions.Length) - CurrentState = OpenerState.OpenerFinished; + if (CustomComboFunctions.WasLastAction(UncoiledFury) && OpenerStep == 20) OpenerStep++; + else if (OpenerStep == 20) actionID = UncoiledFury; - else actionID = OpenerActions[OpenerStep]; + if (CustomComboFunctions.WasLastAction(UncoiledTwinfang) && OpenerStep == 21) OpenerStep++; + else if (OpenerStep == 21) actionID = UncoiledTwinfang; - if (CustomComboFunctions.InCombat() && ActionWatching.TimeSinceLastAction.TotalSeconds >= 5) + if (CustomComboFunctions.WasLastAction(UncoiledTwinblood) && OpenerStep == 22) OpenerStep++; + else if (OpenerStep == 22) actionID = UncoiledTwinblood; + + if (CustomComboFunctions.WasLastAction(UncoiledFury) && OpenerStep == 23) OpenerStep++; + else if (OpenerStep == 23) actionID = UncoiledFury; + + if (CustomComboFunctions.WasLastAction(UncoiledTwinfang) && OpenerStep == 24) OpenerStep++; + else if (OpenerStep == 24) actionID = UncoiledTwinfang; + + if (CustomComboFunctions.WasLastAction(UncoiledTwinblood) && OpenerStep == 25) OpenerStep++; + else if (OpenerStep == 25) actionID = UncoiledTwinblood; + + if (CustomComboFunctions.WasLastAction(HindstingStrike) && OpenerStep == 26) OpenerStep++; + else if (OpenerStep == 26) actionID = HindstingStrike; + + if (CustomComboFunctions.WasLastAction(DeathRattle) && OpenerStep == 27) OpenerStep++; + else if (OpenerStep == 27) actionID = DeathRattle; + + if (CustomComboFunctions.WasLastAction(Dreadwinder) && OpenerStep == 28) OpenerStep++; + else if (OpenerStep == 28) actionID = Dreadwinder; + + if (CustomComboFunctions.WasLastAction(UncoiledFury) && OpenerStep == 29) OpenerStep++; + else if (OpenerStep == 29) actionID = UncoiledFury; + + if (CustomComboFunctions.WasLastAction(UncoiledTwinfang) && OpenerStep == 30) OpenerStep++; + else if (OpenerStep == 30) actionID = UncoiledTwinfang; + + if (CustomComboFunctions.WasLastAction(UncoiledTwinblood) && OpenerStep == 31) OpenerStep++; + else if (OpenerStep == 31) actionID = UncoiledTwinblood; + + if (CustomComboFunctions.WasLastAction(HuntersCoil) && OpenerStep == 32) OpenerStep++; + else if (OpenerStep == 32) actionID = HuntersCoil; + + if (CustomComboFunctions.WasLastAction(TwinfangBite) && OpenerStep == 33) OpenerStep++; + else if (OpenerStep == 33) actionID = TwinfangBite; + + if (CustomComboFunctions.WasLastAction(TwinbloodBite) && OpenerStep == 34) OpenerStep++; + else if (OpenerStep == 34) actionID = TwinbloodBite; + + if (CustomComboFunctions.WasLastAction(SwiftskinsCoil) && OpenerStep == 35) OpenerStep++; + else if (OpenerStep == 35) actionID = SwiftskinsCoil; + + if (CustomComboFunctions.WasLastAction(TwinbloodBite) && OpenerStep == 36) OpenerStep++; + else if (OpenerStep == 36) actionID = TwinbloodBite; + + if (CustomComboFunctions.WasLastAction(TwinfangBite) && OpenerStep == 37) CurrentState = OpenerState.OpenerFinished; + else if (OpenerStep == 37) actionID = TwinfangBite; + + if (ActionWatching.TimeSinceLastAction.TotalSeconds >= 5) CurrentState = OpenerState.FailedOpener; if (((actionID == SerpentsIre && CustomComboFunctions.IsOnCooldown(SerpentsIre)) || - (actionID == Dreadwinder && CustomComboFunctions.GetRemainingCharges(Dreadwinder) < 2) || - ((actionID is FirstGeneration or SecondGeneration or ThirdGeneration or FourthGeneration) && !CustomComboFunctions.HasEffect(Buffs.Reawakened)) || - ((actionID is FirstLegacy or SecondLegacy or ThirdLegacy or FourthLegacy) && !CustomComboFunctions.HasEffect(Buffs.Reawakened))) && - ActionWatching.TimeSinceLastAction.TotalSeconds >= 3) - { + (actionID == Dreadwinder && CustomComboFunctions.GetRemainingCharges(Dreadwinder) < 2)) && ActionWatching.TimeSinceLastAction.TotalSeconds >= 3) + { CurrentState = OpenerState.FailedOpener; return false; } @@ -203,7 +225,7 @@ private void ResetOpener() OpenerStep = 0; } - public bool DoFullOpener(ref uint actionID, bool simpleMode) + public bool DoFullOpener(ref uint actionID) { if (!LevelChecked) return false; @@ -213,25 +235,8 @@ public bool DoFullOpener(ref uint actionID, bool simpleMode) if (CurrentState == OpenerState.InOpener) { - if (simpleMode) - { - if (DoOpener(StandardOpenerRearFirst, ref actionID)) - return true; - } - else - { - if (Config.VPR_Positional == 0) - { - if (DoOpener(StandardOpenerRearFirst, ref actionID)) - return true; - } - - if (Config.VPR_Positional == 1) - { - if (DoOpener(StandardOpenerFlankFirst, ref actionID)) - return true; - } - } + if (DoOpener(ref actionID)) + return true; } if (!CustomComboFunctions.InCombat()) @@ -239,10 +244,10 @@ public bool DoFullOpener(ref uint actionID, bool simpleMode) ResetOpener(); CurrentState = OpenerState.PrePull; } - return false; } } + internal static class VPRHelpers { public static bool HasRattlingCoilStack(this VPRGauge gauge) => gauge.RattlingCoilStacks > 0; diff --git a/XIVSlothCombo/Combos/PvE/VPR.cs b/XIVSlothCombo/Combos/PvE/VPR.cs index 044d52c34..19ff6ad22 100644 --- a/XIVSlothCombo/Combos/PvE/VPR.cs +++ b/XIVSlothCombo/Combos/PvE/VPR.cs @@ -127,7 +127,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (actionID is SteelFangs) { // Opener for VPR - if (VPROpener.DoFullOpener(ref actionID, true)) + if (VPROpener.DoFullOpener(ref actionID)) return actionID; // Uncoiled combo @@ -177,8 +177,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { //Legacy weaves if (TraitLevelChecked(Traits.SerpentsLegacy) && CanWeave(actionID) && - (WasLastAction(OriginalHook(SteelFangs)) || WasLastAction(OriginalHook(DreadFangs)) || - WasLastAction(OriginalHook(HuntersCoil)) || WasLastAction(OriginalHook(SwiftskinsCoil)))) + (WasLastWeaponskill(OriginalHook(SteelFangs)) || WasLastWeaponskill(OriginalHook(DreadFangs)) || + WasLastWeaponskill(OriginalHook(HuntersCoil)) || WasLastWeaponskill(OriginalHook(SwiftskinsCoil)))) return OriginalHook(SerpentsTail); if (gauge.AnguineTribute is 5) @@ -268,8 +268,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (lastComboMove is HindstingStrike or HindsbaneFang or FlankstingStrike or FlanksbaneFang) { if (CanWeave(actionID) && LevelChecked(SerpentsTail) && - (WasLastAction(HindstingStrike) || WasLastAction(HindsbaneFang) || - WasLastAction(FlankstingStrike) || WasLastAction(FlanksbaneFang))) + (WasLastWeaponskill(HindstingStrike) || WasLastWeaponskill(HindsbaneFang) || + WasLastWeaponskill(FlankstingStrike) || WasLastWeaponskill(FlanksbaneFang))) return OriginalHook(SerpentsTail); //Reawakend Usage @@ -323,7 +323,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim // Opener for VPR if (IsEnabled(CustomComboPreset.VPR_ST_Opener)) { - if (VPROpener.DoFullOpener(ref actionID, false)) + if (VPROpener.DoFullOpener(ref actionID)) return actionID; } @@ -382,8 +382,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { //Legacy weaves if (TraitLevelChecked(Traits.SerpentsLegacy) && CanWeave(actionID) && - (WasLastAction(OriginalHook(SteelFangs)) || WasLastAction(OriginalHook(DreadFangs)) || - WasLastAction(OriginalHook(HuntersCoil)) || WasLastAction(OriginalHook(SwiftskinsCoil)))) + (WasLastWeaponskill(OriginalHook(SteelFangs)) || WasLastWeaponskill(OriginalHook(DreadFangs)) || + WasLastWeaponskill(OriginalHook(HuntersCoil)) || WasLastWeaponskill(OriginalHook(SwiftskinsCoil)))) return OriginalHook(SerpentsTail); if (gauge.AnguineTribute is 5) @@ -522,8 +522,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { if (IsEnabled(CustomComboPreset.VPR_ST_SerpentsTail) && CanWeave(actionID) && LevelChecked(SerpentsTail) && - (WasLastAction(HindstingStrike) || WasLastAction(HindsbaneFang) || - WasLastAction(FlankstingStrike) || WasLastAction(FlanksbaneFang))) + (WasLastWeaponskill(HindstingStrike) || WasLastWeaponskill(HindsbaneFang) || + WasLastWeaponskill(FlankstingStrike) || WasLastWeaponskill(FlanksbaneFang))) return OriginalHook(SerpentsTail); //Reawakend Usage @@ -617,8 +617,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { //Legacy weaves if (TraitLevelChecked(Traits.SerpentsLegacy) && CanWeave(actionID) && - (WasLastAction(OriginalHook(SteelMaw)) || WasLastAction(OriginalHook(DreadMaw)) || - WasLastAction(OriginalHook(HuntersDen)) || WasLastAction(OriginalHook(SwiftskinsDen)))) + (WasLastWeaponskill(OriginalHook(SteelMaw)) || WasLastWeaponskill(OriginalHook(DreadMaw)) || + WasLastWeaponskill(OriginalHook(HuntersDen)) || WasLastWeaponskill(OriginalHook(SwiftskinsDen)))) return OriginalHook(SerpentsTail); if (gauge.AnguineTribute is 5) @@ -682,7 +682,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (lastComboMove is BloodiedMaw or JaggedMaw) { if (CanWeave(actionID) && LevelChecked(SerpentsTail) && - (WasLastAction(BloodiedMaw) || WasLastAction(JaggedMaw))) + (WasLastWeaponskill(BloodiedMaw) || WasLastWeaponskill(JaggedMaw))) return OriginalHook(SerpentsTail); //Reawakend Usage @@ -777,8 +777,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { //Legacy weaves if (TraitLevelChecked(Traits.SerpentsLegacy) && CanWeave(actionID) && - (WasLastAction(OriginalHook(SteelMaw)) || WasLastAction(OriginalHook(DreadMaw)) || - WasLastAction(OriginalHook(HuntersDen)) || WasLastAction(OriginalHook(SwiftskinsDen)))) + (WasLastWeaponskill(OriginalHook(SteelMaw)) || WasLastWeaponskill(OriginalHook(DreadMaw)) || + WasLastWeaponskill(OriginalHook(HuntersDen)) || WasLastWeaponskill(OriginalHook(SwiftskinsDen)))) return OriginalHook(SerpentsTail); if (gauge.AnguineTribute is 5) @@ -860,7 +860,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { if (IsEnabled(CustomComboPreset.VPR_AoE_SerpentsTail) && CanWeave(actionID) && LevelChecked(SerpentsTail) && - (WasLastAction(BloodiedMaw) || WasLastAction(JaggedMaw))) + (WasLastWeaponskill(BloodiedMaw) || WasLastWeaponskill(JaggedMaw))) return OriginalHook(SerpentsTail); //Reawakend Usage @@ -1025,8 +1025,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsEnabled(CustomComboPreset.VPR_ReawakenLegacyWeaves)) { if (TraitLevelChecked(Traits.SerpentsLegacy) && CanWeave(actionID) && - (WasLastAction(OriginalHook(SteelFangs)) || WasLastAction(OriginalHook(DreadFangs)) || - WasLastAction(OriginalHook(HuntersCoil)) || WasLastAction(OriginalHook(SwiftskinsCoil)))) + (WasLastWeaponskill(OriginalHook(SteelFangs)) || WasLastWeaponskill(OriginalHook(DreadFangs)) || + WasLastWeaponskill(OriginalHook(HuntersCoil)) || WasLastWeaponskill(OriginalHook(SwiftskinsCoil)))) return OriginalHook(SerpentsTail); } @@ -1060,8 +1060,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (actionID is SerpentsTail) { if (TraitLevelChecked(Traits.SerpentsLegacy) && CanWeave(actionID) && - (WasLastAction(OriginalHook(SteelMaw)) || WasLastAction(OriginalHook(DreadMaw)) || - WasLastAction(OriginalHook(HuntersDen)) || WasLastAction(OriginalHook(SwiftskinsDen)))) + (WasLastWeaponskill(OriginalHook(SteelMaw)) || WasLastWeaponskill(OriginalHook(DreadMaw)) || + WasLastWeaponskill(OriginalHook(HuntersDen)) || WasLastWeaponskill(OriginalHook(SwiftskinsDen)))) return OriginalHook(SerpentsTail); if (HasEffect(Buffs.PoisedForTwinfang)) From b0fc064c62038e2f46ec863189e4be01a1d8b211 Mon Sep 17 00:00:00 2001 From: Kage Date: Thu, 11 Jul 2024 16:13:06 +0200 Subject: [PATCH 22/26] update mch opener --- XIVSlothCombo/Combos/JobHelpers/MCH.cs | 197 +++++++++++++++---------- XIVSlothCombo/Combos/JobHelpers/VPR.cs | 10 +- XIVSlothCombo/Combos/PvE/MCH.cs | 4 +- 3 files changed, 129 insertions(+), 82 deletions(-) diff --git a/XIVSlothCombo/Combos/JobHelpers/MCH.cs b/XIVSlothCombo/Combos/JobHelpers/MCH.cs index c27ed4182..3ef421a55 100644 --- a/XIVSlothCombo/Combos/JobHelpers/MCH.cs +++ b/XIVSlothCombo/Combos/JobHelpers/MCH.cs @@ -8,79 +8,43 @@ namespace XIVSlothCombo.Combos.JobHelpers { - internal class MCHOpenerLogic : PvE.MCH + internal class MCHOpenerLogic : MCH { private static bool HasCooldowns() { if (CustomComboFunctions.GetRemainingCharges(CheckMate) < 3) return false; + if (CustomComboFunctions.GetRemainingCharges(DoubleCheck) < 3) return false; + if (!CustomComboFunctions.ActionReady(Chainsaw)) return false; + if (!CustomComboFunctions.ActionReady(Wildfire)) return false; + if (!CustomComboFunctions.ActionReady(BarrelStabilizer)) return false; + if (!CustomComboFunctions.ActionReady(Excavator)) return false; + if (!CustomComboFunctions.ActionReady(FullMetalField)) return false; return true; } - public static bool HasPrePullCooldowns() - { - if (CustomComboFunctions.GetRemainingCharges(Reassemble) < 2) return false; - - return true; - } - - private static uint OpenerLevel => 100; public uint PrePullStep = 0; public uint OpenerStep = 0; - private static uint[] StandardOpener = [ - AirAnchor, - CheckMate, - DoubleCheck, - Drill, - BarrelStabilizer, - Chainsaw, - Excavator, - AutomatonQueen, - Reassemble, - Drill, - CheckMate, - Wildfire, - FullMetalField, - DoubleCheck, - Hypercharge, - BlazingShot, - CheckMate, - BlazingShot, - DoubleCheck, - BlazingShot, - CheckMate, - BlazingShot, - DoubleCheck, - BlazingShot, - CheckMate, - Drill, - DoubleCheck, - CheckMate, - HeatedSplitShot, - DoubleCheck, - HeatedSlugShot, - HeatedCleanShot]; - public static bool LevelChecked => CustomComboFunctions.LocalPlayer.Level >= OpenerLevel; - private static bool CanOpener => HasCooldowns() && HasPrePullCooldowns() && LevelChecked; + private static bool CanOpener => HasCooldowns() && LevelChecked; private OpenerState currentState = OpenerState.PrePull; @@ -98,7 +62,7 @@ public OpenerState CurrentState { Svc.Log.Debug($"Entered PrePull Opener"); } - if (value == OpenerState.InOpener) OpenerStep = 0; + if (value == OpenerState.InOpener) OpenerStep = 1; if (value == OpenerState.OpenerFinished || value == OpenerState.FailedOpener) { if (value == OpenerState.FailedOpener) @@ -119,53 +83,142 @@ private bool DoPrePullSteps(ref uint actionID) return false; if (CanOpener && PrePullStep == 0) + { PrePullStep = 1; + } if (!HasCooldowns()) + { PrePullStep = 0; + } if (CurrentState == OpenerState.PrePull && PrePullStep > 0) { - if (CustomComboFunctions.HasEffect(Buffs.Reassembled) && PrePullStep == 1) CurrentState = OpenerState.InOpener; else if (PrePullStep == 1) actionID = Reassemble; - if (ActionWatching.CombatActions.Count > 2 && CustomComboFunctions.InCombat()) CurrentState = OpenerState.FailedOpener; return true; } - PrePullStep = 0; return false; } - private bool DoOpener(uint[] OpenerActions, ref uint actionID) + private bool DoOpener(ref uint actionID) { if (!LevelChecked) return false; if (currentState == OpenerState.InOpener) { - if (CustomComboFunctions.WasLastAction(OpenerActions[OpenerStep])) - OpenerStep++; + if (CustomComboFunctions.WasLastAction(AirAnchor) && OpenerStep == 1) OpenerStep++; + else if (OpenerStep == 1) actionID = AirAnchor; + + if (CustomComboFunctions.WasLastAction(CheckMate) && OpenerStep == 2) OpenerStep++; + else if (OpenerStep == 2) actionID = CheckMate; + + if (CustomComboFunctions.WasLastAction(DoubleCheck) && OpenerStep == 3) OpenerStep++; + else if (OpenerStep == 3) actionID = DoubleCheck; + + if (CustomComboFunctions.WasLastAction(Drill) && OpenerStep == 4) OpenerStep++; + else if (OpenerStep == 4) actionID = Drill; + + if (CustomComboFunctions.WasLastAction(BarrelStabilizer) && OpenerStep == 5) OpenerStep++; + else if (OpenerStep == 5) actionID = BarrelStabilizer; + + if (CustomComboFunctions.WasLastAction(Chainsaw) && OpenerStep == 6) OpenerStep++; + else if (OpenerStep == 6) actionID = Chainsaw; + + if (CustomComboFunctions.WasLastAction(Excavator) && OpenerStep == 7) OpenerStep++; + else if (OpenerStep == 7) actionID = Excavator; + + if (CustomComboFunctions.WasLastAction(AutomatonQueen) && OpenerStep == 8) OpenerStep++; + else if (OpenerStep == 8) actionID = AutomatonQueen; + + if (CustomComboFunctions.WasLastAction(Reassemble) && OpenerStep == 9) OpenerStep++; + else if (OpenerStep == 9) actionID = Reassemble; + + if (CustomComboFunctions.WasLastAction(Drill) && OpenerStep == 10) OpenerStep++; + else if (OpenerStep == 10) actionID = Drill; - if (OpenerStep == OpenerActions.Length) - CurrentState = OpenerState.OpenerFinished; + if (CustomComboFunctions.WasLastAction(CheckMate) && OpenerStep == 11) OpenerStep++; + else if (OpenerStep == 11) actionID = CheckMate; - else actionID = OpenerActions[OpenerStep]; + if (CustomComboFunctions.WasLastAction(Wildfire) && OpenerStep == 12) OpenerStep++; + else if (OpenerStep == 12) actionID = Wildfire; - if (CustomComboFunctions.InCombat() && ActionWatching.TimeSinceLastAction.TotalSeconds >= 5) + if (CustomComboFunctions.WasLastAction(FullMetalField) && OpenerStep == 13) OpenerStep++; + else if (OpenerStep == 13) actionID = FullMetalField; + + if (CustomComboFunctions.WasLastAction(DoubleCheck) && OpenerStep == 14) OpenerStep++; + else if (OpenerStep == 14) actionID = DoubleCheck; + + if (CustomComboFunctions.WasLastAction(Hypercharge) && OpenerStep == 15) OpenerStep++; + else if (OpenerStep == 15) actionID = Hypercharge; + + if (CustomComboFunctions.WasLastAction(BlazingShot) && OpenerStep == 16) OpenerStep++; + else if (OpenerStep == 16) actionID = BlazingShot; + + if (CustomComboFunctions.WasLastAction(CheckMate) && OpenerStep == 17) OpenerStep++; + else if (OpenerStep == 17) actionID = CheckMate; + + if (CustomComboFunctions.WasLastAction(BlazingShot) && OpenerStep == 18) OpenerStep++; + else if (OpenerStep == 18) actionID = BlazingShot; + + if (CustomComboFunctions.WasLastAction(DoubleCheck) && OpenerStep == 19) OpenerStep++; + else if (OpenerStep == 19) actionID = DoubleCheck; + + if (CustomComboFunctions.WasLastAction(BlazingShot) && OpenerStep == 20) OpenerStep++; + else if (OpenerStep == 20) actionID = BlazingShot; + + if (CustomComboFunctions.WasLastAction(CheckMate) && OpenerStep == 21) OpenerStep++; + else if (OpenerStep == 21) actionID = CheckMate; + + if (CustomComboFunctions.WasLastAction(BlazingShot) && OpenerStep == 22) OpenerStep++; + else if (OpenerStep == 22) actionID = BlazingShot; + + if (CustomComboFunctions.WasLastAction(DoubleCheck) && OpenerStep == 23) OpenerStep++; + else if (OpenerStep == 23) actionID = DoubleCheck; + + if (CustomComboFunctions.WasLastAction(BlazingShot) && OpenerStep == 24) OpenerStep++; + else if (OpenerStep == 24) actionID = BlazingShot; + + if (CustomComboFunctions.WasLastAction(CheckMate) && OpenerStep == 25) OpenerStep++; + else if (OpenerStep == 25) actionID = CheckMate; + + if (CustomComboFunctions.WasLastAction(Drill) && OpenerStep == 26) OpenerStep++; + else if (OpenerStep == 26) actionID = Drill; + + if (CustomComboFunctions.WasLastAction(DoubleCheck) && OpenerStep == 27) OpenerStep++; + else if (OpenerStep == 27) actionID = DoubleCheck; + + if (CustomComboFunctions.WasLastAction(CheckMate) && OpenerStep == 28) OpenerStep++; + else if (OpenerStep == 28) actionID = CheckMate; + + if (CustomComboFunctions.WasLastAction(HeatedSplitShot) && OpenerStep == 29) OpenerStep++; + else if (OpenerStep == 29) actionID = HeatedSplitShot; + + if (CustomComboFunctions.WasLastAction(DoubleCheck) && OpenerStep == 30) OpenerStep++; + else if (OpenerStep == 30) actionID = DoubleCheck; + + if (CustomComboFunctions.WasLastAction(HeatedSlugShot) && OpenerStep == 31) OpenerStep++; + else if (OpenerStep == 31) actionID = HeatedSlugShot; + + if (CustomComboFunctions.WasLastAction(HeatedCleanShot) && OpenerStep == 37) CurrentState = OpenerState.OpenerFinished; + else if (OpenerStep == 37) actionID = HeatedCleanShot; + + if (ActionWatching.TimeSinceLastAction.TotalSeconds >= 5) CurrentState = OpenerState.FailedOpener; - if (((actionID == Ricochet && CustomComboFunctions.GetRemainingCharges(CheckMate) < 3) || - (actionID == Chainsaw && CustomComboFunctions.IsOnCooldown(Chainsaw)) || - (actionID == Wildfire && CustomComboFunctions.IsOnCooldown(Wildfire)) || - (actionID == BarrelStabilizer && CustomComboFunctions.IsOnCooldown(BarrelStabilizer)) || - (actionID == BarrelStabilizer && CustomComboFunctions.IsOnCooldown(Excavator)) || - (actionID == BarrelStabilizer && CustomComboFunctions.IsOnCooldown(FullMetalField)) || - (actionID == GaussRound && CustomComboFunctions.GetRemainingCharges(DoubleCheck) < 3)) && ActionWatching.TimeSinceLastAction.TotalSeconds >= 3) + if (((actionID == CheckMate && CustomComboFunctions.GetRemainingCharges(CheckMate) < 3) || + (actionID == Chainsaw && CustomComboFunctions.IsOnCooldown(Chainsaw)) || + (actionID == Wildfire && CustomComboFunctions.IsOnCooldown(Wildfire)) || + (actionID == BarrelStabilizer && CustomComboFunctions.IsOnCooldown(BarrelStabilizer)) || + (actionID == BarrelStabilizer && CustomComboFunctions.IsOnCooldown(Excavator)) || + (actionID == BarrelStabilizer && CustomComboFunctions.IsOnCooldown(FullMetalField)) || + (actionID == DoubleCheck && CustomComboFunctions.GetRemainingCharges(DoubleCheck) < 3)) && ActionWatching.TimeSinceLastAction.TotalSeconds >= 3) { CurrentState = OpenerState.FailedOpener; return false; @@ -181,9 +234,10 @@ private void ResetOpener() OpenerStep = 0; } - public bool DoFullOpener(ref uint actionID, bool simpleMode) + public bool DoFullOpener(ref uint actionID) { - if (!LevelChecked) return false; + if (!LevelChecked) + return false; if (CurrentState == OpenerState.PrePull) if (DoPrePullSteps(ref actionID)) @@ -191,17 +245,8 @@ public bool DoFullOpener(ref uint actionID, bool simpleMode) if (CurrentState == OpenerState.InOpener) { - if (simpleMode) - { - if (DoOpener(StandardOpener, ref actionID)) - return true; - } - else - { - if (DoOpener(StandardOpener, ref actionID)) - return true; - - } + if (DoOpener(ref actionID)) + return true; } if (!CustomComboFunctions.InCombat()) @@ -209,11 +254,9 @@ public bool DoFullOpener(ref uint actionID, bool simpleMode) ResetOpener(); CurrentState = OpenerState.PrePull; } - return false; } } - internal static class MCHExtensions { private static uint lastBattery = 0; diff --git a/XIVSlothCombo/Combos/JobHelpers/VPR.cs b/XIVSlothCombo/Combos/JobHelpers/VPR.cs index f64df9efa..b58e7f515 100644 --- a/XIVSlothCombo/Combos/JobHelpers/VPR.cs +++ b/XIVSlothCombo/Combos/JobHelpers/VPR.cs @@ -16,6 +16,7 @@ private static bool HasCooldowns() if (!CustomComboFunctions.ActionReady(SerpentsIre)) return false; + return true; } @@ -62,7 +63,8 @@ public OpenerState CurrentState private bool DoPrePullSteps(ref uint actionID) { - if (!LevelChecked) return false; + if (!LevelChecked) + return false; if (CanOpener && PrePullStep == 0) { @@ -90,7 +92,8 @@ private bool DoPrePullSteps(ref uint actionID) private bool DoOpener(ref uint actionID) { - if (!LevelChecked) return false; + if (!LevelChecked) + return false; if (currentState == OpenerState.InOpener) { @@ -227,7 +230,8 @@ private void ResetOpener() public bool DoFullOpener(ref uint actionID) { - if (!LevelChecked) return false; + if (!LevelChecked) + return false; if (CurrentState == OpenerState.PrePull) if (DoPrePullSteps(ref actionID)) diff --git a/XIVSlothCombo/Combos/PvE/MCH.cs b/XIVSlothCombo/Combos/PvE/MCH.cs index 3522df3a5..e64a8e29e 100644 --- a/XIVSlothCombo/Combos/PvE/MCH.cs +++ b/XIVSlothCombo/Combos/PvE/MCH.cs @@ -117,7 +117,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return Variant.VariantRampart; // Opener for MCH - if (MCHOpener.DoFullOpener(ref actionID, true)) + if (MCHOpener.DoFullOpener(ref actionID)) return actionID; // Interrupt @@ -297,7 +297,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim // Opener for MCH if (IsEnabled(CustomComboPreset.MCH_ST_Adv_Opener)) { - if (MCHOpener.DoFullOpener(ref actionID, false)) + if (MCHOpener.DoFullOpener(ref actionID)) return actionID; } From 8454ff7e9c60692a5c838ee43f626a295c8cc575 Mon Sep 17 00:00:00 2001 From: Kage Date: Thu, 11 Jul 2024 16:14:16 +0200 Subject: [PATCH 23/26] cleanup --- XIVSlothCombo/Combos/JobHelpers/MCH.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XIVSlothCombo/Combos/JobHelpers/MCH.cs b/XIVSlothCombo/Combos/JobHelpers/MCH.cs index 3ef421a55..f28497135 100644 --- a/XIVSlothCombo/Combos/JobHelpers/MCH.cs +++ b/XIVSlothCombo/Combos/JobHelpers/MCH.cs @@ -236,7 +236,7 @@ private void ResetOpener() public bool DoFullOpener(ref uint actionID) { - if (!LevelChecked) + if (!LevelChecked) return false; if (CurrentState == OpenerState.PrePull) From bbf37b2373ea7034f9d9b6b7cd5dc5e1bee86114 Mon Sep 17 00:00:00 2001 From: Kage Date: Thu, 11 Jul 2024 18:11:34 +0200 Subject: [PATCH 24/26] fix mch aoe weaving --- XIVSlothCombo/Combos/JobHelpers/MCH.cs | 4 +- XIVSlothCombo/Combos/PvE/MCH.cs | 113 +++++++++++++------------ 2 files changed, 59 insertions(+), 58 deletions(-) diff --git a/XIVSlothCombo/Combos/JobHelpers/MCH.cs b/XIVSlothCombo/Combos/JobHelpers/MCH.cs index f28497135..4f954c3e4 100644 --- a/XIVSlothCombo/Combos/JobHelpers/MCH.cs +++ b/XIVSlothCombo/Combos/JobHelpers/MCH.cs @@ -206,8 +206,8 @@ private bool DoOpener(ref uint actionID) if (CustomComboFunctions.WasLastAction(HeatedSlugShot) && OpenerStep == 31) OpenerStep++; else if (OpenerStep == 31) actionID = HeatedSlugShot; - if (CustomComboFunctions.WasLastAction(HeatedCleanShot) && OpenerStep == 37) CurrentState = OpenerState.OpenerFinished; - else if (OpenerStep == 37) actionID = HeatedCleanShot; + if (CustomComboFunctions.WasLastAction(HeatedCleanShot) && OpenerStep == 32) CurrentState = OpenerState.OpenerFinished; + else if (OpenerStep == 32) actionID = HeatedCleanShot; if (ActionWatching.TimeSinceLastAction.TotalSeconds >= 5) CurrentState = OpenerState.FailedOpener; diff --git a/XIVSlothCombo/Combos/PvE/MCH.cs b/XIVSlothCombo/Combos/PvE/MCH.cs index e64a8e29e..64607cdb1 100644 --- a/XIVSlothCombo/Combos/PvE/MCH.cs +++ b/XIVSlothCombo/Combos/PvE/MCH.cs @@ -487,11 +487,11 @@ internal class MCH_AoE_SimpleMode : CustomCombo protected internal override CustomComboPreset Preset { get; } = CustomComboPreset.MCH_AoE_SimpleMode; protected override uint Invoke(uint actionID, uint lastComboMove, float comboTime, byte level) - { + { + MCHGauge? gauge = GetJobGauge(); + if (actionID is SpreadShot) { - MCHGauge? gauge = GetJobGauge(); - if (IsEnabled(CustomComboPreset.MCH_Variant_Cure) && IsEnabled(Variant.VariantCure) && PlayerHealthPercentageHp() <= GetOptionValue(Config.MCH_VariantCure)) @@ -507,15 +507,10 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return Variant.VariantRampart; // BarrelStabilizer use and Full metal field - if (!gauge.IsOverheated && ((CanWeave(actionID) && ActionReady(BarrelStabilizer)) || HasEffect(Buffs.FullMetalMachinist))) + if (!gauge.IsOverheated && ((CanWeave(actionID) && ActionReady(BarrelStabilizer)) || + HasEffect(Buffs.FullMetalMachinist))) return OriginalHook(BarrelStabilizer); - if ((LevelChecked(Chainsaw) && GetCooldownRemainingTime(Chainsaw) <= GetCooldownRemainingTime(OriginalHook(SplitShot)) + 0.25) || ActionReady(Chainsaw)) - return Chainsaw; - - if (HasEffect(Buffs.ExcavatorReady)) - return OriginalHook(Chainsaw); - if (ActionReady(BioBlaster) && !TargetHasEffect(Debuffs.Bioblaster)) return OriginalHook(BioBlaster); @@ -532,29 +527,36 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return Hypercharge; //AutoCrossbow, Gauss, Rico - if ((WasLastAction(SpreadShot) || WasLastAction(AutoCrossbow) || Config.MCH_AoE_Hypercharge) && CanWeave(actionID) && + if (CanWeave(actionID) && WasLastAction(OriginalHook(AutoCrossbow)) && (ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability)) { - if (LevelChecked(OriginalHook(GaussRound)) && GetRemainingCharges(OriginalHook(GaussRound)) >= GetRemainingCharges(OriginalHook(Ricochet))) + if (ActionReady(OriginalHook(GaussRound)) && GetRemainingCharges(OriginalHook(GaussRound)) >= GetRemainingCharges(OriginalHook(Ricochet))) return OriginalHook(GaussRound); - if (LevelChecked(OriginalHook(Ricochet)) && GetRemainingCharges(OriginalHook(Ricochet)) > GetRemainingCharges(OriginalHook(GaussRound))) + if (ActionReady(OriginalHook(Ricochet)) && GetRemainingCharges(OriginalHook(Ricochet)) > GetRemainingCharges(OriginalHook(GaussRound))) return OriginalHook(Ricochet); } if (gauge.IsOverheated && AutoCrossbow.LevelChecked()) return OriginalHook(AutoCrossbow); - //gauss and ricochet outside HC - if (CanWeave(actionID) && !gauge.IsOverheated && - !HasEffect(Buffs.Wildfire) && !WasLastWeaponskill(OriginalHook(AutoCrossbow))) - { - if (ActionReady(OriginalHook(GaussRound)) && !WasLastAction(OriginalHook(GaussRound))) - return OriginalHook(GaussRound); + if (!HasEffect(Buffs.Wildfire) && + !HasEffect(Buffs.Reassembled) && HasCharges(Reassemble) && + (Scattergun.LevelChecked() || + (gauge.IsOverheated && AutoCrossbow.LevelChecked()) || + (GetCooldownRemainingTime(Chainsaw) < 1 && Chainsaw.LevelChecked()) || + (GetCooldownRemainingTime(OriginalHook(Chainsaw)) < 1 && Excavator.LevelChecked()))) + return Reassemble; - if (ActionReady(OriginalHook(Ricochet)) && !WasLastAction(OriginalHook(Ricochet))) - return OriginalHook(Ricochet); - } + if (LevelChecked(Excavator) && HasEffect(Buffs.ExcavatorReady)) + return OriginalHook(Chainsaw); + + if ((LevelChecked(Chainsaw) && GetCooldownRemainingTime(Chainsaw) < 1) || + ActionReady(Chainsaw)) + return Chainsaw; + + if (LevelChecked(AutoCrossbow) && gauge.IsOverheated) + return AutoCrossbow; } return actionID; } @@ -574,7 +576,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim bool reassembledChainsaw = (IsEnabled(CustomComboPreset.MCH_AoE_Adv_Reassemble) && Config.MCH_AoE_Reassembled[2] && HasEffect(Buffs.Reassembled)) || (IsEnabled(CustomComboPreset.MCH_AoE_Adv_Reassemble) && !Config.MCH_AoE_Reassembled[2] && !HasEffect(Buffs.Reassembled)) || (!HasEffect(Buffs.Reassembled) && GetRemainingCharges(Reassemble) <= Config.MCH_AoE_ReassemblePool) || (!IsEnabled(CustomComboPreset.MCH_AoE_Adv_Reassemble)); bool reassembledExcavator = (IsEnabled(CustomComboPreset.MCH_AoE_Adv_Reassemble) && Config.MCH_AoE_Reassembled[3] && HasEffect(Buffs.Reassembled)) || (IsEnabled(CustomComboPreset.MCH_AoE_Adv_Reassemble) && !Config.MCH_AoE_Reassembled[3] && !HasEffect(Buffs.Reassembled)) || (!HasEffect(Buffs.Reassembled) && GetRemainingCharges(Reassemble) <= Config.MCH_AoE_ReassemblePool) || (!IsEnabled(CustomComboPreset.MCH_AoE_Adv_Reassemble)); - if (IsEnabled(CustomComboPreset.MCH_Variant_Cure) && IsEnabled(Variant.VariantCure) && PlayerHealthPercentageHp() <= GetOptionValue(Config.MCH_VariantCure)) @@ -595,37 +596,12 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim (IsEnabled(CustomComboPreset.MCH_AoE_Adv_Stabilizer_FullMetalField) && HasEffect(Buffs.FullMetalMachinist)))) return OriginalHook(BarrelStabilizer); - if (IsEnabled(CustomComboPreset.MCH_AoE_Adv_Reassemble) && !HasEffect(Buffs.Wildfire) && - !HasEffect(Buffs.Reassembled) && HasCharges(Reassemble) && - GetRemainingCharges(Reassemble) > Config.MCH_AoE_ReassemblePool && - ((Config.MCH_AoE_Reassembled[0] && Scattergun.LevelChecked()) || - (gauge.IsOverheated && Config.MCH_AoE_Reassembled[1] && AutoCrossbow.LevelChecked()) || - (GetCooldownRemainingTime(OriginalHook(Chainsaw)) < 1 && Config.MCH_AoE_Reassembled[2] && Chainsaw.LevelChecked()))) - return Reassemble; - - if (IsEnabled(CustomComboPreset.MCH_AoE_Adv_Chainsaw) && - reassembledChainsaw && - ((LevelChecked(Chainsaw) && GetCooldownRemainingTime(Chainsaw) < 1) || - ActionReady(Chainsaw))) - return Chainsaw; - - if (IsEnabled(CustomComboPreset.MCH_AoE_Adv_Excavator) && - reassembledExcavator && - LevelChecked(Excavator) && HasEffect(Buffs.ExcavatorReady)) - return OriginalHook(Chainsaw); - - if (reassembledScattergun) - return OriginalHook(Scattergun); - - if (reassembledCrossbow && - LevelChecked(AutoCrossbow) && gauge.IsOverheated) - return AutoCrossbow; - if (IsEnabled(CustomComboPreset.MCH_AoE_Adv_Bioblaster) && ActionReady(BioBlaster) && !TargetHasEffect(Debuffs.Bioblaster)) return OriginalHook(BioBlaster); - if (IsEnabled(CustomComboPreset.MCH_AoE_Adv_FlameThrower) && ActionReady(Flamethrower) && !IsMoving) + if (IsEnabled(CustomComboPreset.MCH_AoE_Adv_FlameThrower) && + ActionReady(Flamethrower) && !IsMoving) return OriginalHook(Flamethrower); if (IsEnabled(CustomComboPreset.MCH_AoE_Adv_Queen) && !gauge.IsOverheated) @@ -642,9 +618,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return Hypercharge; //AutoCrossbow, Gauss, Rico - if (IsEnabled(CustomComboPreset.MCH_AoE_Adv_GaussRicochet) && CanWeave(actionID) && - (Config.MCH_AoE_Hypercharge || (!Config.MCH_AoE_Hypercharge && gauge.IsOverheated)) && - (WasLastAction(SpreadShot) || WasLastAction(AutoCrossbow) || Config.MCH_AoE_Hypercharge) && + if (IsEnabled(CustomComboPreset.MCH_AoE_Adv_GaussRicochet) && !Config.MCH_AoE_Hypercharge && + CanWeave(actionID) && WasLastAction(OriginalHook(AutoCrossbow)) && (ActionWatching.GetAttackType(ActionWatching.LastAction) != ActionWatching.ActionAttackType.Ability)) { if (ActionReady(OriginalHook(GaussRound)) && GetRemainingCharges(OriginalHook(GaussRound)) >= GetRemainingCharges(OriginalHook(Ricochet))) @@ -658,9 +633,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return OriginalHook(AutoCrossbow); //gauss and ricochet outside HC - if (IsEnabled(CustomComboPreset.MCH_AoE_Adv_GaussRicochet) && - CanWeave(actionID) && !gauge.IsOverheated && - !HasEffect(Buffs.Wildfire) && !WasLastWeaponskill(OriginalHook(AutoCrossbow))) + if (IsEnabled(CustomComboPreset.MCH_AoE_Adv_GaussRicochet) && Config.MCH_AoE_Hypercharge && + CanWeave(actionID) && !gauge.IsOverheated) { if (ActionReady(OriginalHook(GaussRound)) && !WasLastAction(OriginalHook(GaussRound))) return OriginalHook(GaussRound); @@ -669,6 +643,33 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return OriginalHook(Ricochet); } + if (IsEnabled(CustomComboPreset.MCH_AoE_Adv_Reassemble) && !HasEffect(Buffs.Wildfire) && + !HasEffect(Buffs.Reassembled) && HasCharges(Reassemble) && + GetRemainingCharges(Reassemble) > Config.MCH_AoE_ReassemblePool && + ((Config.MCH_AoE_Reassembled[0] && Scattergun.LevelChecked()) || + (gauge.IsOverheated && Config.MCH_AoE_Reassembled[1] && AutoCrossbow.LevelChecked()) || + (GetCooldownRemainingTime(Chainsaw) < 1 && Config.MCH_AoE_Reassembled[2] && Chainsaw.LevelChecked()) || + (GetCooldownRemainingTime(OriginalHook(Chainsaw)) < 1 && Config.MCH_AoE_Reassembled[3] && Excavator.LevelChecked()))) + return Reassemble; + + if (IsEnabled(CustomComboPreset.MCH_AoE_Adv_Excavator) && + reassembledExcavator && + LevelChecked(Excavator) && HasEffect(Buffs.ExcavatorReady)) + return OriginalHook(Chainsaw); + + if (IsEnabled(CustomComboPreset.MCH_AoE_Adv_Chainsaw) && + reassembledChainsaw && + ((LevelChecked(Chainsaw) && GetCooldownRemainingTime(Chainsaw) < 1) || + ActionReady(Chainsaw))) + return Chainsaw; + + if (reassembledScattergun) + return OriginalHook(Scattergun); + + if (reassembledCrossbow && + LevelChecked(AutoCrossbow) && gauge.IsOverheated) + return AutoCrossbow; + if (IsEnabled(CustomComboPreset.MCH_AoE_Adv_SecondWind)) { if (PlayerHealthPercentageHp() <= Config.MCH_AoE_SecondWindThreshold && ActionReady(All.SecondWind)) From c36ebb0d37a3feaf4645e961e9f1003856725447 Mon Sep 17 00:00:00 2001 From: Kage Date: Thu, 11 Jul 2024 19:57:08 +0200 Subject: [PATCH 25/26] changes for serpent tails --- XIVSlothCombo/Combos/PvE/VPR.cs | 39 +++++++++++++++++---------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/VPR.cs b/XIVSlothCombo/Combos/PvE/VPR.cs index 19ff6ad22..41af32159 100644 --- a/XIVSlothCombo/Combos/PvE/VPR.cs +++ b/XIVSlothCombo/Combos/PvE/VPR.cs @@ -54,7 +54,8 @@ public const uint ThirdLegacy = 34642, FourthGeneration = 34630, FourthLegacy = 34643, - Ouroboros = 34631; + Ouroboros = 34631, + LastLash = 34635; public static class Buffs { @@ -177,8 +178,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { //Legacy weaves if (TraitLevelChecked(Traits.SerpentsLegacy) && CanWeave(actionID) && - (WasLastWeaponskill(OriginalHook(SteelFangs)) || WasLastWeaponskill(OriginalHook(DreadFangs)) || - WasLastWeaponskill(OriginalHook(HuntersCoil)) || WasLastWeaponskill(OriginalHook(SwiftskinsCoil)))) + (WasLastAction(OriginalHook(SteelFangs)) || WasLastAction(OriginalHook(DreadFangs)) || + WasLastAction(OriginalHook(HuntersCoil)) || WasLastAction(OriginalHook(SwiftskinsCoil)))) return OriginalHook(SerpentsTail); if (gauge.AnguineTribute is 5) @@ -267,14 +268,14 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (lastComboMove is HindstingStrike or HindsbaneFang or FlankstingStrike or FlanksbaneFang) { - if (CanWeave(actionID) && LevelChecked(SerpentsTail) && + if (CanWeave(actionID) && LevelChecked(SerpentsTail) && HasCharges(DeathRattle) && (WasLastWeaponskill(HindstingStrike) || WasLastWeaponskill(HindsbaneFang) || WasLastWeaponskill(FlankstingStrike) || WasLastWeaponskill(FlanksbaneFang))) return OriginalHook(SerpentsTail); //Reawakend Usage if ((HasEffect(Buffs.ReadyToReawaken) || gauge.SerpentOffering >= 50) && - GetCooldownRemainingTime(SerpentsIre) > GCD * 10 && + GetCooldownRemainingTime(SerpentsIre) > GCD * 15 && HasEffect(Buffs.Swiftscaled) && HasEffect(Buffs.HuntersInstinct) && TargetHasEffect(Debuffs.NoxiousGnash) && @@ -382,8 +383,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { //Legacy weaves if (TraitLevelChecked(Traits.SerpentsLegacy) && CanWeave(actionID) && - (WasLastWeaponskill(OriginalHook(SteelFangs)) || WasLastWeaponskill(OriginalHook(DreadFangs)) || - WasLastWeaponskill(OriginalHook(HuntersCoil)) || WasLastWeaponskill(OriginalHook(SwiftskinsCoil)))) + (WasLastAction(OriginalHook(SteelFangs)) || WasLastAction(OriginalHook(DreadFangs)) || + WasLastAction(OriginalHook(HuntersCoil)) || WasLastAction(OriginalHook(SwiftskinsCoil)))) return OriginalHook(SerpentsTail); if (gauge.AnguineTribute is 5) @@ -521,7 +522,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (lastComboMove is HindstingStrike or HindsbaneFang or FlankstingStrike or FlanksbaneFang) { if (IsEnabled(CustomComboPreset.VPR_ST_SerpentsTail) && - CanWeave(actionID) && LevelChecked(SerpentsTail) && + CanWeave(actionID) && LevelChecked(SerpentsTail) && HasCharges(DeathRattle) && (WasLastWeaponskill(HindstingStrike) || WasLastWeaponskill(HindsbaneFang) || WasLastWeaponskill(FlankstingStrike) || WasLastWeaponskill(FlanksbaneFang))) return OriginalHook(SerpentsTail); @@ -529,7 +530,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //Reawakend Usage if (IsEnabled(CustomComboPreset.VPR_ST_Reawaken) && (HasEffect(Buffs.ReadyToReawaken) || gauge.SerpentOffering >= 50) && - GetCooldownRemainingTime(SerpentsIre) > GCD * 10 && + GetCooldownRemainingTime(SerpentsIre) > GCD * 15 && HasEffect(Buffs.Swiftscaled) && HasEffect(Buffs.HuntersInstinct) && TargetHasEffect(Debuffs.NoxiousGnash) && @@ -617,8 +618,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { //Legacy weaves if (TraitLevelChecked(Traits.SerpentsLegacy) && CanWeave(actionID) && - (WasLastWeaponskill(OriginalHook(SteelMaw)) || WasLastWeaponskill(OriginalHook(DreadMaw)) || - WasLastWeaponskill(OriginalHook(HuntersDen)) || WasLastWeaponskill(OriginalHook(SwiftskinsDen)))) + (WasLastAction(OriginalHook(SteelMaw)) || WasLastAction(OriginalHook(DreadMaw)) || + WasLastAction(OriginalHook(HuntersDen)) || WasLastAction(OriginalHook(SwiftskinsDen)))) return OriginalHook(SerpentsTail); if (gauge.AnguineTribute is 5) @@ -681,7 +682,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (lastComboMove is BloodiedMaw or JaggedMaw) { - if (CanWeave(actionID) && LevelChecked(SerpentsTail) && + if (CanWeave(actionID) && LevelChecked(SerpentsTail) && HasCharges(LastLash) && (WasLastWeaponskill(BloodiedMaw) || WasLastWeaponskill(JaggedMaw))) return OriginalHook(SerpentsTail); @@ -777,8 +778,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { //Legacy weaves if (TraitLevelChecked(Traits.SerpentsLegacy) && CanWeave(actionID) && - (WasLastWeaponskill(OriginalHook(SteelMaw)) || WasLastWeaponskill(OriginalHook(DreadMaw)) || - WasLastWeaponskill(OriginalHook(HuntersDen)) || WasLastWeaponskill(OriginalHook(SwiftskinsDen)))) + (WasLastAction(OriginalHook(SteelMaw)) || WasLastAction(OriginalHook(DreadMaw)) || + WasLastAction(OriginalHook(HuntersDen)) || WasLastAction(OriginalHook(SwiftskinsDen)))) return OriginalHook(SerpentsTail); if (gauge.AnguineTribute is 5) @@ -859,7 +860,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (lastComboMove is BloodiedMaw or JaggedMaw) { if (IsEnabled(CustomComboPreset.VPR_AoE_SerpentsTail) && - CanWeave(actionID) && LevelChecked(SerpentsTail) && + CanWeave(actionID) && LevelChecked(SerpentsTail) && HasCharges(LastLash) && (WasLastWeaponskill(BloodiedMaw) || WasLastWeaponskill(JaggedMaw))) return OriginalHook(SerpentsTail); @@ -1025,8 +1026,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsEnabled(CustomComboPreset.VPR_ReawakenLegacyWeaves)) { if (TraitLevelChecked(Traits.SerpentsLegacy) && CanWeave(actionID) && - (WasLastWeaponskill(OriginalHook(SteelFangs)) || WasLastWeaponskill(OriginalHook(DreadFangs)) || - WasLastWeaponskill(OriginalHook(HuntersCoil)) || WasLastWeaponskill(OriginalHook(SwiftskinsCoil)))) + (WasLastAction(OriginalHook(SteelFangs)) || WasLastAction(OriginalHook(DreadFangs)) || + WasLastAction(OriginalHook(HuntersCoil)) || WasLastAction(OriginalHook(SwiftskinsCoil)))) return OriginalHook(SerpentsTail); } @@ -1060,8 +1061,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (actionID is SerpentsTail) { if (TraitLevelChecked(Traits.SerpentsLegacy) && CanWeave(actionID) && - (WasLastWeaponskill(OriginalHook(SteelMaw)) || WasLastWeaponskill(OriginalHook(DreadMaw)) || - WasLastWeaponskill(OriginalHook(HuntersDen)) || WasLastWeaponskill(OriginalHook(SwiftskinsDen)))) + (WasLastAction(OriginalHook(SteelMaw)) || WasLastAction(OriginalHook(DreadMaw)) || + WasLastAction(OriginalHook(HuntersDen)) || WasLastAction(OriginalHook(SwiftskinsDen)))) return OriginalHook(SerpentsTail); if (HasEffect(Buffs.PoisedForTwinfang)) From 47f10016c25e0835d9652e17423c1c01c95cc263 Mon Sep 17 00:00:00 2001 From: Kage Date: Thu, 11 Jul 2024 20:22:03 +0200 Subject: [PATCH 26/26] fix typo RPR --- XIVSlothCombo/Combos/PvE/RPR.cs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/RPR.cs b/XIVSlothCombo/Combos/PvE/RPR.cs index 43985c458..68f01b680 100644 --- a/XIVSlothCombo/Combos/PvE/RPR.cs +++ b/XIVSlothCombo/Combos/PvE/RPR.cs @@ -142,9 +142,9 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } if (LevelChecked(ShadowOfDeath) && !HasEffect(Buffs.SoulReaver) && - ((LevelChecked(PlentifulHarvest) && HasEffect(Buffs.Enshrouded) && - ((GetCooldownRemainingTime(ArcaneCircle) <= GCD * 3) || (GetCooldownRemainingTime(ArcaneCircle) <= GCD))) || // Double Enshroud windows - (GetDebuffRemainingTime(Debuffs.DeathsDesign) <= 6))) // Other times + ((LevelChecked(PlentifulHarvest) && HasEffect(Buffs.Enshrouded) && + (GetCooldownRemainingTime(ArcaneCircle) <= GCD * 3 || GetCooldownRemainingTime(ArcaneCircle) <= GCD)) || // Double Enshroud windows + (GetDebuffRemainingTime(Debuffs.DeathsDesign) <= 6))) // Other times return ShadowOfDeath; if (TargetHasEffect(Debuffs.DeathsDesign)) @@ -175,12 +175,12 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (LevelChecked(Enshroud) && (gauge.Shroud >= 50 || HasEffect(Buffs.IdealHost)) && !HasEffect(Buffs.SoulReaver) && !HasEffect(Buffs.Enshrouded) && - (!LevelChecked(PlentifulHarvest) || // Before Plentiful Harvest - HasEffect(Buffs.ArcaneCircle) || // Shroud in Arcane Circle - (GetCooldownRemainingTime(ArcaneCircle) <= GCD * 4) || // Prep for double Enshroud + Natural Odd Minute Shrouds - WasLastAction(PlentifulHarvest) || //2nd part of Double Enshroud - (!HasEffect(Buffs.ArcaneCircle) && WasLastAction(ShadowOfDeath)) || //Natural Odd Minute Shroud - (!HasEffect(Buffs.ArcaneCircle) && gauge.Soul >= 90))) // Correction for 2 min windows + (!LevelChecked(PlentifulHarvest) || // Before Plentiful Harvest + HasEffect(Buffs.ArcaneCircle) || // Shroud in Arcane Circle + (GetCooldownRemainingTime(ArcaneCircle) <= GCD * 4) || // Prep for double Enshroud + Natural Odd Minute Shrouds + WasLastAction(PlentifulHarvest) || //2nd part of Double Enshroud + (!HasEffect(Buffs.ArcaneCircle) && GetCooldownRemainingTime(ArcaneCircle) <= GCD * 20) || //Natural Odd Minute Shrouds + (!HasEffect(Buffs.ArcaneCircle) && gauge.Soul >= 90))) // Correction for 2 min windows return Enshroud; if (!HasEffect(Buffs.Enshrouded) && !HasEffect(Buffs.SoulReaver) && @@ -298,7 +298,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } if (IsEnabled(CustomComboPreset.RPR_ST_SoD) && LevelChecked(ShadowOfDeath) && !HasEffect(Buffs.SoulReaver) && enemyHP > Config.RPR_SoDThreshold && - ((LevelChecked(PlentifulHarvest) && (GetCooldownRemainingTime(ArcaneCircle) <= GCD * 3 || GetCooldownRemainingTime(ArcaneCircle) <= GCD)) || // Double Enshroud windows + ((LevelChecked(PlentifulHarvest) && HasEffect(Buffs.Enshrouded) && (GetCooldownRemainingTime(ArcaneCircle) <= GCD * 3 || GetCooldownRemainingTime(ArcaneCircle) <= GCD)) || // Double Enshroud windows (GetDebuffRemainingTime(Debuffs.DeathsDesign) <= sodRefreshRange))) // Other times return ShadowOfDeath; @@ -343,7 +343,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim HasEffect(Buffs.ArcaneCircle) || // Shroud in Arcane Circle (GetCooldownRemainingTime(ArcaneCircle) <= GCD * 4) || // Prep for double Enshroud + Natural Odd Minute Shrouds WasLastAction(PlentifulHarvest) || //2nd part of Double Enshroud - (!HasEffect(Buffs.ArcaneCircle) && GetCooldownRemainingTime(ArcaneCircle) <= GCD * 10) || //Natural Odd Minute Shrouds + (!HasEffect(Buffs.ArcaneCircle) && GetCooldownRemainingTime(ArcaneCircle) <= GCD * 20) || //Natural Odd Minute Shrouds (!HasEffect(Buffs.ArcaneCircle) && gauge.Soul >= 90))) // Correction for 2 min windows return Enshroud;