diff --git a/BossMod/Autorotation/Standard/akechi/AkechiTools.cs b/BossMod/Autorotation/Standard/akechi/AkechiTools.cs index 21aafa674..f7e2c1a01 100644 --- a/BossMod/Autorotation/Standard/akechi/AkechiTools.cs +++ b/BossMod/Autorotation/Standard/akechi/AkechiTools.cs @@ -610,9 +610,9 @@ P targetPrio(Actor potentialTarget) /// The initial target to consider for applying the DoT effect. /// A function that retrieves the timer value associated with a given actor. /// The maximum number of valid targets to evaluate. - protected (Enemy? Best, P Timer) GetDOTTarget

(Enemy? initial, Func getTimer, int maxAllowedTargets) where P : struct, IComparable + protected (Enemy? Best, P Timer) GetDOTTarget

(Enemy? initial, Func getTimer, int maxAllowedTargets, float range = 30) where P : struct, IComparable { - if (initial == null || maxAllowedTargets <= 0) + if (initial == null || maxAllowedTargets <= 0 || Player.DistanceToHitbox(initial.Actor) > range) { return (null, getTimer(null)); } @@ -624,7 +624,7 @@ P targetPrio(Actor potentialTarget) foreach (var dotTarget in Hints.PriorityTargets) { - if (dotTarget.ForbidDOTs) + if (dotTarget.ForbidDOTs || Player.DistanceToHitbox(dotTarget.Actor) > range) continue; if (++numTargets > maxAllowedTargets) @@ -770,12 +770,12 @@ public sealed override void Execute(StrategyValues strategy, ref Actor? primaryT DowntimeIn = Manager.Planner?.EstimateTimeToNextDowntime().Item2 ?? float.MaxValue; CombatTimer = (float)(World.CurrentTime - Manager.CombatStart).TotalSeconds; CountdownRemaining = World.Client.CountdownRemaining; - CanTrueNorth = ActionUnlocked(ActionID.MakeSpell(ClassShared.AID.TrueNorth)) && World.Client.Cooldowns[ActionDefinitions.Instance.Spell(ClassShared.AID.TrueNorth)!.MainCooldownGroup].Remaining < 45.6f; HasTrueNorth = StatusRemaining(Player, ClassShared.SID.TrueNorth, 15) > 0.1f; - CanSwiftcast = ActionUnlocked(ActionID.MakeSpell(ClassShared.AID.Swiftcast)) && World.Client.Cooldowns[ActionDefinitions.Instance.Spell(ClassShared.AID.Swiftcast)!.MainCooldownGroup].Remaining < 0.6f; + CanTrueNorth = !HasTrueNorth && ActionUnlocked(ActionID.MakeSpell(ClassShared.AID.TrueNorth)) && World.Client.Cooldowns[ActionDefinitions.Instance.Spell(ClassShared.AID.TrueNorth)!.MainCooldownGroup].Remaining < 45.6f; HasSwiftcast = StatusRemaining(Player, ClassShared.SID.Swiftcast, 10) > 0.1f; - CanPeloton = !Player.InCombat && ActionUnlocked(ActionID.MakeSpell(ClassShared.AID.Peloton)) && World.Client.Cooldowns[ActionDefinitions.Instance.Spell(ClassShared.AID.Peloton)!.MainCooldownGroup].Remaining < 0.6f; + CanSwiftcast = ActionUnlocked(ActionID.MakeSpell(ClassShared.AID.Swiftcast)) && World.Client.Cooldowns[ActionDefinitions.Instance.Spell(ClassShared.AID.Swiftcast)!.MainCooldownGroup].Remaining < 0.6f; HasPeloton = PlayerHasAnyEffect(ClassShared.SID.Peloton); + CanPeloton = !Player.InCombat && !HasPeloton && ActionUnlocked(ActionID.MakeSpell(ClassShared.AID.Peloton)) && World.Client.Cooldowns[ActionDefinitions.Instance.Spell(ClassShared.AID.Peloton)!.MainCooldownGroup].Remaining < 0.6f; if (Player.MountId is not (103 or 117 or 128)) Execution(strategy, PlayerTarget); diff --git a/BossMod/Autorotation/Standard/akechi/DPS/AkechiDRG.cs b/BossMod/Autorotation/Standard/akechi/DPS/AkechiDRG.cs index 4990ef138..a0de31644 100644 --- a/BossMod/Autorotation/Standard/akechi/DPS/AkechiDRG.cs +++ b/BossMod/Autorotation/Standard/akechi/DPS/AkechiDRG.cs @@ -10,7 +10,7 @@ public sealed class AkechiDRG(RotationModuleManager manager, Actor player) : Ake { #region Enums: Abilities / Strategies public enum Track { AOE, Hold, Dives, Potion, LifeSurge, Jump, DragonfireDive, Geirskogul, Stardiver, PiercingTalon, TrueNorth, LanceCharge, BattleLitany, MirageDive, Nastrond, WyrmwindThrust, RiseOfTheDragon, Starcross } - public enum AOEStrategy { AutoTargetHitPrimary, AutoTargetHitMost, ForceST, Force123ST, ForceBuffsST, ForceAOE } + public enum AOEStrategy { AutoFinish, AutoBreak, ForceST, Force123ST, ForceBuffsST, ForceAOE } public enum HoldStrategy { Allow, Forbid } public enum DivesStrategy { AllowMaxMelee, AllowCloseMelee, Allow, Forbid } public enum PotionStrategy { Manual, AlignWithRaidBuffs, Immediate } @@ -26,18 +26,11 @@ public enum TrueNorthStrategy { Automatic, ASAP, Rear, Flank, Force, Delay } #region Module Definitions public static RotationModuleDefinition Definition() { - var res = new RotationModuleDefinition( - "Akechi DRG", //Name - "Standard Rotation Module", //Type - "Standard rotation (Akechi)|DPS", //Category - "Akechi", //Contributor of module - RotationModuleQuality.Good, //Quality - BitMask.Build(Class.LNC, Class.DRG), //Class and Job - 100); //Max Level supported + var res = new RotationModuleDefinition("Akechi DRG", "Standard Rotation Module", "Standard rotation (Akechi)|DPS", "Akechi", RotationModuleQuality.Excellent, BitMask.Build(Class.LNC, Class.DRG), 100); res.Define(Track.AOE).As("Combo Option", "AOE", uiPriority: 200) - .AddOption(AOEStrategy.AutoTargetHitPrimary, "AutoTargetHitPrimary", "Use AOE actions if profitable, select best target that ensures primary target is hit", supportedTargets: ActionTargets.Hostile) - .AddOption(AOEStrategy.AutoTargetHitMost, "AutoTargetHitMost", "Use AOE actions if profitable, select a target that ensures maximal number of targets are hit", supportedTargets: ActionTargets.Hostile) + .AddOption(AOEStrategy.AutoFinish, "Auto (Finish combo)", "Automatically execute optimal rotation based on targets; finishes combo if possible", supportedTargets: ActionTargets.Hostile) + .AddOption(AOEStrategy.AutoBreak, "Auto (Break combo)", "Automatically execute optimal rotation based on targets; breaks combo if necessary", supportedTargets: ActionTargets.Hostile) .AddOption(AOEStrategy.ForceST, "Force ST", "Force Single-Target rotation", supportedTargets: ActionTargets.Hostile) .AddOption(AOEStrategy.Force123ST, "Only 1-2-3 ST", "Force only ST 1-2-3 rotation (No Buff or DoT)", supportedTargets: ActionTargets.Hostile) .AddOption(AOEStrategy.ForceBuffsST, "Only 1-4-5 ST", "Force only ST 1-4-5 rotation (Buff & DoT only)", supportedTargets: ActionTargets.Hostile) @@ -121,77 +114,74 @@ public static RotationModuleDefinition Definition() #endregion #region Priorities - - public enum GCDPriority //Priorities for Global Cooldowns (GCDs) - + public enum GCDPriority { - None = 0, //No priority - Combo123 = 350, //Priority for the first three combo actions - NormalGCD = 500, //Standard priority for normal GCD actions - ForcedGCD = 900, //High priority for forced GCD actions + None = 0, + Combo123 = 350, + NormalGCD = 500, + ForcedGCD = 900, } - - public enum OGCDPriority //Priorities for Off Global Cooldowns (oGCDs) - + public enum OGCDPriority { - None = 0, //No priority - //Flexible actions with varying priorities - MirageDive = 500, //Priority for Mirage Dive - Nastrond = 540, //Priority for Nastrond - Stardiver = 550, //Priority for Stardiver - RiseOfTheDragon = 560, //Priority for Rise of the Dragon - Starcross = 560, //Priority for Starcross - WyrmwindThrust = 570, //Priority for Wyrmwind Thrust (normal) - TrueNorth = 580, //Priority for True North - //Non-flexible actions with fixed priorities - Jump = 660, //Priority for Jump - WyrmwindThrustOpti = 670, //Priority for Wyrmwind Thrust (optimal) - DragonfireDive = 680, //Priority for Dragonfire Dive - Geirskogul = 700, //Priority for Geirskogul - Buffs = 800, //Priority for buffs - ForcedOGCD = 900, //High priority for forced oGCD actions + None = 0, + MirageDive = 500, + Nastrond = 540, + Stardiver = 550, + RiseOfTheDragon = 560, + Starcross = 560, + WyrmwindThrust = 570, + TrueNorth = 580, + Jump = 660, + WyrmwindThrustOpti = 670, + DragonfireDive = 680, + Geirskogul = 700, + Buffs = 800, + ForcedOGCD = 900, } - + private OGCDPriority OGCDPrio(OGCDStrategy strat, OGCDPriority defaultPrio) => strat is OGCDStrategy.Force or OGCDStrategy.AnyWeave or OGCDStrategy.EarlyWeave or OGCDStrategy.LateWeave ? OGCDPriority.ForcedOGCD : defaultPrio; #endregion #region Module Variables - private bool hasLOTD; //Flag for Life of the Dragon status - private bool hasLC; //Flag for Lance Charge status - private bool hasBL; //Flag for Battle Litany status - private bool hasMD; //Flag for Mirage Dive status - private bool hasDF; //Flag for Dragon's Flight status - private bool hasSC; //Flag for Starcross status - private bool hasNastrond; //Flag for Nastrond status - private bool canLC; //Ability to use Lance Charge - private bool canBL; //Ability to use Battle Litany - private bool canLS; //Ability to use Life Surge - private bool canJump; //Ability to use Jump - private bool canDD; //Ability to use Dragonfire Dive - private bool canGeirskogul; //Ability to use Geirskogul - private bool canMD; //Ability to use Mirage Dive - private bool canNastrond; //Ability to use Nastrond - private bool canSD; //Ability to use Stardiver - private bool canWT; //Ability to use Wyrmwind Thrust - private bool canROTD; //Ability to use Rise of the Dragon - private bool canSC; //Ability to use Starcross - private float GCDLength; //Length of the global cooldown - private float blCD; //Cooldown for Battle Litany - private float lcLeft; //Time remaining for Lance Charge - private float lcCD; //Cooldown for Lance Charge - private float powerLeft; //Time remaining for Power Surge - private float chaosLeft; //Remaining time for Chaotic Spring DoT - public float downtimeIn; //Duration of downtime in combat - private int focusCount; //Count of Firstmind's Focus gauge - public int NumAOETargets; - public int NumSpearTargets; - public int NumDiveTargets; + private bool hasLOTD; + private bool hasLC; + private bool hasBL; + private bool hasMD; + private bool hasDF; + private bool hasSC; + private bool hasNastrond; + private bool canLC; + private bool canBL; + private bool canLS; + private bool canJump; + private bool canDD; + private bool canGeirskogul; + private bool canMD; + private bool canNastrond; + private bool canSD; + private bool canWT; + private bool canROTD; + private bool canSC; + private float blCD; + private float lcLeft; + private float lcCD; + private float powerLeft; + private float chaosLeft; + private int focusCount; + private int NumAOETargets; + private int NumSpearTargets; + private int NumDiveTargets; + private bool ShouldUseAOE; + private bool ShouldUseSpears; + private bool ShouldUseDives; + private bool ShouldUseDOT; private Enemy? BestAOETargets; private Enemy? BestSpearTargets; private Enemy? BestDiveTargets; + private Enemy? BestDOTTargets; private Enemy? BestAOETarget; private Enemy? BestSpearTarget; private Enemy? BestDiveTarget; - + private Enemy? BestDOTTarget; #endregion public override void Execution(StrategyValues strategy, Enemy? primaryTarget) @@ -200,36 +190,41 @@ public override void Execution(StrategyValues strategy, Enemy? primaryTarget) var gauge = World.Client.GetGauge(); focusCount = gauge.FirstmindsFocusCount; hasLOTD = gauge.LotdTimer > 0; + blCD = TotalCD(AID.BattleLitany); lcCD = TotalCD(AID.LanceCharge); lcLeft = SelfStatusLeft(SID.LanceCharge, 20); powerLeft = SelfStatusLeft(SID.PowerSurge, 30); chaosLeft = MathF.Max(StatusDetails(primaryTarget?.Actor, SID.ChaosThrust, Player.InstanceID).Left, StatusDetails(primaryTarget?.Actor, SID.ChaoticSpring, Player.InstanceID).Left); - blCD = TotalCD(AID.BattleLitany); - GCDLength = ActionSpeed.GCDRounded(World.Client.PlayerStats.SkillSpeed, World.Client.PlayerStats.Haste, Player.Level); hasMD = PlayerHasEffect(SID.DiveReady); hasNastrond = PlayerHasEffect(SID.NastrondReady); hasLC = lcCD is >= 40 and <= 60; hasBL = blCD is >= 100 and <= 120; hasDF = PlayerHasEffect(SID.DragonsFlight); hasSC = PlayerHasEffect(SID.StarcrossReady); - canLC = Unlocked(AID.LanceCharge) && ActionReady(AID.LanceCharge); - canBL = Unlocked(AID.BattleLitany) && ActionReady(AID.BattleLitany); - canLS = Unlocked(AID.LifeSurge); - canJump = Unlocked(AID.Jump) && ActionReady(AID.Jump); - canDD = Unlocked(AID.DragonfireDive) && ActionReady(AID.DragonfireDive); - canGeirskogul = Unlocked(AID.Geirskogul) && ActionReady(AID.Geirskogul); + canLC = ActionReady(AID.LanceCharge); + canBL = ActionReady(AID.BattleLitany); + canLS = Unlocked(AID.LifeSurge) && (Unlocked(TraitID.EnhancedLifeSurge) ? TotalCD(AID.LifeSurge) < 40.6f : TotalCD(AID.LifeSurge) < 0.6f) && !PlayerHasEffect(SID.LifeSurge); + canJump = ActionReady(AID.Jump); + canDD = ActionReady(AID.DragonfireDive); + canGeirskogul = ActionReady(AID.Geirskogul); canMD = Unlocked(AID.MirageDive) && hasMD; canNastrond = Unlocked(AID.Nastrond) && hasNastrond; - canSD = Unlocked(AID.Stardiver) && ActionReady(AID.Stardiver); - canWT = Unlocked(AID.WyrmwindThrust) && ActionReady(AID.WyrmwindThrust) && focusCount == 2; + canSD = ActionReady(AID.Stardiver); + canWT = ActionReady(AID.WyrmwindThrust) && focusCount == 2; canROTD = Unlocked(AID.RiseOfTheDragon) && hasDF; canSC = Unlocked(AID.Starcross) && hasSC; + ShouldUseAOE = Unlocked(AID.DoomSpike) && NumAOETargets > 2; + ShouldUseSpears = Unlocked(AID.Geirskogul) && NumSpearTargets > 1; + ShouldUseDives = Unlocked(AID.Stardiver) && NumDiveTargets > 1; + ShouldUseDOT = Unlocked(AID.ChaosThrust) && Hints.NumPriorityTargetsInAOECircle(Player.Position, 3.5f) == 2 && ComboLastMove is AID.Disembowel or AID.SpiralBlow; (BestAOETargets, NumAOETargets) = GetBestTarget(primaryTarget, 10, Is10yRectTarget); (BestSpearTargets, NumSpearTargets) = GetBestTarget(primaryTarget, 15, Is15yRectTarget); (BestDiveTargets, NumDiveTargets) = GetBestTarget(primaryTarget, 20, IsSplashTarget); - BestAOETarget = Unlocked(AID.DoomSpike) && NumAOETargets > 2 ? BestAOETargets : primaryTarget; - BestSpearTarget = Unlocked(AID.Geirskogul) && NumSpearTargets > 1 ? BestSpearTargets : primaryTarget; - BestDiveTarget = Unlocked(AID.Stardiver) && NumDiveTargets > 1 ? BestDiveTargets : primaryTarget; + (BestDOTTargets, chaosLeft) = GetDOTTarget(primaryTarget, ChaosRemaining, 2, 3.5f); + BestAOETarget = ShouldUseAOE ? BestAOETargets : BestDOTTarget; + BestSpearTarget = ShouldUseSpears ? BestSpearTargets : primaryTarget; + BestDiveTarget = ShouldUseDives ? BestDiveTargets : primaryTarget; + BestDOTTarget = ShouldUseDOT ? BestDOTTargets : primaryTarget; #region Strategy Definitions var hold = strategy.Option(Track.Hold).As() == HoldStrategy.Forbid; @@ -272,9 +267,9 @@ public override void Execution(StrategyValues strategy, Enemy? primaryTarget) //Dive strategy var diveStrategy = dive switch { - DivesStrategy.AllowMaxMelee => In3y(primaryTarget?.Actor), //Only allow max melee if target is within 3 yalms - DivesStrategy.AllowCloseMelee => In0y(primaryTarget?.Actor), //Only allow close melee if target is within 1 yalm - DivesStrategy.Allow => In20y(primaryTarget?.Actor), //Always allow dives + DivesStrategy.AllowMaxMelee => In3y(BestDiveTarget?.Actor), //Only allow max melee if target is within 3 yalms + DivesStrategy.AllowCloseMelee => In0y(BestDiveTarget?.Actor), //Only allow close melee if target is within 1 yalm + DivesStrategy.Allow => In20y(BestDiveTarget?.Actor), //Always allow dives DivesStrategy.Forbid => false, //Never allow dives _ => false, }; @@ -286,256 +281,129 @@ public override void Execution(StrategyValues strategy, Enemy? primaryTarget) #endregion #region Standard Rotations - //Force specific actions based on the AOE strategy selected - if (AOEStrategy == AOEStrategy.ForceST) //if forced single target - QueueGCD(NextFullST(), TargetChoice(AOE) ?? primaryTarget?.Actor, GCDPriority.ForcedGCD); //Queue the next single target action - if (AOEStrategy == AOEStrategy.Force123ST) //if forced 123 combo - QueueGCD(UseOnly123ST(), TargetChoice(AOE) ?? primaryTarget?.Actor, GCDPriority.ForcedGCD); //Queue the 123 combo action - if (AOEStrategy == AOEStrategy.ForceBuffsST) //if forced buffs combo - QueueGCD(UseOnly145ST(), TargetChoice(AOE) ?? primaryTarget?.Actor, GCDPriority.ForcedGCD); //Queue the buffed 145 combo action - if (AOEStrategy == AOEStrategy.ForceAOE) //if forced AOE action - QueueGCD(NextFullAOE(), TargetChoice(AOE) ?? (NumAOETargets > 1 ? BestAOETargets?.Actor : primaryTarget?.Actor), GCDPriority.ForcedGCD); //Queue the next AOE action - //Combo Action evecution - QueueGCD(NumAOETargets > 2 ? NextFullAOE() : NextFullST(), - BestAOETarget?.Actor, - GCDPriority.Combo123); + if (AOEStrategy is AOEStrategy.AutoFinish) + QueueGCD(FullRotation(), BestAOETarget?.Actor, GCDPriority.Combo123); + if (AOEStrategy is AOEStrategy.AutoBreak) + QueueGCD(ShouldUseAOE ? FullAOE() : ShouldUseDOT ? STBuffs() : FullST(), BestAOETarget?.Actor, GCDPriority.Combo123); + if (AOEStrategy == AOEStrategy.ForceST) + QueueGCD(FullST(), TargetChoice(AOE) ?? primaryTarget?.Actor, GCDPriority.ForcedGCD); + if (AOEStrategy == AOEStrategy.Force123ST) + QueueGCD(STNormal(), TargetChoice(AOE) ?? primaryTarget?.Actor, GCDPriority.ForcedGCD); + if (AOEStrategy == AOEStrategy.ForceBuffsST) + QueueGCD(STBuffs(), TargetChoice(AOE) ?? BestDOTTarget?.Actor, GCDPriority.ForcedGCD); + if (AOEStrategy == AOEStrategy.ForceAOE) + QueueGCD(FullAOE(), TargetChoice(AOE) ?? (NumAOETargets > 1 ? BestAOETargets?.Actor : primaryTarget?.Actor), GCDPriority.ForcedGCD); #endregion #region Cooldowns - if (!hold) { + if (divesGood) + { + if (ShouldUseJump(jumpStrat, primaryTarget?.Actor)) + QueueOGCD(Unlocked(AID.HighJump) ? AID.HighJump : AID.Jump, TargetChoice(jump) ?? primaryTarget?.Actor, jumpStrat is JumpStrategy.Force or JumpStrategy.ForceEX or JumpStrategy.ForceEX2 or JumpStrategy.ForceWeave ? OGCDPriority.ForcedOGCD : OGCDPriority.Jump); + if (ShouldUseDragonfireDive(ddStrat, primaryTarget?.Actor)) + QueueOGCD(AID.DragonfireDive, TargetChoice(dd) ?? BestDiveTarget?.Actor, ddStrat is DragonfireStrategy.Force or DragonfireStrategy.ForceWeave ? OGCDPriority.ForcedOGCD : OGCDPriority.DragonfireDive); + if (ShouldUseStardiver(sdStrat, primaryTarget?.Actor)) + QueueOGCD(AID.Stardiver, TargetChoice(sd) ?? BestDiveTarget?.Actor, sdStrat is StardiverStrategy.Force or StardiverStrategy.ForceEX or StardiverStrategy.ForceWeave ? OGCDPriority.ForcedOGCD : OGCDPriority.Stardiver); + } if (ShouldUseLanceCharge(lcStrat, primaryTarget?.Actor)) - QueueOGCD(AID.LanceCharge, Player, - lcStrat is OGCDStrategy.Force or OGCDStrategy.AnyWeave or OGCDStrategy.EarlyWeave or OGCDStrategy.LateWeave - ? OGCDPriority.ForcedOGCD : OGCDPriority.Buffs); - + QueueOGCD(AID.LanceCharge, Player, OGCDPrio(lcStrat, OGCDPriority.Buffs)); if (ShouldUseBattleLitany(blStrat, primaryTarget?.Actor)) - QueueOGCD(AID.BattleLitany, Player, - blStrat is OGCDStrategy.Force or OGCDStrategy.AnyWeave or OGCDStrategy.EarlyWeave or OGCDStrategy.LateWeave - ? OGCDPriority.ForcedOGCD : OGCDPriority.Buffs); - + QueueOGCD(AID.BattleLitany, Player, OGCDPrio(blStrat, OGCDPriority.Buffs)); if (ShouldUseLifeSurge(lsStrat, primaryTarget?.Actor)) - QueueOGCD(AID.LifeSurge, Player, - lsStrat is SurgeStrategy.Force or SurgeStrategy.ForceWeave or SurgeStrategy.ForceNextOpti or SurgeStrategy.ForceNextOptiWeave - ? OGCDPriority.ForcedOGCD : OGCDPriority.Buffs); - - if (divesGood && ShouldUseJump(jumpStrat, primaryTarget?.Actor)) - QueueOGCD(Unlocked(AID.HighJump) ? AID.HighJump : AID.Jump, - TargetChoice(jump) ?? primaryTarget?.Actor, - jumpStrat is JumpStrategy.Force or JumpStrategy.ForceEX or JumpStrategy.ForceEX2 or JumpStrategy.ForceWeave - ? OGCDPriority.ForcedOGCD : OGCDPriority.Jump); - - if (divesGood && ShouldUseDragonfireDive(ddStrat, primaryTarget?.Actor)) - QueueOGCD(AID.DragonfireDive, - TargetChoice(dd) ?? BestDiveTarget?.Actor, - ddStrat is DragonfireStrategy.Force or DragonfireStrategy.ForceWeave - ? OGCDPriority.ForcedOGCD : OGCDPriority.DragonfireDive); - + QueueOGCD(AID.LifeSurge, Player, lsStrat is SurgeStrategy.Force or SurgeStrategy.ForceWeave or SurgeStrategy.ForceNextOpti or SurgeStrategy.ForceNextOptiWeave ? OGCDPriority.ForcedOGCD : OGCDPriority.Buffs); if (ShouldUseGeirskogul(geirskogulStrat, primaryTarget?.Actor)) - QueueOGCD(AID.Geirskogul, - TargetChoice(geirskogul) ?? BestSpearTarget?.Actor, - geirskogulStrat is GeirskogulStrategy.Force or GeirskogulStrategy.ForceEX or GeirskogulStrategy.ForceWeave - ? OGCDPriority.ForcedOGCD : OGCDPriority.Geirskogul); - + QueueOGCD(AID.Geirskogul, TargetChoice(geirskogul) ?? BestSpearTarget?.Actor, geirskogulStrat is GeirskogulStrategy.Force or GeirskogulStrategy.ForceEX or GeirskogulStrategy.ForceWeave ? OGCDPriority.ForcedOGCD : OGCDPriority.Geirskogul); if (ShouldUseMirageDive(mdStrat, primaryTarget?.Actor)) - QueueOGCD(AID.MirageDive, - TargetChoice(md) ?? primaryTarget?.Actor, - mdStrat is OGCDStrategy.Force or OGCDStrategy.AnyWeave or OGCDStrategy.EarlyWeave or OGCDStrategy.LateWeave - ? OGCDPriority.ForcedOGCD : OGCDPriority.MirageDive); - + QueueOGCD(AID.MirageDive, TargetChoice(md) ?? primaryTarget?.Actor, OGCDPrio(mdStrat, OGCDPriority.MirageDive)); if (ShouldUseNastrond(nastrondStrat, primaryTarget?.Actor)) - QueueOGCD(AID.Nastrond, - TargetChoice(nastrond) ?? BestSpearTarget?.Actor, - nastrondStrat is OGCDStrategy.Force or OGCDStrategy.AnyWeave or OGCDStrategy.EarlyWeave or OGCDStrategy.LateWeave - ? OGCDPriority.ForcedOGCD : OGCDPriority.Nastrond); - - if (divesGood && ShouldUseStardiver(sdStrat, primaryTarget?.Actor)) - QueueOGCD(AID.Stardiver, - TargetChoice(sd) ?? BestDiveTarget?.Actor, - sdStrat is StardiverStrategy.Force or StardiverStrategy.ForceEX or StardiverStrategy.ForceWeave - ? OGCDPriority.ForcedOGCD : OGCDPriority.Stardiver); - + QueueOGCD(AID.Nastrond, TargetChoice(nastrond) ?? BestSpearTarget?.Actor, OGCDPrio(nastrondStrat, OGCDPriority.Nastrond)); if (ShouldUseWyrmwindThrust(wtStrat, primaryTarget?.Actor)) - QueueOGCD(AID.WyrmwindThrust, - TargetChoice(wt) ?? BestSpearTarget?.Actor, - wtStrat is OGCDStrategy.Force or OGCDStrategy.AnyWeave or OGCDStrategy.EarlyWeave or OGCDStrategy.LateWeave - ? OGCDPriority.ForcedOGCD : PlayerHasEffect(SID.LanceCharge) - ? OGCDPriority.WyrmwindThrustOpti : OGCDPriority.WyrmwindThrust); - + QueueOGCD(AID.WyrmwindThrust, TargetChoice(wt) ?? BestSpearTarget?.Actor, wtStrat is OGCDStrategy.Force or OGCDStrategy.AnyWeave or OGCDStrategy.EarlyWeave or OGCDStrategy.LateWeave ? OGCDPriority.ForcedOGCD : PlayerHasEffect(SID.LanceCharge) ? OGCDPriority.WyrmwindThrustOpti : OGCDPriority.WyrmwindThrust); if (ShouldUseRiseOfTheDragon(rotdStrat, primaryTarget?.Actor)) - QueueOGCD(AID.RiseOfTheDragon, - TargetChoice(rotd) ?? BestDiveTarget?.Actor, - rotdStrat is OGCDStrategy.Force or OGCDStrategy.AnyWeave or OGCDStrategy.EarlyWeave or OGCDStrategy.LateWeave - ? OGCDPriority.ForcedOGCD : OGCDPriority.Buffs); - + QueueOGCD(AID.RiseOfTheDragon, TargetChoice(rotd) ?? BestDiveTarget?.Actor, OGCDPrio(rotdStrat, OGCDPriority.RiseOfTheDragon)); if (ShouldUseStarcross(scStrat, primaryTarget?.Actor)) - QueueOGCD(AID.Starcross, - TargetChoice(sc) ?? BestDiveTarget?.Actor, - scStrat is OGCDStrategy.Force or OGCDStrategy.AnyWeave or OGCDStrategy.EarlyWeave or OGCDStrategy.LateWeave - ? OGCDPriority.ForcedOGCD : OGCDPriority.Starcross); - + QueueOGCD(AID.Starcross, TargetChoice(sc) ?? BestDiveTarget?.Actor, OGCDPrio(scStrat, OGCDPriority.Starcross)); if (ShouldUsePotion(strategy.Option(Track.Potion).As())) - Hints.ActionsToExecute.Push(ActionDefinitions.IDPotionStr, - Player, ActionQueue.Priority.VeryHigh + (int)OGCDPriority.ForcedOGCD, 0, GCD - 0.9f); - + Hints.ActionsToExecute.Push(ActionDefinitions.IDPotionStr, Player, ActionQueue.Priority.VeryHigh + (int)OGCDPriority.ForcedOGCD, 0, GCD - 0.9f); if (ShouldUseTrueNorth(strategy.Option(Track.TrueNorth).As(), primaryTarget?.Actor)) QueueOGCD(AID.TrueNorth, Player, OGCDPriority.TrueNorth); } - if (ShouldUsePiercingTalon(primaryTarget?.Actor, ptStrat)) - QueueGCD(AID.PiercingTalon, - TargetChoice(pt) ?? primaryTarget?.Actor, - ptStrat is PiercingTalonStrategy.Force or PiercingTalonStrategy.ForceEX - ? GCDPriority.ForcedGCD : GCDPriority.NormalGCD); + QueueGCD(AID.PiercingTalon, TargetChoice(pt) ?? primaryTarget?.Actor, ptStrat is PiercingTalonStrategy.Force or PiercingTalonStrategy.ForceEX ? GCDPriority.ForcedGCD : GCDPriority.NormalGCD); #endregion #endregion #region AI - //AI hints for positioning - var goalST = primaryTarget?.Actor != null ? Hints.GoalSingleTarget(primaryTarget!.Actor, 3) : null; //Set goal for single target - var goalAOE = primaryTarget?.Actor != null ? Hints.GoalAOECone(primaryTarget!.Actor, 10, 45.Degrees()) : null; //Set goal for AOE - var goal = AOEStrategy switch //Set goal based on AOE strategy + var goalST = primaryTarget?.Actor != null ? Hints.GoalSingleTarget(primaryTarget!.Actor, 3) : null; + var goalAOE = primaryTarget?.Actor != null ? Hints.GoalAOECone(primaryTarget!.Actor, 10, 45.Degrees()) : null; + var goal = AOEStrategy switch { - AOEStrategy.ForceST => goalST, //if forced single target - AOEStrategy.Force123ST => goalST, //if forced 123 combo - AOEStrategy.ForceBuffsST => goalST, //if forced buffs combo - AOEStrategy.ForceAOE => goalAOE, //if forced AOE action - _ => goalST != null && goalAOE != null ? Hints.GoalCombined(goalST, goalAOE, 2) : goalAOE //otherwise, combine goals + AOEStrategy.ForceST => goalST, + AOEStrategy.Force123ST => goalST, + AOEStrategy.ForceBuffsST => goalST, + AOEStrategy.ForceAOE => goalAOE, + _ => goalST != null && goalAOE != null ? Hints.GoalCombined(goalST, goalAOE, 2) : goalAOE }; - if (goal != null) //if goal is set - Hints.GoalZones.Add(goal); //add goal to zones + if (goal != null) + Hints.GoalZones.Add(goal); #endregion } #region Rotation Helpers - #region Single-Target Helpers - - //Determines the next skill in the single-target (ST) combo chain based on the last used action. - private AID NextFullST() => ComboLastMove switch + private AID FullRotation() => ComboLastMove switch { - //Starting combo with TrueThrust or RaidenThrust - AID.TrueThrust or AID.RaidenThrust => - //if Disembowel is Unlocked and power is low or Chaotic Spring is 0, use Disembowel or SpiralBlow, else VorpalThrust or LanceBarrage - Unlocked(AID.Disembowel) && (powerLeft <= GCDLength * 6 || chaosLeft <= GCDLength * 4) - ? Unlocked(AID.SpiralBlow) ? AID.SpiralBlow : AID.Disembowel - : Unlocked(AID.LanceBarrage) ? AID.LanceBarrage : AID.VorpalThrust, - - //Follow-up after Disembowel or SpiralBlow - AID.Disembowel or AID.SpiralBlow => - Unlocked(AID.ChaoticSpring) ? AID.ChaoticSpring //Use ChaoticSpring if Unlocked - : Unlocked(AID.ChaosThrust) ? AID.ChaosThrust //Use ChaosThrust if Unlocked - : AID.TrueThrust, //Return to TrueThrust otherwise - - //Follow-up after VorpalThrust or LanceBarrage - AID.VorpalThrust or AID.LanceBarrage => - Unlocked(AID.HeavensThrust) ? AID.HeavensThrust //Use HeavensThrust if Unlocked - : Unlocked(AID.FullThrust) ? AID.FullThrust //Use FullThrust if Unlocked - : AID.TrueThrust, //Return to TrueThrust otherwise - - //After FullThrust or HeavensThrust in the combo - AID.FullThrust or AID.HeavensThrust => - Unlocked(AID.FangAndClaw) ? AID.FangAndClaw //Use FangAndClaw if Unlocked - : AID.TrueThrust, //Return to TrueThrust otherwise + AID.Drakesbane or AID.CoerthanTorment => ShouldUseAOE ? FullAOE() : ShouldUseDOT ? STBuffs() : FullST(), + AID.DoomSpike or AID.DraconianFury or AID.SonicThrust => FullAOE(), + AID.TrueThrust or AID.RaidenThrust or AID.VorpalThrust or AID.LanceBarrage or AID.Disembowel or AID.SpiralBlow or AID.HeavensThrust or AID.FullThrust or AID.WheelingThrust or AID.FangAndClaw => FullST(), + _ => ShouldUseAOE ? FullAOE() : ShouldUseDOT ? STBuffs() : FullST() + }; - //After ChaosThrust or ChaoticSpring in the combo - AID.ChaosThrust or AID.ChaoticSpring => - Unlocked(AID.WheelingThrust) ? AID.WheelingThrust //Use WheelingThrust if Unlocked - : AID.TrueThrust, //Return to TrueThrust otherwise + #region Single-Target Helpers - //After WheelingThrust or FangAndClaw in the combo - AID.WheelingThrust or AID.FangAndClaw => - Unlocked(AID.Drakesbane) ? AID.Drakesbane //Use Drakesbane if Unlocked - : AID.TrueThrust, //Return to TrueThrust otherwise + #region DOT + private static SID[] GetDotStatus() => [SID.ChaosThrust, SID.ChaoticSpring]; + private float ChaosRemaining(Actor? target) => target == null ? float.MaxValue : GetDotStatus().Select(stat => StatusDetails(target, (uint)stat, Player.InstanceID).Left).FirstOrDefault(dur => dur > 6); + #endregion - //if no combo active and Draconian Fire buff is up, use RaidenThrust - _ => PlayerHasEffect(SID.DraconianFire) ? AID.RaidenThrust //RaidenThrust if DraconianFire is active - : AID.TrueThrust, //No combo, start with TrueThrust + private AID FullST() => ComboLastMove switch + { + AID.TrueThrust or AID.RaidenThrust => Unlocked(AID.Disembowel) && (powerLeft <= SkSGCDLength * 6 || chaosLeft <= SkSGCDLength * 4) ? Unlocked(AID.SpiralBlow) ? AID.SpiralBlow : AID.Disembowel : Unlocked(AID.LanceBarrage) ? AID.LanceBarrage : AID.VorpalThrust, + AID.Disembowel or AID.SpiralBlow => Unlocked(AID.ChaoticSpring) ? AID.ChaoticSpring : Unlocked(AID.ChaosThrust) ? AID.ChaosThrust : AID.TrueThrust, + AID.VorpalThrust or AID.LanceBarrage => Unlocked(AID.HeavensThrust) ? AID.HeavensThrust : Unlocked(AID.FullThrust) ? AID.FullThrust : AID.TrueThrust, + AID.FullThrust or AID.HeavensThrust => Unlocked(AID.FangAndClaw) ? AID.FangAndClaw : AID.TrueThrust, + AID.ChaosThrust or AID.ChaoticSpring => Unlocked(AID.WheelingThrust) ? AID.WheelingThrust : AID.TrueThrust, + AID.WheelingThrust or AID.FangAndClaw => Unlocked(AID.Drakesbane) ? AID.Drakesbane : AID.TrueThrust, + _ => PlayerHasEffect(SID.DraconianFire) ? AID.RaidenThrust : AID.TrueThrust, }; - - //Limits the combo sequence to just 1-2-3 ST skills, ignoring other Unlocked actions. - private AID UseOnly123ST() => ComboLastMove switch + private AID STNormal() => ComboLastMove switch { - //Start combo with TrueThrust - AID.TrueThrust or AID.RaidenThrust => - Unlocked(AID.LanceBarrage) ? AID.LanceBarrage //LanceBarrage if Unlocked - : Unlocked(AID.VorpalThrust) ? AID.VorpalThrust //VorpalThrust otherwise - : AID.TrueThrust, //Else return to TrueThrust - - //After VorpalThrust or LanceBarrage - AID.VorpalThrust or AID.LanceBarrage => - Unlocked(AID.HeavensThrust) ? AID.HeavensThrust //HeavensThrust if Unlocked - : Unlocked(AID.FullThrust) ? AID.FullThrust //FullThrust to end combo - : AID.TrueThrust, //Else return to TrueThrust - - //After FullThrust or HeavensThrust - AID.FullThrust or AID.HeavensThrust => - Unlocked(AID.FangAndClaw) ? AID.FangAndClaw //FangAndClaw if Unlocked - : AID.TrueThrust, //Else return to TrueThrust - - //After WheelingThrust or FangAndClaw - AID.WheelingThrust or AID.FangAndClaw => - Unlocked(AID.Drakesbane) ? AID.Drakesbane //Drakesbane if Unlocked - : AID.TrueThrust, //Else return to TrueThrust - - //if Draconian Fire buff is up, use RaidenThrust - _ => PlayerHasEffect(SID.DraconianFire) ? AID.RaidenThrust //RaidenThrust if DraconianFire is active - : AID.TrueThrust, //No combo, start with TrueThrust + AID.TrueThrust or AID.RaidenThrust => Unlocked(AID.LanceBarrage) ? AID.LanceBarrage : Unlocked(AID.VorpalThrust) ? AID.VorpalThrust : AID.TrueThrust, + AID.VorpalThrust or AID.LanceBarrage => Unlocked(AID.HeavensThrust) ? AID.HeavensThrust : Unlocked(AID.FullThrust) ? AID.FullThrust : AID.TrueThrust, + AID.FullThrust or AID.HeavensThrust => Unlocked(AID.FangAndClaw) ? AID.FangAndClaw : AID.TrueThrust, + AID.WheelingThrust or AID.FangAndClaw => Unlocked(AID.Drakesbane) ? AID.Drakesbane : AID.TrueThrust, + _ => PlayerHasEffect(SID.DraconianFire) ? AID.RaidenThrust : AID.TrueThrust, }; - - //Limits the combo sequence to 1-4-5 ST skills, focusing on Disembowel and Chaos/ChaoticSpring. - private AID UseOnly145ST() => ComboLastMove switch + private AID STBuffs() => ComboLastMove switch { - //Start combo with TrueThrust - AID.TrueThrust or AID.RaidenThrust => - Unlocked(AID.Disembowel) - ? Unlocked(AID.SpiralBlow) ? AID.SpiralBlow : AID.Disembowel //Disembowel/SpiralBlow if Unlocked - : AID.TrueThrust, //Else return to TrueThrust - - //After Disembowel or SpiralBlow - AID.Disembowel or AID.SpiralBlow => - Unlocked(AID.ChaoticSpring) ? AID.ChaoticSpring //ChaoticSpring if Unlocked - : Unlocked(AID.ChaosThrust) ? AID.ChaosThrust //ChaosThrust if Unlocked - : AID.TrueThrust, //Else return to TrueThrust - - //After ChaosThrust or ChaoticSpring - AID.ChaosThrust or AID.ChaoticSpring => - Unlocked(AID.WheelingThrust) ? AID.WheelingThrust //WheelingThrust if Unlocked - : AID.TrueThrust, //Else return to TrueThrust - - //After WheelingThrust or FangAndClaw - AID.WheelingThrust or AID.FangAndClaw => - Unlocked(AID.Drakesbane) ? AID.Drakesbane //Drakesbane if Unlocked - : AID.TrueThrust, //Else return to TrueThrust - - //if Draconian Fire buff is up, use RaidenThrust - _ => PlayerHasEffect(SID.DraconianFire) ? AID.RaidenThrust //RaidenThrust if DraconianFire is active - : AID.TrueThrust, //No combo, start with TrueThrust + AID.TrueThrust or AID.RaidenThrust => Unlocked(AID.Disembowel) ? (Unlocked(AID.SpiralBlow) ? AID.SpiralBlow : AID.Disembowel) : AID.TrueThrust, + AID.Disembowel or AID.SpiralBlow => Unlocked(AID.ChaoticSpring) ? AID.ChaoticSpring : Unlocked(AID.ChaosThrust) ? AID.ChaosThrust : AID.TrueThrust, + AID.ChaosThrust or AID.ChaoticSpring => Unlocked(AID.WheelingThrust) ? AID.WheelingThrust : AID.TrueThrust, + AID.WheelingThrust or AID.FangAndClaw => Unlocked(AID.Drakesbane) ? AID.Drakesbane : AID.TrueThrust, + _ => PlayerHasEffect(SID.DraconianFire) ? AID.RaidenThrust : AID.TrueThrust, }; - #endregion #region AOE Helpers - - //Determines the next action in the AOE combo based on the last action used. - private AID NextFullAOE() => ComboLastMove switch + private AID FullAOE() => ComboLastMove switch { - //Start AOE combo with DoomSpike - AID.DoomSpike => - Unlocked(AID.SonicThrust) ? AID.SonicThrust : AID.DoomSpike, //SonicThrust if Unlocked, else DoomSpike - - //Continue AOE combo with SonicThrust - AID.SonicThrust => - Unlocked(AID.CoerthanTorment) ? AID.CoerthanTorment : AID.DoomSpike, //CoerthanTorment if Unlocked, else DoomSpike - - //if Draconian Fire buff is up, use DraconianFury - _ => PlayerHasEffect(SID.DraconianFire) - ? Unlocked(AID.DraconianFury) ? AID.DraconianFury : AID.DoomSpike //DraconianFury if Unlocked, else DoomSpike - : AID.DoomSpike, //No DraconianFire active, default to DoomSpike + AID.DoomSpike => Unlocked(AID.SonicThrust) ? AID.SonicThrust : AID.DoomSpike, + AID.SonicThrust => Unlocked(AID.CoerthanTorment) ? AID.CoerthanTorment : AID.DoomSpike, + _ => PlayerHasEffect(SID.DraconianFire) ? AID.DraconianFury : AID.DoomSpike, }; - #endregion #endregion @@ -644,7 +512,7 @@ ptStrat is PiercingTalonStrategy.Force or PiercingTalonStrategy.ForceEX }; private bool ShouldUseWyrmwindThrust(OGCDStrategy strategy, Actor? target) => strategy switch { - OGCDStrategy.Automatic => Player.InCombat && target != null && In15y(target) && canWT && lcCD > GCDLength * 2, + OGCDStrategy.Automatic => Player.InCombat && target != null && In15y(target) && canWT && lcCD > SkSGCDLength * 2, OGCDStrategy.Force => canWT, OGCDStrategy.AnyWeave => canWT && CanWeaveIn, OGCDStrategy.EarlyWeave => canWT && CanEarlyWeaveIn, @@ -691,15 +559,15 @@ ptStrat is PiercingTalonStrategy.Force or PiercingTalonStrategy.ForceEX }; private bool ShouldUseTrueNorth(TrueNorthStrategy strategy, Actor? target) => strategy switch { - TrueNorthStrategy.Automatic => target != null && Player.InCombat && !PlayerHasEffect(SID.TrueNorth) && GCD < 1.25f && + TrueNorthStrategy.Automatic => target != null && Player.InCombat && CanTrueNorth && GCD < 1.25f && (!IsOnRear(target) && ComboLastMove is AID.Disembowel or AID.SpiralBlow or AID.ChaosThrust or AID.ChaoticSpring || !IsOnFlank(target) && ComboLastMove is AID.HeavensThrust or AID.FullThrust), - TrueNorthStrategy.ASAP => target != null && Player.InCombat && !PlayerHasEffect(SID.TrueNorth) && + TrueNorthStrategy.ASAP => target != null && Player.InCombat && CanTrueNorth && (!IsOnRear(target) && ComboLastMove is AID.Disembowel or AID.SpiralBlow or AID.ChaosThrust or AID.ChaoticSpring || !IsOnFlank(target) && ComboLastMove is AID.HeavensThrust or AID.FullThrust), - TrueNorthStrategy.Flank => target != null && Player.InCombat && !PlayerHasEffect(SID.TrueNorth) && GCD < 1.25f && + TrueNorthStrategy.Flank => target != null && Player.InCombat && CanTrueNorth && GCD < 1.25f && !IsOnFlank(target) && ComboLastMove is AID.HeavensThrust or AID.FullThrust, - TrueNorthStrategy.Rear => target != null && Player.InCombat && !PlayerHasEffect(SID.TrueNorth) && GCD < 1.25f && + TrueNorthStrategy.Rear => target != null && Player.InCombat && CanTrueNorth && GCD < 1.25f && !IsOnRear(target) && ComboLastMove is AID.Disembowel or AID.SpiralBlow or AID.ChaosThrust or AID.ChaoticSpring, TrueNorthStrategy.Force => !PlayerHasEffect(SID.TrueNorth), TrueNorthStrategy.Delay => false, diff --git a/BossMod/Autorotation/Standard/akechi/Tank/AkechiGNB.cs b/BossMod/Autorotation/Standard/akechi/Tank/AkechiGNB.cs index 3c2230576..014130707 100644 --- a/BossMod/Autorotation/Standard/akechi/Tank/AkechiGNB.cs +++ b/BossMod/Autorotation/Standard/akechi/Tank/AkechiGNB.cs @@ -10,7 +10,7 @@ public sealed class AkechiGNB(RotationModuleManager manager, Actor player) : Ake { #region Enums: Abilities / Strategies public enum Track { AOE, Cooldowns, Cartridges, Potion, LightningShot, NoMercy, SonicBreak, GnashingFang, Reign, Bloodfest, DoubleDown, Zone, BowShock } - public enum AOEStrategy { AutoFinishCombo, AutoBreakCombo, ForceSTwithO, ForceSTwithoutO, ForceAOEwithO, ForceAOEwithoutO, GenerateDowntime } + public enum AOEStrategy { AutoFinish, AutoBreak, ForceSTwithO, ForceSTwithoutO, ForceAOEwithO, ForceAOEwithoutO, GenerateDowntime } public enum CooldownStrategy { Allow, Forbid } public enum CartridgeStrategy { Automatic, OnlyBS, OnlyFC, ForceBS, ForceBS1, ForceBS2, ForceBS3, ForceFC, ForceFC1, ForceFC2, ForceFC3, Conserve } public enum PotionStrategy { Manual, AlignWithRaidBuffs, Immediate } @@ -35,8 +35,8 @@ public static RotationModuleDefinition Definition() 100); //Level supported res.Define(Track.AOE).As("AOE", uiPriority: 200) - .AddOption(AOEStrategy.AutoFinishCombo, "Auto (Finish Combo)", "Auto-selects best rotation dependant on targets; Finishes combo first", supportedTargets: ActionTargets.Hostile) - .AddOption(AOEStrategy.AutoBreakCombo, "Auto (Break Combo)", "Auto-selects best rotation dependant on targets; Breaks combo if needed", supportedTargets: ActionTargets.Hostile) + .AddOption(AOEStrategy.AutoFinish, "Auto (Finish combo)", "Automatically execute optimal rotation based on targets; finishes combo if possible", supportedTargets: ActionTargets.Hostile) + .AddOption(AOEStrategy.AutoBreak, "Auto (Break combo)", "Automatically execute optimal rotation based on targets; breaks combo if necessary", supportedTargets: ActionTargets.Hostile) .AddOption(AOEStrategy.ForceSTwithO, "Force ST with Overcap", "Force single-target rotation with overcap protection", supportedTargets: ActionTargets.Hostile) .AddOption(AOEStrategy.ForceSTwithoutO, "Force ST without Overcap", "Force ST rotation without overcap protection", supportedTargets: ActionTargets.Hostile) .AddOption(AOEStrategy.ForceAOEwithO, "Force AOE with Overcap", "Force AOE rotation with overcap protection") @@ -350,7 +350,7 @@ public override void Execution(StrategyValues strategy, Enemy? primaryTarget) #endregion #region Standard Execution - if (AOEStrategy == AOEStrategy.AutoBreakCombo) //if Break Combo option is selected + if (AOEStrategy == AOEStrategy.AutoBreak) //if Break Combo option is selected { if (ShouldUseAOE) //if AOE rotation should be used QueueGCD(AOEwithoutOvercap(), //queue the next AOE combo action @@ -362,7 +362,7 @@ public override void Execution(StrategyValues strategy, Enemy? primaryTarget) ?? primaryTarget?.Actor, //if none, choose primary target GCDPriority.Standard); //with priority for 123/12 combo actions } - if (AOEStrategy == AOEStrategy.AutoFinishCombo) //if Finish Combo option is selected + if (AOEStrategy == AOEStrategy.AutoFinish) //if Finish Combo option is selected { QueueGCD(BestRotation(), //queue the next single-target combo action only if combo is finished TargetChoice(AOE) //Get target choice