From f1a2ec6ef7c6c0b9002ae0bdf3250191dff859b1 Mon Sep 17 00:00:00 2001 From: Rabalaba Date: Sun, 24 Nov 2024 16:01:37 -0800 Subject: [PATCH] Getting Ready for API 4 Api 4 changes --- .../Job_Helpers/Enums/OpenerState.cs | 10 - Advanced_Rotations/Job_Helpers/MCH.cs | 548 --------------- Advanced_Rotations/Job_Helpers/NIN.cs | 642 ------------------ Advanced_Rotations/Job_Helpers/actionstuff.cs | 12 - Advanced_Rotations/PVE/Melee/DRG_PVE.cs | 133 ---- Advanced_Rotations/PVE/Melee/NIN_PVE.cs | 348 ---------- Advanced_Rotations/PVE/Melee/SAM_PVE.cs | 203 ------ Advanced_Rotations/PVE/Melee/VPR_PVE.cs | 274 -------- .../PVE/Ranged_Magic/BLM_Default.cs | 379 +++-------- Advanced_Rotations/PVE/Ranged_Magic/PCT.cs | 283 -------- Advanced_Rotations/PVE/Ranged_Phys/BRD.cs | 236 ------- Advanced_Rotations/PVE/Ranged_Phys/DNC_PVE.cs | 158 ----- Advanced_Rotations/PVE/Ranged_Phys/MCH.cs | 250 ------- Advanced_Rotations/PVE/Tank/GNB_PVE.cs | 245 ------- Advanced_Rotations/PVP/Melee/SAM.cs | 139 ---- Advanced_Rotations/PVP/Ranged_Magic/PCT.cs | 133 ---- Advanced_Rotations/RabbsRotationsNET8.csproj | 8 +- 17 files changed, 93 insertions(+), 3908 deletions(-) delete mode 100644 Advanced_Rotations/Job_Helpers/Enums/OpenerState.cs delete mode 100644 Advanced_Rotations/Job_Helpers/MCH.cs delete mode 100644 Advanced_Rotations/Job_Helpers/NIN.cs delete mode 100644 Advanced_Rotations/Job_Helpers/actionstuff.cs delete mode 100644 Advanced_Rotations/PVE/Melee/DRG_PVE.cs delete mode 100644 Advanced_Rotations/PVE/Melee/NIN_PVE.cs delete mode 100644 Advanced_Rotations/PVE/Melee/SAM_PVE.cs delete mode 100644 Advanced_Rotations/PVE/Melee/VPR_PVE.cs delete mode 100644 Advanced_Rotations/PVE/Ranged_Magic/PCT.cs delete mode 100644 Advanced_Rotations/PVE/Ranged_Phys/BRD.cs delete mode 100644 Advanced_Rotations/PVE/Ranged_Phys/DNC_PVE.cs delete mode 100644 Advanced_Rotations/PVE/Ranged_Phys/MCH.cs delete mode 100644 Advanced_Rotations/PVE/Tank/GNB_PVE.cs delete mode 100644 Advanced_Rotations/PVP/Melee/SAM.cs delete mode 100644 Advanced_Rotations/PVP/Ranged_Magic/PCT.cs diff --git a/Advanced_Rotations/Job_Helpers/Enums/OpenerState.cs b/Advanced_Rotations/Job_Helpers/Enums/OpenerState.cs deleted file mode 100644 index 2dac9d8..0000000 --- a/Advanced_Rotations/Job_Helpers/Enums/OpenerState.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace RabbsRotations.JobHelpers -{ - internal enum OpenerState - { - PrePull, - InOpener, - OpenerFinished, - FailedOpener - } -} \ No newline at end of file diff --git a/Advanced_Rotations/Job_Helpers/MCH.cs b/Advanced_Rotations/Job_Helpers/MCH.cs deleted file mode 100644 index 4bed7e1..0000000 --- a/Advanced_Rotations/Job_Helpers/MCH.cs +++ /dev/null @@ -1,548 +0,0 @@ -using RabbsRotations.Job_Helpers; -using RabbsRotations.JobHelpers; - -/* -namespace RabbsRotations.JobHelpers -{ - internal class MCH : MachinistRotation - { - private bool HasCooldowns() - { - if (ReassemblePvE.Cooldown.CurrentCharges < 3) - return false; - if (GaussRoundPvE.Cooldown.CurrentCharges < 3) - return false; - if (!CustomComboFunctions.ActionReady(ChainSawPvE)) - return false; - if (!CustomComboFunctions.ActionReady(WildfirePvE)) - return false; - if (!CustomComboFunctions.ActionReady(BarrelStabilizerPvE)) - return false; - - return true; - } - - public bool HasPrePullCooldowns() - { - if (CustomComboFunctions.GetRemainingCharges(ReassemblePvE) == 0 && Config.MCH_ST_RotationSelection == 2) return false; - - return true; - } - - private static uint OpenerLevel => 90; - - public uint PrePullStep = 0; - - public uint OpenerStep = 1; - - public static bool LevelChecked => Player.Level >= OpenerLevel; - - private bool CanOpener => HasCooldowns() && HasPrePullCooldowns() && LevelChecked; - - private OpenerState currentState = OpenerState.PrePull; - - public OpenerState CurrentState - { - get - { - return currentState; - } - - set - { - if (value != currentState) - { - if (value == OpenerState.PrePull) - { - //Svc.Log.Debug($"Entered PrePull Opener"); - } - if (value == OpenerState.InOpener) OpenerStep = 1; - if (value == OpenerState.OpenerFinished || value == OpenerState.FailedOpener) - { - if (value == OpenerState.FailedOpener) - //Svc.Log.Information("Opener Failed"); - - ResetOpener(); - } - if (value == OpenerState.OpenerFinished) //Svc.Log.Information("Opener Finished"); - - currentState = value; - } - } - } - - private bool DoPrePullSteps(ref uint actionID) - { - if (!LevelChecked) return false; - - if (CanOpener && PrePullStep == 0) - { - PrePullStep = 1; - } - - if (!HasCooldowns()) - { - PrePullStep = 0; - } - - if (CurrentState == OpenerState.PrePull && PrePullStep > 0) - { - if (Config.MCH_ST_RotationSelection == 0 || Config.MCH_ST_RotationSelection == 1) - { - if (CustomComboFunctions.WasLastAction(HeatedSplitShot) && PrePullStep == 1) CurrentState = OpenerState.InOpener; - else if (PrePullStep == 1) actionID = HeatedSplitShot; - - if (ActionWatching.CombatActions.Count > 2 && CustomComboFunctions.InCombat()) - CurrentState = OpenerState.FailedOpener; - } - - if (Config.MCH_ST_RotationSelection == 2) - { - if (CustomComboFunctions.HasEffect(Buffs.Reassembled) && PrePullStep == 1) CurrentState = OpenerState.InOpener; - else if (PrePullStep == 1) actionID = Reassemble; - - if (PrePullStep == 2 && !CustomComboFunctions.HasEffect(Buffs.Reassembled)) - CurrentState = OpenerState.FailedOpener; - - if (ActionWatching.CombatActions.Count > 2 && CustomComboFunctions.InCombat()) - CurrentState = OpenerState.FailedOpener; - - } - return true; - } - - PrePullStep = 0; - return false; - } - - private bool DoOpener(ref uint actionID) - { - if (!LevelChecked) return false; - - if (currentState == OpenerState.InOpener) - { - if (Config.MCH_ST_RotationSelection == 0) - { - if (CustomComboFunctions.WasLastAction(GaussRound) && OpenerStep == 1) OpenerStep++; - else if (OpenerStep == 1) actionID = GaussRound; - - if (CustomComboFunctions.WasLastAction(Ricochet) && OpenerStep == 2) OpenerStep++; - else if (OpenerStep == 2) actionID = Ricochet; - - if (CustomComboFunctions.WasLastAction(Drill) && OpenerStep == 3) OpenerStep++; - else if (OpenerStep == 3) actionID = Drill; - - if (CustomComboFunctions.WasLastAction(BarrelStabilizer) && OpenerStep == 4) OpenerStep++; - else if (OpenerStep == 4) actionID = BarrelStabilizer; - - if (CustomComboFunctions.WasLastAction(HeatedSlugshot) && OpenerStep == 5) OpenerStep++; - else if (OpenerStep == 5) actionID = HeatedSlugshot; - - if (CustomComboFunctions.WasLastAction(GaussRound) && OpenerStep == 6) OpenerStep++; - else if (OpenerStep == 6) actionID = GaussRound; - - if (CustomComboFunctions.WasLastAction(HeatedCleanShot) && OpenerStep == 7) OpenerStep++; - else if (OpenerStep == 7) actionID = HeatedCleanShot; - - if (CustomComboFunctions.WasLastAction(Reassemble) && OpenerStep == 8) OpenerStep++; - else if (OpenerStep == 8) actionID = Reassemble; - - if (CustomComboFunctions.WasLastAction(Ricochet) && OpenerStep == 9) OpenerStep++; - else if (OpenerStep == 9) actionID = Ricochet; - - if (CustomComboFunctions.WasLastAction(AirAnchor) && OpenerStep == 10) OpenerStep++; - else if (OpenerStep == 10) actionID = AirAnchor; - - if (CustomComboFunctions.WasLastAction(Reassemble) && OpenerStep == 11) OpenerStep++; - else if (OpenerStep == 11) actionID = Reassemble; - - if (CustomComboFunctions.WasLastAction(Wildfire) && OpenerStep == 12) OpenerStep++; - else if (OpenerStep == 12) actionID = Wildfire; - - if (CustomComboFunctions.WasLastAction(ChainSaw) && OpenerStep == 13) OpenerStep++; - else if (OpenerStep == 13) actionID = ChainSaw; - - if (CustomComboFunctions.WasLastAction(AutomatonQueen) && OpenerStep == 14) OpenerStep++; - else if (OpenerStep == 14) actionID = AutomatonQueen; - - if (CustomComboFunctions.WasLastAction(Hypercharge) && OpenerStep == 15) OpenerStep++; - else if (OpenerStep == 15) actionID = Hypercharge; - - if (CustomComboFunctions.WasLastAction(HeatBlast) && CustomComboFunctions.GetBuffStacks(Buffs.Overheated) == 4 && OpenerStep == 16) OpenerStep++; - else if (OpenerStep == 16) actionID = HeatBlast; - - if (CustomComboFunctions.WasLastAction(GaussRound) && OpenerStep == 17) OpenerStep++; - else if (OpenerStep == 17) actionID = GaussRound; - - if (CustomComboFunctions.WasLastAction(HeatBlast) && CustomComboFunctions.GetBuffStacks(Buffs.Overheated) == 3 && OpenerStep == 18) OpenerStep++; - else if (OpenerStep == 18) actionID = HeatBlast; - - if (CustomComboFunctions.WasLastAction(Ricochet) && OpenerStep == 19) OpenerStep++; - else if (OpenerStep == 19) actionID = Ricochet; - - if (CustomComboFunctions.WasLastAction(HeatBlast) && CustomComboFunctions.GetBuffStacks(Buffs.Overheated) == 2 && OpenerStep == 20) OpenerStep++; - else if (OpenerStep == 20) actionID = HeatBlast; - - if (CustomComboFunctions.WasLastAction(GaussRound) && OpenerStep == 21) OpenerStep++; - else if (OpenerStep == 21) actionID = GaussRound; - - if (CustomComboFunctions.WasLastAction(HeatBlast) && CustomComboFunctions.GetBuffStacks(Buffs.Overheated) == 1 && OpenerStep == 22) OpenerStep++; - else if (OpenerStep == 22) actionID = HeatBlast; - - if (CustomComboFunctions.WasLastAction(Ricochet) && OpenerStep == 23) OpenerStep++; - else if (OpenerStep == 23) actionID = Ricochet; - - if (CustomComboFunctions.WasLastAction(HeatBlast) && CustomComboFunctions.GetBuffStacks(Buffs.Overheated) == 0 && OpenerStep == 24) OpenerStep++; - else if (OpenerStep == 24) actionID = HeatBlast; - - if (CustomComboFunctions.WasLastAction(Ricochet) && OpenerStep == 25) OpenerStep++; - else if (OpenerStep == 25) actionID = Ricochet; - - if (CustomComboFunctions.WasLastAction(Drill) && OpenerStep == 26) CurrentState = OpenerState.OpenerFinished; - else if (OpenerStep == 26) actionID = Drill; - - if (ActionWatching.TimeSinceLastAction.TotalSeconds >= 5) - CurrentState = OpenerState.FailedOpener; - - if (((actionID == Ricochet && ReassemblePvE.Cooldown.CurrentCharges < 3) || - (actionID == ChainSaw && CustomComboFunctions.IsOnCooldown(ChainSaw)) || - (actionID == Wildfire && CustomComboFunctions.IsOnCooldown(Wildfire)) || - (actionID == BarrelStabilizer && CustomComboFunctions.IsOnCooldown(BarrelStabilizer)) || - (actionID == GaussRound && GaussRoundPvE.Cooldown.CurrentCharges < 3)) && ActionWatching.TimeSinceLastAction.TotalSeconds >= 3) - { - CurrentState = OpenerState.FailedOpener; - return false; - } - } - - else if (Config.MCH_ST_RotationSelection == 1) - { - if (CustomComboFunctions.WasLastAction(GaussRound) && OpenerStep == 1) OpenerStep++; - else if (OpenerStep == 1) actionID = GaussRound; - - if (CustomComboFunctions.WasLastAction(Ricochet) && OpenerStep == 2) OpenerStep++; - else if (OpenerStep == 2) actionID = Ricochet; - - if (CustomComboFunctions.WasLastAction(HeatedSlugshot) && OpenerStep == 3) OpenerStep++; - else if (OpenerStep == 3) actionID = HeatedSlugshot; - - if (CustomComboFunctions.WasLastAction(BarrelStabilizer) && OpenerStep == 4) OpenerStep++; - else if (OpenerStep == 4) actionID = BarrelStabilizer; - - if (CustomComboFunctions.WasLastAction(HeatedCleanShot) && OpenerStep == 5) OpenerStep++; - else if (OpenerStep == 5) actionID = HeatedCleanShot; - - if (CustomComboFunctions.WasLastAction(AirAnchor) && OpenerStep == 6) OpenerStep++; - else if (OpenerStep == 6) actionID = AirAnchor; - - if (CustomComboFunctions.WasLastAction(Reassemble) && OpenerStep == 7) OpenerStep++; - else if (OpenerStep == 7) actionID = Reassemble; - - if (CustomComboFunctions.WasLastAction(GaussRound) && OpenerStep == 8) OpenerStep++; - else if (OpenerStep == 8) actionID = GaussRound; - - if (CustomComboFunctions.WasLastAction(Drill) && OpenerStep == 9) OpenerStep++; - else if (OpenerStep == 9) actionID = Drill; - - if (CustomComboFunctions.WasLastAction(Reassemble) && OpenerStep == 10) OpenerStep++; - else if (OpenerStep == 10) actionID = Reassemble; - - if (CustomComboFunctions.WasLastAction(Wildfire) && OpenerStep == 11) OpenerStep++; - else if (OpenerStep == 11) actionID = Wildfire; - - if (CustomComboFunctions.WasLastAction(ChainSaw) && OpenerStep == 12) OpenerStep++; - else if (OpenerStep == 12) actionID = ChainSaw; - - if (CustomComboFunctions.WasLastAction(AutomatonQueen) && OpenerStep == 13) OpenerStep++; - else if (OpenerStep == 13) actionID = AutomatonQueen; - - if (CustomComboFunctions.WasLastAction(Hypercharge) && OpenerStep == 14) OpenerStep++; - else if (OpenerStep == 14) actionID = Hypercharge; - - if (CustomComboFunctions.WasLastAction(HeatBlast) && CustomComboFunctions.GetBuffStacks(Buffs.Overheated) == 4 && OpenerStep == 15) OpenerStep++; - else if (OpenerStep == 15) actionID = HeatBlast; - - if (CustomComboFunctions.WasLastAction(Ricochet) && OpenerStep == 16) OpenerStep++; - else if (OpenerStep == 16) actionID = Ricochet; - - if (CustomComboFunctions.WasLastAction(HeatBlast) && CustomComboFunctions.GetBuffStacks(Buffs.Overheated) == 3 && OpenerStep == 17) OpenerStep++; - else if (OpenerStep == 17) actionID = HeatBlast; - - if (CustomComboFunctions.WasLastAction(GaussRound) && OpenerStep == 18) OpenerStep++; - else if (OpenerStep == 18) actionID = GaussRound; - - if (CustomComboFunctions.WasLastAction(HeatBlast) && CustomComboFunctions.GetBuffStacks(Buffs.Overheated) == 2 && OpenerStep == 19) OpenerStep++; - else if (OpenerStep == 19) actionID = HeatBlast; - - if (CustomComboFunctions.WasLastAction(Ricochet) && OpenerStep == 20) OpenerStep++; - else if (OpenerStep == 20) actionID = Ricochet; - - if (CustomComboFunctions.WasLastAction(HeatBlast) && CustomComboFunctions.GetBuffStacks(Buffs.Overheated) == 1 && OpenerStep == 21) OpenerStep++; - else if (OpenerStep == 21) actionID = HeatBlast; - - if (CustomComboFunctions.WasLastAction(GaussRound) && OpenerStep == 22) OpenerStep++; - else if (OpenerStep == 22) actionID = GaussRound; - - if (CustomComboFunctions.WasLastAction(HeatBlast) && CustomComboFunctions.GetBuffStacks(Buffs.Overheated) == 0 && OpenerStep == 23) OpenerStep++; - else if (OpenerStep == 23) actionID = HeatBlast; - - if (CustomComboFunctions.WasLastAction(Ricochet) && OpenerStep == 24) OpenerStep++; - else if (OpenerStep == 24) actionID = Ricochet; - - if (CustomComboFunctions.WasLastAction(HeatedSplitShot) && OpenerStep == 25) CurrentState = OpenerState.OpenerFinished; - else if (OpenerStep == 25) actionID = HeatedSplitShot; - - if (ActionWatching.TimeSinceLastAction.TotalSeconds >= 5) - CurrentState = OpenerState.FailedOpener; - - if (((actionID == Ricochet && ReassemblePvE.Cooldown.CurrentCharges < 3) || - (actionID == ChainSaw && CustomComboFunctions.IsOnCooldown(ChainSaw)) || - (actionID == Wildfire && CustomComboFunctions.IsOnCooldown(Wildfire)) || - (actionID == BarrelStabilizer && CustomComboFunctions.IsOnCooldown(BarrelStabilizer)) || - (actionID == GaussRound && GaussRoundPvE.Cooldown.CurrentCharges < 3)) && ActionWatching.TimeSinceLastAction.TotalSeconds >= 3) - { - CurrentState = OpenerState.FailedOpener; - return false; - } - } - - else - { - if (CustomComboFunctions.WasLastAction(AirAnchor) && OpenerStep == 1) OpenerStep++; - else if (OpenerStep == 1) actionID = AirAnchor; - - if (CustomComboFunctions.WasLastAction(GaussRound) && OpenerStep == 2) OpenerStep++; - else if (OpenerStep == 2) actionID = GaussRound; - - if (CustomComboFunctions.WasLastAction(Ricochet) && OpenerStep == 3) OpenerStep++; - else if (OpenerStep == 3) actionID = Ricochet; - - if (CustomComboFunctions.WasLastAction(Drill) && OpenerStep == 4) OpenerStep++; - else if (OpenerStep == 4) actionID = Drill; - - if (CustomComboFunctions.WasLastAction(BarrelStabilizer) && OpenerStep == 5) OpenerStep++; - else if (OpenerStep == 5) actionID = BarrelStabilizer; - - if (CustomComboFunctions.WasLastAction(Reassemble) && OpenerStep == 6) OpenerStep++; - else if (OpenerStep == 6) actionID = Reassemble; - - if (CustomComboFunctions.WasLastAction(ChainSaw) && OpenerStep == 7) OpenerStep++; - else if (OpenerStep == 7) actionID = ChainSaw; - - if (CustomComboFunctions.WasLastAction(GaussRound) && OpenerStep == 8) OpenerStep++; - else if (OpenerStep == 8) actionID = GaussRound; - - if (CustomComboFunctions.WasLastAction(Ricochet) && OpenerStep == 9) OpenerStep++; - else if (OpenerStep == 9) actionID = Ricochet; - - if (CustomComboFunctions.WasLastAction(HeatedSplitShot) && OpenerStep == 10) OpenerStep++; - else if (OpenerStep == 10) actionID = HeatedSplitShot; - - if (CustomComboFunctions.WasLastAction(GaussRound) && OpenerStep == 11) OpenerStep++; - else if (OpenerStep == 11) actionID = GaussRound; - - if (CustomComboFunctions.WasLastAction(HeatedSlugshot) && OpenerStep == 12) OpenerStep++; - else if (OpenerStep == 12) actionID = HeatedSlugshot; - - if (CustomComboFunctions.WasLastAction(Ricochet) && OpenerStep == 13) OpenerStep++; - else if (OpenerStep == 13) actionID = Ricochet; - - if (CustomComboFunctions.WasLastAction(Wildfire) && OpenerStep == 14) OpenerStep++; - else if (OpenerStep == 14) actionID = Wildfire; - - if (CustomComboFunctions.WasLastAction(HeatedCleanShot) && OpenerStep == 15) OpenerStep++; - else if (OpenerStep == 15) actionID = HeatedCleanShot; - - if (CustomComboFunctions.WasLastAction(AutomatonQueen) && OpenerStep == 16) OpenerStep++; - else if (OpenerStep == 16) actionID = AutomatonQueen; - - if (CustomComboFunctions.WasLastAction(Hypercharge) && OpenerStep == 17) OpenerStep++; - else if (OpenerStep == 17) actionID = Hypercharge; - - if (CustomComboFunctions.WasLastAction(HeatBlast) && CustomComboFunctions.GetBuffStacks(Buffs.Overheated) == 4 && OpenerStep == 18) OpenerStep++; - else if (OpenerStep == 18) actionID = HeatBlast; - - if (CustomComboFunctions.WasLastAction(GaussRound) && OpenerStep == 19) OpenerStep++; - else if (OpenerStep == 19) actionID = GaussRound; - - if (CustomComboFunctions.WasLastAction(HeatBlast) && CustomComboFunctions.GetBuffStacks(Buffs.Overheated) == 3 && OpenerStep == 20) OpenerStep++; - else if (OpenerStep == 20) actionID = HeatBlast; - - if (CustomComboFunctions.WasLastAction(Ricochet) && OpenerStep == 21) OpenerStep++; - else if (OpenerStep == 21) actionID = Ricochet; - - if (CustomComboFunctions.WasLastAction(HeatBlast) && CustomComboFunctions.GetBuffStacks(Buffs.Overheated) == 2 && OpenerStep == 22) OpenerStep++; - else if (OpenerStep == 22) actionID = HeatBlast; - - if (CustomComboFunctions.WasLastAction(GaussRound) && OpenerStep == 23) OpenerStep++; - else if (OpenerStep == 23) actionID = GaussRound; - - if (CustomComboFunctions.WasLastAction(HeatBlast) && CustomComboFunctions.GetBuffStacks(Buffs.Overheated) == 1 && OpenerStep == 24) OpenerStep++; - else if (OpenerStep == 24) actionID = HeatBlast; - - if (CustomComboFunctions.WasLastAction(Ricochet) && OpenerStep == 25) OpenerStep++; - else if (OpenerStep == 25) actionID = Ricochet; - - if (CustomComboFunctions.WasLastAction(HeatBlast) && CustomComboFunctions.GetBuffStacks(Buffs.Overheated) == 0 && OpenerStep == 26) CurrentState = OpenerState.OpenerFinished; - else if (OpenerStep == 26) actionID = HeatBlast; - } - - if (ActionWatching.TimeSinceLastAction.TotalSeconds >= 5) - CurrentState = OpenerState.FailedOpener; - - if (((actionID == Ricochet && ReassemblePvE.Cooldown.CurrentCharges < 3) || - (actionID == ChainSaw && CustomComboFunctions.IsOnCooldown(ChainSaw)) || - (actionID == Wildfire && CustomComboFunctions.IsOnCooldown(Wildfire)) || - (actionID == BarrelStabilizer && CustomComboFunctions.IsOnCooldown(BarrelStabilizer)) || - (actionID == GaussRound && GaussRoundPvE.Cooldown.CurrentCharges < 3)) && ActionWatching.TimeSinceLastAction.TotalSeconds >= 3) - { - CurrentState = OpenerState.FailedOpener; - return false; - } - - return true; - } - - return false; - } - - private bool DoOpenerSimple(ref uint actionID) - { - if (!LevelChecked) return false; - - if (currentState == OpenerState.InOpener) - { - if (CustomComboFunctions.WasLastAction(GaussRound) && OpenerStep == 1) OpenerStep++; - else if (OpenerStep == 1) actionID = GaussRound; - - if (CustomComboFunctions.WasLastAction(Ricochet) && OpenerStep == 2) OpenerStep++; - else if (OpenerStep == 2) actionID = Ricochet; - - if (CustomComboFunctions.WasLastAction(Drill) && OpenerStep == 3) OpenerStep++; - else if (OpenerStep == 3) actionID = Drill; - - if (CustomComboFunctions.WasLastAction(BarrelStabilizer) && OpenerStep == 4) OpenerStep++; - else if (OpenerStep == 4) actionID = BarrelStabilizer; - - if (CustomComboFunctions.WasLastAction(HeatedSlugshot) && OpenerStep == 5) OpenerStep++; - else if (OpenerStep == 5) actionID = HeatedSlugshot; - - if (CustomComboFunctions.WasLastAction(Ricochet) && OpenerStep == 6) OpenerStep++; - else if (OpenerStep == 6) actionID = Ricochet; - - if (CustomComboFunctions.WasLastAction(HeatedCleanShot) && OpenerStep == 7) OpenerStep++; - else if (OpenerStep == 7) actionID = HeatedCleanShot; - - if (CustomComboFunctions.WasLastAction(Reassemble) && OpenerStep == 8) OpenerStep++; - else if (OpenerStep == 8) actionID = Reassemble; - - if (CustomComboFunctions.WasLastAction(GaussRound) && OpenerStep == 9) OpenerStep++; - else if (OpenerStep == 9) actionID = GaussRound; - - if (CustomComboFunctions.WasLastAction(AirAnchor) && OpenerStep == 10) OpenerStep++; - else if (OpenerStep == 10) actionID = AirAnchor; - - if (CustomComboFunctions.WasLastAction(Reassemble) && OpenerStep == 11) OpenerStep++; - else if (OpenerStep == 11) actionID = Reassemble; - - if (CustomComboFunctions.WasLastAction(Wildfire) && OpenerStep == 12) OpenerStep++; - else if (OpenerStep == 12) actionID = Wildfire; - - if (CustomComboFunctions.WasLastAction(ChainSaw) && OpenerStep == 13) OpenerStep++; - else if (OpenerStep == 13) actionID = ChainSaw; - - if (CustomComboFunctions.WasLastAction(AutomatonQueen) && OpenerStep == 14) OpenerStep++; - else if (OpenerStep == 14) actionID = AutomatonQueen; - - if (CustomComboFunctions.WasLastAction(Hypercharge) && OpenerStep == 15) OpenerStep++; - else if (OpenerStep == 15) actionID = Hypercharge; - - if (CustomComboFunctions.WasLastAction(HeatBlast) && CustomComboFunctions.GetBuffStacks(Buffs.Overheated) == 4 && OpenerStep == 16) OpenerStep++; - else if (OpenerStep == 16) actionID = HeatBlast; - - if (CustomComboFunctions.WasLastAction(Ricochet) && OpenerStep == 17) OpenerStep++; - else if (OpenerStep == 17) actionID = Ricochet; - - if (CustomComboFunctions.WasLastAction(HeatBlast) && CustomComboFunctions.GetBuffStacks(Buffs.Overheated) == 3 && OpenerStep == 18) OpenerStep++; - else if (OpenerStep == 18) actionID = HeatBlast; - - if (CustomComboFunctions.WasLastAction(GaussRound) && OpenerStep == 19) OpenerStep++; - else if (OpenerStep == 19) actionID = GaussRound; - - if (CustomComboFunctions.WasLastAction(HeatBlast) && CustomComboFunctions.GetBuffStacks(Buffs.Overheated) == 2 && OpenerStep == 20) OpenerStep++; - else if (OpenerStep == 20) actionID = HeatBlast; - - if (CustomComboFunctions.WasLastAction(Ricochet) && OpenerStep == 21) OpenerStep++; - else if (OpenerStep == 21) actionID = Ricochet; - - if (CustomComboFunctions.WasLastAction(HeatBlast) && CustomComboFunctions.GetBuffStacks(Buffs.Overheated) == 1 && OpenerStep == 22) OpenerStep++; - else if (OpenerStep == 22) actionID = HeatBlast; - - if (CustomComboFunctions.WasLastAction(GaussRound) && OpenerStep == 23) OpenerStep++; - else if (OpenerStep == 23) actionID = GaussRound; - - if (CustomComboFunctions.WasLastAction(HeatBlast) && CustomComboFunctions.GetBuffStacks(Buffs.Overheated) == 0 && OpenerStep == 24) OpenerStep++; - else if (OpenerStep == 24) actionID = HeatBlast; - - if (CustomComboFunctions.WasLastAction(Ricochet) && OpenerStep == 25) OpenerStep++; - else if (OpenerStep == 25) actionID = Ricochet; - - if (CustomComboFunctions.WasLastAction(Drill) && OpenerStep == 26) CurrentState = OpenerState.OpenerFinished; - else if (OpenerStep == 26) actionID = Drill; - - if (ActionWatching.TimeSinceLastAction.TotalSeconds >= 5) - CurrentState = OpenerState.FailedOpener; - - if (((actionID == Ricochet && ReassemblePvE.Cooldown.CurrentCharges < 3) || - (actionID == ChainSaw && CustomComboFunctions.IsOnCooldown(ChainSaw)) || - (actionID == Wildfire && CustomComboFunctions.IsOnCooldown(Wildfire)) || - (actionID == BarrelStabilizer && CustomComboFunctions.IsOnCooldown(BarrelStabilizer)) || - (actionID == GaussRound && GaussRoundPvE.Cooldown.CurrentCharges < 3)) && ActionWatching.TimeSinceLastAction.TotalSeconds >= 3) - { - CurrentState = OpenerState.FailedOpener; - return false; - } - - return true; - } - return false; - } - - private void ResetOpener() - { - PrePullStep = 0; - OpenerStep = 0; - } - - public bool DoFullOpener(bool simpleMode, out uint openerId) - { - openerId = 0; - if (!LevelChecked) return false; - - if (CurrentState == OpenerState.PrePull) - if (DoPrePullSteps(ref openerId)) return true; - - if (CurrentState == OpenerState.InOpener) - { - if (simpleMode) - { - if (DoOpenerSimple(ref openerId)) return true; - } - else - { - if (DoOpener(ref openerId)) return true; - } - } - - if (!CustomComboFunctions.InCombat()) - { - ResetOpener(); - CurrentState = OpenerState.PrePull; - } - - - return false; - } - } -} -*/ \ No newline at end of file diff --git a/Advanced_Rotations/Job_Helpers/NIN.cs b/Advanced_Rotations/Job_Helpers/NIN.cs deleted file mode 100644 index d94ddbb..0000000 --- a/Advanced_Rotations/Job_Helpers/NIN.cs +++ /dev/null @@ -1,642 +0,0 @@ -using Dalamud.Game.ClientState.Conditions; -using Dalamud.Game.ClientState.JobGauge.Types; -using RotationSolver.Basic.Actions; - - -namespace RabbsRotations.JobHelpers -{ - internal class NIN - { - internal class MudraCasting : NinjaRotation - { - - /// Checks if the player is in a state to be able to cast a ninjitsu. - public bool CanCast() - { - var gcd = WeaponTotal; - - if (gcd == 0.5) return true; - - if (TenPvE.Cooldown.CurrentCharges == 0 && - !Player.HasStatus(true, StatusID.Mudra) && - !Player.HasStatus(true, StatusID.Kassatsu)) - return false; - - return true; - } - - - private MudraState currentMudra = MudraState.None; - public MudraState CurrentMudra - { - get - { - return currentMudra; - } - set - { - if (value == MudraState.None) - { - justResetMudra = true; - } - else - { - justResetMudra = false; - } - - currentMudra = value; - } - } - - /// Simple method of casting Fuma Shuriken. - /// The actionID from the combo. - /// True if in a state to cast or continue the ninjitsu, modifies actionID to the step of the ninjitsu. - public bool CastFumaShuriken(out uint actionID) - { - if (FumaShurikenPvE.EnoughLevel && CurrentMudra is MudraState.None or MudraState.CastingFumaShuriken) - { - if (!CanCast()) - { - CurrentMudra = MudraState.None; - actionID = 0; - return false; - } - - if (AdjustId(NinjutsuPvE.ID) == FumaShurikenPvE.ID) - { - actionID = AdjustId(NinjutsuPvE.ID); - return true; - } - - actionID = AdjustId(TenPvE.ID); - CurrentMudra = MudraState.CastingFumaShuriken; - return true; - } - - CurrentMudra = MudraState.None; - actionID = 0; - return false; - } - - - /// Simple method of casting Raiton. - /// The actionID from the combo. - /// True if in a state to cast or continue the ninjitsu, modifies actionID to the step of the ninjitsu. - public bool CastRaiton(out uint actionID) - { - if (RaitonPvE.EnoughLevel && CurrentMudra is MudraState.None or MudraState.CastingRaiton) - { - if (!CanCast()) - { - CurrentMudra = MudraState.None; - actionID = 0; - return false; - } - - if (AdjustId(NinjutsuPvE.ID) == FumaShurikenPvE.ID) - { - actionID = AdjustId(ChiPvE.ID); - return true; - } - - if (AdjustId(NinjutsuPvE.ID) == RaitonPvE.ID) - { - actionID = AdjustId(NinjutsuPvE.ID); - return true; - } - - actionID = AdjustId(TenPvE.ID); - CurrentMudra = MudraState.CastingRaiton; - return true; - } - - CurrentMudra = MudraState.None; - actionID = 0; - return false; - } - - /// Simple method of casting Katon. - /// The actionID from the combo. - /// True if in a state to cast or continue the ninjitsu, modifies actionID to the step of the ninjitsu. - public bool CastKaton(out uint actionID) - { - if (KatonPvE.EnoughLevel && CurrentMudra is MudraState.None or MudraState.CastingKaton) - { - if (!CanCast()) - { - CurrentMudra = MudraState.None; - actionID = 0; - return false; - } - - if (AdjustId(NinjutsuPvE.ID) == FumaShurikenPvE.ID) - { - actionID = AdjustId(TenPvE.ID); - return true; - } - - if (AdjustId(NinjutsuPvE.ID) == KatonPvE.ID) - { - actionID = AdjustId(NinjutsuPvE.ID); - return true; - } - - actionID = AdjustId(ChiPvE.ID); - CurrentMudra = MudraState.CastingKaton; - return true; - } - - CurrentMudra = MudraState.None; - actionID = 0; - return false; - } - - /// Simple method of casting Hyoton. - /// The actionID from the combo. - /// True if in a state to cast or continue the ninjitsu, modifies actionID to the step of the ninjitsu. - public bool CastHyoton(out uint actionID) - { - if (HyotonPvE.EnoughLevel && CurrentMudra is MudraState.None or MudraState.CastingHyoton) - { - if (!CanCast() || Player.HasStatus(true, StatusID.Kassatsu)) - { - CurrentMudra = MudraState.None; - actionID = 0; - return false; - } - - if (AdjustId(NinjutsuPvE.ID) == FumaShurikenPvE.ID) - { - actionID = AdjustId(JinPvE.ID); - return true; - } - - if (AdjustId(NinjutsuPvE.ID) == HyotonPvE.ID) - { - actionID = AdjustId(NinjutsuPvE.ID); - return true; - } - - actionID = AdjustId(TenPvE.ID); - CurrentMudra = MudraState.CastingHyoton; - return true; - } - - CurrentMudra = MudraState.None; - actionID = 0; - return false; - } - - /// Simple method of casting Huton. - /// The actionID from the combo. - /// True if in a state to cast or continue the ninjitsu, modifies actionID to the step of the ninjitsu. - public bool CastHuton(out uint actionID) - { - if (HutonPvE.EnoughLevel && CurrentMudra is MudraState.None or MudraState.CastingHuton) - { - if (!CanCast()) - { - CurrentMudra = MudraState.None; - actionID = 0; - return false; - } - - if (AdjustId(NinjutsuPvE.ID) == FumaShurikenPvE.ID) - { - actionID = AdjustId(JinPvE.ID); - return true; - } - - if (AdjustId(NinjutsuPvE.ID) == HyotonPvE.ID) - { - actionID = AdjustId(TenPvE.ID); - return true; - } - - if (AdjustId(NinjutsuPvE.ID) == HutonPvE.ID) - { - actionID = AdjustId(NinjutsuPvE.ID); - return true; - } - - actionID = AdjustId(ChiPvE.ID); - CurrentMudra = MudraState.CastingHuton; - return true; - } - - CurrentMudra = MudraState.None; - actionID = 0; - return false; - } - - /// Simple method of casting Doton. - /// The actionID from the combo. - /// True if in a state to cast or continue the ninjitsu, modifies actionID to the step of the ninjitsu. - public bool CastDoton(out uint actionID) - { - if (DotonPvE.EnoughLevel && CurrentMudra is MudraState.None or MudraState.CastingDoton) - { - if (!CanCast()) - { - CurrentMudra = MudraState.None; - actionID = 0; - return false; - } - - if (AdjustId(NinjutsuPvE.ID) == FumaShurikenPvE.ID) - { - actionID = AdjustId(JinPvE.ID); - return true; - } - - if (AdjustId(NinjutsuPvE.ID) == HyotonPvE.ID) - { - actionID = AdjustId(ChiPvE.ID); - return true; - } - - if (AdjustId(NinjutsuPvE.ID) == DotonPvE.ID) - { - actionID = AdjustId(NinjutsuPvE.ID); - return true; - } - - actionID = AdjustId(TenPvE.ID); - CurrentMudra = MudraState.CastingDoton; - return true; - } - - CurrentMudra = MudraState.None; - actionID = 0; - return false; - } - - /// Simple method of casting Suiton. - /// The actionID from the combo. - /// True if in a state to cast or continue the ninjitsu, modifies actionID to the step of the ninjitsu. - public bool CastSuiton(out uint actionID) - { - if (SuitonPvE.EnoughLevel && CurrentMudra is MudraState.None or MudraState.CastingSuiton) - { - if (!CanCast()) - { - CurrentMudra = MudraState.None; - actionID = 0; - return false; - } - - if (AdjustId(NinjutsuPvE.ID) == FumaShurikenPvE.ID) - { - actionID = AdjustId(ChiPvE.ID); - return true; - } - - if (AdjustId(NinjutsuPvE.ID) == RaitonPvE.ID) - { - actionID = AdjustId(JinPvE.ID); - return true; - } - - if (AdjustId(NinjutsuPvE.ID) == SuitonPvE.ID) - { - actionID = AdjustId(NinjutsuPvE.ID); - return true; - } - - actionID = AdjustId(TenPvE.ID); - CurrentMudra = MudraState.CastingSuiton; - return true; - } - - CurrentMudra = MudraState.None; - actionID = 0; - return false; - } - - /// Simple method of casting Goka Mekkyaku. - /// The actionID from the combo. - /// True if in a state to cast or continue the ninjitsu, modifies actionID to the step of the ninjitsu. - public bool CastGokaMekkyaku(out uint actionID) - { - if (GokaMekkyakuPvE.EnoughLevel && CurrentMudra is MudraState.None or MudraState.CastingGokaMekkyaku) - { - if (!CanCast() || !Player.HasStatus(true, StatusID.Kassatsu)) - { - CurrentMudra = MudraState.None; - actionID = 0; - return false; - } - - if (AdjustId(NinjutsuPvE.ID) == FumaShurikenPvE.ID) - { - actionID = AdjustId(TenPvE.ID); - return true; - } - - if (AdjustId(NinjutsuPvE.ID) == GokaMekkyakuPvE.ID) - { - actionID = AdjustId(NinjutsuPvE.ID); - return true; - } - - actionID = AdjustId(ChiPvE.ID); - CurrentMudra = MudraState.CastingGokaMekkyaku; - return true; - } - - CurrentMudra = MudraState.None; - actionID = 0; - return false; - } - - /// Simple method of casting Hyosho Ranryu. - /// The actionID from the combo. - /// True if in a state to cast or continue the ninjitsu, modifies actionID to the step of the ninjitsu. - public bool CastHyoshoRanryu(out uint actionID) - { - if (HyoshoRanryuPvE.EnoughLevel && CurrentMudra is MudraState.None or MudraState.CastingHyoshoRanryu) - { - if (!CanCast() || !Player.HasStatus(true, StatusID.Kassatsu)) - { - CurrentMudra = MudraState.None; - actionID = 0; - return false; - } - - if (AdjustId(NinjutsuPvE.ID) == FumaShurikenPvE.ID) - { - actionID = JinPvE_18807.ID; - return true; - } - - if (AdjustId(NinjutsuPvE.ID) == HyoshoRanryuPvE.ID) - { - actionID = HyoshoRanryuPvE.ID; - return true; - } - - actionID = ChiPvE.ID; - CurrentMudra = MudraState.CastingHyoshoRanryu; - return true; - } - - CurrentMudra = MudraState.None; - actionID = 0; - return false; - } - - private bool justResetMudra = false; - public bool ContinueCurrentMudra(ref uint actionID) - { - - if ((RecordActions?.FirstOrDefault()?.Action.RowId == FumaShurikenPvE.ID || - RecordActions?.FirstOrDefault()?.Action.RowId == KatonPvE.ID || - RecordActions?.FirstOrDefault()?.Action.RowId == RaitonPvE.ID || - RecordActions?.FirstOrDefault()?.Action.RowId == HyotonPvE.ID || - RecordActions?.FirstOrDefault()?.Action.RowId == HutonPvE.ID || - RecordActions?.FirstOrDefault()?.Action.RowId == DotonPvE.ID || - RecordActions?.FirstOrDefault()?.Action.RowId == SuitonPvE.ID || - RecordActions?.FirstOrDefault()?.Action.RowId == GokaMekkyakuPvE.ID || - RecordActions?.FirstOrDefault()?.Action.RowId == HyotonPvE.ID) && - !justResetMudra) - CurrentMudra = MudraState.None; - - - return CurrentMudra switch - { - MudraState.None => false, - MudraState.CastingFumaShuriken => CastFumaShuriken(out actionID), - MudraState.CastingKaton => CastKaton(out actionID), - MudraState.CastingRaiton => CastRaiton(out actionID), - MudraState.CastingHyoton => CastHyoton(out actionID), - MudraState.CastingHuton => CastHuton(out actionID), - MudraState.CastingDoton => CastDoton(out actionID), - MudraState.CastingSuiton => CastSuiton(out actionID), - MudraState.CastingGokaMekkyaku => CastGokaMekkyaku(out actionID), - MudraState.CastingHyoshoRanryu => CastHyoshoRanryu(out actionID), - _ => false, - }; - } - - public enum MudraState - { - None, - CastingFumaShuriken, - CastingKaton, - CastingRaiton, - CastingHyoton, - CastingHuton, - CastingDoton, - CastingSuiton, - CastingGokaMekkyaku, - CastingHyoshoRanryu - - } - } - - internal class NINOpenerLogic : NinjaRotation - { - private bool HasCooldowns() - { - if (TenPvE.Cooldown.CurrentCharges < 1) return false; - if (MugPvE.Cooldown.IsCoolingDown) return false; - if (TenChiJinPvE.Cooldown.IsCoolingDown) return false; - if (PhantomKamaitachiPvE.Cooldown.IsCoolingDown) return false; - if (BunshinPvE.Cooldown.IsCoolingDown) return false; - if (DreamWithinADreamPvE.Cooldown.IsCoolingDown) return false; - if (KassatsuPvE.Cooldown.IsCoolingDown) return false; - - return true; - } - - private static uint OpenerLevel => 90; - - public uint PrePullStep = 1; - - public uint OpenerStep = 1; - - // public static bool LevelChecked => Player.Level >= OpenerLevel; - - // public bool CanOpener => HasCooldowns() && LevelChecked; - - private OpenerState currentState = OpenerState.OpenerFinished; - - public OpenerState CurrentState - { - get - { - return currentState; - } - set - { - if (value != currentState) - { - if (value == OpenerState.PrePull) PrePullStep = 1; - if (value == OpenerState.InOpener) OpenerStep = 1; - if (value == OpenerState.OpenerFinished || value == OpenerState.FailedOpener) { PrePullStep = 0; OpenerStep = 0; } - - currentState = value; - } - } - } - - private bool DoPrePullSteps(out uint actionID, MudraCasting mudraState) - { - actionID = 0; - //if (!LevelChecked) return false; - - - //if (CanOpener && PrePullStep == 0 && !InCombat) { CurrentState = OpenerState.PrePull; } - - if (CurrentState == OpenerState.PrePull) - { - if (TimeSinceLastAction.TotalSeconds > 5 && !InCombat) - { - mudraState.CastHuton(out actionID); - PrePullStep = 1; - return true; - } - - if (RecordActions?.FirstOrDefault()?.Action.RowId == HutonPvE.ID && PrePullStep == 1) PrePullStep++; - else if (PrePullStep == 1) mudraState.CastHuton(out actionID); - - if (RecordActions?.FirstOrDefault()?.Action.RowId == HidePvE.ID && PrePullStep == 2) PrePullStep++; - else if (PrePullStep == 2) { actionID = AdjustId(HidePvE.ID); } - - if (RecordActions?.FirstOrDefault()?.Action.RowId == SuitonPvE.ID && PrePullStep == 3) CurrentState = OpenerState.InOpener; - else if (PrePullStep == 3) mudraState.CastSuiton(out actionID); - - //Failure states - if (PrePullStep is (1 or 2) && InCombat) { mudraState.CurrentMudra = MudraCasting.MudraState.None; ResetOpener(); } - actionID = 0; - return true; - - } - - PrePullStep = 0; - actionID = 0; - return false; - } - - private bool DoOpener(out uint actionID, MudraCasting mudraState) - { - actionID = 0; - //if (!LevelChecked) return false; - - if (CurrentState == OpenerState.InOpener) - { - - if (RecordActions?.FirstOrDefault()?.Action.RowId == KassatsuPvE.ID && OpenerStep == 1) OpenerStep++; - else if (OpenerStep == 1) actionID = AdjustId(KassatsuPvE.ID); - - if (RecordActions?.FirstOrDefault()?.Action.RowId == SpinningEdgePvE.ID && OpenerStep == 2) OpenerStep++; - else if (OpenerStep == 2) actionID = AdjustId(SpinningEdgePvE.ID); - - if (RecordActions?.FirstOrDefault()?.Action.RowId == GustSlashPvE.ID && OpenerStep == 3) OpenerStep++; - else if (OpenerStep == 3) actionID = AdjustId(GustSlashPvE.ID); - - if (RecordActions?.FirstOrDefault()?.Action.RowId == MugPvE.ID && OpenerStep == 4) OpenerStep++; - else if (OpenerStep == 4) actionID = AdjustId(MugPvE.ID); - - if (RecordActions?.FirstOrDefault()?.Action.RowId == BunshinPvE.ID && OpenerStep == 5) OpenerStep++; - else if (OpenerStep == 5) actionID = AdjustId(BunshinPvE.ID); - - if (RecordActions?.FirstOrDefault()?.Action.RowId == PhantomKamaitachiPvE.ID && OpenerStep == 6) OpenerStep++; - else if (OpenerStep == 6) actionID = AdjustId(PhantomKamaitachiPvE.ID); - - if (RecordActions?.FirstOrDefault()?.Action.RowId == TrickAttackPvE.ID && OpenerStep == 7) OpenerStep++; - else if (OpenerStep == 7) actionID = AdjustId(TrickAttackPvE.ID); - - if (RecordActions?.FirstOrDefault()?.Action.RowId == AeolianEdgePvE.ID && OpenerStep == 8) OpenerStep++; - else if (OpenerStep == 8) actionID = AdjustId(AeolianEdgePvE.ID); - - if (RecordActions?.FirstOrDefault()?.Action.RowId == DreamWithinADreamPvE.ID && OpenerStep == 9) OpenerStep++; - else if (OpenerStep == 9) actionID = AdjustId(DreamWithinADreamPvE.ID); - - if (RecordActions?.FirstOrDefault()?.Action.RowId == HyoshoRanryuPvE.ID && OpenerStep == 10) OpenerStep++; - else if (OpenerStep == 10) mudraState.CastHyoshoRanryu(out actionID); - - if (RecordActions?.FirstOrDefault()?.Action.RowId == RaitonPvE.ID && OpenerStep == 11) OpenerStep++; - else if (OpenerStep == 11) mudraState.CastRaiton(out actionID); - - if (RecordActions?.FirstOrDefault()?.Action.RowId == TenChiJinPvE.ID && OpenerStep == 12) OpenerStep++; - else if (OpenerStep == 12) actionID = AdjustId(TenChiJinPvE.ID); - - if (RecordActions?.FirstOrDefault()?.Action.RowId == FumaShurikenPvE_18873.ID && OpenerStep == 13) OpenerStep++; - else if (OpenerStep == 13) actionID = AdjustId(TenPvE.ID); - - if (RecordActions?.FirstOrDefault()?.Action.RowId == RaitonPvE_18877.ID && OpenerStep == 14) OpenerStep++; - else if (OpenerStep == 14) actionID = AdjustId(ChiPvE.ID); - - if (RecordActions?.FirstOrDefault()?.Action.RowId == SuitonPvE_18881.ID && OpenerStep == 15) OpenerStep++; - else if (OpenerStep == 15) actionID = AdjustId(JinPvE.ID); - - if (RecordActions?.FirstOrDefault()?.Action.RowId == MeisuiPvE.ID && OpenerStep == 16) OpenerStep++; - else if (OpenerStep == 16) actionID = AdjustId(MeisuiPvE.ID); - - if (RecordActions?.FirstOrDefault()?.Action.RowId == FleetingRaijuPvE.ID && OpenerStep == 17) OpenerStep++; - else if (OpenerStep == 17) actionID = AdjustId(FleetingRaijuPvE.ID); - - if (RecordActions?.FirstOrDefault()?.Action.RowId == BhavacakraPvE.ID && OpenerStep == 18) OpenerStep++; - else if (OpenerStep == 18) actionID = AdjustId(BhavacakraPvE.ID); - - if (RecordActions?.FirstOrDefault()?.Action.RowId == FleetingRaijuPvE.ID && OpenerStep == 19) OpenerStep++; - else if (OpenerStep == 19) actionID = AdjustId(FleetingRaijuPvE.ID); - - if (RecordActions?.FirstOrDefault()?.Action.RowId == BhavacakraPvE.ID && OpenerStep == 20) CurrentState = OpenerState.OpenerFinished; - else if (OpenerStep == 20) actionID = AdjustId(BhavacakraPvE.ID); - - - //Failure states - if ((OpenerStep is 13 or 14 or 15 && IsMoving) || - (OpenerStep is 7 && !Player.HasStatus(true, StatusID.Suiton)) || - (OpenerStep is 18 or 20 && Ninki < 45) || - (OpenerStep is 17 or 19 && !Player.HasStatus(true, StatusID.RaijuReady)) || - (OpenerStep is 10 && !Player.HasStatus(true, StatusID.Kassatsu))) - ResetOpener(); - - - return true; - } - - return false; - } - - private void ResetOpener() - { - CurrentState = OpenerState.FailedOpener; - } - - private bool openerEventsSetup = false; - - public bool DoFullOpener(out uint actionID, MudraCasting mudraState) - { - actionID = 0; - //if (!LevelChecked) return false; - - if (!openerEventsSetup) { Condition.ConditionChange += CheckCombatStatus; openerEventsSetup = true; } - - if (CurrentState == OpenerState.PrePull || CurrentState == OpenerState.FailedOpener) - if (DoPrePullSteps(out actionID, mudraState)) return true; - - if (CurrentState == OpenerState.InOpener) - if (DoOpener(out actionID, mudraState)) return true; - - if (CurrentState == OpenerState.OpenerFinished && InCombat) - ResetOpener(); - - return false; - } - - internal void Dispose() - { - Condition.ConditionChange -= CheckCombatStatus; - } - - private void CheckCombatStatus(ConditionFlag flag, bool value) - { - if (flag == ConditionFlag.InCombat && value == false) ResetOpener(); - } - } - } -} diff --git a/Advanced_Rotations/Job_Helpers/actionstuff.cs b/Advanced_Rotations/Job_Helpers/actionstuff.cs deleted file mode 100644 index 37dba2b..0000000 --- a/Advanced_Rotations/Job_Helpers/actionstuff.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace RabbsRotations.Job_Helpers -{ - internal abstract partial class CustomComboFunctions - { - public static bool ActionReady(IBaseAction id) => id.EnoughLevel && (id.Cooldown.HasOneCharge || id.Cooldown.RecastTimeRemainOneCharge <= 3); - public static ushort GetRemainingCharges(IBaseAction id) => id.Cooldown.CurrentCharges; - public static float GetCooldownRemainingTime(IBaseAction id) => id.Cooldown.RecastTimeRemainOneCharge; - public static bool IsOnCooldown(IBaseAction id) => id.Cooldown.IsCoolingDown; - public static bool IsOffCooldown(IBaseAction id) => id.Cooldown.HasOneCharge; - - } -} diff --git a/Advanced_Rotations/PVE/Melee/DRG_PVE.cs b/Advanced_Rotations/PVE/Melee/DRG_PVE.cs deleted file mode 100644 index 10c138e..0000000 --- a/Advanced_Rotations/PVE/Melee/DRG_PVE.cs +++ /dev/null @@ -1,133 +0,0 @@ -using Dalamud.Game.ClientState.Party; -using FFXIVClientStructs.FFXIV.Client.UI; -using RotationSolver.Basic.Data; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -//using static FFXIVClientStructs.FFXIV.Client.Game.Control.GazeController; - -namespace RabbsRotationsNET8.PVE.Melee; -[Rotation("Rabbs Dragoon", CombatType.PvE, GameVersion = "6.58")] -[SourceCode(Path = "main/RabbsRotations/Melee/DRG.cs")] -[Api(1)] -public sealed class DRG_PVE : DragoonRotation -{ - #region Rotation Config - - #endregion - public static bool IsOddMinute() - { - // Get whole minutes from CombatTime (assuming it represents seconds) - int minutes = (int)Math.Floor(CombatTime / 60f); - - // Use modulo to check if minutes is odd (remainder 1) - return minutes % 2 != 0; - } - public static bool TwoMinteWindow => CombatTime >= 118 && CombatTime < 135; - public static float GetCooldownRemainingTime(IBaseAction baseAction) => baseAction.Cooldown.RecastTimeRemainOneCharge; - public static bool IsOffCooldown(IBaseAction baseAction) => !baseAction.Cooldown.IsCoolingDown; - public static bool IsOnCooldown(IBaseAction baseAction) => baseAction.Cooldown.IsCoolingDown; - public static bool LevelChecked(IBaseAction baseAction) => baseAction.EnoughLevel; - public static bool HasEffect(StatusID status) => Player.HasStatus(true, status); - public static IBaseAction SoloEye { get; } = new BaseAction((ActionID)7398); - protected override IAction? CountDownAction(float remainTime) - { - return base.CountDownAction(remainTime); - } - protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) - { - return base.EmergencyAbility(nextGCD, out act); - } - protected override bool GeneralGCD(out IAction? act) - { - - //1-2-3 Combo - - if (CoerthanTormentPvE.CanUse(out act)) return true; - - if (SonicThrustPvE.CanUse(out act)) return true; - - if (DraconianFuryPvE.CanUse(out act)) return true; - - if (FangAndClawPvE.CanUse(out act)) return true; - - if (WheelingThrustPvE.CanUse(out act)) return true; - - if (LevelChecked(ChaosThrustPvE) && HostileTarget != null && (!HostileTarget.HasStatus(true, StatusID.ChaoticSpring, StatusID.ChaosThrust) || HostileTarget.WillStatusEnd(6, true, StatusID.ChaoticSpring, StatusID.ChaosThrust)) || Player.WillStatusEnd(10, true, StatusID.PowerSurge, StatusID.PowerSurge_2720)) - { - if (DisembowelPvE.CanUse(out act)) return true; - - if (ChaosThrustPvE.CanUse(out act)) return true; - } - - if (VorpalThrustPvE.CanUse(out act)) return true; - - if (FullThrustPvE.CanUse(out act)) return true; - - - if (TrueThrustPvE.CanUse(out act)) return true; - - return base.GeneralGCD(out act); - } - protected override bool AttackAbility(IAction nextGCD, out IAction? act) - { - if (WeaponRemain > 0.6) - { - if (Player.HasStatus(true, StatusID.PowerSurge, StatusID.PowerSurge_2720)) - { - - //Battle Litany Feature - if (CombatElapsedLess(30) && HostileTarget != null && HostileTarget.HasStatus(true, StatusID.ChaoticSpring, StatusID.ChaosThrust)) - { - if (BattleLitanyPvE.CanUse(out act, skipAoeCheck: true)) return true; - } - - if (CombatTime > 30) - { - if (BattleLitanyPvE.CanUse(out act, skipAoeCheck: true)) return true; - } - - //Lance Charge Feature - if (LanceChargePvE.CanUse(out act, skipAoeCheck: true)) return true; - - //Dragon Sight Feature - //if ( < 2 && SoloEye.CanUse(out act, skipStatusProvideCheck: true)) return true; - - //Life Surge Feature - if (!HasEffect(StatusID.LifeSurge) && - (HasEffect(StatusID.RightEye) && HasEffect(StatusID.LanceCharge) && IsLastGCD(true, VorpalThrustPvE) || - HasEffect(StatusID.LanceCharge) && IsLastGCD(true, VorpalThrustPvE) || - HasEffect(StatusID.RightEye) && HasEffect(StatusID.LanceCharge) && (HasEffect(StatusID.WheelInMotion) || HasEffect(StatusID.FangAndClawBared)) || - IsOnCooldown(LanceChargePvE) && IsLastGCD(true, VorpalThrustPvE))) - if (LifeSurgePvE.CanUse(out act, usedUp: true)) return true; - //Wyrmwind Thrust Feature - if (WyrmwindThrustPvE.CanUse(out act, skipAoeCheck: true)) return true; - - if (LevelChecked(BattleLitanyPvE) && CombatElapsedLess(30) && HostileTarget != null && Player.HasStatus(true, StatusID.BattleLitany) && !IsMoving && HostileTarget.DistanceToPlayer() <= 3) - { - if (StardiverPvE.CanUse(out act, skipAoeCheck: true) && WeaponRemain > 1.5) return true; - if (NastrondPvE.CanUse(out act, skipAoeCheck: true)) return true; - if (GeirskogulPvE.CanUse(out act, skipAoeCheck: true)) return true; - if (HighJumpPvE.CanUse(out act, skipAoeCheck: true) && WeaponRemain > 0.8) return true; - if (MirageDivePvE.CanUse(out act, skipAoeCheck: true)) return true; - if (DragonfireDivePvE.CanUse(out act, skipAoeCheck: true) && WeaponRemain > 0.8) return true; - } - - if (HostileTarget.DistanceToPlayer() <= 3 && !IsMoving && (CombatTime > 30 || !LevelChecked(BattleLitanyPvE))) - { - if (StardiverPvE.CanUse(out act, skipAoeCheck: true) && WeaponRemain > 1.5) return true; - if (NastrondPvE.CanUse(out act, skipAoeCheck: true)) return true; - if (GeirskogulPvE.CanUse(out act, skipAoeCheck: true)) return true; - if (HighJumpPvE.CanUse(out act, skipAoeCheck: true) && WeaponRemain > 0.8) return true; - if (MirageDivePvE.CanUse(out act, skipAoeCheck: true)) return true; - if (DragonfireDivePvE.CanUse(out act, skipAoeCheck: true) && WeaponRemain > 0.8) return true; - } - } - } - - return base.AttackAbility(nextGCD, out act); - } -} - diff --git a/Advanced_Rotations/PVE/Melee/NIN_PVE.cs b/Advanced_Rotations/PVE/Melee/NIN_PVE.cs deleted file mode 100644 index 5b46930..0000000 --- a/Advanced_Rotations/PVE/Melee/NIN_PVE.cs +++ /dev/null @@ -1,348 +0,0 @@ -using static RabbsRotations.JobHelpers.NIN; -using static RabbsRotations.Job_Helpers.CustomComboFunctions; -using FFXIVClientStructs.FFXIV.Client.Game.Gauge; - -namespace RabbsRotationsNET8.PVE.Melee; -[Rotation("Rabbs Ninja", CombatType.PvE, GameVersion = "6.58")] -[Api(1)] -[SourceCode(Path = "main/RabbsRotations/Melee/NIN.cs")] - -public unsafe sealed class NIN_PVE : NinjaRotation -{ - private static bool inMudraState => Player.HasStatus(true, StatusID.Mudra); - - //public static IJobGauges? JobGauges { get; private set; } - //private static readonly NinjaGauge* gauge = (NinjaGauge*)JobGauges.Get()?.Address; - - private static readonly MudraCasting mudraCasting = new(); - private static bool inTCJ => Player.HasStatus(true, StatusID.TenChiJin); - private static readonly MudraCasting mudraState = new(); - private bool InTrickAttack => TrickAttackPvE.Cooldown.IsCoolingDown && !TrickAttackPvE.Cooldown.ElapsedAfter(17); - - protected override IAction? CountDownAction(float remainTime) - { - return base.CountDownAction(remainTime); - } - - protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) - { - - return base.EmergencyAbility(nextGCD, out act); - } - - //public static byte stacks == NinjaGauge.Kazematoi; - - - - protected override bool GeneralGCD(out IAction? act) - { - bool setupSuitonWindow = GetCooldownRemainingTime(TrickAttackPvE) <= 10 && !Player.HasStatus(true, StatusID.Suiton); - bool chargeCheck = GetRemainingCharges(TenPvE) == 2 || GetRemainingCharges(TenPvE) == 1 && TenPvE.Cooldown.RecastTimeRemainOneCharge < 3; - bool inTrickBurstSaveWindow = GetCooldownRemainingTime(TrickAttackPvE) <= 15 && SuitonPvE.EnoughLevel; - bool poolCharges = GetRemainingCharges(TenPvE) == 1 && TenPvE.Cooldown.RecastTimeRemainOneCharge < 2 || HostileTarget != null && HostileTarget.HasStatus(true, StatusID.TrickAttack); - byte stacks = FFXIVClientStructs.FFXIV.Client.Game.JobGaugeManager.Instance()->Ninja.Kazematoi; - //uint actionID = 0; - - if (stacks <5) - { - if (ArmorCrushPvE.CanUse(out act)) return true; - if (GustSlashPvE.CanUse(out act)) return true; - if (SpinningEdgePvE.CanUse(out act)) return true; - } - - /* - if (inTCJ) - { - uint tenId = AdjustId(TenPvE.ID); - uint chiId = AdjustId(ChiPvE.ID); - uint jinId = AdjustId(JinPvE.ID); - - if (tenId == FumaShurikenPvE_18873.ID - && !IsLastAction(false, FumaShurikenPvE_18875, FumaShurikenPvE_18873)) - { - //AOE - if (KatonPvE.CanUse(out _)) - { - if (FumaShurikenPvE_18875.CanUse(out act)) return true; - } - //Single - if (FumaShurikenPvE_18873.CanUse(out act)) return true; - } - - //Second - else if (tenId == KatonPvE_18876.ID && !IsLastAction(false, KatonPvE_18876)) - { - if (KatonPvE_18876.CanUse(out act, skipAoeCheck: true)) return true; - } - //Others - else if (chiId == RaitonPvE_18877.ID && !IsLastAction(false, RaitonPvE_18877)) - { - if (RaitonPvE_18877.CanUse(out act, skipAoeCheck: true)) return true; - } - else if (chiId == DotonPvE_18880.ID && !IsLastAction(false, DotonPvE_18880)) - { - if (DotonPvE_18880.CanUse(out act, skipAoeCheck: true)) return true; - } - else if (jinId == SuitonPvE_18881.ID && !IsLastAction(false, SuitonPvE_18881)) - { - if (SuitonPvE_18881.CanUse(out act, skipAoeCheck: true)) return true; - } - } - if (Player.HasStatus(true, StatusID.Hidden)) - { - StatusHelper.StatusOff(StatusID.Hidden); - } - if (!InCombat && TenPvE.Cooldown.IsCoolingDown && !inMudraState && HidePvE.CanUse(out act)) return true; - if (AdjustId(ActionID.NinjutsuPvE) is ActionID.RabbitMediumPvE) - if (RabbitMediumPvE.CanUse(out act)) return true; - - if (mudraState.CastGokaMekkyaku(out actionID)) - { - IBaseAction Thisaction = new BaseAction((ActionID)actionID); - if (actionID != 0) - { - if (Thisaction.CanUse(out act, skipAoeCheck: true, skipCastingCheck: true, skipComboCheck: true, skipStatusProvideCheck: true, usedUp: true)) return true; - } - } - - if (Player.HasStatus(true, StatusID.Kassatsu) && HostileTarget != null && HostileTarget.HasStatus(true, StatusID.TrickAttack) && MugPvE.Cooldown.IsCoolingDown) - mudraState.CurrentMudra = MudraCasting.MudraState.CastingHyoshoRanryu; - - if (mudraState.CastHyoshoRanryu(out actionID)) - { - IBaseAction Thisaction = new BaseAction((ActionID)actionID); - if (actionID != 0) - { - if (Thisaction.CanUse(out act)) return true; - } - } - if (mudraState.CurrentMudra != MudraCasting.MudraState.None && WeaponRemain == WeaponElapsed) - { - if (mudraState.ContinueCurrentMudra(ref actionID)) - { - IBaseAction Thisaction = new BaseAction((ActionID)actionID); - if (actionID != 0) - { - if (Thisaction.CanUse(out act, skipAoeCheck: true, skipCastingCheck: true, skipComboCheck: true, skipStatusProvideCheck: true, usedUp: true)) return true; - } - } - } - - if (InCombat && !HasHostilesInRange && HasHostilesInMaxRange) - { - if (Player.HasStatus(true, StatusID.PhantomKamaitachiReady) && - (GetCooldownRemainingTime(TrickAttackPvE) > Player.StatusTime(true, StatusID.PhantomKamaitachiReady) && Player.StatusTime(true, StatusID.PhantomKamaitachiReady) < 5 || HostileTarget != null && HostileTarget.HasStatus(true, StatusID.TrickAttack) || Player.HasStatus(true, StatusID.Bunshin) && HostileTarget != null && HostileTarget.HasStatus(true, StatusID.Mug)) && - PhantomKamaitachiPvE.EnoughLevel - && true) - if (PhantomKamaitachiPvE.CanUse(out act)) return true; - - if (InCombat && - setupSuitonWindow && - TrickAttackPvE.EnoughLevel && - !Player.HasStatus(true, StatusID.Suiton) && - mudraState.CastSuiton(out actionID)) - { - IBaseAction Thisaction = new BaseAction((ActionID)actionID); - if (actionID != 0) - { - if (Thisaction.CanUse(out act, skipAoeCheck: true, skipCastingCheck: true, skipComboCheck: true, skipStatusProvideCheck: true, usedUp: true)) return true; - } - } - - if (true && - !inTrickBurstSaveWindow && - chargeCheck && - poolCharges && - mudraState.CastRaiton(out actionID)) - { - IBaseAction Thisaction = new BaseAction((ActionID)actionID); - if (actionID != 0) - { - if (Thisaction.CanUse(out act, skipAoeCheck: true, skipCastingCheck: true, skipComboCheck: true, skipStatusProvideCheck: true, usedUp: true)) return true; - } - } - - - - if (HostileTarget != null && !Player.HasStatus(true, StatusID.RaijuReady) && !inMudraState) - if (ThrowingDaggerPvE.CanUse(out act)) return true; - } - - if (NumberOfAllHostilesInRange >= 3) - { - if (RecordActions != null) - { - // Limit to the most recent 10 elements (or less if RecordActions has fewer elements) - var recentActions = RecordActions.Take(10); - - if (!recentActions.Any(x => x.Action.RowId == DotonPvE.ID || x.Action.RowId == DotonPvE_18880.ID) && !Player.HasStatus(true, StatusID.Doton)) - { - if (mudraState.CastDoton(out actionID)) - { - IBaseAction Thisaction = new BaseAction((ActionID)actionID); - if (actionID != 0) - { - if (Thisaction.CanUse(out act, skipAoeCheck: true, skipCastingCheck: true, skipComboCheck: true, skipStatusProvideCheck: true, usedUp: true)) return true; - } - } - } - } - - - - if (mudraState.CastKaton(out actionID)) - { - IBaseAction Thisaction = new BaseAction((ActionID)actionID); - if (actionID != 0) - { - if (Thisaction.CanUse(out act, skipAoeCheck: true, skipCastingCheck: true, skipComboCheck: true, skipStatusProvideCheck: true, usedUp: true)) return true; - } - } - } - - if (Player.HasStatus(true, StatusID.RaijuReady)) - { - if (FleetingRaijuPvE.CanUse(out act)) return true; - } - - if (Player.HasStatus(true, StatusID.PhantomKamaitachiReady) && - (GetCooldownRemainingTime(TrickAttackPvE) > Player.StatusTime(true, StatusID.PhantomKamaitachiReady) && Player.StatusTime(true, StatusID.PhantomKamaitachiReady) < 5 || HostileTarget != null && HostileTarget.HasStatus(true, StatusID.TrickAttack) || Player.HasStatus(true, StatusID.Bunshin) && HostileTarget != null && HostileTarget.HasStatus(true, StatusID.Mug)) && - PhantomKamaitachiPvE.EnoughLevel) - if (PhantomKamaitachiPvE.CanUse(out act)) return true; - - - - if (!inTrickBurstSaveWindow && IsOnCooldown(MugPvE) && mudraState.CastHyoshoRanryu(out actionID)) - { - IBaseAction Thisaction = new BaseAction((ActionID)actionID); - if (actionID != 0) - { - if (Thisaction.CanUse(out act, skipAoeCheck: true, skipCastingCheck: true, skipComboCheck: true, skipStatusProvideCheck: true, usedUp: true)) return true; - } - } - - - if (InCombat && setupSuitonWindow && - TrickAttackPvE.EnoughLevel && - !Player.HasStatus(true, StatusID.Suiton) && - mudraState.CastSuiton(out actionID)) - { - IBaseAction Thisaction = new BaseAction((ActionID)actionID); - if (actionID != 0) - { - if (Thisaction.CanUse(out act, skipAoeCheck: true, skipCastingCheck: true, skipComboCheck: true, skipStatusProvideCheck: true, usedUp: true)) return true; - } - } - - if (!inTrickBurstSaveWindow && - chargeCheck && - poolCharges && - mudraState.CastRaiton(out actionID)) - { - IBaseAction Thisaction = new BaseAction((ActionID)actionID); - if (actionID != 0) - { - if (Thisaction.CanUse(out act, skipAoeCheck: true, skipCastingCheck: true, skipComboCheck: true, skipStatusProvideCheck: true, usedUp: true)) return true; - } - } - - if (InTrickAttack && - mudraState.CastRaiton(out actionID)) - { - IBaseAction Thisaction = new BaseAction((ActionID)actionID); - if (actionID != 0) - { - if (Thisaction.CanUse(out act, skipAoeCheck: true, skipCastingCheck: true, skipComboCheck: true, skipStatusProvideCheck: true, usedUp: true)) return true; - } - } - - - if (!RaitonPvE.EnoughLevel && - chargeCheck && - mudraState.CastFumaShuriken(out actionID)) - { - IBaseAction Thisaction = new BaseAction((ActionID)actionID); - if (actionID != 0) - { - if (Thisaction.CanUse(out act, skipAoeCheck: true, skipCastingCheck: true, skipComboCheck: true, skipStatusProvideCheck: true, usedUp: true)) return true; - } - } - - if (!inMudraState) - { - //AOE - if (HakkeMujinsatsuPvE.CanUse(out act)) return true; - if (DeathBlossomPvE.CanUse(out act)) return true; - - //Single - if (ArmorCrushPvE.CanUse(out act)) return true; - if (AeolianEdgePvE.CanUse(out act)) return true; - if (GustSlashPvE.CanUse(out act)) return true; - if (SpinningEdgePvE.CanUse(out act)) return true; - } - */ - return base.GeneralGCD(out act); - } - - protected unsafe override bool AttackAbility(IAction nextGCD, out IAction? act) - { - bool setupKassatsuWindow = GetCooldownRemainingTime(TrickAttackPvE) <= 10 && Player.HasStatus(true, StatusID.Suiton); - bool inTrickBurstSaveWindow = TrickAttackPvE.Cooldown.IsCoolingDown && TrickAttackPvE.Cooldown.WillHaveOneCharge(15); - - if (!inMudraState && !inTCJ) - { - if (Player.HasStatus(true, StatusID.Suiton) && - GetCooldownRemainingTime(TrickAttackPvE) <= 3 && - InCombat && CombatTime > 6 && - IsOffCooldown(MugPvE) && - MugPvE.EnoughLevel) - if (MugPvE.CanUse(out act)) return true; - - if (Player.HasStatus(true, StatusID.Suiton) && IsOffCooldown(TrickAttackPvE) && InCombat && CombatTime > 8) - if (TrickAttackPvE.CanUse(out act)) return true; - - if (Ninki >= 50) - if (BunshinPvE.CanUse(out act)) return true; - - if (HostileTarget != null && HostileTarget.HasStatus(true, StatusID.TrickAttack_3254) || setupKassatsuWindow) - if (KassatsuPvE.CanUse(out act)) return true; - - if (HostileTarget != null && HostileTarget.HasStatus(true, StatusID.TrickAttack) && Ninki >= 50 || Ninki == 100 && IsOnCooldown(MugPvE)) - { - if (HellfrogMediumPvE.CanUse(out act)) return true; - if (BhavacakraPvE.CanUse(out act)) return true; - } - - if (InTrickAttack) - { - if (MugPvE.CanUse(out act)) return true; - - if (TenChiJinPvE.CanUse(out act)) return true; - - if (Player.HasStatus(true, StatusID.Suiton) && Ninki <= 50) - if (MeisuiPvE.CanUse(out act)) return true; - - if (Ninki >= 50) - if (HellfrogMediumPvE.CanUse(out act)) return true; - - if (Ninki >= 50) - if (BhavacakraPvE.CanUse(out act)) return true; - - if (AssassinatePvE.CanUse(out act)) return true; - - } - - } - - return base.AttackAbility(nextGCD, out act); - } - public unsafe override void DisplayStatus() - { - byte stacks = FFXIVClientStructs.FFXIV.Client.Game.JobGaugeManager.Instance()->Ninja.Kazematoi; - - ImGui.Text("debug " + stacks.ToString()); - - base.DisplayStatus(); - } -} - diff --git a/Advanced_Rotations/PVE/Melee/SAM_PVE.cs b/Advanced_Rotations/PVE/Melee/SAM_PVE.cs deleted file mode 100644 index fe63a68..0000000 --- a/Advanced_Rotations/PVE/Melee/SAM_PVE.cs +++ /dev/null @@ -1,203 +0,0 @@ -using FFXIVClientStructs.FFXIV.Client.Game; -using System.ComponentModel.DataAnnotations; - -namespace RabbsRotationsNET8.PVE.Melee; - -[Rotation("Rabbs Samurai", CombatType.PvE, GameVersion = "6.58")] -[SourceCode(Path = "main/RabbsRotations/Melee/SAM.cs")] -[Api(2)] -public sealed class SAM_PVE : SamuraiRotation -{ - - [RotationSolver.Basic.Attributes.Range(25, 85, ConfigUnitType.None, 5)] - public static IBaseAction MeikoPrePull { get; } = new BaseAction((ActionID)7499); - private static bool HaveMeikyoShisui => Player.HasStatus(true, StatusID.MeikyoShisui); - private static bool HaveTrueNorth => Player.HasStatus(true, StatusID.TrueNorth); - private int FillerPhasestep { get; set; } - private bool FillerPhaseInProgress { get; set; } - public static bool IsOddMinute() - { - // Get whole minutes from CombatTime (assuming it represents seconds) - int minutes = (int)Math.Floor(CombatTime / 60f); - - // Use modulo to check if minutes is odd (remainder 1) - return minutes % 2 != 0; - } - - - protected unsafe override IAction? CountDownAction(float remainTime) - { - //var IsThereABoss = AllHostileTargets.Any(p => p.IsBossFromTTK()) || AllHostileTargets.Any(p => p.IsBossFromIcon()); - - if (remainTime < 0.2) - { - if (GekkoPvE.CanUse(out var act, skipComboCheck: true)) - { - return act; - } - } - - - if (remainTime < 5 && !HaveTrueNorth) - { - if (TrueNorthPvE.CanUse(out var act)) return act; - } - - if (remainTime < 8.5) - { - if (MeikyoShisuiPvE.CanUse(out var act)) return act; - } - - - - return base.CountDownAction(remainTime); - } - - protected override bool GeneralGCD(out IAction? act) - { - var IsTargetBoss = HostileTarget?.IsBossFromTTK() ?? false; - var IsTargetDying = HostileTarget?.IsDying() ?? false; - //int numberLNhigabana = AllHostileTargets.Where(m => m.HasStatus(true, StatusID.Higanbana)).Count(); - int currentMinute = (int)Math.Floor(CombatTime / 60f); - int lastCombatMinute = currentMinute; // Initialize with current minute - - if (KaeshiNamikiriPvE.CanUse(out act, skipAoeCheck: true, usedUp: true)) return true; - if (KaeshiGokenPvE.CanUse(out act, usedUp: true)) return true; - if (KaeshiSetsugekkaPvE.CanUse(out act, skipAoeCheck: true, usedUp: true)) return true; - if ((!IsTargetBoss || (HostileTarget?.HasStatus(true, StatusID.Higanbana) ?? false)) && HasMoon && HasFlower && !(HostileTarget?.WillStatusEnd(16, true, StatusID.Higanbana) ?? false) - && OgiNamikiriPvE.CanUse(out act, skipAoeCheck: true)) return true; - if (Player.HasStatus(true, StatusID.MeikyoShisui)) - { - - // Check for Higabna if Sen is 1 and target doesn't have Higanbana debuff, skip for first couple gcd in opener to get raid buffs first, maybe build logic for raid burst correction ie "IsBurst" check - //if (SenCount == 1 && CombatTime > 5 && !IsTargetDying && AllHostileTargets != null && NumberOfHostilesInRange < 3 && numberLNhigabana < 3 && (!AllHostileTargets.Any(p => p.HasStatus(true, StatusID.Higanbana)) || AllHostileTargets.Any(p => p.WillStatusEnd(10, true, StatusID.Higanbana)))) - //{ - //if (HiganbanaPvE.CanUse(out act)) return true; // Only return true if Higanbana is usable and debuff applies - //} - - if (SenCount == 2) - { - if (TenkaGokenPvE.CanUse(out act)) return true; - } - // Check for Midare if Sen is 3 - if (SenCount == 3) - { - if (MidareSetsugekkaPvE.CanUse(out act)) return true; // Only return true if Midare is usable - } - - - - // Remaining Skills (Gekko > Kasha > Yukikaze) - if (!HasGetsu) // Gekko can be used if not under Getsu buff, Mangetsu if aoe - { - if (IsMoonTimeLessThanFlower || !HasMoon) // Use Gekko if Moon uptime is less than flower of no moon - { - if (MangetsuPvE.CanUse(out act, skipComboCheck: true)) return true; - if (GekkoPvE.CanUse(out act, skipComboCheck: true)) return true; - } - } - - // Use Oka/Kasha if no Ka buff and usable - if (!HasKa) - { - if (OkaPvE.CanUse(out act, skipComboCheck: true)) return true; - if (KashaPvE.CanUse(out act, skipComboCheck: true)) return true; - } - - - // Default Yukikaze if others are not usable - if (YukikazePvE.CanUse(out act, skipComboCheck: true)) return true; - } - - - - if (SenCount == 1 && (Player.HasStatus(true, StatusID.OgiNamikiriReady) || HostileTarget != null && HostileTarget.WillStatusEnd(10, true, StatusID.Higanbana))) - { - if (HasMoon && HasFlower && HiganbanaPvE.CanUse(out act, skipStatusProvideCheck: true)) return true; - } - if (SenCount == 2) - { - if (TenkaGokenPvE.CanUse(out act, skipAoeCheck: !MidareSetsugekkaPvE.EnoughLevel)) return true; - } - if (SenCount == 3) - { - if (MidareSetsugekkaPvE.CanUse(out act)) return true; - } - if ((!HasMoon || IsMoonTimeLessThanFlower || !OkaPvE.EnoughLevel) && MangetsuPvE.CanUse(out act, skipAoeCheck: HaveMeikyoShisui && !HasGetsu)) return true; - if ((!HasFlower || !IsMoonTimeLessThanFlower) && OkaPvE.CanUse(out act, skipAoeCheck: HaveMeikyoShisui && !HasKa)) return true; - if (!HasSetsu && YukikazePvE.CanUse(out act, skipAoeCheck: HaveMeikyoShisui && HasGetsu && HasKa && !HasSetsu)) return true; - if (GekkoPvE.CanUse(out act, skipComboCheck: HaveMeikyoShisui && !HasGetsu)) return true; - if (KashaPvE.CanUse(out act, skipComboCheck: HaveMeikyoShisui && !HasKa)) return true; - if ((!HasMoon || IsMoonTimeLessThanFlower || !ShifuPvE.EnoughLevel) && JinpuPvE.CanUse(out act)) return true; - if ((!HasFlower || !IsMoonTimeLessThanFlower) && ShifuPvE.CanUse(out act)) return true; - if (FukoPvE.CanUse(out act)) return true; - if (!FukoPvE.EnoughLevel && FugaPvE.CanUse(out act)) return true; - if (HakazePvE.CanUse(out act)) return true; - - if (EnpiPvE.CanUse(out act)) return true; - - return base.GeneralGCD(out act); - } - - protected unsafe override bool AttackAbility(IAction nextGCD, out IAction? act) - { - act = null; - var IsTargetBoss = HostileTarget?.IsBossFromTTK() ?? false; - var IsTargetDying = HostileTarget?.IsDying() ?? false; - - if (Kenki <= 50 && HasFlower && HasMoon && IkishotenPvE.CanUse(out act)) return true; - var aState = FFXIVClientStructs.FFXIV.Client.Game.UI.UIState.Instance()->PlayerState; - var SkillSpeed = aState.Attributes[45]; - var isOddMinute = IsOddMinute(); - if (IsBurst && UseBurstMedicine(out act)) return true; - var fillerSelect = SkillSpeed <= 648 ? isOddMinute ? 2 : 0 : 1; - - if (fillerSelect == 2 && (HostileTarget?.WillStatusEnd(50, true, StatusID.Higanbana) ?? false) && !(HostileTarget?.WillStatusEnd(16, true, StatusID.Higanbana) ?? false) && SenCount == 1 && IsLastAction(true, YukikazePvE) && !HaveMeikyoShisui && !RecordActions[0..30].Any(x => x.Action.RowId == HagakurePvE.ID)) - { - if (HagakurePvE.CanUse(out act)) return true; - } - if (KaeshiNamikiriPvE.EnoughLevel && !HaveMeikyoShisui && InCombat) - { - if (IsLastAbility(true, KaeshiSetsugekkaPvE) || !HasMoon || !HasFlower || SenCount == 0 && !KaeshiSetsugekkaPvE.IsEnabled || MeikyoShisuiPvE.Cooldown.CurrentCharges == 2) - { - if (MeikyoShisuiPvE.CanUse(out act, usedUp: true)) return true; - } - } - - if (!KaeshiNamikiriPvE.EnoughLevel && !HaveMeikyoShisui && InCombat) - { - if (!HasMoon || !HasFlower || SenCount == 0) - { - if (MeikyoShisuiPvE.CanUse(out act, usedUp: true)) return true; - } - } - - if (HasMoon && HasFlower && (IsBurst || SenCount == 0)) - { - if (HissatsuGurenPvE.CanUse(out act, skipAoeCheck: !HissatsuSeneiPvE.EnoughLevel)) return true; - if (HissatsuSeneiPvE.CanUse(out act)) return true; - } - if (CombatTime > 30 || IkishotenPvE.IsInCooldown) - { - if (ShohaPvE.CanUse(out act)) return true; - } - - if (Kenki >= 50 && IkishotenPvE.Cooldown.WillHaveOneCharge(10) || Kenki >= 50 || IsTargetBoss && IsTargetDying) - { - if (HissatsuKyutenPvE.CanUse(out act)) return true; - if (HissatsuShintenPvE.CanUse(out act)) return true; - } - if (Kenki < 25 && CombatTime < 40 && SenCount == 2 && IkishotenPvE.IsInCooldown && TsubamegaeshiPvE.Cooldown.HasOneCharge) - { - if (HissatsuGurenPvE.CanUse(out act)) return true; - } - - return base.AttackAbility(nextGCD, out act); - } - protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) - { - return base.EmergencyAbility(nextGCD, out act); - } - - -} \ No newline at end of file diff --git a/Advanced_Rotations/PVE/Melee/VPR_PVE.cs b/Advanced_Rotations/PVE/Melee/VPR_PVE.cs deleted file mode 100644 index 6b9f384..0000000 --- a/Advanced_Rotations/PVE/Melee/VPR_PVE.cs +++ /dev/null @@ -1,274 +0,0 @@ - -using Dalamud.Game.ClientState.JobGauge.Types; -using FFXIVClientStructs.FFXIV.Client.Game.UI; -using RotationSolver.Basic.Data; -using System; - -namespace RabbsRotationsNET8.Melee; - -[Rotation("RabbsViper", CombatType.PvE, GameVersion = "7.0")] -[SourceCode(Path = "main/DefaultRotations/Melee/VPR_Default.cs")] -[Api(1)] -public sealed class VPR_Default : ViperRotation -{ - private static bool HaveReawakend => Player.HasStatus(true, StatusID.Reawakened, StatusID.Reawakened_4094); - private static bool HaveSwiftScaled => Player.HasStatus(true, StatusID.Swiftscaled, StatusID.Swiftscaled_4121); - private static float? SwiftScaledTime => Player.StatusTime(true, StatusID.Swiftscaled); - private static float? HuntersTime => Player.StatusTime(true, StatusID.HuntersInstinct); - private static bool HaveHuntersInstinct => Player.HasStatus(true, StatusID.HuntersInstinct, StatusID.HuntersInstinct_4120); - private static bool HaveHuntersVenom => Player.HasStatus(true, StatusID.HuntersVenom); - private static bool HaveSwiftVenom => Player.HasStatus(true, StatusID.SwiftskinsVenom); - private static bool HaveFellHuntersVenom => Player.HasStatus(true, StatusID.FellhuntersVenom); - private static bool HaveFellskintVenom => Player.HasStatus(true, StatusID.FellskinsVenom); - private static bool HavePoisedFang => Player.HasStatus(true, StatusID.PoisedForTwinfang); - private static bool HavePoisedBlood => Player.HasStatus(true, StatusID.PoisedForTwinblood); - private static bool HaveFlankingVenom => Player.HasStatus(true, StatusID.FlankstungVenom, StatusID.FlanksbaneVenom); - private static bool HaveHindVenom => Player.HasStatus(true, StatusID.HindsbaneVenom, StatusID.HindstungVenom); - private static bool HaveBaneVenom => Player.HasStatus(true, StatusID.HindsbaneVenom, StatusID.FlanksbaneVenom); - private static bool HaveGrimHuntersVenom => Player.HasStatus(true, StatusID.GrimhuntersVenom); - private static bool HaveGrimSkinVenom => Player.HasStatus(true, StatusID.GrimskinsVenom); - private static float? BloodTime => HostileTarget?.StatusTime(true, StatusID.NoxiousGnash); - private static bool BloodTimeAoe => AllHostileTargets.Any(p => p.StatusTime(true, StatusID.NoxiousGnash) < 20 && p.DistanceToPlayer() <= 5); - public static bool IsHuntersTimeLessThanSwiftscaled => CustomRotation.Player.StatusTime(true, StatusID.HuntersInstinct) < CustomRotation.Player.StatusTime(true, StatusID.Swiftscaled); - public static bool IsHindstongueTimeLessThanHindsbane => CustomRotation.Player.StatusTime(true, StatusID.HindstungVenom) < CustomRotation.Player.StatusTime(true, StatusID.HindsbaneVenom); - private static int MyGeneration => EnhancedSerpentsLineageTrait.EnoughLevel ? 6-AnguineTribute:5-AnguineTribute; - public static IBaseAction ThisCoil { get; } = new BaseAction((ActionID)34645); - public static IBaseAction UnCoilCoil { get; } = new BaseAction((ActionID)34633); - #region Countdown logic - // Defines logic for actions to take during the countdown before combat starts. - protected override IAction? CountDownAction(float remainTime) - { - - return base.CountDownAction(remainTime); - } - #endregion - - #region Emergency Logic - // Determines emergency actions to take based on the next planned GCD action. - protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) - { - uint SerpentsTailId = AdjustId(SerpentsTailPvE.ID); - act = null; - if (FirstLegacyPvE.CanUse(out act, skipComboCheck: true, skipCastingCheck: true, skipAoeCheck: true, skipStatusProvideCheck: true) && SerpentsTailId == FirstLegacyPvE.ID) return true; - if (SecondLegacyPvE.CanUse(out act, skipComboCheck: true, skipCastingCheck: true, skipAoeCheck: true, skipStatusProvideCheck: true) && SerpentsTailId == SecondLegacyPvE.ID) return true; - if (ThirdLegacyPvE.CanUse(out act, skipComboCheck: true, skipCastingCheck: true, skipAoeCheck: true, skipStatusProvideCheck: true) && SerpentsTailId == ThirdLegacyPvE.ID) return true; - if (FourthLegacyPvE.CanUse(out act, skipComboCheck: true, skipCastingCheck: true, skipAoeCheck: true, skipStatusProvideCheck: true) && SerpentsTailId == FourthLegacyPvE.ID) return true; - if (TwinfangBitePvE.CanUse(out act) && HaveHuntersVenom) return true; - if (TwinbloodBitePvE.CanUse(out act) && HaveSwiftVenom) return true; - if (UncoiledTwinfangPvE.CanUse(out act, skipComboCheck: true, skipCastingCheck: true, skipAoeCheck: true, skipStatusProvideCheck: true) && HavePoisedFang) return true; - if (ThisCoil.CanUse(out act, skipComboCheck: true, skipCastingCheck: true, skipAoeCheck: true, skipStatusProvideCheck: true) && HavePoisedBlood) return true; - - return base.EmergencyAbility(nextGCD, out act); - } - #endregion - - #region oGCD Logic - protected override bool AttackAbility(IAction nextGCD, out IAction? act) - { - uint SerpentsTailId = AdjustId(SerpentsTailPvE.ID); - uint ComboMark = AdjustId(SteelFangsPvE.ID); - int ComboMark2 = ComboMark == SteelFangsPvE.ID ? 1 : ComboMark == HuntersStingPvE.ID ? 2 : 3; - act = null; - if (SerpentsIrePvE.CanUse(out act) && InCombat && RattlingCoilStacks <= 2 && !HaveReawakend) return true; - if (TwinfangThreshPvE.CanUse(out act, skipComboCheck: true, skipCastingCheck: true, skipAoeCheck: true, skipStatusProvideCheck: true) && HaveFellHuntersVenom) return true; - if (TwinbloodThreshPvE.CanUse(out act, skipComboCheck: true, skipCastingCheck: true, skipAoeCheck: true, skipStatusProvideCheck: true) && HaveFellskintVenom) return true; - - - - - if (LastLashPvE.CanUse(out act, skipComboCheck: true, skipCastingCheck: true, skipAoeCheck: true, skipStatusProvideCheck: true) && SerpentsTailId == LastLashPvE.ID) return true; - if (DeathRattlePvE.CanUse(out act, skipComboCheck: true, skipCastingCheck: true, skipAoeCheck: true, skipStatusProvideCheck: true) && SerpentsTailId == DeathRattlePvE.ID) return true; - - if (MergedStatus.HasFlag(AutoStatus.MoveForward) && MoveForwardAbility(nextGCD, out act)) return true; - return base.AttackAbility(nextGCD, out act); - } - - protected override bool MoveForwardAbility(IAction nextGCD, out IAction? act) - { - act = null; - if (!IsMoving && SlitherPvE.Target.Target.DistanceToPlayer() > 5) - { - if (SlitherPvE.CanUse(out act)) return true; - } - - return base.MoveForwardAbility(nextGCD, out act); - } - #endregion - - #region GCD Logic - protected override bool MoveForwardGCD(out IAction? act) - { - act = null; - - return base.MoveForwardGCD(out act); - } - - protected override bool GeneralGCD(out IAction? act) - { - uint ComboMark = AdjustId(SteelFangsPvE.ID); - int ComboMark2 = ComboMark == SteelFangsPvE.ID ? 1 : ComboMark == HuntersStingPvE.ID ? 2 : 3; - uint ComboMark3 = AdjustId(SteelMawPvE.ID); - int ComboMark4 = ComboMark3== SteelMawPvE.ID ? 1 : ComboMark3 == HuntersBitePvE.ID ? 2 : 3; - act = null; - - if (MyGeneration is 1) - { - if (SteelFangsPvE.CanUse(out act)) return true; - } - if (MyGeneration is 2) - { - if (DreadFangsPvE.CanUse(out act)) return true; - } - if (MyGeneration is 3) - { - if (HuntersCoilPvE.CanUse(out act, skipComboCheck:true) && DreadCombo is (DreadCombo)9) return true; - } - if (MyGeneration is 4) - { - if (SwiftskinsCoilPvE.CanUse(out act, skipComboCheck: true) && DreadCombo is (DreadCombo)10) return true; - } - if (MyGeneration is 5) - { - if (OuroborosPvE.CanUse(out act, skipComboCheck:true, skipCastingCheck:true, skipAoeCheck:true, skipStatusProvideCheck:true)) return true; - } - - - //Overcap protection - if ((DreadwinderPvE.Cooldown.CurrentCharges > 0 || !SerpentsIrePvE.Cooldown.IsCoolingDown) && - ((RattlingCoilStacks is 3 && EnhancedVipersRattleTrait.EnoughLevel) || - (RattlingCoilStacks is 2 && !EnhancedVipersRattleTrait.EnoughLevel))) - { - if (UnCoilCoil.CanUse(out act, skipComboCheck: true, skipCastingCheck: true, skipAoeCheck: true, skipStatusProvideCheck: true)) return true; - } - - - - - - - if (HuntersDenPvE.CanUse(out act, skipComboCheck: true, skipCastingCheck: true, skipAoeCheck: true, skipStatusProvideCheck: true) && DreadCombo == DreadCombo.PitOfDread) return true; - if (SwiftskinsDenPvE.CanUse(out act, skipComboCheck: true, skipCastingCheck: true, skipAoeCheck: true, skipStatusProvideCheck: true) && DreadCombo == DreadCombo.HuntersDen) return true; - if (HuntersCoilPvE.CanUse(out act, skipComboCheck: true) && DreadCombo == DreadCombo.Dreadwinder) return true; - if (SwiftskinsCoilPvE.CanUse(out act, skipComboCheck: true) && DreadCombo == DreadCombo.HuntersCoil) return true; - - - - - //Reawakend Usage - if ((SerpentOffering >= 50|| Player.HasStatus(true, StatusID.ReadyToReawaken)) && SerpentsIrePvE.Cooldown.RecastTimeRemainOneCharge > (100-SerpentOffering) && (DreadwinderPvE.Cooldown.CurrentCharges == 0 || (DreadwinderPvE.Cooldown.CurrentCharges == 1 && DreadwinderPvE.Cooldown.RecastTimeRemainOneCharge > 10)) && - SwiftScaledTime > 10 && - HuntersTime > 10 && - BloodTime > 10 && - !HaveHuntersVenom && !HaveSwiftVenom && - !HavePoisedBlood && !HavePoisedFang) - - { - if (ReawakenPvE.CanUse(out act, skipComboCheck: true, skipCastingCheck: true, skipAoeCheck: true, skipStatusProvideCheck: true)) return true; - } - - - if (BloodTime <= 20 && BloodTime > 0 && HaveSwiftScaled) - { - //Dreadwinder Usage - if (PitOfDreadPvE.CanUse(out act, usedUp: true) && DreadCombo is 0) return true; - if (DreadwinderPvE.CanUse(out act, usedUp: true) && DreadCombo is 0) return true; - - - } - - - if (ComboMark4 == 3) - { - if (HaveGrimSkinVenom) - { - if (DreadMawPvE.CanUse(out act)) return true; - } - - if (SteelMawPvE.CanUse(out act)) return true; - - } - if (ComboMark4 == 2) - { - if (IsHuntersTimeLessThanSwiftscaled) - { - if (SteelMawPvE.CanUse(out act)) return true; - } - - if (DreadMawPvE.CanUse(out act)) return true; - - } - if (ComboMark4 == 1) - { - if (BloodTimeAoe) - { - if (DreadMawPvE.CanUse(out act)) return true; - - } - if (SteelMawPvE.CanUse(out act)) return true; - - } - - if (ComboMark2 == 3) - { - - if (HaveBaneVenom) - { - if (DreadFangsPvE.CanUse(out act)) return true; - } - - if (SteelFangsPvE.CanUse(out act)) return true; - } - if (ComboMark2 == 2) - { - - if (HaveFlankingVenom) - { - if (SteelFangsPvE.CanUse(out act)) return true; - } - - if (DreadFangsPvE.CanUse(out act)) return true; - } - if (ComboMark2 == 1) - { - if (BloodTime < 20) - { - - if (DreadFangsPvE.CanUse(out act)) return true; - } - - if (SteelFangsPvE.CanUse(out act)) return true; - } - - - - - - if (RattlingCoilStacks > 0 && DreadCombo is (DreadCombo)0 && !Player.HasStatus(true, StatusID.ReadyToReawaken) && - !HaveSwiftVenom && !HaveHuntersVenom && - HaveSwiftScaled && HaveHuntersInstinct) - { - if (UnCoilCoil.CanUse(out act, skipComboCheck: true, skipCastingCheck: true, skipAoeCheck: true, skipStatusProvideCheck: true)) return true; - } - - - return base.GeneralGCD(out act); - } - - private bool AttackGCD(out IAction? act, bool burst) - { - act = null; - - return false; - } - #endregion - - #region Extra Methods - #endregion - public unsafe override void DisplayStatus() - { - //motif - ImGui.Text("debug " + DreadCombo.ToString()); - - base.DisplayStatus(); - } -} diff --git a/Advanced_Rotations/PVE/Ranged_Magic/BLM_Default.cs b/Advanced_Rotations/PVE/Ranged_Magic/BLM_Default.cs index d5d9e63..b7f98c9 100644 --- a/Advanced_Rotations/PVE/Ranged_Magic/BLM_Default.cs +++ b/Advanced_Rotations/PVE/Ranged_Magic/BLM_Default.cs @@ -1,37 +1,15 @@  namespace RabbsRotationsNET8.Magical; -[Rotation("Rabbs BLM", CombatType.PvE, GameVersion = "6.58")] +[Rotation("Rabbs Infinite Power-dox", CombatType.PvE, GameVersion = "6.58")] [SourceCode(Path = "main/DefaultRotations/Magical/BLM_Default.cs")] -[Api(2)] +[Api(4)] public class BLM_Default : BlackMageRotation { - private bool NeedToGoIce - { - get - { - //Can use Despair. - if (DespairPvE.EnoughLevel && CurrentMp >= DespairPvE.Info.MPNeed) return false; - //Can use Fire1 - if (FirePvE.EnoughLevel && CurrentMp >= FirePvE.Info.MPNeed) return false; + public IBaseAction FixedUS { get; } = new BaseAction((ActionID)16506); - return true; - } - } - - private bool NeedToTransposeGoIce(bool usedOne) - { - if (!NeedToGoIce) return false; - if (!ParadoxPvE.EnoughLevel) return false; - var compare = usedOne ? -1 : 0; - var count = PolyglotStacks; - if (count == compare++) return false; - if (count == compare++ && !EnchinaEndAfterGCD(2)) return false; - if (count >= compare && (HasFire || SwiftcastPvE.Cooldown.WillHaveOneChargeGCD(2) || TriplecastPvE.Cooldown.WillHaveOneChargeGCD(2))) return true; - if (!HasFire && !SwiftcastPvE.Cooldown.WillHaveOneChargeGCD(2) && !TriplecastPvE.CanUse(out _, gcdCountForAbility: 8)) return false; - return true; - } + public IBaseAction FixedMF { get; } = new BaseAction((ActionID)158); [RotationConfig(CombatType.PvE, Name = "Use Transpose to Astral Fire before Paradox")] public bool UseTransposeForParadox { get; set; } = true; @@ -42,330 +20,145 @@ private bool NeedToTransposeGoIce(bool usedOne) [RotationConfig(CombatType.PvE, Name = @"Use ""Double Paradox"" rotation [N15]")] public bool UseN15 { get; set; } = false; + public bool NextGCDisInstant => Player.HasStatus(true, StatusID.Triplecast, StatusID.Swiftcast); + protected override IAction? CountDownAction(float remainTime) { IAction act; - if (remainTime < FireIiiPvE.Info.CastTime + CountDownAhead) + if (remainTime < 1) + { + if (TriplecastPvE.CanUse(out act, usedUp: true) && !NextGCDisInstant) return act; + } + if (remainTime < BlizzardIiiPvE.Info.CastTime + CountDownAhead) { - if (FireIiiPvE.CanUse(out act)) return act; + if (BlizzardIiiPvE.CanUse(out act)) return act; } return base.CountDownAction(remainTime); } protected override bool AttackAbility(IAction nextGCD, out IAction? act) { - if (IsBurst && UseBurstMedicine(out act)) return true; - if (InUmbralIce) + if (InCombat) { - if (UmbralIceStacks == 2 && !HasFire - && !IsLastGCD(ActionID.ParadoxPvE)) + if (AstralSoulStacks == 6 && CurrentMp > 0) { - if (SwiftcastPvE.CanUse(out act)) return true; - if (TriplecastPvE.CanUse(out act, usedUp: true)) return true; + if (DespairPvE.CanUse(out act)) return true; } + if (TriplecastPvE.Cooldown.CurrentCharges == 2) + { + if (AstralSoulStacks == 6) + { + if (TriplecastPvE.CanUse(out act)) return true; + } - if (UmbralIceStacks < 3 && LucidDreamingPvE.CanUse(out act)) return true; - //if (SharpcastPvE.CanUse(out act, usedUp: true)) return true; - } - if (InAstralFire) - { - if (!CombatElapsedLess(6) && CombatElapsedLess(9) && LeyLinesPvE.CanUse(out act)) return true; - if (TriplecastPvE.CanUse(out act, gcdCountForAbility: 5)) return true; - } - if (AmplifierPvE.CanUse(out act)) return true; - return base.AttackAbility(nextGCD, out act); - } - - protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) - { - //To Fire - if (CurrentMp >= 7200 && UmbralIceStacks == 2 && ParadoxPvE.EnoughLevel) - { - if ((HasFire || HasSwift) && TransposePvE.CanUse(out act)) return true; - } - if (nextGCD.IsTheSameTo(false, FireIiiPvE) && HasFire) - { - if (TransposePvE.CanUse(out act)) return true; - } - - //Using Manafont - if (InAstralFire) - { - if (CurrentMp == 0 && ManafontPvE.CanUse(out act)) return true; - //To Ice - if (NeedToTransposeGoIce(true) && TransposePvE.CanUse(out act)) return true; - } + if (InUmbralIce && UmbralHearts == 0) + { + if (TriplecastPvE.CanUse(out act)) return true; + } + } + if (TriplecastPvE.Cooldown.CurrentCharges > 0 && InAstralFire) + { + if (TriplecastPvE.CanUse(out act)) return true; + } + if (AstralSoulStacks == 6 && InAstralFire && !NextGCDisInstant) + { + if (SwiftcastPvE.CanUse(out act)) return true; + } - return base.EmergencyAbility(nextGCD, out act); - } + if (IsPolyglotStacksMaxed) + { + if (FoulPvE.CanUse(out act)) return true; + if (XenoglossyPvE.CanUse(out act)) return true; + } + if (UmbralIceStacks == 3 && UmbralHearts == 3 && InUmbralIce) + { + if (TransposePvE.CanUse(out act)) return true; + } - protected override bool GeneralGCD(out IAction? act) - { - if (InFireOrIce(out act, out var mustGo)) return true; - if (mustGo) return false; - //Triplecast for moving. - if (IsMoving && HasHostilesInRange && TriplecastPvE.CanUse(out act, usedUp: true)) return true; - if (AddElementBase(out act)) return true; - if (ScathePvE.CanUse(out act)) return true; - if (MaintainStatus(out act)) return true; + if (InAstralFire && AstralFireStacks == 3 && !Player.HasStatus(true, StatusID.Firestarter)) + { + if (TransposePvE.CanUse(out act)) return true; + } - return base.GeneralGCD(out act); - } + //manafont can only be used in astral fire, it gives 3 umbral hearts. If we are at 2 or more our next umbral soul will kick off paradox + if (InAstralFire && UmbralHearts < 2 && !NextGCDisInstant && AstralSoulStacks == 0) + { + if (FixedMF.CanUse(out act)) return true; + } - private bool InFireOrIce(out IAction? act, out bool mustGo) - { - act = null; - mustGo = false; - if (InUmbralIce) - { - if (GoFire(out act)) return true; - if (MaintainIce(out act)) return true; - if (DoIce(out act)) return true; - } - if (InAstralFire) - { - if (GoIce(out act)) return true; - if (MaintainFire(out act)) return true; - if (DoFire(out act)) return true; + if (UmbralHearts < 2 && !NextGCDisInstant && AstralSoulStacks == 0) + { + if (SwiftcastPvE.CanUse(out act)) return true; + } } - return false; - } - - private bool GoIce(out IAction? act) - { - act = null; - - if (!NeedToGoIce) return false; - - //Use Manafont or transpose. - if ((!ManafontPvE.Cooldown.IsCoolingDown || NeedToTransposeGoIce(false)) - && UseInstanceSpell(out act)) return true; - //Go to Ice. - if (BlizzardIiPvE.CanUse(out act)) return true; - if (BlizzardIiiPvE.CanUse(out act)) return true; - if (TransposePvE.CanUse(out act)) return true; - if (BlizzardPvE.CanUse(out act)) return true; - return false; - } - private bool MaintainIce(out IAction? act) - { - act = null; - if (UmbralIceStacks == 1) - { - if (BlizzardIiPvE.CanUse(out act)) return true; - - if (Player.Level == 90 && BlizzardPvE.CanUse(out act)) return true; - if (BlizzardIiiPvE.CanUse(out act)) return true; - } - if (UmbralIceStacks == 2 && Player.Level < 90) - { - if (BlizzardIiPvE.CanUse(out act)) return true; - if (BlizzardPvE.CanUse(out act)) return true; - } - return false; + return base.AttackAbility(nextGCD, out act); } - private bool DoIce(out IAction? act) + protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) { - act = null; - - if (IsLastAction(ActionID.UmbralSoulPvE, ActionID.TransposePvE) - && IsParadoxActive && BlizzardPvE.CanUse(out act)) return true; - - if (UmbralIceStacks == 3 && UsePolyglot(out act)) return true; - //Add Hearts - if (UmbralIceStacks == 3 && - BlizzardIvPvE.EnoughLevel && UmbralHearts < 3 && !IsLastGCD - (ActionID.BlizzardIvPvE, ActionID.FreezePvE)) - { - if (FreezePvE.CanUse(out act)) return true; - if (BlizzardIvPvE.CanUse(out act)) return true; - } - - if (AddThunder(out act, 5)) return true; - if (UmbralIceStacks == 2 && UsePolyglot(out act, 0)) return true; - - if (IsParadoxActive) - { - if (BlizzardPvE.CanUse(out act)) return true; - } - if (BlizzardIiPvE.CanUse(out act)) return true; - if (BlizzardIvPvE.CanUse(out act)) return true; - if (BlizzardPvE.CanUse(out act)) return true; - return false; + return base.EmergencyAbility(nextGCD, out act); } - private bool GoFire(out IAction? act) + protected override bool GeneralGCD(out IAction? act) { - act = null; - - //Transpose line - if (UmbralIceStacks < 3) return false; - - //Need more MP - - if (CurrentMp < 9600 && Player.CastActionId != 3576) return false; - if (IsParadoxActive) { - if (BlizzardPvE.CanUse(out act)) return true; - } - - //Go to Fire. - if (FireIiPvE.CanUse(out act)) return true; - if (FireIiiPvE.CanUse(out act)) return true; - if (TransposePvE.CanUse(out act)) return true; - if (FirePvE.CanUse(out act)) return true; - - return false; - } - - private bool MaintainFire(out IAction? act) - { - act = null; - switch (AstralFireStacks) - { - case 1: - if (FireIiPvE.CanUse(out act)) return true; - if (UseN15) - { - if (HasFire && FireIiiPvE.CanUse(out act)) return true; - if (IsParadoxActive && FirePvE.CanUse(out act)) return true; - } - if (FireIiiPvE.CanUse(out act)) return true; - break; - case 2: - if (FireIiPvE.CanUse(out act)) return true; - if (FirePvE.CanUse(out act)) return true; - break; - } - - if (ElementTimeEndAfterGCD(ExtendTimeSafely ? 3u : 2u)) - { - if (CurrentMp >= FirePvE.Info.MPNeed * 2 + 800 && FirePvE.CanUse(out act)) return true; - if (FlarePvE.CanUse(out act)) return true; - if (DespairPvE.CanUse(out act)) return true; - } - - return false; - } - - private bool DoFire(out IAction? act) - { - act = null; - if (UsePolyglot(out act)) return true; - - // Add thunder only at combat start. - if (CombatElapsedLess(5)) - { - if (AddThunder(out act, 0)) return true; + if (ParadoxPvE.CanUse(out act)) return true; } - - if (TriplecastPvE.CanUse(out act)) return true; - - if (AddThunder(out act, 0) && Player.WillStatusEndGCD(1, 0, true, - StatusID.Thundercloud)) return true; - - if (UmbralHearts < 2 && FlarePvE.CanUse(out act)) return true; - if (FireIiPvE.CanUse(out act)) return true; - - if (CurrentMp >= FirePvE.Info.MPNeed + 800) + if (NextGCDisInstant) { - if (FireIvPvE.EnoughLevel) + if (InUmbralIce && UmbralHearts == 0) { - if (FireIvPvE.CanUse(out act)) return true; + if (BlizzardIvPvE.CanUse(out act)) return true; } - else if (HasFire) + if (AstralSoulStacks == 6) { - if (FireIiiPvE.CanUse(out act)) return true; + if (FlareStarPvE.CanUse(out act)) return true; + } + if (InAstralFire && AstralSoulStacks < 6) + { + if (FlarePvE.CanUse(out act, skipAoeCheck:true)) return true; } - if (FirePvE.CanUse(out act)) return true; - } - - if (DespairPvE.CanUse(out act)) return true; - - return false; - } - - private bool UseInstanceSpell(out IAction? act) - { - act = null; - if (UsePolyglot(out act)) return true; - if (HasThunder && AddThunder(out act, 1)) return true; - if (UsePolyglot(out act, 0)) return true; - return false; - } - private bool AddThunder(out IAction? act, uint gcdCount = 3) - { - act = null; + } - if (Player.HasStatus(true, (StatusID)3870)) + if (!InAstralFire && !InUmbralIce) { - //Return if just used. - if (IsLastGCD(ActionID.ThunderPvE, ActionID.ThunderIiPvE, ActionID.ThunderIiiPvE, ActionID.ThunderIvPvE)) return false; - - //So long for thunder. - if (ThunderPvE.CanUse(out _) && (!ThunderPvE.Target.Target?.WillStatusEndGCD(gcdCount, 0, true, - StatusID.Thunder, StatusID.ThunderIi, StatusID.ThunderIii, StatusID.ThunderIv) ?? false)) - return false; + if (BlizzardIiiPvE.CanUse(out act)) return true; + } + if (HostileTarget != null && (!HostileTarget.HasStatus(true, StatusID.Thunder, StatusID.ThunderIi, StatusID.ThunderIii, StatusID.ThunderIv, StatusID.HighThunder_3872, StatusID.HighThunder) || HostileTarget.WillStatusEnd(3, true, StatusID.Thunder, StatusID.ThunderIi, StatusID.ThunderIii, StatusID.ThunderIv, StatusID.HighThunder_3872, StatusID.HighThunder))) + { if (ThunderIiPvE.CanUse(out act)) return true; if (ThunderPvE.CanUse(out act)) return true; } - return false; - } - - private bool AddElementBase(out IAction? act) - { - act = null; - if (CurrentMp >= 7200) + if (InUmbralIce && (UmbralIceStacks < 3 || UmbralHearts < 3) && NextGCDisInstant) { - if (FireIiPvE.CanUse(out act)) return true; - if (FireIiiPvE.CanUse(out act)) return true; - if (FirePvE.CanUse(out act)) return true; + if (BlizzardIvPvE.CanUse(out act)) return true; } - else + + if (InUmbralIce && (UmbralIceStacks <3 || UmbralHearts < 3) && !NextGCDisInstant) { - if (BlizzardIiPvE.CanUse(out act)) return true; - if (BlizzardIiiPvE.CanUse(out act)) return true; - if (BlizzardPvE.CanUse(out act)) return true; + if (FixedUS.CanUse(out act)) return true; } - return false; - } - - private bool UsePolyglot(out IAction? act, uint gcdCount = 3) - { - act = null; - if (gcdCount == 0 || EnchinaEndAfterGCD(gcdCount)) + if (InAstralFire && Player.HasStatus(true, StatusID.Firestarter)) { - if (FoulPvE.CanUse(out act)) return true; - if (XenoglossyPvE.CanUse(out act)) return true; + if (FireIiiPvE.CanUse(out act)) return true; } - return false; - } - private bool MaintainStatus(out IAction? act) - { - act = null; - if (CombatElapsedLess(6)) return false; - if (UmbralSoulPvE.CanUse(out act)) return true; - if (InAstralFire && TransposePvE.CanUse(out act)) return true; - if (UseTransposeForParadox && - InUmbralIce && !IsParadoxActive && UmbralIceStacks == 3 - && TransposePvE.CanUse(out act)) return true; - - return false; + return base.GeneralGCD(out act); } + + [RotationDesc(ActionID.BetweenTheLinesPvE, ActionID.LeyLinesPvE)] protected override bool HealSingleAbility(IAction nextGCD, out IAction? act) { diff --git a/Advanced_Rotations/PVE/Ranged_Magic/PCT.cs b/Advanced_Rotations/PVE/Ranged_Magic/PCT.cs deleted file mode 100644 index f5fafb3..0000000 --- a/Advanced_Rotations/PVE/Ranged_Magic/PCT.cs +++ /dev/null @@ -1,283 +0,0 @@ -using FFXIVClientStructs.FFXIV.Client.UI; -using Lumina.Excel.GeneratedSheets; -using RotationSolver.Basic.Data; -using System; -using static Lumina.Data.Parsing.Layer.LayerCommon; - -namespace RabbsRotationsNET8.Magical; - -[Rotation("BobRoss", CombatType.PvE, GameVersion = "7.0")] -[SourceCode(Path = "main/DefaultRotations/Magical/PCT_Default.cs")] -[Api(1)] -public sealed class PCT_Default : PictomancerRotation -{ - - - - - public override MedicineType MedicineType => MedicineType.Intelligence; - public static IBaseAction RainbowPrePull { get; } = new BaseAction((ActionID)34688); - #region Countdown logic - // Defines logic for actions to take during the countdown before combat starts. - protected override IAction? CountDownAction(float remainTime) - { - IAction act; - if (!InCombat) - { - - - if (!CreatureMotifDrawn) - { - if (PomMotifPvE.CanUse(out act) && CreatureMotifPvE.AdjustedID == PomMotifPvE.ID) return act; - if (WingMotifPvE.CanUse(out act) && CreatureMotifPvE.AdjustedID == WingMotifPvE.ID) return act; - if (ClawMotifPvE.CanUse(out act) && CreatureMotifPvE.AdjustedID == ClawMotifPvE.ID) return act; - if (MawMotifPvE.CanUse(out act) && CreatureMotifPvE.AdjustedID == MawMotifPvE.ID) return act; - } - if (!WeaponMotifDrawn) - { - if (HammerMotifPvE.CanUse(out act)) return act; - } - if (!LandscapeMotifDrawn) - { - if (StarrySkyMotifPvE.CanUse(out act) && !Player.HasStatus(true, StatusID.Hyperphantasia)) return act; - } - } - if (remainTime < RainbowDripPvE.Info.CastTime + CountDownAhead) - { - if (StrikingMusePvE.CanUse(out act, skipCastingCheck: true, skipStatusProvideCheck: true, skipComboCheck: true, skipAoeCheck: true, usedUp: true) && WeaponMotifDrawn) return act; - } - if (remainTime < RainbowDripPvE.Info.CastTime + 0.4f + CountDownAhead) - { - if (RainbowPrePull.CanUse(out act, skipAoeCheck:true,skipCastingCheck:true, skipStatusProvideCheck:true)) return act; - } - return base.CountDownAction(remainTime); - } - #endregion - - #region Emergency Logic - // Determines emergency actions to take based on the next planned GCD action. - protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) - { - act = null; - - return base.EmergencyAbility(nextGCD, out act); - } - #endregion - - #region oGCD Logic - protected override bool AttackAbility(IAction nextGCD, out IAction? act) - { - - - - if (Player.HasStatus(true, StatusID.StarryMuse)) - { - if (Player.HasStatus(true, StatusID.SubtractiveSpectrum) && !Player.HasStatus(true, StatusID.SubtractivePalette)) - { - if (SubtractivePalettePvE.CanUse(out act)) return true; - } - - - if (CreatureMotifDrawn) - { - if (FangedMusePvE.CanUse(out act, skipCastingCheck: true, skipStatusProvideCheck: true, skipComboCheck: true, skipAoeCheck: true, usedUp: true) && CreatureMotifDrawn && LivingMusePvE.AdjustedID == FangedMusePvE.ID) return true; - } - - if (RetributionOfTheMadeenPvE.CanUse(out act, skipCastingCheck: true, skipStatusProvideCheck: true, skipComboCheck: true, skipAoeCheck: true, usedUp: true) && MadeenPortraitReady) return true; - - - } - - if (!Player.HasStatus(true, StatusID.SubtractivePalette) && (PaletteGauge >= 50 || Player.HasStatus(true, StatusID.SubtractiveSpectrum)) && SubtractivePalettePvE.CanUse(out act)) return true; - - if (InCombat) - { - if (ScenicMusePvE.CanUse(out act, skipCastingCheck: true, skipStatusProvideCheck: true, skipComboCheck: true, skipAoeCheck: true, usedUp: true) && LandscapeMotifDrawn && CreatureMotifDrawn && CombatTime > 5) return true; - if (RetributionOfTheMadeenPvE.CanUse(out act, skipCastingCheck: true, skipStatusProvideCheck: true, skipComboCheck: true, skipAoeCheck: true, usedUp: true) && MadeenPortraitReady) return true; - if (MogOfTheAgesPvE.CanUse(out act, skipCastingCheck: true, skipStatusProvideCheck: true, skipComboCheck: true, skipAoeCheck: true, usedUp: true) && MooglePortraitReady) return true; - if (StrikingMusePvE.CanUse(out act, skipCastingCheck: true, skipStatusProvideCheck: true, skipComboCheck: true, skipAoeCheck: true, usedUp: true) && WeaponMotifDrawn) return true; - if (PomMusePvE.CanUse(out act, skipCastingCheck: true, skipStatusProvideCheck: true, skipComboCheck: true, skipAoeCheck: true, usedUp: true) && CreatureMotifDrawn && LivingMusePvE.AdjustedID == PomMusePvE.ID) return true; - if (WingedMusePvE.CanUse(out act, skipCastingCheck: true, skipStatusProvideCheck: true, skipComboCheck: true, skipAoeCheck: true, usedUp: true) && CreatureMotifDrawn && LivingMusePvE.AdjustedID == WingedMusePvE.ID) return true; - if (ClawedMusePvE.CanUse(out act, skipCastingCheck: true, skipStatusProvideCheck: true, skipComboCheck: true, skipAoeCheck: true, usedUp: true) && CreatureMotifDrawn && LivingMusePvE.AdjustedID == ClawedMusePvE.ID) return true; - } - - return base.AttackAbility(nextGCD, out act); - } - - protected override bool MoveForwardAbility(IAction nextGCD, out IAction? act) - { - act = null; - - - return base.MoveForwardAbility(nextGCD, out act); - } - #endregion - - #region GCD Logic - protected override bool MoveForwardGCD(out IAction? act) - { - act = null; - - return base.MoveForwardGCD(out act); - } - - protected override bool GeneralGCD(out IAction? act) - { - var IsTargetDying = HostileTarget?.IsDying() ?? false; - - if (CombatTime < 5) - { - if (StrikingMusePvE.CanUse(out act, skipCastingCheck: true, skipStatusProvideCheck: true, skipComboCheck: true, skipAoeCheck: true, usedUp: true) && WeaponMotifDrawn) return true; - if (HolyInWhitePvE.CanUse(out act, skipCastingCheck: true, skipAoeCheck: true) && Paint > 0) return true; - if (!CreatureMotifDrawn) - { - if (PomMotifPvE.CanUse(out act) && CreatureMotifPvE.AdjustedID == PomMotifPvE.ID) return true; - if (WingMotifPvE.CanUse(out act) && CreatureMotifPvE.AdjustedID == WingMotifPvE.ID) return true; - if (ClawMotifPvE.CanUse(out act) && CreatureMotifPvE.AdjustedID == ClawMotifPvE.ID) return true; - if (MawMotifPvE.CanUse(out act) && CreatureMotifPvE.AdjustedID == MawMotifPvE.ID) return true; - } - - } - - if (Player.HasStatus(true, StatusID.StarryMuse)) - { - if (CometInBlackPvE.CanUse(out act, skipCastingCheck: true, skipAoeCheck: true) && Paint > 0 && Player.HasStatus(true, StatusID.MonochromeTones)) return true; - - } - - if (StarPrismPvE.CanUse(out act, skipAoeCheck:true) && Player.HasStatus(true, StatusID.Starstruck)) return true; - - if (RainbowDripPvE.CanUse(out act, skipAoeCheck:true) && Player.HasStatus(true, StatusID.RainbowBright)) return true; - - // white/black paint use while moving - if (IsMoving) - { - if (HammerStampPvE.CanUse(out act, skipCastingCheck: true, skipAoeCheck: true) && Player.HasStatus(true, StatusID.HammerTime) && InCombat) return true; - if (CometInBlackPvE.CanUse(out act, skipCastingCheck: true, skipAoeCheck: true) && Paint > 0 && Player.HasStatus(true, StatusID.MonochromeTones)) return true; - if (HolyInWhitePvE.CanUse(out act, skipCastingCheck: true, skipAoeCheck: true) && Paint > 0) return true; - } - - - - if (HammerStampPvE.CanUse(out act, skipCastingCheck: true, skipAoeCheck: true) && Player.HasStatus(true, StatusID.HammerTime) && InCombat) return true; - - if (!InCombat) - { - - - if (!CreatureMotifDrawn) - { - if (PomMotifPvE.CanUse(out act) && CreatureMotifPvE.AdjustedID == PomMotifPvE.ID) return true; - if (WingMotifPvE.CanUse(out act) && CreatureMotifPvE.AdjustedID == WingMotifPvE.ID) return true; - if (ClawMotifPvE.CanUse(out act) && CreatureMotifPvE.AdjustedID == ClawMotifPvE.ID) return true; - if (MawMotifPvE.CanUse(out act) && CreatureMotifPvE.AdjustedID == MawMotifPvE.ID) return true; - } - if (!WeaponMotifDrawn) - { - if (HammerMotifPvE.CanUse(out act)) return true; - } - if (!LandscapeMotifDrawn) - { - if (StarrySkyMotifPvE.CanUse(out act)&&!Player.HasStatus(true, StatusID.Hyperphantasia)) return true; - } - - if (RainbowDripPvE.CanUse(out act)) return true; - - } - if (InCombat && !Player.HasStatus(true, StatusID.StarryMuse) && !Player.HasStatus(true, StatusID.Hyperphantasia) && !IsTargetDying && (HasSwift || !HasHostilesInMaxRange) && (!CreatureMotifDrawn || (!WeaponMotifDrawn && !Player.HasStatus(true, StatusID.HammerTime)) || !LandscapeMotifDrawn)) - { - - if (!LandscapeMotifDrawn) - { - if (StarrySkyMotifPvE.CanUse(out act) && !Player.HasStatus(true, StatusID.Hyperphantasia)) return true; - } - if (!WeaponMotifDrawn && !Player.HasStatus(true, StatusID.HammerTime)) - { - if (HammerMotifPvE.CanUse(out act) && CombatTime > 23) return true; - } - if (!CreatureMotifDrawn) - { - if (PomMotifPvE.CanUse(out act) && CreatureMotifPvE.AdjustedID == PomMotifPvE.ID) return true; - if (WingMotifPvE.CanUse(out act) && CreatureMotifPvE.AdjustedID == WingMotifPvE.ID) return true; - if (ClawMotifPvE.CanUse(out act) && CreatureMotifPvE.AdjustedID == ClawMotifPvE.ID) return true; - if (MawMotifPvE.CanUse(out act) && CreatureMotifPvE.AdjustedID == MawMotifPvE.ID) return true; - } - } - - if (!LandscapeMotifDrawn && ScenicMusePvE.Cooldown.RecastTimeRemainOneCharge <= 15 && !Player.HasStatus(true, StatusID.StarryMuse) && !Player.HasStatus(true, StatusID.Hyperphantasia)) - { - if (StarrySkyMotifPvE.CanUse(out act) && !Player.HasStatus(true, StatusID.Hyperphantasia)) return true; - } - if (!CreatureMotifDrawn && (LivingMusePvE.Cooldown.HasOneCharge || LivingMusePvE.Cooldown.RecastTimeRemainOneCharge <= CreatureMotifPvE.Info.CastTime) && !Player.HasStatus(true, StatusID.StarryMuse) && !Player.HasStatus(true, StatusID.Hyperphantasia)) - { - if (PomMotifPvE.CanUse(out act) && CreatureMotifPvE.AdjustedID == PomMotifPvE.ID) return true; - if (WingMotifPvE.CanUse(out act) && CreatureMotifPvE.AdjustedID == WingMotifPvE.ID) return true; - if (ClawMotifPvE.CanUse(out act) && CreatureMotifPvE.AdjustedID == ClawMotifPvE.ID) return true; - if (MawMotifPvE.CanUse(out act) && CreatureMotifPvE.AdjustedID == MawMotifPvE.ID) return true; ; - } - if (!WeaponMotifDrawn && !Player.HasStatus(true, StatusID.HammerTime) && (SteelMusePvE.Cooldown.HasOneCharge || SteelMusePvE.Cooldown.RecastTimeRemainOneCharge <= WeaponMotifPvE.Info.CastTime) && !Player.HasStatus(true, StatusID.StarryMuse) && !Player.HasStatus(true, StatusID.Hyperphantasia)) - { - if (HammerMotifPvE.CanUse(out act)) return true; - } - - - - - - - - - //white paint over cap protection - if (Paint == 5) - { - if (CometInBlackPvE.CanUse(out act, skipCastingCheck: true, skipAoeCheck: true) && Paint > 0 && Player.HasStatus(true, StatusID.MonochromeTones)) return true; - if (HolyInWhitePvE.CanUse(out act, skipCastingCheck: true, skipAoeCheck: true) && Paint > 0) return true; - } - - - - - - ///123 combo stuff with moving checks - if (!IsMoving) - { - - ///aoe - /// - - if (ThunderIiInMagentaPvE.CanUse(out act) && Player.HasStatus(true, StatusID.SubtractivePalette) && Player.HasStatus(true, StatusID.AetherhuesIi)) return true; - if (StoneIiInYellowPvE.CanUse(out act) && Player.HasStatus(true, StatusID.SubtractivePalette) && Player.HasStatus(true, StatusID.Aetherhues)) return true; - if (BlizzardIiInCyanPvE.CanUse(out act) && Player.HasStatus(true, StatusID.SubtractivePalette)) return true; - - - if (WaterIiInBluePvE.CanUse(out act) && Player.HasStatus(true, StatusID.AetherhuesIi)) return true; - if (AeroIiInGreenPvE.CanUse(out act) && Player.HasStatus(true, StatusID.Aetherhues)) return true; - if (FireIiInRedPvE.CanUse(out act)) return true; - - ///single target - /// - - - if (ThunderInMagentaPvE.CanUse(out act) && Player.HasStatus(true, StatusID.SubtractivePalette) && Player.HasStatus(true, StatusID.AetherhuesIi)) return true; - if (StoneInYellowPvE.CanUse(out act) && Player.HasStatus(true, StatusID.SubtractivePalette) && Player.HasStatus(true, StatusID.Aetherhues)) return true; - if (BlizzardInCyanPvE.CanUse(out act) && Player.HasStatus(true, StatusID.SubtractivePalette)) return true; - - - if (WaterInBluePvE.CanUse(out act) && Player.HasStatus(true, StatusID.AetherhuesIi)) return true; - if (AeroInGreenPvE.CanUse(out act) && Player.HasStatus(true, StatusID.Aetherhues)) return true; - if (FireInRedPvE.CanUse(out act)) return true; - - } - return base.GeneralGCD(out act); - } - - private bool AttackGCD(out IAction? act, bool burst) - { - act = null; - - return false; - } - #endregion - - -} diff --git a/Advanced_Rotations/PVE/Ranged_Phys/BRD.cs b/Advanced_Rotations/PVE/Ranged_Phys/BRD.cs deleted file mode 100644 index bbf0553..0000000 --- a/Advanced_Rotations/PVE/Ranged_Phys/BRD.cs +++ /dev/null @@ -1,236 +0,0 @@ -namespace RabbsRotationsNET8.Ranged; - -[Rotation("RabbsBard", CombatType.PvE, GameVersion = "7.00", - Description = "Please make sure that the three song times add up to 120 seconds, Wanderers default first song for now.")] -[SourceCode(Path = "main/DefaultRotations/Ranged/BRD_Default.cs")] -[Api(2)] -public sealed class BRD_Default : BardRotation -{ - #region Config Options - [RotationConfig(CombatType.PvE, Name = @"Use Raging Strikes on ""Wanderer's Minuet""")] - public bool BindWAND { get; set; } = false; - - [Range(1, 45, ConfigUnitType.Seconds, 1)] - [RotationConfig(CombatType.PvE, Name = "Wanderer's Minuet Uptime")] - public float WANDTime { get; set; } = 43; - - [Range(0, 45, ConfigUnitType.Seconds, 1)] - [RotationConfig(CombatType.PvE, Name = "Mage's Ballad Uptime")] - public float MAGETime { get; set; } = 34; - - [Range(0, 45, ConfigUnitType.Seconds, 1)] - [RotationConfig(CombatType.PvE, Name = "Army's Paeon Uptime")] - public float ARMYTime { get; set; } = 43; - - [RotationConfig(CombatType.PvE, Name = "First Song")] - private Song FirstSong { get; set; } = Song.WANDERER; - - private bool BindWANDEnough => BindWAND && this.TheWanderersMinuetPvE.EnoughLevel; - private float WANDRemainTime => 45 - WANDTime; - private float MAGERemainTime => 45 - MAGETime; - private float ARMYRemainTime => 45 - ARMYTime; - public static IBaseAction St8Shot { get; } = new BaseAction((ActionID)98); - public static IBaseAction WideVfix { get; } = new BaseAction((ActionID)36974); - #endregion - - #region oGCD Logic - protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) - { - if (nextGCD.IsTheSameTo(true, StraightShotPvE, VenomousBitePvE, WindbitePvE, IronJawsPvE)) - { - return base.EmergencyAbility(nextGCD, out act); - } - else if ((!RagingStrikesPvE.EnoughLevel || Player.HasStatus(true, StatusID.RagingStrikes)) && (!BattleVoicePvE.EnoughLevel || Player.HasStatus(true, StatusID.BattleVoice))) - { - if ((EmpyrealArrowPvE.Cooldown.IsCoolingDown && !EmpyrealArrowPvE.Cooldown.WillHaveOneChargeGCD(1) || !EmpyrealArrowPvE.EnoughLevel) && Repertoire != 3) - { - if (!Player.HasStatus(true, StatusID.StraightShotReady) && BarragePvE.CanUse(out act)) return true; - } - } - - return base.EmergencyAbility(nextGCD, out act); - } - - protected override bool AttackAbility(IAction nextGCD, out IAction? act) - { - act = null; - if (Song == Song.NONE && InCombat) - { - switch (FirstSong) - { - case Song.WANDERER: - if (TheWanderersMinuetPvE.CanUse(out act)) return true; - break; - - case Song.ARMY: - if (ArmysPaeonPvE.CanUse(out act)) return true; - break; - - case Song.MAGE: - if (MagesBalladPvE.CanUse(out act)) return true; - break; - } - if (TheWanderersMinuetPvE.CanUse(out act)) return true; - if (MagesBalladPvE.CanUse(out act)) return true; - if (ArmysPaeonPvE.CanUse(out act)) return true; - } - - if (IsBurst && Song != Song.NONE && MagesBalladPvE.EnoughLevel) - { - if (RagingStrikesPvE.CanUse(out act)) - { - if (BindWANDEnough && Song == Song.WANDERER && TheWanderersMinuetPvE.EnoughLevel) return true; - if (!BindWANDEnough) return true; - } - - - - if (RadiantFinalePvE.CanUse(out act, skipAoeCheck: true)) - - - { - if (Player.HasStatus(true, StatusID.RagingStrikes) && RagingStrikesPvE.Cooldown.ElapsedOneChargeAfterGCD(1)) return true; - } - - if (BattleVoicePvE.CanUse(out act, skipAoeCheck: true)) - { - if (nextGCD.IsTheSameTo(true, RadiantFinalePvE)) return true; - - if (nextGCD.IsTheSameTo(true, RadiantEncorePvE)) return true; - - if (Player.HasStatus(true, StatusID.RagingStrikes) && RagingStrikesPvE.Cooldown.ElapsedOneChargeAfterGCD(1)) return true; - } - } - - if (RadiantFinalePvE.EnoughLevel && RadiantFinalePvE.Cooldown.IsCoolingDown && BattleVoicePvE.EnoughLevel && !BattleVoicePvE.Cooldown.IsCoolingDown) return false; - - if (TheWanderersMinuetPvE.CanUse(out act) && InCombat) - { - if (SongEndAfter(ARMYRemainTime) && (Song != Song.NONE || Player.HasStatus(true, StatusID.ArmysEthos))) return true; - } - - if (Song != Song.NONE && EmpyrealArrowPvE.CanUse(out act)) return true; - - if (PitchPerfectPvE.CanUse(out act, skipCastingCheck:true, skipAoeCheck:true, skipComboCheck:true)) - { - if (SongEndAfter(3) && Repertoire > 0) return true; - - if (Repertoire == 3) return true; - - if (Repertoire == 2 && EmpyrealArrowPvE.Cooldown.WillHaveOneChargeGCD()) return true; - } - - if (MagesBalladPvE.CanUse(out act) && InCombat) - { - if (Song == Song.WANDERER && SongEndAfter(WANDRemainTime) && Repertoire == 0) return true; - if (Song == Song.ARMY && SongEndAfterGCD(2) && TheWanderersMinuetPvE.Cooldown.IsCoolingDown) return true; - } - - if (ArmysPaeonPvE.CanUse(out act) && InCombat) - { - if (TheWanderersMinuetPvE.EnoughLevel && SongEndAfter(MAGERemainTime) && Song == Song.MAGE) return true; - if (TheWanderersMinuetPvE.EnoughLevel && SongEndAfter(2) && MagesBalladPvE.Cooldown.IsCoolingDown && Song == Song.WANDERER) return true; - if (!TheWanderersMinuetPvE.EnoughLevel && SongEndAfter(2)) return true; - } - - if (SidewinderPvE.CanUse(out act)) - { - if (Player.HasStatus(true, StatusID.BattleVoice) && (Player.HasStatus(true, StatusID.RadiantFinale) || !RadiantFinalePvE.EnoughLevel)) return true; - - if (!BattleVoicePvE.Cooldown.WillHaveOneCharge(10) && !RadiantFinalePvE.Cooldown.WillHaveOneCharge(10)) return true; - - if (RagingStrikesPvE.Cooldown.IsCoolingDown && !Player.HasStatus(true, StatusID.RagingStrikes)) return true; - } - - if (BloodletterLogic(out act)) return true; - - return base.AttackAbility(nextGCD, out act); - } - #endregion - - #region GCD Logic - protected override bool GeneralGCD(out IAction? act) - { - if (IronJawsPvE.CanUse(out act)) return true; - if (IronJawsPvE.CanUse(out act, skipStatusProvideCheck: true) && (IronJawsPvE.Target.Target?.WillStatusEnd(30, true, IronJawsPvE.Setting.TargetStatusProvide ?? []) ?? false)) - { - if (Player.HasStatus(true, StatusID.RagingStrikes) && Player.WillStatusEndGCD(1, 0, true, StatusID.RagingStrikes)) return true; - } - - if (ResonantArrowPvE.CanUse(out act, skipAoeCheck:true) && Player.HasStatus(true, StatusID.ResonantArrowReady)) return true; - - if (CanUseApexArrow(out act)) return true; - if (RadiantEncorePvE.CanUse(out act, skipAoeCheck: true, skipCastingCheck: true, skipComboCheck: true, skipStatusProvideCheck: true) && Player.HasStatus(true, StatusID.RadiantEncoreReady)) return true; - if (BlastArrowPvE.CanUse(out act, skipAoeCheck: true)) - { - if (!Player.HasStatus(true, StatusID.RagingStrikes)) return true; - if (Player.HasStatus(true, StatusID.RagingStrikes) && BarragePvE.Cooldown.IsCoolingDown) return true; - } - - //aoe - if (ShadowbitePvE.CanUse(out act, skipCastingCheck: true, skipComboCheck: true) && Player.HasStatus(true, StatusID.HawksEye, StatusID.HawksEye_3861, StatusID.Barrage)) return true; - if (WideVfix.CanUse(out act, skipCastingCheck: true, skipComboCheck: true) && Player.HasStatus(true, StatusID.HawksEye, StatusID.HawksEye_3861, StatusID.Barrage)) return true; - if (QuickNockPvE.CanUse(out act)) return true; - - if (WindbitePvE.CanUse(out act)) return true; - if (VenomousBitePvE.CanUse(out act)) return true; - if (RefulgentArrowPvE.CanUse(out act, skipCastingCheck: true, skipComboCheck: true) && Player.HasStatus(true, StatusID.HawksEye, StatusID.HawksEye_3861, StatusID.Barrage)) return true; - if (St8Shot.CanUse(out act, skipCastingCheck:true,skipComboCheck:true, skipStatusProvideCheck:true, skipAoeCheck:true) && Player.HasStatus(true, StatusID.HawksEye, StatusID.HawksEye_3861, StatusID.Barrage)) return true; - if (HeavyShotPvE.CanUse(out act)) return true; - - return base.GeneralGCD(out act); - } - #endregion - - #region Extra Methods - private bool CanUseApexArrow(out IAction act) - { - if (!ApexArrowPvE.CanUse(out act, skipAoeCheck: true)) return false; - - if (QuickNockPvE.CanUse(out _) && SoulVoice == 100) return true; - - if (SoulVoice == 100 && BattleVoicePvE.Cooldown.WillHaveOneCharge(25)) return false; - - if (SoulVoice >= 80 && Player.HasStatus(true, StatusID.RagingStrikes) && Player.WillStatusEnd(10, false, StatusID.RagingStrikes)) return true; - - if (SoulVoice == 100 && Player.HasStatus(true, StatusID.RagingStrikes) && Player.HasStatus(true, StatusID.BattleVoice)) return true; - - if (Song == Song.MAGE && SoulVoice >= 80 && SongEndAfter(22) && SongEndAfter(18)) return true; - - if (!Player.HasStatus(true, StatusID.RagingStrikes) && SoulVoice == 100) return true; - - return false; - } - private bool BloodletterLogic(out IAction? act) - { - bool isBattleVoice = BattleVoicePvE.CanUse(out _); - bool isRadiantFinale = RadiantFinalePvE.CanUse(out _); - bool isRagingNow = Player.HasStatus(true, StatusID.RagingStrikes); - bool isRagingSoon = RagingStrikesPvE.Cooldown.WillHaveOneCharge(30); - bool isBloodTrait = EnhancedBloodletterTrait.EnoughLevel && BloodletterPvE.Cooldown.CurrentCharges < 3; - bool isNoBloodTrait = !EnhancedBloodletterTrait.EnoughLevel && BloodletterPvE.Cooldown.CurrentCharges < 2; - bool isEmpyrealArrowCD = EmpyrealArrowPvE.Cooldown.IsCoolingDown; - bool isEmpyrealSoon = !EmpyrealArrowPvE.Cooldown.WillHaveOneChargeGCD(); - bool isEmpyrealLevel = !EmpyrealArrowPvE.EnoughLevel; - bool isRepertoire = Repertoire != 3; - - if (HeartbreakShotPvE.CanUse(out act, usedUp: true)) - { - if (isBattleVoice || isRadiantFinale || (isRagingSoon && (isBloodTrait || isNoBloodTrait))) return false; - if (isEmpyrealArrowCD || isEmpyrealSoon || isEmpyrealLevel || isRepertoire) return true; - } - - if (RainOfDeathPvE.CanUse(out act, usedUp: true)) - { - if (isEmpyrealArrowCD || isEmpyrealSoon || isEmpyrealLevel || isRepertoire) return true; - } - - if (BloodletterPvE.CanUse(out act, usedUp: true)) - { - if (isBattleVoice || isRadiantFinale || (isRagingSoon && (isBloodTrait || isNoBloodTrait))) return false; - if (isEmpyrealArrowCD || isEmpyrealSoon || isEmpyrealLevel || isRepertoire) return true; - } - return false; - } - #endregion -} \ No newline at end of file diff --git a/Advanced_Rotations/PVE/Ranged_Phys/DNC_PVE.cs b/Advanced_Rotations/PVE/Ranged_Phys/DNC_PVE.cs deleted file mode 100644 index 1d87e8b..0000000 --- a/Advanced_Rotations/PVE/Ranged_Phys/DNC_PVE.cs +++ /dev/null @@ -1,158 +0,0 @@ -using RotationSolver.Basic.Data; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -//using static FFXIVClientStructs.FFXIV.Client.Game.Control.GazeController; - -namespace RabbsRotationsNET8.PVE.Ranged_Phys; -[Rotation("Rabbs Dancer PVE & PVP", CombatType.Both, GameVersion = "6.58")] -[Api(1)] -[SourceCode(Path = "main/RabbsRotations/Ranged/DNC.cs")] - - - -public unsafe sealed class DNC : DancerRotation -{ - - protected override IAction? CountDownAction(float remainTime) - { - if (remainTime < 0.3) - if (DanceFinishGCD(out var act)) return act; - - if (remainTime <= 15) - { - if (StandardStepPvE.CanUse(out var act, skipAoeCheck: true)) return act; - if (ExecuteStepGCD(out act)) return act; - } - return base.CountDownAction(remainTime); - } - - protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) - { - if (IsDancing) - { - if (DanceFinishGCD(out act)) return true; - if (ExecuteStepGCD(out act)) return true; - return base.EmergencyAbility(nextGCD, out act); - } - - if (TechnicalStepPvE.Cooldown.ElapsedAfter(115) - && UseBurstMedicine(out act)) return true; - - return base.EmergencyAbility(nextGCD, out act); - } - - protected override bool GeneralGCD(out IAction? act) - { - var IsTargetDying = HostileTarget?.IsDying() ?? false; - - - - #region GCD - if (IsDancing) - { - if (DanceFinishGCD(out act)) return true; - if (ExecuteStepGCD(out act)) return true; - } - - if (!Player.HasStatus(true, StatusID.ClosedPosition) && ClosedPositionPvE.CanUse(out act)) return true; - - // ST Standard Step (outside of burst) - //if (!Player.HasStatus(true, StatusID.TechnicalFinish)) - //{ - //if (AllHostileTargets.Any(p => !p.IsDying() && p.DistanceToPlayer() < 10 && p.IsTargetable) && - //TechnicalStepPvE.Cooldown.RecastTimeRemainOneCharge > 5 && - // (!FlourishPvE.Cooldown.IsCoolingDown || FlourishPvE.Cooldown.RecastTimeRemainOneCharge > 5)) - // if (StandardStepPvE.CanUse(out act)) return true; - // } - - // ST Technical Step - //if (AllHostileTargets.Any(p => !p.IsDying() && p.DistanceToPlayer() < 10) && - //InCombat && - //!Player.HasStatus(true, StatusID.StandardStep)) - //if (TechnicalStepPvE.CanUse(out act)) return true; - - // ST Saber Dance - if (TechnicalStepPvE.Cooldown.RecastTimeRemainOneCharge > 5 || !TechnicalStepPvE.Cooldown.IsCoolingDown) - { - if (Esprit >= 85 || - Player.HasStatus(true, StatusID.TechnicalFinish) && Esprit >= 50) - if (SaberDancePvE.CanUse(out act, skipAoeCheck: true)) return true; - } - - if (Player.HasStatus(true, StatusID.FlourishingStarfall)) - if (StarfallDancePvE.CanUse(out act, skipAoeCheck: true)) return true; - - if (Player.HasStatus(true, StatusID.FlourishingFinish)) - if (TillanaPvE.CanUse(out act, skipAoeCheck: true)) return true; - - // ST Standard Step (inside of burst) - // if (AllHostileTargets.Any(p => !p.IsDying() && p.DistanceToPlayer() < 10) && - // Player.HasStatus(true, StatusID.TechnicalFinish)) - // { - // if (!IsTargetDying && - // Player.StatusTime(true, StatusID.TechnicalFinish) > 5) - // if (StandardStepPvE.CanUse(out act)) return true; - // } - - if (BloodshowerPvE.CanUse(out act)) return true; - if (FountainfallPvE.CanUse(out act)) return true; - if (RisingWindmillPvE.CanUse(out act)) return true; - if (ReverseCascadePvE.CanUse(out act)) return true; - if (BladeshowerPvE.CanUse(out act)) return true; - if (WindmillPvE.CanUse(out act)) return true; - if (FountainPvE.CanUse(out act)) return true; - if (CascadePvE.CanUse(out act)) return true; - #endregion - - return base.GeneralGCD(out act); - } - - - - protected unsafe override bool AttackAbility(IAction nextGCD, out IAction? act) - { - - if (IsDancing) - { - if (DanceFinishGCD(out act)) return true; - if (ExecuteStepGCD(out act)) return true; - } - var IsTargetDying = HostileTarget?.IsDying() ?? false; - - if (Player.HasStatus(true, StatusID.TechnicalFinish) || !TechnicalStepPvE.EnoughLevel) - if (DevilmentPvE.CanUse(out act)) return true; - - // ST Flourish - if (!Player.HasStatus(true, StatusID.ThreefoldFanDance) && !Player.HasStatus(true, StatusID.FourfoldFanDance) && - !Player.HasStatus(true, StatusID.FlourishingSymmetry) && !Player.HasStatus(true, StatusID.FlourishingFlow)) - if (FlourishPvE.CanUse(out act)) return true; - - - if (Player.HasStatus(true, StatusID.ThreefoldFanDance)) - if (FanDanceIiiPvE.CanUse(out act, skipAoeCheck: true)) return true; - - // FD1 HP% Dump - if (IsTargetDying && Feathers > 0) - if (FanDancePvE.CanUse(out act)) return true; - - // Burst FD1 - if (Player.HasStatus(true, StatusID.TechnicalFinish) && Feathers > 0) - if (FanDancePvE.CanUse(out act)) return true; - - // FD1 Pooling - if (Feathers > 3 && - (TechnicalStepPvE.Cooldown.RecastTimeRemainOneCharge > 2.5f || !TechnicalStepPvE.Cooldown.IsCoolingDown)) - if (FanDancePvE.CanUse(out act)) return true; - - // FD1 Non-pooling & under burst level - if (!TechnicalStepPvE.EnoughLevel && Feathers > 0) - if (FanDancePvE.CanUse(out act)) return true; - if (Player.HasStatus(true, StatusID.FourfoldFanDance)) - if (FanDanceIvPvE.CanUse(out act, skipAoeCheck: true)) return true; - - return base.AttackAbility(nextGCD, out act); - } -} diff --git a/Advanced_Rotations/PVE/Ranged_Phys/MCH.cs b/Advanced_Rotations/PVE/Ranged_Phys/MCH.cs deleted file mode 100644 index 4a01fe5..0000000 --- a/Advanced_Rotations/PVE/Ranged_Phys/MCH.cs +++ /dev/null @@ -1,250 +0,0 @@ -using Dalamud.Game.ClientState.JobGauge.Types; -using FFXIVClientStructs.FFXIV.Client.Game.Gauge; -using RotationSolver.Basic.Data; -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Linq; -using System.Reflection; -using System.Runtime.Serialization; -using System.Text; -using System.Threading.Tasks; -using System.Xml.Linq; -//using static FFXIVClientStructs.FFXIV.Client.Game.Control.GazeController; - -namespace RabbsRotationsNET8.PVE.Ranged_Phys; -[Rotation("Rabbs Machinist (DO NOT USE YET)", CombatType.PvE, GameVersion = "6.58")] -[SourceCode(Path = "main/RabbsRotations/Ranged/MCH.cs")] - - - - - -public unsafe sealed class MCH : MachinistRotation -{ - public static float GetCooldownRemainingTime(IBaseAction baseAction) => baseAction.Cooldown.RecastTimeRemainOneCharge; - public static bool IsOffCooldown(IBaseAction baseAction) => !baseAction.Cooldown.IsCoolingDown; - public static bool IsOnCooldown(IBaseAction baseAction) => baseAction.Cooldown.IsCoolingDown; - public static bool LevelChecked(IBaseAction baseAction) => baseAction.EnoughLevel; - public static bool HasEffect(StatusID status) => Player.HasStatus(true, status); - internal static bool inOpener = false; - internal static bool readyOpener = false; - internal static bool openerStarted = false; - internal static byte step = 0; - - - - - - - protected override IAction? CountDownAction(float remainTime) - { - // var IsThereABoss = AllHostileTargets.Any(p => p.IsBossFromTTK()) || AllHostileTargets.Any(p => p.IsBossFromIcon()); - // int medicaThreshold = PartyMembers.Where(o => o.DistanceToPlayer() < 20).Count(); - - - if (remainTime < 0.2) - { - - if (IsOffCooldown(BarrelStabilizerPvE) && IsOffCooldown(AirAnchorPvE) && IsOffCooldown(WildfirePvE) && IsOffCooldown(ChainSawPvE) && IsOffCooldown(DrillPvE) - && GaussRoundPvE.Cooldown.CurrentCharges == 3 && RicochetPvE.Cooldown.CurrentCharges == 3 && ReassemblePvE.Cooldown.CurrentCharges == 2 - && !InCombat && !inOpener && !openerStarted) - { - readyOpener = true; - inOpener = false; - step = 0; - } - if ((readyOpener || openerStarted) && !inOpener) { openerStarted = true; } else { openerStarted = false; } - if (HeatedSplitShotPvE.CanUse(out var act)) return act; - - } - - //if (remainTime < 2.0 && IsThereABoss) - { - if (UseBurstMedicine(out var act, clippingCheck: false)) return act; - } - - return base.CountDownAction(remainTime); - } - - protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) - { - /* - if (ChainSawPvE.EnoughLevel && nextGCD.IsTheSameTo(true, ChainSawPvE)) - { - if (ReassemblePvE.CanUse(out act, usedUp: true)) return true; - } - - if (!DrillPvE.EnoughLevel && nextGCD.IsTheSameTo(true, CleanShotPvE) - || nextGCD.IsTheSameTo(false, AirAnchorPvE, ChainSawPvE, DrillPvE)) - { - if (ReassemblePvE.CanUse(out act, usedUp: true)) return true; - } - */ - return base.EmergencyAbility(nextGCD, out act); - } - - protected unsafe override bool GeneralGCD(out IAction? act) - { - - //opener - if (openerStarted && IsLastGCD(true, HeatedSplitShotPvE)) { inOpener = true; openerStarted = false; readyOpener = false; } - - - // Reset check for opener - if (IsOffCooldown(BarrelStabilizerPvE) && IsOffCooldown(AirAnchorPvE) && IsOffCooldown(WildfirePvE) && IsOffCooldown(ChainSawPvE) && IsOffCooldown(DrillPvE) - && GaussRoundPvE.Cooldown.CurrentCharges == 2 && RicochetPvE.Cooldown.CurrentCharges == 2 && ReassemblePvE.Cooldown.CurrentCharges == 2 - && !InCombat && !inOpener && !openerStarted) - { - readyOpener = true; - inOpener = false; - step = 0; - } - else - { readyOpener = false; } - - // Reset if opener is interrupted, requires step 0 and 1 to be explicit since the inCombat check can be slow - if (step == 0 && IsLastAbility(true, GaussRoundPvE) - || inOpener && step >= 1 && !InCombat) inOpener = false; - - // Start Opener - if (inOpener) - { - - //we do it in steps to be able to control it - if (step == 0) - { - if (IsLastAbility(true, GaussRoundPvE)) step++; - else if (GaussRoundPvE.CanUse(out act)) return true; - } - /* - if (step == 1) - { - if (IsOnCooldown(All.Swiftcast)) step++; - else return All.Swiftcast; - } - - if (step == 2) - { - if (GetRemainingCharges(Acceleration) < 2) step++; - else return Acceleration; - } - - if (step == 3) - { - if (lastComboMove == Verthunder3 && !HasEffect(Buffs.Acceleration)) step++; - else return Verthunder3; - } - - if (step == 4) - { - if (lastComboMove == Verthunder3 && !HasEffect(All.Buffs.Swiftcast)) step++; - else return Verthunder3; - } - - if (step == 5) - { - if (IsOnCooldown(Embolden)) step++; - else return Embolden; - } - - if (step == 6) - { - if (IsOnCooldown(Manafication)) step++; - else return Manafication; - } - - if (step == 7) - { - if (lastComboMove == Riposte) step++; - else return EnchantedRiposte; - } - - if (step == 8) - { - if (IsOnCooldown(Fleche)) step++; - else return Fleche; - } - - if (step == 9) - { - if (lastComboMove == Zwerchhau) step++; - else return EnchantedZwerchhau; - } - - if (step == 10) - { - if (IsOnCooldown(ContreSixte)) step++; - else return ContreSixte; - } - - if (step == 11) - { - if (lastComboMove == Redoublement || Gauge.ManaStacks == 3) step++; - else return EnchantedRedoublement; - } - - if (step == 12) - { - if (GetRemainingCharges(Corpsacorps) < 2) step++; - else return Corpsacorps; - } - - if (step == 13) - { - if (GetRemainingCharges(Engagement) < 2) step++; - else return Engagement; - } - - if (step == 14) - { - if (lastComboMove == Verholy) step++; - else return Verholy; - } - - if (step == 15) - { - if (GetRemainingCharges(Corpsacorps) < 1) step++; - else return Corpsacorps; - } - - if (step == 16) - { - if (GetRemainingCharges(Engagement) < 1) step++; - else return Engagement; - } - - if (step == 17) - { - if (lastComboMove == Scorch) step++; - else return Scorch; - } - - if (step == 18) - { - if (lastComboMove == Resolution) step++; - else return Resolution; - } - */ - inOpener = false; - } - - //1-2-3 Combo - //aoe - if (SpreadShotPvE.CanUse(out act)) return true; - //Single - if (CleanShotPvE.CanUse(out act)) return true; - if (SlugShotPvE.CanUse(out act)) return true; - if (SplitShotPvE.CanUse(out act)) return true; - - - - return base.GeneralGCD(out act); - } - - protected unsafe override bool AttackAbility(IAction nextGCD, out IAction? act) - { - return base.AttackAbility(nextGCD, out act); - } - -} \ No newline at end of file diff --git a/Advanced_Rotations/PVE/Tank/GNB_PVE.cs b/Advanced_Rotations/PVE/Tank/GNB_PVE.cs deleted file mode 100644 index 62b783d..0000000 --- a/Advanced_Rotations/PVE/Tank/GNB_PVE.cs +++ /dev/null @@ -1,245 +0,0 @@ -using Dalamud.Game; -using FFXIVClientStructs.FFXIV.Client.Game; -using RotationSolver.Basic.Data; -using System; -//using static FFXIVClientStructs.FFXIV.Client.Game.Control.GazeController; - -namespace RabbsRotationsNET8.PVE.Tank; - -[Rotation("Rabbs Gnb (Single Target Only for now)", CombatType.PvE, GameVersion = "6.58")] -[SourceCode(Path = "main/RabbsRotations/Tank/GNB.cs")] -[Api(1)] -public unsafe sealed class GNB_PVE : GunbreakerRotation -{ - - public override bool CanHealSingleSpell => false; - - public override bool CanHealAreaSpell => false; - - private static bool NoMercy => Player.HasStatus(true, StatusID.NoMercy); - public static int MaxCartridges => 3; - public static bool IsOddMinute() - { - // Get whole minutes from CombatTime (assuming it represents seconds) - int minutes = (int)Math.Floor(CombatTime / 60f); - - // Use modulo to check if minutes is odd (remainder 1) - return minutes % 2 != 0; - } - public static bool TwoMinteWindow => CombatTime >= 118 && CombatTime < 135; - public static float GetCooldownRemainingTime(IBaseAction baseAction) => baseAction.Cooldown.RecastTimeRemainOneCharge; - public static bool IsOffCooldown(IBaseAction baseAction) => !baseAction.Cooldown.IsCoolingDown; - public static bool IsOnCooldown(IBaseAction baseAction) => baseAction.Cooldown.IsCoolingDown; - public static bool LevelChecked(IBaseAction baseAction) => baseAction.EnoughLevel; - - - protected override IAction? CountDownAction(float remainTime) - { - if (remainTime <= 0.7 && LightningShotPvE.CanUse(out var act)) return act; - return base.CountDownAction(remainTime); - } - - protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) - { - - - return base.EmergencyAbility(nextGCD, out act); - } - - protected override bool GeneralGCD(out IAction? act) - { - - var aState = FFXIVClientStructs.FFXIV.Client.Game.UI.UIState.Instance()->PlayerState; - var SkillSpeed = aState.Attributes[45]; - var gcdSpeed = SkillSpeed < 532 ? 250 : 247; - bool slowSkS = gcdSpeed == 250; - bool regularSkS = gcdSpeed == 247; - - if (NoMercyPvE.Cooldown.RecastTimeRemainOneCharge > 57 || NoMercy) - { - if (DoubleDownPvE.EnoughLevel) - { - if (regularSkS) - { - if (Ammo >= 2 && !Player.HasStatus(true, StatusID.ReadyToRip) && AmmoComboStep >= 1) - if (DoubleDownPvE.CanUse(out act, skipAoeCheck: true)) return true; - if (DoubleDownPvE.Cooldown.IsCoolingDown) - if (SonicBreakPvE.CanUse(out act, skipAoeCheck: true)) return true; - } - - if (slowSkS) - { - if (!Player.HasStatus(true, StatusID.ReadyToRip) && AmmoComboStep >= 1) - if (SonicBreakPvE.CanUse(out act, skipAoeCheck: true)) return true; - if (Ammo >= 2 && SonicBreakPvE.Cooldown.IsCoolingDown) - if (DoubleDownPvE.CanUse(out act, skipAoeCheck: true)) return true; - } - } - - if (!DoubleDownPvE.EnoughLevel) - { - if (!Player.HasStatus(true, StatusID.ReadyToRip) && GnashingFangPvE.Cooldown.IsCoolingDown) - if (SonicBreakPvE.CanUse(out act, skipAoeCheck: true)) return true; - } - } - //Pre Gnashing Fang stuff - if (GnashingFangPvE.EnoughLevel) - { - bool activeNoMercy = NoMercyPvE.Cooldown.RecastTimeRemainOneCharge > 50 || NoMercy; - if (GetCooldownRemainingTime(GnashingFangPvE) <= GetCooldownRemainingTime(KeenEdgePvE) && AmmoComboStep == 0 && - (Ammo == MaxCartridges && activeNoMercy && (!TwoMinteWindow && regularSkS || slowSkS) || //Regular 60 second GF/NM timing - Ammo == MaxCartridges && activeNoMercy && TwoMinteWindow && GetCooldownRemainingTime(DoubleDownPvE) <= 1 && regularSkS || //2 min delay for regular SkS - Ammo == 1 && NoMercy && GetCooldownRemainingTime(DoubleDownPvE) > 50 || //NMDDGF windows/Scuffed windows - Ammo > 0 && GetCooldownRemainingTime(NoMercyPvE) > 17 && GetCooldownRemainingTime(NoMercyPvE) < 35 || //Regular 30 second window - Ammo == 1 && GetCooldownRemainingTime(NoMercyPvE) > 50 && (IsOffCooldown(BloodbathPvE) && LevelChecked(BloodbathPvE) || !LevelChecked(BloodbathPvE)))) //Opener Conditions - if (GnashingFangPvE.CanUse(out act)) return true; - if (AmmoComboStep is 1 or 2) - { - if (SavageClawPvE.CanUse(out act, skipComboCheck: true)) return true; - if (WickedTalonPvE.CanUse(out act, skipComboCheck: true)) return true; - } - - } - if (NoMercy && AmmoComboStep == 0 && LevelChecked(BurstStrikePvE)) - { - if (LevelChecked(HypervelocityPvE) && Player.HasStatus(true, StatusID.ReadyToBlast)) - if (HypervelocityPvE.CanUse(out act)) return true; - if (Ammo != 0 && GetCooldownRemainingTime(GnashingFangPvE) > 4) - if (BurstStrikePvE.CanUse(out act)) return true; - } - - //final check if Burst Strike is used right before No Mercy ends - if (LevelChecked(HypervelocityPvE) && Player.HasStatus(true, StatusID.ReadyToBlast)) - if (HypervelocityPvE.CanUse(out act)) return true; - // Regular 1-2-3 combo with overcap feature - - if (BrutalShellPvE.CanUse(out act)) return true; - if (LevelChecked(HypervelocityPvE) && Player.HasStatus(true, StatusID.ReadyToBlast)) - if (HypervelocityPvE.CanUse(out act)) return true; - if (LevelChecked(BurstStrikePvE) && Ammo == MaxCartridges) - if (BurstStrikePvE.CanUse(out act)) return true; - if (SolidBarrelPvE.CanUse(out act)) return true; - if (KeenEdgePvE.CanUse(out act)) return true; - - return base.GeneralGCD(out act); - } - - protected override bool AttackAbility(IAction nextGCD, out IAction? act) - { - var aState = FFXIVClientStructs.FFXIV.Client.Game.UI.UIState.Instance()->PlayerState; - var SkillSpeed = aState.Attributes[45]; - var gcdSpeed = SkillSpeed < 532 ? 250 : 247; - bool slowSkS = gcdSpeed == 250; - bool regularSkS = gcdSpeed == 247; - if (!NoMercyPvE.Cooldown.IsCoolingDown) - { - if (BurstStrikePvE.EnoughLevel) - { - if (regularSkS) - { - if (Ammo is 1 && CombatElapsedLess(30) && !BloodfestPvE.Cooldown.IsCoolingDown || //Opener Conditions - TwoMinteWindow && GetCooldownRemainingTime(DoubleDownPvE) < 4 || //2 min delay - !TwoMinteWindow && Ammo == MaxCartridges && GetCooldownRemainingTime(GnashingFangPvE) < 4) //Regular NMGF - if (NoMercyPvE.CanUse(out act)) return true; - } - - if (slowSkS) - { - if (CombatElapsedLess(30) && InCombat && Player.HasStatus(true, StatusID.BrutalShell) || - Ammo == MaxCartridges || - IsOddMinute() && Ammo == 2 && IsLastGCD(true, BurstStrikePvE)) - if (NoMercyPvE.CanUse(out act)) return true; - } - } - - if (!BurstStrikePvE.EnoughLevel) //no cartridges unlocked - if (NoMercyPvE.CanUse(out act)) return true; - } - - - - if (Ammo is 0 && NoMercy) - { - if (regularSkS && GnashingFangPvE.Cooldown.IsCoolingDown || slowSkS && NoMercyPvE.Cooldown.IsCoolingDown) - if (BloodfestPvE.CanUse(out act)) return true; - } - - - - //Blasting Zone outside of NM - if (!NoMercy && (GnashingFangPvE.Cooldown.IsCoolingDown && NoMercyPvE.Cooldown.RecastTimeRemainOneCharge > 17 || //Post Gnashing Fang - !GnashingFangPvE.EnoughLevel)) //Pre Gnashing Fang - if (DangerZonePvE.CanUse(out act)) return true; - - //Stops DZ Drift - if (NoMercy && (SonicBreakPvE.Cooldown.IsCoolingDown && slowSkS || DoubleDownPvE.Cooldown.IsCoolingDown && regularSkS)) - if (DangerZonePvE.CanUse(out act)) return true; - - - //Continuation - if (EyeGougePvE.CanUse(out act)) return true; - if (AbdomenTearPvE.CanUse(out act)) return true; - if (JugularRipPvE.CanUse(out act)) return true; - - //60s weaves - if (NoMercy) - { - //Post DD - if (regularSkS && DoubleDownPvE.Cooldown.IsCoolingDown || slowSkS && SonicBreakPvE.Cooldown.IsCoolingDown) - { - if (DangerZonePvE.CanUse(out act)) return true; - if (BowShockPvE.CanUse(out act, skipAoeCheck: true)) return true; - } - - //Pre DD - if (SonicBreakPvE.Cooldown.IsCoolingDown && !DoubleDownPvE.EnoughLevel) - { - if (BowShockPvE.CanUse(out act, skipAoeCheck: true)) return true; - if (DangerZonePvE.CanUse(out act)) return true; - } - } - - - - - // 60s window features - if (NoMercyPvE.Cooldown.RecastTimeRemainOneCharge > 57 || NoMercy) - { - if (!DoubleDownPvE.EnoughLevel) - { - //sub level 54 functionality - if (!SonicBreakPvE.EnoughLevel) - if (DangerZonePvE.CanUse(out act)) return true; - } - } - - return base.AttackAbility(nextGCD, out act); - } - - protected override bool DefenseAreaAbility(IAction nextGCD, out IAction? act) - { - if (HeartOfLightPvE.CanUse(out act)) return true; - if (ReprisalPvE.CanUse(out act)) return true; - return base.DefenseAreaAbility(nextGCD, out act); - } - - protected override bool DefenseSingleAbility(IAction nextGCD, out IAction? act) - { - - if (CamouflagePvE.CanUse(out act)) return true; - if (HeartOfStonePvE.CanUse(out act)) return true; - if ((!RampartPvE.Cooldown.IsCoolingDown || RampartPvE.Cooldown.ElapsedAfter(60)) && NebulaPvE.CanUse(out act)) return true; - if (NebulaPvE.Cooldown.IsCoolingDown && NebulaPvE.Cooldown.ElapsedAfter(60) && RampartPvE.CanUse(out act)) return true; - if (ReprisalPvE.CanUse(out act)) return true; - - return base.DefenseSingleAbility(nextGCD, out act); - } - - protected override bool HealSingleAbility(IAction nextGCD, out IAction? act) - { - if (AuroraPvE.CanUse(out act, usedUp: true)) return true; - return base.HealSingleAbility(nextGCD, out act); - } - - -} \ No newline at end of file diff --git a/Advanced_Rotations/PVP/Melee/SAM.cs b/Advanced_Rotations/PVP/Melee/SAM.cs deleted file mode 100644 index ef15fbd..0000000 --- a/Advanced_Rotations/PVP/Melee/SAM.cs +++ /dev/null @@ -1,139 +0,0 @@ - - -using FFXIVClientStructs.FFXIV.Client.Game.UI; -using static FFXIVClientStructs.FFXIV.Client.UI.Misc.DataCenterHelper; - -namespace DefaultRotations.Melee; - -[Rotation("RabbsPvP", CombatType.PvP, GameVersion = "7.00", Description = "Beta Rotation")] -[SourceCode(Path = "main/DefaultRotations/PVPRotations/Tank/SAM_Default.PvP.cs")] -[Api(2)] -public sealed class SAM_DefaultPvP : SamuraiRotation -{ - [RotationConfig(CombatType.PvP, Name = "Sprint")] - public bool UseSprintPvP { get; set; } = false; - - [RotationConfig(CombatType.PvP, Name = "Recuperate")] - public bool UseRecuperatePvP { get; set; } = false; - - [Range(1, 100, ConfigUnitType.Percent, 1)] - [RotationConfig(CombatType.PvP, Name = "RecuperateHP%%?")] - public int RCValue { get; set; } = 75; - - [RotationConfig(CombatType.PvP, Name = "Use Purify")] - public bool UsePurifyPvP { get; set; } = false; - - [RotationConfig(CombatType.PvP, Name = "Use Purify on Stun")] - public bool Use1343PvP { get; set; } = false; - - [RotationConfig(CombatType.PvP, Name = "Use Purify on DeepFreeze")] - public bool Use3219PvP { get; set; } = false; - - [RotationConfig(CombatType.PvP, Name = "Use Purify on HalfAsleep")] - public bool Use3022PvP { get; set; } = false; - - [RotationConfig(CombatType.PvP, Name = "Use Purify on Sleep")] - public bool Use1348PvP { get; set; } = false; - - [RotationConfig(CombatType.PvP, Name = "Use Purify on Bind")] - public bool Use1345PvP { get; set; } = false; - - [RotationConfig(CombatType.PvP, Name = "Use Purify on Heavy")] - public bool Use1344PvP { get; set; } = false; - - [RotationConfig(CombatType.PvP, Name = "Use Purify on Silence")] - public bool Use1347PvP { get; set; } = false; - - [RotationConfig(CombatType.PvP, Name = "Stop attacking while in Guard.")] - public bool GuardCancel { get; set; } = false; - - public static IBaseAction Zantetsuken { get; } = new BaseAction((ActionID)29537); - - public static IBaseAction Dash { get; } = new BaseAction((ActionID)29532); - - private bool TryPurify(out IAction? action) - { - action = null; - if (!UsePurifyPvP) return false; - - var purifyStatuses = new Dictionary - { - { 1343, Use1343PvP }, - { 3219, Use3219PvP }, - { 3022, Use3022PvP }, - { 1348, Use1348PvP }, - { 1345, Use1345PvP }, - { 1344, Use1344PvP }, - { 1347, Use1347PvP } - }; - - foreach (var status in purifyStatuses) - { - if (status.Value && Player.HasStatus(true, (StatusID)status.Key)) - { - return PurifyPvP.CanUse(out action); - } - } - - return false; - } - - protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) - { - act = null; - if (GuardCancel && Player.HasStatus(true, StatusID.Guard)) return false; - if (TryPurify(out act)) return true; - if (UseRecuperatePvP && Player.CurrentHp / Player.MaxHp * 100 < RCValue && RecuperatePvP.CanUse(out act)) return true; - if (Dash.CanUse(out act, usedUp: true, skipAoeCheck: true, skipCastingCheck: true, skipComboCheck: true) && Dash.Target.Target?.DistanceToPlayer() > 5) return true; - return base.EmergencyAbility(nextGCD, out act); - } - - protected override bool AttackAbility(IAction nextGCD, out IAction? act) - { - act = null; - if (GuardCancel && Player.HasStatus(true, StatusID.Guard)) return false; - if (Dash.CanUse(out act, usedUp:true, skipAoeCheck:true, skipCastingCheck:true, skipComboCheck:true) && Dash.Target.Target?.DistanceToPlayer() > 5) return true; - if (MineuchiPvP.CanUse(out act)) return true; - if (MeikyoShisuiPvP.CanUse(out act)) return true; - return base.AttackAbility(nextGCD, out act); - } - protected override bool GeneralAbility(IAction nextGCD, out IAction? act) - { - act = null; - if (GuardCancel && Player.HasStatus(true, StatusID.Guard)) return false; - - return base.GeneralAbility(nextGCD, out act); - } - protected unsafe override bool GeneralGCD(out IAction? act) - { - act = null; - if (UIState.Instance()->LimitBreakController.CurrentUnits >= 4000) - { - if (HissatsuChitenPvP.CanUse(out act)) return true; - //if (Zantetsuken.CanUse(out act, skipAoeCheck:true) && (Zantetsuken.Target.Target?.HasStatus(true, StatusID.Kuzushi) ?? false)) return true; - } - // Early exits for Guard status or Sprint usage - if (GuardCancel && Player.HasStatus(true, StatusID.Guard)) return false; - if (!Player.HasStatus(true, StatusID.Guard) && UseSprintPvP && !Player.HasStatus(true, StatusID.Sprint) && !InCombat && SprintPvP.CanUse(out act)) return true; - if (KaeshiNamikiriPvP.CanUse(out act, skipAoeCheck: true) && OgiNamikiriPvP.AdjustedID == KaeshiNamikiriPvP.ID) return true; - if (OgiNamikiriPvP.CanUse(out act, skipAoeCheck:true)) return true; - if (MidareSetsugekkaPvP.CanUse(out act, skipAoeCheck: true) && Player.HasStatus(true, StatusID.Midare)) return true; - - - - if (KashaPvP.CanUse(out act)) return true; - if (GekkoPvP.CanUse(out act)) return true; - if (YukikazePvP.CanUse(out act)) return true; - - return base.GeneralGCD(out act); - } - - - public unsafe override void DisplayStatus() - { - //motif - ImGui.Text("debuf " + UIState.Instance()->LimitBreakController.CurrentUnits.ToString()); - - base.DisplayStatus(); - } -} diff --git a/Advanced_Rotations/PVP/Ranged_Magic/PCT.cs b/Advanced_Rotations/PVP/Ranged_Magic/PCT.cs deleted file mode 100644 index 08bf245..0000000 --- a/Advanced_Rotations/PVP/Ranged_Magic/PCT.cs +++ /dev/null @@ -1,133 +0,0 @@ -using FFXIVClientStructs.FFXIV.Client.UI; -using Lumina.Excel.GeneratedSheets; -using RotationSolver.Basic.Data; -using System; -using static Lumina.Data.Parsing.Layer.LayerCommon; - -namespace RabbsRotationsNET8.Magical; - -[Rotation("HappyLittleAccidental PvP", CombatType.PvP, GameVersion = "7.0")] -[SourceCode(Path = "main/DefaultRotations/Magical/PCT_Default.cs")] -[Api(2)] -public sealed class PCT_Default_PvP : PictomancerRotation -{ - - - - - public override MedicineType MedicineType => MedicineType.Intelligence; - #region Countdown logic - // Defines logic for actions to take during the countdown before combat starts. - protected override IAction? CountDownAction(float remainTime) - { - return base.CountDownAction(remainTime); - } - #endregion - - #region Emergency Logic - // Determines emergency actions to take based on the next planned GCD action. - protected override bool EmergencyAbility(IAction nextGCD, out IAction? act) - { - act = null; - if (!Player.HasStatus(true, StatusID.SubtractivePalette_4102) && !IsMoving) - { - if (SubtractivePalettePvP.CanUse(out act)) return true; - } - - return base.EmergencyAbility(nextGCD, out act); - } - #endregion - - #region oGCD Logic - protected override bool AttackAbility(IAction nextGCD, out IAction? act) - { - - - return base.AttackAbility(nextGCD, out act); - } - - protected override bool MoveForwardAbility(IAction nextGCD, out IAction? act) - { - act = null; - - - return base.MoveForwardAbility(nextGCD, out act); - } - #endregion - - #region GCD Logic - protected override bool MoveForwardGCD(out IAction? act) - { - act = null; - - return base.MoveForwardGCD(out act); - } - - protected override bool GeneralGCD(out IAction? act) - { - if (StarPrismPvP.CanUse(out act, skipAoeCheck:true) && Player.HasStatus(true, StatusID.Starstruck_4118)) return true; - if (RetributionOfTheMadeenPvP.CanUse(out act, skipAoeCheck:true) && Player.HasStatus(true, StatusID.MadeenPortrait)) return true; - if (MogOfTheAgesPvP.CanUse(out act, skipAoeCheck:true) && Player.HasStatus(true, StatusID.MooglePortrait)) return true; - if (Player.HasStatus(true, StatusID.PomSketch) && !IsMoving) - { - if (PomMotifPvP.CanUse(out act)) return true; - } - if (Player.HasStatus(true,StatusID.PomMotif) && LivingMusePvP.Cooldown.HasOneCharge) - { - if (PomMusePvP.CanUse(out act, skipAoeCheck: true, usedUp: true)) return true; - } - if (Player.HasStatus(true, StatusID.WingSketch) && !IsMoving) - { - if (WingMotifPvP.CanUse(out act)) return true; - } - if (Player.HasStatus(true, StatusID.WingMotif) && LivingMusePvP.Cooldown.HasOneCharge) - { - if (WingedMusePvP.CanUse(out act, skipAoeCheck: true, usedUp: true)) return true; - } - if (Player.HasStatus(true, StatusID.ClawSketch) && !IsMoving) - { - if (ClawMotifPvP.CanUse(out act)) return true; - } - if (Player.HasStatus(true, StatusID.ClawMotif) && LivingMusePvP.Cooldown.HasOneCharge) - { - if (ClawedMusePvP.CanUse(out act, skipAoeCheck: true, usedUp:true)) return true; - } - if (Player.HasStatus(true, StatusID.MawSketch) && !IsMoving) - { - if (MawMotifPvP.CanUse(out act)) return true; - } - if (Player.HasStatus(true, StatusID.MawMotif) && LivingMusePvP.Cooldown.HasOneCharge) - { - if (FangedMusePvP.CanUse(out act, skipAoeCheck: true, usedUp: true)) return true; - } - - if (Player.HasStatus(true, StatusID.SubtractivePalette_4102)) - { - if (CometInBlackPvP.CanUse(out act, skipAoeCheck: true, usedUp: true)) return true; - if(ThunderInMagentaPvP.CanUse(out act) && Player.HasStatus(true, StatusID.AetherhuesIi_4101)) return true; - if (StoneInYellowPvP.CanUse(out act) && Player.HasStatus(true, StatusID.Aetherhues_4100)) return true; - if (BlizzardInCyanPvP.CanUse(out act)) return true; - } - - if (HolyInWhitePvP.CanUse(out act, skipAoeCheck: true, usedUp: true)) return true; - if (IsMoving && Player.HasStatus(true, StatusID.SubtractivePalette_4102) && HolyInWhitePvE.Cooldown.CurrentCharges == 0) - { - if (ReleaseSubtractivePalettePvP.CanUse(out act)) return true; - } - if (WaterInBluePvP.CanUse(out act) && Player.HasStatus(true, StatusID.AetherhuesIi_4101)) return true; - if (AeroInGreenPvP.CanUse(out act) && Player.HasStatus(true, StatusID.Aetherhues_4100)) return true; - if (FireInRedPvP.CanUse(out act)) return true; - - return base.GeneralGCD(out act); - } - - private bool AttackGCD(out IAction? act, bool burst) - { - act = null; - - return false; - } - #endregion - - -} diff --git a/Advanced_Rotations/RabbsRotationsNET8.csproj b/Advanced_Rotations/RabbsRotationsNET8.csproj index 3977243..38455d3 100644 --- a/Advanced_Rotations/RabbsRotationsNET8.csproj +++ b/Advanced_Rotations/RabbsRotationsNET8.csproj @@ -83,11 +83,17 @@ + + + + + + - +