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);