From d04838347e6ab6bf5b951a27c9d18aa73e639c70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=8B=E6=B0=B4?= <1123993881@qq.com> Date: Thu, 20 Apr 2023 15:30:27 +0800 Subject: [PATCH] fix: changed from count to animationLockTime. --- .../Actions/BaseAction_ActionInfo.cs | 2 +- .../Actions/BaseAction_Cooldown.cs | 12 ++-- RotationSolver.Basic/Actions/BaseItem.cs | 3 +- RotationSolver.Basic/Actions/IBaseAction.cs | 18 +++--- .../Configuration/PluginConfiguration.cs | 2 +- RotationSolver.Basic/DataCenter.cs | 21 +++++- .../Helpers/CooldownHelper.cs | 21 +++--- RotationSolver.Basic/Helpers/StatusHelper.cs | 8 +-- .../Rotations/Basic/BLM_Base.cs | 4 +- .../Rotations/Basic/BRD_Base.cs | 8 +-- .../Rotations/Basic/DNC_Base.cs | 6 +- .../Rotations/Basic/DRG_Base.cs | 2 +- .../Rotations/Basic/DRK_Base.cs | 6 +- .../Rotations/Basic/GNB_Base.cs | 6 +- .../Rotations/Basic/MCH_Base.cs | 2 +- .../Rotations/Basic/MNK_Base.cs | 8 +-- .../Rotations/Basic/NIN_Base.cs | 6 +- .../Rotations/Basic/PLD_Base.cs | 6 +- .../Rotations/Basic/RDM_Base.cs | 4 +- .../Rotations/Basic/RPR_Base.cs | 8 +-- .../Rotations/Basic/SAM_Base.cs | 6 +- .../Rotations/Basic/SGE_Base.cs | 2 +- .../Rotations/Basic/SMN_Base.cs | 4 +- .../Rotations/Basic/WAR_Base.cs | 6 +- .../Rotations/CustomRotation_Ability.cs | 64 +++++++++---------- .../Rotations/CustomRotation_GCD.cs | 10 +-- .../Rotations/CustomRotation_Invoke.cs | 22 ++++--- .../Rotations/CustomRotation_OtherInfo.cs | 8 +-- RotationSolver/Localization/Strings.cs | 1 - RotationSolver/UI/NextActionWindow.cs | 31 +++------ .../UI/RotationConfigWindow_Debug.cs | 2 +- .../UI/RotationConfigWindow_Param.cs | 6 +- RotationSolver/Updaters/ActionUpdater.cs | 50 +++++++-------- 33 files changed, 182 insertions(+), 183 deletions(-) diff --git a/RotationSolver.Basic/Actions/BaseAction_ActionInfo.cs b/RotationSolver.Basic/Actions/BaseAction_ActionInfo.cs index 56f2a8dcb..9738d58ba 100644 --- a/RotationSolver.Basic/Actions/BaseAction_ActionInfo.cs +++ b/RotationSolver.Basic/Actions/BaseAction_ActionInfo.cs @@ -32,7 +32,7 @@ private bool WillCooldown && ChoiceTarget != TargetFilter.FindTargetForMoving && DataCenter.LastAction == (ActionID)AdjustedID) return false; - if (!WillHaveOneCharge(DataCenter.AbilityRemain, false)) return false; + if (!WillHaveOneCharge(DataCenter.ActionRemain, false)) return false; } } diff --git a/RotationSolver.Basic/Actions/BaseAction_Cooldown.cs b/RotationSolver.Basic/Actions/BaseAction_Cooldown.cs index 408bbc472..fe81e2eb5 100644 --- a/RotationSolver.Basic/Actions/BaseAction_Cooldown.cs +++ b/RotationSolver.Basic/Actions/BaseAction_Cooldown.cs @@ -4,11 +4,11 @@ namespace RotationSolver.Basic.Actions; public partial class BaseAction { - public bool ElapsedOneChargeAfterGCD(uint gcdCount = 0, int abilityCount = 0) + public bool ElapsedOneChargeAfterGCD(uint gcdCount = 0, float offset = 0) { if (!IsCoolingDown) return false; var elapsed = RecastTimeElapsedOneCharge; - return CooldownHelper.ElapsedAfterGCD(elapsed, gcdCount, abilityCount); + return CooldownHelper.ElapsedAfterGCD(elapsed, gcdCount, offset); } public bool ElapsedOneChargeAfter(float time) @@ -18,11 +18,11 @@ public bool ElapsedOneChargeAfter(float time) return CooldownHelper.ElapsedAfter(elapsed, time); } - public bool ElapsedAfterGCD(uint gcdCount = 0, int abilityCount = 0) + public bool ElapsedAfterGCD(uint gcdCount = 0, float offset = 0) { if (!IsCoolingDown) return false; var elapsed = RecastTimeElapsed; - return CooldownHelper.ElapsedAfterGCD(elapsed, gcdCount, abilityCount); + return CooldownHelper.ElapsedAfterGCD(elapsed, gcdCount, offset); } public bool ElapsedAfter(float time) @@ -33,11 +33,11 @@ public bool ElapsedAfter(float time) } - public bool WillHaveOneChargeGCD(uint gcdCount = 0, int abilityCount = 0) + public bool WillHaveOneChargeGCD(uint gcdCount = 0, float offset = 0) { if (HasOneCharge) return true; var recast = RecastTimeRemainOneCharge; - return CooldownHelper.RecastAfterGCD(recast, gcdCount, abilityCount); + return CooldownHelper.RecastAfterGCD(recast, gcdCount, offset); } public bool WillHaveOneCharge(float remain) => WillHaveOneCharge(remain, true); diff --git a/RotationSolver.Basic/Actions/BaseItem.cs b/RotationSolver.Basic/Actions/BaseItem.cs index 6cb29ebc1..13df3cbdf 100644 --- a/RotationSolver.Basic/Actions/BaseItem.cs +++ b/RotationSolver.Basic/Actions/BaseItem.cs @@ -87,7 +87,8 @@ public unsafe bool CanUse(out IAction item) var remain = RecastTimeOneCharge - RecastTimeElapsed; - if (CooldownHelper.RecastAfter(DataCenter.AbilityRemain, remain, false)) return false; + if (CooldownHelper.RecastAfter((float)(DataCenter.NextActionTime - DateTime.Now).TotalSeconds, + remain, false)) return false; if (OtherCheck != null && !OtherCheck()) return false; diff --git a/RotationSolver.Basic/Actions/IBaseAction.cs b/RotationSolver.Basic/Actions/IBaseAction.cs index e0ce240bf..cd6b0bb3e 100644 --- a/RotationSolver.Basic/Actions/IBaseAction.cs +++ b/RotationSolver.Basic/Actions/IBaseAction.cs @@ -78,12 +78,12 @@ public interface IBaseAction : IAction bool HasOneCharge { get; } /// - /// Has it been in cooldown for gcds and abilities? + /// Has it been in cooldown for gcds and abilities? /// /// - /// + /// /// - bool ElapsedOneChargeAfterGCD(uint gcdCount = 0, int abilityCount = 0); + bool ElapsedOneChargeAfterGCD(uint gcdCount = 0, float offset = 0); /// /// Has it been in cooldown for seconds? @@ -93,12 +93,12 @@ public interface IBaseAction : IAction bool ElapsedOneChargeAfter(float time); /// - /// Has it been in cooldown for gcds and abilities? + /// Has it been in cooldown for gcds and abilities? /// /// - /// + /// /// - bool ElapsedAfterGCD(uint gcdCount = 0, int abilityCount = 0); + bool ElapsedAfterGCD(uint gcdCount = 0, float offset = 0); /// /// Has it been in cooldown for seconds? @@ -108,12 +108,12 @@ public interface IBaseAction : IAction bool ElapsedAfter(float time); /// - /// Will have at least one charge after gcds and abilities? + /// Will have at least one charge after gcds and abilities? /// /// - /// + /// /// - bool WillHaveOneChargeGCD(uint gcdCount = 0, int abilityCount = 0); + bool WillHaveOneChargeGCD(uint gcdCount = 0, float offset = 0); /// /// Will have at least one charge after seconds? diff --git a/RotationSolver.Basic/Configuration/PluginConfiguration.cs b/RotationSolver.Basic/Configuration/PluginConfiguration.cs index 08eebc7ee..64ee760de 100644 --- a/RotationSolver.Basic/Configuration/PluginConfiguration.cs +++ b/RotationSolver.Basic/Configuration/PluginConfiguration.cs @@ -107,7 +107,7 @@ public class PluginConfiguration : IPluginConfiguration public bool InterruptibleMoreCheck = true; public float SpecialDuration = 3; - public float AbilitiesInterval = 0.67f; + public float ActionAhead = 0.08f; public float ActionAheadForLast0GCD = 0.06f; diff --git a/RotationSolver.Basic/DataCenter.cs b/RotationSolver.Basic/DataCenter.cs index f2961551a..ef661e928 100644 --- a/RotationSolver.Basic/DataCenter.cs +++ b/RotationSolver.Basic/DataCenter.cs @@ -129,9 +129,26 @@ public static unsafe ushort FateId public static float WeaponElapsed { get; set; } - public static byte AbilityRemainCount { get; set; } + /// + /// Time to the next action + /// + public static float ActionRemain => (float)(NextActionTime - DateTime.Now).TotalSeconds; - public static float AbilityRemain { get; set; } + public static float AbilityRemain + { + get + { + var gcdRemain = WeaponRemain; + var remain = (float)(NextActionTime - DateTime.Now).TotalSeconds; + if ((gcdRemain - 0.6f - Ping).IsLessThan(remain)) + { + return gcdRemain + 0.6f + Ping; + } + return remain; + } + } + + public static float NextAbilityToNextGCD => WeaponRemain - ActionRemain; public static float CastingTotal { get; set; } #endregion diff --git a/RotationSolver.Basic/Helpers/CooldownHelper.cs b/RotationSolver.Basic/Helpers/CooldownHelper.cs index b8de5e8ce..d4fde1a6d 100644 --- a/RotationSolver.Basic/Helpers/CooldownHelper.cs +++ b/RotationSolver.Basic/Helpers/CooldownHelper.cs @@ -2,20 +2,19 @@ public static class CooldownHelper { - private static float WeaponRemain(uint gcdCount = 0, int abilityCount = 0) - => WeaponTime(gcdCount, abilityCount) + DataCenter.WeaponRemain; + private static float WeaponRemain(uint gcdCount = 0, float offset = 0) + => WeaponTime(gcdCount, offset) + DataCenter.WeaponRemain; - private static float WeaponElapsed(uint gcdCount = 0, int abilityCount = 0) - => WeaponTime(gcdCount, abilityCount) + DataCenter.WeaponElapsed; + private static float WeaponElapsed(uint gcdCount = 0, float offset = 0) + => WeaponTime(gcdCount, offset) + DataCenter.WeaponElapsed; - private static float WeaponTime(uint gcdCount = 0, int abilityCount = 0) - => DataCenter.WeaponTotal * gcdCount - + Service.Config.AbilitiesInterval * abilityCount; + private static float WeaponTime(uint gcdCount = 0, float offset = 0) + => DataCenter.WeaponTotal * gcdCount + offset; - internal static bool ElapsedAfterGCD(float elapsed, uint gcdCount = 0, int abilityCount = 0) + internal static bool ElapsedAfterGCD(float elapsed, uint gcdCount = 0, float offset = 0) { - var gcdElapsed = WeaponElapsed(gcdCount, abilityCount); + var gcdElapsed = WeaponElapsed(gcdCount, offset); return gcdElapsed.IsLessThan(elapsed); } @@ -26,9 +25,9 @@ internal static bool ElapsedAfter(float elapsed, float gcdElapsed) return gcdElapsed.IsLessThan(elapsed); } - public static bool RecastAfterGCD(float recast, uint gcdCount = 0, int abilityCount = 0) + public static bool RecastAfterGCD(float recast, uint gcdCount = 0, float offset = 0) { - var remain = WeaponRemain(gcdCount, abilityCount); + var remain = WeaponRemain(gcdCount, offset); return recast.IsLessThan(remain); } diff --git a/RotationSolver.Basic/Helpers/StatusHelper.cs b/RotationSolver.Basic/Helpers/StatusHelper.cs index 31fb2fea7..eb0a2e55d 100644 --- a/RotationSolver.Basic/Helpers/StatusHelper.cs +++ b/RotationSolver.Basic/Helpers/StatusHelper.cs @@ -45,20 +45,20 @@ internal record Burst2MinsInfo( StatusID status, bool isOnHostile, byte level, p public static bool NeedHealing(this BattleChara p) => p.WillStatusEndGCD(2, 0, false, NoNeedHealingStatus); /// - /// Will any of be end after gcds and abilities? + /// Will any of be end after gcds add ? /// /// /// - /// + /// /// /// /// - public static bool WillStatusEndGCD(this BattleChara obj, uint gcdCount = 0, int abilityCount = 0, bool isFromSelf = true, params StatusID[] statusIDs) + public static bool WillStatusEndGCD(this BattleChara obj, uint gcdCount = 0, float offset = 0, bool isFromSelf = true, params StatusID[] statusIDs) { var remain = obj.StatusTime(isFromSelf, statusIDs); //as infinite if (remain < 0 && obj.HasStatus(isFromSelf, statusIDs)) return false; - return CooldownHelper.RecastAfterGCD(remain, gcdCount, abilityCount); + return CooldownHelper.RecastAfterGCD(remain, gcdCount, offset); } diff --git a/RotationSolver.Basic/Rotations/Basic/BLM_Base.cs b/RotationSolver.Basic/Rotations/Basic/BLM_Base.cs index 298c366c8..c08b2ec1a 100644 --- a/RotationSolver.Basic/Rotations/Basic/BLM_Base.cs +++ b/RotationSolver.Basic/Rotations/Basic/BLM_Base.cs @@ -91,7 +91,7 @@ public override bool CanUse(out IAction act, CanUseOption option = CanUseOption. public static IBaseAction Thunder2 { get; } = new ThunderAction(ActionID.Thunder2); - public static IBaseAction Transpose { get; } = new BaseAction(ActionID.Transpose) { ActionCheck = b => DataCenter.AbilityRemain.IsLessThan(JobGauge.ElementTimeRemaining / 1000f) }; + public static IBaseAction Transpose { get; } = new BaseAction(ActionID.Transpose) { ActionCheck = b => DataCenter.ActionRemain.IsLessThan(JobGauge.ElementTimeRemaining / 1000f) }; public static IBaseAction UmbralSoul { get; } = new BaseAction(ActionID.UmbralSoul) { ActionCheck = b => JobGauge.InUmbralIce && Transpose.ActionCheck(b) }; @@ -190,7 +190,7 @@ protected sealed override bool DefenseSingleGCD(out IAction act) } [RotationDesc(ActionID.Addle)] - protected override bool DefenseAreaAbility(byte abilitiesRemaining, out IAction act) + protected override bool DefenseAreaAbility(float nextAbilityToNextGCD, out IAction act) { if (Addle.CanUse(out act)) return true; return false; diff --git a/RotationSolver.Basic/Rotations/Basic/BRD_Base.cs b/RotationSolver.Basic/Rotations/Basic/BRD_Base.cs index 64b7ebf4d..404fef4d2 100644 --- a/RotationSolver.Basic/Rotations/Basic/BRD_Base.cs +++ b/RotationSolver.Basic/Rotations/Basic/BRD_Base.cs @@ -114,25 +114,25 @@ protected static bool SongEndAfterGCD(uint gctCount = 0, int abilityCount = 0) StatusID.ShieldSamba), }; - protected override bool EmergencyAbility(byte abilityRemain, IAction nextGCD, out IAction act) + protected override bool EmergencyAbility(float nextAbilityToNextGCD, IAction nextGCD, out IAction act) { //Esuna if (DataCenter.SpecialType == SpecialCommandType.EsunaStanceNorth && DataCenter.WeakenPeople.Any() || DataCenter.DyingPeople.Any()) { if (WardensPaean.CanUse(out act, CanUseOption.MustUse)) return true; } - return base.EmergencyAbility(abilityRemain, nextGCD, out act); + return base.EmergencyAbility(nextAbilityToNextGCD, nextGCD, out act); } [RotationDesc(ActionID.Troubadour)] - protected sealed override bool DefenseAreaAbility(byte abilitiesRemaining, out IAction act) + protected sealed override bool DefenseAreaAbility(float nextAbilityToNextGCD, out IAction act) { if (Troubadour.CanUse(out act)) return true; return false; } [RotationDesc(ActionID.NaturesMinne)] - protected sealed override bool HealSingleAbility(byte abilitiesRemaining, out IAction act) + protected sealed override bool HealSingleAbility(float nextAbilityToNextGCD, out IAction act) { if (NaturesMinne.CanUse(out act)) return true; return false; diff --git a/RotationSolver.Basic/Rotations/Basic/DNC_Base.cs b/RotationSolver.Basic/Rotations/Basic/DNC_Base.cs index e2126e582..6967ea04a 100644 --- a/RotationSolver.Basic/Rotations/Basic/DNC_Base.cs +++ b/RotationSolver.Basic/Rotations/Basic/DNC_Base.cs @@ -201,14 +201,14 @@ protected static bool ExecuteStepGCD(out IAction act) } [RotationDesc(ActionID.EnAvant)] - protected sealed override bool MoveForwardAbility(byte abilitiesRemaining, out IAction act, CanUseOption option = CanUseOption.None) + protected sealed override bool MoveForwardAbility(float nextAbilityToNextGCD, out IAction act, CanUseOption option = CanUseOption.None) { if (EnAvant.CanUse(out act, CanUseOption.EmptyOrSkipCombo | option)) return true; return false; } [RotationDesc(ActionID.CuringWaltz, ActionID.Improvisation)] - protected sealed override bool HealAreaAbility(byte abilitiesRemaining, out IAction act) + protected sealed override bool HealAreaAbility(float nextAbilityToNextGCD, out IAction act) { if (CuringWaltz.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true; if (Improvisation.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true; @@ -216,7 +216,7 @@ protected sealed override bool HealAreaAbility(byte abilitiesRemaining, out IAct } [RotationDesc(ActionID.ShieldSamba)] - protected sealed override bool DefenseAreaAbility(byte abilitiesRemaining, out IAction act) + protected sealed override bool DefenseAreaAbility(float nextAbilityToNextGCD, out IAction act) { if (ShieldSamba.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true; return false; diff --git a/RotationSolver.Basic/Rotations/Basic/DRG_Base.cs b/RotationSolver.Basic/Rotations/Basic/DRG_Base.cs index 27f1b90af..077f87a52 100644 --- a/RotationSolver.Basic/Rotations/Basic/DRG_Base.cs +++ b/RotationSolver.Basic/Rotations/Basic/DRG_Base.cs @@ -114,7 +114,7 @@ public abstract class DRG_Base : CustomRotation public static IBaseAction BattleLitany { get; } = new BaseAction(ActionID.BattleLitany, ActionOption.Buff); [RotationDesc(ActionID.Feint)] - protected sealed override bool DefenseAreaAbility(byte abilitiesRemaining, out IAction act) + protected sealed override bool DefenseAreaAbility(float nextAbilityToNextGCD, out IAction act) { if (Feint.CanUse(out act)) return true; return false; diff --git a/RotationSolver.Basic/Rotations/Basic/DRK_Base.cs b/RotationSolver.Basic/Rotations/Basic/DRK_Base.cs index febff9979..b6e9bf3e2 100644 --- a/RotationSolver.Basic/Rotations/Basic/DRK_Base.cs +++ b/RotationSolver.Basic/Rotations/Basic/DRK_Base.cs @@ -113,14 +113,14 @@ protected static bool DarkSideEndAfterGCD(uint gctCount = 0, int abilityCount = StatusNeed = new[] { StatusID.SaltedEarth }, }; - protected override bool EmergencyAbility(byte abilitiesRemaining, IAction nextGCD, out IAction act) + protected override bool EmergencyAbility(float nextAbilityToNextGCD, IAction nextGCD, out IAction act) { if (LivingDead.CanUse(out act) && BaseAction.TankBreakOtherCheck(JobIDs[0])) return true; - return base.EmergencyAbility(abilitiesRemaining, nextGCD, out act); + return base.EmergencyAbility(nextAbilityToNextGCD, nextGCD, out act); } [RotationDesc(ActionID.Plunge)] - protected sealed override bool MoveForwardAbility(byte abilitiesRemaining, out IAction act, CanUseOption option = CanUseOption.None) + protected sealed override bool MoveForwardAbility(float nextAbilityToNextGCD, out IAction act, CanUseOption option = CanUseOption.None) { if (Plunge.CanUse(out act, CanUseOption.EmptyOrSkipCombo | option)) return true; diff --git a/RotationSolver.Basic/Rotations/Basic/GNB_Base.cs b/RotationSolver.Basic/Rotations/Basic/GNB_Base.cs index 53c5be5c6..c9458bb31 100644 --- a/RotationSolver.Basic/Rotations/Basic/GNB_Base.cs +++ b/RotationSolver.Basic/Rotations/Basic/GNB_Base.cs @@ -136,14 +136,14 @@ public abstract class GNB_Base : CustomRotation == ActionID.Hypervelocity, }; - protected override bool EmergencyAbility(byte abilitiesRemaining, IAction nextGCD, out IAction act) + protected override bool EmergencyAbility(float nextAbilityToNextGCD, IAction nextGCD, out IAction act) { if (SuperBolide.CanUse(out act) && BaseAction.TankBreakOtherCheck(JobIDs[0])) return true; - return base.EmergencyAbility(abilitiesRemaining, nextGCD, out act); + return base.EmergencyAbility(nextAbilityToNextGCD, nextGCD, out act); } [RotationDesc(ActionID.RoughDivide)] - protected sealed override bool MoveForwardAbility(byte abilitiesRemaining, out IAction act, CanUseOption option = CanUseOption.None) + protected sealed override bool MoveForwardAbility(float nextAbilityToNextGCD, out IAction act, CanUseOption option = CanUseOption.None) { if (RoughDivide.CanUse(out act, CanUseOption.EmptyOrSkipCombo | option)) return true; return false; diff --git a/RotationSolver.Basic/Rotations/Basic/MCH_Base.cs b/RotationSolver.Basic/Rotations/Basic/MCH_Base.cs index a912ec240..f0b1eae01 100644 --- a/RotationSolver.Basic/Rotations/Basic/MCH_Base.cs +++ b/RotationSolver.Basic/Rotations/Basic/MCH_Base.cs @@ -96,7 +96,7 @@ protected static bool OverheatedEndAfterGCD(uint gctCount = 0, int abilityCount public static IBaseAction Dismantle { get; } = new BaseAction(ActionID.Dismantle, ActionOption.Defense); [RotationDesc(ActionID.Tactician, ActionID.Dismantle)] - protected sealed override bool DefenseAreaAbility(byte abilitiesRemaining, out IAction act) + protected sealed override bool DefenseAreaAbility(float nextAbilityToNextGCD, out IAction act) { if (Tactician.CanUse(out act, CanUseOption.MustUse)) return true; if (Dismantle.CanUse(out act, CanUseOption.MustUse)) return true; diff --git a/RotationSolver.Basic/Rotations/Basic/MNK_Base.cs b/RotationSolver.Basic/Rotations/Basic/MNK_Base.cs index 9ae0b3158..4fbe839d6 100644 --- a/RotationSolver.Basic/Rotations/Basic/MNK_Base.cs +++ b/RotationSolver.Basic/Rotations/Basic/MNK_Base.cs @@ -94,28 +94,28 @@ public abstract class MNK_Base : CustomRotation public static IBaseAction RiddleOfWind { get; } = new BaseAction(ActionID.RiddleOfWind, ActionOption.Buff); [RotationDesc(ActionID.Thunderclap)] - protected sealed override bool MoveForwardAbility(byte abilitiesRemaining, out IAction act, CanUseOption option = CanUseOption.None) + protected sealed override bool MoveForwardAbility(float nextAbilityToNextGCD, out IAction act, CanUseOption option = CanUseOption.None) { if (Thunderclap.CanUse(out act, CanUseOption.EmptyOrSkipCombo | option)) return true; return false; } [RotationDesc(ActionID.Feint)] - protected sealed override bool DefenseAreaAbility(byte abilitiesRemaining, out IAction act) + protected sealed override bool DefenseAreaAbility(float nextAbilityToNextGCD, out IAction act) { if (Feint.CanUse(out act)) return true; return false; } [RotationDesc(ActionID.Mantra)] - protected sealed override bool HealAreaAbility(byte abilitiesRemaining, out IAction act) + protected sealed override bool HealAreaAbility(float nextAbilityToNextGCD, out IAction act) { if (Mantra.CanUse(out act)) return true; return false; } [RotationDesc(ActionID.RiddleOfEarth)] - protected sealed override bool DefenseSingleAbility(byte abilitiesRemaining, out IAction act) + protected sealed override bool DefenseSingleAbility(float nextAbilityToNextGCD, out IAction act) { if (RiddleOfEarth.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true; return false; diff --git a/RotationSolver.Basic/Rotations/Basic/NIN_Base.cs b/RotationSolver.Basic/Rotations/Basic/NIN_Base.cs index a0696038b..876f53e34 100644 --- a/RotationSolver.Basic/Rotations/Basic/NIN_Base.cs +++ b/RotationSolver.Basic/Rotations/Basic/NIN_Base.cs @@ -168,7 +168,7 @@ internal NinAction(ActionID actionID, params IBaseAction[] ninjutsu) public static INinAction HyoshoRanryu { get; } = new NinAction(ActionID.HyoshoRanryu, Ten, Jin); [RotationDesc(ActionID.Shukuchi)] - protected sealed override bool MoveForwardAbility(byte abilitiesRemaining, out IAction act, CanUseOption option = CanUseOption.None) + protected sealed override bool MoveForwardAbility(float nextAbilityToNextGCD, out IAction act, CanUseOption option = CanUseOption.None) { if (Shukuchi.CanUse(out act, CanUseOption.EmptyOrSkipCombo | option)) return true; @@ -176,14 +176,14 @@ protected sealed override bool MoveForwardAbility(byte abilitiesRemaining, out I } [RotationDesc(ActionID.Feint)] - protected sealed override bool DefenseAreaAbility(byte abilitiesRemaining, out IAction act) + protected sealed override bool DefenseAreaAbility(float nextAbilityToNextGCD, out IAction act) { if (Feint.CanUse(out act)) return true; return false; } [RotationDesc(ActionID.ShadeShift)] - protected override bool DefenseSingleAbility(byte abilitiesRemaining, out IAction act) + protected override bool DefenseSingleAbility(float nextAbilityToNextGCD, out IAction act) { if (ShadeShift.CanUse(out act)) return true; diff --git a/RotationSolver.Basic/Rotations/Basic/PLD_Base.cs b/RotationSolver.Basic/Rotations/Basic/PLD_Base.cs index ec42994b3..dbdfaca50 100644 --- a/RotationSolver.Basic/Rotations/Basic/PLD_Base.cs +++ b/RotationSolver.Basic/Rotations/Basic/PLD_Base.cs @@ -101,14 +101,14 @@ public abstract class PLD_Base : CustomRotation ActionCheck = BaseAction.TankDefenseSelf, }; - protected override bool EmergencyAbility(byte abilitiesRemaining, IAction nextGCD, out IAction act) + protected override bool EmergencyAbility(float nextAbilityToNextGCD, IAction nextGCD, out IAction act) { if (HallowedGround.CanUse(out act) && BaseAction.TankBreakOtherCheck(JobIDs[0])) return true; - return base.EmergencyAbility(abilitiesRemaining, nextGCD, out act); + return base.EmergencyAbility(nextAbilityToNextGCD, nextGCD, out act); } [RotationDesc(ActionID.Intervene)] - protected sealed override bool MoveForwardAbility(byte abilitiesRemaining, out IAction act, CanUseOption option = CanUseOption.None) + protected sealed override bool MoveForwardAbility(float nextAbilityToNextGCD, out IAction act, CanUseOption option = CanUseOption.None) { if (Intervene.CanUse(out act, CanUseOption.EmptyOrSkipCombo | option)) return true; return false; diff --git a/RotationSolver.Basic/Rotations/Basic/RDM_Base.cs b/RotationSolver.Basic/Rotations/Basic/RDM_Base.cs index b27281977..8e47e6717 100644 --- a/RotationSolver.Basic/Rotations/Basic/RDM_Base.cs +++ b/RotationSolver.Basic/Rotations/Basic/RDM_Base.cs @@ -132,14 +132,14 @@ protected sealed override bool HealSingleGCD(out IAction act) } [RotationDesc(ActionID.CorpsACorps)] - protected sealed override bool MoveForwardAbility(byte abilitiesRemaining, out IAction act, CanUseOption option = CanUseOption.None) + protected sealed override bool MoveForwardAbility(float nextAbilityToNextGCD, out IAction act, CanUseOption option = CanUseOption.None) { if (CorpsACorps.CanUse(out act, CanUseOption.EmptyOrSkipCombo | option)) return true; return false; } [RotationDesc(ActionID.Addle, ActionID.MagickBarrier)] - protected sealed override bool DefenseAreaAbility(byte abilitiesRemaining, out IAction act) + protected sealed override bool DefenseAreaAbility(float nextAbilityToNextGCD, out IAction act) { if (Addle.CanUse(out act)) return true; if (MagickBarrier.CanUse(out act, CanUseOption.MustUse)) return true; diff --git a/RotationSolver.Basic/Rotations/Basic/RPR_Base.cs b/RotationSolver.Basic/Rotations/Basic/RPR_Base.cs index 93047a8cc..44a05fb4f 100644 --- a/RotationSolver.Basic/Rotations/Basic/RPR_Base.cs +++ b/RotationSolver.Basic/Rotations/Basic/RPR_Base.cs @@ -205,14 +205,14 @@ public abstract class RPR_Base : CustomRotation #endregion [RotationDesc(ActionID.HellsIngress)] - protected sealed override bool MoveForwardAbility(byte abilitiesRemaining, out IAction act, CanUseOption option = CanUseOption.None) + protected sealed override bool MoveForwardAbility(float nextAbilityToNextGCD, out IAction act, CanUseOption option = CanUseOption.None) { if (HellsIngress.CanUse(out act, CanUseOption.EmptyOrSkipCombo | option)) return true; return false; } [RotationDesc(ActionID.Feint)] - protected sealed override bool DefenseAreaAbility(byte abilitiesRemaining, out IAction act) + protected sealed override bool DefenseAreaAbility(float nextAbilityToNextGCD, out IAction act) { if (!SoulReaver && !Enshrouded) { @@ -224,13 +224,13 @@ protected sealed override bool DefenseAreaAbility(byte abilitiesRemaining, out I } [RotationDesc(ActionID.ArcaneCrest)] - protected override bool DefenseSingleAbility(byte abilitiesRemaining, out IAction act) + protected override bool DefenseSingleAbility(float nextAbilityToNextGCD, out IAction act) { if (!SoulReaver && !Enshrouded) { if (ArcaneCrest.CanUse(out act)) return true; } - return base.DefenseSingleAbility(abilitiesRemaining, out act); + return base.DefenseSingleAbility(nextAbilityToNextGCD, out act); } } diff --git a/RotationSolver.Basic/Rotations/Basic/SAM_Base.cs b/RotationSolver.Basic/Rotations/Basic/SAM_Base.cs index 963a8b7e3..9ecac8cd1 100644 --- a/RotationSolver.Basic/Rotations/Basic/SAM_Base.cs +++ b/RotationSolver.Basic/Rotations/Basic/SAM_Base.cs @@ -169,21 +169,21 @@ public abstract class SAM_Base : CustomRotation #endregion [RotationDesc(ActionID.HissatsuGyoten)] - protected sealed override bool MoveForwardAbility(byte abilitiesRemaining, out IAction act, CanUseOption option = CanUseOption.None) + protected sealed override bool MoveForwardAbility(float nextAbilityToNextGCD, out IAction act, CanUseOption option = CanUseOption.None) { if (HissatsuGyoten.CanUse(out act, CanUseOption.EmptyOrSkipCombo | option)) return true; return false; } [RotationDesc(ActionID.Feint)] - protected sealed override bool DefenseAreaAbility(byte abilitiesRemaining, out IAction act) + protected sealed override bool DefenseAreaAbility(float nextAbilityToNextGCD, out IAction act) { if (Feint.CanUse(out act)) return true; return false; } [RotationDesc(ActionID.ThirdEye)] - protected override bool DefenseSingleAbility(byte abilitiesRemaining, out IAction act) + protected override bool DefenseSingleAbility(float nextAbilityToNextGCD, out IAction act) { if (ThirdEye.CanUse(out act)) return true; return false; diff --git a/RotationSolver.Basic/Rotations/Basic/SGE_Base.cs b/RotationSolver.Basic/Rotations/Basic/SGE_Base.cs index 49ac9654d..511e5578d 100644 --- a/RotationSolver.Basic/Rotations/Basic/SGE_Base.cs +++ b/RotationSolver.Basic/Rotations/Basic/SGE_Base.cs @@ -147,7 +147,7 @@ protected static bool AddersgallEndAfterGCD(uint gctCount = 0, int abilityCount }; [RotationDesc(ActionID.Icarus)] - protected sealed override bool MoveForwardAbility(byte abilitiesRemaining, out IAction act, CanUseOption option = CanUseOption.None) + protected sealed override bool MoveForwardAbility(float nextAbilityToNextGCD, out IAction act, CanUseOption option = CanUseOption.None) { //���� if (Icarus.CanUse(out act, CanUseOption.EmptyOrSkipCombo | option)) return true; diff --git a/RotationSolver.Basic/Rotations/Basic/SMN_Base.cs b/RotationSolver.Basic/Rotations/Basic/SMN_Base.cs index 14b602864..2ac035f97 100644 --- a/RotationSolver.Basic/Rotations/Basic/SMN_Base.cs +++ b/RotationSolver.Basic/Rotations/Basic/SMN_Base.cs @@ -170,7 +170,7 @@ protected static bool SummonTimeEndAfter(float time) public static IBaseAction Physick { get; } = new BaseAction(ActionID.Physick, ActionOption.Heal); [RotationDesc(ActionID.RadiantAegis)] - protected sealed override bool DefenseSingleAbility(byte abilitiesRemaining, out IAction act) + protected sealed override bool DefenseSingleAbility(float nextAbilityToNextGCD, out IAction act) { if (RadiantAegis.CanUse(out act)) return true; return false; @@ -184,7 +184,7 @@ protected override bool HealSingleGCD(out IAction act) } [RotationDesc(ActionID.Addle)] - protected override bool DefenseAreaAbility(byte abilitiesRemaining, out IAction act) + protected override bool DefenseAreaAbility(float nextAbilityToNextGCD, out IAction act) { if (Addle.CanUse(out act)) return true; return false; diff --git a/RotationSolver.Basic/Rotations/Basic/WAR_Base.cs b/RotationSolver.Basic/Rotations/Basic/WAR_Base.cs index f34479fb3..cef2272f5 100644 --- a/RotationSolver.Basic/Rotations/Basic/WAR_Base.cs +++ b/RotationSolver.Basic/Rotations/Basic/WAR_Base.cs @@ -104,14 +104,14 @@ public abstract class WAR_Base : CustomRotation StatusNeed = new[] { StatusID.PrimalRendReady } }; - protected override bool EmergencyAbility(byte abilitiesRemaining, IAction nextGCD, out IAction act) + protected override bool EmergencyAbility(float nextAbilityToNextGCD, IAction nextGCD, out IAction act) { if (Holmgang.CanUse(out act) && BaseAction.TankBreakOtherCheck(JobIDs[0])) return true; - return base.EmergencyAbility(abilitiesRemaining, nextGCD, out act); + return base.EmergencyAbility(nextAbilityToNextGCD, nextGCD, out act); } [RotationDesc(ActionID.Onslaught)] - protected sealed override bool MoveForwardAbility(byte abilitiesRemaining, out IAction act, CanUseOption option = CanUseOption.None) + protected sealed override bool MoveForwardAbility(float nextAbilityToNextGCD, out IAction act, CanUseOption option = CanUseOption.None) { if (Onslaught.CanUse(out act, CanUseOption.EmptyOrSkipCombo | option)) return true; return false; diff --git a/RotationSolver.Basic/Rotations/CustomRotation_Ability.cs b/RotationSolver.Basic/Rotations/CustomRotation_Ability.cs index 7058bad2e..30d120788 100644 --- a/RotationSolver.Basic/Rotations/CustomRotation_Ability.cs +++ b/RotationSolver.Basic/Rotations/CustomRotation_Ability.cs @@ -2,20 +2,20 @@ namespace RotationSolver.Basic.Rotations; public abstract partial class CustomRotation { - private bool Ability(byte abilitiesRemaining, IAction nextGCD, out IAction act, bool helpDefenseAOE, bool helpDefenseSingle) + private bool Ability(float nextAbilityToNextGCD, IAction nextGCD, out IAction act, bool helpDefenseAOE, bool helpDefenseSingle) { act = DataCenter.CommandNextAction; if (act is IBaseAction a && a != null && !a.IsRealGCD && a.CanUse(out _, CanUseOption.MustUse | CanUseOption.SkipDisable | CanUseOption.EmptyOrSkipCombo)) return true; if(act is IBaseItem i && i.CanUse(out _)) return true; if (!Service.Config.GetValue(SettingsCommand.UseAbility) - || Player.TotalCastTime - Player.CurrentCastTime > Service.Config.AbilitiesInterval) + || Player.TotalCastTime > 0) { act = null; return false; } - if (EmergencyAbility(abilitiesRemaining, nextGCD, out act)) return true; + if (EmergencyAbility(nextAbilityToNextGCD, nextGCD, out act)) return true; var role = Job.GetJobRole(); if (InterruptAbility(role, out act)) return true; @@ -30,16 +30,16 @@ private bool Ability(byte abilitiesRemaining, IAction nextGCD, out IAction act, if (TrueNorth.CanUse(out act)) return true; } - if (GeneralHealAbility(abilitiesRemaining, specialType, out act)) return true; + if (GeneralHealAbility(nextAbilityToNextGCD, specialType, out act)) return true; - if (AutoDefense(abilitiesRemaining, role, helpDefenseAOE, helpDefenseSingle, out act)) return true; + if (AutoDefense(nextAbilityToNextGCD, role, helpDefenseAOE, helpDefenseSingle, out act)) return true; - if (MovingAbility(abilitiesRemaining, specialType, out act)) return true; + if (MovingAbility(nextAbilityToNextGCD, specialType, out act)) return true; if (GeneralUsingAbility(role, out act)) return true; - if (HasHostilesInRange && AttackAbility(abilitiesRemaining, out act)) return true; - if (GeneralAbility(abilitiesRemaining, out act)) return true; + if (HasHostilesInRange && AttackAbility(nextAbilityToNextGCD, out act)) return true; + if (GeneralAbility(nextAbilityToNextGCD, out act)) return true; //Run! if (!InCombat && IsMoving && role == JobRole.RangedPhysical @@ -124,31 +124,31 @@ private bool AntiKnockback(JobRole role, SpecialCommandType specialType, out IAc return false; } - private bool GeneralHealAbility(byte abilitiesRemaining, SpecialCommandType specialType, out IAction act) + private bool GeneralHealAbility(float nextAbilityToNextGCD, SpecialCommandType specialType, out IAction act) { act = null; switch (specialType) { case SpecialCommandType.DefenseArea: - if (DefenseAreaAbility(abilitiesRemaining, out act)) return true; + if (DefenseAreaAbility(nextAbilityToNextGCD, out act)) return true; break; case SpecialCommandType.DefenseSingle: - if (DefenseSingleAbility(abilitiesRemaining, out act)) return true; + if (DefenseSingleAbility(nextAbilityToNextGCD, out act)) return true; break; } if ((DataCenter.HPNotFull || Job.GetJobRole() != JobRole.Healer) && InCombat) { - if ((DataCenter.SpecialType == SpecialCommandType.HealArea || CanHealAreaAbility) && HealAreaAbility(abilitiesRemaining, out act)) return true; - if ((DataCenter.SpecialType == SpecialCommandType.HealSingle || CanHealSingleAbility) && HealSingleAbility(abilitiesRemaining, out act)) return true; + if ((DataCenter.SpecialType == SpecialCommandType.HealArea || CanHealAreaAbility) && HealAreaAbility(nextAbilityToNextGCD, out act)) return true; + if ((DataCenter.SpecialType == SpecialCommandType.HealSingle || CanHealSingleAbility) && HealSingleAbility(nextAbilityToNextGCD, out act)) return true; } return false; } - private bool AutoDefense(byte abilitiesRemaining, JobRole role, bool helpDefenseAOE, bool helpDefenseSingle, out IAction act) + private bool AutoDefense(float nextAbilityToNextGCD, JobRole role, bool helpDefenseAOE, bool helpDefenseSingle, out IAction act) { act = null; if (!InCombat || !HasHostilesInRange) @@ -171,10 +171,10 @@ private bool AutoDefense(byte abilitiesRemaining, JobRole role, bool helpDefense if (helpDefenseAOE) { - if (DefenseAreaAbility(abilitiesRemaining, out act)) return true; + if (DefenseAreaAbility(nextAbilityToNextGCD, out act)) return true; if (role is JobRole.Melee or JobRole.RangedPhysical or JobRole.RangedMagical) { - if (DefenseSingleAbility(abilitiesRemaining, out act)) return true; + if (DefenseSingleAbility(nextAbilityToNextGCD, out act)) return true; } } @@ -187,31 +187,31 @@ private bool AutoDefense(byte abilitiesRemaining, JobRole role, bool helpDefense if (tarOnMeCount > 1 && !IsMoving) { if (ArmsLength.CanUse(out act)) return true; - if (DefenseSingleAbility(abilitiesRemaining, out act)) return true; + if (DefenseSingleAbility(nextAbilityToNextGCD, out act)) return true; } //Big damage casting action. if (tarOnMeCount == 1 && DataCenter.IsHostileCastingToTank) { - if (DefenseSingleAbility(abilitiesRemaining, out act)) return true; + if (DefenseSingleAbility(nextAbilityToNextGCD, out act)) return true; } } - if (helpDefenseSingle && DefenseSingleAbility(abilitiesRemaining, out act)) return true; + if (helpDefenseSingle && DefenseSingleAbility(nextAbilityToNextGCD, out act)) return true; return false; } - private bool MovingAbility(byte abilitiesRemaining, SpecialCommandType specialType, out IAction act) + private bool MovingAbility(float nextAbilityToNextGCD, SpecialCommandType specialType, out IAction act) { act = null; - if (specialType == SpecialCommandType.MoveForward && MoveForwardAbility(abilitiesRemaining, out act)) + if (specialType == SpecialCommandType.MoveForward && MoveForwardAbility(nextAbilityToNextGCD, out act)) { if (act is BaseAction b && ObjectHelper.DistanceToPlayer(b.Target) > 5) return true; } else if (specialType == SpecialCommandType.MoveBack) { - if (MoveBackAbility(abilitiesRemaining, out act)) return true; + if (MoveBackAbility(nextAbilityToNextGCD, out act)) return true; } return false; } @@ -244,14 +244,14 @@ private bool GeneralUsingAbility(JobRole role, out IAction act) } - protected virtual bool EmergencyAbility(byte abilitiesRemaining, IAction nextGCD, out IAction act) + protected virtual bool EmergencyAbility(float nextAbilityToNextGCD, IAction nextGCD, out IAction act) { if (nextGCD is BaseAction action) { if (Job.GetJobRole() is JobRole.Healer or JobRole.RangedMagical && action.CastTime >= 5 && Swiftcast.CanUse(out act, CanUseOption.EmptyOrSkipCombo)) return true; - if (Service.Config.GetValue(SettingsCommand.AutoUseTrueNorth) && abilitiesRemaining == 1 + if (Service.Config.GetValue(SettingsCommand.AutoUseTrueNorth) && nextAbilityToNextGCD < TrueNorth.AnimationLockTime + DataCenter.Ping + 0.6f && action.EnemyPositional != EnemyPositional.None && action.Target != null) { if (action.EnemyPositional != action.Target.FindEnemyPositional() && action.Target.HasPositional()) @@ -266,45 +266,45 @@ protected virtual bool EmergencyAbility(byte abilitiesRemaining, IAction nextGCD } [RotationDesc(DescType.MoveForwardAbility)] - protected virtual bool MoveForwardAbility(byte abilitiesRemaining, out IAction act, CanUseOption option = CanUseOption.None) + protected virtual bool MoveForwardAbility(float nextAbilityToNextGCD, out IAction act, CanUseOption option = CanUseOption.None) { act = null; return false; } [RotationDesc(DescType.MoveBackAbility)] - protected virtual bool MoveBackAbility(byte abilitiesRemaining, out IAction act) + protected virtual bool MoveBackAbility(float nextAbilityToNextGCD, out IAction act) { act = null; return false; } [RotationDesc(DescType.HealSingleAbility)] - protected virtual bool HealSingleAbility(byte abilitiesRemaining, out IAction act) + protected virtual bool HealSingleAbility(float nextAbilityToNextGCD, out IAction act) { act = null; return false; } [RotationDesc(DescType.HealAreaAbility)] - protected virtual bool HealAreaAbility(byte abilitiesRemaining, out IAction act) + protected virtual bool HealAreaAbility(float nextAbilityToNextGCD, out IAction act) { act = null; return false; } [RotationDesc(DescType.DefenseSingleAbility)] - protected virtual bool DefenseSingleAbility(byte abilitiesRemaining, out IAction act) + protected virtual bool DefenseSingleAbility(float nextAbilityToNextGCD, out IAction act) { act = null; return false; } [RotationDesc(DescType.DefenseAreaAbility)] - protected virtual bool DefenseAreaAbility(byte abilitiesRemaining, out IAction act) + protected virtual bool DefenseAreaAbility(float nextAbilityToNextGCD, out IAction act) { act = null; return false; } - protected virtual bool GeneralAbility(byte abilitiesRemaining, out IAction act) + protected virtual bool GeneralAbility(float nextAbilityToNextGCD, out IAction act) { act = null; return false; } - protected abstract bool AttackAbility(byte abilitiesRemaining, out IAction act); + protected abstract bool AttackAbility(float nextAbilityToNextGCD, out IAction act); } diff --git a/RotationSolver.Basic/Rotations/CustomRotation_GCD.cs b/RotationSolver.Basic/Rotations/CustomRotation_GCD.cs index 6a5d03e8f..bd9c19f23 100644 --- a/RotationSolver.Basic/Rotations/CustomRotation_GCD.cs +++ b/RotationSolver.Basic/Rotations/CustomRotation_GCD.cs @@ -2,7 +2,7 @@ public abstract partial class CustomRotation { - private IAction GCD(byte abilityRemain, bool helpDefenseAOE, bool helpDefenseSingle) + private IAction GCD(float nextAbilityToNextGCD, bool helpDefenseAOE, bool helpDefenseSingle) { IAction act = DataCenter.CommandNextAction; if (act is IBaseAction a && a != null && a.IsRealGCD && a.CanUse(out _, CanUseOption.MustUse | CanUseOption.SkipDisable | CanUseOption.EmptyOrSkipCombo)) return act; @@ -11,7 +11,7 @@ private IAction GCD(byte abilityRemain, bool helpDefenseAOE, bool helpDefenseSin var specialType = DataCenter.SpecialType; - if (RaiseSpell(specialType, out act, abilityRemain, false)) return act; + if (RaiseSpell(specialType, out act, nextAbilityToNextGCD, false)) return act; if (specialType == SpecialCommandType.MoveForward && MoveForwardGCD(out act)) { @@ -43,12 +43,12 @@ private IAction GCD(byte abilityRemain, bool helpDefenseAOE, bool helpDefenseSin if (GeneralGCD(out var action)) return action; - if (Service.Config.RaisePlayerByCasting && RaiseSpell(specialType, out act, abilityRemain, true)) return act; + if (Service.Config.RaisePlayerByCasting && RaiseSpell(specialType, out act, nextAbilityToNextGCD, true)) return act; return null; } - private bool RaiseSpell(SpecialCommandType specialType, out IAction act, byte actabilityRemain, bool mustUse) + private bool RaiseSpell(SpecialCommandType specialType, out IAction act, float nextAbilityToNextGCD, bool mustUse) { act = null; if (Raise == null || Player.CurrentMp <= Service.Config.LessMPNoRaise) @@ -80,7 +80,7 @@ private bool RaiseSpell(SpecialCommandType specialType, out IAction act, byte ac return DataCenter.SetAutoStatus(AutoStatus.Raise, true); } } - else if (Service.Config.GetValue(SettingsCommand.RaisePlayerBySwift) && !Swiftcast.IsCoolingDown && actabilityRemain > 0) + else if (Service.Config.GetValue(SettingsCommand.RaisePlayerBySwift) && !Swiftcast.IsCoolingDown && nextAbilityToNextGCD > 0.6f + DataCenter.Ping) { return DataCenter.SetAutoStatus(AutoStatus.Raise, true); } diff --git a/RotationSolver.Basic/Rotations/CustomRotation_Invoke.cs b/RotationSolver.Basic/Rotations/CustomRotation_Invoke.cs index 4816c5e43..bc03b5794 100644 --- a/RotationSolver.Basic/Rotations/CustomRotation_Invoke.cs +++ b/RotationSolver.Basic/Rotations/CustomRotation_Invoke.cs @@ -19,7 +19,9 @@ public bool TryInvoke(out IAction newAction, out IAction gcdAction) ActionMoveForwardAbility = movingTarget ? act : null; MoveTarget = (movingTarget && act is IBaseAction a) ? a.Target : null; - ActionMoveBackAbility = MoveBackAbility(DataCenter.AbilityRemainCount, out act) ? act : null; + var nextAbilityToNextGCD = DataCenter.NextAbilityToNextGCD; + + ActionMoveBackAbility = MoveBackAbility(nextAbilityToNextGCD, out act) ? act : null; if(!DataCenter.HPNotFull && role == JobRole.Healer) { @@ -28,17 +30,17 @@ public bool TryInvoke(out IAction newAction, out IAction gcdAction) else { ActionHealAreaGCD = HealAreaGCD(out act) ? act : null; - ActionHealAreaAbility = HealAreaAbility(DataCenter.AbilityRemainCount, out act) ? act : null; + ActionHealAreaAbility = HealAreaAbility(nextAbilityToNextGCD, out act) ? act : null; ActionHealSingleGCD = HealSingleGCD(out act) ? act : null; - ActionHealSingleAbility = HealSingleAbility(DataCenter.AbilityRemainCount, out act) ? act : null; + ActionHealSingleAbility = HealSingleAbility(nextAbilityToNextGCD, out act) ? act : null; } ActionDefenseAreaGCD = DefenseAreaGCD(out act) ? act : null; - ActionDefenseAreaAbility = DefenseAreaAbility(DataCenter.AbilityRemainCount, out act) ? act : null; + ActionDefenseAreaAbility = DefenseAreaAbility(nextAbilityToNextGCD, out act) ? act : null; ActionDefenseSingleGCD = DefenseSingleGCD(out act) ? act : null; - ActionDefenseSingleAbility = DefenseSingleAbility(DataCenter.AbilityRemainCount, out act) ? act : null; + ActionDefenseSingleAbility = DefenseSingleAbility(nextAbilityToNextGCD, out act) ? act : null; EsunaStanceNorthGCD = role switch { @@ -91,7 +93,7 @@ private IAction Invoke(out IAction gcdAction) return CountDownAction(countDown); } - byte abilityRemain = DataCenter.AbilityRemainCount; + float nextAbilityToNextGCD = DataCenter.NextAbilityToNextGCD; var helpDefenseAOE = Service.Config.GetValue(SettingsCommand.UseDefenseAbility) && DataCenter.IsHostileCastingAOE; bool helpDefenseSingle = false; @@ -107,19 +109,19 @@ private IAction Invoke(out IAction gcdAction) })) helpDefenseSingle = true; } - gcdAction = GCD(abilityRemain, helpDefenseAOE, helpDefenseSingle); + gcdAction = GCD(nextAbilityToNextGCD, helpDefenseAOE, helpDefenseSingle); if (gcdAction != null) { - if (abilityRemain == 0 || DataCenter.WeaponTotal < DataCenter.CastingTotal) return gcdAction; + if (nextAbilityToNextGCD < 0.6f + DataCenter.Ping || DataCenter.WeaponTotal < DataCenter.CastingTotal) return gcdAction; - if (Ability(abilityRemain, gcdAction, out IAction ability, helpDefenseAOE, helpDefenseSingle)) return ability; + if (Ability(nextAbilityToNextGCD, gcdAction, out IAction ability, helpDefenseAOE, helpDefenseSingle)) return ability; return gcdAction; } else if (gcdAction == null) { - if (Ability(abilityRemain, Addle, out IAction ability, helpDefenseAOE, helpDefenseSingle)) return ability; + if (Ability(nextAbilityToNextGCD, Addle, out IAction ability, helpDefenseAOE, helpDefenseSingle)) return ability; return null; } return gcdAction; diff --git a/RotationSolver.Basic/Rotations/CustomRotation_OtherInfo.cs b/RotationSolver.Basic/Rotations/CustomRotation_OtherInfo.cs index 0f0349e84..985450f29 100644 --- a/RotationSolver.Basic/Rotations/CustomRotation_OtherInfo.cs +++ b/RotationSolver.Basic/Rotations/CustomRotation_OtherInfo.cs @@ -196,14 +196,14 @@ protected static bool IsLastAction(params ActionID[] ids) => IActionHelper.IsLastAction(ids); /// - /// Is the thing still there after gcds and abilities. + /// Is the thing still there after gcds and abilities. /// /// jobgauge time /// - /// + /// /// - protected static bool EndAfterGCD(float remain, uint gcdCount = 0, int abilityCount = 0) - => CooldownHelper.RecastAfterGCD(remain, gcdCount, abilityCount); + protected static bool EndAfterGCD(float remain, uint gcdCount = 0, float offset = 0) + => CooldownHelper.RecastAfterGCD(remain, gcdCount, offset); /// /// Is the thing still there after seconds diff --git a/RotationSolver/Localization/Strings.cs b/RotationSolver/Localization/Strings.cs index d014ee115..82ee23f2d 100644 --- a/RotationSolver/Localization/Strings.cs +++ b/RotationSolver/Localization/Strings.cs @@ -98,7 +98,6 @@ internal partial class Strings public string ConfigWindow_Param_Basic { get; set; } = "Basic"; public string ConfigWindow_Param_ActionAhead { get; set; } = "Set the time advance of using actions"; - public string ConfigWindow_Param_AbilitiesInterval { get; set; } = "Set the interval between 0GCD using"; public string ConfigWindow_Param_CountDownAhead { get; set; } = "Set the time advance of using casting actions on counting down."; public string ConfigWindow_Param_SpecialDuration { get; set; } = "Set the duration of special windows set by commands"; public string ConfigWindow_Param_AddDotGCDCount { get; set; } = "Set GCD advance of DOT refresh"; diff --git a/RotationSolver/UI/NextActionWindow.cs b/RotationSolver/UI/NextActionWindow.cs index 2a8902258..fd453b957 100644 --- a/RotationSolver/UI/NextActionWindow.cs +++ b/RotationSolver/UI/NextActionWindow.cs @@ -33,36 +33,21 @@ public static unsafe void DrawGcdCooldown(float width, bool drawTittle) var cursor = ImGui.GetCursorPos() + ImGui.GetWindowPos(); var height = Service.Config.ControlProgressHeight; - var interval = Service.Config.AbilitiesInterval; ImGui.ProgressBar(group->Elapsed / group->Total, new Vector2(width, height), string.Empty); - foreach (var value in CalculateValue(total, interval)) + var actionRemain = DataCenter.ActionRemain; + if(remain > actionRemain + 0.6f + DataCenter.Ping) { - if (value < DataCenter.CastingTotal) continue; - var pt = cursor + new Vector2(width, 0) * value / total; + var value = (total - remain + actionRemain) / total; - ImGui.GetWindowDrawList().AddLine(pt, pt + new Vector2(0, height), - ImGui.ColorConvertFloat4ToU32(ImGuiColors.DalamudRed)); - } - } - - static float[] CalculateValue(float total, float interval) - { - if(interval <= 0 || total <= 0 || total <= interval) return new float[0]; - - var count = (int)(total / interval); - var result = new List(); - - if(count > 1) - { - for (int i = 1; i < count-1; i++) + if (value > DataCenter.CastingTotal) { - result.Add(i * interval); + var pt = cursor + new Vector2(width, 0) * value / total; + + ImGui.GetWindowDrawList().AddLine(pt, pt + new Vector2(0, height), + ImGui.ColorConvertFloat4ToU32(ImGuiColors.DalamudRed)); } } - - result.Add(total - interval); - return result.ToArray(); } } diff --git a/RotationSolver/UI/RotationConfigWindow_Debug.cs b/RotationSolver/UI/RotationConfigWindow_Debug.cs index 35b8bc970..aff2c0904 100644 --- a/RotationSolver/UI/RotationConfigWindow_Debug.cs +++ b/RotationSolver/UI/RotationConfigWindow_Debug.cs @@ -137,7 +137,7 @@ private void DrawNextAction() ActionUpdater.NextAction?.Display(false); ImGui.Text("Ability Remain: " + DataCenter.AbilityRemain.ToString()); - ImGui.Text("Ability Count: " + DataCenter.AbilityRemainCount.ToString()); + ImGui.Text("Action Remain: " + DataCenter.ActionRemain.ToString()); ImGui.Text("Weapon Remain: " + DataCenter.WeaponRemain.ToString()); ImGui.Text("Elapsed: " + CustomRotation.CombatElapsedLess(10).ToString()); ImGui.Text("Time: " + (DataCenter.CombatTime + DataCenter.WeaponRemain).ToString()); diff --git a/RotationSolver/UI/RotationConfigWindow_Param.cs b/RotationSolver/UI/RotationConfigWindow_Param.cs index 1e9437191..2ad004bd3 100644 --- a/RotationSolver/UI/RotationConfigWindow_Param.cs +++ b/RotationSolver/UI/RotationConfigWindow_Param.cs @@ -42,12 +42,8 @@ private void DrawParamTab() private void DrawParamBasic() { - DrawFloatNumber(LocalizationManager.RightLang.ConfigWindow_Param_AbilitiesInterval, - ref Service.Config.AbilitiesInterval, Service.Default.AbilitiesInterval, - min: 0.5f, max: 0.7f); - DrawFloatNumber(LocalizationManager.RightLang.ConfigWindow_Param_ActionAhead, - ref Service.Config.ActionAhead, Service.Default.ActionAhead, max: 1f); + ref Service.Config.ActionAhead, Service.Default.ActionAhead, max: 0.5f); DrawFloatNumber(LocalizationManager.RightLang.ConfigWindow_Param_CountDownAhead, ref Service.Config.CountDownAhead, Service.Default.CountDownAhead, min: 0.5f, max: 0.7f); diff --git a/RotationSolver/Updaters/ActionUpdater.cs b/RotationSolver/Updaters/ActionUpdater.cs index 5b342c642..3fbcd7230 100644 --- a/RotationSolver/Updaters/ActionUpdater.cs +++ b/RotationSolver/Updaters/ActionUpdater.cs @@ -127,34 +127,34 @@ private static unsafe void UpdateWeaponTime() DataCenter.WeaponRemain = DataCenter.WeaponElapsed == 0 ? player.TotalCastTime - player.CurrentCastTime : Math.Max(weaponTotal - DataCenter.WeaponElapsed, player.TotalCastTime - player.CurrentCastTime); - //确定读条时间。 + //Casting time. if (DataCenter.WeaponElapsed < 0.3) DataCenter.CastingTotal = castTotal; + if (weaponTotal > 0 && DataCenter.WeaponElapsed > 0.2) DataCenter.WeaponTotal = weaponTotal; - //确认能力技的相关信息 - var interval = Service.Config.AbilitiesInterval; - if (DataCenter.WeaponRemain < interval - || DataCenter.WeaponElapsed == 0) - { - DataCenter.AbilityRemain = 0; - if (DataCenter.WeaponRemain > 0) - { - DataCenter.AbilityRemain = DataCenter.WeaponRemain + interval; - } - DataCenter.AbilityRemainCount = 0; - } - else if (DataCenter.WeaponRemain < 2 * interval) - { - DataCenter.AbilityRemain = DataCenter.WeaponRemain - interval; - DataCenter.AbilityRemainCount = 1; - } - else - { - var abilityWhole = (int)(weaponTotal / Service.Config.AbilitiesInterval - 1); - DataCenter.AbilityRemain = interval - DataCenter.WeaponElapsed % interval; - DataCenter.AbilityRemainCount = (byte)(abilityWhole - (int)(DataCenter.WeaponElapsed / interval)); - } + ////确认能力技的相关信息 + //var interval = Service.Config.AbilitiesInterval; + //if (DataCenter.WeaponRemain < interval + // || DataCenter.WeaponElapsed == 0) + //{ + // DataCenter.AbilityRemain = 0; + // if (DataCenter.WeaponRemain > 0) + // { + // DataCenter.AbilityRemain = DataCenter.WeaponRemain + interval; + // } + // DataCenter.AbilityRemainCount = 0; + //} + //else if (DataCenter.WeaponRemain < 2 * interval) + //{ + // DataCenter.AbilityRemain = DataCenter.WeaponRemain - interval; + // DataCenter.AbilityRemainCount = 1; + //} + //else + //{ + // var abilityWhole = (int)(weaponTotal / Service.Config.AbilitiesInterval - 1); + // DataCenter.AbilityRemain = interval - DataCenter.WeaponElapsed % interval; + // DataCenter.AbilityRemainCount = (byte)(abilityWhole - (int)(DataCenter.WeaponElapsed / interval)); + //} - if (weaponTotal > 0 && DataCenter.WeaponElapsed > 0.2) DataCenter.WeaponTotal = weaponTotal; } static uint _lastMP = 0;