Skip to content
This repository has been archived by the owner on Nov 23, 2024. It is now read-only.

Commit

Permalink
Merge pull request #147 from FFXIV-CombatReborn/Blackmages-run-the-cr…
Browse files Browse the repository at this point in the history
…ematory-in-uldah-because-they-can-use-Fire3

Nuget bump, DT BLM and BRD support
  • Loading branch information
LTS-FFXIV authored Jul 28, 2024
2 parents 93dade0 + 4c16578 commit 39b3f60
Show file tree
Hide file tree
Showing 3 changed files with 139 additions and 79 deletions.
178 changes: 111 additions & 67 deletions BasicRotations/Magical/BLM_Default.cs
Original file line number Diff line number Diff line change
@@ -1,45 +1,25 @@
namespace DefaultRotations.Magical;

[Rotation("Default", CombatType.PvE, GameVersion = "7.00")]
[Rotation("Default", CombatType.PvE, GameVersion = "7.01")]
[SourceCode(Path = "main/DefaultRotations/Magical/BLM_Default.cs")]
[Api(1)]
[Api(2)]
public class BLM_Default : BlackMageRotation
{/*
private bool NeedToGoIce
{
get
{
//Can use Despair.
if (DespairPvE.EnoughLevel && CurrentMp >= DespairPvE.Info.MPNeed) return false;
//Can use Fire1
if (FirePvE.EnoughLevel && CurrentMp >= FirePvE.Info.MPNeed) return false;
return true;
}
}
private bool NeedToTransposeGoIce(bool usedOne)
{
if (!NeedToGoIce) return false;
if (!ParadoxPvE.EnoughLevel) return false;
var compare = usedOne ? -1 : 0;
var count = PolyglotStacks;
if (count == compare++) return false;
if (count == compare++ && !EnchinaEndAfterGCD(2)) return false;
if (count >= compare && (HasFire || SwiftcastPvE.Cooldown.WillHaveOneChargeGCD(2) || TriplecastPvE.Cooldown.WillHaveOneChargeGCD(2))) return true;
if (!HasFire && !SwiftcastPvE.Cooldown.WillHaveOneChargeGCD(2) && !TriplecastPvE.CanUse(out _, gcdCountForAbility: 8)) return false;
return true;
}
{
#region Config Options
[RotationConfig(CombatType.PvE, Name = "Use Transpose to Astral Fire before Paradox")]
public bool UseTransposeForParadox { get; set; } = true;

[RotationConfig(CombatType.PvE, Name = "Extend Astral Fire Time Safely")]
[RotationConfig(CombatType.PvE, Name = "Use Retrace when out of Leylines and standing still (Dangerous and Experimental)")]
public bool UseRetrace { get; set; } = false;

[RotationConfig(CombatType.PvE, Name = "Extend Astral Fire time more conservatively (3 GCDs) (Default is 2 GCDs)")]
public bool ExtendTimeSafely { get; set; } = false;

[RotationConfig(CombatType.PvE, Name = @"Use ""Double Paradox"" rotation [N15]")]
public bool UseN15 { get; set; } = false;
#endregion

#region Additional oGCD Logic

protected override IAction? CountDownAction(float remainTime)
{
Expand All @@ -48,36 +28,14 @@ private bool NeedToTransposeGoIce(bool usedOne)
{
if (FireIiiPvE.CanUse(out act)) return act;
}
if (remainTime <= 12 && SharpcastPvE.CanUse(out act, usedUp: true)) return act;
//if (remainTime <= 12 && SharpcastPvE.CanUse(out act, usedUp: true)) return act;
return base.CountDownAction(remainTime);
}

protected override bool AttackAbility(IAction nextGCD, out IAction? act)
{
if (IsBurst && UseBurstMedicine(out act)) return true;
if (InUmbralIce)
{
if (UmbralIceStacks == 2 && !HasFire
&& !IsLastGCD(ActionID.ParadoxPvE))
{
if (SwiftcastPvE.CanUse(out act)) return true;
if (TriplecastPvE.CanUse(out act, usedUp: true)) return true;
}
if (UmbralIceStacks < 3 && LucidDreamingPvE.CanUse(out act)) return true;
if (SharpcastPvE.CanUse(out act, usedUp: true)) return true;
}
if (InAstralFire)
{
if (!CombatElapsedLess(6) && CombatElapsedLess(9) && LeyLinesPvE.CanUse(out act)) return true;
if (TriplecastPvE.CanUse(out act, gcdCountForAbility: 5)) return true;
}
if (AmplifierPvE.CanUse(out act)) return true;
return base.AttackAbility(nextGCD, out act);
}
[RotationDesc]
protected override bool EmergencyAbility(IAction nextGCD, out IAction? act)
{
if (UseRetrace && RetracePvE.CanUse(out act)) return true;
//To Fire
if (CurrentMp >= 7200 && UmbralIceStacks == 2 && ParadoxPvE.EnoughLevel)
{
Expand All @@ -99,17 +57,84 @@ protected override bool EmergencyAbility(IAction nextGCD, out IAction? act)
return base.EmergencyAbility(nextGCD, out act);
}

[RotationDesc(ActionID.AetherialManipulationPvE)]
protected override bool MoveForwardAbility(IAction nextGCD, out IAction? act)
{
if (AetherialManipulationPvE.CanUse(out act)) return true;

return base.MoveForwardAbility(nextGCD, out act);
}

[RotationDesc(ActionID.BetweenTheLinesPvE)]
protected override bool MoveBackAbility(IAction nextGCD, out IAction? act)
{
if (BetweenTheLinesPvE.CanUse(out act)) return true;

return base.MoveBackAbility(nextGCD, out act);
}

[RotationDesc(ActionID.ManawardPvE)]
protected override bool DefenseSingleAbility(IAction nextGCD, out IAction? act)
{
if (ManawardPvE.CanUse(out act)) return true;
return base.DefenseSingleAbility(nextGCD, out act);
}

[RotationDesc(ActionID.ManawardPvE, ActionID.AddlePvE)]
protected sealed override bool DefenseAreaAbility(IAction nextGCD, out IAction? act)
{
if (ManawardPvE.CanUse(out act)) return true;
if (AddlePvE.CanUse(out act)) return true;
return base.DefenseAreaAbility(nextGCD, out act);
}
#endregion

#region oGCD Logic
[RotationDesc(ActionID.ManafontPvE, ActionID.TransposePvE)]
protected override bool GeneralAbility(IAction nextGCD, out IAction? act)
{
if (IsMoving && HasHostilesInRange && TriplecastPvE.CanUse(out act, usedUp: true)) return true;

return base.GeneralAbility(nextGCD, out act);
}

[RotationDesc(ActionID.RetracePvE, ActionID.SwiftcastPvE, ActionID.TriplecastPvE, ActionID.AmplifierPvE)]
protected override bool AttackAbility(IAction nextGCD, out IAction? act)
{
if (IsBurst && UseBurstMedicine(out act)) return true;
if (InUmbralIce)
{
if (UmbralIceStacks == 2 && !HasFire
&& !IsLastGCD(ActionID.ParadoxPvE))
{
if (SwiftcastPvE.CanUse(out act)) return true;
if (TriplecastPvE.CanUse(out act, usedUp: true)) return true;
}

if (UmbralIceStacks < 3 && LucidDreamingPvE.CanUse(out act)) return true;
}

if (InAstralFire)
{
if (TriplecastPvE.CanUse(out act, gcdCountForAbility: 5)) return true;
}

if (AmplifierPvE.CanUse(out act)) return true;
return base.AttackAbility(nextGCD, out act);
}
#endregion

#region GCD Logic
protected override bool GeneralGCD(out IAction? act)
{
if (FlareStarPvE.CanUse(out act)) return true;

if (InFireOrIce(out act, out var mustGo)) return true;
if (mustGo) return false;
//Triplecast for moving.
if (IsMoving && HasHostilesInRange && TriplecastPvE.CanUse(out act, usedUp: true)) return true;

if (AddElementBase(out act)) return true;
if (ScathePvE.CanUse(out act)) return true;
if (MaintainStatus(out act)) return true;
return base.GeneralGCD(out act);
}

Expand Down Expand Up @@ -308,7 +333,7 @@ private bool AddThunder(out IAction? act, uint gcdCount = 3)

//So long for thunder.
if (ThunderPvE.CanUse(out _) && (!ThunderPvE.Target.Target?.WillStatusEndGCD(gcdCount, 0, true,
StatusID.Thunder, StatusID.ThunderIi, StatusID.ThunderIii, StatusID.ThunderIv) ?? false))
StatusID.Thunder, StatusID.ThunderIi, StatusID.ThunderIii, StatusID.ThunderIv, StatusID.HighThunder_3872) ?? false))
return false;

if (ThunderIiPvE.CanUse(out act)) return true;
Expand Down Expand Up @@ -339,7 +364,7 @@ private bool UsePolyglot(out IAction? act, uint gcdCount = 3)
{
act = null;

if (gcdCount == 0 || IsPolyglotStacksMaxed && EnchinaEndAfterGCD(gcdCount))
if (gcdCount == 0 || IsPolyglotStacksMaxed && EnochianEndAfterGCD(gcdCount))
{
if (FoulPvE.CanUse(out act)) return true;
if (XenoglossyPvE.CanUse(out act)) return true;
Expand All @@ -360,12 +385,31 @@ private bool MaintainStatus(out IAction? act)
return false;
}

[RotationDesc(ActionID.BetweenTheLinesPvE, ActionID.LeyLinesPvE)]
protected override bool HealSingleAbility(IAction nextGCD, out IAction? act)
private bool NeedToGoIce
{
if (BetweenTheLinesPvE.CanUse(out act)) return true;
if (LeyLinesPvE.CanUse(out act)) return true;
get
{
//Can use Despair.
if (DespairPvE.EnoughLevel && CurrentMp >= DespairPvE.Info.MPNeed) return false;

//Can use Fire1
if (FirePvE.EnoughLevel && CurrentMp >= FirePvE.Info.MPNeed) return false;

return true;
}
}

return base.HealSingleAbility(nextGCD, out act);
private bool NeedToTransposeGoIce(bool usedOne)
{
if (!NeedToGoIce) return false;
if (!ParadoxPvE.EnoughLevel) return false;
var compare = usedOne ? -1 : 0;
var count = PolyglotStacks;
if (count == compare++) return false;
if (count == compare++ && !EnochianEndAfterGCD(2)) return false;
if (count >= compare && (HasFire || SwiftcastPvE.Cooldown.WillHaveOneChargeGCD(2) || TriplecastPvE.Cooldown.WillHaveOneChargeGCD(2))) return true;
if (!HasFire && !SwiftcastPvE.Cooldown.WillHaveOneChargeGCD(2) && !TriplecastPvE.CanUse(out _, gcdCountForAbility: 8)) return false;
return true;
}
*/}
#endregion
}
38 changes: 27 additions & 11 deletions BasicRotations/Ranged/BRD_Default.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace DefaultRotations.Ranged;

[Rotation("Default", CombatType.PvE, GameVersion = "7.00",
[Rotation("Default", CombatType.PvE, GameVersion = "7.01",
Description = "Please make sure that the three song times add up to 120 seconds, Wanderers default first song for now.")]
[SourceCode(Path = "main/DefaultRotations/Ranged/BRD_Default.cs")]
[Api(2)]
Expand Down Expand Up @@ -52,7 +52,7 @@ protected override bool EmergencyAbility(IAction nextGCD, out IAction? act)
protected override bool AttackAbility(IAction nextGCD, out IAction? act)
{
act = null;
if (Song == Song.NONE)
if (Song == Song.NONE && InCombat)
{
switch (FirstSong)
{
Expand Down Expand Up @@ -81,29 +81,35 @@ protected override bool AttackAbility(IAction nextGCD, out IAction? act)
if (!BindWANDEnough) return true;
}



if (RadiantFinalePvE.CanUse(out act, skipAoeCheck: true))


{
if (Player.HasStatus(true, StatusID.RagingStrikes) && RagingStrikesPvE.Cooldown.ElapsedOneChargeAfterGCD(1)) return true;
}

if (BattleVoicePvE.CanUse(out act, skipAoeCheck: true))
{
if (IsLastAction(true, RadiantFinalePvE)) return true;
if (nextGCD.IsTheSameTo(true, RadiantFinalePvE)) return true;

if (nextGCD.IsTheSameTo(true, RadiantEncorePvE)) return true;

if (Player.HasStatus(true, StatusID.RagingStrikes) && RagingStrikesPvE.Cooldown.ElapsedOneChargeAfterGCD(1)) return true;
}
}

if (RadiantFinalePvE.EnoughLevel && RadiantFinalePvE.Cooldown.IsCoolingDown && BattleVoicePvE.EnoughLevel && !BattleVoicePvE.Cooldown.IsCoolingDown) return false;

if (TheWanderersMinuetPvE.CanUse(out act))
if (TheWanderersMinuetPvE.CanUse(out act) && InCombat)
{
if (SongEndAfter(ARMYRemainTime) && (Song != Song.NONE || Player.HasStatus(true, StatusID.ArmysEthos))) return true;
}

if (Song != Song.NONE && EmpyrealArrowPvE.CanUse(out act)) return true;

if (PitchPerfectPvE.CanUse(out act))
if (PitchPerfectPvE.CanUse(out act, skipCastingCheck: true, skipAoeCheck: true, skipComboCheck: true))
{
if (SongEndAfter(3) && Repertoire > 0) return true;

Expand All @@ -112,13 +118,13 @@ protected override bool AttackAbility(IAction nextGCD, out IAction? act)
if (Repertoire == 2 && EmpyrealArrowPvE.Cooldown.WillHaveOneChargeGCD()) return true;
}

if (MagesBalladPvE.CanUse(out act))
if (MagesBalladPvE.CanUse(out act) && InCombat)
{
if (Song == Song.WANDERER && SongEndAfter(WANDRemainTime) && Repertoire == 0) return true;
if (Song == Song.ARMY && SongEndAfterGCD(2) && TheWanderersMinuetPvE.Cooldown.IsCoolingDown) return true;
}

if (ArmysPaeonPvE.CanUse(out act))
if (ArmysPaeonPvE.CanUse(out act) && InCombat)
{
if (TheWanderersMinuetPvE.EnoughLevel && SongEndAfter(MAGERemainTime) && Song == Song.MAGE) return true;
if (TheWanderersMinuetPvE.EnoughLevel && SongEndAfter(2) && MagesBalladPvE.Cooldown.IsCoolingDown && Song == Song.WANDERER) return true;
Expand Down Expand Up @@ -149,21 +155,25 @@ protected override bool GeneralGCD(out IAction? act)
if (Player.HasStatus(true, StatusID.RagingStrikes) && Player.WillStatusEndGCD(1, 0, true, StatusID.RagingStrikes)) return true;
}

if (CanUseApexArrow(out act)) return true;
if (ResonantArrowPvE.CanUse(out act, skipAoeCheck: true) && Player.HasStatus(true, StatusID.ResonantArrowReady)) return true;

if (CanUseApexArrow(out act)) return true;
if (RadiantEncorePvE.CanUse(out act, skipComboCheck: true) && Player.HasStatus(true, StatusID.RadiantEncoreReady)) return true;
if (BlastArrowPvE.CanUse(out act, skipAoeCheck: true))
{
if (!Player.HasStatus(true, StatusID.RagingStrikes)) return true;
if (Player.HasStatus(true, StatusID.RagingStrikes) && BarragePvE.Cooldown.IsCoolingDown) return true;
}

if (ShadowbitePvE.CanUse(out act)) return true;
//aoe
if (ShadowbitePvE.CanUse(out act) && Player.HasStatus(true, StatusID.HawksEye, StatusID.HawksEye_3861, StatusID.Barrage)) return true;
if (WideVolleyPvE.CanUse(out act) && Player.HasStatus(true, StatusID.HawksEye, StatusID.HawksEye_3861, StatusID.Barrage)) return true;
if (QuickNockPvE.CanUse(out act)) return true;

if (WindbitePvE.CanUse(out act)) return true;
if (VenomousBitePvE.CanUse(out act)) return true;

if (StraightShotPvE.CanUse(out act)) return true;
if (RefulgentArrowPvE.CanUse(out act, skipComboCheck: true) && Player.HasStatus(true, StatusID.HawksEye, StatusID.HawksEye_3861, StatusID.Barrage)) return true;
if (StraightShotPvE.CanUse(out act) && Player.HasStatus(true, StatusID.HawksEye, StatusID.HawksEye_3861, StatusID.Barrage)) return true;
if (HeavyShotPvE.CanUse(out act)) return true;

return base.GeneralGCD(out act);
Expand Down Expand Up @@ -202,6 +212,12 @@ private bool BloodletterLogic(out IAction? act)
bool isEmpyrealLevel = !EmpyrealArrowPvE.EnoughLevel;
bool isRepertoire = Repertoire != 3;

if (HeartbreakShotPvE.CanUse(out act, usedUp: true))
{
if (isBattleVoice || isRadiantFinale || (isRagingSoon && (isBloodTrait || isNoBloodTrait))) return false;
if (isEmpyrealArrowCD || isEmpyrealSoon || isEmpyrealLevel || isRepertoire) return true;
}

if (RainOfDeathPvE.CanUse(out act, usedUp: true))
{
if (isEmpyrealArrowCD || isEmpyrealSoon || isEmpyrealLevel || isRepertoire) return true;
Expand Down
2 changes: 1 addition & 1 deletion BasicRotations/RebornRotations.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
<None Remove="Duty\PVPRotations\**" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="RotationSolverReborn.Basic" Version="7.0.1.32" />
<PackageReference Include="RotationSolverReborn.Basic" Version="7.0.1.35" />
</ItemGroup>
<ItemGroup>
<Reference Include="Dalamud">
Expand Down

0 comments on commit 39b3f60

Please sign in to comment.