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;