Skip to content

Commit

Permalink
Merge pull request #500 from FFXIV-CombatReborn/blackmagepvp
Browse files Browse the repository at this point in the history
Complete rework of BLM PVP
  • Loading branch information
LTS-FFXIV authored Dec 31, 2024
2 parents 706ffaf + cc1ca65 commit 3eba4a4
Show file tree
Hide file tree
Showing 2 changed files with 208 additions and 16 deletions.
36 changes: 32 additions & 4 deletions BasicRotations/PVPRotations/Magical/BLM_Default.PVP.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace DefaultRotations.Magical;

[Rotation("Default PVP", CombatType.PvP, GameVersion = "7.00", Description = "Beta Rotation")]
[Rotation("Default PVP", CombatType.PvP, GameVersion = "7.15", Description = "Beta Rotation")]
[SourceCode(Path = "main/BasicRotations/PVPRotations/Magical/BLM_Default.PVP.cs")]
[Api(4)]
public class BLM_DefaultPVP : BlackMageRotation
Expand Down Expand Up @@ -42,6 +42,8 @@ public class BLM_DefaultPVP : BlackMageRotation
[RotationConfig(CombatType.PvP, Name = "Stop attacking while in Guard.")]
public bool GuardCancel { get; set; } = false;

protected static bool HalfHeathXeno => Player.CurrentHp >= 27000;

private bool TryPurify(out IAction? action)
{
action = null;
Expand Down Expand Up @@ -79,11 +81,26 @@ protected override bool EmergencyAbility(IAction nextGCD, out IAction? act)
return base.EmergencyAbility(nextGCD, out act);
}

protected override bool MoveForwardAbility(IAction nextGCD, out IAction? act)
{
act = null;
if (GuardCancel && Player.HasStatus(true, StatusID.Guard)) return false;

if (AetherialManipulationPvP.CanUse(out act)) return true;

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

protected override bool AttackAbility(IAction nextGCD, out IAction? act)
{
act = null;
if (GuardCancel && Player.HasStatus(true, StatusID.Guard)) return false;

if (XenoglossyPvP.CanUse(out act)) return true;
if (LethargyPvP.CanUse(out act)) return true;
if (WreathOfFirePvP.CanUse(out act)) return true;
if (WreathOfIcePvP.CanUse(out act)) return true;

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

Expand All @@ -92,8 +109,6 @@ protected override bool GeneralAbility(IAction nextGCD, out IAction? act)
act = null;
if (GuardCancel && Player.HasStatus(true, StatusID.Guard)) return false;

if (AetherialManipulationPvP.CanUse(out act)) return true;

return base.GeneralAbility(nextGCD, out act);
}
protected override bool GeneralGCD(out IAction? act)
Expand All @@ -104,11 +119,24 @@ protected override bool GeneralGCD(out IAction? act)
if (GuardCancel && Player.HasStatus(true, StatusID.Guard)) return false;
if (!Player.HasStatus(true, StatusID.Guard) && UseSprintPvP && !Player.HasStatus(true, StatusID.Sprint) && !InCombat && SprintPvP.CanUse(out act)) return true;

if (BurstPvP.CanUse(out act)) return true;
if (XenoglossyPvP.CanUse(out act, usedUp: !HalfHeathXeno)) return true;

if (ParadoxPvP.CanUse(out act)) return true;

if (BurstPvP.CanUse(out act)) return true;

if (FlareStarPvP.CanUse(out act)) return true;
if (FlarePvP.CanUse(out act)) return true;
if (HighFireIiPvP.CanUse(out act)) return true;
if (FireIvPvP.CanUse(out act)) return true;
if (FireIiiPvP.CanUse(out act)) return true;
if (FirePvP.CanUse(out act)) return true;

if (FrostStarPvP.CanUse(out act)) return true;
if (FreezePvP.CanUse(out act)) return true;
if (HighBlizzardIiPvP.CanUse(out act)) return true;
if (BlizzardIvPvP.CanUse(out act)) return true;
if (BlizzardIiiPvP.CanUse(out act)) return true;
if (BlizzardPvP.CanUse(out act)) return true;

return base.GeneralGCD(out act);
Expand Down
188 changes: 176 additions & 12 deletions RotationSolver.Basic/Rotations/Basic/BlackMageRotation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -101,19 +101,23 @@ protected static bool EnochianEndAfterGCD(uint gcdCount = 0, float offset = 0)
/// <returns></returns>
protected static bool ElementTimeEndAfterGCD(uint gctCount = 0, float offset = 0)
=> ElementTimeEndAfter(GCDTime(gctCount, offset));
#endregion


/// <summary>
///
/// </summary>
protected static bool HasFire => Player.HasStatus(true, StatusID.Firestarter);
protected static float Fire4Time { get; private set; }

/// <summary>
///
/// </summary>
protected static bool HasThunder => Player.HasStatus(true, StatusID.Thunderhead);

protected override void UpdateInfo()
{
if (Player.CastActionId == (uint)ActionID.FireIvPvE && Player.CurrentCastTime < 0.2)
{
Fire4Time = Player.TotalCastTime;
}
base.UpdateInfo();
}

/// <summary>
/// A check with variable max stacks of Polyglot based on the trait level.
Expand All @@ -136,7 +140,31 @@ public static bool IsPolyglotStacksMaxed
}
}
}
#endregion

#region Status Tracking
/// <summary>
///
/// </summary>
protected static bool HasPvPAstralFire => Player.HasStatus(true, StatusID.AstralFire_3212, StatusID.AstralFireIi_3213, StatusID.AstralFireIii_3381);

/// <summary>
///
/// </summary>
protected static bool HasPvPUmbralIce => Player.HasStatus(true, StatusID.UmbralIce_3214, StatusID.UmbralIceIi_3215, StatusID.UmbralIceIii_3382);

/// <summary>
///
/// </summary>
protected static bool HasFire => Player.HasStatus(true, StatusID.Firestarter);

/// <summary>
///
/// </summary>
protected static bool HasThunder => Player.HasStatus(true, StatusID.Thunderhead);
#endregion

#region Debug
/// <inheritdoc/>
public override void DisplayStatus()
{
Expand All @@ -155,7 +183,12 @@ public override void DisplayStatus()
ImGui.Text("IsEnochianActive: " + IsEnochianActive.ToString());
ImGui.Text("EnochianTimeRaw: " + EnochianTimeRaw.ToString());
ImGui.Text("EnochianTime: " + EnochianTime.ToString());
ImGui.Text("HasPvPAstralFire: " + HasPvPAstralFire.ToString());
ImGui.Text("HasPvPUmbralIce: " + HasPvPUmbralIce.ToString());
}
#endregion

#region PvE Actions

static partial void ModifyBlizzardPvE(ref ActionSetting setting)
{
Expand Down Expand Up @@ -399,27 +432,158 @@ static partial void ModifyFlareStarPvE(ref ActionSetting setting)
AoeCount = 1,
};
}
#endregion

#region PvP Actions Unassignable
/// <summary>
///
/// </summary>
protected static float Fire4Time { get; private set; }
public static bool WreathOfFireReady => Service.GetAdjustedActionId(ActionID.ElementalWeavePvP) == ActionID.WreathOfFirePvP;

/// <summary>
///
/// </summary>
protected override void UpdateInfo()
public static bool WreathOfIceReady => Service.GetAdjustedActionId(ActionID.ElementalWeavePvP) == ActionID.WreathOfIcePvP;
#endregion

#region PvP Actions
static partial void ModifyFirePvP(ref ActionSetting setting)
{
if (Player.CastActionId == (uint)ActionID.FireIvPvE && Player.CurrentCastTime < 0.2)
setting.StatusProvide = [StatusID.Paradox, StatusID.AstralFire_3212];
}

static partial void ModifyBlizzardPvP(ref ActionSetting setting)
{
setting.StatusProvide = [StatusID.Paradox, StatusID.UmbralIce_3214];
}

static partial void ModifyBurstPvP(ref ActionSetting setting)
{
setting.CreateConfig = () => new ActionConfig()
{
Fire4Time = Player.TotalCastTime;
}
base.UpdateInfo();
AoeCount = 1,
};
}

static partial void ModifyParadoxPvP(ref ActionSetting setting)
{
setting.StatusNeed = [StatusID.Paradox];
}

static partial void ModifyXenoglossyPvP(ref ActionSetting setting)
{

}

static partial void ModifyLethargyPvP(ref ActionSetting setting)
{
setting.TargetStatusProvide = [StatusID.Lethargy_4333, StatusID.Heavy_1344];
}

// PvP
static partial void ModifyAetherialManipulationPvP(ref ActionSetting setting)
{
setting.SpecialType = SpecialActionType.MovingForward;
}

static partial void ModifyElementalWeavePvP(ref ActionSetting setting)
{
setting.CreateConfig = () => new ActionConfig()
{
AoeCount = 1,
};
}

static partial void ModifyFireIiiPvP(ref ActionSetting setting)
{
setting.StatusNeed = [StatusID.AstralFire_3212];
setting.StatusProvide = [StatusID.AstralFireIi_3213];
}

static partial void ModifyFireIvPvP(ref ActionSetting setting)
{
setting.StatusNeed = [StatusID.AstralFireIi_3213];
setting.StatusProvide = [StatusID.AstralFireIii_3381];
}

static partial void ModifyHighFireIiPvP(ref ActionSetting setting)
{
setting.StatusNeed = [StatusID.AstralFireIii_3381];
setting.StatusProvide = [StatusID.AstralFire_3212];
setting.CreateConfig = () => new ActionConfig()
{
AoeCount = 1,
};
}

static partial void ModifyFlarePvP(ref ActionSetting setting)
{
setting.StatusNeed = [StatusID.SoulResonance];
setting.CreateConfig = () => new ActionConfig()
{
AoeCount = 1,
};
}

static partial void ModifyBlizzardIiiPvP(ref ActionSetting setting)
{
setting.StatusNeed = [StatusID.UmbralIce_3214];
setting.StatusProvide = [StatusID.UmbralIceIi_3215];
}

static partial void ModifyBlizzardIvPvP(ref ActionSetting setting)
{
setting.StatusNeed = [StatusID.UmbralIceIi_3215];
setting.StatusProvide = [StatusID.UmbralIceIii_3382];
}

static partial void ModifyHighBlizzardIiPvP(ref ActionSetting setting)
{
setting.StatusNeed = [StatusID.UmbralIceIii_3382];
setting.StatusProvide = [StatusID.UmbralIce_3214];
setting.CreateConfig = () => new ActionConfig()
{
AoeCount = 1,
};
}

static partial void ModifyFreezePvP(ref ActionSetting setting)
{
setting.StatusNeed = [StatusID.SoulResonance];
setting.CreateConfig = () => new ActionConfig()
{
AoeCount = 1,
};
}

static partial void ModifyWreathOfFirePvP(ref ActionSetting setting)
{
setting.ActionCheck = () => WreathOfFireReady;
}

static partial void ModifyWreathOfIcePvP(ref ActionSetting setting)
{
setting.ActionCheck = () => WreathOfIceReady;
}

static partial void ModifyFlareStarPvP(ref ActionSetting setting)
{
setting.StatusNeed = [StatusID.ElementalStar];
setting.ActionCheck = () => HasPvPAstralFire;
setting.CreateConfig = () => new ActionConfig()
{
AoeCount = 1,
};
}

static partial void ModifyFrostStarPvP(ref ActionSetting setting)
{
setting.StatusNeed = [StatusID.ElementalStar];
setting.ActionCheck = () => HasPvPUmbralIce;
setting.CreateConfig = () => new ActionConfig()
{
AoeCount = 1,
};
}

#endregion
}

0 comments on commit 3eba4a4

Please sign in to comment.