From e5ee28ecb2fdce91151daa07944c35e3ff3d16fa Mon Sep 17 00:00:00 2001 From: Genesis <12591123+Genesis-Nova@users.noreply.github.com> Date: Sun, 30 Jun 2024 15:20:10 -0500 Subject: [PATCH 1/8] Initial addition of SMN updates/changes. Added new abilities to Simple and Advanced Summoner. Added Searing Flash combo option toggle for advanced summoner. Tweaked some combo IDs due to old typo since we're resetting configs anyways. (I do gotta be like that K) --- XIVSlothCombo/Combos/CustomComboPreset.cs | 8 +- XIVSlothCombo/Combos/PvE/SMN.cs | 124 +++++++++++++++------- XIVSlothCombo/XIVSlothCombo.cs | 2 +- 3 files changed, 94 insertions(+), 40 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index 66dcd648f..ede65a2a9 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -3356,11 +3356,15 @@ New features should be added to the appropriate sections. [ParentCombo(SMN_Advanced_Combo)] [CustomComboInfo("Searing Light Combo Option", "Adds Searing Light to the single target and AoE combos.\nWill be used on cooldown.", SMN.JobID, 9, "", "")] - SMN_SearingLight = 17018, + SMN_SearingLight = 17017, [ParentCombo(SMN_SearingLight)] [CustomComboInfo("Searing Light Burst Option", "Casts Searing Light only during Demi phases.\nReflects Demi choice selected under 'Pooled oGCDs Option'.\nNot recommended for SpS Builds.", SMN.JobID, 0, "")] - SMN_SearingLight_Burst = 170181, // Genesis, why must you be like this -K + SMN_SearingLight_Burst = 17018, + + [ParentCombo(SMN_SearingLight)] + [CustomComboInfo("Searing Flash Combo Option", "Adds Searing Flash to the single target and AoE combos.", SMN.JobID, 1, "", "")] + SMN_SearingFlash = 17019, [ParentCombo(SMN_Advanced_Combo)] [CustomComboInfo("Demi Summons Combo Option", "Adds Demi summons to the single target and AoE combos.", SMN.JobID, 10, "", "")] diff --git a/XIVSlothCombo/Combos/PvE/SMN.cs b/XIVSlothCombo/Combos/PvE/SMN.cs index 951338d4b..9ea878f1e 100644 --- a/XIVSlothCombo/Combos/PvE/SMN.cs +++ b/XIVSlothCombo/Combos/PvE/SMN.cs @@ -71,6 +71,7 @@ public const uint // Demi summons SummonBahamut = 7427, SummonPhoenix = 25831, + SummonSolarBahamut = 36992, // Demi summon abilities AstralImpulse = 25820, // Single target Bahamut GCD @@ -82,6 +83,12 @@ public const uint BrandOfPurgatory = 16515, // AoE Phoenix GCD Rekindle = 25830, // Healing oGCD Phoenix EnkindlePhoenix = 16516, + + UmbralImpulse = 36994, //Single target Solar Bahamut GCD + UmbralFlare = 36995, //AoE Solar Bahamut GCD + Sunflare = 36996, //Damage oGCD Solar Bahamut + EnkindleSolarBahamut = 36998, + LuxSolaris = 36997, //Healing oGCD Solar Bahamut // Shared summon abilities AstralFlow = 25822, @@ -103,6 +110,7 @@ public const uint Fester = 181, EnergySiphon = 16510, Painflare = 3578, + SearingFlash = 36991, // Revive Resurrection = 173, @@ -121,7 +129,9 @@ public const ushort TitansFavor = 2853, IfritsFavor = 2724, EverlastingFlight = 16517, - SearingLight = 2703; + SearingLight = 2703, + RubysGlimmer = 3873, + RefulgentLux = 3874; } public static class Config @@ -229,6 +239,12 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim var gauge = GetJobGauge(); var STCombo = actionID is Ruin or Ruin2; var AoECombo = actionID is Outburst or Tridisaster; + var IsGarudaAttuned = OriginalHook(Gemshine) is EmeralRuin1 or EmeralRuin2 or EmeralRuin3 or EmeraldRite; + var IsTitanAttuned = OriginalHook(Gemshine) is TopazRuin1 or TopazRuin2 or TopazRuin3 or TopazRite; + var IsIfritAttuned = OriginalHook(Gemshine) is RubyRuin1 or RubyRuin2 or RubyRuin3 or RubyRite; + var IsBahamutReady = OriginalHook(Aethercharge) is SummonBahamut; + var IsPhoenixReady = OriginalHook(Aethercharge) is SummonPhoenix; + var IsSolarBahamutReady = OriginalHook(Aethercharge) is SummonSolarBahamut; if (actionID is Ruin or Ruin2 or Outburst or Tridisaster) { @@ -243,7 +259,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (CanSpellWeave(actionID)) { - if (IsOffCooldown(SearingLight) && LevelChecked(SearingLight) && OriginalHook(Ruin) == AstralImpulse) + if (IsOffCooldown(SearingLight) && LevelChecked(SearingLight) && (!LevelChecked(SummonSolarBahamut) && OriginalHook(Ruin) is AstralImpulse || OriginalHook(Ruin) is UmbralImpulse)) return SearingLight; if (!gauge.HasAetherflowStacks && IsOffCooldown(EnergyDrain)) @@ -255,16 +271,22 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return EnergySiphon; } - if (OriginalHook(Ruin) is AstralImpulse or FountainOfFire) + if (HasEffect(Buffs.RubysGlimmer) && LevelChecked(SearingFlash)) + return SearingFlash; + + if (OriginalHook(Ruin) is AstralImpulse or UmbralImpulse or FountainOfFire) { if (IsOffCooldown(OriginalHook(EnkindleBahamut)) && LevelChecked(SummonBahamut)) return OriginalHook(EnkindleBahamut); - if (IsOffCooldown(Deathflare) && LevelChecked(Deathflare) && OriginalHook(Ruin) is AstralImpulse) + if (IsOffCooldown(Deathflare) && LevelChecked(Deathflare) && OriginalHook(Ruin) is AstralImpulse or UmbralImpulse) return OriginalHook(AstralFlow); if (IsOffCooldown(Rekindle) && OriginalHook(Ruin) is FountainOfFire) return OriginalHook(AstralFlow); + + if (IsOffCooldown(LuxSolaris) && HasEffect(Buffs.RefulgentLux)) + return OriginalHook(LuxSolaris); } if (gauge.HasAetherflowStacks && CanSpellWeave(actionID)) @@ -272,7 +294,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (!LevelChecked(SearingLight)) { if (STCombo) - return Fester; + return OriginalHook(Fester); if (AoECombo && LevelChecked(Painflare)) return Painflare; @@ -281,7 +303,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (HasEffect(Buffs.SearingLight)) { if (STCombo) - return Fester; + return OriginalHook(Fester); if (AoECombo && LevelChecked(Painflare)) return Painflare; @@ -302,18 +324,18 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { if (LevelChecked(Slipstream) && HasEffect(Buffs.GarudasFavor)) { - if (CanSpellWeave(actionID) && gauge.IsGarudaAttuned && IsOffCooldown(All.Swiftcast)) + if (CanSpellWeave(actionID) && IsGarudaAttuned && IsOffCooldown(All.Swiftcast)) return All.Swiftcast; if (HasEffect(Buffs.GarudasFavor) && HasEffect(All.Buffs.Swiftcast)) return OriginalHook(AstralFlow); } - if (gauge.IsIfritAttuned && gauge.Attunement >= 1 && IsOffCooldown(All.Swiftcast)) + if (IsIfritAttuned && gauge.Attunement >= 1 && IsOffCooldown(All.Swiftcast)) return All.Swiftcast; } - if (gauge.IsIfritAttuned && gauge.Attunement >= 1 && HasEffect(All.Buffs.Swiftcast) && lastComboMove is not CrimsonCyclone) + if (IsIfritAttuned && gauge.Attunement >= 1 && HasEffect(All.Buffs.Swiftcast) && lastComboMove is not CrimsonCyclone) { if (STCombo) return OriginalHook(Gemshine); @@ -324,13 +346,13 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if ((HasEffect(Buffs.GarudasFavor) && gauge.Attunement is 0) || (HasEffect(Buffs.TitansFavor) && lastComboMove is TopazRite or TopazCata && CanSpellWeave(actionID)) || - (HasEffect(Buffs.IfritsFavor) && (IsMoving || gauge.Attunement is 0)) || lastComboMove == CrimsonCyclone) + (HasEffect(Buffs.IfritsFavor) && (IsMoving || gauge.Attunement is 0)) || (lastComboMove == CrimsonCyclone && InMeleeRange())) return OriginalHook(AstralFlow); - if (HasEffect(Buffs.FurtherRuin) && ((!HasEffect(All.Buffs.Swiftcast) && gauge.IsIfritAttuned && IsMoving) || (GetCooldownRemainingTime(OriginalHook(Aethercharge)) is < 2.5f and > 0))) + if (HasEffect(Buffs.FurtherRuin) && ((!HasEffect(All.Buffs.Swiftcast) && IsIfritAttuned && IsMoving) || (GetCooldownRemainingTime(OriginalHook(Aethercharge)) is < 2.5f and > 0))) return Ruin4; - if (gauge.IsGarudaAttuned || gauge.IsTitanAttuned || gauge.IsIfritAttuned) + if (IsGarudaAttuned || IsTitanAttuned || IsIfritAttuned) { if (STCombo) return OriginalHook(Gemshine); @@ -375,6 +397,12 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim var inOpener = CombatEngageDuration().TotalSeconds < 40; var STCombo = actionID is Ruin or Ruin2; var AoECombo = actionID is Outburst or Tridisaster; + var IsGarudaAttuned = OriginalHook(Gemshine) is EmeralRuin1 or EmeralRuin2 or EmeralRuin3 or EmeraldRite; + var IsTitanAttuned = OriginalHook(Gemshine) is TopazRuin1 or TopazRuin2 or TopazRuin3 or TopazRite; + var IsIfritAttuned = OriginalHook(Gemshine) is RubyRuin1 or RubyRuin2 or RubyRuin3 or RubyRite; + var IsBahamutReady = OriginalHook(Aethercharge) is SummonBahamut; + var IsPhoenixReady = OriginalHook(Aethercharge) is SummonPhoenix; + var IsSolarBahamutReady = OriginalHook(Aethercharge) is SummonSolarBahamut; if (WasLastAction(OriginalHook(Aethercharge))) DemiAttackCount = 0; // Resets counter @@ -385,7 +413,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (gauge.SummonTimerRemaining == 0 && !InCombat()) DemiAttackCount = 0; //CHECK_DEMIATTACK_USE - if (UsedDemiAttack == false && lastComboMove is AstralImpulse or FountainOfFire or AstralFlare or BrandOfPurgatory && DemiAttackCount is not 6 && GetCooldownRemainingTime(AstralImpulse) > 1) + if (UsedDemiAttack == false && lastComboMove is AstralImpulse or UmbralImpulse or FountainOfFire or AstralFlare or UmbralFlare or BrandOfPurgatory && DemiAttackCount is not 6 && GetCooldownRemainingTime(AstralImpulse) > 1) { UsedDemiAttack = true; // Registers that a Demi Attack was used and blocks further incrementation of DemiAttackCountCount DemiAttackCount++; // Increments DemiAttack counter @@ -412,28 +440,27 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { if (IsEnabled(CustomComboPreset.SMN_SearingLight_Burst)) { - if ((SummonerBurstPhase is 0 or 1 && OriginalHook(Ruin) == AstralImpulse) || + if ((SummonerBurstPhase is 0 or 1 && OriginalHook(Ruin) is AstralImpulse or UmbralImpulse) || (SummonerBurstPhase == 2 && OriginalHook(Ruin) == FountainOfFire) || - (SummonerBurstPhase == 3 && OriginalHook(Ruin) is AstralImpulse or FountainOfFire) || + (SummonerBurstPhase == 3 && OriginalHook(Ruin) is AstralImpulse or UmbralImpulse or FountainOfFire) || (SummonerBurstPhase == 4)) { if (STCombo || (AoECombo && IsNotEnabled(CustomComboPreset.SMN_SearingLight_STOnly))) return SearingLight; } } - - else return SearingLight; + return SearingLight; } // Emergency priority Demi Nuke to prevent waste if you can't get demi attacks out to satisfy the slider check. - if (OriginalHook(Ruin) is AstralImpulse or FountainOfFire && GetCooldown(OriginalHook(Aethercharge)).CooldownElapsed >= 12.5) + if (OriginalHook(Ruin) is AstralImpulse or UmbralImpulse or FountainOfFire && GetCooldown(OriginalHook(Aethercharge)).CooldownElapsed >= 12.5) { if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_Attacks)) { if (IsOffCooldown(OriginalHook(EnkindleBahamut)) && LevelChecked(SummonBahamut)) return OriginalHook(EnkindleBahamut); - if (IsOffCooldown(Deathflare) && LevelChecked(Deathflare) && OriginalHook(Ruin) is AstralImpulse) + if (IsOffCooldown(Deathflare) && LevelChecked(Deathflare) && OriginalHook(Ruin) is AstralImpulse or UmbralImpulse) return OriginalHook(AstralFlow); } @@ -465,7 +492,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim (SummonerBurstPhase == 4 && !HasEffect(Buffs.TitansFavor))) { if (STCombo) - return Fester; + return OriginalHook(Fester); if (AoECombo && LevelChecked(Painflare) && IsNotEnabled(CustomComboPreset.SMN_DemiEgiMenu_oGCDPooling_Only)) return Painflare; @@ -473,10 +500,13 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } } + if (IsEnabled(CustomComboPreset.SMN_SearingFlash) && HasEffect(Buffs.RubysGlimmer) && LevelChecked(SearingFlash)) + return SearingFlash; + // Demi Nuke - if (OriginalHook(Ruin) is AstralImpulse or FountainOfFire) + if (OriginalHook(Ruin) is AstralImpulse or UmbralImpulse or FountainOfFire) { - if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_Attacks) && DemiAttackCount >= burstDelay) + if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_Attacks) && IsBahamutReady && (!LevelChecked(SummonSolarBahamut) || DemiAttackCount >= burstDelay)) { if (IsOffCooldown(OriginalHook(EnkindleBahamut)) && LevelChecked(SummonBahamut)) return OriginalHook(EnkindleBahamut); @@ -486,11 +516,27 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } // Demi Nuke 2: Electric Boogaloo - if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_Rekindle)) + if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_Rekindle) && IsPhoenixReady) { + if (IsOffCooldown(OriginalHook(EnkindlePhoenix)) && LevelChecked(SummonPhoenix)) + return OriginalHook(EnkindlePhoenix); + if (IsOffCooldown(Rekindle) && OriginalHook(Ruin) is FountainOfFire) return OriginalHook(AstralFlow); } + + // Demi Nuke 3: More Boogaloo + if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_Attacks) && IsSolarBahamutReady && DemiAttackCount >= burstDelay) + { + if (IsOffCooldown(OriginalHook(EnkindleSolarBahamut)) && LevelChecked(SummonSolarBahamut)) + return OriginalHook(EnkindleSolarBahamut); + + if (IsOffCooldown(Sunflare) && LevelChecked(Sunflare) && OriginalHook(Ruin) is UmbralImpulse) + return OriginalHook(AstralFlow); + + if (IsOffCooldown(LuxSolaris) && HasEffect(Buffs.RefulgentLux)) + return OriginalHook(LuxSolaris); + } } // Fester/Painflare @@ -501,7 +547,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsNotEnabled(CustomComboPreset.SMN_DemiEgiMenu_oGCDPooling)) { if (STCombo) - return Fester; + return OriginalHook(Fester); if (AoECombo && LevelChecked(Painflare)) return Painflare; @@ -512,7 +558,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (!LevelChecked(SearingLight)) { if (STCombo) - return Fester; + return OriginalHook(Fester); if (AoECombo && LevelChecked(Painflare) && IsNotEnabled(CustomComboPreset.SMN_DemiEgiMenu_oGCDPooling_Only)) return Painflare; @@ -523,7 +569,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim (SummonerBurstPhase == 4 && !HasEffect(Buffs.TitansFavor))) { if (STCombo) - return Fester; + return OriginalHook(Fester); if (AoECombo && LevelChecked(Painflare) && IsNotEnabled(CustomComboPreset.SMN_DemiEgiMenu_oGCDPooling_Only)) return Painflare; @@ -540,16 +586,17 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim // Demi if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons)) { - if (InCombat() && gauge.SummonTimerRemaining == 0 && IsOffCooldown(OriginalHook(Aethercharge)) && + if (gauge.SummonTimerRemaining == 0 && IsOffCooldown(OriginalHook(Aethercharge)) && ((LevelChecked(Aethercharge) && !LevelChecked(SummonBahamut)) || // Pre-Bahamut Phase - (gauge.IsBahamutReady && LevelChecked(SummonBahamut)) || // Bahamut Phase - (gauge.IsPhoenixReady && LevelChecked(SummonPhoenix)))) // Phoenix Phase + (IsBahamutReady && LevelChecked(SummonBahamut)) || // Bahamut Phase + (IsPhoenixReady && LevelChecked(SummonPhoenix)) || // Phoenix Phase + (IsSolarBahamutReady && LevelChecked(SummonSolarBahamut)))) // Solar Bahamut Phase return OriginalHook(Aethercharge); } //Ruin4 in Egi Phases if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_Ruin4) && HasEffect(Buffs.FurtherRuin) && - ((!HasEffect(All.Buffs.Swiftcast) && IsMoving && ((HasEffect(Buffs.GarudasFavor) && !gauge.IsGarudaAttuned) || (gauge.IsIfritAttuned && lastComboMove is not CrimsonCyclone))) || + ((!HasEffect(All.Buffs.Swiftcast) && IsMoving && ((HasEffect(Buffs.GarudasFavor) && !IsGarudaAttuned) || (IsIfritAttuned && lastComboMove is not CrimsonCyclone))) || GetCooldownRemainingTime(OriginalHook(Aethercharge)) is < 2.5f and > 0)) return Ruin4; @@ -559,7 +606,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim // Swiftcast Garuda Feature if (swiftcastPhase is 0 or 1 && LevelChecked(Slipstream) && HasEffect(Buffs.GarudasFavor)) { - if (CanSpellWeave(actionID) && gauge.IsGarudaAttuned && IsOffCooldown(All.Swiftcast)) + if (CanSpellWeave(actionID) && IsGarudaAttuned && IsOffCooldown(All.Swiftcast)) { if (STCombo || (AoECombo && IsNotEnabled(CustomComboPreset.SMN_DemiEgiMenu_SwiftcastEgi_Only))) return All.Swiftcast; @@ -573,7 +620,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim // Swiftcast Ifrit Feature (Conditions to allow for SpS Ruins to still be under the effect of Swiftcast) if (swiftcastPhase == 2) { - if (IsOffCooldown(All.Swiftcast) && gauge.IsIfritAttuned && lastComboMove is not CrimsonCyclone) + if (IsOffCooldown(All.Swiftcast) && IsIfritAttuned && lastComboMove is not CrimsonCyclone) { if (!Config.SMN_ST_Egi_AstralFlow[1] || (Config.SMN_ST_Egi_AstralFlow[1] && gauge.Attunement >= 1)) { @@ -589,7 +636,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim // Swiftcast Garuda Feature if (LevelChecked(Slipstream) && HasEffect(Buffs.GarudasFavor)) { - if (CanSpellWeave(actionID) && gauge.IsGarudaAttuned && IsOffCooldown(All.Swiftcast)) + if (CanSpellWeave(actionID) && IsGarudaAttuned && IsOffCooldown(All.Swiftcast)) { if (STCombo || (AoECombo && IsNotEnabled(CustomComboPreset.SMN_DemiEgiMenu_SwiftcastEgi_Only))) return All.Swiftcast; @@ -601,7 +648,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } // Swiftcast Ifrit Feature (Conditions to allow for SpS Ruins to still be under the effect of Swiftcast) - if (IsOffCooldown(All.Swiftcast) && gauge.IsIfritAttuned && lastComboMove is not CrimsonCyclone) + if (IsOffCooldown(All.Swiftcast) && IsIfritAttuned && lastComboMove is not CrimsonCyclone) { if (!Config.SMN_ST_Egi_AstralFlow[1] || (Config.SMN_ST_Egi_AstralFlow[1] && gauge.Attunement >= 1)) { @@ -614,7 +661,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim // Gemshine/Precious Brilliance priority casting if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_EgiSummons_Attacks) && - ((gauge.IsIfritAttuned && gauge.Attunement >= 1 && HasEffect(All.Buffs.Swiftcast) && lastComboMove is not CrimsonCyclone) || + ((IsIfritAttuned && gauge.Attunement >= 1 && HasEffect(All.Buffs.Swiftcast) && lastComboMove is not CrimsonCyclone) || (HasEffect(Buffs.GarudasFavor) && gauge.Attunement >= 1 && !HasEffect(All.Buffs.Swiftcast) && IsMoving))) { if (STCombo) @@ -626,12 +673,12 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if ((Config.SMN_ST_Egi_AstralFlow[2] && HasEffect(Buffs.GarudasFavor) && (IsNotEnabled(CustomComboPreset.SMN_DemiEgiMenu_SwiftcastEgi) || swiftcastPhase == 2)) || // Garuda (Config.SMN_ST_Egi_AstralFlow[0] && HasEffect(Buffs.TitansFavor) && lastComboMove is TopazRite or TopazCata && CanSpellWeave(actionID)) || // Titan - (Config.SMN_ST_Egi_AstralFlow[1] && HasEffect(Buffs.IfritsFavor) && !Config.SMN_ST_CrimsonCycloneMelee && (IsMoving || gauge.Attunement == 0 || (lastComboMove is CrimsonCyclone && InMeleeRange()))) || + (Config.SMN_ST_Egi_AstralFlow[1] && (HasEffect(Buffs.IfritsFavor) && !Config.SMN_ST_CrimsonCycloneMelee && (IsMoving || gauge.Attunement == 0) || (lastComboMove is CrimsonCyclone && InMeleeRange()))) || (Config.SMN_ST_Egi_AstralFlow[1] && HasEffect(Buffs.IfritsFavor) && Config.SMN_ST_CrimsonCycloneMelee && InMeleeRange())) // Ifrit return OriginalHook(AstralFlow); // Gemshine/Precious Brilliance - if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_EgiSummons_Attacks) && (gauge.IsGarudaAttuned || gauge.IsTitanAttuned || gauge.IsIfritAttuned)) + if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_EgiSummons_Attacks) && (IsGarudaAttuned || IsTitanAttuned || IsIfritAttuned)) { if (STCombo) return OriginalHook(Gemshine); @@ -738,6 +785,9 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if ((OriginalHook(AstralFlow) is Deathflare && IsOffCooldown(Deathflare)) || (OriginalHook(AstralFlow) is Rekindle && IsOffCooldown(Rekindle))) return OriginalHook(AstralFlow); + + if (OriginalHook(AstralFlow) is Sunflare && IsOffCooldown(Sunflare)) + return OriginalHook(Sunflare); } return actionID; diff --git a/XIVSlothCombo/XIVSlothCombo.cs b/XIVSlothCombo/XIVSlothCombo.cs index a55e67f1e..68feb834d 100644 --- a/XIVSlothCombo/XIVSlothCombo.cs +++ b/XIVSlothCombo/XIVSlothCombo.cs @@ -62,7 +62,7 @@ public sealed partial class XIVSlothCombo : IDalamudPlugin SAM.JobID, SCH.JobID, SGE.JobID, - SMN.JobID, + //SMN.JobID, WAR.JobID, WHM.JobID }; From 1749431e2a05eef0182a475ba40b991aa2ac30bd Mon Sep 17 00:00:00 2001 From: Genesis <12591123+Genesis-Nova@users.noreply.github.com> Date: Sun, 30 Jun 2024 18:23:34 -0500 Subject: [PATCH 2/8] Missed some logic for Advanced summoner and an else causing Searing Light to ignore selected burst phase. Missed an InCombat check for Dreadwyrm Trance (The other Demis don't require being in combat to use) --- XIVSlothCombo/Combos/PvE/SMN.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/SMN.cs b/XIVSlothCombo/Combos/PvE/SMN.cs index 9ea878f1e..ad66bd27e 100644 --- a/XIVSlothCombo/Combos/PvE/SMN.cs +++ b/XIVSlothCombo/Combos/PvE/SMN.cs @@ -259,7 +259,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (CanSpellWeave(actionID)) { - if (IsOffCooldown(SearingLight) && LevelChecked(SearingLight) && (!LevelChecked(SummonSolarBahamut) && OriginalHook(Ruin) is AstralImpulse || OriginalHook(Ruin) is UmbralImpulse)) + if (IsOffCooldown(SearingLight) && LevelChecked(SearingLight) && ((!LevelChecked(SummonSolarBahamut) && OriginalHook(Ruin) is AstralImpulse) || OriginalHook(Ruin) is UmbralImpulse)) return SearingLight; if (!gauge.HasAetherflowStacks && IsOffCooldown(EnergyDrain)) @@ -440,7 +440,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { if (IsEnabled(CustomComboPreset.SMN_SearingLight_Burst)) { - if ((SummonerBurstPhase is 0 or 1 && OriginalHook(Ruin) is AstralImpulse or UmbralImpulse) || + if (SummonerBurstPhase is 0 or 1 && ((!LevelChecked(SummonSolarBahamut) && OriginalHook(Ruin) is AstralImpulse) || OriginalHook(Ruin) is UmbralImpulse) || (SummonerBurstPhase == 2 && OriginalHook(Ruin) == FountainOfFire) || (SummonerBurstPhase == 3 && OriginalHook(Ruin) is AstralImpulse or UmbralImpulse or FountainOfFire) || (SummonerBurstPhase == 4)) @@ -449,7 +449,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return SearingLight; } } - return SearingLight; + else return SearingLight; } // Emergency priority Demi Nuke to prevent waste if you can't get demi attacks out to satisfy the slider check. @@ -587,7 +587,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons)) { if (gauge.SummonTimerRemaining == 0 && IsOffCooldown(OriginalHook(Aethercharge)) && - ((LevelChecked(Aethercharge) && !LevelChecked(SummonBahamut)) || // Pre-Bahamut Phase + ((LevelChecked(Aethercharge) && !LevelChecked(SummonBahamut) && InCombat()) || // Pre-Bahamut Phase (IsBahamutReady && LevelChecked(SummonBahamut)) || // Bahamut Phase (IsPhoenixReady && LevelChecked(SummonPhoenix)) || // Phoenix Phase (IsSolarBahamutReady && LevelChecked(SummonSolarBahamut)))) // Solar Bahamut Phase From df4ede01d2fbd069271168727515e3322fb8734e Mon Sep 17 00:00:00 2001 From: Genesis <12591123+Genesis-Nova@users.noreply.github.com> Date: Mon, 1 Jul 2024 09:31:37 -0500 Subject: [PATCH 3/8] Rolled in PR for issue #1385 so to not cause any conflicts. --- XIVSlothCombo/Combos/PvE/SMN.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XIVSlothCombo/Combos/PvE/SMN.cs b/XIVSlothCombo/Combos/PvE/SMN.cs index ad66bd27e..c421ace95 100644 --- a/XIVSlothCombo/Combos/PvE/SMN.cs +++ b/XIVSlothCombo/Combos/PvE/SMN.cs @@ -688,7 +688,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } // Egi Order - if (IsEnabled(CustomComboPreset.SMN_DemiEgiMenu_EgiOrder) && gauge.SummonTimerRemaining == 0 && IsOnCooldown(SummonPhoenix) && IsOnCooldown(SummonBahamut)) + if (IsEnabled(CustomComboPreset.SMN_DemiEgiMenu_EgiOrder) && gauge.SummonTimerRemaining == 0) { if (gauge.IsIfritReady && !gauge.IsTitanReady && !gauge.IsGarudaReady && LevelChecked(SummonRuby)) return OriginalHook(SummonRuby); From f62e5e2fcf35bc00d3e9146b246b2f4d7c797559 Mon Sep 17 00:00:00 2001 From: Genesis <12591123+Genesis-Nova@users.noreply.github.com> Date: Sun, 30 Jun 2024 15:20:10 -0500 Subject: [PATCH 4/8] Initial addition of SMN updates/changes. Added new abilities to Simple and Advanced Summoner. Added Searing Flash combo option toggle for advanced summoner. Tweaked some combo IDs due to old typo since we're resetting configs anyways. (I do gotta be like that K) --- XIVSlothCombo/Combos/CustomComboPreset.cs | 8 +- XIVSlothCombo/Combos/PvE/SMN.cs | 124 +++++++++++++++------- XIVSlothCombo/XIVSlothCombo.cs | 2 +- 3 files changed, 94 insertions(+), 40 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index 66dcd648f..ede65a2a9 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -3356,11 +3356,15 @@ New features should be added to the appropriate sections. [ParentCombo(SMN_Advanced_Combo)] [CustomComboInfo("Searing Light Combo Option", "Adds Searing Light to the single target and AoE combos.\nWill be used on cooldown.", SMN.JobID, 9, "", "")] - SMN_SearingLight = 17018, + SMN_SearingLight = 17017, [ParentCombo(SMN_SearingLight)] [CustomComboInfo("Searing Light Burst Option", "Casts Searing Light only during Demi phases.\nReflects Demi choice selected under 'Pooled oGCDs Option'.\nNot recommended for SpS Builds.", SMN.JobID, 0, "")] - SMN_SearingLight_Burst = 170181, // Genesis, why must you be like this -K + SMN_SearingLight_Burst = 17018, + + [ParentCombo(SMN_SearingLight)] + [CustomComboInfo("Searing Flash Combo Option", "Adds Searing Flash to the single target and AoE combos.", SMN.JobID, 1, "", "")] + SMN_SearingFlash = 17019, [ParentCombo(SMN_Advanced_Combo)] [CustomComboInfo("Demi Summons Combo Option", "Adds Demi summons to the single target and AoE combos.", SMN.JobID, 10, "", "")] diff --git a/XIVSlothCombo/Combos/PvE/SMN.cs b/XIVSlothCombo/Combos/PvE/SMN.cs index 951338d4b..9ea878f1e 100644 --- a/XIVSlothCombo/Combos/PvE/SMN.cs +++ b/XIVSlothCombo/Combos/PvE/SMN.cs @@ -71,6 +71,7 @@ public const uint // Demi summons SummonBahamut = 7427, SummonPhoenix = 25831, + SummonSolarBahamut = 36992, // Demi summon abilities AstralImpulse = 25820, // Single target Bahamut GCD @@ -82,6 +83,12 @@ public const uint BrandOfPurgatory = 16515, // AoE Phoenix GCD Rekindle = 25830, // Healing oGCD Phoenix EnkindlePhoenix = 16516, + + UmbralImpulse = 36994, //Single target Solar Bahamut GCD + UmbralFlare = 36995, //AoE Solar Bahamut GCD + Sunflare = 36996, //Damage oGCD Solar Bahamut + EnkindleSolarBahamut = 36998, + LuxSolaris = 36997, //Healing oGCD Solar Bahamut // Shared summon abilities AstralFlow = 25822, @@ -103,6 +110,7 @@ public const uint Fester = 181, EnergySiphon = 16510, Painflare = 3578, + SearingFlash = 36991, // Revive Resurrection = 173, @@ -121,7 +129,9 @@ public const ushort TitansFavor = 2853, IfritsFavor = 2724, EverlastingFlight = 16517, - SearingLight = 2703; + SearingLight = 2703, + RubysGlimmer = 3873, + RefulgentLux = 3874; } public static class Config @@ -229,6 +239,12 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim var gauge = GetJobGauge(); var STCombo = actionID is Ruin or Ruin2; var AoECombo = actionID is Outburst or Tridisaster; + var IsGarudaAttuned = OriginalHook(Gemshine) is EmeralRuin1 or EmeralRuin2 or EmeralRuin3 or EmeraldRite; + var IsTitanAttuned = OriginalHook(Gemshine) is TopazRuin1 or TopazRuin2 or TopazRuin3 or TopazRite; + var IsIfritAttuned = OriginalHook(Gemshine) is RubyRuin1 or RubyRuin2 or RubyRuin3 or RubyRite; + var IsBahamutReady = OriginalHook(Aethercharge) is SummonBahamut; + var IsPhoenixReady = OriginalHook(Aethercharge) is SummonPhoenix; + var IsSolarBahamutReady = OriginalHook(Aethercharge) is SummonSolarBahamut; if (actionID is Ruin or Ruin2 or Outburst or Tridisaster) { @@ -243,7 +259,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (CanSpellWeave(actionID)) { - if (IsOffCooldown(SearingLight) && LevelChecked(SearingLight) && OriginalHook(Ruin) == AstralImpulse) + if (IsOffCooldown(SearingLight) && LevelChecked(SearingLight) && (!LevelChecked(SummonSolarBahamut) && OriginalHook(Ruin) is AstralImpulse || OriginalHook(Ruin) is UmbralImpulse)) return SearingLight; if (!gauge.HasAetherflowStacks && IsOffCooldown(EnergyDrain)) @@ -255,16 +271,22 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return EnergySiphon; } - if (OriginalHook(Ruin) is AstralImpulse or FountainOfFire) + if (HasEffect(Buffs.RubysGlimmer) && LevelChecked(SearingFlash)) + return SearingFlash; + + if (OriginalHook(Ruin) is AstralImpulse or UmbralImpulse or FountainOfFire) { if (IsOffCooldown(OriginalHook(EnkindleBahamut)) && LevelChecked(SummonBahamut)) return OriginalHook(EnkindleBahamut); - if (IsOffCooldown(Deathflare) && LevelChecked(Deathflare) && OriginalHook(Ruin) is AstralImpulse) + if (IsOffCooldown(Deathflare) && LevelChecked(Deathflare) && OriginalHook(Ruin) is AstralImpulse or UmbralImpulse) return OriginalHook(AstralFlow); if (IsOffCooldown(Rekindle) && OriginalHook(Ruin) is FountainOfFire) return OriginalHook(AstralFlow); + + if (IsOffCooldown(LuxSolaris) && HasEffect(Buffs.RefulgentLux)) + return OriginalHook(LuxSolaris); } if (gauge.HasAetherflowStacks && CanSpellWeave(actionID)) @@ -272,7 +294,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (!LevelChecked(SearingLight)) { if (STCombo) - return Fester; + return OriginalHook(Fester); if (AoECombo && LevelChecked(Painflare)) return Painflare; @@ -281,7 +303,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (HasEffect(Buffs.SearingLight)) { if (STCombo) - return Fester; + return OriginalHook(Fester); if (AoECombo && LevelChecked(Painflare)) return Painflare; @@ -302,18 +324,18 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { if (LevelChecked(Slipstream) && HasEffect(Buffs.GarudasFavor)) { - if (CanSpellWeave(actionID) && gauge.IsGarudaAttuned && IsOffCooldown(All.Swiftcast)) + if (CanSpellWeave(actionID) && IsGarudaAttuned && IsOffCooldown(All.Swiftcast)) return All.Swiftcast; if (HasEffect(Buffs.GarudasFavor) && HasEffect(All.Buffs.Swiftcast)) return OriginalHook(AstralFlow); } - if (gauge.IsIfritAttuned && gauge.Attunement >= 1 && IsOffCooldown(All.Swiftcast)) + if (IsIfritAttuned && gauge.Attunement >= 1 && IsOffCooldown(All.Swiftcast)) return All.Swiftcast; } - if (gauge.IsIfritAttuned && gauge.Attunement >= 1 && HasEffect(All.Buffs.Swiftcast) && lastComboMove is not CrimsonCyclone) + if (IsIfritAttuned && gauge.Attunement >= 1 && HasEffect(All.Buffs.Swiftcast) && lastComboMove is not CrimsonCyclone) { if (STCombo) return OriginalHook(Gemshine); @@ -324,13 +346,13 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if ((HasEffect(Buffs.GarudasFavor) && gauge.Attunement is 0) || (HasEffect(Buffs.TitansFavor) && lastComboMove is TopazRite or TopazCata && CanSpellWeave(actionID)) || - (HasEffect(Buffs.IfritsFavor) && (IsMoving || gauge.Attunement is 0)) || lastComboMove == CrimsonCyclone) + (HasEffect(Buffs.IfritsFavor) && (IsMoving || gauge.Attunement is 0)) || (lastComboMove == CrimsonCyclone && InMeleeRange())) return OriginalHook(AstralFlow); - if (HasEffect(Buffs.FurtherRuin) && ((!HasEffect(All.Buffs.Swiftcast) && gauge.IsIfritAttuned && IsMoving) || (GetCooldownRemainingTime(OriginalHook(Aethercharge)) is < 2.5f and > 0))) + if (HasEffect(Buffs.FurtherRuin) && ((!HasEffect(All.Buffs.Swiftcast) && IsIfritAttuned && IsMoving) || (GetCooldownRemainingTime(OriginalHook(Aethercharge)) is < 2.5f and > 0))) return Ruin4; - if (gauge.IsGarudaAttuned || gauge.IsTitanAttuned || gauge.IsIfritAttuned) + if (IsGarudaAttuned || IsTitanAttuned || IsIfritAttuned) { if (STCombo) return OriginalHook(Gemshine); @@ -375,6 +397,12 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim var inOpener = CombatEngageDuration().TotalSeconds < 40; var STCombo = actionID is Ruin or Ruin2; var AoECombo = actionID is Outburst or Tridisaster; + var IsGarudaAttuned = OriginalHook(Gemshine) is EmeralRuin1 or EmeralRuin2 or EmeralRuin3 or EmeraldRite; + var IsTitanAttuned = OriginalHook(Gemshine) is TopazRuin1 or TopazRuin2 or TopazRuin3 or TopazRite; + var IsIfritAttuned = OriginalHook(Gemshine) is RubyRuin1 or RubyRuin2 or RubyRuin3 or RubyRite; + var IsBahamutReady = OriginalHook(Aethercharge) is SummonBahamut; + var IsPhoenixReady = OriginalHook(Aethercharge) is SummonPhoenix; + var IsSolarBahamutReady = OriginalHook(Aethercharge) is SummonSolarBahamut; if (WasLastAction(OriginalHook(Aethercharge))) DemiAttackCount = 0; // Resets counter @@ -385,7 +413,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (gauge.SummonTimerRemaining == 0 && !InCombat()) DemiAttackCount = 0; //CHECK_DEMIATTACK_USE - if (UsedDemiAttack == false && lastComboMove is AstralImpulse or FountainOfFire or AstralFlare or BrandOfPurgatory && DemiAttackCount is not 6 && GetCooldownRemainingTime(AstralImpulse) > 1) + if (UsedDemiAttack == false && lastComboMove is AstralImpulse or UmbralImpulse or FountainOfFire or AstralFlare or UmbralFlare or BrandOfPurgatory && DemiAttackCount is not 6 && GetCooldownRemainingTime(AstralImpulse) > 1) { UsedDemiAttack = true; // Registers that a Demi Attack was used and blocks further incrementation of DemiAttackCountCount DemiAttackCount++; // Increments DemiAttack counter @@ -412,28 +440,27 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { if (IsEnabled(CustomComboPreset.SMN_SearingLight_Burst)) { - if ((SummonerBurstPhase is 0 or 1 && OriginalHook(Ruin) == AstralImpulse) || + if ((SummonerBurstPhase is 0 or 1 && OriginalHook(Ruin) is AstralImpulse or UmbralImpulse) || (SummonerBurstPhase == 2 && OriginalHook(Ruin) == FountainOfFire) || - (SummonerBurstPhase == 3 && OriginalHook(Ruin) is AstralImpulse or FountainOfFire) || + (SummonerBurstPhase == 3 && OriginalHook(Ruin) is AstralImpulse or UmbralImpulse or FountainOfFire) || (SummonerBurstPhase == 4)) { if (STCombo || (AoECombo && IsNotEnabled(CustomComboPreset.SMN_SearingLight_STOnly))) return SearingLight; } } - - else return SearingLight; + return SearingLight; } // Emergency priority Demi Nuke to prevent waste if you can't get demi attacks out to satisfy the slider check. - if (OriginalHook(Ruin) is AstralImpulse or FountainOfFire && GetCooldown(OriginalHook(Aethercharge)).CooldownElapsed >= 12.5) + if (OriginalHook(Ruin) is AstralImpulse or UmbralImpulse or FountainOfFire && GetCooldown(OriginalHook(Aethercharge)).CooldownElapsed >= 12.5) { if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_Attacks)) { if (IsOffCooldown(OriginalHook(EnkindleBahamut)) && LevelChecked(SummonBahamut)) return OriginalHook(EnkindleBahamut); - if (IsOffCooldown(Deathflare) && LevelChecked(Deathflare) && OriginalHook(Ruin) is AstralImpulse) + if (IsOffCooldown(Deathflare) && LevelChecked(Deathflare) && OriginalHook(Ruin) is AstralImpulse or UmbralImpulse) return OriginalHook(AstralFlow); } @@ -465,7 +492,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim (SummonerBurstPhase == 4 && !HasEffect(Buffs.TitansFavor))) { if (STCombo) - return Fester; + return OriginalHook(Fester); if (AoECombo && LevelChecked(Painflare) && IsNotEnabled(CustomComboPreset.SMN_DemiEgiMenu_oGCDPooling_Only)) return Painflare; @@ -473,10 +500,13 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } } + if (IsEnabled(CustomComboPreset.SMN_SearingFlash) && HasEffect(Buffs.RubysGlimmer) && LevelChecked(SearingFlash)) + return SearingFlash; + // Demi Nuke - if (OriginalHook(Ruin) is AstralImpulse or FountainOfFire) + if (OriginalHook(Ruin) is AstralImpulse or UmbralImpulse or FountainOfFire) { - if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_Attacks) && DemiAttackCount >= burstDelay) + if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_Attacks) && IsBahamutReady && (!LevelChecked(SummonSolarBahamut) || DemiAttackCount >= burstDelay)) { if (IsOffCooldown(OriginalHook(EnkindleBahamut)) && LevelChecked(SummonBahamut)) return OriginalHook(EnkindleBahamut); @@ -486,11 +516,27 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } // Demi Nuke 2: Electric Boogaloo - if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_Rekindle)) + if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_Rekindle) && IsPhoenixReady) { + if (IsOffCooldown(OriginalHook(EnkindlePhoenix)) && LevelChecked(SummonPhoenix)) + return OriginalHook(EnkindlePhoenix); + if (IsOffCooldown(Rekindle) && OriginalHook(Ruin) is FountainOfFire) return OriginalHook(AstralFlow); } + + // Demi Nuke 3: More Boogaloo + if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_Attacks) && IsSolarBahamutReady && DemiAttackCount >= burstDelay) + { + if (IsOffCooldown(OriginalHook(EnkindleSolarBahamut)) && LevelChecked(SummonSolarBahamut)) + return OriginalHook(EnkindleSolarBahamut); + + if (IsOffCooldown(Sunflare) && LevelChecked(Sunflare) && OriginalHook(Ruin) is UmbralImpulse) + return OriginalHook(AstralFlow); + + if (IsOffCooldown(LuxSolaris) && HasEffect(Buffs.RefulgentLux)) + return OriginalHook(LuxSolaris); + } } // Fester/Painflare @@ -501,7 +547,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsNotEnabled(CustomComboPreset.SMN_DemiEgiMenu_oGCDPooling)) { if (STCombo) - return Fester; + return OriginalHook(Fester); if (AoECombo && LevelChecked(Painflare)) return Painflare; @@ -512,7 +558,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (!LevelChecked(SearingLight)) { if (STCombo) - return Fester; + return OriginalHook(Fester); if (AoECombo && LevelChecked(Painflare) && IsNotEnabled(CustomComboPreset.SMN_DemiEgiMenu_oGCDPooling_Only)) return Painflare; @@ -523,7 +569,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim (SummonerBurstPhase == 4 && !HasEffect(Buffs.TitansFavor))) { if (STCombo) - return Fester; + return OriginalHook(Fester); if (AoECombo && LevelChecked(Painflare) && IsNotEnabled(CustomComboPreset.SMN_DemiEgiMenu_oGCDPooling_Only)) return Painflare; @@ -540,16 +586,17 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim // Demi if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons)) { - if (InCombat() && gauge.SummonTimerRemaining == 0 && IsOffCooldown(OriginalHook(Aethercharge)) && + if (gauge.SummonTimerRemaining == 0 && IsOffCooldown(OriginalHook(Aethercharge)) && ((LevelChecked(Aethercharge) && !LevelChecked(SummonBahamut)) || // Pre-Bahamut Phase - (gauge.IsBahamutReady && LevelChecked(SummonBahamut)) || // Bahamut Phase - (gauge.IsPhoenixReady && LevelChecked(SummonPhoenix)))) // Phoenix Phase + (IsBahamutReady && LevelChecked(SummonBahamut)) || // Bahamut Phase + (IsPhoenixReady && LevelChecked(SummonPhoenix)) || // Phoenix Phase + (IsSolarBahamutReady && LevelChecked(SummonSolarBahamut)))) // Solar Bahamut Phase return OriginalHook(Aethercharge); } //Ruin4 in Egi Phases if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_Ruin4) && HasEffect(Buffs.FurtherRuin) && - ((!HasEffect(All.Buffs.Swiftcast) && IsMoving && ((HasEffect(Buffs.GarudasFavor) && !gauge.IsGarudaAttuned) || (gauge.IsIfritAttuned && lastComboMove is not CrimsonCyclone))) || + ((!HasEffect(All.Buffs.Swiftcast) && IsMoving && ((HasEffect(Buffs.GarudasFavor) && !IsGarudaAttuned) || (IsIfritAttuned && lastComboMove is not CrimsonCyclone))) || GetCooldownRemainingTime(OriginalHook(Aethercharge)) is < 2.5f and > 0)) return Ruin4; @@ -559,7 +606,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim // Swiftcast Garuda Feature if (swiftcastPhase is 0 or 1 && LevelChecked(Slipstream) && HasEffect(Buffs.GarudasFavor)) { - if (CanSpellWeave(actionID) && gauge.IsGarudaAttuned && IsOffCooldown(All.Swiftcast)) + if (CanSpellWeave(actionID) && IsGarudaAttuned && IsOffCooldown(All.Swiftcast)) { if (STCombo || (AoECombo && IsNotEnabled(CustomComboPreset.SMN_DemiEgiMenu_SwiftcastEgi_Only))) return All.Swiftcast; @@ -573,7 +620,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim // Swiftcast Ifrit Feature (Conditions to allow for SpS Ruins to still be under the effect of Swiftcast) if (swiftcastPhase == 2) { - if (IsOffCooldown(All.Swiftcast) && gauge.IsIfritAttuned && lastComboMove is not CrimsonCyclone) + if (IsOffCooldown(All.Swiftcast) && IsIfritAttuned && lastComboMove is not CrimsonCyclone) { if (!Config.SMN_ST_Egi_AstralFlow[1] || (Config.SMN_ST_Egi_AstralFlow[1] && gauge.Attunement >= 1)) { @@ -589,7 +636,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim // Swiftcast Garuda Feature if (LevelChecked(Slipstream) && HasEffect(Buffs.GarudasFavor)) { - if (CanSpellWeave(actionID) && gauge.IsGarudaAttuned && IsOffCooldown(All.Swiftcast)) + if (CanSpellWeave(actionID) && IsGarudaAttuned && IsOffCooldown(All.Swiftcast)) { if (STCombo || (AoECombo && IsNotEnabled(CustomComboPreset.SMN_DemiEgiMenu_SwiftcastEgi_Only))) return All.Swiftcast; @@ -601,7 +648,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } // Swiftcast Ifrit Feature (Conditions to allow for SpS Ruins to still be under the effect of Swiftcast) - if (IsOffCooldown(All.Swiftcast) && gauge.IsIfritAttuned && lastComboMove is not CrimsonCyclone) + if (IsOffCooldown(All.Swiftcast) && IsIfritAttuned && lastComboMove is not CrimsonCyclone) { if (!Config.SMN_ST_Egi_AstralFlow[1] || (Config.SMN_ST_Egi_AstralFlow[1] && gauge.Attunement >= 1)) { @@ -614,7 +661,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim // Gemshine/Precious Brilliance priority casting if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_EgiSummons_Attacks) && - ((gauge.IsIfritAttuned && gauge.Attunement >= 1 && HasEffect(All.Buffs.Swiftcast) && lastComboMove is not CrimsonCyclone) || + ((IsIfritAttuned && gauge.Attunement >= 1 && HasEffect(All.Buffs.Swiftcast) && lastComboMove is not CrimsonCyclone) || (HasEffect(Buffs.GarudasFavor) && gauge.Attunement >= 1 && !HasEffect(All.Buffs.Swiftcast) && IsMoving))) { if (STCombo) @@ -626,12 +673,12 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if ((Config.SMN_ST_Egi_AstralFlow[2] && HasEffect(Buffs.GarudasFavor) && (IsNotEnabled(CustomComboPreset.SMN_DemiEgiMenu_SwiftcastEgi) || swiftcastPhase == 2)) || // Garuda (Config.SMN_ST_Egi_AstralFlow[0] && HasEffect(Buffs.TitansFavor) && lastComboMove is TopazRite or TopazCata && CanSpellWeave(actionID)) || // Titan - (Config.SMN_ST_Egi_AstralFlow[1] && HasEffect(Buffs.IfritsFavor) && !Config.SMN_ST_CrimsonCycloneMelee && (IsMoving || gauge.Attunement == 0 || (lastComboMove is CrimsonCyclone && InMeleeRange()))) || + (Config.SMN_ST_Egi_AstralFlow[1] && (HasEffect(Buffs.IfritsFavor) && !Config.SMN_ST_CrimsonCycloneMelee && (IsMoving || gauge.Attunement == 0) || (lastComboMove is CrimsonCyclone && InMeleeRange()))) || (Config.SMN_ST_Egi_AstralFlow[1] && HasEffect(Buffs.IfritsFavor) && Config.SMN_ST_CrimsonCycloneMelee && InMeleeRange())) // Ifrit return OriginalHook(AstralFlow); // Gemshine/Precious Brilliance - if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_EgiSummons_Attacks) && (gauge.IsGarudaAttuned || gauge.IsTitanAttuned || gauge.IsIfritAttuned)) + if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_EgiSummons_Attacks) && (IsGarudaAttuned || IsTitanAttuned || IsIfritAttuned)) { if (STCombo) return OriginalHook(Gemshine); @@ -738,6 +785,9 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if ((OriginalHook(AstralFlow) is Deathflare && IsOffCooldown(Deathflare)) || (OriginalHook(AstralFlow) is Rekindle && IsOffCooldown(Rekindle))) return OriginalHook(AstralFlow); + + if (OriginalHook(AstralFlow) is Sunflare && IsOffCooldown(Sunflare)) + return OriginalHook(Sunflare); } return actionID; diff --git a/XIVSlothCombo/XIVSlothCombo.cs b/XIVSlothCombo/XIVSlothCombo.cs index a55e67f1e..68feb834d 100644 --- a/XIVSlothCombo/XIVSlothCombo.cs +++ b/XIVSlothCombo/XIVSlothCombo.cs @@ -62,7 +62,7 @@ public sealed partial class XIVSlothCombo : IDalamudPlugin SAM.JobID, SCH.JobID, SGE.JobID, - SMN.JobID, + //SMN.JobID, WAR.JobID, WHM.JobID }; From 1577cee1e40ced9d4191775d2f1a55f859c39fcc Mon Sep 17 00:00:00 2001 From: Genesis <12591123+Genesis-Nova@users.noreply.github.com> Date: Sun, 30 Jun 2024 18:23:34 -0500 Subject: [PATCH 5/8] Missed some logic for Advanced summoner and an else causing Searing Light to ignore selected burst phase. Missed an InCombat check for Dreadwyrm Trance (The other Demis don't require being in combat to use) --- XIVSlothCombo/Combos/PvE/SMN.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/SMN.cs b/XIVSlothCombo/Combos/PvE/SMN.cs index 9ea878f1e..ad66bd27e 100644 --- a/XIVSlothCombo/Combos/PvE/SMN.cs +++ b/XIVSlothCombo/Combos/PvE/SMN.cs @@ -259,7 +259,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (CanSpellWeave(actionID)) { - if (IsOffCooldown(SearingLight) && LevelChecked(SearingLight) && (!LevelChecked(SummonSolarBahamut) && OriginalHook(Ruin) is AstralImpulse || OriginalHook(Ruin) is UmbralImpulse)) + if (IsOffCooldown(SearingLight) && LevelChecked(SearingLight) && ((!LevelChecked(SummonSolarBahamut) && OriginalHook(Ruin) is AstralImpulse) || OriginalHook(Ruin) is UmbralImpulse)) return SearingLight; if (!gauge.HasAetherflowStacks && IsOffCooldown(EnergyDrain)) @@ -440,7 +440,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { if (IsEnabled(CustomComboPreset.SMN_SearingLight_Burst)) { - if ((SummonerBurstPhase is 0 or 1 && OriginalHook(Ruin) is AstralImpulse or UmbralImpulse) || + if (SummonerBurstPhase is 0 or 1 && ((!LevelChecked(SummonSolarBahamut) && OriginalHook(Ruin) is AstralImpulse) || OriginalHook(Ruin) is UmbralImpulse) || (SummonerBurstPhase == 2 && OriginalHook(Ruin) == FountainOfFire) || (SummonerBurstPhase == 3 && OriginalHook(Ruin) is AstralImpulse or UmbralImpulse or FountainOfFire) || (SummonerBurstPhase == 4)) @@ -449,7 +449,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return SearingLight; } } - return SearingLight; + else return SearingLight; } // Emergency priority Demi Nuke to prevent waste if you can't get demi attacks out to satisfy the slider check. @@ -587,7 +587,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons)) { if (gauge.SummonTimerRemaining == 0 && IsOffCooldown(OriginalHook(Aethercharge)) && - ((LevelChecked(Aethercharge) && !LevelChecked(SummonBahamut)) || // Pre-Bahamut Phase + ((LevelChecked(Aethercharge) && !LevelChecked(SummonBahamut) && InCombat()) || // Pre-Bahamut Phase (IsBahamutReady && LevelChecked(SummonBahamut)) || // Bahamut Phase (IsPhoenixReady && LevelChecked(SummonPhoenix)) || // Phoenix Phase (IsSolarBahamutReady && LevelChecked(SummonSolarBahamut)))) // Solar Bahamut Phase From 32824f2351bac861e85f27019b1c94e256ca5bb8 Mon Sep 17 00:00:00 2001 From: Genesis <12591123+Genesis-Nova@users.noreply.github.com> Date: Mon, 1 Jul 2024 09:31:37 -0500 Subject: [PATCH 6/8] Rolled in PR for issue #1385 so to not cause any conflicts. --- XIVSlothCombo/Combos/PvE/SMN.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XIVSlothCombo/Combos/PvE/SMN.cs b/XIVSlothCombo/Combos/PvE/SMN.cs index ad66bd27e..c421ace95 100644 --- a/XIVSlothCombo/Combos/PvE/SMN.cs +++ b/XIVSlothCombo/Combos/PvE/SMN.cs @@ -688,7 +688,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } // Egi Order - if (IsEnabled(CustomComboPreset.SMN_DemiEgiMenu_EgiOrder) && gauge.SummonTimerRemaining == 0 && IsOnCooldown(SummonPhoenix) && IsOnCooldown(SummonBahamut)) + if (IsEnabled(CustomComboPreset.SMN_DemiEgiMenu_EgiOrder) && gauge.SummonTimerRemaining == 0) { if (gauge.IsIfritReady && !gauge.IsTitanReady && !gauge.IsGarudaReady && LevelChecked(SummonRuby)) return OriginalHook(SummonRuby); From 43fe999c0e9e022376eb347f31ca6ec4f65213f6 Mon Sep 17 00:00:00 2001 From: Genesis <12591123+Genesis-Nova@users.noreply.github.com> Date: Tue, 2 Jul 2024 11:49:08 -0500 Subject: [PATCH 7/8] Added Refulgent Lux combo option. Adjusted logic on some things during demi burst phase, used wrong combo preset on Phoenix demi burst. Adjusted Combo Preset and tooptip text to account for Lv100 Demi rotation. --- XIVSlothCombo/Combos/CustomComboPreset.cs | 10 +++++-- XIVSlothCombo/Combos/PvE/SMN.cs | 30 +++++++++++++------- XIVSlothCombo/Window/Functions/UserConfig.cs | 4 +-- 3 files changed, 29 insertions(+), 15 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index ede65a2a9..8d5052778 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -3319,7 +3319,7 @@ New features should be added to the appropriate sections. SMN_Advanced_Combo = 17000, [ParentCombo(SMN_Advanced_Combo)] - [CustomComboInfo("Demi Attacks Combo Option", "Adds Deathflare, Ahk Morn and Revelation to the single target and AoE combos.", SMN.JobID, 11, "", "")] + [CustomComboInfo("Demi Attacks Combo Option", "Adds Demi Summon oGCDs to the single target and AoE combos.", SMN.JobID, 11, "", "")] SMN_Advanced_Combo_DemiSummons_Attacks = 17002, [ParentCombo(SMN_Advanced_Combo)] @@ -3378,17 +3378,21 @@ New features should be added to the appropriate sections. SMN_DemiAbilities = 17024, [ParentCombo(SMN_Advanced_Combo_EDFester)] - [CustomComboInfo("Pooled oGCDs Option", "Pools damage oGCDs for use inside the selected Demi phase while under the Searing Light buff.", SMN.JobID, 1, "", "")] + [CustomComboInfo("Pooled oGCDs Option", "Pools damage oGCDs for use inside the selected Demi phase while under the Searing Light buff.\nBahamut Burst becomes Solar Bahamut Burst at Lv100.", SMN.JobID, 1, "", "")] SMN_DemiEgiMenu_oGCDPooling = 17025, [ConflictingCombos(ALL_Caster_Raise)] [CustomComboInfo("Alternative Raise Feature", "Changes Swiftcast to Raise when on cooldown.", SMN.JobID, 8, "", "")] SMN_Raise = 17027, - [ParentCombo(SMN_Advanced_Combo)] + [ParentCombo(SMN_Advanced_Combo_DemiSummons_Attacks)] [CustomComboInfo("Rekindle Combo Option", "Adds Rekindle to the single target and AoE combos.", SMN.JobID, 13, "", "")] SMN_Advanced_Combo_DemiSummons_Rekindle = 17028, + [ParentCombo(SMN_Advanced_Combo_DemiSummons_Attacks)] + [CustomComboInfo("Lux Solaris Combo Option", "Adds Lux Solaris to the single target and AoE combos.", SMN.JobID, 14, "", "")] + SMN_Advanced_Combo_DemiSummons_LuxSolaris = 17029, + [ReplaceSkill(SMN.Ruin4)] [CustomComboInfo("Ruin III Mobility Feature", "Puts Ruin III on Ruin IV when you don't have Further Ruin.", SMN.JobID, 9, "", "")] SMN_RuinMobility = 17030, diff --git a/XIVSlothCombo/Combos/PvE/SMN.cs b/XIVSlothCombo/Combos/PvE/SMN.cs index c421ace95..6668ffc70 100644 --- a/XIVSlothCombo/Combos/PvE/SMN.cs +++ b/XIVSlothCombo/Combos/PvE/SMN.cs @@ -460,15 +460,25 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsOffCooldown(OriginalHook(EnkindleBahamut)) && LevelChecked(SummonBahamut)) return OriginalHook(EnkindleBahamut); - if (IsOffCooldown(Deathflare) && LevelChecked(Deathflare) && OriginalHook(Ruin) is AstralImpulse or UmbralImpulse) + if (IsOffCooldown(Deathflare) && LevelChecked(Deathflare) && OriginalHook(Ruin) is AstralImpulse) return OriginalHook(AstralFlow); - } - // Demi Nuke 2: Electric Boogaloo - if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_Rekindle)) - { - if (IsOffCooldown(Rekindle) && OriginalHook(Ruin) is FountainOfFire) + if (IsOffCooldown(OriginalHook(EnkindlePhoenix)) && LevelChecked(SummonPhoenix)) + return OriginalHook(EnkindlePhoenix); + + if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_Rekindle)) + if (IsOffCooldown(Rekindle) && OriginalHook(Ruin) is FountainOfFire) + return OriginalHook(AstralFlow); + + if (IsOffCooldown(OriginalHook(EnkindleSolarBahamut)) && LevelChecked(SummonSolarBahamut)) + return OriginalHook(EnkindleSolarBahamut); + + if (IsOffCooldown(Sunflare) && LevelChecked(Sunflare) && OriginalHook(Ruin) is UmbralImpulse) return OriginalHook(AstralFlow); + + if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_LuxSolaris)) + if (IsOffCooldown(LuxSolaris) && HasEffect(Buffs.RefulgentLux)) + return OriginalHook(LuxSolaris); } } @@ -516,12 +526,12 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } // Demi Nuke 2: Electric Boogaloo - if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_Rekindle) && IsPhoenixReady) + if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_Attacks) && IsPhoenixReady) { - if (IsOffCooldown(OriginalHook(EnkindlePhoenix)) && LevelChecked(SummonPhoenix)) + if (IsOffCooldown(OriginalHook(EnkindlePhoenix)) && LevelChecked(SummonPhoenix) && OriginalHook(Ruin) is FountainOfFire) return OriginalHook(EnkindlePhoenix); - if (IsOffCooldown(Rekindle) && OriginalHook(Ruin) is FountainOfFire) + if (IsOffCooldown(Rekindle) && IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_Rekindle) && OriginalHook(Ruin) is FountainOfFire) return OriginalHook(AstralFlow); } @@ -534,7 +544,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsOffCooldown(Sunflare) && LevelChecked(Sunflare) && OriginalHook(Ruin) is UmbralImpulse) return OriginalHook(AstralFlow); - if (IsOffCooldown(LuxSolaris) && HasEffect(Buffs.RefulgentLux)) + if (IsOffCooldown(LuxSolaris) && IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_LuxSolaris) && HasEffect(Buffs.RefulgentLux)) return OriginalHook(LuxSolaris); } } diff --git a/XIVSlothCombo/Window/Functions/UserConfig.cs b/XIVSlothCombo/Window/Functions/UserConfig.cs index 7fa3d7785..1dead4469 100644 --- a/XIVSlothCombo/Window/Functions/UserConfig.cs +++ b/XIVSlothCombo/Window/Functions/UserConfig.cs @@ -2343,9 +2343,9 @@ internal static void Draw(CustomComboPreset preset, bool enabled) if (preset == CustomComboPreset.SMN_DemiEgiMenu_oGCDPooling) { - UserConfig.DrawHorizontalRadioButton(SMN.Config.SMN_BurstPhase, "Bahamut", "Bursts during Bahamut phase.", 1); + UserConfig.DrawHorizontalRadioButton(SMN.Config.SMN_BurstPhase, "Solar Bahamut/Bahamut", "Bursts during Bahamut phase.\nBahamut burst phase becomes Solar Bahamut at Lv100.", 1); UserConfig.DrawHorizontalRadioButton(SMN.Config.SMN_BurstPhase, "Phoenix", "Bursts during Phoenix phase.", 2); - UserConfig.DrawHorizontalRadioButton(SMN.Config.SMN_BurstPhase, "Bahamut or Phoenix", "Bursts during Bahamut or Phoenix phase (whichever comes first).", 3); + UserConfig.DrawHorizontalRadioButton(SMN.Config.SMN_BurstPhase, "Any Demi Phase", "Bursts during any Demi Summon phase.", 3); UserConfig.DrawHorizontalRadioButton(SMN.Config.SMN_BurstPhase, "Flexible (SpS) Option", "Bursts when Searing Light is ready, regardless of phase.", 4); } From 78ee0a9db48bfa751107562bb84e556b300aee0f Mon Sep 17 00:00:00 2001 From: Genesis <12591123+Genesis-Nova@users.noreply.github.com> Date: Tue, 2 Jul 2024 16:54:23 -0500 Subject: [PATCH 8/8] Added demi attacks requirement for "emergency" usage of demi attacks during burst phase, not sure why this wasn't here before. Lux Solaris is not dependent on demi being active, it is a skill used by consuming a buff so I removed it from the above mentioned section.. --- XIVSlothCombo/Combos/PvE/SMN.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/SMN.cs b/XIVSlothCombo/Combos/PvE/SMN.cs index 6668ffc70..a85dc0990 100644 --- a/XIVSlothCombo/Combos/PvE/SMN.cs +++ b/XIVSlothCombo/Combos/PvE/SMN.cs @@ -453,7 +453,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } // Emergency priority Demi Nuke to prevent waste if you can't get demi attacks out to satisfy the slider check. - if (OriginalHook(Ruin) is AstralImpulse or UmbralImpulse or FountainOfFire && GetCooldown(OriginalHook(Aethercharge)).CooldownElapsed >= 12.5) + if (OriginalHook(Ruin) is AstralImpulse or UmbralImpulse or FountainOfFire && + IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_Attacks) && GetCooldown(OriginalHook(Aethercharge)).CooldownElapsed >= 12.5) { if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_Attacks)) { @@ -475,10 +476,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsOffCooldown(Sunflare) && LevelChecked(Sunflare) && OriginalHook(Ruin) is UmbralImpulse) return OriginalHook(AstralFlow); - - if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_LuxSolaris)) - if (IsOffCooldown(LuxSolaris) && HasEffect(Buffs.RefulgentLux)) - return OriginalHook(LuxSolaris); } }