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 @@
+
+
+
+
+
+
-
+