Skip to content

Commit

Permalink
Merge pull request #549 from FFXIV-CombatReborn/moreNIN
Browse files Browse the repository at this point in the history
Refactor and update healing, rotation, and utility logic
  • Loading branch information
LTS-FFXIV authored Jan 10, 2025
2 parents ea4dd37 + 77a8baf commit 4ca8666
Show file tree
Hide file tree
Showing 12 changed files with 165 additions and 166 deletions.
27 changes: 6 additions & 21 deletions BasicRotations/Healer/SGE_Default.cs
Original file line number Diff line number Diff line change
Expand Up @@ -339,22 +339,8 @@ protected override bool HealAreaGCD(out IAction? act)
if (PneumaPvE.CanUse(out act)) return true;
}

if (Player.HasStatus(false, StatusID.EukrasianDiagnosis, StatusID.EukrasianPrognosis, StatusID.Galvanize))
if (!DoEukrasia(out _) && PrognosisPvE.CanUse(out act))
{
if (PrognosisPvE.CanUse(out act)) return true;
}

if (EukrasianPrognosisIiPvE.CanUse(out _))
{
if (EukrasiaPvE.CanUse(out act)) return true;
act = EukrasianPrognosisIiPvE;
return true;
}

if (!EukrasianPrognosisIiPvE.EnoughLevel && EukrasianPrognosisPvE.CanUse(out _))
{
if (EukrasiaPvE.CanUse(out act)) return true;
act = EukrasianPrognosisPvE;
return true;
}

Expand All @@ -368,12 +354,9 @@ protected override bool HealSingleGCD(out IAction? act)

if (HasSwift && SwiftLogic && EgeiroPvE.CanUse(out _)) return false;

if (DiagnosisPvE.CanUse(out _) && !EukrasianDiagnosisPvE.CanUse(out _, skipCastingCheck: true) && InCombat)
if (!DoEukrasia(out _) && DiagnosisPvE.CanUse(out act))
{
if (DiagnosisPvE.CanUse(out act))
{
return true;
}
return true;
}
return base.HealSingleGCD(out act);
}
Expand Down Expand Up @@ -411,14 +394,16 @@ protected override bool GeneralGCD(out IAction? act)
#region Extra Methods
public override bool CanHealSingleSpell => base.CanHealSingleSpell && (GCDHeal || PartyMembers.GetJobCategory(JobRole.Healer).Count() < 2);
public override bool CanHealAreaSpell => base.CanHealAreaSpell && (GCDHeal || PartyMembers.GetJobCategory(JobRole.Healer).Count() < 2);

public override void DisplayStatus()
{
ImGui.Text($"Eukrasian Action: {_EukrasiaActionAim}");
ImGui.Text("HasEukrasia: " + HasEukrasia.ToString());
ImGui.Text("Addersgall: " + Addersgall.ToString());
ImGui.Text("Addersting: " + Addersting.ToString());
ImGui.Text("AddersgallTime: " + AddersgallTime.ToString());
ImGui.Text("CanHealAreaSpell: " + CanHealAreaSpell.ToString());
ImGui.Text("CanHealSingleSpell: " + CanHealSingleSpell.ToString());
}
#endregion
}
22 changes: 11 additions & 11 deletions BasicRotations/Melee/NIN_Default.cs
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ private bool ChoiceNinjutsu(out IAction? act)
ClearNinjutsu();
}

if ((!JinPvE.CanUse(out _) && JinPvE.EnoughLevel) || (!ChiPvE.CanUse(out _) && ChiPvE.EnoughLevel) || (!TenPvE.CanUse(out _) && TenPvE.EnoughLevel)) return false;
if ((!JinPvE.Cooldown.HasOneCharge && JinPvE.EnoughLevel) || (!JinPvE.Cooldown.HasOneCharge && TenPvE.EnoughLevel)) return false;
// Ensures that the action ID currently considered for Ninjutsu is actually valid for Ninjutsu execution.
//if (AdjustId(ActionID.NinjutsuPvE) != ActionID.NinjutsuPvE) return false;
// If more than 4.5 seconds have passed since the last action, it clears any pending Ninjutsu to avoid stale actions.
Expand All @@ -99,26 +99,26 @@ private bool ChoiceNinjutsu(out IAction? act)
{
// Attempts to set high-damage AoE Ninjutsu if available under Kassatsu's effect.
// These are prioritized due to Kassatsu's enhancement of Ninjutsu abilities.
if (NumberOfHostilesInRange > 2 && GokaMekkyakuPvE.EnoughLevel && ChiPvE.CanUse(out _) && TenPvE.CanUse(out _))
if (GokaMekkyakuPvE.EnoughLevel && JinPvE.Cooldown.HasOneCharge)
{
SetNinjutsu(GokaMekkyakuPvE);
}
if (NumberOfHostilesInRange == 1 && HyoshoRanryuPvE.EnoughLevel && TenPvE.CanUse(out _) && JinPvE.CanUse(out _))
if (HyoshoRanryuPvE.EnoughLevel && JinPvE.Cooldown.HasOneCharge)
{
SetNinjutsu(HyoshoRanryuPvE);
}

if (HutonPvE.EnoughLevel && TenPvE.CanUse(out _) && ChiPvE.CanUse(out _) && JinPvE.CanUse(out _))
if (!HyoshoRanryuPvE.EnoughLevel && HutonPvE.EnoughLevel && TenPvE.CanUse(out _) && JinPvE.Cooldown.HasOneCharge)
{
SetNinjutsu(HutonPvE);
}

if (KatonPvE.EnoughLevel && ChiPvE.CanUse(out _) && TenPvE.CanUse(out _))
if (!HyoshoRanryuPvE.EnoughLevel && KatonPvE.EnoughLevel && TenPvE.Cooldown.HasOneCharge)
{
SetNinjutsu(KatonPvE);
}

if (RaitonPvE.EnoughLevel && TenPvE.CanUse(out _) && ChiPvE.CanUse(out _))
if (!HyoshoRanryuPvE.EnoughLevel && RaitonPvE.EnoughLevel && TenPvE.Cooldown.HasOneCharge)
{
SetNinjutsu(RaitonPvE);
}
Expand Down Expand Up @@ -147,23 +147,23 @@ private bool ChoiceNinjutsu(out IAction? act)
}

//Single
if (!ShadowWalkerNeeded && TenPvE.CanUse(out _, usedUp: InTrickAttack && !Player.HasStatus(false, StatusID.RaijuReady)))
if (!ShadowWalkerNeeded && TenPvE.CanUse(out _, usedUp: InTrickAttack && !HasRaijuReady))
{
if (RaitonPvE.EnoughLevel && TenPvE.CanUse(out _) && ChiPvE.CanUse(out _))
if (RaitonPvE.EnoughLevel && TenPvE.Cooldown.HasOneCharge)
{
SetNinjutsu(RaitonPvE);
return false;
}

if (!ChiPvE.EnoughLevel && FumaShurikenPvE.EnoughLevel)
if (FumaShurikenPvE.EnoughLevel && TenPvE.Cooldown.HasOneCharge)
{
SetNinjutsu(FumaShurikenPvE);
return false;
}
}

//Vulnerable
if (ShadowWalkerNeeded && (!MeisuiPvE.Cooldown.IsCoolingDown || !TrickAttackPvE.Cooldown.IsCoolingDown || KunaisBanePvE.Cooldown.IsCoolingDown) && !Player.HasStatus(true, StatusID.ShadowWalker) && !Player.HasStatus(true, StatusID.TenChiJin) && SuitonPvE.EnoughLevel && TenPvE.CanUse(out _) && ChiPvE.CanUse(out _) && JinPvE.CanUse(out _))
if (ShadowWalkerNeeded && (!MeisuiPvE.Cooldown.IsCoolingDown || !TrickAttackPvE.Cooldown.IsCoolingDown || KunaisBanePvE.Cooldown.IsCoolingDown) && !IsShadowWalking && !HasTenChiJin && SuitonPvE.EnoughLevel && JinPvE.Cooldown.HasOneCharge)
{
SetNinjutsu(SuitonPvE);
return false;
Expand All @@ -180,7 +180,7 @@ private bool DoNinjutsu(out IAction? act)
act = null;

//TenChiJin
if (Player.HasStatus(true, StatusID.TenChiJin))
if (HasTenChiJin)
{
uint tenId = AdjustId(TenPvE.ID);
uint chiId = AdjustId(ChiPvE.ID);
Expand Down
8 changes: 7 additions & 1 deletion RotationSolver.Basic/DataCenter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -805,7 +805,13 @@ public static bool IsCastingAreaVfx()

public static bool IsCastingVfx(Func<VfxNewData, bool> isVfx)
{
// Create a copy of the VfxDataQueue to avoid modifying the collection while enumerating
// Ensure the list is not empty
if (VfxDataQueue.Count == 0)
{
return false;
}

// Create a copy of the VfxDataQueue to avoid modification during enumeration
var vfxDataQueueCopy = VfxDataQueue.ToList();

foreach (var vfx in vfxDataQueueCopy)
Expand Down
2 changes: 1 addition & 1 deletion RotationSolver.Basic/Helpers/ObjectHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,7 @@ internal static bool IsTopPriorityNamedHostile(this IGameObject obj)
/// </returns>
internal static bool IsTopPriorityHostile(this IGameObject obj)
{
if (obj == null) return false;
if (obj.IsAlliance() || obj.IsParty() || obj == null) return false;

var fateId = DataCenter.FateId;

Expand Down
2 changes: 1 addition & 1 deletion RotationSolver.Basic/Rotations/Basic/DancerRotation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ static partial void ModifyFanDanceIiPvE(ref ActionSetting setting)
setting.StatusProvide = [StatusID.ThreefoldFanDance];
setting.CreateConfig = () => new ActionConfig()
{
AoeCount = 2,
AoeCount = 3,
};
}

Expand Down
2 changes: 1 addition & 1 deletion RotationSolver.Basic/Rotations/Basic/DarkKnightRotation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,7 @@ static partial void ModifyFloodOfShadowPvE(ref ActionSetting setting)
setting.StatusProvide = [StatusID.Darkside];
setting.CreateConfig = () => new ActionConfig()
{
AoeCount = 3,
AoeCount = 2,
};
}

Expand Down
8 changes: 4 additions & 4 deletions RotationSolver.Basic/Rotations/Basic/PaladinRotation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ static partial void ModifyTotalEclipsePvE(ref ActionSetting setting)
{
setting.CreateConfig = () => new ActionConfig()
{
AoeCount = 3,
AoeCount = 2,
};
}

Expand Down Expand Up @@ -195,7 +195,7 @@ static partial void ModifyProminencePvE(ref ActionSetting setting)
setting.UnlockedByQuestID = 66593;
setting.CreateConfig = () => new ActionConfig()
{
AoeCount = 3,
AoeCount = 2,
};
}

Expand All @@ -213,7 +213,7 @@ static partial void ModifyCircleOfScornPvE(ref ActionSetting setting)
setting.TargetStatusProvide = [StatusID.CircleOfScorn];
setting.CreateConfig = () => new ActionConfig()
{
AoeCount = 3,
AoeCount = 1,
TimeToKill = 0,
};
}
Expand Down Expand Up @@ -289,7 +289,7 @@ static partial void ModifyHolyCirclePvE(ref ActionSetting setting)
{
setting.CreateConfig = () => new ActionConfig()
{
AoeCount = 3,
AoeCount = 2,
};
}

Expand Down
2 changes: 1 addition & 1 deletion RotationSolver.Basic/Rotations/Basic/SamuraiRotation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -298,7 +298,7 @@ static partial void ModifyHissatsuGurenPvE(ref ActionSetting setting)
setting.UnlockedByQuestID = 68106;
setting.CreateConfig = () => new ActionConfig()
{
AoeCount = 2,
AoeCount = 3,
};
}

Expand Down
2 changes: 1 addition & 1 deletion RotationSolver.Basic/Rotations/CustomRotation_OtherInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ public static bool IsLongerThan(float time)
/// <summary>
/// Whether or not the player can use ST heal GCDs.
/// </summary>
[Description("Can heal single area")]
[Description("Can heal single spell")]
public virtual bool CanHealSingleSpell => true;

/// <summary>
Expand Down
Loading

0 comments on commit 4ca8666

Please sign in to comment.