From 4cca160d38ff8e5e28d96d21224e6f2734c8c7dc Mon Sep 17 00:00:00 2001 From: Edewen Date: Thu, 25 Jul 2024 20:04:03 -0400 Subject: [PATCH 1/6] Puts draw, out of combat, on top of the dps combos --- XIVSlothCombo/Combos/PvE/AST.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/XIVSlothCombo/Combos/PvE/AST.cs b/XIVSlothCombo/Combos/PvE/AST.cs index 54b203e0d..a28203517 100644 --- a/XIVSlothCombo/Combos/PvE/AST.cs +++ b/XIVSlothCombo/Combos/PvE/AST.cs @@ -189,6 +189,15 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } bool AlternateMode = GetIntOptionAsBool(Config.AST_DPS_AltMode); //(0 or 1 radio values) + if (((!AlternateMode && MaleficList.Contains(actionID)) || + (AlternateMode && CombustList.ContainsKey(actionID)) || + (IsEnabled(CustomComboPreset.AST_AoE_DPS) && GravityList.Contains(actionID))) && + !InCombat()) + + if (IsEnabled(CustomComboPreset.AST_DPS_AutoDraw) && + ActionReady(OriginalHook(AstralDraw)) && !InCombat()) + return OriginalHook(AstralDraw); + if (((!AlternateMode && MaleficList.Contains(actionID)) || (AlternateMode && CombustList.ContainsKey(actionID)) || (IsEnabled(CustomComboPreset.AST_AoE_DPS) && GravityList.Contains(actionID))) && From 06f65e452fdb348a0def062a8fc4e5829129dab1 Mon Sep 17 00:00:00 2001 From: edewen Date: Fri, 26 Jul 2024 17:23:23 -0400 Subject: [PATCH 2/6] Added Weave only option to stheals --- XIVSlothCombo/Combos/PvE/AST.cs | 28 ++++++++++++++------ XIVSlothCombo/Window/Functions/UserConfig.cs | 17 +++++++++--- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/AST.cs b/XIVSlothCombo/Combos/PvE/AST.cs index a28203517..6eee0f15d 100644 --- a/XIVSlothCombo/Combos/PvE/AST.cs +++ b/XIVSlothCombo/Combos/PvE/AST.cs @@ -147,6 +147,11 @@ public static UserBool AST_QuickTarget_SkipRezWeakness = new("AST_QuickTarget_SkipRezWeakness"), AST_ST_SimpleHeals_Adv = new("AST_ST_SimpleHeals_Adv"), AST_ST_SimpleHeals_UIMouseOver = new("AST_ST_SimpleHeals_UIMouseOver"), + AST_ST_SimpleHeals_WeaveDignity = new("AST_ST_SimpleHeals_WeaveDignity"), + AST_ST_SimpleHeals_WeaveIntersection = new("AST_ST_SimpleHeals_WeaveIntersection"), + AST_ST_SimpleHeals_WeaveEwer = new("AST_ST_SimpleHeals_WeaveEwer"), + AST_ST_SimpleHeals_WeaveSpire = new("AST_ST_SimpleHeals_WeaveSpire"), + AST_ST_SimpleHeals_WeaveExalt = new("AST_ST_SimpleHeals_WeaveExalt"), AST_AoE_SimpleHeals_WeaveLady = new("AST_AoE_SimpleHeals_WeaveLady"), AST_AoE_SimpleHeals_Opposition = new("AST_AoE_SimpleHeals_Opposition"), AST_AoE_SimpleHeals_Horoscope = new("AST_AoE_SimpleHeals_Horoscope"), @@ -366,6 +371,12 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { if (actionID is Benefic2) { + var canDignity = (Config.AST_ST_SimpleHeals_WeaveDignity && CanSpellWeave(actionID)) || !Config.AST_ST_SimpleHeals_WeaveDignity; + var canIntersect = (Config.AST_ST_SimpleHeals_WeaveIntersection && CanSpellWeave(actionID)) || !Config.AST_ST_SimpleHeals_WeaveIntersection; + var canExalt = (Config.AST_ST_SimpleHeals_WeaveExalt && CanSpellWeave(actionID)) || !Config.AST_ST_SimpleHeals_WeaveExalt; + var canEwer = (Config.AST_ST_SimpleHeals_WeaveEwer && CanSpellWeave(actionID)) || !Config.AST_ST_SimpleHeals_WeaveEwer; + var canSpire = (Config.AST_ST_SimpleHeals_WeaveSpire && CanSpellWeave(actionID)) || !Config.AST_ST_SimpleHeals_WeaveSpire; + //Grab our target (Soft->Hard->Self) IGameObject? healTarget = GetHealTarget(Config.AST_ST_SimpleHeals_Adv && Config.AST_ST_SimpleHeals_UIMouseOver); @@ -374,31 +385,32 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim HasCleansableDebuff(healTarget)) return All.Esuna; - if ((IsEnabled(CustomComboPreset.AST_ST_SimpleHeals_Spire) && + if (IsEnabled(CustomComboPreset.AST_ST_SimpleHeals_Spire) && Gauge.DrawnCards[2] == CardType.SPIRE && GetTargetHPPercent(healTarget) <= Config.AST_Spire && - CanSpellWeave(actionID)) - || - (IsEnabled(CustomComboPreset.AST_ST_SimpleHeals_Ewer) && + canSpire) + return OriginalHook(Play3); + + if (IsEnabled(CustomComboPreset.AST_ST_SimpleHeals_Ewer) && Gauge.DrawnCards[2] == CardType.EWER && GetTargetHPPercent(healTarget) <= Config.AST_Ewer && - CanSpellWeave(actionID))) + canEwer) return OriginalHook(Play3); if (IsEnabled(CustomComboPreset.AST_ST_SimpleHeals_EssentialDignity) && ActionReady(EssentialDignity) && GetTargetHPPercent(healTarget) <= Config.AST_EssentialDignity && - CanSpellWeave(actionID)) + canDignity) return EssentialDignity; if (IsEnabled(CustomComboPreset.AST_ST_SimpleHeals_Exaltation) && ActionReady(Exaltation) && - CanSpellWeave(actionID)) + canExalt) return Exaltation; if (IsEnabled(CustomComboPreset.AST_ST_SimpleHeals_CelestialIntersection) && ActionReady(CelestialIntersection) && - CanSpellWeave(actionID) && + canIntersect && !(healTarget as IBattleChara)!.HasShield()) return CelestialIntersection; diff --git a/XIVSlothCombo/Window/Functions/UserConfig.cs b/XIVSlothCombo/Window/Functions/UserConfig.cs index a8a74170b..48b15561e 100644 --- a/XIVSlothCombo/Window/Functions/UserConfig.cs +++ b/XIVSlothCombo/Window/Functions/UserConfig.cs @@ -1242,18 +1242,29 @@ internal static void Draw(CustomComboPreset preset, bool enabled) } if (preset is CustomComboPreset.AST_ST_SimpleHeals_EssentialDignity) + { UserConfig.DrawSliderInt(0, 100, AST.Config.AST_EssentialDignity, "Set percentage value"); + UserConfig.DrawAdditionalBoolChoice(AST.Config.AST_ST_SimpleHeals_WeaveDignity, "Only Weave", "Will only weave this action."); + } + if (preset is CustomComboPreset.AST_ST_SimpleHeals_CelestialIntersection) + UserConfig.DrawAdditionalBoolChoice(AST.Config.AST_ST_SimpleHeals_WeaveIntersection, "Only Weave", "Will only weave this action."); + + if (preset is CustomComboPreset.AST_ST_SimpleHeals_Exaltation) + UserConfig.DrawAdditionalBoolChoice(AST.Config.AST_ST_SimpleHeals_WeaveExalt, "Only Weave", "Will only weave this action."); if (preset is CustomComboPreset.AST_ST_SimpleHeals_Spire) + { UserConfig.DrawSliderInt(0, 100, AST.Config.AST_Spire, "Set percentage value"); - + UserConfig.DrawAdditionalBoolChoice(AST.Config.AST_ST_SimpleHeals_WeaveSpire, "Only Weave", "Will only weave this action."); + } if (preset is CustomComboPreset.AST_ST_SimpleHeals_Ewer) + { UserConfig.DrawSliderInt(0, 100, AST.Config.AST_Ewer, "Set percentage value"); - + UserConfig.DrawAdditionalBoolChoice(AST.Config.AST_ST_SimpleHeals_WeaveEwer, "Only Weave", "Will only weave this action."); + } if (preset is CustomComboPreset.AST_ST_SimpleHeals_Esuna) UserConfig.DrawSliderInt(0, 100, AST.Config.AST_ST_SimpleHeals_Esuna, "Stop using when below HP %. Set to Zero to disable this check"); - if (preset is CustomComboPreset.AST_AoE_SimpleHeals_LazyLady) UserConfig.DrawAdditionalBoolChoice(AST.Config.AST_AoE_SimpleHeals_WeaveLady, "Only Weave", "Will only weave this action."); From e07d3cf8fcc2be34298437a246654fbc893ba58d Mon Sep 17 00:00:00 2001 From: edewen Date: Sat, 27 Jul 2024 15:56:09 -0400 Subject: [PATCH 3/6] More ast changes Fixed draw ooc to not draw when it has cards Added balance opener Split the st and aoe dps options as someone request and because the opener was breaking aoe. --- XIVSlothCombo/Combos/CustomComboPreset.cs | 57 ++++-- XIVSlothCombo/Combos/PvE/AST.cs | 175 +++++++++++++++++-- XIVSlothCombo/Window/Functions/UserConfig.cs | 15 ++ 3 files changed, 223 insertions(+), 24 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index 24ae8e46e..98bda3577 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -175,20 +175,15 @@ public enum CustomComboPreset #region ASTROLOGIAN - #region DPS - [ReplaceSkill(AST.Malefic, AST.Malefic2, AST.Malefic3, AST.Malefic4, AST.FallMalefic, AST.Combust, AST.Combust2, AST.Combust3, AST.Gravity, AST.Gravity2)] - [CustomComboInfo("DPS Feature", "Replaces Malefic or Combust with options below", AST.JobID)] + #region ST DPS + [ReplaceSkill(AST.Malefic, AST.Malefic2, AST.Malefic3, AST.Malefic4, AST.FallMalefic, AST.Combust, AST.Combust2, AST.Combust3)] + [CustomComboInfo("ST DPS Feature", "Replaces Malefic or Combust with options below", AST.JobID)] AST_ST_DPS = 1004, [ParentCombo(AST_ST_DPS)] [CustomComboInfo("Combust Uptime Option", "Adds Combust to the DPS feature if it's not present on current target, or is about to expire.", AST.JobID)] AST_ST_DPS_CombustUptime = 1018, - - [ReplaceSkill(AST.Gravity, AST.Gravity2)] - [ParentCombo(AST_ST_DPS)] - [CustomComboInfo("AoE DPS Option", "Every option below (Lucid/AutoDraws/etc) will also be added to Gravity", AST.JobID, 1, "", "")] - AST_AoE_DPS = 1013, - + [ParentCombo(AST_ST_DPS)] [CustomComboInfo("Lightspeed Weave Option", "Adds Lightspeed", AST.JobID, 2, "", "")] AST_DPS_LightSpeed = 1020, @@ -216,6 +211,46 @@ public enum CustomComboPreset [ParentCombo(AST_ST_DPS)] [CustomComboInfo("Oracle Option", "Adds Oracle after Divination", AST.JobID)] AST_DPS_Oracle = 1015, + + [ParentCombo(AST_ST_DPS)] + [CustomComboInfo("Opener Option lvl 100", "Use the Balance opener. Have a deck of cards pulled and umbral draw off cooldown. It WILL use a lightspeed charge", AST.JobID, 11, "", "")] + AST_ST_DPS_Opener = 1040, + + #endregion + + #region AOE DPS + [ReplaceSkill(AST.Gravity, AST.Gravity2)] + [CustomComboInfo("AOE DPS Feature", "Replaces Gravity with options below", AST.JobID)] + AST_AOE_DPS = 1041, + + [ParentCombo(AST_AOE_DPS)] + [CustomComboInfo("Lightspeed Weave Option", "Adds Lightspeed", AST.JobID, 2, "", "")] + AST_AOE_LightSpeed = 1048, + + [ParentCombo(AST_AOE_DPS)] + [CustomComboInfo("Lucid Dreaming Weave Option", "Adds Lucid Dreaming when MP drops below slider value", AST.JobID, 3, "", "")] + AST_AOE_Lucid = 1042, + + [ParentCombo(AST_AOE_DPS)] + [CustomComboInfo("Divination Weave Option", "Adds Divination", AST.JobID, 4, "", "")] + AST_AOE_Divination = 1043, + + [ParentCombo(AST_AOE_DPS)] + [CustomComboInfo("Card Draw Weave Option", "Draws your cards", AST.JobID, 5, "", "")] + AST_AOE_AutoDraw = 1044, + + [ParentCombo(AST_AOE_DPS)] + [CustomComboInfo("Card Play Weave Option", "Weaves your Balance or Arrow card (best used with Quick Target Cards)", AST.JobID, 6)] + AST_AOE_AutoPlay = 1045, + + [ParentCombo(AST_AOE_DPS)] + [CustomComboInfo("Lord of Crowns Weave Option", "Adds Lord Of Crowns", AST.JobID, 10, "", "")] + AST_AOE_LazyLord = 1046, + + [ParentCombo(AST_AOE_DPS)] + [CustomComboInfo("Oracle Option", "Adds Oracle after Divination", AST.JobID)] + AST_AOE_Oracle = 1047, + #endregion #region Healing @@ -280,7 +315,7 @@ public enum CustomComboPreset AST_Raise_Alternative = 1003, [Variant] - [VariantParent(AST_ST_DPS_CombustUptime, AST_AoE_DPS)] + [VariantParent(AST_ST_DPS_CombustUptime)] [CustomComboInfo("Spirit Dart Option", "Use Variant Spirit Dart whenever the debuff is not present or less than 3s.", AST.JobID)] AST_Variant_SpiritDart = 1035, @@ -300,7 +335,7 @@ public enum CustomComboPreset AST_Cards_QuickTargetCards_TargetExtra = 1031, #endregion - // Last value = 1039 + // Last value = 1048 #endregion diff --git a/XIVSlothCombo/Combos/PvE/AST.cs b/XIVSlothCombo/Combos/PvE/AST.cs index 6eee0f15d..023c0e3ae 100644 --- a/XIVSlothCombo/Combos/PvE/AST.cs +++ b/XIVSlothCombo/Combos/PvE/AST.cs @@ -138,10 +138,12 @@ public static UserInt AST_ST_SimpleHeals_Esuna = new("AST_ST_SimpleHeals_Esuna", 100), AST_DPS_AltMode = new("AST_DPS_AltMode"), AST_DPS_DivinationOption = new("AST_DPS_DivinationOption"), + AST_AOE_DivinationOption = new("AST_AOE_DivinationOption"), AST_DPS_LightSpeedOption = new("AST_DPS_LightSpeedOption"), + AST_AOE_LightSpeedOption = new("AST_AOE_LightSpeedOption"), AST_DPS_CombustOption = new("AST_DPS_CombustOption"), AST_QuickTarget_Override = new("AST_QuickTarget_Override"), - AST_ST_DPS_Play_SpeedSetting = new("AST_ST_DPS_Play_SpeedSetting"); + AST_ST_DPS_Play_SpeedSetting = new("AST_ST_DPS_Play_SpeedSetting"); public static UserBool AST_QuickTarget_SkipDamageDown = new("AST_QuickTarget_SkipDamageDown"), AST_QuickTarget_SkipRezWeakness = new("AST_QuickTarget_SkipRezWeakness"), @@ -156,11 +158,12 @@ public static UserBool AST_AoE_SimpleHeals_Opposition = new("AST_AoE_SimpleHeals_Opposition"), AST_AoE_SimpleHeals_Horoscope = new("AST_AoE_SimpleHeals_Horoscope"), AST_ST_DPS_OverwriteCards = new("AST_ST_DPS_OverwriteCards"), + AST_AOE_DPS_OverwriteCards = new("AST_AOE_DPS_OverwriteCards"), AST_ST_DPS_CombustUptime_Adv = new("AST_ST_DPS_CombustUptime_Adv"); public static UserFloat AST_ST_DPS_CombustUptime_Threshold = new("AST_ST_DPS_CombustUptime_Threshold"); } - + internal class AST_Benefic : CustomCombo { @@ -181,6 +184,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim internal class AST_ST_DPS : CustomCombo { protected internal override CustomComboPreset Preset { get; } = CustomComboPreset.AST_ST_DPS; + internal static int MaleficCount => ActionWatching.CombatActions.Count(x => x == OriginalHook(Malefic)); + internal static int CombustCount => ActionWatching.CombatActions.Count(x => x == OriginalHook(Combust)); protected override uint Invoke(uint actionID, uint lastComboMove, float comboTime, byte level) { @@ -192,23 +197,25 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { spellsSinceDraw = 1; } - + bool AlternateMode = GetIntOptionAsBool(Config.AST_DPS_AltMode); //(0 or 1 radio values) + bool inOpener = IsEnabled(CustomComboPreset.AST_ST_DPS_Opener) && MaleficCount < 6; + + // Out of combat Card Draw if (((!AlternateMode && MaleficList.Contains(actionID)) || - (AlternateMode && CombustList.ContainsKey(actionID)) || - (IsEnabled(CustomComboPreset.AST_AoE_DPS) && GravityList.Contains(actionID))) && - !InCombat()) + (AlternateMode && CombustList.ContainsKey(actionID)) && + !InCombat())) if (IsEnabled(CustomComboPreset.AST_DPS_AutoDraw) && - ActionReady(OriginalHook(AstralDraw)) && !InCombat()) + ActionReady(OriginalHook(AstralDraw)) && (Gauge.DrawnCards.All(x => x is CardType.NONE) || (DrawnCard == CardType.NONE && Config.AST_ST_DPS_OverwriteCards))) return OriginalHook(AstralDraw); + //In combat if (((!AlternateMode && MaleficList.Contains(actionID)) || - (AlternateMode && CombustList.ContainsKey(actionID)) || - (IsEnabled(CustomComboPreset.AST_AoE_DPS) && GravityList.Contains(actionID))) && - InCombat()) + (AlternateMode && CombustList.ContainsKey(actionID))) && + InCombat()) { - + //Variant stuff if (IsEnabled(CustomComboPreset.AST_Variant_Rampart) && IsEnabled(Variant.VariantRampart) && IsOffCooldown(Variant.VariantRampart) && @@ -219,10 +226,65 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsEnabled(CustomComboPreset.AST_Variant_SpiritDart) && IsEnabled(Variant.VariantSpiritDart) && (sustainedDamage is null || sustainedDamage?.RemainingTime <= 3) && - CanSpellWeave(actionID) && - IsEnabled(CustomComboPreset.AST_AoE_DPS) && GravityList.Contains(actionID)) + CanSpellWeave(actionID)) return Variant.VariantSpiritDart; + //Opener + if (inOpener) + { + if (MaleficCount == 0) + return OriginalHook(Malefic); + + if (MaleficCount == 1 && CombustCount == 0) + return OriginalHook(Combust); + + if (MaleficCount == 1 && (CombustCount == 1) && ActionReady(Lightspeed) && CanDelayedWeave(actionID)) + return OriginalHook(Lightspeed); + + if (MaleficCount == 3 && CanWeave(actionID)) + { + if (IsEnabled(CustomComboPreset.AST_DPS_Divination) && + ActionReady(Divination) && + !HasEffectAny(Buffs.Divination) && //Overwrite protection + GetTargetHPPercent() > Config.AST_DPS_DivinationOption && + CanWeave(actionID)) + return Divination; + + if (IsEnabled(CustomComboPreset.AST_DPS_AutoPlay) && + ActionReady(Play1) && + Gauge.DrawnCards[0] is not CardType.NONE) + return OriginalHook(Play1); + } + + if (MaleficCount == 4 && CanWeave(actionID)) + { + if (ActionReady(OriginalHook(MinorArcana)) && + IsEnabled(CustomComboPreset.AST_DPS_LazyLord) && Gauge.DrawnCrownCard is CardType.LORD && + HasBattleTarget()) + return OriginalHook(MinorArcana); + + if (IsEnabled(CustomComboPreset.AST_DPS_AutoDraw) && Gauge.DrawnCrownCard is not CardType.LORD && CanDelayedWeave(actionID)) + return OriginalHook(AstralDraw); + } + if (MaleficCount == 5 && CanWeave(actionID)) + { + if (IsEnabled(CustomComboPreset.AST_DPS_AutoPlay) && + ActionReady(Play1) && + Gauge.DrawnCards[0] is not CardType.NONE) + return OriginalHook(Play1); + + if (IsEnabled(CustomComboPreset.AST_DPS_Oracle) && + HasEffect(Buffs.Divining) && + CanSpellWeave(actionID)) + return Oracle; + } + + if (MaleficCount > 0) + return OriginalHook(Malefic); + } + + //End opener + if (IsEnabled(CustomComboPreset.AST_DPS_LightSpeed) && ActionReady(Lightspeed) && GetTargetHPPercent() > Config.AST_DPS_LightSpeedOption && @@ -306,7 +368,94 @@ Gauge.DrawnCards[0] is not CardType.NONE && return actionID; } } + internal class AST_AOE_DPS : CustomCombo + { + protected internal override CustomComboPreset Preset { get; } = CustomComboPreset.AST_ST_DPS; + protected override uint Invoke(uint actionID, uint lastComboMove, float comboTime, byte level) + { + int spellsSinceDraw = ActionWatching.CombatActions.Any(x => x == OriginalHook(AstralDraw)) ? ActionWatching.HowManyTimesUsedAfterAnotherAction(OriginalHook(Malefic), OriginalHook(AstralDraw)) + + ActionWatching.HowManyTimesUsedAfterAnotherAction(OriginalHook(Combust), OriginalHook(AstralDraw)) + + ActionWatching.HowManyTimesUsedAfterAnotherAction(OriginalHook(Gravity), OriginalHook(AstralDraw)) : Config.AST_ST_DPS_Play_SpeedSetting; + + if (spellsSinceDraw == 0 && DrawnCard != CardType.NONE) + { + spellsSinceDraw = 1; + } + + bool AlternateMode = GetIntOptionAsBool(Config.AST_DPS_AltMode); //(0 or 1 radio values) + + + + if (IsEnabled(CustomComboPreset.AST_AOE_DPS) && GravityList.Contains(actionID) && + InCombat()) + { + //Variant stuff + if (IsEnabled(CustomComboPreset.AST_Variant_Rampart) && + IsEnabled(Variant.VariantRampart) && + IsOffCooldown(Variant.VariantRampart) && + CanSpellWeave(actionID)) + return Variant.VariantRampart; + Status? sustainedDamage = FindTargetEffect(Variant.Debuffs.SustainedDamage); + if (IsEnabled(CustomComboPreset.AST_Variant_SpiritDart) && + IsEnabled(Variant.VariantSpiritDart) && + (sustainedDamage is null || sustainedDamage?.RemainingTime <= 3) && + CanSpellWeave(actionID) && + IsEnabled(CustomComboPreset.AST_AOE_DPS) && GravityList.Contains(actionID)) + return Variant.VariantSpiritDart; + + if (IsEnabled(CustomComboPreset.AST_AOE_LightSpeed) && + ActionReady(Lightspeed) && + GetTargetHPPercent() > Config.AST_AOE_LightSpeedOption && + IsMoving && + !HasEffect(Buffs.Lightspeed)) + return Lightspeed; + + if (IsEnabled(CustomComboPreset.AST_AOE_Lucid) && + ActionReady(All.LucidDreaming) && + LocalPlayer.CurrentMp <= Config.AST_LucidDreaming && + CanSpellWeave(actionID)) + return All.LucidDreaming; + + //Play Card + if (IsEnabled(CustomComboPreset.AST_AOE_AutoPlay) && + ActionReady(Play1) && + Gauge.DrawnCards[0] is not CardType.NONE && + CanSpellWeave(actionID)) + return OriginalHook(Play1); + + //Card Draw + if (IsEnabled(CustomComboPreset.AST_AOE_AutoDraw) && + ActionReady(OriginalHook(AstralDraw)) && + (Gauge.DrawnCards.All(x => x is CardType.NONE) || (DrawnCard == CardType.NONE && Config.AST_AOE_DPS_OverwriteCards)) && + CanDelayedWeave(actionID)) + return OriginalHook(AstralDraw); + + //Divination + if (IsEnabled(CustomComboPreset.AST_AOE_Divination) && + ActionReady(Divination) && + !HasEffectAny(Buffs.Divination) && //Overwrite protection + GetTargetHPPercent() > Config.AST_AOE_DivinationOption && + CanDelayedWeave(actionID) && + ActionWatching.NumberOfGcdsUsed >= 3) + return Divination; + + if (IsEnabled(CustomComboPreset.AST_AOE_Oracle) && + HasEffect(Buffs.Divining) && + CanSpellWeave(actionID)) + return Oracle; + + //Minor Arcana / Lord of Crowns + if (ActionReady(OriginalHook(MinorArcana)) && + IsEnabled(CustomComboPreset.AST_AOE_LazyLord) && Gauge.DrawnCrownCard is CardType.LORD && + HasBattleTarget() && + CanDelayedWeave(actionID)) + return OriginalHook(MinorArcana); + + } + return actionID; + } + } internal class AST_AoE_SimpleHeals_AspectedHelios : CustomCombo { protected internal override CustomComboPreset Preset { get; } = CustomComboPreset.AST_AoE_SimpleHeals_AspectedHelios; diff --git a/XIVSlothCombo/Window/Functions/UserConfig.cs b/XIVSlothCombo/Window/Functions/UserConfig.cs index 48b15561e..aef1d341f 100644 --- a/XIVSlothCombo/Window/Functions/UserConfig.cs +++ b/XIVSlothCombo/Window/Functions/UserConfig.cs @@ -1226,6 +1226,21 @@ internal static void Draw(CustomComboPreset preset, bool enabled) if (preset is CustomComboPreset.AST_DPS_LightSpeed) UserConfig.DrawSliderInt(0, 100, AST.Config.AST_DPS_LightSpeedOption, "Stop using at Enemy HP %. Set to Zero to disable this check."); + //AOE added + if (preset is CustomComboPreset.AST_AOE_Lucid) + UserConfig.DrawSliderInt(4000, 9500, AST.Config.AST_LucidDreaming, "Set value for your MP to be at or under for this feature to work", 150, SliderIncrements.Hundreds); + + if (preset is CustomComboPreset.AST_AOE_Divination) + UserConfig.DrawSliderInt(0, 100, AST.Config.AST_AOE_DivinationOption, "Stop using at Enemy HP %. Set to Zero to disable this check."); + + if (preset is CustomComboPreset.AST_AOE_LightSpeed) + UserConfig.DrawSliderInt(0, 100, AST.Config.AST_AOE_LightSpeedOption, "Stop using at Enemy HP %. Set to Zero to disable this check."); + + if (preset is CustomComboPreset.AST_AOE_AutoDraw) + { + UserConfig.DrawAdditionalBoolChoice(AST.Config.AST_AOE_DPS_OverwriteCards, "Overwrite Non-DPS Cards", "Will draw even if you have healing cards remaining."); + } + //end aoe added if (preset is CustomComboPreset.AST_ST_SimpleHeals) { From aad23c0e42f87f6c444f619fa9a1c27e0fff7dca Mon Sep 17 00:00:00 2001 From: edewen Date: Sun, 28 Jul 2024 11:25:53 -0400 Subject: [PATCH 4/6] Adding Bole/arrow to STheal also fixed card weave option wording. --- XIVSlothCombo/Combos/CustomComboPreset.cs | 18 +++++++++++++----- XIVSlothCombo/Combos/PvE/AST.cs | 18 ++++++++++++++++++ XIVSlothCombo/Window/Functions/UserConfig.cs | 10 ++++++++++ 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index 98bda3577..827ec52ee 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -201,7 +201,7 @@ public enum CustomComboPreset AST_DPS_AutoDraw = 1011, [ParentCombo(AST_ST_DPS)] - [CustomComboInfo("Card Play Weave Option", "Weaves your Balance or Arrow card (best used with Quick Target Cards)", AST.JobID, 6)] + [CustomComboInfo("Card Play Weave Option", "Weaves your Balance or Spear card (best used with Quick Target Cards)", AST.JobID, 6)] AST_DPS_AutoPlay = 1037, [ParentCombo(AST_ST_DPS)] @@ -240,7 +240,7 @@ public enum CustomComboPreset AST_AOE_AutoDraw = 1044, [ParentCombo(AST_AOE_DPS)] - [CustomComboInfo("Card Play Weave Option", "Weaves your Balance or Arrow card (best used with Quick Target Cards)", AST.JobID, 6)] + [CustomComboInfo("Card Play Weave Option", "Weaves your Balance or Spear card (best used with Quick Target Cards)", AST.JobID, 6)] AST_AOE_AutoPlay = 1045, [ParentCombo(AST_AOE_DPS)] @@ -279,13 +279,21 @@ public enum CustomComboPreset AST_ST_SimpleHeals_Exaltation = 1028, [ParentCombo(AST_ST_SimpleHeals)] - [CustomComboInfo("The Spire Option", "Adds The Spire when the card has been drawn", AST.JobID)] + [CustomComboInfo("The Spire Option", "Adds The Spire (Shield) when the card has been drawn", AST.JobID)] AST_ST_SimpleHeals_Spire = 1030, [ParentCombo(AST_ST_SimpleHeals)] - [CustomComboInfo("The Ewer Option", "Adds The Ewer when the card has been drawn", AST.JobID)] + [CustomComboInfo("The Ewer Option", "Adds The Ewer (Heal over time) when the card has been drawn", AST.JobID)] AST_ST_SimpleHeals_Ewer = 1032, + [ParentCombo(AST_ST_SimpleHeals)] + [CustomComboInfo("The Arrow Option", "Adds The Arrow (increased healing) when the card has been drawn", AST.JobID)] + AST_ST_SimpleHeals_Arrow = 1049, + + [ParentCombo(AST_ST_SimpleHeals)] + [CustomComboInfo("The Bole Option", "Adds The Bole (Reduced Damage) when the card has been drawn", AST.JobID)] + AST_ST_SimpleHeals_Bole = 1050, + [ReplaceSkill(AST.AspectedHelios)] [CustomComboInfo("Simple Heals (AoE)", "Replaces Aspected Helios with a one button healing replacement.", AST.JobID, 3, "", "")] AST_AoE_SimpleHeals_AspectedHelios = 1010, @@ -335,7 +343,7 @@ public enum CustomComboPreset AST_Cards_QuickTargetCards_TargetExtra = 1031, #endregion - // Last value = 1048 + // Last value = 1050 #endregion diff --git a/XIVSlothCombo/Combos/PvE/AST.cs b/XIVSlothCombo/Combos/PvE/AST.cs index 023c0e3ae..ecd850aec 100644 --- a/XIVSlothCombo/Combos/PvE/AST.cs +++ b/XIVSlothCombo/Combos/PvE/AST.cs @@ -135,6 +135,8 @@ public static UserInt AST_EssentialDignity = new("ASTCustomEssentialDignity", 50), AST_Spire = new("AST_Spire", 80), AST_Ewer = new("AST_Ewer", 80), + AST_Arrow = new("AST_Arrow", 80), + AST_Bole = new("AST_Bole", 80), AST_ST_SimpleHeals_Esuna = new("AST_ST_SimpleHeals_Esuna", 100), AST_DPS_AltMode = new("AST_DPS_AltMode"), AST_DPS_DivinationOption = new("AST_DPS_DivinationOption"), @@ -153,6 +155,8 @@ public static UserBool AST_ST_SimpleHeals_WeaveIntersection = new("AST_ST_SimpleHeals_WeaveIntersection"), AST_ST_SimpleHeals_WeaveEwer = new("AST_ST_SimpleHeals_WeaveEwer"), AST_ST_SimpleHeals_WeaveSpire = new("AST_ST_SimpleHeals_WeaveSpire"), + AST_ST_SimpleHeals_WeaveArrow = new("AST_ST_SimpleHeals_WeaveArrow"), + AST_ST_SimpleHeals_WeaveBole = new("AST_ST_SimpleHeals_WeaveBole"), AST_ST_SimpleHeals_WeaveExalt = new("AST_ST_SimpleHeals_WeaveExalt"), AST_AoE_SimpleHeals_WeaveLady = new("AST_AoE_SimpleHeals_WeaveLady"), AST_AoE_SimpleHeals_Opposition = new("AST_AoE_SimpleHeals_Opposition"), @@ -525,6 +529,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim var canExalt = (Config.AST_ST_SimpleHeals_WeaveExalt && CanSpellWeave(actionID)) || !Config.AST_ST_SimpleHeals_WeaveExalt; var canEwer = (Config.AST_ST_SimpleHeals_WeaveEwer && CanSpellWeave(actionID)) || !Config.AST_ST_SimpleHeals_WeaveEwer; var canSpire = (Config.AST_ST_SimpleHeals_WeaveSpire && CanSpellWeave(actionID)) || !Config.AST_ST_SimpleHeals_WeaveSpire; + var canBole = (Config.AST_ST_SimpleHeals_WeaveBole && CanSpellWeave(actionID)) || !Config.AST_ST_SimpleHeals_WeaveBole; + var canArrow = (Config.AST_ST_SimpleHeals_WeaveArrow && CanSpellWeave(actionID)) || !Config.AST_ST_SimpleHeals_WeaveArrow; //Grab our target (Soft->Hard->Self) IGameObject? healTarget = GetHealTarget(Config.AST_ST_SimpleHeals_Adv && Config.AST_ST_SimpleHeals_UIMouseOver); @@ -546,6 +552,18 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim canEwer) return OriginalHook(Play3); + if (IsEnabled(CustomComboPreset.AST_ST_SimpleHeals_Arrow) && + Gauge.DrawnCards[1] == CardType.ARROW && + GetTargetHPPercent(healTarget) <= Config.AST_Arrow && + canArrow) + return OriginalHook(Play2); + + if (IsEnabled(CustomComboPreset.AST_ST_SimpleHeals_Bole) && + Gauge.DrawnCards[1] == CardType.BOLE && + GetTargetHPPercent(healTarget) <= Config.AST_Bole && + canBole) + return OriginalHook(Play2); + if (IsEnabled(CustomComboPreset.AST_ST_SimpleHeals_EssentialDignity) && ActionReady(EssentialDignity) && GetTargetHPPercent(healTarget) <= Config.AST_EssentialDignity && diff --git a/XIVSlothCombo/Window/Functions/UserConfig.cs b/XIVSlothCombo/Window/Functions/UserConfig.cs index aef1d341f..666b4f848 100644 --- a/XIVSlothCombo/Window/Functions/UserConfig.cs +++ b/XIVSlothCombo/Window/Functions/UserConfig.cs @@ -1277,6 +1277,16 @@ internal static void Draw(CustomComboPreset preset, bool enabled) UserConfig.DrawSliderInt(0, 100, AST.Config.AST_Ewer, "Set percentage value"); UserConfig.DrawAdditionalBoolChoice(AST.Config.AST_ST_SimpleHeals_WeaveEwer, "Only Weave", "Will only weave this action."); } + if (preset is CustomComboPreset.AST_ST_SimpleHeals_Bole) + { + UserConfig.DrawSliderInt(0, 100, AST.Config.AST_Bole, "Set percentage value"); + UserConfig.DrawAdditionalBoolChoice(AST.Config.AST_ST_SimpleHeals_WeaveBole, "Only Weave", "Will only weave this action."); + } + if (preset is CustomComboPreset.AST_ST_SimpleHeals_Arrow) + { + UserConfig.DrawSliderInt(0, 100, AST.Config.AST_Arrow, "Set percentage value"); + UserConfig.DrawAdditionalBoolChoice(AST.Config.AST_ST_SimpleHeals_WeaveArrow, "Only Weave", "Will only weave this action."); + } if (preset is CustomComboPreset.AST_ST_SimpleHeals_Esuna) UserConfig.DrawSliderInt(0, 100, AST.Config.AST_ST_SimpleHeals_Esuna, "Stop using when below HP %. Set to Zero to disable this check"); From e37fa1eb16aba7f356b85e5318fd2feb2282568f Mon Sep 17 00:00:00 2001 From: edewen Date: Fri, 2 Aug 2024 13:41:36 -0400 Subject: [PATCH 5/6] Changed the Druo to tauro combo into tauro to druo to fix overcap bug Druo turning into tauro was creating issues with overcap using 2 charges. This change lets tauro change to druo when on cd, allowing overcap to only use druo, not use 2 charges at once, and as a healer lets it function better not wasting the 10% dr. --- XIVSlothCombo/Combos/CustomComboPreset.cs | 6 +++--- XIVSlothCombo/Combos/PvE/SGE.cs | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index 827ec52ee..0bc18cde4 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -3092,9 +3092,9 @@ The three digets after RDM.JobID can be used to reorder items in the list [CustomComboInfo("Rhizomata Feature", "Replaces Addersgall skills with Rhizomata when empty.", SGE.JobID, 600, "", "")] SGE_Rhizo = 14037, - [ReplaceSkill(SGE.Druochole)] - [CustomComboInfo("Druochole to Taurochole Feature", "Upgrades Druochole to Taurochole when Taurochole is available.", SGE.JobID, 700, "", "")] - SGE_DruoTauro = 14038, + [ReplaceSkill(SGE.Taurochole)] + [CustomComboInfo("Taurochole to Druochole Feature", "Turns Taurochole to Druochole when Taurochole is on cooldown.", SGE.JobID, 700, "", "")] + SGE_TauroDruo = 14038, [ReplaceSkill(SGE.Pneuma)] [CustomComboInfo("Zoe Pneuma Feature", "Places Zoe on top of Pneuma when both actions are on cooldown.", SGE.JobID, 701, "", "")] //Temporary to keep the order diff --git a/XIVSlothCombo/Combos/PvE/SGE.cs b/XIVSlothCombo/Combos/PvE/SGE.cs index e939b4b3b..aa258254b 100644 --- a/XIVSlothCombo/Combos/PvE/SGE.cs +++ b/XIVSlothCombo/Combos/PvE/SGE.cs @@ -187,9 +187,9 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim */ internal class SGE_DruoTauro : CustomCombo { - protected internal override CustomComboPreset Preset { get; } = CustomComboPreset.SGE_DruoTauro; + protected internal override CustomComboPreset Preset { get; } = CustomComboPreset.SGE_TauroDruo; protected override uint Invoke(uint actionID, uint lastComboMove, float comboTime, byte level) - => actionID is Druochole && ActionReady(Taurochole) ? Taurochole : actionID; + => actionID is Taurochole && IsOnCooldown(Taurochole) ? Druochole : actionID; } /* From 95c1d88b3c0614ccee1bf5d92b37a0da4e2b4c96 Mon Sep 17 00:00:00 2001 From: edewen Date: Tue, 6 Aug 2024 13:31:20 -0400 Subject: [PATCH 6/6] Fix opener to hold chain till 2nd gcd Switched post opener state to a broil count. This allows it to hold CS to the 2nd gcd both with and without dissapate opener selected. added data and linq at top to make count work bc it told me to. --- XIVSlothCombo/Combos/PvE/SCH.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/SCH.cs b/XIVSlothCombo/Combos/PvE/SCH.cs index 3b5113bbf..de980f91e 100644 --- a/XIVSlothCombo/Combos/PvE/SCH.cs +++ b/XIVSlothCombo/Combos/PvE/SCH.cs @@ -5,6 +5,8 @@ using XIVSlothCombo.Combos.PvE.Content; using XIVSlothCombo.CustomComboNS; using XIVSlothCombo.CustomComboNS.Functions; +using XIVSlothCombo.Data; +using System.Linq; using XIVSlothCombo.Extensions; namespace XIVSlothCombo.Combos.PvE @@ -312,6 +314,7 @@ internal class SCH_DPS : CustomCombo protected internal override CustomComboPreset Preset { get; } = CustomComboPreset.SCH_DPS; internal OpenerState openerState = OpenerState.PreOpener; + internal static int BroilCount => ActionWatching.CombatActions.Count(x => x == OriginalHook(Broil)); protected override uint Invoke(uint actionID, uint lastComboMove, float comboTime, byte level) { @@ -334,7 +337,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { openerState = OpenerState.PreOpener; } - else if (Gauge.HasAetherflow()) + else if (BroilCount > 1) { openerState = OpenerState.PostOpener; } @@ -388,7 +391,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { // If CS is available and usable, or if the Impact Buff is on Player if (ActionReady(ChainStratagem) && - !TargetHasEffectAny(Debuffs.ChainStratagem) && + !TargetHasEffectAny(Debuffs.ChainStratagem) && (openerState == OpenerState.PostOpener) && GetTargetHPPercent() > Config.SCH_ST_DPS_ChainStratagemOption && InCombat() && CanSpellWeave(actionID))