diff --git a/RotationSolver.Basic/Configuration/Configs.cs b/RotationSolver.Basic/Configuration/Configs.cs
index 5c77197ed..b43636b29 100644
--- a/RotationSolver.Basic/Configuration/Configs.cs
+++ b/RotationSolver.Basic/Configuration/Configs.cs
@@ -397,6 +397,8 @@ public enum PluginConfigFloat : byte
[Default(8f)] ControlProgressHeight,
[Default(1.2f, 0f, 30f)] DistanceForMoving,
[Default(0.2f, 0.01f, 0.5f)] MaxPing,
+
+ [Default(8f, 0f, 30f)] AutoHealDeadTime,
}
public enum PluginConfigVector4 : byte
diff --git a/RotationSolver.Basic/Data/ActionID.cs b/RotationSolver.Basic/Data/ActionID.cs
index d1848e5fb..0a8a87255 100644
--- a/RotationSolver.Basic/Data/ActionID.cs
+++ b/RotationSolver.Basic/Data/ActionID.cs
@@ -3432,7 +3432,7 @@ public enum ActionID : uint
///
///
///
- PresenseOfMind = 136,
+ PresenceOfMind = 136,
///
///
diff --git a/RotationSolver.Basic/DataCenter.cs b/RotationSolver.Basic/DataCenter.cs
index 50c9dd685..9cf61153b 100644
--- a/RotationSolver.Basic/DataCenter.cs
+++ b/RotationSolver.Basic/DataCenter.cs
@@ -239,6 +239,7 @@ public static void SetSpecialType(SpecialCommandType specialType)
public static bool HasHostilesInMaxRange => NumberOfHostilesInMaxRange > 0;
public static int NumberOfHostilesInRange { get; internal set; }
public static int NumberOfHostilesInMaxRange { get; internal set; }
+ public static float AverageDeadTime { get; internal set; }
public static bool IsHostileCastingAOE { get; internal set; }
diff --git a/RotationSolver.Basic/Rotations/Basic/AST_Base.cs b/RotationSolver.Basic/Rotations/Basic/AST_Base.cs
index ec9920cd7..b8e1a27b2 100644
--- a/RotationSolver.Basic/Rotations/Basic/AST_Base.cs
+++ b/RotationSolver.Basic/Rotations/Basic/AST_Base.cs
@@ -170,25 +170,34 @@ public abstract class AST_Base : CustomRotation
///
///
///
- public static IBaseAction Lightspeed { get; } = new BaseAction(ActionID.Lightspeed);
+ public static IBaseAction Lightspeed { get; } = new BaseAction(ActionID.Lightspeed)
+ {
+ ActionCheck = (b, m) => IsLongerThan(10),
+ };
///
///
///
- public static IBaseAction NeutralSect { get; } = new BaseAction(ActionID.NeutralSect, ActionOption.Heal);
+ public static IBaseAction NeutralSect { get; } = new BaseAction(ActionID.NeutralSect, ActionOption.Heal)
+ {
+ ActionCheck = (b, m) => IsLongerThan(15),
+ };
///
///
///
public static IBaseAction Astrodyne { get; } = new BaseAction(ActionID.Astrodyne)
{
- ActionCheck = (b, m) => !Seals.Contains(SealType.NONE),
+ ActionCheck = (b, m) => !Seals.Contains(SealType.NONE) && IsLongerThan(10),
};
///
///
///
- public static IBaseAction Divination { get; } = new BaseAction(ActionID.Divination, ActionOption.Buff);
+ public static IBaseAction Divination { get; } = new BaseAction(ActionID.Divination, ActionOption.Buff)
+ {
+ ActionCheck = (b, m) => IsLongerThan(10),
+ };
///
///
diff --git a/RotationSolver.Basic/Rotations/Basic/BLM_Base.cs b/RotationSolver.Basic/Rotations/Basic/BLM_Base.cs
index baa323efa..a45e44c8b 100644
--- a/RotationSolver.Basic/Rotations/Basic/BLM_Base.cs
+++ b/RotationSolver.Basic/Rotations/Basic/BLM_Base.cs
@@ -337,6 +337,7 @@ public override bool CanUse(out IAction act, CanUseOption option = CanUseOption.
public static IBaseAction LeyLines { get; } = new BaseAction(ActionID.LeyLines, ActionOption.Buff | ActionOption.EndSpecial)
{
StatusProvide = new[] { StatusID.LeyLines, },
+ ActionCheck = (b, m) => IsLongerThan(15),
};
///
diff --git a/RotationSolver.Basic/Rotations/Basic/BRD_Base.cs b/RotationSolver.Basic/Rotations/Basic/BRD_Base.cs
index 46af18df8..4edafa65b 100644
--- a/RotationSolver.Basic/Rotations/Basic/BRD_Base.cs
+++ b/RotationSolver.Basic/Rotations/Basic/BRD_Base.cs
@@ -182,14 +182,18 @@ protected static bool SongEndAfterGCD(uint gctCount = 0, float offset = 0)
///
///
///
- public static IBaseAction BattleVoice { get; } = new BaseAction(ActionID.BattleVoice, ActionOption.Buff);
+ public static IBaseAction BattleVoice { get; } = new BaseAction(ActionID.BattleVoice, ActionOption.Buff)
+ {
+ ActionCheck = (b, m) => IsLongerThan(10),
+ };
///
///
///
public static IBaseAction RadiantFinale { get; } = new BaseAction(ActionID.RadiantFinale, ActionOption.Buff)
{
- ActionCheck = (b, m) => JobGauge.Coda.Any(s => s != Song.NONE),
+ ActionCheck = (b, m) => JobGauge.Coda.Any(s => s != Song.NONE)
+ && IsLongerThan(10),
};
///
@@ -200,7 +204,10 @@ protected static bool SongEndAfterGCD(uint gctCount = 0, float offset = 0)
///
///
///
- public static IBaseAction RagingStrikes { get; } = new BaseAction(ActionID.RagingStrikes);
+ public static IBaseAction RagingStrikes { get; } = new BaseAction(ActionID.RagingStrikes)
+ {
+ ActionCheck = (b, m) => IsLongerThan(10),
+ };
///
///
diff --git a/RotationSolver.Basic/Rotations/Basic/DNC_Base.cs b/RotationSolver.Basic/Rotations/Basic/DNC_Base.cs
index 07192a578..4df2915ea 100644
--- a/RotationSolver.Basic/Rotations/Basic/DNC_Base.cs
+++ b/RotationSolver.Basic/Rotations/Basic/DNC_Base.cs
@@ -220,7 +220,10 @@ public abstract class DNC_Base : CustomRotation
///
///
///
- public static IBaseAction Devilment { get; } = new BaseAction(ActionID.Devilment);
+ public static IBaseAction Devilment { get; } = new BaseAction(ActionID.Devilment)
+ {
+ ActionCheck = (b, m) => IsLongerThan(10)
+ };
///
///
@@ -260,6 +263,7 @@ public abstract class DNC_Base : CustomRotation
StatusID.StandardFinish,
},
StatusProvide = StandardStep.StatusProvide,
+ ActionCheck = (b, m) => IsLongerThan(20),
};
///
diff --git a/RotationSolver.Basic/Rotations/Basic/DRG_Base.cs b/RotationSolver.Basic/Rotations/Basic/DRG_Base.cs
index 0c39e3a0a..9dc82c6d1 100644
--- a/RotationSolver.Basic/Rotations/Basic/DRG_Base.cs
+++ b/RotationSolver.Basic/Rotations/Basic/DRG_Base.cs
@@ -219,7 +219,10 @@ protected static bool LOTDEndAfterGCD(uint gctCount = 0, float offset = 0)
///
///
///
- public static IBaseAction LanceCharge { get; } = new BaseAction(ActionID.LanceCharge);
+ public static IBaseAction LanceCharge { get; } = new BaseAction(ActionID.LanceCharge)
+ {
+ ActionCheck = (b, m) => IsLongerThan(10),
+ };
///
///
@@ -235,12 +238,16 @@ protected static bool LOTDEndAfterGCD(uint gctCount = 0, float offset = 0)
return Targets.GetJobCategory(JobRole.Melee, JobRole.RangedMagical, JobRole.RangedPhysical, JobRole.Tank).FirstOrDefault();
},
+ ActionCheck = (b, m) => IsLongerThan(10),
};
///
///
///
- public static IBaseAction BattleLitany { get; } = new BaseAction(ActionID.BattleLitany, ActionOption.Buff);
+ public static IBaseAction BattleLitany { get; } = new BaseAction(ActionID.BattleLitany, ActionOption.Buff)
+ {
+ ActionCheck = (b, m) => IsLongerThan(10),
+ };
#endregion
#region Traits
diff --git a/RotationSolver.Basic/Rotations/Basic/DRK_Base.cs b/RotationSolver.Basic/Rotations/Basic/DRK_Base.cs
index 018033745..609c12670 100644
--- a/RotationSolver.Basic/Rotations/Basic/DRK_Base.cs
+++ b/RotationSolver.Basic/Rotations/Basic/DRK_Base.cs
@@ -257,12 +257,19 @@ protected static bool ShadowTimeEndAfterGCD(uint gctCount = 0, float offset = 0)
///
///
///
- public static IBaseAction BloodWeapon { get; } = new BaseAction(ActionID.BloodWeapon);
+ public static IBaseAction BloodWeapon { get; } = new BaseAction(ActionID.BloodWeapon)
+ {
+ ActionCheck = (b, m) => IsLongerThan(10),
+ };
///
///
///
- public static IBaseAction Delirium { get; } = new BaseAction(ActionID.Delirium);
+ public static IBaseAction Delirium { get; } = new BaseAction(ActionID.Delirium)
+ {
+ ActionCheck = (b, m) => IsLongerThan(10),
+ };
+
#endregion
#region Traits
diff --git a/RotationSolver.Basic/Rotations/Basic/GNB_Base.cs b/RotationSolver.Basic/Rotations/Basic/GNB_Base.cs
index 56df52e36..6a0110c43 100644
--- a/RotationSolver.Basic/Rotations/Basic/GNB_Base.cs
+++ b/RotationSolver.Basic/Rotations/Basic/GNB_Base.cs
@@ -252,7 +252,10 @@ public abstract class GNB_Base : CustomRotation
///
///
///
- public static IBaseAction NoMercy { get; } = new BaseAction(ActionID.NoMercy);
+ public static IBaseAction NoMercy { get; } = new BaseAction(ActionID.NoMercy)
+ {
+ ActionCheck = (b, m) => IsLongerThan(10),
+ };
///
///
diff --git a/RotationSolver.Basic/Rotations/Basic/MCH_Base.cs b/RotationSolver.Basic/Rotations/Basic/MCH_Base.cs
index 9c8982632..1a31e5666 100644
--- a/RotationSolver.Basic/Rotations/Basic/MCH_Base.cs
+++ b/RotationSolver.Basic/Rotations/Basic/MCH_Base.cs
@@ -172,13 +172,17 @@ protected static bool OverheatedEndAfterGCD(uint gctCount = 0, float offset = 0)
///
public static IBaseAction Hypercharge { get; } = new BaseAction(ActionID.Hypercharge)
{
- ActionCheck = (b, m) => !JobGauge.IsOverheated && JobGauge.Heat >= 50,
+ ActionCheck = (b, m) => !JobGauge.IsOverheated && JobGauge.Heat >= 50
+ && IsLongerThan(8),
};
///
///
///
- public static IBaseAction Wildfire { get; } = new BaseAction(ActionID.Wildfire);
+ public static IBaseAction Wildfire { get; } = new BaseAction(ActionID.Wildfire)
+ {
+ ActionCheck = (b, m) => IsLongerThan(8),
+ };
///
///
@@ -188,7 +192,10 @@ protected static bool OverheatedEndAfterGCD(uint gctCount = 0, float offset = 0)
///
///
///
- public static IBaseAction QueenOverdrive { get; } = new BaseAction(ActionID.QueenOverdrive);
+ public static IBaseAction QueenOverdrive { get; } = new BaseAction(ActionID.QueenOverdrive)
+ {
+ ActionCheck = (b, m) => IsLongerThan(8),
+ };
///
///
diff --git a/RotationSolver.Basic/Rotations/Basic/MNK_Base.cs b/RotationSolver.Basic/Rotations/Basic/MNK_Base.cs
index 965cad0e1..bd35af9d4 100644
--- a/RotationSolver.Basic/Rotations/Basic/MNK_Base.cs
+++ b/RotationSolver.Basic/Rotations/Basic/MNK_Base.cs
@@ -160,7 +160,10 @@ public abstract class MNK_Base : CustomRotation
///
///
///
- public static IBaseAction Mantra { get; } = new BaseAction(ActionID.Mantra, ActionOption.Heal);
+ public static IBaseAction Mantra { get; } = new BaseAction(ActionID.Mantra, ActionOption.Heal)
+ {
+ ActionCheck = (b, m) => IsLongerThan(10),
+ };
///
///
@@ -173,14 +176,17 @@ public abstract class MNK_Base : CustomRotation
///
///
///
- public static IBaseAction RiddleOfWind { get; } = new BaseAction(ActionID.RiddleOfWind);
+ public static IBaseAction RiddleOfWind { get; } = new BaseAction(ActionID.RiddleOfWind)
+ {
+ ActionCheck = (b, m) => IsLongerThan(10),
+ };
///
///
///
public static IBaseAction PerfectBalance { get; } = new BaseAction(ActionID.PerfectBalance)
{
- ActionCheck = (b, m) => InCombat,
+ ActionCheck = (b, m) => InCombat && IsLongerThan(5),
};
///
@@ -199,12 +205,18 @@ public abstract class MNK_Base : CustomRotation
///
///
///
- public static IBaseAction Brotherhood { get; } = new BaseAction(ActionID.Brotherhood, ActionOption.Buff);
+ public static IBaseAction Brotherhood { get; } = new BaseAction(ActionID.Brotherhood, ActionOption.Buff)
+ {
+ ActionCheck = (b, m) => IsLongerThan(10)
+ };
///
///
///
- public static IBaseAction RiddleOfFire { get; } = new BaseAction(ActionID.RiddleOfFire);
+ public static IBaseAction RiddleOfFire { get; } = new BaseAction(ActionID.RiddleOfFire)
+ {
+ ActionCheck = (b, m) => IsLongerThan(10)
+ };
#endregion
#region Traits
@@ -292,8 +304,8 @@ public abstract class MNK_Base : CustomRotation
ChoiceTarget = TargetFilter.FindTargetForMoving,
};
- [RotationDesc(ActionID.Thunderclap)]
#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
+ [RotationDesc(ActionID.Thunderclap)]
protected sealed override bool MoveForwardAbility(out IAction act)
{
if (Thunderclap.CanUse(out act)) return true;
diff --git a/RotationSolver.Basic/Rotations/Basic/NIN_Base.cs b/RotationSolver.Basic/Rotations/Basic/NIN_Base.cs
index 6bc59ba20..3b5fda57b 100644
--- a/RotationSolver.Basic/Rotations/Basic/NIN_Base.cs
+++ b/RotationSolver.Basic/Rotations/Basic/NIN_Base.cs
@@ -175,7 +175,7 @@ protected static bool HutonEndAfterGCD(uint gctCount = 0, float offset = 0)
///
public static IBaseAction Mug { get; } = new BaseAction(ActionID.Mug)
{
- ActionCheck = (b, m) => JobGauge.Ninki <= 60,
+ ActionCheck = (b, m) => JobGauge.Ninki <= 60 && IsLongerThan(10),
};
///
@@ -184,6 +184,7 @@ protected static bool HutonEndAfterGCD(uint gctCount = 0, float offset = 0)
public static IBaseAction TrickAttack { get; } = new BaseAction(ActionID.TrickAttack)
{
StatusNeed = new StatusID[] { StatusID.Suiton, StatusID.Hidden },
+ ActionCheck = (b, m) =>IsLongerThan(10),
};
///
diff --git a/RotationSolver.Basic/Rotations/Basic/PLD_Base.cs b/RotationSolver.Basic/Rotations/Basic/PLD_Base.cs
index 5fdae071e..6cda1a6aa 100644
--- a/RotationSolver.Basic/Rotations/Basic/PLD_Base.cs
+++ b/RotationSolver.Basic/Rotations/Basic/PLD_Base.cs
@@ -161,12 +161,18 @@ public abstract class PLD_Base : CustomRotation
///
///
///
- public static IBaseAction Requiescat { get; } = new BaseAction(ActionID.Requiescat, ActionOption.Buff);
+ public static IBaseAction Requiescat { get; } = new BaseAction(ActionID.Requiescat, ActionOption.Buff)
+ {
+ ActionCheck = (b, m) => IsLongerThan(10),
+ };
///
///
///
- public static IBaseAction FightOrFlight { get; } = new BaseAction(ActionID.FightOrFlight, ActionOption.Buff);
+ public static IBaseAction FightOrFlight { get; } = new BaseAction(ActionID.FightOrFlight, ActionOption.Buff)
+ {
+ ActionCheck = (b, m) => IsLongerThan(10),
+ };
///
///
diff --git a/RotationSolver.Basic/Rotations/Basic/RDM_Base.cs b/RotationSolver.Basic/Rotations/Basic/RDM_Base.cs
index 9a99c5a80..daa40052b 100644
--- a/RotationSolver.Basic/Rotations/Basic/RDM_Base.cs
+++ b/RotationSolver.Basic/Rotations/Basic/RDM_Base.cs
@@ -224,14 +224,17 @@ public abstract class RDM_Base : CustomRotation
///
///
///
- public static IBaseAction Embolden { get; } = new BaseAction(ActionID.Embolden, ActionOption.Buff);
+ public static IBaseAction Embolden { get; } = new BaseAction(ActionID.Embolden, ActionOption.Buff)
+ {
+ ActionCheck = (b, m) => IsLongerThan(10),
+ };
///
///
///
public static IBaseAction Manafication { get; } = new BaseAction(ActionID.Manafication)
{
- ActionCheck = (b, m) => WhiteMana <= 50 && BlackMana <= 50 && InCombat && ManaStacks == 0,
+ ActionCheck = (b, m) => WhiteMana <= 50 && BlackMana <= 50 && InCombat && ManaStacks == 0 && IsLongerThan(10),
ComboIdsNot = new[] { ActionID.Riposte, ActionID.Zwerchhau, ActionID.Scorch, ActionID.Verflare, ActionID.Verholy },
};
#endregion
diff --git a/RotationSolver.Basic/Rotations/Basic/RPR_Base.cs b/RotationSolver.Basic/Rotations/Basic/RPR_Base.cs
index fed5bc8b8..f224e88e2 100644
--- a/RotationSolver.Basic/Rotations/Basic/RPR_Base.cs
+++ b/RotationSolver.Basic/Rotations/Basic/RPR_Base.cs
@@ -194,7 +194,8 @@ public abstract class RPR_Base : CustomRotation
///
public static IBaseAction ArcaneCircle { get; } = new BaseAction(ActionID.ArcaneCircle, ActionOption.Buff)
{
- StatusProvide = new[] { StatusID.CircleOfSacrifice, StatusID.BloodSownCircle }
+ StatusProvide = new[] { StatusID.CircleOfSacrifice, StatusID.BloodSownCircle },
+ ActionCheck = (b, m) => IsLongerThan(10),
};
///
diff --git a/RotationSolver.Basic/Rotations/Basic/SAM_Base.cs b/RotationSolver.Basic/Rotations/Basic/SAM_Base.cs
index 8a9694a85..cf699e1d1 100644
--- a/RotationSolver.Basic/Rotations/Basic/SAM_Base.cs
+++ b/RotationSolver.Basic/Rotations/Basic/SAM_Base.cs
@@ -238,6 +238,7 @@ public static bool IsMoonTimeLessThanFlower
public static IBaseAction MeikyoShisui { get; } = new BaseAction(ActionID.MeikyoShisui)
{
StatusProvide = new[] { StatusID.MeikyoShisui },
+ ActionCheck = (b, m) => IsLongerThan(8),
};
///
diff --git a/RotationSolver.Basic/Rotations/Basic/SCH_Base.cs b/RotationSolver.Basic/Rotations/Basic/SCH_Base.cs
index 929e7de2e..f3180a858 100644
--- a/RotationSolver.Basic/Rotations/Basic/SCH_Base.cs
+++ b/RotationSolver.Basic/Rotations/Basic/SCH_Base.cs
@@ -234,7 +234,7 @@ public abstract class SCH_Base : CustomRotation
///
public static IBaseAction ChainStratagem { get; } = new BaseAction(ActionID.ChainStratagem)
{
- ActionCheck = (b, m) => InCombat && IsTargetBoss
+ ActionCheck = (b, m) => InCombat && IsTargetBoss && IsLongerThan(10),
};
///
diff --git a/RotationSolver.Basic/Rotations/Basic/SMN_Base.cs b/RotationSolver.Basic/Rotations/Basic/SMN_Base.cs
index 043790782..e2f6605cc 100644
--- a/RotationSolver.Basic/Rotations/Basic/SMN_Base.cs
+++ b/RotationSolver.Basic/Rotations/Basic/SMN_Base.cs
@@ -290,7 +290,7 @@ public override void DisplayStatus()
public static IBaseAction SearingLight { get; } = new BaseAction(ActionID.SearingLight, ActionOption.Buff)
{
StatusProvide = new[] { StatusID.SearingLight },
- ActionCheck = (b, m) => InCombat,
+ ActionCheck = (b, m) => InCombat && IsLongerThan(15),
};
///
diff --git a/RotationSolver.Basic/Rotations/Basic/WAR_Base.cs b/RotationSolver.Basic/Rotations/Basic/WAR_Base.cs
index 30dac8f62..49582acd5 100644
--- a/RotationSolver.Basic/Rotations/Basic/WAR_Base.cs
+++ b/RotationSolver.Basic/Rotations/Basic/WAR_Base.cs
@@ -134,20 +134,23 @@ public abstract class WAR_Base : CustomRotation
public static IBaseAction Infuriate { get; } = new BaseAction(ActionID.Infuriate)
{
StatusProvide = new[] { StatusID.NascentChaos },
- ActionCheck = (b, m) => HasHostilesInRange && JobGauge.BeastGauge <= 50 && InCombat,
+ ActionCheck = (b, m) => HasHostilesInRange && JobGauge.BeastGauge <= 50 && InCombat && IsLongerThan(5),
};
///
///
///
- public static IBaseAction InnerRelease { get; } = new BaseAction(ActionID.InnerRelease);
+ public static IBaseAction InnerRelease { get; } = new BaseAction(ActionID.InnerRelease)
+ {
+ ActionCheck = (b, m) => IsLongerThan(10),
+ };
///
///
///
public static IBaseAction Berserk { get; } = new BaseAction(ActionID.Berserk)
{
- ActionCheck = (b, m) => HasHostilesInRange && !InnerRelease.IsCoolingDown,
+ ActionCheck = (b, m) => HasHostilesInRange && !InnerRelease.IsCoolingDown && IsLongerThan(10),
};
#endregion
@@ -278,23 +281,13 @@ public abstract class WAR_Base : CustomRotation
public static IBaseTrait MeleeMastery { get; } = new BaseTrait(505);
#endregion
- ///
- ///
- ///
- ///
- ///
- ///
+#pragma warning disable CS1591 // Missing XML comment for publicly visible type or member
protected override bool EmergencyAbility(IAction nextGCD, out IAction act)
{
if (Holmgang.CanUse(out act) && BaseAction.TankBreakOtherCheck(Jobs[0])) return true;
return base.EmergencyAbility(nextGCD, out act);
}
- ///
- ///
- ///
- ///
- ///
[RotationDesc(ActionID.Onslaught)]
protected sealed override bool MoveForwardAbility(out IAction act)
{
@@ -302,15 +295,12 @@ protected sealed override bool MoveForwardAbility(out IAction act)
return base.MoveForwardAbility(out act);
}
- ///
- ///
- ///
- ///
- ///
[RotationDesc(ActionID.PrimalRend)]
protected sealed override bool MoveForwardGCD(out IAction act)
{
if (PrimalRend.CanUse(out act, CanUseOption.MustUse)) return true;
return base.MoveForwardGCD(out act);
}
+#pragma warning restore CS1591 // Missing XML comment for publicly visible type or member
+
}
diff --git a/RotationSolver.Basic/Rotations/Basic/WHM_Base.cs b/RotationSolver.Basic/Rotations/Basic/WHM_Base.cs
index e1e217a76..966bcfd69 100644
--- a/RotationSolver.Basic/Rotations/Basic/WHM_Base.cs
+++ b/RotationSolver.Basic/Rotations/Basic/WHM_Base.cs
@@ -202,9 +202,9 @@ protected static bool LilyAfterGCD(uint gcdCount = 0, float offset = 0)
///
///
///
- public static IBaseAction PresenseOfMind { get; } = new BaseAction(ActionID.PresenseOfMind, ActionOption.Buff)
+ public static IBaseAction PresenceOfMind { get; } = new BaseAction(ActionID.PresenceOfMind, ActionOption.Buff)
{
- ActionCheck = (b, m) => !IsMoving
+ ActionCheck = (b, m) => !IsMoving && IsLongerThan(10),
};
///
diff --git a/RotationSolver.Basic/Rotations/CustomRotation_OtherInfo.cs b/RotationSolver.Basic/Rotations/CustomRotation_OtherInfo.cs
index 531f39c5f..c63bc9d55 100644
--- a/RotationSolver.Basic/Rotations/CustomRotation_OtherInfo.cs
+++ b/RotationSolver.Basic/Rotations/CustomRotation_OtherInfo.cs
@@ -158,6 +158,21 @@ public abstract partial class CustomRotation
///
protected static IEnumerable HostileTargets => DataCenter.HostileTargets;
+ ///
+ /// Average dead time of hostiles.
+ ///
+ public static float AverageDeadTime => DataCenter.AverageDeadTime;
+
+ ///
+ /// Is the larger than .
+ ///
+ /// Time
+ /// Is Longer.
+ public static bool IsLongerThan(float time)
+ {
+ if (IsInHighEndDuty) return true;
+ return AverageDeadTime > time;
+ }
#endregion
#region Command
@@ -167,7 +182,11 @@ public abstract partial class CustomRotation
///
public static bool InBurst => DataCenter.SpecialType == SpecialCommandType.Burst || Service.Config.GetValue(Configuration.PluginConfigBool.AutoBurst);
- bool _canUseHealAction => ClassJob.GetJobRole() == JobRole.Healer || Service.Config.GetValue(Configuration.PluginConfigBool.UseHealWhenNotAHealer) && Service.Config.GetValue(Configuration.PluginConfigBool.AutoHeal);
+ bool _canUseHealAction =>
+ //Job
+ (ClassJob.GetJobRole() == JobRole.Healer || Service.Config.GetValue(Configuration.PluginConfigBool.UseHealWhenNotAHealer))
+ && Service.Config.GetValue(Configuration.PluginConfigBool.AutoHeal)
+ && IsLongerThan(Service.Config.GetValue(Configuration.PluginConfigFloat.AutoHealDeadTime));
///
///
diff --git a/RotationSolver/Localization/ConfigTranslation.cs b/RotationSolver/Localization/ConfigTranslation.cs
index e964e02c7..83c6d1b74 100644
--- a/RotationSolver/Localization/ConfigTranslation.cs
+++ b/RotationSolver/Localization/ConfigTranslation.cs
@@ -180,6 +180,7 @@ internal static class ConfigTranslation
PluginConfigFloat.HealthHealerRatio => LocalizationManager.RightLang.ConfigWindow_Param_HealthHealerRatio,
PluginConfigFloat.HealthTankRatio => LocalizationManager.RightLang.ConfigWindow_Param_HealthTankRatio,
PluginConfigFloat.MoveTargetAngle => LocalizationManager.RightLang.ConfigWindow_Param_MoveTargetAngle,
+ PluginConfigFloat.AutoHealDeadTime => LocalizationManager.RightLang.ConfigWindow_Auto_AutoHealDeadTime,
// target
PluginConfigFloat.DeadTimeBoss => LocalizationManager.RightLang.ConfigWindow_Param_DeadTimeBoss,
diff --git a/RotationSolver/Localization/Strings.cs b/RotationSolver/Localization/Strings.cs
index 139420199..f0a50f442 100644
--- a/RotationSolver/Localization/Strings.cs
+++ b/RotationSolver/Localization/Strings.cs
@@ -463,6 +463,7 @@ internal partial class Strings
{ nameof(CustomRotation.IsValid), "Is this rotation valid"},
{ nameof(CustomRotation.ShowStatus), "Show the status"},
+ { nameof(CustomRotation.AverageDeadTime), "Average dead time"},
#endregion
@@ -717,4 +718,5 @@ internal partial class Strings
public string ConfigWindow_Basic_WeaponDelay { get; set; } = "This is the clipping time.\nGCD is over. However, RS forgets to click the next action.";
public string ConfigWindow_About_ClickingCount { get; set; } = "Rotation Solver helped you by clicking actions {0:N0} times.";
public string ConfigWindow_About_ClickingTooMuch { get; set; } = "Well, you must be a lazy player!";
+ public string ConfigWindow_Auto_AutoHealDeadTime { get; set; } = "Auto heal before combat end several seconds.";
}
\ No newline at end of file
diff --git a/RotationSolver/UI/RotationConfigWindow_Config.cs b/RotationSolver/UI/RotationConfigWindow_Config.cs
index ac470f95f..c9250b0c3 100644
--- a/RotationSolver/UI/RotationConfigWindow_Config.cs
+++ b/RotationSolver/UI/RotationConfigWindow_Config.cs
@@ -514,6 +514,7 @@ private static void DrawAutoActionCondition()
}
},
+ new DragFloatSearchPlugin(PluginConfigFloat.AutoHealDeadTime, 0.02f),
new DragFloatSearchPlugin(PluginConfigFloat.HealthDifference, 0.02f)),
new CheckBoxSearchPlugin(PluginConfigBool.HealOutOfCombat),
diff --git a/RotationSolver/Updaters/TargetUpdater.cs b/RotationSolver/Updaters/TargetUpdater.cs
index 79e81370a..42f3ca2df 100644
--- a/RotationSolver/Updaters/TargetUpdater.cs
+++ b/RotationSolver/Updaters/TargetUpdater.cs
@@ -114,6 +114,9 @@ private unsafe static void UpdateHostileTargets(IEnumerable allTarg
return true;
})));
+ var deadTimes = DataCenter.HostileTargets.Select(b => b.GetDeadTime()).Where(v => !float.IsNaN(v));
+ DataCenter.AverageDeadTime = deadTimes.Any() ? deadTimes.Average() : float.MaxValue;
+
DataCenter.CanInterruptTargets.Delay(DataCenter.HostileTargets.Where(ObjectHelper.CanInterrupt));
DataCenter.TarOnMeTargets = DataCenter.HostileTargets.Where(tar => tar.TargetObjectId == Player.Object.ObjectId);