From 478aa6e7713dddac5064619dc14dc7003301f28d Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Wed, 3 Jul 2024 06:34:13 -0600 Subject: [PATCH 01/69] Re-Enable DRK --- XIVSlothCombo/XIVSlothCombo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XIVSlothCombo/XIVSlothCombo.cs b/XIVSlothCombo/XIVSlothCombo.cs index a55e67f1e..827390640 100644 --- a/XIVSlothCombo/XIVSlothCombo.cs +++ b/XIVSlothCombo/XIVSlothCombo.cs @@ -51,7 +51,7 @@ public sealed partial class XIVSlothCombo : IDalamudPlugin DNC.JobID, DOL.JobID, DRG.JobID, - DRK.JobID, + //DRK.JobID, GNB.JobID, MCH.JobID, MNK.JobID, From 7aa69af83bc2601ac824fb0f00e84d040a9deecc Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Wed, 3 Jul 2024 06:36:26 -0600 Subject: [PATCH 02/69] Update existing Action IDs, Add new Action IDs Additionally document both --- XIVSlothCombo/Combos/PvE/DRK.cs | 62 +++++++++++++++++++++++---------- 1 file changed, 44 insertions(+), 18 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/DRK.cs b/XIVSlothCombo/Combos/PvE/DRK.cs index b55602e6b..58152cbc9 100644 --- a/XIVSlothCombo/Combos/PvE/DRK.cs +++ b/XIVSlothCombo/Combos/PvE/DRK.cs @@ -11,37 +11,63 @@ internal static class DRK public const byte JobID = 32; public const uint + // Single-Target 1-2-3 Combo HardSlash = 3617, - Unleash = 3621, SyphonStrike = 3623, Souleater = 3632, - SaltedEarth = 3639, - AbyssalDrain = 3641, - CarveAndSpit = 3643, - Delirium = 7390, - Quietus = 7391, - Bloodspiller = 7392, - FloodOfDarkness = 16466, - EdgeOfDarkness = 16467, + + // AoE 1-2-3 Combo + Unleash = 3621, StalwartSoul = 16468, - FloodOfShadow = 16469, - EdgeOfShadow = 16470, + + // Single-Target oGCDs + CarveAndSpit = 3643, // With AbyssalDrain + EdgeOfDarkness = 16467, // For MP + EdgeOfShadow = 16470, // For MP // Upgrade of EdgeOfDarkness + Bloodspiller = 7392, // For Blood + ScarletDelirium = 36928, // Under Delirium + Comeuppance = 36929, // Under Delirium + Torcleaver = 36930, // Under Delirium + + // AoE oGCDs + AbyssalDrain = 3641, // With CarveAndSpit + FloodOfDarkness = 16466, // For MP + FloodOfShadow = 16469, // For MP // Upgrade of FloodOfDarkness + Quietus = 7391, // For Blood + SaltedEarth = 3639, + SaltAndDarkness = 25755, // Recast of Salted Earth + Impalement = 36931, // Under Delirium + + // Buffing oGCDs + BloodWeapon = 7390, // todo: remove this + Delirium = 7390, // still the same :D + + // Burst Window LivingShadow = 16472, - SaltAndDarkness = 25755, - Oblation = 25754, Shadowbringer = 25757, - Plunge = 3640, - BloodWeapon = 3625, + Disesteem = 36932, + + // Gap-Closer + Plunge = 38512, // todo: remove this + ShadowStride = 38512, // todo: take this out of rotation + + // Ranged Option Unmend = 3624; public static class Buffs { public const ushort + // Main Buffs BloodWeapon = 742, - Darkside = 751, + Delirium = 3836, + + // Periodic Buffs + Darkside = 741, BlackestNight = 1178, - Delirium = 1972, - SaltedEarth = 749; + + // "DoT" Buffs + SaltedEarth = 749, + Scorn = 3837; } public static class Debuffs From b4a514c72cfdab20bfd03a46641efc622a987f0e Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Wed, 3 Jul 2024 08:49:45 -0600 Subject: [PATCH 03/69] Initial rework of DRK Combo options --- XIVSlothCombo/Combos/CustomComboPreset.cs | 227 +++++++++++++--------- 1 file changed, 133 insertions(+), 94 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index 66dcd648f..9bc8eea53 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -1022,141 +1022,180 @@ public enum CustomComboPreset #region DARK KNIGHT - [ParentCombo(DRK_SouleaterCombo)] - [CustomComboInfo("Buffs on Main Combo", "Collection of buffs to add to the main combo", DRK.JobID)] - DRK_MainComboBuffs_Group = 5098, - - [ConflictingCombos(DRK_oGCD)] - [ParentCombo(DRK_SouleaterCombo)] - [CustomComboInfo("Cooldowns on Main Combo", "Collection of cooldowns to add to the main combo", DRK.JobID)] - DRK_MainComboCDs_Group = 5099, + #region Souleater (Single Target) Combo [ReplaceSkill(DRK.Souleater)] [CustomComboInfo("Souleater Combo", "Replace Souleater with its combo chain. \nIf all sub options are selected will turn into a full one button rotation (Advanced Dark Knight)", DRK.JobID)] - DRK_SouleaterCombo = 5000, - - [ReplaceSkill(DRK.StalwartSoul)] - [CustomComboInfo("Stalwart Soul Combo", "Replace Stalwart Soul with its combo chain.", DRK.JobID)] - DRK_StalwartSoulCombo = 5001, + DRK_ST_Combo = 5001, - [ParentCombo(DRK_MainComboCDs_Group)] - [CustomComboInfo("Bloodspiller Feature", "Adds Bloodspiller when Delirium is active.", DRK.JobID)] - DRK_Bloodspiller = 5002, + #region Buff Options - [ReplaceSkill(DRK.StalwartSoul)] - [ParentCombo(DRK_StalwartSoulCombo)] - [CustomComboInfo("Dark Knight Gauge Overcap Feature", "Replace AoE combo with gauge spender if you are about to overcap.", DRK.JobID)] - DRK_Overcap = 5003, + [ParentCombo(DRK_ST_Combo)] + [CustomComboInfo("Delirium on Cooldown", "Adds Delirium to main combo on cooldown and when Darkside is up. Will also spend 50 blood gauge if Delirium is nearly ready to protect from overcap.", DRK.JobID)] + DRK_ST_Delirium = 5002, - [ParentCombo(DRK_MainComboCDs_Group)] - [CustomComboInfo("Living Shadow Feature", "Living Shadow will now be on main combo if its not on cooldown and you have gauge for it.", DRK.JobID)] - DRK_LivingShadow = 5004, + [ParentCombo(DRK_ST_Delirium)] + [CustomComboInfo("Torcleaver Feature", "Adds the Torcleaver chain when Delirium is activated.", DRK.JobID)] + DRK_ST_Delirium_Chain = 5003, - [ParentCombo(DRK_SouleaterCombo)] - [CustomComboInfo("Edge of Shadow Overcap Feature", "Uses Edge of Shadow if you are above 8,500 mana or Darkside is about to expire (10sec or less)", DRK.JobID)] - DRK_ManaOvercap = 5005, + #endregion + // Last value = 5003 - [ReplaceSkill(DRK.CarveAndSpit, DRK.AbyssalDrain)] - [ConflictingCombos(DRK_MainComboCDs_Group)] - [CustomComboInfo("oGCD Feature", "Adds Living Shadow > Salted Earth > Carve And Spit > Salt And Darkness to Carve And Spit and Abysal Drain", DRK.JobID)] - DRK_oGCD = 5006, + #region Cooldowns - [ParentCombo(DRK_oGCD)] - [CustomComboInfo("Shadowbringer oGCD Feature", "Adds Shadowbringer to oGCD Feature ", DRK.JobID)] - DRK_Shadowbringer_oGCD = 5007, + [ParentCombo(DRK_ST_Combo)] + [ConflictingCombos(DRK_oGCD)] + [CustomComboInfo("Cooldowns on Main Combo", "Collection of cooldowns to add to the main combo", DRK.JobID)] + DRK_ST_CDs = 5004, - [ParentCombo(DRK_MainComboCDs_Group)] - [CustomComboInfo("Plunge Feature", "Adds Plunge onto main combo whenever its available and Darkside is up.", DRK.JobID)] - DRK_Plunge = 5008, + [ParentCombo(DRK_ST_CDs)] + [CustomComboInfo("Bloodspiller Feature", "Adds Bloodspiller when Delirium is active.", DRK.JobID)] + DRK_ST_CDs_Bloodspiller = 5005, - [ParentCombo(DRK_Bloodspiller)] + [ParentCombo(DRK_ST_CDs)] [CustomComboInfo("Delayed Bloodspiller Feature", "Delays Bloodspiller by 2 GCDs when Delirium is used during even windows, uses it regularly during odd windows. Useful for feeding into raid buffs at level 90.", DRK.JobID)] - DRK_DelayedBloodspiller = 5010, + DRK_ST_CDs_DelayedBloodspiller = 5006, - [ParentCombo(DRK_SouleaterCombo)] - [CustomComboInfo("Unmend Uptime Feature", "Replace Souleater Combo Feature with Unmend when you are out of range.", DRK.JobID)] - DRK_RangedUptime = 5011, + [ParentCombo(DRK_ST_CDs)] + [CustomComboInfo("Living Shadow Feature", "Living Shadow will now be on main combo if its not on cooldown.", DRK.JobID)] + DRK_ST_CDs_LivingShadow = 5007, - [ParentCombo(DRK_StalwartSoulCombo)] - [CustomComboInfo("Abyssal Drain Feature", "Adds abyssal drain to the AoE combo when you fall below 60 percent hp.", DRK.JobID)] - DRK_AoE_AbyssalDrain = 5013, + #region Shadowbringer Options - [ParentCombo(DRK_StalwartSoulCombo)] - [CustomComboInfo("AoE Shadowbringer Feature", "Adds Shadowbringer to the AoE combo.", DRK.JobID)] - DRK_AoE_Shadowbringer = 5014, + [ParentCombo(DRK_ST_CDs)] + [CustomComboInfo("Shadowbringer Feature", "Adds Shadowbringer on main combo while Darkside is up. Will use all stacks on cooldown.", DRK.JobID)] + DRK_ST_CDs_Shadowbringer = 5008, - [ParentCombo(DRK_StalwartSoulCombo)] - [CustomComboInfo("Flood of Shadow Overcap Feature", "Uses Flood of Shadow if you are above 8.5k mana or Darkside is about to expire (10sec or less)", DRK.JobID)] - DRK_AoE_ManaOvercap = 5015, + [ParentCombo(DRK_ST_CDs_Shadowbringer)] + [CustomComboInfo("Shadowbringer Burst Option", "Pools Shadowbringer to use during even minute window bursts.", DRK.JobID)] + DRK_ST_CDs_ShadowbringerBurst = 5009, - [ParentCombo(DRK_SouleaterCombo)] - [CustomComboInfo("Blood Gauge Overcap Feature", "Adds Bloodspiller onto main combo when at 80 blood gauge or higher", DRK.JobID)] - DRK_BloodGaugeOvercap = 5016, + #endregion + // Last value = 5009 - [ParentCombo(DRK_MainComboCDs_Group)] - [CustomComboInfo("Shadowbringer Feature", "Adds Shadowbringer on main combo while Darkside is up. Will use all stacks on cooldown.", DRK.JobID)] - DRK_Shadowbringer = 5019, + [ParentCombo(DRK_ST_CDs)] + [CustomComboInfo("Carve and Spit Feature", "Adds Carve and Spit on main combo while Darkside is up.", DRK.JobID)] + DRK_ST_CDs_CarveAndSpit = 5010, + + [ParentCombo(DRK_ST_CDs)] + [CustomComboInfo("Salted Earth Feature", "Adds Salted Earth on main combo while Darkside is up, will use Salt and Darkness if unlocked.", DRK.JobID)] + DRK_ST_CDs_SaltedEarth = 5011, + + #endregion + // Last value = 5011 - [ParentCombo(DRK_ManaOvercap)] + #region Mana Overcap Options + + [ParentCombo(DRK_ST_Combo)] + [CustomComboInfo("Edge of Shadow Overcap Feature", "Uses Edge of Shadow if you are above 8,500 mana or Darkside is about to expire (10sec or less)", DRK.JobID)] + DRK_ST_ManaOvercap = 5012, + + [ParentCombo(DRK_ST_ManaOvercap)] [CustomComboInfo("Edge of Shadow Burst Option", "Uses Edge of Shadow until chosen MP limit is reached during minute window bursts.", DRK.JobID)] - DRK_EoSPooling = 5020, + DRK_ST_ManaSpenderPooling = 5013, - [ParentCombo(DRK_Shadowbringer)] - [CustomComboInfo("Shadowbringer Burst Option", "Pools Shadowbringer to use during even minute window bursts.", DRK.JobID)] - DRK_ShadowbringerBurst = 5021, + #endregion + // Last value = 5013 - [ParentCombo(DRK_MainComboCDs_Group)] - [CustomComboInfo("Carve and Spit Feature", "Adds Carve and Spit on main combo while Darkside is up.", DRK.JobID)] - DRK_CarveAndSpit = 5022, + [ParentCombo(DRK_ST_Combo)] + [CustomComboInfo("Blood Gauge Overcap Feature", "Adds Bloodspiller onto main combo when at 80 blood gauge or higher.", DRK.JobID)] + DRK_ST_BloodOvercap = 5014, - [ParentCombo(DRK_Plunge)] - [CustomComboInfo("Melee Plunge Option", "Uses Plunge when under Darkside and in the target ring (1 yalm).\nWill use as many stacks as selected in the above slider.", DRK.JobID)] - DRK_MeleePlunge = 5023, + [ParentCombo(DRK_ST_Combo)] + [CustomComboInfo("Unmend Uptime Feature", "Replace Souleater Combo Feature with Unmend when you are out of range.", DRK.JobID)] + DRK_ST_RangedUptime = 5015, - [ParentCombo(DRK_MainComboCDs_Group)] - [CustomComboInfo("Salted Earth Feature", "Adds Salted Earth on main combo while Darkside is up, will use Salt and Darkness if unlocked.", DRK.JobID)] - DRK_SaltedEarth = 5024, + #endregion + // Last value = 5015 - [ParentCombo(DRK_MainComboBuffs_Group)] - [CustomComboInfo("Delirium on Cooldown", "Adds Delirium to main combo on cooldown and when Darkside is up. Will also spend 50 blood gauge if Delirium is nearly ready to protect from overcap.", DRK.JobID)] - DRK_Delirium = 5025, + #region Stalwart Soul (Multi Target) Combo - [ParentCombo(DRK_MainComboBuffs_Group)] - [CustomComboInfo("Blood Weapon on Cooldown", "Adds Blood Weapon to main combo on cooldown and when Darkside is up.", DRK.JobID)] - DRK_BloodWeapon = 5026, + [ReplaceSkill(DRK.StalwartSoul)] + [CustomComboInfo("Stalwart Soul Combo", "Replace Stalwart Soul with its combo chain.", DRK.JobID)] + DRK_AoE_Combo = 5016, - [ParentCombo(DRK_StalwartSoulCombo)] - [CustomComboInfo("Blood Weapon Option", "Adds Blood Weapon to AoE combo on cooldown and when Darkside is up.", DRK.JobID)] - DRK_AoE_BloodWeapon = 5027, + #region Buff Options - [ParentCombo(DRK_StalwartSoulCombo)] - [CustomComboInfo("Delirium Option", "Adds Deliriun to AoE combo on cooldown and when Darkside is up.", DRK.JobID)] - DRK_AoE_Delirium = 5028, + [ParentCombo(DRK_AoE_Combo)] + [CustomComboInfo("Delirium Option", "Adds Delirium to AoE combo on cooldown and when Darkside is up.", DRK.JobID)] + DRK_AoE_Delirium = 5017, - [ParentCombo(DRK_StalwartSoulCombo)] - [CustomComboInfo("Salted Earth Option", "Adds Salted Earth and Salt and Darkness to AoE on cooldown and when Darkside is up.", DRK.JobID)] - DRK_AoE_SaltedEarth = 5029, + [ParentCombo(DRK_AoE_Delirium)] + [CustomComboInfo("Impalement Feature", "Adds all Impalement uses when Delirium is activated.", DRK.JobID)] + DRK_AoE_Delirium_Chain = 5018, + + #endregion + // Last value = 5018 - [ParentCombo(DRK_StalwartSoulCombo)] + #region Cooldowns + + [ParentCombo(DRK_AoE_Combo)] + [CustomComboInfo("Cooldowns on AoE Combo", "Collection of cooldowns to add to the AoE combo", DRK.JobID)] + DRK_AoE_CDs = 5019, + + [ParentCombo(DRK_AoE_CDs)] + [CustomComboInfo("AoE Shadowbringer Feature", "Adds Shadowbringer to the AoE combo.", DRK.JobID)] + DRK_AoE_Shadowbringer = 5020, + + [ParentCombo(DRK_AoE_CDs)] [CustomComboInfo("Living Shadow Option", "Adds Living Shadow to AoE on cooldown and when Darkside is up.", DRK.JobID)] - DRK_AoE_LivingShadow = 5030, + DRK_AoE_LivingShadow = 5021, + + [ParentCombo(DRK_AoE_CDs)] + [CustomComboInfo("Abyssal Drain Feature", "Adds abyssal drain to the AoE combo when you fall below 60 percent hp.", DRK.JobID)] + DRK_AoE_AbyssalDrain = 5022, + + [ParentCombo(DRK_AoE_CDs)] + [CustomComboInfo("Salted Earth Option", "Adds Salted Earth and Salt and Darkness to AoE on cooldown and when Darkside is up.", DRK.JobID)] + DRK_AoE_SaltedEarth = 5023, + + #endregion + // Last value = 5023 + + [ParentCombo(DRK_AoE_Combo)] + [CustomComboInfo("Flood of Shadow Overcap Feature", "Uses Flood of Shadow if you are above 8.5k mana or Darkside is about to expire (10sec or less)", DRK.JobID)] + DRK_AoE_ManaOvercap = 5024, + + [ParentCombo(DRK_AoE_Combo)] + [CustomComboInfo("Blood Gauge Overcap Feature", "Adds Bloodspiller onto AOE combo when at 80 blood gauge or higher.", DRK.JobID)] + DRK_AoE_BloodOvercap = 5025, + + #endregion + // Last value = 5025 + + #region oGCD Feature + + [ReplaceSkill(DRK.CarveAndSpit, DRK.AbyssalDrain)] + [ConflictingCombos(DRK_ST_CDs)] + [CustomComboInfo("oGCD Feature", "Adds Living Shadow > Salted Earth > Salt And Darkness to Carve And Spit and Abyssal Drain", DRK.JobID)] + DRK_oGCD = 5026, + + [ParentCombo(DRK_oGCD)] + [CustomComboInfo("Shadowbringer oGCD Feature", "Adds Shadowbringer to oGCD Feature ", DRK.JobID)] + DRK_Shadowbringer_oGCD = 5027, + + #endregion + // Last value = 5027 + + #region Variant [Variant] - [VariantParent(DRK_SouleaterCombo, DRK_StalwartSoulCombo)] + [VariantParent(DRK_ST_Combo, DRK_AoE_Combo)] [CustomComboInfo("Spirit Dart Option", "Use Variant Spirit Dart whenever the debuff is not present or less than 3s.", DRK.JobID)] - DRK_Variant_SpiritDart = 5031, + DRK_Variant_SpiritDart = 5028, [Variant] - [VariantParent(DRK_SouleaterCombo, DRK_StalwartSoulCombo)] + [VariantParent(DRK_ST_Combo, DRK_AoE_Combo)] [CustomComboInfo("Cure Option", "Use Variant Cure when HP is below set threshold.", DRK.JobID)] - DRK_Variant_Cure = 5032, + DRK_Variant_Cure = 5029, [Variant] - [VariantParent(DRK_SouleaterCombo, DRK_StalwartSoulCombo)] + [VariantParent(DRK_ST_Combo, DRK_AoE_Combo)] [CustomComboInfo("Ultimatum Option", "Use Variant Ultimatum on cooldown.", DRK.JobID)] - DRK_Variant_Ultimatum = 5033, + DRK_Variant_Ultimatum = 5030, - // Last value = 5033 + #endregion + // Last value = 5030 #endregion From d0100595280561916a5d24e682c75031b4da3fdf Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Wed, 3 Jul 2024 09:13:23 -0600 Subject: [PATCH 04/69] Remove unused Actions --- XIVSlothCombo/Combos/PvE/DRK.cs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/DRK.cs b/XIVSlothCombo/Combos/PvE/DRK.cs index 58152cbc9..74932ad86 100644 --- a/XIVSlothCombo/Combos/PvE/DRK.cs +++ b/XIVSlothCombo/Combos/PvE/DRK.cs @@ -39,18 +39,13 @@ public const uint Impalement = 36931, // Under Delirium // Buffing oGCDs - BloodWeapon = 7390, // todo: remove this - Delirium = 7390, // still the same :D + Delirium = 7390, // Burst Window LivingShadow = 16472, Shadowbringer = 25757, Disesteem = 36932, - // Gap-Closer - Plunge = 38512, // todo: remove this - ShadowStride = 38512, // todo: take this out of rotation - // Ranged Option Unmend = 3624; @@ -287,6 +282,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return actionID; } } + internal class DRK_oGCD : CustomCombo { protected internal override CustomComboPreset Preset { get; } = CustomComboPreset.DRK_oGCD; From 426aead68584c36eea1240189227dca65d13c30a Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Thu, 4 Jul 2024 09:22:38 -0600 Subject: [PATCH 05/69] Increase DRK Combo Options naming consistency --- 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 9bc8eea53..8f4a8cdf1 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -1135,19 +1135,19 @@ public enum CustomComboPreset [ParentCombo(DRK_AoE_CDs)] [CustomComboInfo("AoE Shadowbringer Feature", "Adds Shadowbringer to the AoE combo.", DRK.JobID)] - DRK_AoE_Shadowbringer = 5020, + DRK_AoE_CDs_Shadowbringer = 5020, [ParentCombo(DRK_AoE_CDs)] [CustomComboInfo("Living Shadow Option", "Adds Living Shadow to AoE on cooldown and when Darkside is up.", DRK.JobID)] - DRK_AoE_LivingShadow = 5021, + DRK_AoE_CDs_LivingShadow = 5021, [ParentCombo(DRK_AoE_CDs)] [CustomComboInfo("Abyssal Drain Feature", "Adds abyssal drain to the AoE combo when you fall below 60 percent hp.", DRK.JobID)] - DRK_AoE_AbyssalDrain = 5022, + DRK_AoE_CDs_AbyssalDrain = 5022, [ParentCombo(DRK_AoE_CDs)] [CustomComboInfo("Salted Earth Option", "Adds Salted Earth and Salt and Darkness to AoE on cooldown and when Darkside is up.", DRK.JobID)] - DRK_AoE_SaltedEarth = 5023, + DRK_AoE_CDs_SaltedEarth = 5023, #endregion // Last value = 5023 From e479d97cb71074cf0c9b5b6046759919afcc8991 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Thu, 4 Jul 2024 09:24:31 -0600 Subject: [PATCH 06/69] Add DRK Living Dead Threshold options --- XIVSlothCombo/Combos/PvE/DRK.cs | 5 +++-- XIVSlothCombo/Window/Functions/UserConfig.cs | 11 +++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/DRK.cs b/XIVSlothCombo/Combos/PvE/DRK.cs index 74932ad86..255788476 100644 --- a/XIVSlothCombo/Combos/PvE/DRK.cs +++ b/XIVSlothCombo/Combos/PvE/DRK.cs @@ -74,8 +74,9 @@ public const ushort public static class Config { public const string - DRK_KeepPlungeCharges = "DrkKeepPlungeCharges", - DRK_MPManagement = "DrkMPManagement", + DRK_ST_ManaSpenderPooling = "DRK_ST_ManaSpenderPooling", + DRK_ST_LivingDeadThreshold = "DRK_ST_LivingDeadThreshold", + DRK_AoE_LivingDeadThreshold = "DRK_AoE_LivingDeadThreshold", DRK_VariantCure = "DRKVariantCure"; } diff --git a/XIVSlothCombo/Window/Functions/UserConfig.cs b/XIVSlothCombo/Window/Functions/UserConfig.cs index 7fa3d7785..ba4ce9779 100644 --- a/XIVSlothCombo/Window/Functions/UserConfig.cs +++ b/XIVSlothCombo/Window/Functions/UserConfig.cs @@ -1463,11 +1463,14 @@ internal static void Draw(CustomComboPreset preset, bool enabled) // ==================================================================================== #region DARK KNIGHT - if (preset == CustomComboPreset.DRK_EoSPooling && enabled) - UserConfig.DrawSliderInt(0, 3000, DRK.Config.DRK_MPManagement, "How much MP to save (0 = Use All)", 150, SliderIncrements.Thousands); + if (preset == CustomComboPreset.DRK_ST_ManaSpenderPooling && enabled) + UserConfig.DrawSliderInt(0, 3000, DRK.Config.DRK_ST_ManaSpenderPooling, "How much MP to save (0 = Use All)", 150, SliderIncrements.Thousands); - if (preset == CustomComboPreset.DRK_Plunge && enabled) - UserConfig.DrawSliderInt(0, 1, DRK.Config.DRK_KeepPlungeCharges, "How many charges to keep ready? (0 = Use All)", 75, SliderIncrements.Ones); + if (preset == CustomComboPreset.DRK_ST_CDs_LivingShadow && enabled) + UserConfig.DrawSliderInt(0, 100, DRK.Config.DRK_ST_LivingDeadThreshold, "Stop Using When Target HP% is at or Below (Set to 0 to Disable This Check)"); + + if (preset == CustomComboPreset.DRK_AoE_CDs_LivingShadow && enabled) + UserConfig.DrawSliderInt(0, 100, DRK.Config.DRK_AoE_LivingDeadThreshold, "Stop Using When Target HP% is at or Below (Set to 0 to Disable This Check)"); if (preset == CustomComboPreset.DRKPvP_Burst) UserConfig.DrawSliderInt(1, 100, DRKPvP.Config.ShadowbringerThreshold, "HP% to be at or above to use Shadowbringer"); From 06bc12f044e896089795ed984ca780dcc3d28a31 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Thu, 4 Jul 2024 10:49:24 -0600 Subject: [PATCH 07/69] Flatten the Combos slightly, Update to new options, note work to be done --- XIVSlothCombo/Combos/PvE/DRK.cs | 421 +++++++++++++++++++------------- 1 file changed, 254 insertions(+), 167 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/DRK.cs b/XIVSlothCombo/Combos/PvE/DRK.cs index 255788476..d37e88381 100644 --- a/XIVSlothCombo/Combos/PvE/DRK.cs +++ b/XIVSlothCombo/Combos/PvE/DRK.cs @@ -80,207 +80,281 @@ public const string DRK_VariantCure = "DRKVariantCure"; } - internal class DRK_SouleaterCombo : CustomCombo + // todo: chop down very long ifs + + internal class DRK_Souleater_Combo : CustomCombo { - protected internal override CustomComboPreset Preset { get; } = CustomComboPreset.DRK_SouleaterCombo; + protected internal override CustomComboPreset Preset { get; } = CustomComboPreset.DRK_ST_Combo; protected override uint Invoke(uint actionID, uint lastComboMove, float comboTime, byte level) { - if (actionID == Souleater) - { - var gauge = GetJobGauge(); - var plungeChargesRemaining = PluginConfiguration.GetCustomIntValue(Config.DRK_KeepPlungeCharges); - var mpRemaining = PluginConfiguration.GetCustomIntValue(Config.DRK_MPManagement); - - if (IsEnabled(CustomComboPreset.DRK_Variant_Cure) && IsEnabled(Variant.VariantCure) && PlayerHealthPercentageHp() <= GetOptionValue(Config.DRK_VariantCure)) - return Variant.VariantCure; - - if (IsEnabled(CustomComboPreset.DRK_RangedUptime) && LevelChecked(Unmend) && !InMeleeRange() && HasBattleTarget()) - return Unmend; + // Bail if not looking at the replaced action + if (actionID != Souleater) return actionID; - if (InCombat()) + var gauge = GetJobGauge(); + var mpRemaining = PluginConfiguration.GetCustomIntValue(Config.DRK_ST_ManaSpenderPooling); + // todo: add hpRemaining for DRK_ST_LivingDeadThreshold + + // Variant Cure - Heal: Priority to save your life + if (IsEnabled(CustomComboPreset.DRK_Variant_Cure) + && IsEnabled(Variant.VariantCure) + && PlayerHealthPercentageHp() <= GetOptionValue(Config.DRK_VariantCure)) + return Variant.VariantCure; + + // Unmend Option + if (IsEnabled(CustomComboPreset.DRK_ST_RangedUptime) + && LevelChecked(Unmend) + && !InMeleeRange() + && HasBattleTarget()) + return Unmend; + + // Bail if not in combat + if (!InCombat()) return HardSlash; + + // oGCDs + if (CanWeave(actionID)) + { + // Variant Spirit Dart - DoT + var sustainedDamage = FindTargetEffect(Variant.Debuffs.SustainedDamage); + if (IsEnabled(CustomComboPreset.DRK_Variant_SpiritDart) + && IsEnabled(Variant.VariantSpiritDart) + && (sustainedDamage is null || sustainedDamage?.RemainingTime <= 3)) + return Variant.VariantSpiritDart; + + // Variant Ultimatum - AoE Agro stun + if (IsEnabled(CustomComboPreset.DRK_Variant_Ultimatum) + && IsEnabled(Variant.VariantUltimatum) + && IsOffCooldown(Variant.VariantUltimatum)) + return Variant.VariantUltimatum; + + //Mana Features + if (IsEnabled(CustomComboPreset.DRK_ST_ManaOvercap)) { - // oGCDs - if (CanWeave(actionID)) + if ((CombatEngageDuration().TotalSeconds < 7 && gauge.DarksideTimeRemaining == 0) // Initial Darkside upping + || CombatEngageDuration().TotalSeconds >= 6) { - Status? sustainedDamage = FindTargetEffect(Variant.Debuffs.SustainedDamage); - if (IsEnabled(CustomComboPreset.DRK_Variant_SpiritDart) && - IsEnabled(Variant.VariantSpiritDart) && - (sustainedDamage is null || sustainedDamage?.RemainingTime <= 3)) - return Variant.VariantSpiritDart; - - if (IsEnabled(CustomComboPreset.DRK_Variant_Ultimatum) && IsEnabled(Variant.VariantUltimatum) && IsOffCooldown(Variant.VariantUltimatum)) - return Variant.VariantUltimatum; - - //Mana Features - if (IsEnabled(CustomComboPreset.DRK_ManaOvercap)) - { - if ((CombatEngageDuration().TotalSeconds < 7 && gauge.DarksideTimeRemaining == 0) || CombatEngageDuration().TotalSeconds >= 6) - { - if (IsEnabled(CustomComboPreset.DRK_EoSPooling) && GetCooldownRemainingTime(Delirium) >= 40 && (gauge.HasDarkArts || LocalPlayer.CurrentMp > (mpRemaining + 3000)) && LevelChecked(EdgeOfDarkness) && CanDelayedWeave(actionID)) - return OriginalHook(EdgeOfDarkness); - if (gauge.HasDarkArts || LocalPlayer.CurrentMp > 8500 || (gauge.DarksideTimeRemaining < 10000 && LocalPlayer.CurrentMp >= 3000)) - { - if (LevelChecked(EdgeOfDarkness)) - return OriginalHook(EdgeOfDarkness); - if (LevelChecked(FloodOfDarkness) && !LevelChecked(EdgeOfDarkness)) - return FloodOfDarkness; - } - } - } - - //oGCD Features - if (gauge.DarksideTimeRemaining > 1) + // todo: this needs to be checked + if (IsEnabled(CustomComboPreset.DRK_ST_ManaSpenderPooling) + && GetCooldownRemainingTime(Delirium) >= 40 + && (gauge.HasDarkArts || LocalPlayer.CurrentMp > (mpRemaining + 3000)) + && LevelChecked(EdgeOfDarkness) && CanDelayedWeave(actionID)) + return OriginalHook(EdgeOfDarkness); + + if (gauge.HasDarkArts + || LocalPlayer.CurrentMp > 8500 // todo: this needs to be checked, at least + || (gauge.DarksideTimeRemaining < 10000 && LocalPlayer.CurrentMp >= 3000)) { - if (IsEnabled(CustomComboPreset.DRK_MainComboCDs_Group) && IsEnabled(CustomComboPreset.DRK_LivingShadow) && gauge.Blood >= 50 && IsOffCooldown(LivingShadow) && LevelChecked(LivingShadow)) - return LivingShadow; - - if (IsEnabled(CustomComboPreset.DRK_MainComboBuffs_Group)) - { - if (IsEnabled(CustomComboPreset.DRK_BloodWeapon) && IsOffCooldown(BloodWeapon) && LevelChecked(BloodWeapon)) - return BloodWeapon; - if (IsEnabled(CustomComboPreset.DRK_Delirium) && IsOffCooldown(Delirium) && LevelChecked(Delirium)) - return Delirium; - } - - if (IsEnabled(CustomComboPreset.DRK_MainComboCDs_Group)) - { - - if (IsEnabled(CustomComboPreset.DRK_SaltedEarth) && LevelChecked(SaltedEarth)) - { - if ((IsOffCooldown(SaltedEarth) && !HasEffect(Buffs.SaltedEarth)) || //Salted Earth - (HasEffect(Buffs.SaltedEarth) && IsOffCooldown(SaltAndDarkness) && IsOnCooldown(SaltedEarth) && LevelChecked(SaltAndDarkness) && GetBuffRemainingTime(Buffs.SaltedEarth) < 9)) //Salt and Darkness - return OriginalHook(SaltedEarth); - } - - if (LevelChecked(Shadowbringer) && IsEnabled(CustomComboPreset.DRK_Shadowbringer)) - { - if ((GetRemainingCharges(Shadowbringer) > 0 && IsNotEnabled(CustomComboPreset.DRK_ShadowbringerBurst)) || - (IsEnabled(CustomComboPreset.DRK_ShadowbringerBurst) && GetRemainingCharges(Shadowbringer) > 0 && gauge.ShadowTimeRemaining > 1 && IsOnCooldown(Delirium))) //burst feature - return Shadowbringer; - } - - if (IsEnabled(CustomComboPreset.DRK_CarveAndSpit) && IsOffCooldown(CarveAndSpit) && LevelChecked(CarveAndSpit)) - return CarveAndSpit; - if (LevelChecked(Plunge) && IsEnabled(CustomComboPreset.DRK_Plunge) && GetRemainingCharges(Plunge) > plungeChargesRemaining) - { - if (IsNotEnabled(CustomComboPreset.DRK_MeleePlunge) || - (IsEnabled(CustomComboPreset.DRK_MeleePlunge) && GetTargetDistance() <= 1 && - ((GetMaxCharges(Plunge) > 1 && GetCooldownRemainingTime(Delirium) >= 45) || - GetMaxCharges(Plunge) == 1))) - return Plunge; - } - } + // Return Edge of Darkness if available + if (LevelChecked(EdgeOfDarkness)) + return OriginalHook(EdgeOfDarkness); + if (LevelChecked(FloodOfDarkness) + && !LevelChecked(EdgeOfDarkness)) + return FloodOfDarkness; } } + } - //Delirium Features - if (LevelChecked(Delirium) && IsEnabled(CustomComboPreset.DRK_Bloodspiller) && IsEnabled(CustomComboPreset.DRK_MainComboCDs_Group)) + //oGCD Features + if (gauge.DarksideTimeRemaining > 1) + { + // Living Shadow + // todo: this needs to check with DRK_ST_LivingDeadThreshold + if (IsEnabled(CustomComboPreset.DRK_ST_CDs) + && IsEnabled(CustomComboPreset.DRK_ST_CDs_LivingShadow) + && IsOffCooldown(LivingShadow) + && LevelChecked(LivingShadow)) + return LivingShadow; + + // Delirium + if (IsEnabled(CustomComboPreset.DRK_ST_Delirium) + && IsOffCooldown(Delirium) + && LevelChecked(Delirium)) + return Delirium; + + // todo: Add Delirium combo + + if (IsEnabled(CustomComboPreset.DRK_ST_CDs)) { - //Regular Delirium - if (GetBuffStacks(Buffs.Delirium) > 0 && IsNotEnabled(CustomComboPreset.DRK_DelayedBloodspiller)) - return Bloodspiller; - - //Delayed Delirium - if (IsEnabled(CustomComboPreset.DRK_DelayedBloodspiller) && GetBuffStacks(Buffs.Delirium) > 0 && IsOnCooldown(BloodWeapon) && GetBuffStacks(Buffs.BloodWeapon) < 2) - return Bloodspiller; - - //Blood management before Delirium - if (IsEnabled(CustomComboPreset.DRK_Delirium) && - ((gauge.Blood >= 60 && GetCooldownRemainingTime(BloodWeapon) is > 0 and < 3) || (gauge.Blood >= 50 && GetCooldownRemainingTime(Delirium) > 37 && !HasEffect(Buffs.Delirium)))) - return Bloodspiller; - } + // Salted Earth + // todo: simplify this to make it easier to read + if (IsEnabled(CustomComboPreset.DRK_ST_CDs_SaltedEarth) + && LevelChecked(SaltedEarth) + ) + { + if ((IsOffCooldown(SaltedEarth) && !HasEffect(Buffs.SaltedEarth)) || //Salted Earth + (HasEffect(Buffs.SaltedEarth) && IsOffCooldown(SaltAndDarkness) && IsOnCooldown(SaltedEarth) && LevelChecked(SaltAndDarkness) && GetBuffRemainingTime(Buffs.SaltedEarth) < 9)) //Salt and Darkness + return OriginalHook(SaltedEarth); + } - // 1-2-3 combo - if (comboTime > 0) - { - if (lastComboMove == HardSlash && LevelChecked(SyphonStrike)) - return SyphonStrike; - if (lastComboMove == SyphonStrike && LevelChecked(Souleater)) + // Shadowbringer + // todo: simplify this to make it easier to read + if (LevelChecked(Shadowbringer) + && IsEnabled(CustomComboPreset.DRK_ST_CDs_Shadowbringer)) { - if (IsEnabled(CustomComboPreset.DRK_BloodGaugeOvercap) && LevelChecked(Bloodspiller) && gauge.Blood >= 90) - return Bloodspiller; - return Souleater; + if ((GetRemainingCharges(Shadowbringer) > 0 && IsNotEnabled(CustomComboPreset.DRK_ST_CDs_ShadowbringerBurst)) || // Dump + (IsEnabled(CustomComboPreset.DRK_ST_CDs_ShadowbringerBurst) && GetRemainingCharges(Shadowbringer) > 0 && gauge.ShadowTimeRemaining > 1 && IsOnCooldown(Delirium))) // Burst + return Shadowbringer; } + + // Carve and Spit + if (IsEnabled(CustomComboPreset.DRK_ST_CDs_CarveAndSpit) + && IsOffCooldown(CarveAndSpit) + && LevelChecked(CarveAndSpit)) + return CarveAndSpit; } } + } - return HardSlash; + //Delirium Features + if (LevelChecked(Delirium) + && IsEnabled(CustomComboPreset.DRK_ST_CDs_Bloodspiller) + && IsEnabled(CustomComboPreset.DRK_ST_CDs)) + { + //Regular Delirium + if (GetBuffStacks(Buffs.Delirium) > 0 + && IsNotEnabled(CustomComboPreset.DRK_ST_CDs_DelayedBloodspiller)) + return Bloodspiller; + + //Delayed Delirium + // todo: we can use this for mana generation on odd minutes + if (IsEnabled(CustomComboPreset.DRK_ST_CDs_DelayedBloodspiller) + && GetBuffStacks(Buffs.Delirium) > 0 + && IsOnCooldown(Delirium) + && GetBuffStacks(Buffs.BloodWeapon) < 2) + return Bloodspiller; + + //Blood management before Delirium + // todo: this needs to be checked + if (IsEnabled(CustomComboPreset.DRK_ST_Delirium) + && ( + (gauge.Blood >= 60 && GetCooldownRemainingTime(Delirium) is > 0 and < 3) + || (gauge.Blood >= 50 && GetCooldownRemainingTime(Delirium) > 37 && !HasEffect(Buffs.Delirium)) + )) + return Bloodspiller; } - return actionID; + // 1-2-3 combo + if (!(comboTime > 0)) return HardSlash; + if (lastComboMove == HardSlash && LevelChecked(SyphonStrike)) + return SyphonStrike; + if (lastComboMove == SyphonStrike && LevelChecked(Souleater)) + { + // Blood management + // todo: this needs to be checked + if (IsEnabled(CustomComboPreset.DRK_ST_BloodOvercap) + && LevelChecked(Bloodspiller) && gauge.Blood >= 90) + return Bloodspiller; + + return Souleater; + } + + return HardSlash; + } } - internal class DRK_StalwartSoulCombo : CustomCombo + internal class DRK_StalwartSoul_Combo : CustomCombo { - protected internal override CustomComboPreset Preset { get; } = CustomComboPreset.DRK_StalwartSoulCombo; + protected internal override CustomComboPreset Preset { get; } = CustomComboPreset.DRK_AoE_Combo; protected override uint Invoke(uint actionID, uint lastComboMove, float comboTime, byte level) { - if (actionID == StalwartSoul) - { - var gauge = GetJobGauge(); + // Bail if not looking at the replaced action + if (actionID != StalwartSoul) return actionID; + + var gauge = GetJobGauge(); - if (IsEnabled(CustomComboPreset.DRK_Variant_Cure) && IsEnabled(Variant.VariantCure) && PlayerHealthPercentageHp() <= GetOptionValue(Config.DRK_VariantCure)) - return Variant.VariantCure; + // Variant Cure - Heal: Priority to save your life + if (IsEnabled(CustomComboPreset.DRK_Variant_Cure) + && IsEnabled(Variant.VariantCure) + && PlayerHealthPercentageHp() <= GetOptionValue(Config.DRK_VariantCure)) + return Variant.VariantCure; - if (CanWeave(actionID)) + // oGCDs + if (CanWeave(actionID)) + { + // Variant Spirit Dart - DoT + var sustainedDamage = FindTargetEffect(Variant.Debuffs.SustainedDamage); + if (IsEnabled(CustomComboPreset.DRK_Variant_SpiritDart) + && IsEnabled(Variant.VariantSpiritDart) + && (sustainedDamage is null || sustainedDamage?.RemainingTime <= 3)) + return Variant.VariantSpiritDart; + + // Variant Ultimatum - AoE Agro stun + if (IsEnabled(CustomComboPreset.DRK_Variant_Ultimatum) + && IsEnabled(Variant.VariantUltimatum) + && IsOffCooldown(Variant.VariantUltimatum)) + return Variant.VariantUltimatum; + + // Mana Features + if (IsEnabled(CustomComboPreset.DRK_AoE_ManaOvercap) + && LevelChecked(FloodOfDarkness) + && (gauge.HasDarkArts || LocalPlayer.CurrentMp > 8500 || (gauge.DarksideTimeRemaining < 10 && LocalPlayer.CurrentMp >= 3000))) + return OriginalHook(FloodOfDarkness); + + if (gauge.DarksideTimeRemaining > 1) { - Status? sustainedDamage = FindTargetEffect(Variant.Debuffs.SustainedDamage); - if (IsEnabled(CustomComboPreset.DRK_Variant_SpiritDart) && - IsEnabled(Variant.VariantSpiritDart) && - (sustainedDamage is null || sustainedDamage?.RemainingTime <= 3)) - return Variant.VariantSpiritDart; - - if (IsEnabled(CustomComboPreset.DRK_Variant_Ultimatum) && IsEnabled(Variant.VariantUltimatum) && IsOffCooldown(Variant.VariantUltimatum)) - return Variant.VariantUltimatum; - - if (IsEnabled(CustomComboPreset.DRK_AoE_ManaOvercap) && LevelChecked(FloodOfDarkness) && (gauge.HasDarkArts || LocalPlayer.CurrentMp > 8500 || (gauge.DarksideTimeRemaining < 10 && LocalPlayer.CurrentMp >= 3000))) - return OriginalHook(FloodOfDarkness); - if (gauge.DarksideTimeRemaining > 1) + // Delirium + if (IsEnabled(CustomComboPreset.DRK_AoE_Delirium) + && IsOffCooldown(Delirium) + && LevelChecked(Delirium)) + return Delirium; + + // todo: Add Impalement + + // Living Shadow + // todo: this needs to check with DRK_AoE_LivingDeadThreshold + if (IsEnabled(CustomComboPreset.DRK_AoE_CDs_LivingShadow) + && IsOffCooldown(LivingShadow) + && LevelChecked(LivingShadow)) + return LivingShadow; + + // Salted Earth + if (IsEnabled(CustomComboPreset.DRK_AoE_CDs_SaltedEarth) + && LevelChecked(SaltedEarth)) { - if (IsEnabled(CustomComboPreset.DRK_AoE_BloodWeapon) && IsOffCooldown(BloodWeapon) && LevelChecked(BloodWeapon)) - return BloodWeapon; - if (IsEnabled(CustomComboPreset.DRK_AoE_Delirium) && IsOffCooldown(Delirium) && LevelChecked(Delirium)) - return Delirium; - if (IsEnabled(CustomComboPreset.DRK_AoE_LivingShadow) && gauge.Blood >= 50 && IsOffCooldown(LivingShadow) && LevelChecked(LivingShadow)) - return LivingShadow; - if (IsEnabled(CustomComboPreset.DRK_AoE_SaltedEarth) && LevelChecked(SaltedEarth)) - { - if ((IsOffCooldown(SaltedEarth) && !HasEffect(Buffs.SaltedEarth)) || //Salted Earth - (HasEffect(Buffs.SaltedEarth) && IsOffCooldown(SaltAndDarkness) && IsOnCooldown(SaltedEarth) && LevelChecked(SaltAndDarkness))) //Salt and Darkness - return OriginalHook(SaltedEarth); - } - - if (IsEnabled(CustomComboPreset.DRK_AoE_AbyssalDrain) && LevelChecked(AbyssalDrain) && IsOffCooldown(AbyssalDrain) && PlayerHealthPercentageHp() <= 60) - return AbyssalDrain; - if (IsEnabled(CustomComboPreset.DRK_AoE_Shadowbringer) && LevelChecked(Shadowbringer) && GetRemainingCharges(Shadowbringer) > 0) - return Shadowbringer; + if ((IsOffCooldown(SaltedEarth) && !HasEffect(Buffs.SaltedEarth)) || //Salted Earth + (HasEffect(Buffs.SaltedEarth) && IsOffCooldown(SaltAndDarkness) && IsOnCooldown(SaltedEarth) && LevelChecked(SaltAndDarkness))) //Salt and Darkness + return OriginalHook(SaltedEarth); } - } - if (IsEnabled(CustomComboPreset.DRK_Delirium)) - { - if (LevelChecked(Delirium) && HasEffect(Buffs.Delirium) && gauge.DarksideTimeRemaining > 0) - return Quietus; + // Abyssal Drain + if (IsEnabled(CustomComboPreset.DRK_AoE_CDs_AbyssalDrain) + && LevelChecked(AbyssalDrain) + && IsOffCooldown(AbyssalDrain) + && PlayerHealthPercentageHp() <= 60) + return AbyssalDrain; + + // Shadowbringer + if (IsEnabled(CustomComboPreset.DRK_AoE_CDs_Shadowbringer) + && LevelChecked(Shadowbringer) + && GetRemainingCharges(Shadowbringer) > 0) + return Shadowbringer; } + } - if (comboTime > 0) - { - if (lastComboMove == Unleash && LevelChecked(StalwartSoul)) - { - if (IsEnabled(CustomComboPreset.DRK_Overcap) && gauge.Blood >= 90 && LevelChecked(Quietus)) - return Quietus; - return StalwartSoul; - } - } + if (IsEnabled(CustomComboPreset.DRK_AoE_Delirium)) + { + if (LevelChecked(Delirium) + && HasEffect(Buffs.Delirium) + && gauge.DarksideTimeRemaining > 0) + return Quietus; + } - return Unleash; + // 1-2-3 combo + if (!(comboTime > 0)) return Unleash; + if (lastComboMove == Unleash && LevelChecked(StalwartSoul)) + { + if (IsEnabled(CustomComboPreset.DRK_AoE_BloodOvercap) + && gauge.Blood >= 90 + && LevelChecked(Quietus)) + return Quietus; + return StalwartSoul; } - return actionID; + return Unleash; + } } @@ -294,15 +368,28 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (actionID == CarveAndSpit || actionID == AbyssalDrain) { - if (gauge.Blood >= 50 && IsOffCooldown(LivingShadow) && LevelChecked(LivingShadow)) + if (gauge.Blood >= 50 + && IsOffCooldown(LivingShadow) + && LevelChecked(LivingShadow)) return LivingShadow; - if (IsOffCooldown(SaltedEarth) && LevelChecked(SaltedEarth)) + + if (IsOffCooldown(SaltedEarth) + && LevelChecked(SaltedEarth)) return SaltedEarth; - if (IsOffCooldown(CarveAndSpit) && LevelChecked(AbyssalDrain)) + + if (IsOffCooldown(CarveAndSpit) + && LevelChecked(AbyssalDrain)) return actionID; - if (IsOffCooldown(SaltAndDarkness) && HasEffect(Buffs.SaltedEarth) && LevelChecked(SaltAndDarkness)) + + if (IsOffCooldown(SaltAndDarkness) + && HasEffect(Buffs.SaltedEarth) + && LevelChecked(SaltAndDarkness)) return SaltAndDarkness; - if (IsEnabled(CustomComboPreset.DRK_Shadowbringer_oGCD) && GetCooldownRemainingTime(Shadowbringer) < 60 && LevelChecked(Shadowbringer) && gauge.DarksideTimeRemaining > 0) + + if (IsEnabled(CustomComboPreset.DRK_Shadowbringer_oGCD) + && GetCooldownRemainingTime(Shadowbringer) < 60 + && LevelChecked(Shadowbringer) + && gauge.DarksideTimeRemaining > 0) return Shadowbringer; } return actionID; From 42daf5d2fb1324654b29494c59a6416b99a9c44b Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Thu, 4 Jul 2024 10:49:37 -0600 Subject: [PATCH 08/69] Note work to be done --- XIVSlothCombo/Combos/CustomComboPreset.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index 8f4a8cdf1..7105879c0 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -1048,10 +1048,12 @@ public enum CustomComboPreset [CustomComboInfo("Cooldowns on Main Combo", "Collection of cooldowns to add to the main combo", DRK.JobID)] DRK_ST_CDs = 5004, + // todo: move this out of the cooldowns section [ParentCombo(DRK_ST_CDs)] [CustomComboInfo("Bloodspiller Feature", "Adds Bloodspiller when Delirium is active.", DRK.JobID)] DRK_ST_CDs_Bloodspiller = 5005, + // todo: move this under DRK_ST_CDs_Bloodspiller [ParentCombo(DRK_ST_CDs)] [CustomComboInfo("Delayed Bloodspiller Feature", "Delays Bloodspiller by 2 GCDs when Delirium is used during even windows, uses it regularly during odd windows. Useful for feeding into raid buffs at level 90.", DRK.JobID)] DRK_ST_CDs_DelayedBloodspiller = 5006, From 16996a50d3a0443996ac344d4bb1db09f2fe7ca9 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Sat, 6 Jul 2024 02:12:58 -0600 Subject: [PATCH 09/69] Reorder DRK to move Bloodspiller options out of the Cooldowns category --- XIVSlothCombo/Combos/CustomComboPreset.cs | 38 +++++++++++------------ 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index 7105879c0..849458b56 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -1048,56 +1048,54 @@ public enum CustomComboPreset [CustomComboInfo("Cooldowns on Main Combo", "Collection of cooldowns to add to the main combo", DRK.JobID)] DRK_ST_CDs = 5004, - // todo: move this out of the cooldowns section - [ParentCombo(DRK_ST_CDs)] - [CustomComboInfo("Bloodspiller Feature", "Adds Bloodspiller when Delirium is active.", DRK.JobID)] - DRK_ST_CDs_Bloodspiller = 5005, - - // todo: move this under DRK_ST_CDs_Bloodspiller - [ParentCombo(DRK_ST_CDs)] - [CustomComboInfo("Delayed Bloodspiller Feature", "Delays Bloodspiller by 2 GCDs when Delirium is used during even windows, uses it regularly during odd windows. Useful for feeding into raid buffs at level 90.", DRK.JobID)] - DRK_ST_CDs_DelayedBloodspiller = 5006, - [ParentCombo(DRK_ST_CDs)] [CustomComboInfo("Living Shadow Feature", "Living Shadow will now be on main combo if its not on cooldown.", DRK.JobID)] - DRK_ST_CDs_LivingShadow = 5007, + DRK_ST_CDs_LivingShadow = 5005, #region Shadowbringer Options [ParentCombo(DRK_ST_CDs)] [CustomComboInfo("Shadowbringer Feature", "Adds Shadowbringer on main combo while Darkside is up. Will use all stacks on cooldown.", DRK.JobID)] - DRK_ST_CDs_Shadowbringer = 5008, + DRK_ST_CDs_Shadowbringer = 5006, [ParentCombo(DRK_ST_CDs_Shadowbringer)] [CustomComboInfo("Shadowbringer Burst Option", "Pools Shadowbringer to use during even minute window bursts.", DRK.JobID)] - DRK_ST_CDs_ShadowbringerBurst = 5009, + DRK_ST_CDs_ShadowbringerBurst = 5007, #endregion - // Last value = 5009 + // Last value = 5007 [ParentCombo(DRK_ST_CDs)] [CustomComboInfo("Carve and Spit Feature", "Adds Carve and Spit on main combo while Darkside is up.", DRK.JobID)] - DRK_ST_CDs_CarveAndSpit = 5010, + DRK_ST_CDs_CarveAndSpit = 5008, [ParentCombo(DRK_ST_CDs)] [CustomComboInfo("Salted Earth Feature", "Adds Salted Earth on main combo while Darkside is up, will use Salt and Darkness if unlocked.", DRK.JobID)] - DRK_ST_CDs_SaltedEarth = 5011, + DRK_ST_CDs_SaltedEarth = 5009, #endregion - // Last value = 5011 + // Last value = 50096 #region Mana Overcap Options [ParentCombo(DRK_ST_Combo)] [CustomComboInfo("Edge of Shadow Overcap Feature", "Uses Edge of Shadow if you are above 8,500 mana or Darkside is about to expire (10sec or less)", DRK.JobID)] - DRK_ST_ManaOvercap = 5012, + DRK_ST_ManaOvercap = 5010, [ParentCombo(DRK_ST_ManaOvercap)] [CustomComboInfo("Edge of Shadow Burst Option", "Uses Edge of Shadow until chosen MP limit is reached during minute window bursts.", DRK.JobID)] - DRK_ST_ManaSpenderPooling = 5013, + DRK_ST_ManaSpenderPooling = 5011, #endregion - // Last value = 5013 + // Last value = 5011 + + [ParentCombo(DRK_ST_Combo)] + [CustomComboInfo("Bloodspiller Feature", "Adds Bloodspiller when Delirium is active.", DRK.JobID)] + DRK_ST_CDs_Bloodspiller = 5012, + + [ParentCombo(DRK_ST_CDs_Bloodspiller)] + [CustomComboInfo("Delayed Bloodspiller Feature", "Delays Bloodspiller by 2 GCDs when Delirium is used during even windows, uses it regularly during odd windows. Useful for feeding into raid buffs at level 90.", DRK.JobID)] + DRK_ST_CDs_DelayedBloodspiller = 5013, [ParentCombo(DRK_ST_Combo)] [CustomComboInfo("Blood Gauge Overcap Feature", "Adds Bloodspiller onto main combo when at 80 blood gauge or higher.", DRK.JobID)] From d5fd0f1f673857d78f72595d0854882f80ccd221 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Sat, 6 Jul 2024 03:21:40 -0600 Subject: [PATCH 10/69] Update combo code to work after DT changes --- XIVSlothCombo/Combos/PvE/DRK.cs | 81 +++++++++++++++------------------ 1 file changed, 37 insertions(+), 44 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/DRK.cs b/XIVSlothCombo/Combos/PvE/DRK.cs index d37e88381..0e85bbfcc 100644 --- a/XIVSlothCombo/Combos/PvE/DRK.cs +++ b/XIVSlothCombo/Combos/PvE/DRK.cs @@ -1,3 +1,4 @@ +using System.Diagnostics.CodeAnalysis; using Dalamud.Game.ClientState.JobGauge.Types; using Dalamud.Game.ClientState.Statuses; using XIVSlothCombo.Combos.PvE.Content; @@ -6,10 +7,13 @@ namespace XIVSlothCombo.Combos.PvE { + [SuppressMessage("ReSharper", "MemberCanBePrivate.Global")] internal static class DRK { public const byte JobID = 32; + #region Actions + public const uint // Single-Target 1-2-3 Combo HardSlash = 3617, @@ -49,6 +53,9 @@ public const uint // Ranged Option Unmend = 3624; + #endregion + + [SuppressMessage("ReSharper", "MemberHidesStaticFromOuterClass")] public static class Buffs { public const ushort @@ -71,6 +78,7 @@ public const ushort Placeholder = 1; } + [SuppressMessage("ReSharper", "InconsistentNaming")] public static class Config { public const string @@ -128,29 +136,29 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return Variant.VariantUltimatum; //Mana Features - if (IsEnabled(CustomComboPreset.DRK_ST_ManaOvercap)) + if (IsEnabled(CustomComboPreset.DRK_ST_ManaOvercap) + && ((CombatEngageDuration().TotalSeconds < 7 && gauge.DarksideTimeRemaining == 0) // Initial Darkside upping + || CombatEngageDuration().TotalSeconds >= 6)) { - if ((CombatEngageDuration().TotalSeconds < 7 && gauge.DarksideTimeRemaining == 0) // Initial Darkside upping - || CombatEngageDuration().TotalSeconds >= 6) + // Spend mana to limit when not near even minute burst windows + if (IsEnabled(CustomComboPreset.DRK_ST_ManaSpenderPooling) + && GetCooldownRemainingTime(LivingShadow) >= 45 + && (gauge.HasDarkArts || LocalPlayer.CurrentMp > (mpRemaining + 3000)) + && LevelChecked(EdgeOfDarkness) + && CanDelayedWeave(actionID)) + return OriginalHook(EdgeOfDarkness); + + // Keep Darkside up + if (gauge.HasDarkArts + || LocalPlayer.CurrentMp > 8500 + || (gauge.DarksideTimeRemaining < 10000 && LocalPlayer.CurrentMp >= 3000)) { - // todo: this needs to be checked - if (IsEnabled(CustomComboPreset.DRK_ST_ManaSpenderPooling) - && GetCooldownRemainingTime(Delirium) >= 40 - && (gauge.HasDarkArts || LocalPlayer.CurrentMp > (mpRemaining + 3000)) - && LevelChecked(EdgeOfDarkness) && CanDelayedWeave(actionID)) + // Return Edge of Darkness if available + if (LevelChecked(EdgeOfDarkness)) return OriginalHook(EdgeOfDarkness); - - if (gauge.HasDarkArts - || LocalPlayer.CurrentMp > 8500 // todo: this needs to be checked, at least - || (gauge.DarksideTimeRemaining < 10000 && LocalPlayer.CurrentMp >= 3000)) - { - // Return Edge of Darkness if available - if (LevelChecked(EdgeOfDarkness)) - return OriginalHook(EdgeOfDarkness); - if (LevelChecked(FloodOfDarkness) - && !LevelChecked(EdgeOfDarkness)) - return FloodOfDarkness; - } + if (LevelChecked(FloodOfDarkness) + && !LevelChecked(EdgeOfDarkness)) + return FloodOfDarkness; } } @@ -171,8 +179,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim && LevelChecked(Delirium)) return Delirium; - // todo: Add Delirium combo - if (IsEnabled(CustomComboPreset.DRK_ST_CDs)) { // Salted Earth @@ -207,28 +213,27 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //Delirium Features if (LevelChecked(Delirium) - && IsEnabled(CustomComboPreset.DRK_ST_CDs_Bloodspiller) - && IsEnabled(CustomComboPreset.DRK_ST_CDs)) + && IsEnabled(CustomComboPreset.DRK_ST_Bloodspiller)) { - //Regular Delirium + + //Regular Bloodspiller if (GetBuffStacks(Buffs.Delirium) > 0 - && IsNotEnabled(CustomComboPreset.DRK_ST_CDs_DelayedBloodspiller)) + && IsNotEnabled(CustomComboPreset.DRK_ST_DelayedBloodspiller)) return Bloodspiller; //Delayed Delirium // todo: we can use this for mana generation on odd minutes - if (IsEnabled(CustomComboPreset.DRK_ST_CDs_DelayedBloodspiller) + if (IsEnabled(CustomComboPreset.DRK_ST_DelayedBloodspiller) && GetBuffStacks(Buffs.Delirium) > 0 && IsOnCooldown(Delirium) && GetBuffStacks(Buffs.BloodWeapon) < 2) return Bloodspiller; //Blood management before Delirium - // todo: this needs to be checked if (IsEnabled(CustomComboPreset.DRK_ST_Delirium) && ( (gauge.Blood >= 60 && GetCooldownRemainingTime(Delirium) is > 0 and < 3) - || (gauge.Blood >= 50 && GetCooldownRemainingTime(Delirium) > 37 && !HasEffect(Buffs.Delirium)) + || (gauge.Blood >= 50 && GetCooldownRemainingTime(Delirium) > 37) )) return Bloodspiller; } @@ -240,7 +245,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (lastComboMove == SyphonStrike && LevelChecked(Souleater)) { // Blood management - // todo: this needs to be checked if (IsEnabled(CustomComboPreset.DRK_ST_BloodOvercap) && LevelChecked(Bloodspiller) && gauge.Blood >= 90) return Bloodspiller; @@ -270,7 +274,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim && PlayerHealthPercentageHp() <= GetOptionValue(Config.DRK_VariantCure)) return Variant.VariantCure; - // oGCDs if (CanWeave(actionID)) { @@ -301,8 +304,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim && LevelChecked(Delirium)) return Delirium; - // todo: Add Impalement - // Living Shadow // todo: this needs to check with DRK_AoE_LivingDeadThreshold if (IsEnabled(CustomComboPreset.DRK_AoE_CDs_LivingShadow) @@ -311,6 +312,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return LivingShadow; // Salted Earth + // todo: simplify this to make it easier to read if (IsEnabled(CustomComboPreset.DRK_AoE_CDs_SaltedEarth) && LevelChecked(SaltedEarth)) { @@ -334,14 +336,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } } - if (IsEnabled(CustomComboPreset.DRK_AoE_Delirium)) - { - if (LevelChecked(Delirium) - && HasEffect(Buffs.Delirium) - && gauge.DarksideTimeRemaining > 0) - return Quietus; - } - // 1-2-3 combo if (!(comboTime > 0)) return Unleash; if (lastComboMove == Unleash && LevelChecked(StalwartSoul)) @@ -368,8 +362,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (actionID == CarveAndSpit || actionID == AbyssalDrain) { - if (gauge.Blood >= 50 - && IsOffCooldown(LivingShadow) + if (IsOffCooldown(LivingShadow) && LevelChecked(LivingShadow)) return LivingShadow; @@ -396,4 +389,4 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } } } -} \ No newline at end of file +} From f7a299e0288a9db6034a131155276eb9ecb14ac9 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Sat, 6 Jul 2024 03:22:31 -0600 Subject: [PATCH 11/69] Add DRK Delirium action chain, Add option to spend DA under TBN --- XIVSlothCombo/Combos/CustomComboPreset.cs | 14 +++++------ XIVSlothCombo/Combos/PvE/DRK.cs | 30 +++++++++++++++++++++++ 2 files changed, 37 insertions(+), 7 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index 849458b56..bfbf416c5 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -1079,11 +1079,11 @@ public enum CustomComboPreset #region Mana Overcap Options [ParentCombo(DRK_ST_Combo)] - [CustomComboInfo("Edge of Shadow Overcap Feature", "Uses Edge of Shadow if you are above 8,500 mana or Darkside is about to expire (10sec or less)", DRK.JobID)] + [CustomComboInfo("Edge of Shadow Overcap Feature", "Uses Edge of Shadow if you are above 8,500 mana, Darkside is about to expire (10sec or less), or if you have Dark Arts and use The Blackest Night.", DRK.JobID)] DRK_ST_ManaOvercap = 5010, [ParentCombo(DRK_ST_ManaOvercap)] - [CustomComboInfo("Edge of Shadow Burst Option", "Uses Edge of Shadow until chosen MP limit is reached during minute window bursts.", DRK.JobID)] + [CustomComboInfo("Edge of Shadow Burst Option", "Pools Edge of Shadow for even minute burst windows, and otherwise uses them until chosen MP limit is reached.", DRK.JobID)] DRK_ST_ManaSpenderPooling = 5011, #endregion @@ -1091,11 +1091,11 @@ public enum CustomComboPreset [ParentCombo(DRK_ST_Combo)] [CustomComboInfo("Bloodspiller Feature", "Adds Bloodspiller when Delirium is active.", DRK.JobID)] - DRK_ST_CDs_Bloodspiller = 5012, + DRK_ST_Bloodspiller = 5012, - [ParentCombo(DRK_ST_CDs_Bloodspiller)] + [ParentCombo(DRK_ST_Bloodspiller)] [CustomComboInfo("Delayed Bloodspiller Feature", "Delays Bloodspiller by 2 GCDs when Delirium is used during even windows, uses it regularly during odd windows. Useful for feeding into raid buffs at level 90.", DRK.JobID)] - DRK_ST_CDs_DelayedBloodspiller = 5013, + DRK_ST_DelayedBloodspiller = 5013, [ParentCombo(DRK_ST_Combo)] [CustomComboInfo("Blood Gauge Overcap Feature", "Adds Bloodspiller onto main combo when at 80 blood gauge or higher.", DRK.JobID)] @@ -1153,11 +1153,11 @@ public enum CustomComboPreset // Last value = 5023 [ParentCombo(DRK_AoE_Combo)] - [CustomComboInfo("Flood of Shadow Overcap Feature", "Uses Flood of Shadow if you are above 8.5k mana or Darkside is about to expire (10sec or less)", DRK.JobID)] + [CustomComboInfo("Flood of Shadow Overcap Feature", "Uses Flood of Shadow if you are above 8.5k mana, Darkside is about to expire (10sec or less), or if you have Dark Arts and use The Blackest Night.", DRK.JobID)] DRK_AoE_ManaOvercap = 5024, [ParentCombo(DRK_AoE_Combo)] - [CustomComboInfo("Blood Gauge Overcap Feature", "Adds Bloodspiller onto AOE combo when at 80 blood gauge or higher.", DRK.JobID)] + [CustomComboInfo("Blood Gauge Overcap Feature", "Adds Quietus onto AOE combo when at 80 blood gauge or higher.", DRK.JobID)] DRK_AoE_BloodOvercap = 5025, #endregion diff --git a/XIVSlothCombo/Combos/PvE/DRK.cs b/XIVSlothCombo/Combos/PvE/DRK.cs index 0e85bbfcc..57b77ead4 100644 --- a/XIVSlothCombo/Combos/PvE/DRK.cs +++ b/XIVSlothCombo/Combos/PvE/DRK.cs @@ -135,6 +135,21 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim && IsOffCooldown(Variant.VariantUltimatum)) return Variant.VariantUltimatum; + // Spend Dark Arts when TBN is up + if (IsEnabled(CustomComboPreset.DRK_ST_ManaOvercap) + && HasEffect(Buffs.BlackestNight) + && gauge.HasDarkArts + && LevelChecked(EdgeOfDarkness)) + return OriginalHook(EdgeOfDarkness); + + // Delirium Chain + if (LevelChecked(Delirium) + && LevelChecked(ScarletDelirium) + && IsEnabled(CustomComboPreset.DRK_ST_Delirium_Chain) + && HasEffect(Buffs.Delirium) + && gauge.DarksideTimeRemaining > 0) + return OriginalHook(Bloodspiller); + //Mana Features if (IsEnabled(CustomComboPreset.DRK_ST_ManaOvercap) && ((CombatEngageDuration().TotalSeconds < 7 && gauge.DarksideTimeRemaining == 0) // Initial Darkside upping @@ -290,6 +305,21 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim && IsOffCooldown(Variant.VariantUltimatum)) return Variant.VariantUltimatum; + // Spend Dark Arts when TBN is up + if (IsEnabled(CustomComboPreset.DRK_AoE_ManaOvercap) + && HasEffect(Buffs.BlackestNight) + && gauge.HasDarkArts + && LevelChecked(FloodOfDarkness)) + return OriginalHook(FloodOfDarkness); + + // Delirium Chain + if (LevelChecked(Delirium) + && LevelChecked(Impalement) + && IsEnabled(CustomComboPreset.DRK_AoE_Delirium_Chain) + && HasEffect(Buffs.Delirium) + && gauge.DarksideTimeRemaining > 0) + return OriginalHook(Quietus); + // Mana Features if (IsEnabled(CustomComboPreset.DRK_AoE_ManaOvercap) && LevelChecked(FloodOfDarkness) From f38a23415315628973e7f0bf4f9b22c5629ba0f2 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Sat, 6 Jul 2024 05:15:26 -0600 Subject: [PATCH 12/69] Add DRK options to use Disesteem on both combos --- XIVSlothCombo/Combos/CustomComboPreset.cs | 88 ++++++++++++++--------- 1 file changed, 53 insertions(+), 35 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index bfbf416c5..4a8f1e6f4 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -1048,154 +1048,172 @@ public enum CustomComboPreset [CustomComboInfo("Cooldowns on Main Combo", "Collection of cooldowns to add to the main combo", DRK.JobID)] DRK_ST_CDs = 5004, + #region Living Shadow Options + [ParentCombo(DRK_ST_CDs)] [CustomComboInfo("Living Shadow Feature", "Living Shadow will now be on main combo if its not on cooldown.", DRK.JobID)] DRK_ST_CDs_LivingShadow = 5005, + [ParentCombo(DRK_ST_CDs_LivingShadow)] + [CustomComboInfo("Disesteem Option", "Adds Disesteem to the AoE combo when available.", DRK.JobID)] + DRK_ST_CDs_Disesteem = 5006, + + #endregion + // Last value = 5006 + #region Shadowbringer Options [ParentCombo(DRK_ST_CDs)] [CustomComboInfo("Shadowbringer Feature", "Adds Shadowbringer on main combo while Darkside is up. Will use all stacks on cooldown.", DRK.JobID)] - DRK_ST_CDs_Shadowbringer = 5006, + DRK_ST_CDs_Shadowbringer = 5007, [ParentCombo(DRK_ST_CDs_Shadowbringer)] [CustomComboInfo("Shadowbringer Burst Option", "Pools Shadowbringer to use during even minute window bursts.", DRK.JobID)] - DRK_ST_CDs_ShadowbringerBurst = 5007, + DRK_ST_CDs_ShadowbringerBurst = 5008, #endregion - // Last value = 5007 + // Last value = 5008 [ParentCombo(DRK_ST_CDs)] [CustomComboInfo("Carve and Spit Feature", "Adds Carve and Spit on main combo while Darkside is up.", DRK.JobID)] - DRK_ST_CDs_CarveAndSpit = 5008, + DRK_ST_CDs_CarveAndSpit = 5009, [ParentCombo(DRK_ST_CDs)] [CustomComboInfo("Salted Earth Feature", "Adds Salted Earth on main combo while Darkside is up, will use Salt and Darkness if unlocked.", DRK.JobID)] - DRK_ST_CDs_SaltedEarth = 5009, + DRK_ST_CDs_SaltedEarth = 5010, #endregion - // Last value = 50096 + // Last value = 5010 #region Mana Overcap Options [ParentCombo(DRK_ST_Combo)] [CustomComboInfo("Edge of Shadow Overcap Feature", "Uses Edge of Shadow if you are above 8,500 mana, Darkside is about to expire (10sec or less), or if you have Dark Arts and use The Blackest Night.", DRK.JobID)] - DRK_ST_ManaOvercap = 5010, + DRK_ST_ManaOvercap = 5011, [ParentCombo(DRK_ST_ManaOvercap)] [CustomComboInfo("Edge of Shadow Burst Option", "Pools Edge of Shadow for even minute burst windows, and otherwise uses them until chosen MP limit is reached.", DRK.JobID)] - DRK_ST_ManaSpenderPooling = 5011, + DRK_ST_ManaSpenderPooling = 5012, #endregion - // Last value = 5011 + // Last value = 5012 [ParentCombo(DRK_ST_Combo)] [CustomComboInfo("Bloodspiller Feature", "Adds Bloodspiller when Delirium is active.", DRK.JobID)] - DRK_ST_Bloodspiller = 5012, + DRK_ST_Bloodspiller = 5013, [ParentCombo(DRK_ST_Bloodspiller)] [CustomComboInfo("Delayed Bloodspiller Feature", "Delays Bloodspiller by 2 GCDs when Delirium is used during even windows, uses it regularly during odd windows. Useful for feeding into raid buffs at level 90.", DRK.JobID)] - DRK_ST_DelayedBloodspiller = 5013, + DRK_ST_DelayedBloodspiller = 5014, [ParentCombo(DRK_ST_Combo)] [CustomComboInfo("Blood Gauge Overcap Feature", "Adds Bloodspiller onto main combo when at 80 blood gauge or higher.", DRK.JobID)] - DRK_ST_BloodOvercap = 5014, + DRK_ST_BloodOvercap = 5015, [ParentCombo(DRK_ST_Combo)] [CustomComboInfo("Unmend Uptime Feature", "Replace Souleater Combo Feature with Unmend when you are out of range.", DRK.JobID)] - DRK_ST_RangedUptime = 5015, + DRK_ST_RangedUptime = 5016, #endregion - // Last value = 5015 + // Last value = 5016 #region Stalwart Soul (Multi Target) Combo [ReplaceSkill(DRK.StalwartSoul)] [CustomComboInfo("Stalwart Soul Combo", "Replace Stalwart Soul with its combo chain.", DRK.JobID)] - DRK_AoE_Combo = 5016, + DRK_AoE_Combo = 5017, #region Buff Options [ParentCombo(DRK_AoE_Combo)] [CustomComboInfo("Delirium Option", "Adds Delirium to AoE combo on cooldown and when Darkside is up.", DRK.JobID)] - DRK_AoE_Delirium = 5017, + DRK_AoE_Delirium = 5018, [ParentCombo(DRK_AoE_Delirium)] [CustomComboInfo("Impalement Feature", "Adds all Impalement uses when Delirium is activated.", DRK.JobID)] - DRK_AoE_Delirium_Chain = 5018, + DRK_AoE_Delirium_Chain = 5019, #endregion - // Last value = 5018 + // Last value = 5019 #region Cooldowns [ParentCombo(DRK_AoE_Combo)] [CustomComboInfo("Cooldowns on AoE Combo", "Collection of cooldowns to add to the AoE combo", DRK.JobID)] - DRK_AoE_CDs = 5019, + DRK_AoE_CDs = 5020, [ParentCombo(DRK_AoE_CDs)] [CustomComboInfo("AoE Shadowbringer Feature", "Adds Shadowbringer to the AoE combo.", DRK.JobID)] - DRK_AoE_CDs_Shadowbringer = 5020, + DRK_AoE_CDs_Shadowbringer = 5021, + + #region Living Shadow Options [ParentCombo(DRK_AoE_CDs)] - [CustomComboInfo("Living Shadow Option", "Adds Living Shadow to AoE on cooldown and when Darkside is up.", DRK.JobID)] - DRK_AoE_CDs_LivingShadow = 5021, + [CustomComboInfo("Living Shadow Option", "Adds Living Shadow to the AoE combo on cooldown and when Darkside is up.", DRK.JobID)] + DRK_AoE_CDs_LivingShadow = 5022, + + [ParentCombo(DRK_AoE_CDs_LivingShadow)] + [CustomComboInfo("Disesteem Option", "Adds Disesteem to the AoE combo when available.", DRK.JobID)] + DRK_AoE_CDs_Disesteem = 5023, + + #endregion + // Last value = 5023 [ParentCombo(DRK_AoE_CDs)] [CustomComboInfo("Abyssal Drain Feature", "Adds abyssal drain to the AoE combo when you fall below 60 percent hp.", DRK.JobID)] - DRK_AoE_CDs_AbyssalDrain = 5022, + DRK_AoE_CDs_AbyssalDrain = 5024, [ParentCombo(DRK_AoE_CDs)] [CustomComboInfo("Salted Earth Option", "Adds Salted Earth and Salt and Darkness to AoE on cooldown and when Darkside is up.", DRK.JobID)] - DRK_AoE_CDs_SaltedEarth = 5023, + DRK_AoE_CDs_SaltedEarth = 5025, #endregion - // Last value = 5023 + // Last value = 5025 [ParentCombo(DRK_AoE_Combo)] [CustomComboInfo("Flood of Shadow Overcap Feature", "Uses Flood of Shadow if you are above 8.5k mana, Darkside is about to expire (10sec or less), or if you have Dark Arts and use The Blackest Night.", DRK.JobID)] - DRK_AoE_ManaOvercap = 5024, + DRK_AoE_ManaOvercap = 5026, [ParentCombo(DRK_AoE_Combo)] [CustomComboInfo("Blood Gauge Overcap Feature", "Adds Quietus onto AOE combo when at 80 blood gauge or higher.", DRK.JobID)] - DRK_AoE_BloodOvercap = 5025, + DRK_AoE_BloodOvercap = 5027, #endregion - // Last value = 5025 + // Last value = 5027 #region oGCD Feature [ReplaceSkill(DRK.CarveAndSpit, DRK.AbyssalDrain)] [ConflictingCombos(DRK_ST_CDs)] [CustomComboInfo("oGCD Feature", "Adds Living Shadow > Salted Earth > Salt And Darkness to Carve And Spit and Abyssal Drain", DRK.JobID)] - DRK_oGCD = 5026, + DRK_oGCD = 5028, [ParentCombo(DRK_oGCD)] [CustomComboInfo("Shadowbringer oGCD Feature", "Adds Shadowbringer to oGCD Feature ", DRK.JobID)] - DRK_Shadowbringer_oGCD = 5027, + DRK_Shadowbringer_oGCD = 5029, #endregion - // Last value = 5027 + // Last value = 5029 #region Variant [Variant] [VariantParent(DRK_ST_Combo, DRK_AoE_Combo)] [CustomComboInfo("Spirit Dart Option", "Use Variant Spirit Dart whenever the debuff is not present or less than 3s.", DRK.JobID)] - DRK_Variant_SpiritDart = 5028, + DRK_Variant_SpiritDart = 5030, [Variant] [VariantParent(DRK_ST_Combo, DRK_AoE_Combo)] [CustomComboInfo("Cure Option", "Use Variant Cure when HP is below set threshold.", DRK.JobID)] - DRK_Variant_Cure = 5029, + DRK_Variant_Cure = 5031, [Variant] [VariantParent(DRK_ST_Combo, DRK_AoE_Combo)] [CustomComboInfo("Ultimatum Option", "Use Variant Ultimatum on cooldown.", DRK.JobID)] - DRK_Variant_Ultimatum = 5030, + DRK_Variant_Ultimatum = 5032, #endregion - // Last value = 5030 + // Last value = 5032 #endregion From ec00929114984420f8e175d921358e5da8865c86 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Sat, 6 Jul 2024 05:16:37 -0600 Subject: [PATCH 13/69] Add Disesteem to both combos, Correct Torcleaver combo out of oGCDs --- XIVSlothCombo/Combos/PvE/DRK.cs | 54 +++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 19 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/DRK.cs b/XIVSlothCombo/Combos/PvE/DRK.cs index 57b77ead4..4a51228d3 100644 --- a/XIVSlothCombo/Combos/PvE/DRK.cs +++ b/XIVSlothCombo/Combos/PvE/DRK.cs @@ -119,6 +119,14 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim // Bail if not in combat if (!InCombat()) return HardSlash; + // Disesteem + if (LevelChecked(LivingShadow) + && LevelChecked(Disesteem) + && IsEnabled(CustomComboPreset.DRK_ST_CDs_Disesteem) + && HasEffect(Buffs.Scorn) + && gauge.DarksideTimeRemaining > 0) + return OriginalHook(Disesteem); + // oGCDs if (CanWeave(actionID)) { @@ -142,18 +150,10 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim && LevelChecked(EdgeOfDarkness)) return OriginalHook(EdgeOfDarkness); - // Delirium Chain - if (LevelChecked(Delirium) - && LevelChecked(ScarletDelirium) - && IsEnabled(CustomComboPreset.DRK_ST_Delirium_Chain) - && HasEffect(Buffs.Delirium) - && gauge.DarksideTimeRemaining > 0) - return OriginalHook(Bloodspiller); - //Mana Features if (IsEnabled(CustomComboPreset.DRK_ST_ManaOvercap) && ((CombatEngageDuration().TotalSeconds < 7 && gauge.DarksideTimeRemaining == 0) // Initial Darkside upping - || CombatEngageDuration().TotalSeconds >= 6)) + || CombatEngageDuration().TotalSeconds >= 20)) { // Spend mana to limit when not near even minute burst windows if (IsEnabled(CustomComboPreset.DRK_ST_ManaSpenderPooling) @@ -163,10 +163,10 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim && CanDelayedWeave(actionID)) return OriginalHook(EdgeOfDarkness); - // Keep Darkside up + // Keep Darkside up, spend Dark Arts if (gauge.HasDarkArts || LocalPlayer.CurrentMp > 8500 - || (gauge.DarksideTimeRemaining < 10000 && LocalPlayer.CurrentMp >= 3000)) + || (gauge.DarksideTimeRemaining < 10000 && LocalPlayer.CurrentMp > (mpRemaining + 3000))) { // Return Edge of Darkness if available if (LevelChecked(EdgeOfDarkness)) @@ -253,6 +253,14 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return Bloodspiller; } + // Delirium Chain + if (LevelChecked(Delirium) + && LevelChecked(ScarletDelirium) + && IsEnabled(CustomComboPreset.DRK_ST_Delirium_Chain) + && HasEffect(Buffs.Delirium) + && gauge.DarksideTimeRemaining > 0) + return OriginalHook(Bloodspiller); + // 1-2-3 combo if (!(comboTime > 0)) return HardSlash; if (lastComboMove == HardSlash && LevelChecked(SyphonStrike)) @@ -289,6 +297,14 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim && PlayerHealthPercentageHp() <= GetOptionValue(Config.DRK_VariantCure)) return Variant.VariantCure; + // Disesteem + if (LevelChecked(LivingShadow) + && LevelChecked(Disesteem) + && IsEnabled(CustomComboPreset.DRK_AoE_CDs_Disesteem) + && HasEffect(Buffs.Scorn) + && gauge.DarksideTimeRemaining > 0) + return OriginalHook(Disesteem); + // oGCDs if (CanWeave(actionID)) { @@ -312,14 +328,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim && LevelChecked(FloodOfDarkness)) return OriginalHook(FloodOfDarkness); - // Delirium Chain - if (LevelChecked(Delirium) - && LevelChecked(Impalement) - && IsEnabled(CustomComboPreset.DRK_AoE_Delirium_Chain) - && HasEffect(Buffs.Delirium) - && gauge.DarksideTimeRemaining > 0) - return OriginalHook(Quietus); - // Mana Features if (IsEnabled(CustomComboPreset.DRK_AoE_ManaOvercap) && LevelChecked(FloodOfDarkness) @@ -366,6 +374,14 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } } + // Delirium Chain + if (LevelChecked(Delirium) + && LevelChecked(Impalement) + && IsEnabled(CustomComboPreset.DRK_AoE_Delirium_Chain) + && HasEffect(Buffs.Delirium) + && gauge.DarksideTimeRemaining > 1) + return OriginalHook(Quietus); + // 1-2-3 combo if (!(comboTime > 0)) return Unleash; if (lastComboMove == Unleash && LevelChecked(StalwartSoul)) From 73fe2bd2e95b6423aff1af9aa6f91a3f9e05fc6f Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Sat, 6 Jul 2024 05:44:24 -0600 Subject: [PATCH 14/69] Add remainingHP% checks before using Living Dead --- XIVSlothCombo/Combos/PvE/DRK.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/DRK.cs b/XIVSlothCombo/Combos/PvE/DRK.cs index 4a51228d3..812e82904 100644 --- a/XIVSlothCombo/Combos/PvE/DRK.cs +++ b/XIVSlothCombo/Combos/PvE/DRK.cs @@ -101,7 +101,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim var gauge = GetJobGauge(); var mpRemaining = PluginConfiguration.GetCustomIntValue(Config.DRK_ST_ManaSpenderPooling); - // todo: add hpRemaining for DRK_ST_LivingDeadThreshold + var hpRemaining = PluginConfiguration.GetCustomIntValue(Config.DRK_ST_LivingDeadThreshold); // Variant Cure - Heal: Priority to save your life if (IsEnabled(CustomComboPreset.DRK_Variant_Cure) @@ -181,11 +181,11 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (gauge.DarksideTimeRemaining > 1) { // Living Shadow - // todo: this needs to check with DRK_ST_LivingDeadThreshold if (IsEnabled(CustomComboPreset.DRK_ST_CDs) && IsEnabled(CustomComboPreset.DRK_ST_CDs_LivingShadow) && IsOffCooldown(LivingShadow) - && LevelChecked(LivingShadow)) + && LevelChecked(LivingShadow) + && GetTargetHPPercent() > hpRemaining) return LivingShadow; // Delirium @@ -290,6 +290,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (actionID != StalwartSoul) return actionID; var gauge = GetJobGauge(); + var hpRemaining = PluginConfiguration.GetCustomIntValue(Config.DRK_AoE_LivingDeadThreshold); // Variant Cure - Heal: Priority to save your life if (IsEnabled(CustomComboPreset.DRK_Variant_Cure) @@ -343,10 +344,10 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return Delirium; // Living Shadow - // todo: this needs to check with DRK_AoE_LivingDeadThreshold if (IsEnabled(CustomComboPreset.DRK_AoE_CDs_LivingShadow) && IsOffCooldown(LivingShadow) - && LevelChecked(LivingShadow)) + && LevelChecked(LivingShadow) + && GetTargetHPPercent() > hpRemaining) return LivingShadow; // Salted Earth From f23814338f909cf80640ded3ca86104def8a6b6c Mon Sep 17 00:00:00 2001 From: Kaeris Date: Sat, 6 Jul 2024 13:03:05 +0100 Subject: [PATCH 15/69] AtonementReady buff Goring Blade levelchecked fix Confiteor/Blades levelchecked fix Prominence priority lowered to allow oGCDs --- XIVSlothCombo/Combos/PvE/PLD.cs | 41 ++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/PLD.cs b/XIVSlothCombo/Combos/PvE/PLD.cs index d74463b25..93d339fa4 100644 --- a/XIVSlothCombo/Combos/PvE/PLD.cs +++ b/XIVSlothCombo/Combos/PvE/PLD.cs @@ -48,7 +48,7 @@ public static class Buffs { public const ushort Requiescat = 1368, - SwordOath = 1902, + AtonementReady = 1902, //First Atonement Buff SupplicationReady = 3827, //Second Atonement buff SepulchreReady = 3828, // Third Atonement buff GoringBladeReady = 3847, //Goring Blade Buff after use of FoF @@ -139,14 +139,15 @@ protected override uint Invoke(uint actionID, uint lastComboActionID, float comb return OriginalHook(SpiritsWithin); } - if (HasEffect(Buffs.GoringBladeReady) && WasLastAbility(BladeOfHonor)) - return GoringBlade; + // New Goring Blade + if (HasEffect(Buffs.GoringBladeReady) && (!BladeOfHonor.LevelChecked() || WasLastAbility(BladeOfHonor))) + return OriginalHook(FightOrFlight); if (HasEffect(Buffs.Requiescat)) { // Confiteor & Blades - if ((HasEffect(Buffs.ConfiteorReady) || BladeOfFaith.LevelChecked()) && - GetResourceCost(Confiteor) <= LocalPlayer.CurrentMp) + if ((HasEffect(Buffs.ConfiteorReady) && GetResourceCost(Confiteor) <= LocalPlayer.CurrentMp) || + (BladeOfFaith.LevelChecked() && GetResourceCost(BladeOfFaith) <= LocalPlayer.CurrentMp && OriginalHook(Confiteor) != Confiteor)) return OriginalHook(Confiteor); if (GetResourceCost(HolySpirit) <= LocalPlayer.CurrentMp) @@ -191,7 +192,7 @@ protected override uint Invoke(uint actionID, uint lastComboActionID, float comb if (lastComboActionID is RiotBlade && RageOfHalone.LevelChecked()) { - if (HasEffect(Buffs.SwordOath) || HasEffect(Buffs.SepulchreReady) || HasEffect(Buffs.SupplicationReady)) + if (HasEffect(Buffs.AtonementReady) || HasEffect(Buffs.SepulchreReady) || HasEffect(Buffs.SupplicationReady)) return OriginalHook(Atonement); return (HasEffect(Buffs.DivineMight) && @@ -251,8 +252,9 @@ protected override uint Invoke(uint actionID, uint lastComboActionID, float comb if (HasEffect(Buffs.Requiescat)) { - if ((HasEffect(Buffs.ConfiteorReady) || BladeOfFaith.LevelChecked()) && - GetResourceCost(Confiteor) <= LocalPlayer.CurrentMp) + // Confiteor & Blades + if ((HasEffect(Buffs.ConfiteorReady) && GetResourceCost(Confiteor) <= LocalPlayer.CurrentMp) || + (BladeOfFaith.LevelChecked() && GetResourceCost(BladeOfFaith) <= LocalPlayer.CurrentMp && OriginalHook(Confiteor) != Confiteor)) return OriginalHook(Confiteor); if (HolyCircle.LevelChecked() && @@ -269,9 +271,6 @@ protected override uint Invoke(uint actionID, uint lastComboActionID, float comb return HolyCircle; } - if (comboTime > 0 && lastComboActionID is TotalEclipse && Prominence.LevelChecked()) - return Prominence; - if (CanWeave(actionID)) { if (ActionReady(FightOrFlight)) @@ -291,6 +290,9 @@ protected override uint Invoke(uint actionID, uint lastComboActionID, float comb GetResourceCost(HolyCircle) <= LocalPlayer.CurrentMp && LevelChecked(HolyCircle)) return HolyCircle; + if (comboTime > 0 && lastComboActionID is TotalEclipse && Prominence.LevelChecked()) + return Prominence; + return actionID; } @@ -388,8 +390,9 @@ protected override uint Invoke(uint actionID, uint lastComboActionID, float comb return OriginalHook(Intervene); } + // New Goring Blade if (IsEnabled(CustomComboPreset.PLD_ST_AdvancedMode_GoringBlade) && - HasEffect(Buffs.GoringBladeReady) && InMeleeRange() && WasLastAbility(BladeOfHonor)) + InMeleeRange() && HasEffect(Buffs.GoringBladeReady) && (!BladeOfHonor.LevelChecked() || WasLastAbility(BladeOfHonor))) return GoringBlade; if (HasEffect(Buffs.Requiescat)) @@ -421,7 +424,7 @@ protected override uint Invoke(uint actionID, uint lastComboActionID, float comb return HolySpirit; if (IsEnabled(CustomComboPreset.PLD_ST_AdvancedMode_Atonement) && - (HasEffect(Buffs.SwordOath) || HasEffect(Buffs.SepulchreReady) || HasEffect(Buffs.SupplicationReady))) + (HasEffect(Buffs.AtonementReady) || HasEffect(Buffs.SepulchreReady) || HasEffect(Buffs.SupplicationReady))) return OriginalHook(Atonement); } @@ -479,7 +482,7 @@ protected override uint Invoke(uint actionID, uint lastComboActionID, float comb return HolySpirit; if (IsEnabled(CustomComboPreset.PLD_ST_AdvancedMode_Atonement) && - (HasEffect(Buffs.SwordOath) || HasEffect(Buffs.SepulchreReady) || HasEffect(Buffs.SupplicationReady)) && InMeleeRange()) + (HasEffect(Buffs.AtonementReady) || HasEffect(Buffs.SepulchreReady) || HasEffect(Buffs.SupplicationReady)) && InMeleeRange()) return OriginalHook(Atonement); // Base combo @@ -492,7 +495,7 @@ protected override uint Invoke(uint actionID, uint lastComboActionID, float comb if (lastComboActionID is RiotBlade && RageOfHalone.LevelChecked()) { if (IsEnabled(CustomComboPreset.PLD_ST_AdvancedMode_Atonement) && - (HasEffect(Buffs.SwordOath) || HasEffect(Buffs.SepulchreReady) || HasEffect(Buffs.SupplicationReady)) && InMeleeRange() && + (HasEffect(Buffs.AtonementReady) || HasEffect(Buffs.SepulchreReady) || HasEffect(Buffs.SupplicationReady)) && InMeleeRange() && (Config.PLD_ST_AtonementTiming == 2 || (Config.PLD_ST_AtonementTiming == 3 && ActionWatching.CombatActions.Count(x => x == FightOrFlight) % 2 == 0))) return OriginalHook(Atonement); @@ -506,7 +509,7 @@ protected override uint Invoke(uint actionID, uint lastComboActionID, float comb } if (IsEnabled(CustomComboPreset.PLD_ST_AdvancedMode_Atonement) && - (HasEffect(Buffs.SwordOath) || HasEffect(Buffs.SepulchreReady) || HasEffect(Buffs.SupplicationReady)) && InMeleeRange() && + (HasEffect(Buffs.AtonementReady) || HasEffect(Buffs.SepulchreReady) || HasEffect(Buffs.SupplicationReady)) && InMeleeRange() && (Config.PLD_ST_AtonementTiming == 1 || (Config.PLD_ST_AtonementTiming == 3 && ActionWatching.CombatActions.Count(x => x == FightOrFlight) % 2 == 1))) return OriginalHook(Atonement); @@ -605,9 +608,6 @@ protected override uint Invoke(uint actionID, uint lastComboActionID, float comb return HolyCircle; } - if (comboTime > 0 && lastComboActionID is TotalEclipse && Prominence.LevelChecked()) - return Prominence; - if (CanWeave(actionID)) { // FoF (Starts burst) @@ -650,6 +650,9 @@ protected override uint Invoke(uint actionID, uint lastComboActionID, float comb GetResourceCost(HolyCircle) <= LocalPlayer.CurrentMp && LevelChecked(HolyCircle)) return HolyCircle; + if (comboTime > 0 && lastComboActionID is TotalEclipse && Prominence.LevelChecked()) + return Prominence; + return actionID; } From e727ab51c315e5fc4463db4873de3ba12e1464c8 Mon Sep 17 00:00:00 2001 From: ace Date: Sat, 6 Jul 2024 05:35:13 -0700 Subject: [PATCH 16/69] Lv100 WAR restoration; needs testing --- XIVSlothCombo/Combos/CustomComboPreset.cs | 24 +++++++++++++++++------ XIVSlothCombo/Combos/PvE/WAR.cs | 18 +++++++++++++++-- 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index b7a70d65a..35c7ef3e6 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -3712,7 +3712,7 @@ The three digets after RDM.JobID can be used to reorder items in the list [ParentCombo(WAR_ST_StormsPath)] [CustomComboInfo("Inner Beast / Fell Cleave Option", "Adds Inner Beast / Fell Cleave to Advanced Mode. Will use when you have the set minimum gauge, or under the effect of Inner Release. Will also use Nascent Chaos.", WAR.JobID, 2, "", "")] - WAR_ST_StormsPath_FellCleave = 18011, + WAR_ST_StormsPath_FellCleave = 18012, [ParentCombo(WAR_ST_StormsPath)] [CustomComboInfo("Infuriate Option", "Adds Infuriate to Advanced Mode.", WAR.JobID, 3, "", "")] @@ -3720,19 +3720,27 @@ The three digets after RDM.JobID can be used to reorder items in the list [ParentCombo(WAR_ST_StormsPath)] [CustomComboInfo("Onslaught Option", "Adds Onslaught to Advanced Mode if you are under Surging Tempest Buff.", WAR.JobID, 4, "", "")] - WAR_ST_StormsPath_Onslaught = 18012, + WAR_ST_StormsPath_Onslaught = 18013, [ParentCombo(WAR_ST_StormsPath)] [CustomComboInfo("Upheaval Option", "Adds Upheaval to Advanced Mode if you have Surging Tempest.", WAR.JobID, 5, "", "")] WAR_ST_StormsPath_Upheaval = 18007, + [ParentCombo(WAR_ST_StormsPath)] + [CustomComboInfo("Primal Wrath Option", "Adds Primal Wrath to Advanced Mode if you have Surging Tempest.", WAR.JobID, 5, "", "")] + WAR_ST_StormsPath_PrimalWrath = 18008, + + [ParentCombo(WAR_ST_StormsPath)] + [CustomComboInfo("Primal Ruination Option", "Adds Primal Wrath to Advanced Mode if you have Surging Tempest.", WAR.JobID, 5, "", "")] + WAR_ST_StormsPath_PrimalRuination = 18009, + [ParentCombo(WAR_AoE_Overpower)] [CustomComboInfo("Orogeny Option", "Adds Orogeny to Advanced Mode when you are buffed with Surging Tempest.", WAR.JobID, 6, "", "")] - WAR_AoE_Overpower_Orogeny = 18009, + WAR_AoE_Overpower_Orogeny = 18010, [ParentCombo(WAR_ST_StormsPath)] [CustomComboInfo("Primal Rend Option", "Adds Primal Rend to Advanced Mode.", WAR.JobID, 7, "", "")] - WAR_ST_StormsPath_PrimalRend = 18008, + WAR_ST_StormsPath_PrimalRend = 18011, [ReplaceSkill(WAR.StormsEye)] [CustomComboInfo("Storm's Eye Combo Feature", "Replace Storm's Eye with its combo chain.", WAR.JobID, 3, "", "")] @@ -3748,11 +3756,15 @@ The three digets after RDM.JobID can be used to reorder items in the list [ParentCombo(WAR_AoE_Overpower)] [CustomComboInfo("Infuriate Option", "Adds Infuriate to Advanced Mode when gauge is below 50 and not under Inner Release.", WAR.JobID)] - WAR_AoE_Overpower_Infuriate = 18013, + WAR_AoE_Overpower_Infuriate = 18014, [ParentCombo(WAR_AoE_Overpower)] [CustomComboInfo("Berserk / Inner Release Option", "Adds Berserk / Inner Release to Advanced Mode.", WAR.JobID)] - WAR_AoE_Overpower_InnerRelease = 18014, + WAR_AoE_Overpower_InnerRelease = 18015, + + [ParentCombo(WAR_ST_StormsPath)] + [CustomComboInfo("Primal Wrath Option", "Adds Primal Wrath to Advanced Mode if you have Surging Tempest.", WAR.JobID, 5, "", "")] + WAR_AOE_Overpower_PrimalWrath = 18017, [ReplaceSkill(WAR.FellCleave, WAR.Decimate)] [CustomComboInfo("Infuriate on Fell Cleave / Decimate Feature", "Turns Fell Cleave and Decimate into Infuriate if at or under set rage value.", WAR.JobID, 4, "", "")] diff --git a/XIVSlothCombo/Combos/PvE/WAR.cs b/XIVSlothCombo/Combos/PvE/WAR.cs index db672c337..d876d5ee2 100644 --- a/XIVSlothCombo/Combos/PvE/WAR.cs +++ b/XIVSlothCombo/Combos/PvE/WAR.cs @@ -33,6 +33,8 @@ public const uint InnerChaos = 16465, Orogeny = 25752, PrimalRend = 25753, + PrimalWrath = 36924, + PrimalRuination = 36925, Onslaught = 7386; public static class Buffs @@ -42,6 +44,8 @@ public const ushort SurgingTempest = 2677, NascentChaos = 1897, PrimalRendReady = 2624, + Wrathful = 3901, + PrimalRuinationReady = 3834, Berserk = 86; } @@ -110,6 +114,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return OriginalHook(Berserk); if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_Upheaval) && IsOffCooldown(Upheaval) && LevelChecked(Upheaval)) return Upheaval; + if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_PrimalWrath) && HasEffect(Buffs.Wrathful) && LevelChecked(PrimalWrath)) + return PrimalWrath; if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_Onslaught) && LevelChecked(Onslaught) && GetRemainingCharges(Onslaught) > onslaughtChargesRemaining) { if (IsNotEnabled(CustomComboPreset.WAR_ST_StormsPath_Onslaught_MeleeSpender) || @@ -118,7 +124,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } } - if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_PrimalRend) && HasEffect(Buffs.PrimalRendReady) && LevelChecked(PrimalRend)) + if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_PrimalRend) && HasEffect(Buffs.PrimalRendReady) && LevelChecked(PrimalRend) && GetCooldownRemainingTime(InnerRelease) < 58.5) { if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_PrimalRend_CloseRange) && !IsMoving && (GetTargetDistance() <= 1 || GetBuffRemainingTime(Buffs.PrimalRendReady) <= 10)) return PrimalRend; @@ -126,6 +132,9 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return PrimalRend; } + if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_PrimalRuination) && HasEffect(Buffs.PrimalRuinationReady) && LevelChecked(PrimalRuination) && WasLastWeaponskill(PrimalRend)) + return PrimalRuination; + if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_FellCleave) && LevelChecked(InnerBeast)) { if (HasEffect(Buffs.InnerRelease) || (HasEffect(Buffs.NascentChaos) && InnerChaos.LevelChecked())) @@ -225,9 +234,11 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return OriginalHook(Berserk); if (IsEnabled(CustomComboPreset.WAR_AoE_Overpower_Orogeny) && IsOffCooldown(Orogeny) && LevelChecked(Orogeny) && HasEffect(Buffs.SurgingTempest)) return Orogeny; + if (IsEnabled(CustomComboPreset.WAR_AOE_Overpower_PrimalWrath) && HasEffect(Buffs.Wrathful) && LevelChecked(PrimalWrath)) + return PrimalWrath; } - if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_PrimalRend) && HasEffect(Buffs.PrimalRendReady) && LevelChecked(PrimalRend)) + if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_PrimalRend) && HasEffect(Buffs.PrimalRendReady) && LevelChecked(PrimalRend) && GetCooldownRemainingTime(InnerRelease) < 58.5) { if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_PrimalRend_CloseRange) && (GetTargetDistance() <= 3 || GetBuffRemainingTime(Buffs.PrimalRendReady) <= 10)) return PrimalRend; @@ -235,6 +246,9 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return PrimalRend; } + if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_PrimalRuination) && HasEffect(Buffs.PrimalRuinationReady) && LevelChecked(PrimalRuination) && WasLastWeaponskill(PrimalRend)) + return PrimalRuination; + if (IsEnabled(CustomComboPreset.WAR_AoE_Overpower_Decimate) && LevelChecked(SteelCyclone) && (gauge >= decimateGaugeSpend || HasEffect(Buffs.InnerRelease) || HasEffect(Buffs.NascentChaos))) return OriginalHook(SteelCyclone); } From 0d0eff2205d236ee2881906a00b900cfdb28702b Mon Sep 17 00:00:00 2001 From: ace Date: Sat, 6 Jul 2024 05:37:47 -0700 Subject: [PATCH 17/69] IR 1GCD before PR value fixed 2.5s --- XIVSlothCombo/Combos/PvE/WAR.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/WAR.cs b/XIVSlothCombo/Combos/PvE/WAR.cs index d876d5ee2..569f99564 100644 --- a/XIVSlothCombo/Combos/PvE/WAR.cs +++ b/XIVSlothCombo/Combos/PvE/WAR.cs @@ -124,7 +124,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } } - if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_PrimalRend) && HasEffect(Buffs.PrimalRendReady) && LevelChecked(PrimalRend) && GetCooldownRemainingTime(InnerRelease) < 58.5) + if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_PrimalRend) && HasEffect(Buffs.PrimalRendReady) && LevelChecked(PrimalRend) && GetCooldownRemainingTime(InnerRelease) < 57.5) { if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_PrimalRend_CloseRange) && !IsMoving && (GetTargetDistance() <= 1 || GetBuffRemainingTime(Buffs.PrimalRendReady) <= 10)) return PrimalRend; @@ -238,7 +238,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return PrimalWrath; } - if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_PrimalRend) && HasEffect(Buffs.PrimalRendReady) && LevelChecked(PrimalRend) && GetCooldownRemainingTime(InnerRelease) < 58.5) + if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_PrimalRend) && HasEffect(Buffs.PrimalRendReady) && LevelChecked(PrimalRend) && GetCooldownRemainingTime(InnerRelease) < 57.5) { if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_PrimalRend_CloseRange) && (GetTargetDistance() <= 3 || GetBuffRemainingTime(Buffs.PrimalRendReady) <= 10)) return PrimalRend; From 814ad289ac7bac0a7f9cf160e0a5d80e57754ce2 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Sat, 6 Jul 2024 06:39:41 -0600 Subject: [PATCH 18/69] Implement fallback usage of Disesteem to avoid wasting it --- XIVSlothCombo/Combos/PvE/DRK.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/DRK.cs b/XIVSlothCombo/Combos/PvE/DRK.cs index 812e82904..874bdf1db 100644 --- a/XIVSlothCombo/Combos/PvE/DRK.cs +++ b/XIVSlothCombo/Combos/PvE/DRK.cs @@ -124,7 +124,9 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim && LevelChecked(Disesteem) && IsEnabled(CustomComboPreset.DRK_ST_CDs_Disesteem) && HasEffect(Buffs.Scorn) - && gauge.DarksideTimeRemaining > 0) + && ((gauge.DarksideTimeRemaining > 0 && GetBuffRemainingTime(Buffs.Scorn) < 26) // Optimal usage + || GetBuffRemainingTime(Buffs.Scorn) < 14) // Emergency usage + ) return OriginalHook(Disesteem); // oGCDs @@ -230,7 +232,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (LevelChecked(Delirium) && IsEnabled(CustomComboPreset.DRK_ST_Bloodspiller)) { - //Regular Bloodspiller if (GetBuffStacks(Buffs.Delirium) > 0 && IsNotEnabled(CustomComboPreset.DRK_ST_DelayedBloodspiller)) @@ -303,7 +304,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim && LevelChecked(Disesteem) && IsEnabled(CustomComboPreset.DRK_AoE_CDs_Disesteem) && HasEffect(Buffs.Scorn) - && gauge.DarksideTimeRemaining > 0) + && (gauge.DarksideTimeRemaining > 0 // Optimal usage + || GetBuffRemainingTime(Buffs.Scorn) < 5)) // Emergency usage return OriginalHook(Disesteem); // oGCDs From 10657d8b977b149431d7763cd76917c818cff782 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Sat, 6 Jul 2024 06:59:07 -0600 Subject: [PATCH 19/69] Confine Impalement+Torcleaver combo to before it really affects Delirium stacks --- XIVSlothCombo/Combos/PvE/DRK.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/DRK.cs b/XIVSlothCombo/Combos/PvE/DRK.cs index 874bdf1db..cee967d6a 100644 --- a/XIVSlothCombo/Combos/PvE/DRK.cs +++ b/XIVSlothCombo/Combos/PvE/DRK.cs @@ -259,7 +259,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim && LevelChecked(ScarletDelirium) && IsEnabled(CustomComboPreset.DRK_ST_Delirium_Chain) && HasEffect(Buffs.Delirium) - && gauge.DarksideTimeRemaining > 0) + && gauge.DarksideTimeRemaining > 0 + && GetBuffStacks(Buffs.Delirium) > 2) return OriginalHook(Bloodspiller); // 1-2-3 combo @@ -382,7 +383,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim && LevelChecked(Impalement) && IsEnabled(CustomComboPreset.DRK_AoE_Delirium_Chain) && HasEffect(Buffs.Delirium) - && gauge.DarksideTimeRemaining > 1) + && gauge.DarksideTimeRemaining > 1 + && GetBuffStacks(Buffs.Delirium) > 2) return OriginalHook(Quietus); // 1-2-3 combo From f20495a60d064c2b54ffb1607176c4289a838118 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Sat, 6 Jul 2024 07:07:55 -0600 Subject: [PATCH 20/69] Move Dark Arts handling to be later As a way to deal with it currently getting false positives, but also just as it is not a high priority spend --- XIVSlothCombo/Combos/PvE/DRK.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/DRK.cs b/XIVSlothCombo/Combos/PvE/DRK.cs index cee967d6a..4f92d2494 100644 --- a/XIVSlothCombo/Combos/PvE/DRK.cs +++ b/XIVSlothCombo/Combos/PvE/DRK.cs @@ -160,14 +160,13 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim // Spend mana to limit when not near even minute burst windows if (IsEnabled(CustomComboPreset.DRK_ST_ManaSpenderPooling) && GetCooldownRemainingTime(LivingShadow) >= 45 - && (gauge.HasDarkArts || LocalPlayer.CurrentMp > (mpRemaining + 3000)) + && LocalPlayer.CurrentMp > (mpRemaining + 3000) && LevelChecked(EdgeOfDarkness) && CanDelayedWeave(actionID)) return OriginalHook(EdgeOfDarkness); // Keep Darkside up, spend Dark Arts - if (gauge.HasDarkArts - || LocalPlayer.CurrentMp > 8500 + if (LocalPlayer.CurrentMp > 8500 || (gauge.DarksideTimeRemaining < 10000 && LocalPlayer.CurrentMp > (mpRemaining + 3000))) { // Return Edge of Darkness if available @@ -263,6 +262,13 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim && GetBuffStacks(Buffs.Delirium) > 2) return OriginalHook(Bloodspiller); + // Spend Dark Arts + if (IsEnabled(CustomComboPreset.DRK_ST_ManaOvercap) + && (CanWeave(actionID) || CanDelayedWeave(actionID)) + && gauge.HasDarkArts + && LevelChecked(EdgeOfDarkness)) + return OriginalHook(EdgeOfDarkness); + // 1-2-3 combo if (!(comboTime > 0)) return HardSlash; if (lastComboMove == HardSlash && LevelChecked(SyphonStrike)) From 9a47ae439ea9506a5e337d0402d9e587b4725466 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Sat, 6 Jul 2024 07:14:58 -0600 Subject: [PATCH 21/69] Simplify DRK Dark Arts usage --- XIVSlothCombo/Combos/CustomComboPreset.cs | 4 ++-- XIVSlothCombo/Combos/PvE/DRK.cs | 23 ++++++++--------------- 2 files changed, 10 insertions(+), 17 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index 4a8f1e6f4..a65aa1107 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -1088,7 +1088,7 @@ public enum CustomComboPreset #region Mana Overcap Options [ParentCombo(DRK_ST_Combo)] - [CustomComboInfo("Edge of Shadow Overcap Feature", "Uses Edge of Shadow if you are above 8,500 mana, Darkside is about to expire (10sec or less), or if you have Dark Arts and use The Blackest Night.", DRK.JobID)] + [CustomComboInfo("Edge of Shadow Overcap Feature", "Uses Edge of Shadow if you are above 8,500 mana, Darkside is about to expire (10sec or less), or if you have Dark Arts.", DRK.JobID)] DRK_ST_ManaOvercap = 5011, [ParentCombo(DRK_ST_ManaOvercap)] @@ -1171,7 +1171,7 @@ public enum CustomComboPreset // Last value = 5025 [ParentCombo(DRK_AoE_Combo)] - [CustomComboInfo("Flood of Shadow Overcap Feature", "Uses Flood of Shadow if you are above 8.5k mana, Darkside is about to expire (10sec or less), or if you have Dark Arts and use The Blackest Night.", DRK.JobID)] + [CustomComboInfo("Flood of Shadow Overcap Feature", "Uses Flood of Shadow if you are above 8.5k mana, Darkside is about to expire (10sec or less), or if you have Dark Arts.", DRK.JobID)] DRK_AoE_ManaOvercap = 5026, [ParentCombo(DRK_AoE_Combo)] diff --git a/XIVSlothCombo/Combos/PvE/DRK.cs b/XIVSlothCombo/Combos/PvE/DRK.cs index 4f92d2494..9b0f87a25 100644 --- a/XIVSlothCombo/Combos/PvE/DRK.cs +++ b/XIVSlothCombo/Combos/PvE/DRK.cs @@ -145,13 +145,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim && IsOffCooldown(Variant.VariantUltimatum)) return Variant.VariantUltimatum; - // Spend Dark Arts when TBN is up - if (IsEnabled(CustomComboPreset.DRK_ST_ManaOvercap) - && HasEffect(Buffs.BlackestNight) - && gauge.HasDarkArts - && LevelChecked(EdgeOfDarkness)) - return OriginalHook(EdgeOfDarkness); - //Mana Features if (IsEnabled(CustomComboPreset.DRK_ST_ManaOvercap) && ((CombatEngageDuration().TotalSeconds < 7 && gauge.DarksideTimeRemaining == 0) // Initial Darkside upping @@ -331,17 +324,10 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim && IsOffCooldown(Variant.VariantUltimatum)) return Variant.VariantUltimatum; - // Spend Dark Arts when TBN is up - if (IsEnabled(CustomComboPreset.DRK_AoE_ManaOvercap) - && HasEffect(Buffs.BlackestNight) - && gauge.HasDarkArts - && LevelChecked(FloodOfDarkness)) - return OriginalHook(FloodOfDarkness); - // Mana Features if (IsEnabled(CustomComboPreset.DRK_AoE_ManaOvercap) && LevelChecked(FloodOfDarkness) - && (gauge.HasDarkArts || LocalPlayer.CurrentMp > 8500 || (gauge.DarksideTimeRemaining < 10 && LocalPlayer.CurrentMp >= 3000))) + && (LocalPlayer.CurrentMp > 8500 || (gauge.DarksideTimeRemaining < 10 && LocalPlayer.CurrentMp >= 3000))) return OriginalHook(FloodOfDarkness); if (gauge.DarksideTimeRemaining > 1) @@ -393,6 +379,13 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim && GetBuffStacks(Buffs.Delirium) > 2) return OriginalHook(Quietus); + // Spend Dark Arts + if (IsEnabled(CustomComboPreset.DRK_AoE_ManaOvercap) + && (CanWeave(actionID) || CanDelayedWeave(actionID)) + && gauge.HasDarkArts + && LevelChecked(FloodOfDarkness)) + return OriginalHook(FloodOfDarkness); + // 1-2-3 combo if (!(comboTime > 0)) return Unleash; if (lastComboMove == Unleash && LevelChecked(StalwartSoul)) From 04e916cef0990fc0ff229b292458c195a129bf51 Mon Sep 17 00:00:00 2001 From: Kaeris Date: Sat, 6 Jul 2024 14:43:42 +0100 Subject: [PATCH 22/69] Goring Blade Adjustments - Usage window more flexible - Added missing melee check --- XIVSlothCombo/Combos/PvE/PLD.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/PLD.cs b/XIVSlothCombo/Combos/PvE/PLD.cs index 93d339fa4..85a90ade0 100644 --- a/XIVSlothCombo/Combos/PvE/PLD.cs +++ b/XIVSlothCombo/Combos/PvE/PLD.cs @@ -140,7 +140,8 @@ protected override uint Invoke(uint actionID, uint lastComboActionID, float comb } // New Goring Blade - if (HasEffect(Buffs.GoringBladeReady) && (!BladeOfHonor.LevelChecked() || WasLastAbility(BladeOfHonor))) + if (HasEffect(Buffs.GoringBladeReady) && InMeleeRange() && (!BladeOfHonor.LevelChecked() || + (IsOnCooldown(Requiescat) && !HasEffect(Buffs.Requiescat) && OriginalHook(Requiescat) != BladeOfHonor))) return OriginalHook(FightOrFlight); if (HasEffect(Buffs.Requiescat)) @@ -392,7 +393,8 @@ protected override uint Invoke(uint actionID, uint lastComboActionID, float comb // New Goring Blade if (IsEnabled(CustomComboPreset.PLD_ST_AdvancedMode_GoringBlade) && - InMeleeRange() && HasEffect(Buffs.GoringBladeReady) && (!BladeOfHonor.LevelChecked() || WasLastAbility(BladeOfHonor))) + InMeleeRange() && HasEffect(Buffs.GoringBladeReady) && (!BladeOfHonor.LevelChecked() || + (IsOnCooldown(Requiescat) && !HasEffect(Buffs.Requiescat) && OriginalHook(Requiescat) != BladeOfHonor))) return GoringBlade; if (HasEffect(Buffs.Requiescat)) From 15fc64bc9302d769999656da1fc00fec3cc23e88 Mon Sep 17 00:00:00 2001 From: Kaeris Date: Sat, 6 Jul 2024 14:55:13 +0100 Subject: [PATCH 23/69] Replace Direct Calls with OriginalHook - Icons change accordingly --- XIVSlothCombo/Combos/PvE/PLD.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/PLD.cs b/XIVSlothCombo/Combos/PvE/PLD.cs index 85a90ade0..993fe07c3 100644 --- a/XIVSlothCombo/Combos/PvE/PLD.cs +++ b/XIVSlothCombo/Combos/PvE/PLD.cs @@ -395,7 +395,7 @@ protected override uint Invoke(uint actionID, uint lastComboActionID, float comb if (IsEnabled(CustomComboPreset.PLD_ST_AdvancedMode_GoringBlade) && InMeleeRange() && HasEffect(Buffs.GoringBladeReady) && (!BladeOfHonor.LevelChecked() || (IsOnCooldown(Requiescat) && !HasEffect(Buffs.Requiescat) && OriginalHook(Requiescat) != BladeOfHonor))) - return GoringBlade; + return OriginalHook(FightOrFlight); if (HasEffect(Buffs.Requiescat)) { @@ -454,7 +454,7 @@ protected override uint Invoke(uint actionID, uint lastComboActionID, float comb if (IsEnabled(CustomComboPreset.PLD_ST_AdvancedMode_GoringBlade) && HasEffect(Buffs.GoringBladeReady) && IsNotEnabled(CustomComboPreset.PLD_ST_AdvancedMode_FoF)) - return GoringBlade; + return OriginalHook(FightOrFlight); //Req without FoF if (IsNotEnabled(CustomComboPreset.PLD_ST_AdvancedMode_FoF) && (IsEnabled(CustomComboPreset.PLD_ST_AdvancedMode_Requiescat) && CanWeave(actionID)) && ActionReady(Requiescat)) From 172f8928fa2c471ef3bb3b9a2a0f86b42c491d38 Mon Sep 17 00:00:00 2001 From: ace Date: Sat, 6 Jul 2024 07:33:32 -0700 Subject: [PATCH 24/69] fixed Primal Wrath UI (maybe) --- XIVSlothCombo/Combos/CustomComboPreset.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index 35c7ef3e6..dc2b451ae 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -3742,10 +3742,6 @@ The three digets after RDM.JobID can be used to reorder items in the list [CustomComboInfo("Primal Rend Option", "Adds Primal Rend to Advanced Mode.", WAR.JobID, 7, "", "")] WAR_ST_StormsPath_PrimalRend = 18011, - [ReplaceSkill(WAR.StormsEye)] - [CustomComboInfo("Storm's Eye Combo Feature", "Replace Storm's Eye with its combo chain.", WAR.JobID, 3, "", "")] - War_ST_StormsEye = 18001, - [ReplaceSkill(WAR.Overpower)] [CustomComboInfo("Advanced Mode - AoE", "Replaces Overpower with a one-button full AoE rotation.\nThese features are ideal if you want to customize the rotation.", WAR.JobID, 2, "", "")] WAR_AoE_Overpower = 18002, @@ -3762,7 +3758,7 @@ The three digets after RDM.JobID can be used to reorder items in the list [CustomComboInfo("Berserk / Inner Release Option", "Adds Berserk / Inner Release to Advanced Mode.", WAR.JobID)] WAR_AoE_Overpower_InnerRelease = 18015, - [ParentCombo(WAR_ST_StormsPath)] + [ParentCombo(WAR_AoE_Overpower)] [CustomComboInfo("Primal Wrath Option", "Adds Primal Wrath to Advanced Mode if you have Surging Tempest.", WAR.JobID, 5, "", "")] WAR_AOE_Overpower_PrimalWrath = 18017, From 83847488acaa317bb066147c3e21576c1b860575 Mon Sep 17 00:00:00 2001 From: ace Date: Sat, 6 Jul 2024 07:34:25 -0700 Subject: [PATCH 25/69] description fix --- 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 dc2b451ae..68badf0c1 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -3731,7 +3731,7 @@ The three digets after RDM.JobID can be used to reorder items in the list WAR_ST_StormsPath_PrimalWrath = 18008, [ParentCombo(WAR_ST_StormsPath)] - [CustomComboInfo("Primal Ruination Option", "Adds Primal Wrath to Advanced Mode if you have Surging Tempest.", WAR.JobID, 5, "", "")] + [CustomComboInfo("Primal Ruination Option", "Adds Primal Ruination to Advanced Mode if you have Surging Tempest.", WAR.JobID, 5, "", "")] WAR_ST_StormsPath_PrimalRuination = 18009, [ParentCombo(WAR_AoE_Overpower)] From 4ace1733de2ccc234d5649bbeed4b7eb5c0e84e7 Mon Sep 17 00:00:00 2001 From: ace Date: Sat, 6 Jul 2024 07:38:00 -0700 Subject: [PATCH 26/69] bruh smh idiot --- XIVSlothCombo/Combos/CustomComboPreset.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index 68badf0c1..738308ec6 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -3746,6 +3746,10 @@ The three digets after RDM.JobID can be used to reorder items in the list [CustomComboInfo("Advanced Mode - AoE", "Replaces Overpower with a one-button full AoE rotation.\nThese features are ideal if you want to customize the rotation.", WAR.JobID, 2, "", "")] WAR_AoE_Overpower = 18002, + [ReplaceSkill(WAR.StormsEye)] + [CustomComboInfo("Storm's Eye Combo Feature", "Replace Storm's Eye with its combo chain.", WAR.JobID, 3, "", "")] + War_ST_StormsEye = 18001, + [ReplaceSkill(WAR.NascentFlash)] [CustomComboInfo("Nascent Flash Feature", "Replace Nascent Flash with Raw intuition when level synced below 76.", WAR.JobID, 5, "", "")] WAR_NascentFlash = 18005, From 43a430b9d7927983a3f9622efdb5ffab8072fd98 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Sat, 6 Jul 2024 08:57:46 -0600 Subject: [PATCH 27/69] Correct DRK Disesteem description --- 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 a65aa1107..59138e44d 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -1055,7 +1055,7 @@ public enum CustomComboPreset DRK_ST_CDs_LivingShadow = 5005, [ParentCombo(DRK_ST_CDs_LivingShadow)] - [CustomComboInfo("Disesteem Option", "Adds Disesteem to the AoE combo when available.", DRK.JobID)] + [CustomComboInfo("Disesteem Option", "Adds Disesteem to the main combo when available.", DRK.JobID)] DRK_ST_CDs_Disesteem = 5006, #endregion From ed2c71093d16a445bb0f33909e8dffad3b8872cd Mon Sep 17 00:00:00 2001 From: Tartarga <109563717+Tartarga@users.noreply.github.com> Date: Sat, 6 Jul 2024 10:04:13 -0500 Subject: [PATCH 28/69] Fixed AoE Heal Eukrasia Prognosis Fixes #1436 --- XIVSlothCombo/Combos/PvE/SGE.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XIVSlothCombo/Combos/PvE/SGE.cs b/XIVSlothCombo/Combos/PvE/SGE.cs index 62ef69f66..1e7b8ca42 100644 --- a/XIVSlothCombo/Combos/PvE/SGE.cs +++ b/XIVSlothCombo/Combos/PvE/SGE.cs @@ -509,7 +509,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (actionID is Prognosis) { if (IsEnabled(CustomComboPreset.SGE_AoE_Heal_EPrognosis) && HasEffect(Buffs.Eukrasia)) - return OriginalHook(EukrasianPrognosis); //ToDo Check if OriginalHook(Prognosis) is fine, bet it is + return OriginalHook(Prognosis); if (IsEnabled(CustomComboPreset.SGE_AoE_Heal_Rhizomata) && ActionReady(Rhizomata) && !Gauge.HasAddersgall()) From 602d816a41d4f8140829c79872e21b1c6ae8fef4 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Sat, 6 Jul 2024 09:39:04 -0600 Subject: [PATCH 29/69] Prevent current Dark Arts bug from breaking the opener --- XIVSlothCombo/Combos/PvE/DRK.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/XIVSlothCombo/Combos/PvE/DRK.cs b/XIVSlothCombo/Combos/PvE/DRK.cs index 9b0f87a25..acbe4b3cc 100644 --- a/XIVSlothCombo/Combos/PvE/DRK.cs +++ b/XIVSlothCombo/Combos/PvE/DRK.cs @@ -259,7 +259,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsEnabled(CustomComboPreset.DRK_ST_ManaOvercap) && (CanWeave(actionID) || CanDelayedWeave(actionID)) && gauge.HasDarkArts - && LevelChecked(EdgeOfDarkness)) + && LevelChecked(EdgeOfDarkness) + && CombatEngageDuration().TotalSeconds >= 25) return OriginalHook(EdgeOfDarkness); // 1-2-3 combo From 7839187a149803832ef756265894c9fe960239ab Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Sat, 6 Jul 2024 09:48:26 -0600 Subject: [PATCH 30/69] Better line up first Edge with the opener --- XIVSlothCombo/Combos/PvE/DRK.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/DRK.cs b/XIVSlothCombo/Combos/PvE/DRK.cs index acbe4b3cc..1aadeab23 100644 --- a/XIVSlothCombo/Combos/PvE/DRK.cs +++ b/XIVSlothCombo/Combos/PvE/DRK.cs @@ -147,8 +147,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //Mana Features if (IsEnabled(CustomComboPreset.DRK_ST_ManaOvercap) - && ((CombatEngageDuration().TotalSeconds < 7 && gauge.DarksideTimeRemaining == 0) // Initial Darkside upping - || CombatEngageDuration().TotalSeconds >= 20)) + && ((CombatEngageDuration().TotalSeconds > 4 && CombatEngageDuration().TotalSeconds < 10 && gauge.DarksideTimeRemaining == 0) // Initial Darkside upping + || CombatEngageDuration().TotalSeconds >= 25)) { // Spend mana to limit when not near even minute burst windows if (IsEnabled(CustomComboPreset.DRK_ST_ManaSpenderPooling) From a7fa2600d0bab6ac203ce27241332ecbe2dc64ae Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Sat, 6 Jul 2024 09:48:38 -0600 Subject: [PATCH 31/69] Move the Torcleaver combo to spend it quickly more reliably --- XIVSlothCombo/Combos/PvE/DRK.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/DRK.cs b/XIVSlothCombo/Combos/PvE/DRK.cs index 1aadeab23..84d53b662 100644 --- a/XIVSlothCombo/Combos/PvE/DRK.cs +++ b/XIVSlothCombo/Combos/PvE/DRK.cs @@ -220,6 +220,15 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } } + // Delirium Chain + if (LevelChecked(Delirium) + && LevelChecked(ScarletDelirium) + && IsEnabled(CustomComboPreset.DRK_ST_Delirium_Chain) + && HasEffect(Buffs.Delirium) + && gauge.DarksideTimeRemaining > 0 + && GetBuffStacks(Buffs.Delirium) > 2) + return OriginalHook(Bloodspiller); + //Delirium Features if (LevelChecked(Delirium) && IsEnabled(CustomComboPreset.DRK_ST_Bloodspiller)) @@ -246,15 +255,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return Bloodspiller; } - // Delirium Chain - if (LevelChecked(Delirium) - && LevelChecked(ScarletDelirium) - && IsEnabled(CustomComboPreset.DRK_ST_Delirium_Chain) - && HasEffect(Buffs.Delirium) - && gauge.DarksideTimeRemaining > 0 - && GetBuffStacks(Buffs.Delirium) > 2) - return OriginalHook(Bloodspiller); - // Spend Dark Arts if (IsEnabled(CustomComboPreset.DRK_ST_ManaOvercap) && (CanWeave(actionID) || CanDelayedWeave(actionID)) From f533cfdd95f65a46d8c92f223493474fcd6dbf23 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Sat, 6 Jul 2024 10:25:47 -0600 Subject: [PATCH 32/69] Remove extraneous DRK option (Delayed Bloodspiller) --- XIVSlothCombo/Combos/CustomComboPreset.cs | 54 +++++++++++------------ XIVSlothCombo/Combos/PvE/DRK.cs | 8 ---- 2 files changed, 25 insertions(+), 37 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index 59138e44d..c99868354 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -1102,118 +1102,114 @@ public enum CustomComboPreset [CustomComboInfo("Bloodspiller Feature", "Adds Bloodspiller when Delirium is active.", DRK.JobID)] DRK_ST_Bloodspiller = 5013, - [ParentCombo(DRK_ST_Bloodspiller)] - [CustomComboInfo("Delayed Bloodspiller Feature", "Delays Bloodspiller by 2 GCDs when Delirium is used during even windows, uses it regularly during odd windows. Useful for feeding into raid buffs at level 90.", DRK.JobID)] - DRK_ST_DelayedBloodspiller = 5014, - [ParentCombo(DRK_ST_Combo)] [CustomComboInfo("Blood Gauge Overcap Feature", "Adds Bloodspiller onto main combo when at 80 blood gauge or higher.", DRK.JobID)] - DRK_ST_BloodOvercap = 5015, + DRK_ST_BloodOvercap = 5014, [ParentCombo(DRK_ST_Combo)] [CustomComboInfo("Unmend Uptime Feature", "Replace Souleater Combo Feature with Unmend when you are out of range.", DRK.JobID)] - DRK_ST_RangedUptime = 5016, + DRK_ST_RangedUptime = 5015, #endregion - // Last value = 5016 + // Last value = 5015 #region Stalwart Soul (Multi Target) Combo [ReplaceSkill(DRK.StalwartSoul)] [CustomComboInfo("Stalwart Soul Combo", "Replace Stalwart Soul with its combo chain.", DRK.JobID)] - DRK_AoE_Combo = 5017, + DRK_AoE_Combo = 5016, #region Buff Options [ParentCombo(DRK_AoE_Combo)] [CustomComboInfo("Delirium Option", "Adds Delirium to AoE combo on cooldown and when Darkside is up.", DRK.JobID)] - DRK_AoE_Delirium = 5018, + DRK_AoE_Delirium = 5017, [ParentCombo(DRK_AoE_Delirium)] [CustomComboInfo("Impalement Feature", "Adds all Impalement uses when Delirium is activated.", DRK.JobID)] - DRK_AoE_Delirium_Chain = 5019, + DRK_AoE_Delirium_Chain = 5018, #endregion - // Last value = 5019 + // Last value = 5018 #region Cooldowns [ParentCombo(DRK_AoE_Combo)] [CustomComboInfo("Cooldowns on AoE Combo", "Collection of cooldowns to add to the AoE combo", DRK.JobID)] - DRK_AoE_CDs = 5020, + DRK_AoE_CDs = 5019, [ParentCombo(DRK_AoE_CDs)] [CustomComboInfo("AoE Shadowbringer Feature", "Adds Shadowbringer to the AoE combo.", DRK.JobID)] - DRK_AoE_CDs_Shadowbringer = 5021, + DRK_AoE_CDs_Shadowbringer = 5020, #region Living Shadow Options [ParentCombo(DRK_AoE_CDs)] [CustomComboInfo("Living Shadow Option", "Adds Living Shadow to the AoE combo on cooldown and when Darkside is up.", DRK.JobID)] - DRK_AoE_CDs_LivingShadow = 5022, + DRK_AoE_CDs_LivingShadow = 5021, [ParentCombo(DRK_AoE_CDs_LivingShadow)] [CustomComboInfo("Disesteem Option", "Adds Disesteem to the AoE combo when available.", DRK.JobID)] - DRK_AoE_CDs_Disesteem = 5023, + DRK_AoE_CDs_Disesteem = 5022, #endregion - // Last value = 5023 + // Last value = 5022 [ParentCombo(DRK_AoE_CDs)] [CustomComboInfo("Abyssal Drain Feature", "Adds abyssal drain to the AoE combo when you fall below 60 percent hp.", DRK.JobID)] - DRK_AoE_CDs_AbyssalDrain = 5024, + DRK_AoE_CDs_AbyssalDrain = 5023, [ParentCombo(DRK_AoE_CDs)] [CustomComboInfo("Salted Earth Option", "Adds Salted Earth and Salt and Darkness to AoE on cooldown and when Darkside is up.", DRK.JobID)] - DRK_AoE_CDs_SaltedEarth = 5025, + DRK_AoE_CDs_SaltedEarth = 5024, #endregion - // Last value = 5025 + // Last value = 5024 [ParentCombo(DRK_AoE_Combo)] [CustomComboInfo("Flood of Shadow Overcap Feature", "Uses Flood of Shadow if you are above 8.5k mana, Darkside is about to expire (10sec or less), or if you have Dark Arts.", DRK.JobID)] - DRK_AoE_ManaOvercap = 5026, + DRK_AoE_ManaOvercap = 5025, [ParentCombo(DRK_AoE_Combo)] [CustomComboInfo("Blood Gauge Overcap Feature", "Adds Quietus onto AOE combo when at 80 blood gauge or higher.", DRK.JobID)] - DRK_AoE_BloodOvercap = 5027, + DRK_AoE_BloodOvercap = 5026, #endregion - // Last value = 5027 + // Last value = 5026 #region oGCD Feature [ReplaceSkill(DRK.CarveAndSpit, DRK.AbyssalDrain)] [ConflictingCombos(DRK_ST_CDs)] [CustomComboInfo("oGCD Feature", "Adds Living Shadow > Salted Earth > Salt And Darkness to Carve And Spit and Abyssal Drain", DRK.JobID)] - DRK_oGCD = 5028, + DRK_oGCD = 5027, [ParentCombo(DRK_oGCD)] [CustomComboInfo("Shadowbringer oGCD Feature", "Adds Shadowbringer to oGCD Feature ", DRK.JobID)] - DRK_Shadowbringer_oGCD = 5029, + DRK_Shadowbringer_oGCD = 5028, #endregion - // Last value = 5029 + // Last value = 5028 #region Variant [Variant] [VariantParent(DRK_ST_Combo, DRK_AoE_Combo)] [CustomComboInfo("Spirit Dart Option", "Use Variant Spirit Dart whenever the debuff is not present or less than 3s.", DRK.JobID)] - DRK_Variant_SpiritDart = 5030, + DRK_Variant_SpiritDart = 5029, [Variant] [VariantParent(DRK_ST_Combo, DRK_AoE_Combo)] [CustomComboInfo("Cure Option", "Use Variant Cure when HP is below set threshold.", DRK.JobID)] - DRK_Variant_Cure = 5031, + DRK_Variant_Cure = 5030, [Variant] [VariantParent(DRK_ST_Combo, DRK_AoE_Combo)] [CustomComboInfo("Ultimatum Option", "Use Variant Ultimatum on cooldown.", DRK.JobID)] - DRK_Variant_Ultimatum = 5032, + DRK_Variant_Ultimatum = 5031, #endregion - // Last value = 5032 + // Last value = 5031 #endregion diff --git a/XIVSlothCombo/Combos/PvE/DRK.cs b/XIVSlothCombo/Combos/PvE/DRK.cs index 84d53b662..5e79a9bb1 100644 --- a/XIVSlothCombo/Combos/PvE/DRK.cs +++ b/XIVSlothCombo/Combos/PvE/DRK.cs @@ -238,14 +238,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim && IsNotEnabled(CustomComboPreset.DRK_ST_DelayedBloodspiller)) return Bloodspiller; - //Delayed Delirium - // todo: we can use this for mana generation on odd minutes - if (IsEnabled(CustomComboPreset.DRK_ST_DelayedBloodspiller) - && GetBuffStacks(Buffs.Delirium) > 0 - && IsOnCooldown(Delirium) - && GetBuffStacks(Buffs.BloodWeapon) < 2) - return Bloodspiller; - //Blood management before Delirium if (IsEnabled(CustomComboPreset.DRK_ST_Delirium) && ( From e024e47c8539cd33e0afb2a38608b9f101bf4405 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Sat, 6 Jul 2024 12:09:02 -0600 Subject: [PATCH 33/69] Remove Incorrect Delirium check, Move Delirium combo code --- XIVSlothCombo/Combos/PvE/DRK.cs | 37 +++++++++++++++------------------ 1 file changed, 17 insertions(+), 20 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/DRK.cs b/XIVSlothCombo/Combos/PvE/DRK.cs index 5e79a9bb1..845e5f3d2 100644 --- a/XIVSlothCombo/Combos/PvE/DRK.cs +++ b/XIVSlothCombo/Combos/PvE/DRK.cs @@ -129,6 +129,14 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim ) return OriginalHook(Disesteem); + // Delirium Chain + if (LevelChecked(Delirium) + && LevelChecked(ScarletDelirium) + && IsEnabled(CustomComboPreset.DRK_ST_Delirium_Chain) + && HasEffect(Buffs.Delirium) + && gauge.DarksideTimeRemaining > 0) + return OriginalHook(Bloodspiller); + // oGCDs if (CanWeave(actionID)) { @@ -220,22 +228,12 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } } - // Delirium Chain - if (LevelChecked(Delirium) - && LevelChecked(ScarletDelirium) - && IsEnabled(CustomComboPreset.DRK_ST_Delirium_Chain) - && HasEffect(Buffs.Delirium) - && gauge.DarksideTimeRemaining > 0 - && GetBuffStacks(Buffs.Delirium) > 2) - return OriginalHook(Bloodspiller); - //Delirium Features if (LevelChecked(Delirium) && IsEnabled(CustomComboPreset.DRK_ST_Bloodspiller)) { //Regular Bloodspiller - if (GetBuffStacks(Buffs.Delirium) > 0 - && IsNotEnabled(CustomComboPreset.DRK_ST_DelayedBloodspiller)) + if (GetBuffStacks(Buffs.Delirium) > 0) return Bloodspiller; //Blood management before Delirium @@ -301,6 +299,14 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim || GetBuffRemainingTime(Buffs.Scorn) < 5)) // Emergency usage return OriginalHook(Disesteem); + // Delirium Chain + if (LevelChecked(Delirium) + && LevelChecked(Impalement) + && IsEnabled(CustomComboPreset.DRK_AoE_Delirium_Chain) + && HasEffect(Buffs.Delirium) + && gauge.DarksideTimeRemaining > 1) + return OriginalHook(Quietus); + // oGCDs if (CanWeave(actionID)) { @@ -363,15 +369,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } } - // Delirium Chain - if (LevelChecked(Delirium) - && LevelChecked(Impalement) - && IsEnabled(CustomComboPreset.DRK_AoE_Delirium_Chain) - && HasEffect(Buffs.Delirium) - && gauge.DarksideTimeRemaining > 1 - && GetBuffStacks(Buffs.Delirium) > 2) - return OriginalHook(Quietus); - // Spend Dark Arts if (IsEnabled(CustomComboPreset.DRK_AoE_ManaOvercap) && (CanWeave(actionID) || CanDelayedWeave(actionID)) From b884a48271464419a95bf56f1110728fc2685a2d Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Sat, 6 Jul 2024 12:48:07 -0600 Subject: [PATCH 34/69] Fix lack of opener oGCDs --- XIVSlothCombo/Combos/PvE/DRK.cs | 34 ++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/DRK.cs b/XIVSlothCombo/Combos/PvE/DRK.cs index 845e5f3d2..90abbb9a5 100644 --- a/XIVSlothCombo/Combos/PvE/DRK.cs +++ b/XIVSlothCombo/Combos/PvE/DRK.cs @@ -129,14 +129,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim ) return OriginalHook(Disesteem); - // Delirium Chain - if (LevelChecked(Delirium) - && LevelChecked(ScarletDelirium) - && IsEnabled(CustomComboPreset.DRK_ST_Delirium_Chain) - && HasEffect(Buffs.Delirium) - && gauge.DarksideTimeRemaining > 0) - return OriginalHook(Bloodspiller); - // oGCDs if (CanWeave(actionID)) { @@ -156,7 +148,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //Mana Features if (IsEnabled(CustomComboPreset.DRK_ST_ManaOvercap) && ((CombatEngageDuration().TotalSeconds > 4 && CombatEngageDuration().TotalSeconds < 10 && gauge.DarksideTimeRemaining == 0) // Initial Darkside upping - || CombatEngageDuration().TotalSeconds >= 25)) + || CombatEngageDuration().TotalSeconds >= 10)) { // Spend mana to limit when not near even minute burst windows if (IsEnabled(CustomComboPreset.DRK_ST_ManaSpenderPooling) @@ -228,6 +220,14 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } } + // Delirium Chain + if (LevelChecked(Delirium) + && LevelChecked(ScarletDelirium) + && IsEnabled(CustomComboPreset.DRK_ST_Delirium_Chain) + && HasEffect(Buffs.Delirium) + && gauge.DarksideTimeRemaining > 0) + return OriginalHook(Bloodspiller); + //Delirium Features if (LevelChecked(Delirium) && IsEnabled(CustomComboPreset.DRK_ST_Bloodspiller)) @@ -299,14 +299,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim || GetBuffRemainingTime(Buffs.Scorn) < 5)) // Emergency usage return OriginalHook(Disesteem); - // Delirium Chain - if (LevelChecked(Delirium) - && LevelChecked(Impalement) - && IsEnabled(CustomComboPreset.DRK_AoE_Delirium_Chain) - && HasEffect(Buffs.Delirium) - && gauge.DarksideTimeRemaining > 1) - return OriginalHook(Quietus); - // oGCDs if (CanWeave(actionID)) { @@ -369,6 +361,14 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } } + // Delirium Chain + if (LevelChecked(Delirium) + && LevelChecked(Impalement) + && IsEnabled(CustomComboPreset.DRK_AoE_Delirium_Chain) + && HasEffect(Buffs.Delirium) + && gauge.DarksideTimeRemaining > 1) + return OriginalHook(Quietus); + // Spend Dark Arts if (IsEnabled(CustomComboPreset.DRK_AoE_ManaOvercap) && (CanWeave(actionID) || CanDelayedWeave(actionID)) From 2ab747449f9a0426d473d1600ac9cf7b88a8eab9 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Sat, 6 Jul 2024 22:51:08 -0600 Subject: [PATCH 35/69] Re-Enable WHM --- XIVSlothCombo/XIVSlothCombo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/XIVSlothCombo/XIVSlothCombo.cs b/XIVSlothCombo/XIVSlothCombo.cs index 0771ca298..b47bdcfa1 100644 --- a/XIVSlothCombo/XIVSlothCombo.cs +++ b/XIVSlothCombo/XIVSlothCombo.cs @@ -66,7 +66,7 @@ public sealed partial class XIVSlothCombo : IDalamudPlugin //SMN.JobID, //VPR.JobID, WAR.JobID, - WHM.JobID + //WHM.JobID }; public static readonly List DisabledJobsPVP = new List() @@ -635,4 +635,4 @@ private void OnCommand(string command, string arguments) Service.Configuration.Save(); } } -} \ No newline at end of file +} From 98403e2b2592bd41e152e534100fb1fc2e0a16e0 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Sat, 6 Jul 2024 23:09:39 -0600 Subject: [PATCH 36/69] Add new Action IDs --- XIVSlothCombo/Combos/PvE/WHM.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/XIVSlothCombo/Combos/PvE/WHM.cs b/XIVSlothCombo/Combos/PvE/WHM.cs index 66a5e4ccc..8e446addb 100644 --- a/XIVSlothCombo/Combos/PvE/WHM.cs +++ b/XIVSlothCombo/Combos/PvE/WHM.cs @@ -29,12 +29,15 @@ public const uint AfflatusMisery = 16535, Medica1 = 124, Medica2 = 133, + Medica3 = 37010, Tetragrammaton = 3570, DivineBenison = 7432, Aquaveil = 25861, + DivineCaress = 37011, // DPS Glare1 = 16533, Glare3 = 25859, + Glare4 = 37009, Stone1 = 119, Stone2 = 127, Stone3 = 3568, From 8080ea02510c44d3f73cb33519f0681fadae662c Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Sun, 7 Jul 2024 03:48:34 -0600 Subject: [PATCH 37/69] Re-Enable DRK --- XIVSlothCombo/XIVSlothCombo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/XIVSlothCombo/XIVSlothCombo.cs b/XIVSlothCombo/XIVSlothCombo.cs index 0771ca298..89844eb58 100644 --- a/XIVSlothCombo/XIVSlothCombo.cs +++ b/XIVSlothCombo/XIVSlothCombo.cs @@ -51,7 +51,7 @@ public sealed partial class XIVSlothCombo : IDalamudPlugin DNC.JobID, DOL.JobID, DRG.JobID, - DRK.JobID, + //DRK.JobID, //GNB.JobID, //MCH.JobID, MNK.JobID, @@ -635,4 +635,4 @@ private void OnCommand(string command, string arguments) Service.Configuration.Save(); } } -} \ No newline at end of file +} From c3e63e38224868db158811c30b038e11398c747c Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Mon, 8 Jul 2024 05:12:57 -0600 Subject: [PATCH 38/69] Add Sacred Sight buff --- XIVSlothCombo/Combos/PvE/WHM.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/XIVSlothCombo/Combos/PvE/WHM.cs b/XIVSlothCombo/Combos/PvE/WHM.cs index 8e446addb..8a9ab0f22 100644 --- a/XIVSlothCombo/Combos/PvE/WHM.cs +++ b/XIVSlothCombo/Combos/PvE/WHM.cs @@ -66,7 +66,8 @@ public const ushort PresenceOfMind = 157, ThinAir = 1217, DivineBenison = 1218, - Aquaveil = 2708; + Aquaveil = 2708, + SacredSight = 3879; } public static class Debuffs From b99caa5ba5432409b1d6cd369be1ad98c90fde58 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Mon, 8 Jul 2024 05:17:18 -0600 Subject: [PATCH 39/69] Make Lucid Dreaming check consistent with other combos --- XIVSlothCombo/Combos/PvE/WHM.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XIVSlothCombo/Combos/PvE/WHM.cs b/XIVSlothCombo/Combos/PvE/WHM.cs index 8a9ab0f22..597992b52 100644 --- a/XIVSlothCombo/Combos/PvE/WHM.cs +++ b/XIVSlothCombo/Combos/PvE/WHM.cs @@ -243,7 +243,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (CanSpellWeave(actionID)) { - bool lucidReady = IsOffCooldown(All.LucidDreaming) && LevelChecked(All.LucidDreaming) && LocalPlayer.CurrentMp <= Config.WHM_STDPS_Lucid; + bool lucidReady = ActionReady(All.LucidDreaming) && LevelChecked(All.LucidDreaming) && LocalPlayer.CurrentMp <= Config.WHM_STHeals_Lucid; bool pomReady = LevelChecked(PresenceOfMind) && IsOffCooldown(PresenceOfMind); bool assizeReady = LevelChecked(Assize) && IsOffCooldown(Assize); bool pomEnabled = IsEnabled(CustomComboPreset.WHM_ST_MainCombo_PresenceOfMind); From 6be1a8fdaa6fdfd4b1a189cbf0a634c7214f5a8f Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Mon, 8 Jul 2024 05:18:32 -0600 Subject: [PATCH 40/69] Add logic to Single Target Combo for Glare IV --- XIVSlothCombo/Combos/PvE/WHM.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/XIVSlothCombo/Combos/PvE/WHM.cs b/XIVSlothCombo/Combos/PvE/WHM.cs index 597992b52..e73d6cfc0 100644 --- a/XIVSlothCombo/Combos/PvE/WHM.cs +++ b/XIVSlothCombo/Combos/PvE/WHM.cs @@ -286,6 +286,11 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return OriginalHook(Aero); } + // Glare IV + if (HasEffect(Buffs.SacredSight) + && GetBuffStacks(Buffs.SacredSight) > 0) + return OriginalHook(PresenceOfMind); + if (IsEnabled(CustomComboPreset.WHM_ST_MainCombo_LilyOvercap) && LevelChecked(AfflatusRapture) && (liliesFull || liliesNearlyFull)) return AfflatusRapture; From f67cd6f35ce6692358e63b90d08634788f821371 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Mon, 8 Jul 2024 05:25:29 -0600 Subject: [PATCH 41/69] Add logic to AoE Combo for Glare IV --- XIVSlothCombo/Combos/PvE/WHM.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/XIVSlothCombo/Combos/PvE/WHM.cs b/XIVSlothCombo/Combos/PvE/WHM.cs index e73d6cfc0..b0cead52e 100644 --- a/XIVSlothCombo/Combos/PvE/WHM.cs +++ b/XIVSlothCombo/Combos/PvE/WHM.cs @@ -446,6 +446,11 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return All.LucidDreaming; } + // Glare IV + if (HasEffect(Buffs.SacredSight) + && GetBuffStacks(Buffs.SacredSight) > 0) + return OriginalHook(PresenceOfMind); + if (IsEnabled(CustomComboPreset.WHM_AoE_DPS_LilyOvercap) && LevelChecked(AfflatusRapture) && (liliesFullNoBlood || liliesNearlyFull)) return AfflatusRapture; From a3f326bddb9d44ca750e067b334fa0df035fe2e5 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Mon, 8 Jul 2024 05:28:47 -0600 Subject: [PATCH 42/69] Add options for Glare IV on combos --- XIVSlothCombo/Combos/CustomComboPreset.cs | 24 +++++++++++++++-------- XIVSlothCombo/Combos/PvE/WHM.cs | 6 ++++-- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index d9d2e7a91..15057cac2 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -3802,19 +3802,23 @@ The three digets after RDM.JobID can be used to reorder items in the list WHM_ST_MainCombo_Assize = 19009, [ParentCombo(WHM_ST_MainCombo)] - [CustomComboInfo("Afflatus Misery Option", "Adds Afflatus Misery to the single target combo when it is ready to be used.", WHM.JobID, 14, "", "")] + [CustomComboInfo("Glare IV Option", "Adds Glare IV to the single target combo when under Sacred Sight", WHM.JobID, 14, "", "")] + WHM_ST_MainCombo_GlareIV = 19015, + + [ParentCombo(WHM_ST_MainCombo)] + [CustomComboInfo("Afflatus Misery Option", "Adds Afflatus Misery to the single target combo when it is ready to be used.", WHM.JobID, 15, "", "")] WHM_ST_MainCombo_Misery_oGCD = 19017, [ParentCombo(WHM_ST_MainCombo)] - [CustomComboInfo("Lily Overcap Protection Option", "Adds Afflatus Rapture to the single target combo when at three Lilies.", WHM.JobID, 15, "", "")] + [CustomComboInfo("Lily Overcap Protection Option", "Adds Afflatus Rapture to the single target combo when at three Lilies.", WHM.JobID, 16, "", "")] WHM_ST_MainCombo_LilyOvercap = 19016, [ParentCombo(WHM_ST_MainCombo)] - [CustomComboInfo("Presence of Mind Option", "Adds Presence of Mind to the single target combo.", WHM.JobID, 16, "", "")] + [CustomComboInfo("Presence of Mind Option", "Adds Presence of Mind to the single target combo.", WHM.JobID, 17, "", "")] WHM_ST_MainCombo_PresenceOfMind = 19008, [ParentCombo(WHM_ST_MainCombo)] - [CustomComboInfo("Lucid Dreaming Option", "Adds Lucid Dreaming to the single target combo when below set MP value.", WHM.JobID, 17, "", "")] + [CustomComboInfo("Lucid Dreaming Option", "Adds Lucid Dreaming to the single target combo when below set MP value.", WHM.JobID, 18, "", "")] WHM_ST_MainCombo_Lucid = 19006, #endregion @@ -3830,19 +3834,23 @@ The three digets after RDM.JobID can be used to reorder items in the list WHM_AoE_DPS_Assize = 19192, [ParentCombo(WHM_AoE_DPS)] - [CustomComboInfo("Afflatus Misery Option", "Adds Afflatus Misery to the AoE combo when it is ready to be used.", WHM.JobID, 22, "", "")] + [CustomComboInfo("Glare IV Option", "Adds Glare IV to the AoE combo when under Sacred Sight", WHM.JobID, 22, "", "")] + WHM_AoE_DPS_GlareIV = 19196, + + [ParentCombo(WHM_AoE_DPS)] + [CustomComboInfo("Afflatus Misery Option", "Adds Afflatus Misery to the AoE combo when it is ready to be used.", WHM.JobID, 23, "", "")] WHM_AoE_DPS_Misery = 19194, [ParentCombo(WHM_AoE_DPS)] - [CustomComboInfo("Lily Overcap Protection Option", "Adds Afflatus Rapture to the AoE combo when at three Lilies.", WHM.JobID, 23, "", "")] + [CustomComboInfo("Lily Overcap Protection Option", "Adds Afflatus Rapture to the AoE combo when at three Lilies.", WHM.JobID, 24, "", "")] WHM_AoE_DPS_LilyOvercap = 19193, [ParentCombo(WHM_AoE_DPS)] - [CustomComboInfo("Presence of Mind Option", "Adds Presence of Mind to the AoE combo if you are moving or it can be weaved without GCD delay.", WHM.JobID, 24, "", "")] + [CustomComboInfo("Presence of Mind Option", "Adds Presence of Mind to the AoE combo if you are moving or it can be weaved without GCD delay.", WHM.JobID, 25, "", "")] WHM_AoE_DPS_PresenceOfMind = 19195, [ParentCombo(WHM_AoE_DPS)] - [CustomComboInfo("Lucid Dreaming Option", "Adds Lucid Dreaming to the AoE combo when below the set MP value if you are moving or it can be weaved without GCD delay.", WHM.JobID, 25, "", "")] + [CustomComboInfo("Lucid Dreaming Option", "Adds Lucid Dreaming to the AoE combo when below the set MP value if you are moving or it can be weaved without GCD delay.", WHM.JobID, 26, "", "")] WHM_AoE_DPS_Lucid = 19191, #endregion diff --git a/XIVSlothCombo/Combos/PvE/WHM.cs b/XIVSlothCombo/Combos/PvE/WHM.cs index b0cead52e..4eaec1076 100644 --- a/XIVSlothCombo/Combos/PvE/WHM.cs +++ b/XIVSlothCombo/Combos/PvE/WHM.cs @@ -287,7 +287,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } // Glare IV - if (HasEffect(Buffs.SacredSight) + if (IsEnabled(CustomComboPreset.WHM_ST_MainCombo_GlareIV) + && HasEffect(Buffs.SacredSight) && GetBuffStacks(Buffs.SacredSight) > 0) return OriginalHook(PresenceOfMind); @@ -447,7 +448,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } // Glare IV - if (HasEffect(Buffs.SacredSight) + if (IsEnabled(CustomComboPreset.WHM_AoE_DPS_GlareIV) + && HasEffect(Buffs.SacredSight) && GetBuffStacks(Buffs.SacredSight) > 0) return OriginalHook(PresenceOfMind); From d8c7310b7c68e37ef1a6e2611aab64c6156ff9fe Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Mon, 8 Jul 2024 05:37:50 -0600 Subject: [PATCH 43/69] Add Divine Grace Buff --- XIVSlothCombo/Combos/PvE/WHM.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/XIVSlothCombo/Combos/PvE/WHM.cs b/XIVSlothCombo/Combos/PvE/WHM.cs index 4eaec1076..fbbcf52f6 100644 --- a/XIVSlothCombo/Combos/PvE/WHM.cs +++ b/XIVSlothCombo/Combos/PvE/WHM.cs @@ -67,7 +67,8 @@ public const ushort ThinAir = 1217, DivineBenison = 1218, Aquaveil = 2708, - SacredSight = 3879; + SacredSight = 3879, + DivineGrace = 3881; } public static class Debuffs From cd794972a9981bf6e5d9d868c8dfad847b55ed8d Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Mon, 8 Jul 2024 05:46:12 -0600 Subject: [PATCH 44/69] Add Medica III buff --- XIVSlothCombo/Combos/PvE/WHM.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/XIVSlothCombo/Combos/PvE/WHM.cs b/XIVSlothCombo/Combos/PvE/WHM.cs index fbbcf52f6..f6cd6d00b 100644 --- a/XIVSlothCombo/Combos/PvE/WHM.cs +++ b/XIVSlothCombo/Combos/PvE/WHM.cs @@ -63,6 +63,7 @@ public static class Buffs public const ushort Regen = 158, Medica2 = 150, + Medica3 = 3880, PresenceOfMind = 157, ThinAir = 1217, DivineBenison = 1218, From 930b27a41c0a44328149fb09561de0e3c0b2965a Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Mon, 8 Jul 2024 06:02:08 -0600 Subject: [PATCH 45/69] Add Medica III upgrade option --- XIVSlothCombo/Combos/CustomComboPreset.cs | 4 ++++ XIVSlothCombo/Combos/PvE/WHM.cs | 19 +++++++++++++++---- XIVSlothCombo/Window/Functions/UserConfig.cs | 6 +++--- 3 files changed, 22 insertions(+), 7 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index 15057cac2..93880bb31 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -3901,6 +3901,10 @@ The three digets after RDM.JobID can be used to reorder items in the list [CustomComboInfo("Medica II Option", "Uses Medica II when current target doesn't have Medica II buff.", WHM.JobID, 1)] WHM_AoEHeals_Medica2 = 19205, + [ParentCombo(WHM_AoEHeals_Medica2)] + [CustomComboInfo("Medica III Option", "Upgrades to Medica III when level allows.", WHM.JobID)] + WHM_AoEHeals_Medica3 = 19206, + #endregion #region Single Target Heals diff --git a/XIVSlothCombo/Combos/PvE/WHM.cs b/XIVSlothCombo/Combos/PvE/WHM.cs index f6cd6d00b..31bf1e26c 100644 --- a/XIVSlothCombo/Combos/PvE/WHM.cs +++ b/XIVSlothCombo/Combos/PvE/WHM.cs @@ -117,11 +117,11 @@ internal static UserBool WHM_STHeals_AquaveilWeave = new("WHM_STHeals_AquaveilWeave"), WHM_AoEHeals_PlenaryWeave = new("WHM_AoEHeals_PlenaryWeave"), WHM_AoEHeals_AssizeWeave = new("WHM_AoEHeals_AssizeWeave"), - WHM_AoEHeals_Medica2MO = new("WHM_AoEHeals_Medica2MO"); + WHM_AoEHeals_MedicaMO = new("WHM_AoEHeals_MedicaMO"); internal static UserFloat WHM_ST_MainCombo_DoT_Threshold = new("WHM_ST_MainCombo_DoT_Threshold"), WHM_STHeals_RegenTimer = new("WHM_STHeals_RegenTimer"), - WHM_AoEHeals_Medica2Time = new("WHM_AoEHeals_Medica2Time"); + WHM_AoEHeals_MedicaTime = new("WHM_AoEHeals_MedicaTime"); public static UserBoolArray WHM_ST_MainCombo_Adv_Actions = new("WHM_ST_MainCombo_Adv_Actions"); } @@ -323,7 +323,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim bool lucidReady = ActionReady(All.LucidDreaming) && LocalPlayer.CurrentMp <= Config.WHM_AoEHeals_Lucid; bool plenaryReady = ActionReady(PlenaryIndulgence) && (!Config.WHM_AoEHeals_PlenaryWeave || (Config.WHM_AoEHeals_PlenaryWeave && canWeave)); bool assizeReady = ActionReady(Assize) && (!Config.WHM_AoEHeals_AssizeWeave || (Config.WHM_AoEHeals_AssizeWeave && canWeave)); - var healTarget = GetHealTarget(Config.WHM_AoEHeals_Medica2MO); + var healTarget = GetHealTarget(Config.WHM_AoEHeals_MedicaMO); if (IsEnabled(CustomComboPreset.WHM_AoEHeals_Assize) && assizeReady) return Assize; @@ -343,8 +343,19 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsEnabled(CustomComboPreset.WHM_AoEHeals_ThinAir) && thinAirReady) return ThinAir; - if (IsEnabled(CustomComboPreset.WHM_AoEHeals_Medica2) && (FindEffectOnMember(Buffs.Medica2, healTarget) == null || FindEffectOnMember(Buffs.Medica2, healTarget).RemainingTime <= Config.WHM_AoEHeals_Medica2Time) && ActionReady(Medica2)) + if (IsEnabled(CustomComboPreset.WHM_AoEHeals_Medica2) + && ((FindEffectOnMember(Buffs.Medica2, healTarget) == null && FindEffectOnMember(Buffs.Medica3, healTarget) == null) + || FindEffectOnMember(Buffs.Medica2, healTarget).RemainingTime <= Config.WHM_AoEHeals_MedicaTime + || FindEffectOnMember(Buffs.Medica3, healTarget).RemainingTime <= Config.WHM_AoEHeals_MedicaTime) + && (ActionReady(Medica2) || ActionReady(Medica3))) + { + // Medica 3 upgrade + if (IsEnabled(CustomComboPreset.WHM_AoEHeals_Medica3) + && LevelChecked(Medica3)) + return Medica3; + return Medica2; + } if (IsEnabled(CustomComboPreset.WHM_AoEHeals_Cure3) && ActionReady(Cure3) && (LocalPlayer.CurrentMp >= Config.WHM_AoEHeals_Cure3MP || HasEffect(Buffs.ThinAir))) return Cure3; diff --git a/XIVSlothCombo/Window/Functions/UserConfig.cs b/XIVSlothCombo/Window/Functions/UserConfig.cs index 0b5b4aa41..4f628ae0d 100644 --- a/XIVSlothCombo/Window/Functions/UserConfig.cs +++ b/XIVSlothCombo/Window/Functions/UserConfig.cs @@ -2577,8 +2577,8 @@ internal static void Draw(CustomComboPreset preset, bool enabled) if (preset == CustomComboPreset.WHM_AoEHeals_Medica2) { - UserConfig.DrawRoundedSliderFloat(0f, 6f, WHM.Config.WHM_AoEHeals_Medica2Time, "Time Remaining on Buff to Renew"); - UserConfig.DrawAdditionalBoolChoice(WHM.Config.WHM_AoEHeals_Medica2MO, "Party UI Mousover Checking", "Check your mouseover target for the Medica II buff.\nTo be used in conjunction with Redirect/Reaction/etc."); + UserConfig.DrawRoundedSliderFloat(0f, 6f, WHM.Config.WHM_AoEHeals_MedicaTime, "Time Remaining on Buff to Renew"); + UserConfig.DrawAdditionalBoolChoice(WHM.Config.WHM_AoEHeals_MedicaMO, "Party UI Mousover Checking", "Check your mouseover target for the Medica II/III buff.\nTo be used in conjunction with Redirect/Reaction/etc."); } #endregion @@ -2679,4 +2679,4 @@ public const uint Hundreds = 100, Thousands = 1000; } -} \ No newline at end of file +} From 6b9f99c9374ef267016240fef9d8da49cf3120c5 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Mon, 8 Jul 2024 06:07:22 -0600 Subject: [PATCH 46/69] Remove duplicate action --- XIVSlothCombo/Combos/PvE/WHM.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/WHM.cs b/XIVSlothCombo/Combos/PvE/WHM.cs index 31bf1e26c..cc7f2f0b9 100644 --- a/XIVSlothCombo/Combos/PvE/WHM.cs +++ b/XIVSlothCombo/Combos/PvE/WHM.cs @@ -18,7 +18,6 @@ internal static class WHM public const uint // Heals Cure = 120, - Medica = 124, Cure2 = 135, Cure3 = 131, Regen = 137, @@ -88,8 +87,6 @@ internal static readonly Dictionary { Dia, Debuffs.Dia } }; - - public static class Config { internal static UserInt @@ -166,7 +163,6 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } } - internal class WHM_Raise : CustomCombo { protected internal override CustomComboPreset Preset { get; } = CustomComboPreset.WHM_Raise; @@ -315,7 +311,7 @@ internal class WHM_AoEHeals : CustomCombo protected override uint Invoke(uint actionID, uint lastComboMove, float comboTime, byte level) { - if (actionID is Medica) + if (actionID is Medica1) { WHMGauge? gauge = GetJobGauge(); bool thinAirReady = LevelChecked(ThinAir) && !HasEffect(Buffs.ThinAir) && GetRemainingCharges(ThinAir) > Config.WHM_AoEHeals_ThinAir; From f79da56ca821ecb7a99aa325eea6dae52c6801e7 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Mon, 8 Jul 2024 06:10:41 -0600 Subject: [PATCH 47/69] Remove duplicate Medica --- 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 93880bb31..fe5ac60ae 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -3865,7 +3865,7 @@ The three digets after RDM.JobID can be used to reorder items in the list #region AoE Heals Feature - [ReplaceSkill(WHM.Medica)] + [ReplaceSkill(WHM.Medica1)] [CustomComboInfo("Simple Heals (AoE)", "Replaces Medica with a one button AoE healing setup.", WHM.JobID, 4, "", "")] WHM_AoEHeals = 19007, From 9b2ae10207d5464dccfbec35444b17b64961b6ad Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Mon, 8 Jul 2024 06:15:39 -0600 Subject: [PATCH 48/69] Add Option and Combo code for Divine Caress --- XIVSlothCombo/Combos/CustomComboPreset.cs | 6 +++++- XIVSlothCombo/Combos/PvE/WHM.cs | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index fe5ac60ae..cb2bf91b6 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -3894,7 +3894,7 @@ The three digets after RDM.JobID can be used to reorder items in the list WHM_AoEHeals_Plenary = 19203, [ParentCombo(WHM_AoEHeals)] - [CustomComboInfo("Lucid Dreaming Option", "Uses Lucid Dreaming when available.", WHM.JobID, 8)] + [CustomComboInfo("Lucid Dreaming Option", "Uses Lucid Dreaming when available.", WHM.JobID, 9)] WHM_AoEHeals_Lucid = 19204, [ParentCombo(WHM_AoEHeals)] @@ -3905,6 +3905,10 @@ The three digets after RDM.JobID can be used to reorder items in the list [CustomComboInfo("Medica III Option", "Upgrades to Medica III when level allows.", WHM.JobID)] WHM_AoEHeals_Medica3 = 19206, + [ParentCombo(WHM_AoEHeals)] + [CustomComboInfo("Divine Caress", "Uses Divine Caress when Divine Grace from Temperance is active.", WHM.JobID, 8)] + WHM_AoEHeals_DivineCaress = 19207, + #endregion #region Single Target Heals diff --git a/XIVSlothCombo/Combos/PvE/WHM.cs b/XIVSlothCombo/Combos/PvE/WHM.cs index cc7f2f0b9..13c35ef2b 100644 --- a/XIVSlothCombo/Combos/PvE/WHM.cs +++ b/XIVSlothCombo/Combos/PvE/WHM.cs @@ -318,6 +318,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim var canWeave = CanSpellWeave(actionID, 0.3); bool lucidReady = ActionReady(All.LucidDreaming) && LocalPlayer.CurrentMp <= Config.WHM_AoEHeals_Lucid; bool plenaryReady = ActionReady(PlenaryIndulgence) && (!Config.WHM_AoEHeals_PlenaryWeave || (Config.WHM_AoEHeals_PlenaryWeave && canWeave)); + bool divineCaressReady = ActionReady(DivineCaress) && HasEffect(Buffs.DivineGrace); bool assizeReady = ActionReady(Assize) && (!Config.WHM_AoEHeals_AssizeWeave || (Config.WHM_AoEHeals_AssizeWeave && canWeave)); var healTarget = GetHealTarget(Config.WHM_AoEHeals_MedicaMO); @@ -327,6 +328,9 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsEnabled(CustomComboPreset.WHM_AoEHeals_Plenary) && plenaryReady) return PlenaryIndulgence; + if (IsEnabled(CustomComboPreset.WHM_AoEHeals_DivineCaress) && divineCaressReady) + return DivineCaress; + if (IsEnabled(CustomComboPreset.WHM_AoEHeals_Lucid) && canWeave && lucidReady) return All.LucidDreaming; From 04336c7ff75e7e13e89b4ab0abd405c0e69f9880 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Mon, 8 Jul 2024 07:50:24 -0600 Subject: [PATCH 49/69] Update Salted Earth logic to be more concise, and less interruptive of the AoE combo --- XIVSlothCombo/Combos/PvE/DRK.cs | 57 +++++++++++++++++---------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/DRK.cs b/XIVSlothCombo/Combos/PvE/DRK.cs index 90abbb9a5..c209bf2ec 100644 --- a/XIVSlothCombo/Combos/PvE/DRK.cs +++ b/XIVSlothCombo/Combos/PvE/DRK.cs @@ -191,13 +191,13 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsEnabled(CustomComboPreset.DRK_ST_CDs)) { // Salted Earth - // todo: simplify this to make it easier to read if (IsEnabled(CustomComboPreset.DRK_ST_CDs_SaltedEarth) - && LevelChecked(SaltedEarth) - ) + && (ActionReady(SaltedEarth) || ActionReady(SaltAndDarkness))) { - if ((IsOffCooldown(SaltedEarth) && !HasEffect(Buffs.SaltedEarth)) || //Salted Earth - (HasEffect(Buffs.SaltedEarth) && IsOffCooldown(SaltAndDarkness) && IsOnCooldown(SaltedEarth) && LevelChecked(SaltAndDarkness) && GetBuffRemainingTime(Buffs.SaltedEarth) < 9)) //Salt and Darkness + if (!HasEffect(Buffs.SaltedEarth) || // Cast Salted Earth + (HasEffect(Buffs.SaltedEarth) + && GetBuffRemainingTime(Buffs.SaltedEarth) < 9 + && ActionReady(SaltAndDarkness))) //Cast Salt and Darkness return OriginalHook(SaltedEarth); } @@ -321,43 +321,44 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim && (LocalPlayer.CurrentMp > 8500 || (gauge.DarksideTimeRemaining < 10 && LocalPlayer.CurrentMp >= 3000))) return OriginalHook(FloodOfDarkness); - if (gauge.DarksideTimeRemaining > 1) - { - // Delirium - if (IsEnabled(CustomComboPreset.DRK_AoE_Delirium) - && IsOffCooldown(Delirium) - && LevelChecked(Delirium)) - return Delirium; + // Living Shadow + if (IsEnabled(CustomComboPreset.DRK_AoE_CDs_LivingShadow) + && IsOffCooldown(LivingShadow) + && LevelChecked(LivingShadow) + && GetTargetHPPercent() > hpRemaining) + return LivingShadow; - // Living Shadow - if (IsEnabled(CustomComboPreset.DRK_AoE_CDs_LivingShadow) - && IsOffCooldown(LivingShadow) - && LevelChecked(LivingShadow) - && GetTargetHPPercent() > hpRemaining) - return LivingShadow; + // Delirium + if (IsEnabled(CustomComboPreset.DRK_AoE_Delirium) + && IsOffCooldown(Delirium) + && LevelChecked(Delirium)) + return Delirium; + if (gauge.DarksideTimeRemaining > 1) + { // Salted Earth - // todo: simplify this to make it easier to read if (IsEnabled(CustomComboPreset.DRK_AoE_CDs_SaltedEarth) - && LevelChecked(SaltedEarth)) + && (ActionReady(SaltedEarth) || ActionReady(SaltAndDarkness))) { - if ((IsOffCooldown(SaltedEarth) && !HasEffect(Buffs.SaltedEarth)) || //Salted Earth - (HasEffect(Buffs.SaltedEarth) && IsOffCooldown(SaltAndDarkness) && IsOnCooldown(SaltedEarth) && LevelChecked(SaltAndDarkness))) //Salt and Darkness + if (!HasEffect(Buffs.SaltedEarth) || // Cast Salted Earth + (HasEffect(Buffs.SaltedEarth) + && GetBuffRemainingTime(Buffs.SaltedEarth) < 9 + && ActionReady(SaltAndDarkness))) //Cast Salt and Darkness return OriginalHook(SaltedEarth); } + // Shadowbringer + if (IsEnabled(CustomComboPreset.DRK_AoE_CDs_Shadowbringer) + && LevelChecked(Shadowbringer) + && GetRemainingCharges(Shadowbringer) > 0) + return Shadowbringer; + // Abyssal Drain if (IsEnabled(CustomComboPreset.DRK_AoE_CDs_AbyssalDrain) && LevelChecked(AbyssalDrain) && IsOffCooldown(AbyssalDrain) && PlayerHealthPercentageHp() <= 60) return AbyssalDrain; - - // Shadowbringer - if (IsEnabled(CustomComboPreset.DRK_AoE_CDs_Shadowbringer) - && LevelChecked(Shadowbringer) - && GetRemainingCharges(Shadowbringer) > 0) - return Shadowbringer; } } From 5f4d8a45e9b4d125634a0c88efd88ceee90752de Mon Sep 17 00:00:00 2001 From: ace Date: Mon, 8 Jul 2024 18:29:33 -0700 Subject: [PATCH 50/69] add PRuination to AOE, PRuin on PRend option, option select fix --- XIVSlothCombo/Combos/CustomComboPreset.cs | 12 ++++++++++-- XIVSlothCombo/Combos/PvE/WAR.cs | 15 ++++++--------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index 3bbaf0d2b..7b59b3149 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -3750,13 +3750,21 @@ The three digets after RDM.JobID can be used to reorder items in the list [CustomComboInfo("Primal Wrath Option", "Adds Primal Wrath to Advanced Mode if you have Surging Tempest.", WAR.JobID, 5, "", "")] WAR_AOE_Overpower_PrimalWrath = 18017, + [ParentCombo(WAR_AoE_Overpower)] + [CustomComboInfo("Primal Rend Option", "Adds Primal Rend to Advanced Mode if you have Surging Tempest.", WAR.JobID, 5, "", "")] + WAR_AOE_Overpower_PrimalRend = 18029, + + [ParentCombo(WAR_AoE_Overpower)] + [CustomComboInfo("Primal Ruination Option", "Adds Primal Ruination to Advanced Mode if you have Surging Tempest.", WAR.JobID, 5, "", "")] + WAR_AOE_Overpower_PrimalRuination = 18030, + [ReplaceSkill(WAR.FellCleave, WAR.Decimate)] [CustomComboInfo("Infuriate on Fell Cleave / Decimate Feature", "Turns Fell Cleave and Decimate into Infuriate if at or under set rage value.", WAR.JobID, 4, "", "")] - WAR_InfuriateFellCleave = 18018, + WAR_InfuriateFellCleave = 18031, [ReplaceSkill(WAR.InnerRelease)] [CustomComboInfo("Primal Rend Feature", "Turns Inner Release into Primal Rend on use.", WAR.JobID, 3, "", "")] - WAR_PrimalRend_InnerRelease = 18019, + WAR_PrimalRend_InnerRelease = 18032, [ParentCombo(WAR_InfuriateFellCleave)] [CustomComboInfo("Inner Release Priority Option", "Prevents the use of Infuriate while you have Inner Release stacks available.", WAR.JobID)] diff --git a/XIVSlothCombo/Combos/PvE/WAR.cs b/XIVSlothCombo/Combos/PvE/WAR.cs index 569f99564..c54bc8ad6 100644 --- a/XIVSlothCombo/Combos/PvE/WAR.cs +++ b/XIVSlothCombo/Combos/PvE/WAR.cs @@ -238,7 +238,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return PrimalWrath; } - if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_PrimalRend) && HasEffect(Buffs.PrimalRendReady) && LevelChecked(PrimalRend) && GetCooldownRemainingTime(InnerRelease) < 57.5) + if (IsEnabled(CustomComboPreset.WAR_AOE_Overpower_PrimalRend) && HasEffect(Buffs.PrimalRendReady) && LevelChecked(PrimalRend) && GetCooldownRemainingTime(InnerRelease) < 57.5) { if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_PrimalRend_CloseRange) && (GetTargetDistance() <= 3 || GetBuffRemainingTime(Buffs.PrimalRendReady) <= 10)) return PrimalRend; @@ -246,7 +246,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return PrimalRend; } - if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_PrimalRuination) && HasEffect(Buffs.PrimalRuinationReady) && LevelChecked(PrimalRuination) && WasLastWeaponskill(PrimalRend)) + if (IsEnabled(CustomComboPreset.WAR_AOE_Overpower_PrimalRuination) && HasEffect(Buffs.PrimalRuinationReady) && LevelChecked(PrimalRuination) && WasLastWeaponskill(PrimalRend)) return PrimalRuination; if (IsEnabled(CustomComboPreset.WAR_AoE_Overpower_Decimate) && LevelChecked(SteelCyclone) && (gauge >= decimateGaugeSpend || HasEffect(Buffs.InnerRelease) || HasEffect(Buffs.NascentChaos))) @@ -294,17 +294,14 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { if (actionID == InnerBeast || actionID == SteelCyclone) { - if (LevelChecked(PrimalRend) && HasEffect(Buffs.PrimalRendReady)) return PrimalRend; - - // Fell Cleave or Decimate - return OriginalHook(actionID); - - + if (LevelChecked(PrimalRuination) && HasEffect(Buffs.PrimalRuinationReady) && WasLastWeaponskill(PrimalRend)) + return PrimalRuination; } - return actionID; + // fell cleave or decimate + return OriginalHook(actionID); } } From 4b7318d33fa12abb138b8b19d1ba4eeab92b2f92 Mon Sep 17 00:00:00 2001 From: ace Date: Mon, 8 Jul 2024 18:30:43 -0700 Subject: [PATCH 51/69] oopy --- XIVSlothCombo/Combos/CustomComboPreset.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index 7b59b3149..dff14948f 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -3752,11 +3752,11 @@ The three digets after RDM.JobID can be used to reorder items in the list [ParentCombo(WAR_AoE_Overpower)] [CustomComboInfo("Primal Rend Option", "Adds Primal Rend to Advanced Mode if you have Surging Tempest.", WAR.JobID, 5, "", "")] - WAR_AOE_Overpower_PrimalRend = 18029, + WAR_AOE_Overpower_PrimalRend = 18018, [ParentCombo(WAR_AoE_Overpower)] [CustomComboInfo("Primal Ruination Option", "Adds Primal Ruination to Advanced Mode if you have Surging Tempest.", WAR.JobID, 5, "", "")] - WAR_AOE_Overpower_PrimalRuination = 18030, + WAR_AOE_Overpower_PrimalRuination = 18019, [ReplaceSkill(WAR.FellCleave, WAR.Decimate)] [CustomComboInfo("Infuriate on Fell Cleave / Decimate Feature", "Turns Fell Cleave and Decimate into Infuriate if at or under set rage value.", WAR.JobID, 4, "", "")] From 82375633f74d2e26835db6a635f7f5fbe5bd63d0 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Tue, 9 Jul 2024 04:39:57 -0600 Subject: [PATCH 52/69] Prevent attempting opener on different single targets (Won't execute opener if you precast Presence of Mind) --- XIVSlothCombo/Combos/PvE/WHM.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/WHM.cs b/XIVSlothCombo/Combos/PvE/WHM.cs index 13c35ef2b..0534aeaf1 100644 --- a/XIVSlothCombo/Combos/PvE/WHM.cs +++ b/XIVSlothCombo/Combos/PvE/WHM.cs @@ -205,7 +205,9 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (ActionFound) { WHMGauge? gauge = GetJobGauge(); - bool inOpener = IsEnabled(CustomComboPreset.WHM_ST_MainCombo_Opener) && Glare3Count < 4; + bool inOpener = IsEnabled(CustomComboPreset.WHM_ST_MainCombo_Opener) + && Glare3Count < 4 + && !HasEffect(Buffs.SacredSight); bool liliesFull = gauge.Lily == 3; bool liliesNearlyFull = gauge.Lily == 2 && gauge.LilyTimer >= 17000; @@ -223,7 +225,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return OriginalHook(All.Swiftcast); if (ActionReady(PresenceOfMind)) - return PresenceOfMind; + return PresenceOfMind; } if (Glare3Count == 4) From 86291fa171808f8c37272ba733fdbb9fa48d3d8a Mon Sep 17 00:00:00 2001 From: Genesis <12591123+Genesis-Nova@users.noreply.github.com> Date: Tue, 9 Jul 2024 10:53:53 -0500 Subject: [PATCH 53/69] Pre-level 100 logic fix for smn burst delay, errant ! made the check always true. --- 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 5b6b2c96b..12b66ad4f 100644 --- a/XIVSlothCombo/Combos/PvE/SMN.cs +++ b/XIVSlothCombo/Combos/PvE/SMN.cs @@ -513,7 +513,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim // Demi Nuke if (OriginalHook(Ruin) is AstralImpulse or UmbralImpulse or FountainOfFire) { - if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_Attacks) && IsBahamutReady && (!LevelChecked(SummonSolarBahamut) || DemiAttackCount >= burstDelay)) + if (IsEnabled(CustomComboPreset.SMN_Advanced_Combo_DemiSummons_Attacks) && IsBahamutReady && (LevelChecked(SummonSolarBahamut) || DemiAttackCount >= burstDelay)) { if (IsOffCooldown(OriginalHook(EnkindleBahamut)) && LevelChecked(SummonBahamut)) return OriginalHook(EnkindleBahamut); From 826d3f2928b29e609cb9ecd48f492b1afea958dd Mon Sep 17 00:00:00 2001 From: ace Date: Tue, 9 Jul 2024 15:30:07 -0700 Subject: [PATCH 54/69] lol WAR job re-enable forgor --- XIVSlothCombo/XIVSlothCombo.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XIVSlothCombo/XIVSlothCombo.cs b/XIVSlothCombo/XIVSlothCombo.cs index 0771ca298..52f03f2d5 100644 --- a/XIVSlothCombo/XIVSlothCombo.cs +++ b/XIVSlothCombo/XIVSlothCombo.cs @@ -65,7 +65,7 @@ public sealed partial class XIVSlothCombo : IDalamudPlugin //SGE.JobID, //SMN.JobID, //VPR.JobID, - WAR.JobID, + //WAR.JobID, WHM.JobID }; From 6a7fc03b4812855da98591c808451414608f0dbd Mon Sep 17 00:00:00 2001 From: Genesis <12591123+Genesis-Nova@users.noreply.github.com> Date: Tue, 9 Jul 2024 20:33:42 -0500 Subject: [PATCH 55/69] Update SMN.cs CanDelayedWeave was causing searing light to not go off before enkindle, and the section was already in a canspellweave block. --- XIVSlothCombo/Combos/PvE/SMN.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/SMN.cs b/XIVSlothCombo/Combos/PvE/SMN.cs index 12b66ad4f..8c657a53d 100644 --- a/XIVSlothCombo/Combos/PvE/SMN.cs +++ b/XIVSlothCombo/Combos/PvE/SMN.cs @@ -436,7 +436,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (CanSpellWeave(actionID)) { // Searing Light - if (IsEnabled(CustomComboPreset.SMN_SearingLight) && CanDelayedWeave(actionID) && IsOffCooldown(SearingLight) && LevelChecked(SearingLight)) + if (IsEnabled(CustomComboPreset.SMN_SearingLight) && IsOffCooldown(SearingLight) && LevelChecked(SearingLight)) { if (IsEnabled(CustomComboPreset.SMN_SearingLight_Burst)) { @@ -804,4 +804,4 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim } } } -} \ No newline at end of file +} From e03cfef02b8772d7c92e4de19a4858ceef5c2ab1 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Wed, 10 Jul 2024 05:49:08 -0600 Subject: [PATCH 56/69] Fix Salted Earth blocking other abilities --- XIVSlothCombo/Combos/PvE/DRK.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/DRK.cs b/XIVSlothCombo/Combos/PvE/DRK.cs index c209bf2ec..0f940c0b7 100644 --- a/XIVSlothCombo/Combos/PvE/DRK.cs +++ b/XIVSlothCombo/Combos/PvE/DRK.cs @@ -194,8 +194,9 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsEnabled(CustomComboPreset.DRK_ST_CDs_SaltedEarth) && (ActionReady(SaltedEarth) || ActionReady(SaltAndDarkness))) { - if (!HasEffect(Buffs.SaltedEarth) || // Cast Salted Earth - (HasEffect(Buffs.SaltedEarth) + if (!HasEffect(Buffs.SaltedEarth) + && ActionReady(SaltedEarth) // Cast Salted Earth + || (HasEffect(Buffs.SaltedEarth) && GetBuffRemainingTime(Buffs.SaltedEarth) < 9 && ActionReady(SaltAndDarkness))) //Cast Salt and Darkness return OriginalHook(SaltedEarth); @@ -340,8 +341,9 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsEnabled(CustomComboPreset.DRK_AoE_CDs_SaltedEarth) && (ActionReady(SaltedEarth) || ActionReady(SaltAndDarkness))) { - if (!HasEffect(Buffs.SaltedEarth) || // Cast Salted Earth - (HasEffect(Buffs.SaltedEarth) + if (!HasEffect(Buffs.SaltedEarth) + && ActionReady(SaltedEarth) // Cast Salted Earth + || (HasEffect(Buffs.SaltedEarth) && GetBuffRemainingTime(Buffs.SaltedEarth) < 9 && ActionReady(SaltAndDarkness))) //Cast Salt and Darkness return OriginalHook(SaltedEarth); From af393901c16c0ba0217e393ae9ea997008d02a74 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Wed, 10 Jul 2024 09:08:46 -0600 Subject: [PATCH 57/69] Correct Aquaveil typo --- 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 cb2bf91b6..33ab226bc 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -3942,7 +3942,7 @@ The three digets after RDM.JobID can be used to reorder items in the list WHM_STHeals_Benison = 19306, [ParentCombo(WHM_STHeals)] - [CustomComboInfo("Aqualveil Option", "Uses Aquaveil when available.", WHM.JobID)] + [CustomComboInfo("Aquaveil Option", "Uses Aquaveil when available.", WHM.JobID)] WHM_STHeals_Aquaveil = 19307, [ParentCombo(WHM_STHeals)] From 46aaf5eff93314d6f3ab496578043e411339d60b Mon Sep 17 00:00:00 2001 From: Taurenkey Date: Wed, 10 Jul 2024 17:17:58 +0100 Subject: [PATCH 58/69] Fix up AST --- XIVSlothCombo/Combos/CustomComboPreset.cs | 53 +++---- XIVSlothCombo/Combos/JobHelpers/AST.cs | 44 +++--- XIVSlothCombo/Combos/PvE/AST.cs | 131 ++++++++---------- XIVSlothCombo/CustomCombo/Functions/Target.cs | 2 +- XIVSlothCombo/Data/ActionWatching.cs | 13 +- XIVSlothCombo/Window/Functions/UserConfig.cs | 16 +++ XIVSlothCombo/Window/Icons.cs | 5 +- XIVSlothCombo/Window/Tabs/Debug.cs | 27 ++-- XIVSlothCombo/Window/Tabs/PvEFeatures.cs | 10 +- XIVSlothCombo/Window/Tabs/PvPFeatures.cs | 22 +-- XIVSlothCombo/XIVSlothCombo.cs | 15 +- 11 files changed, 171 insertions(+), 167 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index d9d2e7a91..f45e9611a 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -186,7 +186,7 @@ public enum CustomComboPreset [ReplaceSkill(AST.Gravity, AST.Gravity2)] [ParentCombo(AST_ST_DPS)] - [CustomComboInfo("AoE DPS Feature", "Every option below (Lucid/AutoDraws/Astrodyne/etc) will also be added to Gravity", AST.JobID, 1, "", "")] + [CustomComboInfo("AoE DPS Option", "Every option below (Lucid/AutoDraws/Astrodyne/etc) will also be added to Gravity", AST.JobID, 1, "", "")] AST_AoE_DPS = 1013, [ParentCombo(AST_ST_DPS)] @@ -202,25 +202,13 @@ public enum CustomComboPreset AST_DPS_Divination = 1016, [ParentCombo(AST_ST_DPS)] - [CustomComboInfo("Card Draw Weave Option", "Draws your card", AST.JobID, 5, "", "")] + [CustomComboInfo("Card Draw Weave Option", "Draws your cards", AST.JobID, 5, "", "")] AST_DPS_AutoDraw = 1011, [ParentCombo(AST_ST_DPS)] - [CustomComboInfo("Card Play Weave Option", "Weaves your card (best used with Quick Target Cards)", AST.JobID, 6)] + [CustomComboInfo("Card Play Weave Option", "Weaves your Balance or Arrow card (best used with Quick Target Cards)", AST.JobID, 6)] AST_DPS_AutoPlay = 1037, - [ParentCombo(AST_ST_DPS)] - [CustomComboInfo("Redraw Option", "Weaves Redraw if you pull a card with a seal you already have and you can use Redraw.", AST.JobID, 7)] - AST_DPS_AutoPlay_Redraw = 1038, - - [ParentCombo(AST_ST_DPS)] - [CustomComboInfo("Astrodyne Weave Option", "Adds Astrodyne when you have 3 seals", AST.JobID, 8, "", "")] - AST_DPS_Astrodyne = 1009, - - [ParentCombo(AST_ST_DPS)] - [CustomComboInfo("Minor Arcana Weave Option", "Adds Minor Arcana", AST.JobID, 9, "", "")] - AST_DPS_AutoCrownDraw = 1012, - [ParentCombo(AST_ST_DPS)] [CustomComboInfo("Lord of Crowns Weave Option", "Adds Lord Of Crowns", AST.JobID, 10, "", "")] AST_DPS_LazyLord = 1014, @@ -228,7 +216,7 @@ public enum CustomComboPreset #region Healing [ReplaceSkill(AST.Benefic2)] - [CustomComboInfo("Simple Heals (Single Target)", "", AST.JobID, 2)] + [CustomComboInfo("Simple Heals (Single Target)", "Replaces Benefic 2 with a one button healing replacement.", AST.JobID, 2)] AST_ST_SimpleHeals = 1023, [ParentCombo(AST_ST_SimpleHeals)] @@ -248,11 +236,19 @@ public enum CustomComboPreset AST_ST_SimpleHeals_Esuna = 1039, [ParentCombo(AST_ST_SimpleHeals)] - [CustomComboInfo("Exaltation Feature", "Adds Exaltation.", AST.JobID)] + [CustomComboInfo("Exaltation Option", "Adds Exaltation.", AST.JobID)] AST_ST_SimpleHeals_Exaltation = 1028, + [ParentCombo(AST_ST_SimpleHeals)] + [CustomComboInfo("The Spire Option", "Adds The Spire 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)] + AST_ST_SimpleHeals_Ewer = 1032, + [ReplaceSkill(AST.AspectedHelios)] - [CustomComboInfo("Aspected Helios Feature", "Replaces Aspected Helios whenever you are under Aspected Helios regen with Helios", AST.JobID, 3, "", "")] + [CustomComboInfo("Simple Heals (AoE)", "Replaces Aspected Helios with a one button healing replacement.", AST.JobID, 3, "", "")] AST_AoE_SimpleHeals_AspectedHelios = 1010, [ParentCombo(AST_AoE_SimpleHeals_AspectedHelios)] @@ -270,6 +266,7 @@ public enum CustomComboPreset [ReplaceSkill(AST.Benefic2)] [CustomComboInfo("Benefic 2 Downgrade", "Changes Benefic 2 to Benefic when Benefic 2 is not unlocked or available.", AST.JobID, 4, "", "")] AST_Benefic = 1002, + #endregion #region Utility @@ -291,25 +288,7 @@ public enum CustomComboPreset #endregion #region Cards - [ReplaceSkill(AST.Play)] - [CustomComboInfo("Draw on Play", "Play turns into Draw when no card is drawn, as well as the usual Play behavior.", AST.JobID, 6, "", "")] - AST_Cards_DrawOnPlay = 1000, - - [ParentCombo(AST_Cards_DrawOnPlay)] - [CustomComboInfo("Redraw Feature", "Sets Play to Redraw if you pull a card with a seal you already have and you can use Redraw.", AST.JobID)] - AST_Cards_Redraw = 1032, - - [ReplaceSkill(AST.Draw)] - [CustomComboInfo("Redraw on Draw", "Sets Draw to Redraw if you have the Clarifying Draw buff.", AST.JobID)] - AST_Cards_RedrawStandalone = 1040, - - [ReplaceSkill(AST.Play)] - //Works With AST_Cards_DrawOnPlay as a feature, or by itself if AST_Cards_DrawOnPlay is disabled. - //Do not do ConflictingCombos with AST_Cards_DrawOnPlay - [CustomComboInfo("Astrodyne on Play", "Play becomes Astrodyne when you have 3 seals.", AST.JobID, 18, "", "")] - AST_Cards_AstrodyneOnPlay = 1015, - - [CustomComboInfo("Quick Target Cards", "Grabs a suitable target from the party list when you draw a card and targets them for you.", AST.JobID)] + [CustomComboInfo("Quick Target Damage Cards", "When you play the Balance or Spear, this will automatically apply the buff to a party member. It will look at DPS that suit the card first, if none found or they have buffs already, will look at the other DPS instead..", AST.JobID)] AST_Cards_QuickTargetCards = 1029, [ParentCombo(AST_Cards_QuickTargetCards)] diff --git a/XIVSlothCombo/Combos/JobHelpers/AST.cs b/XIVSlothCombo/Combos/JobHelpers/AST.cs index 16321ed9c..0399baeda 100644 --- a/XIVSlothCombo/Combos/JobHelpers/AST.cs +++ b/XIVSlothCombo/Combos/JobHelpers/AST.cs @@ -1,6 +1,7 @@ using Dalamud.Game.ClientState.JobGauge.Enums; using Dalamud.Game.ClientState.Objects.Types; using Dalamud.Plugin.Services; +using ECommons.DalamudServices; using System.Collections.Generic; using System.Linq; using XIVSlothCombo.CustomComboNS.Functions; @@ -50,6 +51,7 @@ public static void Invoke() if (SelectedRandomMember is null || SelectedRandomMember.IsDead) { SetTarget(); + Svc.Log.Debug($"Set card to {SelectedRandomMember.Name}"); } } else @@ -68,21 +70,16 @@ private static bool SetTarget() if (GetPartySlot(i) is not IBattleChara member) continue; if (member is null) continue; //Skip nulls/disconnected people if (member.IsDead) continue; - if (OutOfRange(Bole, member)) continue; + if (OutOfRange(Balance, member)) continue; - if (FindEffectOnMember(Buffs.BalanceDamage, member) is not null) continue; - if (FindEffectOnMember(Buffs.ArrowDamage, member) is not null) continue; - if (FindEffectOnMember(Buffs.BoleDamage, member) is not null) continue; - if (FindEffectOnMember(Buffs.EwerDamage, member) is not null) continue; - if (FindEffectOnMember(Buffs.SpireDamage, member) is not null) continue; - if (FindEffectOnMember(Buffs.SpearDamage, member) is not null) continue; + if (FindEffectOnMember(Buffs.BalanceBuff, member) is not null) continue; + if (FindEffectOnMember(Buffs.SpearBuff, member) is not null) continue; if (Config.AST_QuickTarget_SkipDamageDown && TargetHasDamageDown(member)) continue; if (Config.AST_QuickTarget_SkipRezWeakness && TargetHasRezWeakness(member)) continue; PartyTargets.Add(member); } - //The inevitable "0 targets found" because of debuffs if (PartyTargets.Count == 0) { @@ -91,14 +88,10 @@ private static bool SetTarget() if (GetPartySlot(i) is not IBattleChara member) continue; if (member is null) continue; //Skip nulls/disconnected people if (member.IsDead) continue; - if (OutOfRange(Bole, member)) continue; + if (OutOfRange(Balance, member)) continue; - if (FindEffectOnMember(Buffs.BalanceDamage, member) is not null) continue; - if (FindEffectOnMember(Buffs.ArrowDamage, member) is not null) continue; - if (FindEffectOnMember(Buffs.BoleDamage, member) is not null) continue; - if (FindEffectOnMember(Buffs.EwerDamage, member) is not null) continue; - if (FindEffectOnMember(Buffs.SpireDamage, member) is not null) continue; - if (FindEffectOnMember(Buffs.SpearDamage, member) is not null) continue; + if (FindEffectOnMember(Buffs.BalanceBuff, member) is not null) continue; + if (FindEffectOnMember(Buffs.SpearBuff, member) is not null) continue; PartyTargets.Add(member); } @@ -121,22 +114,35 @@ private static bool SetTarget() for (int i = 0; i <= PartyTargets.Count - 1; i++) { byte job = PartyTargets[i] is IBattleChara ? (byte)(PartyTargets[i] as IBattleChara).ClassJob.Id : (byte)0; - if (((cardDrawn is CardType.BALANCE or CardType.ARROW or CardType.SPEAR) && JobIDs.Melee.Contains(job)) || - ((cardDrawn is CardType.BOLE or CardType.EWER or CardType.SPIRE) && JobIDs.Ranged.Contains(job))) + if (((cardDrawn is CardType.BALANCE) && JobIDs.Melee.Contains(job)) || + ((cardDrawn is CardType.SPEAR) && JobIDs.Ranged.Contains(job))) { //TargetObject(PartyTargets[i]); SelectedRandomMember = PartyTargets[i]; return true; } } + //Give card to unsuitable DPS next + for (int i = 0; i <= PartyTargets.Count - 1; i++) + { + byte job = PartyTargets[i] is IBattleChara ? (byte)(PartyTargets[i] as IBattleChara).ClassJob.Id : (byte)0; + if (((cardDrawn is CardType.BALANCE) && JobIDs.Ranged.Contains(job)) || + ((cardDrawn is CardType.SPEAR) && JobIDs.Melee.Contains(job))) + { + //TargetObject(PartyTargets[i]); + SelectedRandomMember = PartyTargets[i]; + return true; + } + } + //Give cards to healers/tanks if backup is turned on if (IsEnabled(CustomComboPreset.AST_Cards_QuickTargetCards_TargetExtra)) { for (int i = 0; i <= PartyTargets.Count - 1; i++) { byte job = PartyTargets[i] is IBattleChara ? (byte)(PartyTargets[i] as IBattleChara).ClassJob.Id : (byte)0; - if ((cardDrawn is CardType.BALANCE or CardType.ARROW or CardType.SPEAR && JobIDs.Tank.Contains(job)) || - (cardDrawn is CardType.BOLE or CardType.EWER or CardType.SPIRE && JobIDs.Healer.Contains(job))) + if ((cardDrawn is CardType.BALANCE && JobIDs.Tank.Contains(job)) || + (cardDrawn is CardType.SPEAR && JobIDs.Healer.Contains(job))) { //TargetObject(PartyTargets[i]); SelectedRandomMember = PartyTargets[i]; diff --git a/XIVSlothCombo/Combos/PvE/AST.cs b/XIVSlothCombo/Combos/PvE/AST.cs index 006e3cd28..ee23b9d39 100644 --- a/XIVSlothCombo/Combos/PvE/AST.cs +++ b/XIVSlothCombo/Combos/PvE/AST.cs @@ -2,7 +2,6 @@ using Dalamud.Game.ClientState.JobGauge.Types; using Dalamud.Game.ClientState.Objects.Types; using Dalamud.Game.ClientState.Statuses; -using System; using System.Collections.Generic; using System.Linq; using XIVSlothCombo.Combos.PvE.Content; @@ -28,20 +27,19 @@ internal const uint Gravity2 = 25872, //Cards - Draw = 3590, - Play = 17055, - Redraw = 3593, - //Obsolete? Left just incase it's needed - Balance = 4401, - Bole = 4404, - Arrow = 4402, - Spear = 4403, - Ewer = 4405, - Spire = 4406, - MinorArcana = 7443, + AstralDraw = 37017, + Play1 = 37019, + Play2 = 37020, + Play3 = 37021, + Arrow = 37024, + Balance = 37023, + Bole = 37027, + Ewer = 37028, + Spear = 37026, + Spire = 37025, + MinorArcana = 37022, //LordOfCrowns = 7444, //LadyOfCrown = 7445, - Astrodyne = 25870, //Utility Divination = 16552, @@ -94,12 +92,12 @@ internal const ushort EwerDrawn = 917, SpireDrawn = 918, //The actual buff that buffs players - BalanceDamage = 1882, - BoleDamage = 1883, - ArrowDamage = 1884, - SpearDamage = 1885, - EwerDamage = 1886, - SpireDamage = 1887, + BalanceBuff = 3887, + BoleBuff = 3890, + ArrowBuff = 3888, + SpearBuff = 3889, + EwerBuff = 3891, + SpireBuff = 3892, Lightspeed = 841, SelfSynastry = 845, TargetSynastry = 846; @@ -128,9 +126,11 @@ internal static Dictionary public static class Config { public static UserInt - AST_LucidDreaming = new("ASTLucidDreamingFeature"), - AST_EssentialDignity = new("ASTCustomEssentialDignity"), - AST_ST_SimpleHeals_Esuna = new("AST_ST_SimpleHeals_Esuna"), + AST_LucidDreaming = new("ASTLucidDreamingFeature", 8000), + AST_EssentialDignity = new("ASTCustomEssentialDignity", 50), + AST_Spire = new("AST_Spire", 80), + AST_Ewer = new("AST_Ewer", 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"), AST_DPS_LightSpeedOption = new("AST_DPS_LightSpeedOption"), @@ -142,35 +142,14 @@ 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_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"), 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_Cards_DrawOnPlay : CustomCombo - { - - protected internal override CustomComboPreset Preset { get; } = CustomComboPreset.AST_Cards_DrawOnPlay; - - protected override uint Invoke(uint actionID, uint lastComboMove, float comboTime, byte level) - { - if (actionID is Play) - { - var haveCard = HasEffect(Buffs.BalanceDrawn) || HasEffect(Buffs.BoleDrawn) || HasEffect(Buffs.ArrowDrawn) || HasEffect(Buffs.SpearDrawn) || HasEffect(Buffs.EwerDrawn) || HasEffect(Buffs.SpireDrawn); - var cardDrawn = Gauge.DrawnCards[0]; - - - if (haveCard) - { - return OriginalHook(Play); - } - - return OriginalHook(Draw); - } - - return actionID; - } - } internal class AST_Benefic : CustomCombo { @@ -194,16 +173,15 @@ internal class AST_ST_DPS : CustomCombo protected override uint Invoke(uint actionID, uint lastComboMove, float comboTime, byte level) { - int spellsSinceDraw = ActionWatching.CombatActions.Any(x => x == Draw) ? ActionWatching.HowManyTimesUsedAfterAnotherAction(OriginalHook(Malefic), Draw) + - ActionWatching.HowManyTimesUsedAfterAnotherAction(OriginalHook(Combust), Draw) + - ActionWatching.HowManyTimesUsedAfterAnotherAction(OriginalHook(Gravity), Draw) : Config.AST_ST_DPS_Play_SpeedSetting; + 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; } - //Dalamud.Logging.PluginLog.Debug($"{spellsSinceDraw}"); bool AlternateMode = GetIntOptionAsBool(Config.AST_DPS_AltMode); //(0 or 1 radio values) if (((!AlternateMode && MaleficList.Contains(actionID)) || (AlternateMode && CombustList.ContainsKey(actionID)) || @@ -240,19 +218,18 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim //Play Card if (IsEnabled(CustomComboPreset.AST_DPS_AutoPlay) && - ActionReady(Play) && + ActionReady(Play1) && Gauge.DrawnCards[0] is not CardType.NONE && CanSpellWeave(actionID) && - spellsSinceDraw >= Config.AST_ST_DPS_Play_SpeedSetting && - !WasLastAction(Redraw)) - return OriginalHook(Play); + spellsSinceDraw >= Config.AST_ST_DPS_Play_SpeedSetting) + return OriginalHook(Play1); //Card Draw if (IsEnabled(CustomComboPreset.AST_DPS_AutoDraw) && - ActionReady(Draw) && - Gauge.DrawnCards[0] is CardType.NONE && + ActionReady(OriginalHook(AstralDraw)) && + Gauge.DrawnCards.All(x => x is CardType.NONE) && CanDelayedWeave(actionID)) - return Draw; + return OriginalHook(AstralDraw); //Divination if (IsEnabled(CustomComboPreset.AST_DPS_Divination) && @@ -265,8 +242,8 @@ Gauge.DrawnCards[0] is CardType.NONE && //Minor Arcana / Lord of Crowns if (ActionReady(OriginalHook(MinorArcana)) && - ((IsEnabled(CustomComboPreset.AST_DPS_AutoCrownDraw) && Gauge.DrawnCrownCard is CardType.NONE) || - (IsEnabled(CustomComboPreset.AST_DPS_LazyLord) && Gauge.DrawnCrownCard is CardType.LORD && HasBattleTarget())) && + IsEnabled(CustomComboPreset.AST_DPS_LazyLord) && Gauge.DrawnCrownCard is CardType.LORD && + HasBattleTarget() && CanDelayedWeave(actionID)) return OriginalHook(MinorArcana); @@ -310,6 +287,10 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim { if (actionID is AspectedHelios) { + var canLady = (Config.AST_AoE_SimpleHeals_WeaveLady && CanSpellWeave(actionID)) || !Config.AST_AoE_SimpleHeals_WeaveLady; + var canHoroscope = (Config.AST_AoE_SimpleHeals_Horoscope && CanSpellWeave(actionID)) || !Config.AST_AoE_SimpleHeals_Horoscope; + var canOppose = (Config.AST_AoE_SimpleHeals_Opposition && CanSpellWeave(actionID)) || !Config.AST_AoE_SimpleHeals_Opposition; + //Level check to exit if we can't use if (!LevelChecked(AspectedHelios)) return Helios; @@ -318,18 +299,18 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim ActionReady(MinorArcana) && InCombat() && Gauge.DrawnCrownCard is CardType.LADY - && CanSpellWeave(actionID)) + && canLady) return OriginalHook(MinorArcana); if (IsEnabled(CustomComboPreset.AST_AoE_SimpleHeals_CelestialOpposition) && ActionReady(CelestialOpposition) && - CanWeave(actionID)) + canOppose) return CelestialOpposition; if (IsEnabled(CustomComboPreset.AST_AoE_SimpleHeals_Horoscope)) { if (ActionReady(Horoscope) && - CanSpellWeave(actionID)) + canHoroscope) return Horoscope; if ((ActionReady(AspectedHelios) && !HasEffect(Buffs.AspectedHelios)) @@ -338,7 +319,7 @@ Gauge.DrawnCrownCard is CardType.LADY return AspectedHelios; if (HasEffect(Buffs.HoroscopeHelios) && - CanSpellWeave(actionID)) + canHoroscope) return OriginalHook(Horoscope); } @@ -351,19 +332,6 @@ Gauge.DrawnCrownCard is CardType.LADY } - internal class AST_Cards_RedrawStandalone : CustomCombo - { - protected internal override CustomComboPreset Preset { get; } = CustomComboPreset.AST_Cards_RedrawStandalone; - - protected override uint Invoke(uint actionID, uint lastComboActionID, float comboTime, byte level) - { - if (actionID is Draw && HasEffect(Buffs.ClarifyingDraw)) - return Redraw; - - return actionID; - } - } - internal class AST_ST_SimpleHeals : CustomCombo { protected internal override CustomComboPreset Preset { get; } = CustomComboPreset.AST_ST_SimpleHeals; @@ -389,6 +357,17 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return AspectedBenefic; } + 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) && + Gauge.DrawnCards[2] == CardType.EWER && + GetTargetHPPercent(healTarget) <= Config.AST_Ewer && + CanSpellWeave(actionID))) + return OriginalHook(Play3); + if (IsEnabled(CustomComboPreset.AST_ST_SimpleHeals_EssentialDignity) && ActionReady(EssentialDignity) && GetTargetHPPercent(healTarget) <= Config.AST_EssentialDignity && diff --git a/XIVSlothCombo/CustomCombo/Functions/Target.cs b/XIVSlothCombo/CustomCombo/Functions/Target.cs index 3f6f18f28..7c578fb09 100644 --- a/XIVSlothCombo/CustomCombo/Functions/Target.cs +++ b/XIVSlothCombo/CustomCombo/Functions/Target.cs @@ -378,7 +378,7 @@ static internal float AngleXZ(Vector3 a, Vector3 b) } } - internal unsafe static bool OutOfRange(uint actionID, IGameObject target) => ActionWatching.OutOfRange(actionID, (StructsObject.GameObject*)Service.ClientState.LocalPlayer.Address, (StructsObject.GameObject*)target.Address); + internal unsafe static bool OutOfRange(uint actionID, IGameObject target) => ActionWatching.OutOfRange(actionID, Service.ClientState.LocalPlayer!, target); } } diff --git a/XIVSlothCombo/Data/ActionWatching.cs b/XIVSlothCombo/Data/ActionWatching.cs index 1aedc8af1..3a02f8fcb 100644 --- a/XIVSlothCombo/Data/ActionWatching.cs +++ b/XIVSlothCombo/Data/ActionWatching.cs @@ -1,6 +1,8 @@ using Dalamud.Game.ClientState.Conditions; +using Dalamud.Game.ClientState.Objects.Types; using Dalamud.Hooking; using ECommons.DalamudServices; +using ECommons.GameFunctions; using FFXIVClientStructs.FFXIV.Client.Game; using FFXIVClientStructs.FFXIV.Client.Game.Object; using Lumina.Excel.GeneratedSheets; @@ -10,6 +12,7 @@ using System.Runtime.InteropServices; using XIVSlothCombo.Combos.PvE; using XIVSlothCombo.CustomComboNS.Functions; +using XIVSlothCombo.Extensions; using XIVSlothCombo.Services; namespace XIVSlothCombo.Data @@ -102,15 +105,17 @@ private unsafe static void SendActionDetour(ulong targetObjectId, byte actionTyp private unsafe static void CheckForChangedTarget(uint actionId, ref ulong targetObjectId) { - if (actionId is AST.Balance or AST.Bole or AST.Ewer or AST.Arrow or AST.Spire or AST.Spear && + Svc.Log.Debug($"{actionId.ActionName()}"); + if (actionId is AST.Balance or AST.Spear && Combos.JobHelpers.AST.AST_QuickTargetCards.SelectedRandomMember is not null && - !OutOfRange(actionId, (GameObject*)Service.ClientState.LocalPlayer.Address, (GameObject*)Combos.JobHelpers.AST.AST_QuickTargetCards.SelectedRandomMember.Address)) + !OutOfRange(actionId, Service.ClientState.LocalPlayer!, Combos.JobHelpers.AST.AST_QuickTargetCards.SelectedRandomMember)) { int targetOptions = AST.Config.AST_QuickTarget_Override; switch (targetOptions) { case 0: + Svc.Log.Debug($"Switched to {Combos.JobHelpers.AST.AST_QuickTargetCards.SelectedRandomMember.Name}"); targetObjectId = Combos.JobHelpers.AST.AST_QuickTargetCards.SelectedRandomMember.GameObjectId; break; case 1: @@ -129,9 +134,9 @@ Combos.JobHelpers.AST.AST_QuickTargetCards.SelectedRandomMember is not null && } } - public static unsafe bool OutOfRange(uint actionId, GameObject* source, GameObject* target) + public static unsafe bool OutOfRange(uint actionId, IGameObject source, IGameObject target) { - return ActionManager.GetActionInRangeOrLoS(actionId, source, target) is 566; + return ActionManager.GetActionInRangeOrLoS(actionId, source.Struct(), target.Struct()) is 566; } public static uint WhichOfTheseActionsWasLast(params uint[] actions) diff --git a/XIVSlothCombo/Window/Functions/UserConfig.cs b/XIVSlothCombo/Window/Functions/UserConfig.cs index 0b5b4aa41..a78394f40 100644 --- a/XIVSlothCombo/Window/Functions/UserConfig.cs +++ b/XIVSlothCombo/Window/Functions/UserConfig.cs @@ -1244,9 +1244,25 @@ 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"); + if (preset is CustomComboPreset.AST_ST_SimpleHeals_Spire) + UserConfig.DrawSliderInt(0, 100, AST.Config.AST_Spire, "Set percentage value"); + + if (preset is CustomComboPreset.AST_ST_SimpleHeals_Ewer) + UserConfig.DrawSliderInt(0, 100, AST.Config.AST_Ewer, "Set percentage value"); + 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."); + + if (preset is CustomComboPreset.AST_AoE_SimpleHeals_Horoscope) + UserConfig.DrawAdditionalBoolChoice(AST.Config.AST_AoE_SimpleHeals_Horoscope, "Only Weave", "Will only weave this action."); + + if (preset is CustomComboPreset.AST_AoE_SimpleHeals_CelestialOpposition) + UserConfig.DrawAdditionalBoolChoice(AST.Config.AST_AoE_SimpleHeals_Opposition, "Only Weave", "Will only weave this action."); + if (preset is CustomComboPreset.AST_Cards_QuickTargetCards) { UserConfig.DrawRadioButton(AST.Config.AST_QuickTarget_Override, "No Override", "", 0); diff --git a/XIVSlothCombo/Window/Icons.cs b/XIVSlothCombo/Window/Icons.cs index 1ce90b212..f7c20eb34 100644 --- a/XIVSlothCombo/Window/Icons.cs +++ b/XIVSlothCombo/Window/Icons.cs @@ -9,7 +9,10 @@ internal static class Icons public static IDalamudTextureWrap? GetJobIcon(uint jobId) { if (jobId == 0 || jobId > 42) return null; - return Svc.Texture.GetFromGameIcon(new Dalamud.Interface.Textures.GameIconLookup(62100 + jobId)).GetWrapOrEmpty(); + var icon = Svc.Texture.GetFromGameIcon(62100 + jobId); + if (!icon.TryGetWrap(out var wrap, out _)) + return null; + return wrap; } } } diff --git a/XIVSlothCombo/Window/Tabs/Debug.cs b/XIVSlothCombo/Window/Tabs/Debug.cs index 4b655ce52..06a48d56b 100644 --- a/XIVSlothCombo/Window/Tabs/Debug.cs +++ b/XIVSlothCombo/Window/Tabs/Debug.cs @@ -1,4 +1,5 @@ -using Dalamud.Game.ClientState.Objects.SubKinds; +using Dalamud.Game.ClientState.JobGauge.Types; +using Dalamud.Game.ClientState.Objects.SubKinds; using Dalamud.Game.ClientState.Objects.Types; using ECommons.DalamudServices; using ImGuiNET; @@ -66,17 +67,21 @@ internal class DebugCombo : CustomCombo ImGui.TextUnformatted($"SELECTED BLU SPELLS:\n{string.Join("\n", Service.Configuration.ActiveBLUSpells.Select(x => ActionWatching.GetActionName(x)).OrderBy(x => x))}"); ImGui.EndChild(); - var pctGauge = new TmpPCTGauge(); - ImGui.InputInt("DebugNum", ref debugNum); - ImGui.Text($"{pctGauge.GetOffset(debugNum)}"); - ImGui.Text($"Pallete: {pctGauge.PalleteGauge}"); - ImGui.Text($"Paint: {pctGauge.Paint}"); - ImGui.Text($"Creature: {pctGauge.CreatureMotifDrawn}"); - ImGui.Text($"Weapon: {pctGauge.WeaponMotifDrawn}"); - ImGui.Text($"Landscape: {pctGauge.LandscapeMotifDrawn}"); - ImGui.Text($"Moogle Potrait: {pctGauge.MooglePortraitReady}"); + var gauge = CustomComboFunctions.GetJobGauge(); + ImGui.Text($"{gauge.DrawnCards[0]}"); + ImGui.Text($"{gauge.DrawnCards[1]}"); + ImGui.Text($"{gauge.DrawnCards[2]}"); + ImGui.Text($"{gauge.ActiveDraw}"); + ImGui.Text($"{gauge.DrawnCrownCard}"); - ImGui.Text($"{CustomComboFunctions.GetCooldown(CustomComboFunctions.OriginalHook(PCT.FireInRed)).CooldownRemaining}"); + ImGui.Text($"{CustomComboFunctions.GetPartySlot(1).Name}"); + ImGui.Text($"{CustomComboFunctions.GetPartySlot(2).Name}"); + ImGui.Text($"{CustomComboFunctions.GetPartySlot(3).Name}"); + ImGui.Text($"{CustomComboFunctions.GetPartySlot(4).Name}"); + ImGui.Text($"{CustomComboFunctions.GetPartySlot(5).Name}"); + ImGui.Text($"{CustomComboFunctions.GetPartySlot(6).Name}"); + ImGui.Text($"{CustomComboFunctions.GetPartySlot(7).Name}"); + ImGui.Text($"{CustomComboFunctions.GetPartySlot(8).Name}"); } else diff --git a/XIVSlothCombo/Window/Tabs/PvEFeatures.cs b/XIVSlothCombo/Window/Tabs/PvEFeatures.cs index 4ce891c27..19c6e76d5 100644 --- a/XIVSlothCombo/Window/Tabs/PvEFeatures.cs +++ b/XIVSlothCombo/Window/Tabs/PvEFeatures.cs @@ -51,14 +51,14 @@ internal class PvEFeatures : ConfigWindow IDalamudTextureWrap? icon = Icons.GetJobIcon(id); using (var disabled = ImRaii.Disabled(DisabledJobsPVE.Any(x => x == id))) { - if (ImGui.Selectable($"###{header}", OpenJob == jobName, ImGuiSelectableFlags.None, icon == null ? new Vector2(0) : new Vector2(0, (icon.Size.Y / 2f) * ImGui.GetIO().FontGlobalScale))) + if (ImGui.Selectable($"###{header}", OpenJob == jobName, ImGuiSelectableFlags.None, icon == null ? new Vector2(0) : new Vector2(0, (icon.Size.Y / 2f).Scale()))) { OpenJob = jobName; } ImGui.SameLine(indentwidth); if (icon != null) { - ImGui.Image(icon.ImGuiHandle, (icon.Size / 2f) * ImGui.GetIO().FontGlobalScale); + ImGui.Image(icon.ImGuiHandle, new Vector2(icon.Size.X.Scale(), icon.Size.Y.Scale()) / 2f); ImGui.SameLine(indentwidth2); } ImGui.Text($"{header} {(disabled ? "(Disabled due to update)" : "")}"); @@ -70,9 +70,9 @@ internal class PvEFeatures : ConfigWindow var id = groupedPresets[OpenJob].First().Info.JobID; IDalamudTextureWrap? icon = Icons.GetJobIcon(id); - using (var headingTab = ImRaii.Child("HeadingTab", new Vector2(ImGui.GetContentRegionAvail().X, icon is null ? 24f.Scale() : (icon.Size.Y / 2f.Scale()) + 4f))) + using (var headingTab = ImRaii.Child("HeadingTab", new Vector2(ImGui.GetContentRegionAvail().X, icon is null ? 24f.Scale() : (icon.Size.Y / 2f).Scale() + 4f))) { - if (ImGui.Button("Back")) + if (ImGui.Button("Back", new Vector2(0, 24f.Scale()))) { OpenJob = ""; return; @@ -82,7 +82,7 @@ internal class PvEFeatures : ConfigWindow { if (icon != null) { - ImGui.Image(icon.ImGuiHandle, (icon.Size / 2f.Scale())); + ImGui.Image(icon.ImGuiHandle, new Vector2(icon.Size.X.Scale(), icon.Size.Y.Scale()) / 2f); ImGui.SameLine(); } ImGuiEx.Text($"{OpenJob}"); diff --git a/XIVSlothCombo/Window/Tabs/PvPFeatures.cs b/XIVSlothCombo/Window/Tabs/PvPFeatures.cs index 4ac471dc0..cca1d0da7 100644 --- a/XIVSlothCombo/Window/Tabs/PvPFeatures.cs +++ b/XIVSlothCombo/Window/Tabs/PvPFeatures.cs @@ -55,14 +55,14 @@ internal class PvPFeatures : ConfigWindow IDalamudTextureWrap? icon = Icons.GetJobIcon(id); using (var disabled = ImRaii.Disabled(DisabledJobsPVP.Any(x => x == id))) { - if (ImGui.Selectable($"###{header}", OpenJob == jobName, ImGuiSelectableFlags.None, icon == null ? new Vector2(0) : new Vector2(0, (icon.Size.Y / 2f) * ImGui.GetIO().FontGlobalScale))) + if (ImGui.Selectable($"###{header}", OpenJob == jobName, ImGuiSelectableFlags.None, icon == null ? new Vector2(0) : new Vector2(0, (icon.Size.Y / 2f).Scale()))) { OpenJob = jobName; } ImGui.SameLine(indentwidth); if (icon != null) { - ImGui.Image(icon.ImGuiHandle, (icon.Size / 2f) * ImGui.GetIO().FontGlobalScale); + ImGui.Image(icon.ImGuiHandle, new Vector2(icon.Size.X.Scale(), icon.Size.Y.Scale()) / 2f); ImGui.SameLine(indentwidth2); } ImGui.Text($"{header} {(disabled ? "(Disabled due to update)" : "")}"); @@ -76,19 +76,21 @@ internal class PvPFeatures : ConfigWindow using (var headingTab = ImRaii.Child("PvPHeadingTab", new Vector2(ImGui.GetContentRegionAvail().X, icon is null ? 24f.Scale() : (icon.Size.Y / 2f.Scale()) + 4f))) { - if (ImGui.Button("Back")) + if (ImGui.Button("Back", new Vector2(0, 24f.Scale()))) { OpenJob = ""; return; } - - ImGui.SameLine(ImGui.GetContentRegionAvail().X / 2); - if (icon != null) + ImGui.SameLine(); + ImGuiEx.LineCentered(() => { - ImGui.Image(icon.ImGuiHandle, (icon.Size / 2f.Scale())); - ImGui.SameLine((ImGui.GetContentRegionAvail().X / 2) + 42f.Scale()); - } - ImGuiEx.Text($"{OpenJob}"); + if (icon != null) + { + ImGui.Image(icon.ImGuiHandle, new Vector2(icon.Size.X.Scale(), icon.Size.Y.Scale()) / 2f); + ImGui.SameLine(); + } + ImGuiEx.Text($"{OpenJob}"); + }); } diff --git a/XIVSlothCombo/XIVSlothCombo.cs b/XIVSlothCombo/XIVSlothCombo.cs index 0771ca298..b38145de4 100644 --- a/XIVSlothCombo/XIVSlothCombo.cs +++ b/XIVSlothCombo/XIVSlothCombo.cs @@ -24,6 +24,9 @@ using Dalamud.Utility; using XIVSlothCombo.Attributes; using Dalamud.Interface.Windowing; +using Dalamud.Game.Addon.Lifecycle; +using ECommons.DalamudServices; +using Dalamud.Game.Addon.Lifecycle.AddonArgTypes; namespace XIVSlothCombo { @@ -43,13 +46,13 @@ public sealed partial class XIVSlothCombo : IDalamudPlugin public static readonly List DisabledJobsPVE = new List() { - ADV.JobID, - AST.JobID, + //ADV.JobID, + //AST.JobID, BLM.JobID, //BLU.JobID, BRD.JobID, DNC.JobID, - DOL.JobID, + //DOL.JobID, DRG.JobID, DRK.JobID, //GNB.JobID, @@ -153,10 +156,16 @@ public XIVSlothCombo(IDalamudPluginInterface pluginInterface) #if DEBUG PvEFeatures.HasToOpenJob = false; + PvEFeatures.OpenJob = "Astrologian"; ConfigWindow.IsOpen = true; #endif } + private void AddonReceiveEvent(AddonEvent type, AddonArgs args) + { + Svc.Log.Debug($"Receive event triggered on {args.AddonName}"); + } + private static void HandleConflictedCombos() { var enabledCopy = Service.Configuration.EnabledActions.ToHashSet(); //Prevents issues later removing during enumeration From 3dff465e815502486a51ff3ce9ca38f5e3058917 Mon Sep 17 00:00:00 2001 From: Kaeris Date: Thu, 11 Jul 2024 00:00:03 +0100 Subject: [PATCH 59/69] Simple Modes Overhaul - Streamlined simple modes - Goring Blade will still be used if FoF runs out - Goring Blade is called properly even if decoupled - Holy Spirit now prefers to wait until after burst actions, or when outside melee range and no better ranged actions are available - Shield Lob will now only be used if no better ranged actions are available - Fight or Flight now triggers properly before learning Rage of Halone - Atonement will be prioritized if its respective buffs are about to expire - Improvements carried over to AoE mode where appropriate - Holy Spirit removed from AoE mode because it's single target, and you're not using AoE mode to hit a single enemy, even if Holy Circle hasn't been learned yet - Significantly reduced the amount of conditional checks and streamlined remaining checks within similar blocks --- XIVSlothCombo/Combos/PvE/PLD.cs | 196 +++++++++++++++++--------------- 1 file changed, 104 insertions(+), 92 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/PLD.cs b/XIVSlothCombo/Combos/PvE/PLD.cs index 993fe07c3..ac640ff26 100644 --- a/XIVSlothCombo/Combos/PvE/PLD.cs +++ b/XIVSlothCombo/Combos/PvE/PLD.cs @@ -93,114 +93,133 @@ protected override uint Invoke(uint actionID, uint lastComboActionID, float comb { if (actionID is FastBlade) { + bool inAtonementPhase = HasEffect(Buffs.AtonementReady) || HasEffect(Buffs.SupplicationReady) || HasEffect(Buffs.SepulchreReady); + bool isAtonementExpiring = (HasEffect(Buffs.AtonementReady) && GetBuffRemainingTime(Buffs.AtonementReady) < 10) || + (HasEffect(Buffs.SupplicationReady) && GetBuffRemainingTime(Buffs.SupplicationReady) < 10) || + (HasEffect(Buffs.SepulchreReady) && GetBuffRemainingTime(Buffs.SepulchreReady) < 10); - if (IsEnabled(CustomComboPreset.PLD_Variant_Cure) && - IsEnabled(Variant.VariantCure) && + // Criterion Stuff + if (IsEnabled(CustomComboPreset.PLD_Variant_Cure) && IsEnabled(Variant.VariantCure) && PlayerHealthPercentageHp() <= Config.PLD_VariantCure) return Variant.VariantCure; if (HasBattleTarget()) { - if (!InMeleeRange() && HolySpirit.LevelChecked() && - GetResourceCost(HolySpirit) <= LocalPlayer.CurrentMp && (!IsMoving || HasEffect(Buffs.DivineMight))) - return HolySpirit; - - if (!InMeleeRange() && ShieldLob.LevelChecked()) - return ShieldLob; - + // Criterion Stuff if (CanWeave(actionID)) { Status? sustainedDamage = FindTargetEffect(Variant.Debuffs.SustainedDamage); - if (IsEnabled(CustomComboPreset.PLD_Variant_SpiritDart) && - IsEnabled(Variant.VariantSpiritDart) && + if (IsEnabled(CustomComboPreset.PLD_Variant_SpiritDart) && IsEnabled(Variant.VariantSpiritDart) && (sustainedDamage is null || sustainedDamage?.RemainingTime <= 3)) return Variant.VariantSpiritDart; - if (IsEnabled(CustomComboPreset.PLD_Variant_Ultimatum) && - IsEnabled(Variant.VariantUltimatum) && + if (IsEnabled(CustomComboPreset.PLD_Variant_Ultimatum) && IsEnabled(Variant.VariantUltimatum) && IsOffCooldown(Variant.VariantUltimatum)) return Variant.VariantUltimatum; } - // Requiescat inside burst (checking for FoF buff causes a late weave and can misalign over long fights with some ping) - if (CanWeave(actionID) && (WasLastAbility(FightOrFlight) || JustUsed(FightOrFlight, 6f)) && ActionReady(Requiescat)) - return OriginalHook(Requiescat); + if (InMeleeRange()) + { + // Requiescat Usage: After Fight or Flight + if (ActionReady(Requiescat) && CanWeave(actionID) && JustUsed(FightOrFlight, 8f)) + return OriginalHook(Requiescat); - // Actions under FoF burst + // Goring Blade Usage: No Requiescat / After Requiescat + if (HasEffect(Buffs.GoringBladeReady) && (!LevelChecked(Requiescat) || (IsOnCooldown(Requiescat) && + !HasEffect(Buffs.Requiescat) && OriginalHook(Requiescat) != BladeOfHonor))) + return GoringBlade; + } + + // Burst Phase if (HasEffect(Buffs.FightOrFlight)) { if (CanWeave(actionID)) { - if (ActionReady(CircleOfScorn)) - return CircleOfScorn; + // Melee oGCDs + if (InMeleeRange()) + { + if (ActionReady(CircleOfScorn)) + return CircleOfScorn; - if (ActionReady(OriginalHook(SpiritsWithin))) - return OriginalHook(SpiritsWithin); - } + if (ActionReady(SpiritsWithin)) + return OriginalHook(SpiritsWithin); + } - // New Goring Blade - if (HasEffect(Buffs.GoringBladeReady) && InMeleeRange() && (!BladeOfHonor.LevelChecked() || - (IsOnCooldown(Requiescat) && !HasEffect(Buffs.Requiescat) && OriginalHook(Requiescat) != BladeOfHonor))) - return OriginalHook(FightOrFlight); + // Blade of Honor + if (OriginalHook(Requiescat) == BladeOfHonor) + return OriginalHook(Requiescat); + } if (HasEffect(Buffs.Requiescat)) { // Confiteor & Blades - if ((HasEffect(Buffs.ConfiteorReady) && GetResourceCost(Confiteor) <= LocalPlayer.CurrentMp) || - (BladeOfFaith.LevelChecked() && GetResourceCost(BladeOfFaith) <= LocalPlayer.CurrentMp && OriginalHook(Confiteor) != Confiteor)) + if (GetResourceCost(Confiteor) <= LocalPlayer.CurrentMp && (HasEffect(Buffs.ConfiteorReady) || OriginalHook(Confiteor) != Confiteor)) return OriginalHook(Confiteor); + // Pre-Blades if (GetResourceCost(HolySpirit) <= LocalPlayer.CurrentMp) return HolySpirit; } - - // New Spell after Confi Combo (Weave) - if (CanWeave(actionID) && HasEffect(Buffs.BladeOfHonor)) - return OriginalHook(Requiescat); - - // HS under DM - if (HasEffect(Buffs.DivineMight) && - GetResourceCost(HolySpirit) <= LocalPlayer.CurrentMp) - return HolySpirit; } - if (CanWeave(actionID)) + if (CanWeave(actionID) && InMeleeRange()) { - // FoF (Starts burst) - if (ActionReady(FightOrFlight) && - ActionWatching.CombatActions.Where(x => x == OriginalHook(RoyalAuthority)).Any()) // Check RA has been used for opener exception - return FightOrFlight; + // Fight or Flight + if (ActionReady(FightOrFlight)) + { + if (!LevelChecked(Requiescat)) + { + if (!LevelChecked(RageOfHalone)) + { + // Levels 1-25 + if (lastComboActionID is FastBlade) + return FightOrFlight; + } + + // Levels 26-67 + else if (lastComboActionID is RiotBlade) + return FightOrFlight; + } + + // Levels 68+ + else if (IsOffCooldown(Requiescat) && lastComboActionID is RoyalAuthority) + return FightOrFlight; + } - // Usage outside of burst - if (!WasLastAction(FightOrFlight) && GetCooldownRemainingTime(FightOrFlight) >= 15) + // Melee oGCDs + if (GetCooldownRemainingTime(FightOrFlight) > 15) { if (ActionReady(CircleOfScorn)) return CircleOfScorn; - if (ActionReady(OriginalHook(SpiritsWithin))) + if (ActionReady(SpiritsWithin)) return OriginalHook(SpiritsWithin); } } - // Base combo + // Atonement Usage: During Burst / Before Expiring / Before Refreshing + if (inAtonementPhase && InMeleeRange() && (HasEffect(Buffs.FightOrFlight) || isAtonementExpiring || lastComboActionID is RiotBlade)) + return OriginalHook(Atonement); + + + // Holy Spirit Usage: During Burst / Outside Melee / Before Expiring / Before Refreshing + if (HasEffect(Buffs.DivineMight) && GetResourceCost(HolySpirit) <= LocalPlayer.CurrentMp && (HasEffect(Buffs.FightOrFlight) || + !InMeleeRange() || GetBuffRemainingTime(Buffs.DivineMight) < 10 || lastComboActionID is RiotBlade)) + return HolySpirit; + + // Shield Lob Outside Melee + if (LevelChecked(ShieldLob) && !InMeleeRange()) + return ShieldLob; + + // Basic Combo if (comboTime > 0) { - if (lastComboActionID is FastBlade && - RiotBlade.LevelChecked()) + if (lastComboActionID is FastBlade && LevelChecked(RiotBlade)) return RiotBlade; - if (lastComboActionID is RiotBlade && - RageOfHalone.LevelChecked()) - { - if (HasEffect(Buffs.AtonementReady) || HasEffect(Buffs.SepulchreReady) || HasEffect(Buffs.SupplicationReady)) - return OriginalHook(Atonement); - - return (HasEffect(Buffs.DivineMight) && - GetResourceCost(HolySpirit) <= LocalPlayer.CurrentMp) - ? HolySpirit - : OriginalHook(RageOfHalone); - } + if (lastComboActionID is RiotBlade && LevelChecked(RageOfHalone)) + return OriginalHook(RageOfHalone); } } } @@ -217,11 +236,12 @@ protected override uint Invoke(uint actionID, uint lastComboActionID, float comb { if (actionID is TotalEclipse) { - if (IsEnabled(CustomComboPreset.PLD_Variant_Cure) && - IsEnabled(Variant.VariantCure) && + // Criterion Stuff + if (IsEnabled(CustomComboPreset.PLD_Variant_Cure) && IsEnabled(Variant.VariantCure) && PlayerHealthPercentageHp() <= Config.PLD_VariantCure) return Variant.VariantCure; + // Criterion Stuff if (CanWeave(actionID)) { Status? sustainedDamage = FindTargetEffect(Variant.Debuffs.SustainedDamage); @@ -235,63 +255,55 @@ protected override uint Invoke(uint actionID, uint lastComboActionID, float comb return Variant.VariantUltimatum; } - // Requiescat inside burst (checking for FoF buff causes a late weave and can misalign over long fights with some ping) - if (CanWeave(actionID) && (WasLastAbility(FightOrFlight) || JustUsed(FightOrFlight, 6f)) && ActionReady(Requiescat)) + // Requiescat + if (ActionReady(Requiescat) && CanWeave(actionID) && JustUsed(FightOrFlight, 8f) && HasBattleTarget() && InMeleeRange()) return OriginalHook(Requiescat); - // Actions under FoF burst + // Burst Phase if (HasEffect(Buffs.FightOrFlight)) { + // oGCDs if (CanWeave(actionID)) { if (ActionReady(CircleOfScorn)) return CircleOfScorn; - if (ActionReady(OriginalHook(SpiritsWithin))) - return OriginalHook(SpiritsWithin); - } - - if (HasEffect(Buffs.Requiescat)) - { - // Confiteor & Blades - if ((HasEffect(Buffs.ConfiteorReady) && GetResourceCost(Confiteor) <= LocalPlayer.CurrentMp) || - (BladeOfFaith.LevelChecked() && GetResourceCost(BladeOfFaith) <= LocalPlayer.CurrentMp && OriginalHook(Confiteor) != Confiteor)) - return OriginalHook(Confiteor); - - if (HolyCircle.LevelChecked() && - GetResourceCost(HolyCircle) <= LocalPlayer.CurrentMp) - return HolyCircle; + if (HasBattleTarget()) + { + if (ActionReady(SpiritsWithin) && InMeleeRange()) + return OriginalHook(SpiritsWithin); - if (HolySpirit.LevelChecked() && - GetResourceCost(HolySpirit) <= LocalPlayer.CurrentMp) - return HolySpirit; + // Blade of Honor + if (OriginalHook(Requiescat) == BladeOfHonor) + return OriginalHook(Requiescat); + } } - if (HasEffect(Buffs.DivineMight) && - GetResourceCost(HolyCircle) <= LocalPlayer.CurrentMp && HolyCircle.LevelChecked()) - return HolyCircle; + // Confiteor & Blades + if (HasEffect(Buffs.Requiescat) && GetResourceCost(Confiteor) <= LocalPlayer.CurrentMp && + HasBattleTarget() && (HasEffect(Buffs.ConfiteorReady) || OriginalHook(Confiteor) != Confiteor)) + return OriginalHook(Confiteor); } if (CanWeave(actionID)) { - if (ActionReady(FightOrFlight)) - return FightOrFlight; - - if (!WasLastAction(FightOrFlight) && IsOnCooldown(FightOrFlight)) + // oGCDs + if (GetCooldownRemainingTime(FightOrFlight) > 15) { if (ActionReady(CircleOfScorn)) return CircleOfScorn; - if (ActionReady(OriginalHook(SpiritsWithin))) + if (ActionReady(SpiritsWithin) && InMeleeRange() && HasBattleTarget()) return OriginalHook(SpiritsWithin); } } - if ((HasEffect(Buffs.DivineMight) || HasEffect(Buffs.Requiescat)) && - GetResourceCost(HolyCircle) <= LocalPlayer.CurrentMp && LevelChecked(HolyCircle)) + // Holy Circle + if (LevelChecked(HolyCircle) && GetResourceCost(HolyCircle) <= LocalPlayer.CurrentMp && (HasEffect(Buffs.DivineMight) || HasEffect(Buffs.Requiescat))) return HolyCircle; - if (comboTime > 0 && lastComboActionID is TotalEclipse && Prominence.LevelChecked()) + // Basic Combo + if (comboTime > 0 && lastComboActionID is TotalEclipse && LevelChecked(Prominence)) return Prominence; return actionID; From 28078480e605e7a39cab0f3c37a8aa600045ac29 Mon Sep 17 00:00:00 2001 From: Kaeris Date: Thu, 11 Jul 2024 00:12:24 +0100 Subject: [PATCH 60/69] Further AoE Improvements - Fight or Flight now prefers to wait for Requiescat if learned - oGCDs will prefer to line up with Fight or Flight when possible --- XIVSlothCombo/Combos/PvE/PLD.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/XIVSlothCombo/Combos/PvE/PLD.cs b/XIVSlothCombo/Combos/PvE/PLD.cs index ac640ff26..b71ba16ac 100644 --- a/XIVSlothCombo/Combos/PvE/PLD.cs +++ b/XIVSlothCombo/Combos/PvE/PLD.cs @@ -287,6 +287,10 @@ protected override uint Invoke(uint actionID, uint lastComboActionID, float comb if (CanWeave(actionID)) { + // Fight or Flight + if (ActionReady(FightOrFlight) && (IsOffCooldown(Requiescat) || !LevelChecked(Requiescat))) + return FightOrFlight; + // oGCDs if (GetCooldownRemainingTime(FightOrFlight) > 15) { From c6955e62fac2f600bae71a0594c748c22608b3a1 Mon Sep 17 00:00:00 2001 From: Taurenkey Date: Thu, 11 Jul 2024 06:16:15 +0100 Subject: [PATCH 61/69] More fixes --- XIVSlothCombo/Combos/CustomComboPreset.cs | 4 +- XIVSlothCombo/Combos/PvE/AST.cs | 3 +- XIVSlothCombo/CustomCombo/Functions/Misc.cs | 2 + XIVSlothCombo/Window/Icons.cs | 42 ++++++++++++++++++--- 4 files changed, 43 insertions(+), 8 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index f45e9611a..b0f206729 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -216,7 +216,7 @@ public enum CustomComboPreset #region Healing [ReplaceSkill(AST.Benefic2)] - [CustomComboInfo("Simple Heals (Single Target)", "Replaces Benefic 2 with a one button healing replacement.", AST.JobID, 2)] + [CustomComboInfo("Simple Heals (Single Target)", "Replaces Benefic II with a one button healing replacement.", AST.JobID, 2)] AST_ST_SimpleHeals = 1023, [ParentCombo(AST_ST_SimpleHeals)] @@ -288,7 +288,7 @@ public enum CustomComboPreset #endregion #region Cards - [CustomComboInfo("Quick Target Damage Cards", "When you play the Balance or Spear, this will automatically apply the buff to a party member. It will look at DPS that suit the card first, if none found or they have buffs already, will look at the other DPS instead..", AST.JobID)] + [CustomComboInfo("Quick Target Damage Cards", "When you play the Balance or Spear, this will automatically apply the buff to a party member. It will look at DPS that suit the card first, if none found or they have buffs already, will look at the other DPS instead.", AST.JobID)] AST_Cards_QuickTargetCards = 1029, [ParentCombo(AST_Cards_QuickTargetCards)] diff --git a/XIVSlothCombo/Combos/PvE/AST.cs b/XIVSlothCombo/Combos/PvE/AST.cs index ee23b9d39..d84fccaf2 100644 --- a/XIVSlothCombo/Combos/PvE/AST.cs +++ b/XIVSlothCombo/Combos/PvE/AST.cs @@ -2,6 +2,7 @@ using Dalamud.Game.ClientState.JobGauge.Types; using Dalamud.Game.ClientState.Objects.Types; using Dalamud.Game.ClientState.Statuses; +using ECommons.DalamudServices; using System.Collections.Generic; using System.Linq; using XIVSlothCombo.Combos.PvE.Content; @@ -291,13 +292,13 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim var canHoroscope = (Config.AST_AoE_SimpleHeals_Horoscope && CanSpellWeave(actionID)) || !Config.AST_AoE_SimpleHeals_Horoscope; var canOppose = (Config.AST_AoE_SimpleHeals_Opposition && CanSpellWeave(actionID)) || !Config.AST_AoE_SimpleHeals_Opposition; + //Level check to exit if we can't use if (!LevelChecked(AspectedHelios)) return Helios; if (IsEnabled(CustomComboPreset.AST_AoE_SimpleHeals_LazyLady) && ActionReady(MinorArcana) && - InCombat() && Gauge.DrawnCrownCard is CardType.LADY && canLady) return OriginalHook(MinorArcana); diff --git a/XIVSlothCombo/CustomCombo/Functions/Misc.cs b/XIVSlothCombo/CustomCombo/Functions/Misc.cs index 7defad19e..cc78e5a2c 100644 --- a/XIVSlothCombo/CustomCombo/Functions/Misc.cs +++ b/XIVSlothCombo/CustomCombo/Functions/Misc.cs @@ -25,6 +25,7 @@ public class JobIDs DRG.JobID, DRG.ClassID, MNK.JobID, MNK.ClassID, NIN.JobID, NIN.ClassID, + VPR.JobID, RPR.JobID, SAM.JobID ]; @@ -34,6 +35,7 @@ public class JobIDs BLM.JobID, BLM.ClassID, BRD.JobID, BRD.ClassID, SMN.JobID, SMN.ClassID, + PCT.JobID, MCH.JobID, RDM.JobID, DNC.JobID, diff --git a/XIVSlothCombo/Window/Icons.cs b/XIVSlothCombo/Window/Icons.cs index f7c20eb34..f37fa589d 100644 --- a/XIVSlothCombo/Window/Icons.cs +++ b/XIVSlothCombo/Window/Icons.cs @@ -1,18 +1,50 @@ -using Dalamud.Interface.Internal; +using Dalamud.Interface.Textures; using Dalamud.Interface.Textures.TextureWraps; +using Dalamud.Utility; using ECommons.DalamudServices; +using Lumina.Data.Files; +using System.Collections.Generic; namespace XIVSlothCombo.Window { internal static class Icons { + public static Dictionary CachedModdedIcons = new(); public static IDalamudTextureWrap? GetJobIcon(uint jobId) { if (jobId == 0 || jobId > 42) return null; - var icon = Svc.Texture.GetFromGameIcon(62100 + jobId); - if (!icon.TryGetWrap(out var wrap, out _)) - return null; - return wrap; + var icon = GetTextureFromIconId(62100 + jobId); + + return icon; + } + + private static string ResolvePath(string path) => Svc.TextureSubstitution.GetSubstitutedPath(path); + + public static IDalamudTextureWrap? GetTextureFromIconId(uint iconId, uint stackCount = 0, bool hdIcon = true) + { + GameIconLookup lookup = new GameIconLookup(iconId + stackCount, false, hdIcon); + string path = Svc.Texture.GetIconPath(lookup); + string resolvePath = ResolvePath(path); + + var wrap = Svc.Texture.GetFromFile(resolvePath); + if (wrap.TryGetWrap(out var icon, out _)) + return icon; + + try + { + if (CachedModdedIcons.ContainsKey(iconId)) return CachedModdedIcons[iconId]; + var tex = Svc.Data.GameData.GetFileFromDisk(resolvePath); + var output = Svc.Texture.CreateFromRaw(RawImageSpecification.Rgba32(tex.Header.Width, tex.Header.Width), tex.GetRgbaImageData()); + if (output != null) + { + CachedModdedIcons[iconId] = output; + return output; + } + } + catch { } + + + return Svc.Texture.GetFromGame(path).GetWrapOrDefault(); } } } From 72a68ffe2ec7ae924de87d0ee41d1d9312c3e1b4 Mon Sep 17 00:00:00 2001 From: Taurenkey Date: Thu, 11 Jul 2024 07:11:52 +0100 Subject: [PATCH 62/69] Oracle --- XIVSlothCombo/Combos/CustomComboPreset.cs | 6 +++++- XIVSlothCombo/Combos/PvE/AST.cs | 9 ++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index b0f206729..35f41777e 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -186,7 +186,7 @@ public enum CustomComboPreset [ReplaceSkill(AST.Gravity, AST.Gravity2)] [ParentCombo(AST_ST_DPS)] - [CustomComboInfo("AoE DPS Option", "Every option below (Lucid/AutoDraws/Astrodyne/etc) will also be added to Gravity", AST.JobID, 1, "", "")] + [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)] @@ -212,6 +212,10 @@ public enum CustomComboPreset [ParentCombo(AST_ST_DPS)] [CustomComboInfo("Lord of Crowns Weave Option", "Adds Lord Of Crowns", AST.JobID, 10, "", "")] AST_DPS_LazyLord = 1014, + + [ParentCombo(AST_ST_DPS)] + [CustomComboInfo("Oracle Option", "Adds Oracle after Divination", AST.JobID)] + AST_DPS_Oracle = 1015, #endregion #region Healing diff --git a/XIVSlothCombo/Combos/PvE/AST.cs b/XIVSlothCombo/Combos/PvE/AST.cs index d84fccaf2..1b17b5d51 100644 --- a/XIVSlothCombo/Combos/PvE/AST.cs +++ b/XIVSlothCombo/Combos/PvE/AST.cs @@ -26,6 +26,7 @@ internal const uint FallMalefic = 25871, Gravity = 3615, Gravity2 = 25872, + Oracle = 37029, //Cards AstralDraw = 37017, @@ -101,7 +102,8 @@ internal const ushort SpireBuff = 3892, Lightspeed = 841, SelfSynastry = 845, - TargetSynastry = 846; + TargetSynastry = 846, + Divining = 3893; } internal static class Debuffs @@ -241,6 +243,11 @@ Gauge.DrawnCards[0] is not CardType.NONE && ActionWatching.NumberOfGcdsUsed >= 3) return Divination; + if (IsEnabled(CustomComboPreset.AST_DPS_Oracle) && + HasEffect(Buffs.Divining) && + CanSpellWeave(actionID)) + return Oracle; + //Minor Arcana / Lord of Crowns if (ActionReady(OriginalHook(MinorArcana)) && IsEnabled(CustomComboPreset.AST_DPS_LazyLord) && Gauge.DrawnCrownCard is CardType.LORD && From bb6d4d45815fee715353ef66da6ed757b93b0fa8 Mon Sep 17 00:00:00 2001 From: Taurenkey Date: Thu, 11 Jul 2024 07:22:52 +0100 Subject: [PATCH 63/69] Fix up debug thing --- XIVSlothCombo/XIVSlothCombo.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/XIVSlothCombo/XIVSlothCombo.cs b/XIVSlothCombo/XIVSlothCombo.cs index 4c45c74d4..54d54216e 100644 --- a/XIVSlothCombo/XIVSlothCombo.cs +++ b/XIVSlothCombo/XIVSlothCombo.cs @@ -155,8 +155,6 @@ public XIVSlothCombo(IDalamudPluginInterface pluginInterface) HandleConflictedCombos(); #if DEBUG - PvEFeatures.HasToOpenJob = false; - PvEFeatures.OpenJob = "Astrologian"; ConfigWindow.IsOpen = true; #endif } From 341415e8646d43b3fff03b1172071585b7ce4cb9 Mon Sep 17 00:00:00 2001 From: Taurenkey Date: Thu, 11 Jul 2024 08:03:37 +0100 Subject: [PATCH 64/69] Update hard coded CD check --- XIVSlothCombo/Combos/PvE/WAR.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/WAR.cs b/XIVSlothCombo/Combos/PvE/WAR.cs index c54bc8ad6..151e7aa95 100644 --- a/XIVSlothCombo/Combos/PvE/WAR.cs +++ b/XIVSlothCombo/Combos/PvE/WAR.cs @@ -123,8 +123,8 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return Onslaught; } } - - if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_PrimalRend) && HasEffect(Buffs.PrimalRendReady) && LevelChecked(PrimalRend) && GetCooldownRemainingTime(InnerRelease) < 57.5) + + if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_PrimalRend) && HasEffect(Buffs.PrimalRendReady) && LevelChecked(PrimalRend) && !JustUsed(InnerRelease, GetCooldown(actionID).CooldownTotal)) { if (IsEnabled(CustomComboPreset.WAR_ST_StormsPath_PrimalRend_CloseRange) && !IsMoving && (GetTargetDistance() <= 1 || GetBuffRemainingTime(Buffs.PrimalRendReady) <= 10)) return PrimalRend; From e737edace299780491271ad8f9d2b7f63ada3f5e Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Thu, 11 Jul 2024 08:51:19 -0600 Subject: [PATCH 65/69] Support Action Change disabling on Salted Earth --- XIVSlothCombo/Combos/PvE/DRK.cs | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/DRK.cs b/XIVSlothCombo/Combos/PvE/DRK.cs index 0f940c0b7..53d873226 100644 --- a/XIVSlothCombo/Combos/PvE/DRK.cs +++ b/XIVSlothCombo/Combos/PvE/DRK.cs @@ -191,15 +191,17 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsEnabled(CustomComboPreset.DRK_ST_CDs)) { // Salted Earth - if (IsEnabled(CustomComboPreset.DRK_ST_CDs_SaltedEarth) - && (ActionReady(SaltedEarth) || ActionReady(SaltAndDarkness))) + if (IsEnabled(CustomComboPreset.DRK_ST_CDs_SaltedEarth)) { + // Cast Salted Earth if (!HasEffect(Buffs.SaltedEarth) - && ActionReady(SaltedEarth) // Cast Salted Earth - || (HasEffect(Buffs.SaltedEarth) - && GetBuffRemainingTime(Buffs.SaltedEarth) < 9 - && ActionReady(SaltAndDarkness))) //Cast Salt and Darkness - return OriginalHook(SaltedEarth); + && ActionReady(SaltedEarth)) + return SaltedEarth; + //Cast Salt and Darkness + if (HasEffect(Buffs.SaltedEarth) + && GetBuffRemainingTime(Buffs.SaltedEarth) < 9 + && ActionReady(SaltAndDarkness)) + return OriginalHook(SaltAndDarkness); } // Shadowbringer @@ -338,15 +340,17 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (gauge.DarksideTimeRemaining > 1) { // Salted Earth - if (IsEnabled(CustomComboPreset.DRK_AoE_CDs_SaltedEarth) - && (ActionReady(SaltedEarth) || ActionReady(SaltAndDarkness))) + if (IsEnabled(CustomComboPreset.DRK_AoE_CDs_SaltedEarth)) { + // Cast Salted Earth if (!HasEffect(Buffs.SaltedEarth) - && ActionReady(SaltedEarth) // Cast Salted Earth - || (HasEffect(Buffs.SaltedEarth) - && GetBuffRemainingTime(Buffs.SaltedEarth) < 9 - && ActionReady(SaltAndDarkness))) //Cast Salt and Darkness - return OriginalHook(SaltedEarth); + && ActionReady(SaltedEarth)) + return SaltedEarth; + //Cast Salt and Darkness + if (HasEffect(Buffs.SaltedEarth) + && GetBuffRemainingTime(Buffs.SaltedEarth) < 9 + && ActionReady(SaltAndDarkness)) + return OriginalHook(SaltAndDarkness); } // Shadowbringer From 2cb0c338a0e87d39e952ff0818186c44bc9ef5af Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Thu, 11 Jul 2024 09:11:02 -0600 Subject: [PATCH 66/69] Support Blood Weapon casting at lower levels --- XIVSlothCombo/Combos/PvE/DRK.cs | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/DRK.cs b/XIVSlothCombo/Combos/PvE/DRK.cs index 53d873226..59b919654 100644 --- a/XIVSlothCombo/Combos/PvE/DRK.cs +++ b/XIVSlothCombo/Combos/PvE/DRK.cs @@ -43,6 +43,7 @@ public const uint Impalement = 36931, // Under Delirium // Buffing oGCDs + BloodWeapon = 3625, Delirium = 7390, // Burst Window @@ -184,9 +185,9 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim // Delirium if (IsEnabled(CustomComboPreset.DRK_ST_Delirium) - && IsOffCooldown(Delirium) - && LevelChecked(Delirium)) - return Delirium; + && IsOffCooldown(BloodWeapon) + && LevelChecked(BloodWeapon)) + return OriginalHook(Delirium); if (IsEnabled(CustomComboPreset.DRK_ST_CDs)) { @@ -333,9 +334,9 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim // Delirium if (IsEnabled(CustomComboPreset.DRK_AoE_Delirium) - && IsOffCooldown(Delirium) - && LevelChecked(Delirium)) - return Delirium; + && IsOffCooldown(BloodWeapon) + && LevelChecked(BloodWeapon)) + return OriginalHook(Delirium); if (gauge.DarksideTimeRemaining > 1) { From 58df150cb403b0bf6960dea0589c0cdcee39bc85 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Thu, 11 Jul 2024 09:12:21 -0600 Subject: [PATCH 67/69] Clarify what option controls lower level DRK Blood Weapon usage --- XIVSlothCombo/Combos/CustomComboPreset.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/XIVSlothCombo/Combos/CustomComboPreset.cs b/XIVSlothCombo/Combos/CustomComboPreset.cs index 3ea89a231..26fef0395 100644 --- a/XIVSlothCombo/Combos/CustomComboPreset.cs +++ b/XIVSlothCombo/Combos/CustomComboPreset.cs @@ -1014,7 +1014,7 @@ public enum CustomComboPreset #region Buff Options [ParentCombo(DRK_ST_Combo)] - [CustomComboInfo("Delirium on Cooldown", "Adds Delirium to main combo on cooldown and when Darkside is up. Will also spend 50 blood gauge if Delirium is nearly ready to protect from overcap.", DRK.JobID)] + [CustomComboInfo("Delirium on Cooldown", "Adds Delirium (or Blood Weapon at lower levels) to main combo on cooldown and when Darkside is up. Will also spend 50 blood gauge if Delirium is nearly ready to protect from overcap.", DRK.JobID)] DRK_ST_Delirium = 5002, [ParentCombo(DRK_ST_Delirium)] @@ -1105,7 +1105,7 @@ public enum CustomComboPreset #region Buff Options [ParentCombo(DRK_AoE_Combo)] - [CustomComboInfo("Delirium Option", "Adds Delirium to AoE combo on cooldown and when Darkside is up.", DRK.JobID)] + [CustomComboInfo("Delirium Option", "Adds Delirium (or Blood Weapon at lower levels) to AoE combo on cooldown and when Darkside is up.", DRK.JobID)] DRK_AoE_Delirium = 5017, [ParentCombo(DRK_AoE_Delirium)] From 2acb99b9e33ee0db08f52ad6fe58faf74efeb571 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Thu, 11 Jul 2024 09:30:12 -0600 Subject: [PATCH 68/69] Support Action Change disabling on Presence of Mind --- XIVSlothCombo/Combos/PvE/WHM.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/XIVSlothCombo/Combos/PvE/WHM.cs b/XIVSlothCombo/Combos/PvE/WHM.cs index 0534aeaf1..93c953f56 100644 --- a/XIVSlothCombo/Combos/PvE/WHM.cs +++ b/XIVSlothCombo/Combos/PvE/WHM.cs @@ -290,7 +290,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsEnabled(CustomComboPreset.WHM_ST_MainCombo_GlareIV) && HasEffect(Buffs.SacredSight) && GetBuffStacks(Buffs.SacredSight) > 0) - return OriginalHook(PresenceOfMind); + return OriginalHook(Glare4); if (IsEnabled(CustomComboPreset.WHM_ST_MainCombo_LilyOvercap) && LevelChecked(AfflatusRapture) && (liliesFull || liliesNearlyFull)) @@ -466,7 +466,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim if (IsEnabled(CustomComboPreset.WHM_AoE_DPS_GlareIV) && HasEffect(Buffs.SacredSight) && GetBuffStacks(Buffs.SacredSight) > 0) - return OriginalHook(PresenceOfMind); + return OriginalHook(Glare4); if (IsEnabled(CustomComboPreset.WHM_AoE_DPS_LilyOvercap) && LevelChecked(AfflatusRapture) && (liliesFullNoBlood || liliesNearlyFull)) From 8c47ad9cbb364291001620d64c2824cce41d04f3 Mon Sep 17 00:00:00 2001 From: Ethan Henderson Date: Thu, 11 Jul 2024 10:27:22 -0600 Subject: [PATCH 69/69] Support Action Change disabling on Divine Caress --- XIVSlothCombo/Combos/PvE/WHM.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/XIVSlothCombo/Combos/PvE/WHM.cs b/XIVSlothCombo/Combos/PvE/WHM.cs index 93c953f56..514e5ffc4 100644 --- a/XIVSlothCombo/Combos/PvE/WHM.cs +++ b/XIVSlothCombo/Combos/PvE/WHM.cs @@ -331,7 +331,7 @@ protected override uint Invoke(uint actionID, uint lastComboMove, float comboTim return PlenaryIndulgence; if (IsEnabled(CustomComboPreset.WHM_AoEHeals_DivineCaress) && divineCaressReady) - return DivineCaress; + return OriginalHook(DivineCaress); if (IsEnabled(CustomComboPreset.WHM_AoEHeals_Lucid) && canWeave && lucidReady) return All.LucidDreaming;