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 #79 from FFXIV-CombatReborn/IcWaDev
Browse files Browse the repository at this point in the history
Updated default MCH for PVP still some issues around turret for now however
  • Loading branch information
IncognitoWater authored Jul 14, 2024
2 parents 216a798 + 44968fd commit 5e36f2d
Showing 1 changed file with 132 additions and 131 deletions.
263 changes: 132 additions & 131 deletions BasicRotations/PVPRotations/Ranged/MCH_Default.PvP.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,136 +2,137 @@ namespace DefaultRotations.Ranged;

[Rotation("Default PVP", CombatType.PvP, GameVersion = "7.00", Description = "Beta Rotation")]
[SourceCode(Path = "main/DefaultRotations/PVPRotations/Ranged/MCH_Default.PvP.cs")]
[Api(1)]
[Api(2)]
public sealed class MCH_DefaultPvP : MachinistRotation
{
[RotationConfig(CombatType.PvP, Name = "Sprint")]
public bool UseSprintPvP { get; set; } = false;

[RotationConfig(CombatType.PvP, Name = "Recuperate")]
public bool UseRecuperatePvP { get; set; } = false;

[Range(1, 100, ConfigUnitType.Percent, 1)]
[RotationConfig(CombatType.PvP, Name = "RecuperateHP%%?")]
public int RCValue { get; set; } = 75;

[RotationConfig(CombatType.PvP, Name = "Use Purify")]
public bool UsePurifyPvP { get; set; } = false;

[RotationConfig(CombatType.PvP, Name = "Use Purify on Stun")]
public bool Use1343PvP { get; set; } = false;

[RotationConfig(CombatType.PvP, Name = "Use Purify on DeepFreeze")]
public bool Use3219PvP { get; set; } = false;

[RotationConfig(CombatType.PvP, Name = "Use Purify on HalfAsleep")]
public bool Use3022PvP { get; set; } = false;

[RotationConfig(CombatType.PvP, Name = "Use Purify on Sleep")]
public bool Use1348PvP { get; set; } = false;

[RotationConfig(CombatType.PvP, Name = "Use Purify on Bind")]
public bool Use1345PvP { get; set; } = false;

[RotationConfig(CombatType.PvP, Name = "Use Purify on Heavy")]
public bool Use1344PvP { get; set; } = false;

[RotationConfig(CombatType.PvP, Name = "Use Purify on Silence")]
public bool Use1347PvP { get; set; } = false;

[RotationConfig(CombatType.PvP, Name = "Stop attacking while in Guard.")]
public bool GuardCancel { get; set; } = false;

private bool TryPurify(out IAction? action)
{
action = null;
if (!UsePurifyPvP) return false;

var purifyStatuses = new Dictionary<int, bool>
{
{ 1343, Use1343PvP },
{ 3219, Use3219PvP },
{ 3022, Use3022PvP },
{ 1348, Use1348PvP },
{ 1345, Use1345PvP },
{ 1344, Use1344PvP },
{ 1347, Use1347PvP }
};

foreach (var status in purifyStatuses)
{
if (status.Value && Player.HasStatus(true, (StatusID)status.Key))
{
return PurifyPvP.CanUse(out action);
}
}

return false;
}

protected override bool EmergencyAbility(IAction nextGCD, out IAction? act)
{
act = null;
if (GuardCancel && Player.HasStatus(true, StatusID.Guard)) return false;
if (TryPurify(out act)) return true;
if (UseRecuperatePvP && Player.CurrentHp / Player.MaxHp * 100 < RCValue && RecuperatePvP.CanUse(out act)) return true;

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

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

if (BishopAutoturretPvP.CanUse(out act, skipAoeCheck: true)) return true;
// Use WildfirePvP if Overheated
if (Player.HasStatus(true, StatusID.Overheated_3149) && WildfirePvP.CanUse(out act, skipAoeCheck: true, skipComboCheck: true)) return true;

// Check if BioblasterPvP, AirAnchorPvP, or ChainSawPvP can be used
if (InCombat && !Player.HasStatus(true, StatusID.Analysis) &&
(BioblasterPvP.CanUse(out act) && HostileTarget.DistanceToPlayer() <= 12 || AirAnchorPvP.CanUse(out act) || ChainSawPvP.CanUse(out act)) &&
AnalysisPvP.CanUse(out act, usedUp: true)) return true;

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

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

if (!Player.HasStatus(true, StatusID.Overheated_3149) && ScattergunPvP.CanUse(out act, skipAoeCheck: true) && HostileTarget.DistanceToPlayer() <= 10) return true;

if (Player.HasStatus(true, StatusID.Analysis))
{
if (Player.HasStatus(true, StatusID.AirAnchorPrimed) && !Player.HasStatus(true, StatusID.BioblasterPrimed, StatusID.ChainSawPrimed, StatusID.DrillPrimed, StatusID.Overheated_3149) && AirAnchorPvP.CanUse(out act, usedUp: true)) return true;
if (Player.HasStatus(true, StatusID.BioblasterPrimed) && !Player.HasStatus(true, StatusID.AirAnchorPrimed, StatusID.ChainSawPrimed, StatusID.DrillPrimed, StatusID.Overheated_3149) && BioblasterPvP.CanUse(out act, skipAoeCheck: true, usedUp: true)) return true;
if (Player.HasStatus(true, StatusID.ChainSawPrimed) && !Player.HasStatus(true, StatusID.BioblasterPrimed, StatusID.BioblasterPrimed, StatusID.DrillPrimed, StatusID.Overheated_3149) && ChainSawPvP.CanUse(out act, skipAoeCheck: true)) return true;
if (Player.HasStatus(true, StatusID.DrillPrimed) && !Player.HasStatus(true, StatusID.BioblasterPrimed, StatusID.ChainSawPrimed, StatusID.AirAnchorPrimed, StatusID.Overheated_3149) && DrillPvP.CanUse(out act, usedUp: true)) return true;
}

if (AirAnchorPvP.Cooldown.CurrentCharges == 2 && Player.HasStatus(true, StatusID.AirAnchorPrimed) && !Player.HasStatus(true, StatusID.BioblasterPrimed, StatusID.ChainSawPrimed, StatusID.DrillPrimed, StatusID.Overheated_3149) && AirAnchorPvP.CanUse(out act)) return true;
if (BioblasterPvP.Cooldown.CurrentCharges == 2 && Player.HasStatus(true, StatusID.BioblasterPrimed) && !Player.HasStatus(true, StatusID.AirAnchorPrimed, StatusID.ChainSawPrimed, StatusID.DrillPrimed, StatusID.Overheated_3149) && BioblasterPvP.CanUse(out act, skipAoeCheck: true)) return true;
if (ChainSawPvP.Cooldown.CurrentCharges == 2 && Player.HasStatus(true, StatusID.ChainSawPrimed) && !Player.HasStatus(true, StatusID.BioblasterPrimed, StatusID.BioblasterPrimed, StatusID.DrillPrimed, StatusID.Overheated_3149) && ChainSawPvP.CanUse(out act, skipAoeCheck: true)) return true;
if (DrillPvP.Cooldown.CurrentCharges == 2 && Player.HasStatus(true, StatusID.DrillPrimed) && !Player.HasStatus(true, StatusID.BioblasterPrimed, StatusID.ChainSawPrimed, StatusID.AirAnchorPrimed, StatusID.Overheated_3149) && DrillPvP.CanUse(out act)) return true;

if (Player.HasStatus(true, StatusID.Overheated_3149))
{
act = null;

{
if (WildfirePvP.CanUse(out act)) return true;
}
if (WildfirePvP.IsInCooldown)
{
if (BlastChargePvP.CanUse(out act, skipCastingCheck: true)) return true;
}
return false;
}

if (BlastChargePvP.CanUse(out act, skipCastingCheck: true)) return true;

return base.GeneralGCD(out act);
}
}
[RotationConfig(CombatType.PvP, Name = "Sprint")]
public bool UseSprintPvP { get; set; } = false;

[RotationConfig(CombatType.PvP, Name = "Recuperate")]
public bool UseRecuperatePvP { get; set; } = false;

[Range(1, 100, ConfigUnitType.Percent, 1)]
[RotationConfig(CombatType.PvP, Name = "RecuperateHP%%?")]
public int RCValue { get; set; } = 75;

[RotationConfig(CombatType.PvP, Name = "Use Purify")]
public bool UsePurifyPvP { get; set; } = false;

[RotationConfig(CombatType.PvP, Name = "Use Purify on Stun")]
public bool Use1343PvP { get; set; } = false;

[RotationConfig(CombatType.PvP, Name = "Use Purify on DeepFreeze")]
public bool Use3219PvP { get; set; } = false;

[RotationConfig(CombatType.PvP, Name = "Use Purify on HalfAsleep")]
public bool Use3022PvP { get; set; } = false;

[RotationConfig(CombatType.PvP, Name = "Use Purify on Sleep")]
public bool Use1348PvP { get; set; } = false;

[RotationConfig(CombatType.PvP, Name = "Use Purify on Bind")]
public bool Use1345PvP { get; set; } = false;

[RotationConfig(CombatType.PvP, Name = "Use Purify on Heavy")]
public bool Use1344PvP { get; set; } = false;

[RotationConfig(CombatType.PvP, Name = "Use Purify on Silence")]
public bool Use1347PvP { get; set; } = false;

[RotationConfig(CombatType.PvP, Name = "Stop attacking while in Guard.")]
public bool GuardCancel { get; set; } = false;


private bool TryPurify(out IAction? action)
{
action = null;
if (!UsePurifyPvP) return false;

var purifyStatuses = new Dictionary<int, bool>
{
{ 1343, Use1343PvP },
{ 3219, Use3219PvP },
{ 3022, Use3022PvP },
{ 1348, Use1348PvP },
{ 1345, Use1345PvP },
{ 1344, Use1344PvP },
{ 1347, Use1347PvP }
};

foreach (var status in purifyStatuses)
{
if (status.Value && Player.HasStatus(true, (StatusID)status.Key))
{
return PurifyPvP.CanUse(out action);
}
}

return false;
}

protected override bool EmergencyAbility(IAction nextGCD, out IAction? act)
{
act = null;
if (GuardCancel && Player.HasStatus(true, StatusID.Guard)) return false;
if (TryPurify(out act)) return true;
if (UseRecuperatePvP && Player.CurrentHp / Player.MaxHp * 100 < RCValue && RecuperatePvP.CanUse(out act)) return true;

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

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

if (BishopAutoturretPvP.CanUse(out act, true, true, true, true, true)) return true;
// Use WildfirePvP if Overheated
if (Player.HasStatus(true, StatusID.Overheated_3149) && WildfirePvP.CanUse(out act, skipAoeCheck: true, skipComboCheck: true)) return true;

// Check if BioblasterPvP, AirAnchorPvP, or ChainSawPvP can be used
if (InCombat && !Player.HasStatus(true, StatusID.Analysis) &&
(BioblasterPvP.CanUse(out act) && HostileTarget.DistanceToPlayer() <= 12 || AirAnchorPvP.CanUse(out act) || ChainSawPvP.CanUse(out act)) &&
AnalysisPvP.CanUse(out act, usedUp: true)) return true;

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

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

if (!Player.HasStatus(true, StatusID.Overheated_3149) && ScattergunPvP.CanUse(out act, skipAoeCheck: true) && HostileTarget.DistanceToPlayer() <= 10) return true;

if (Player.HasStatus(true, StatusID.Analysis))
{
if (Player.HasStatus(true, StatusID.AirAnchorPrimed) && !Player.HasStatus(true, StatusID.BioblasterPrimed, StatusID.ChainSawPrimed, StatusID.DrillPrimed, StatusID.Overheated_3149) && AirAnchorPvP.CanUse(out act, usedUp: true)) return true;
if (Player.HasStatus(true, StatusID.BioblasterPrimed) && !Player.HasStatus(true, StatusID.AirAnchorPrimed, StatusID.ChainSawPrimed, StatusID.DrillPrimed, StatusID.Overheated_3149) && BioblasterPvP.CanUse(out act, skipAoeCheck: true, usedUp: true)) return true;
if (Player.HasStatus(true, StatusID.ChainSawPrimed) && !Player.HasStatus(true, StatusID.BioblasterPrimed, StatusID.BioblasterPrimed, StatusID.DrillPrimed, StatusID.Overheated_3149) && ChainSawPvP.CanUse(out act, skipAoeCheck: true)) return true;
if (Player.HasStatus(true, StatusID.DrillPrimed) && !Player.HasStatus(true, StatusID.BioblasterPrimed, StatusID.ChainSawPrimed, StatusID.AirAnchorPrimed, StatusID.Overheated_3149) && DrillPvP.CanUse(out act, usedUp: true)) return true;
}

if (AirAnchorPvP.Cooldown.CurrentCharges == 2 && Player.HasStatus(true, StatusID.AirAnchorPrimed) && !Player.HasStatus(true, StatusID.BioblasterPrimed, StatusID.ChainSawPrimed, StatusID.DrillPrimed, StatusID.Overheated_3149) && AirAnchorPvP.CanUse(out act)) return true;
if (BioblasterPvP.Cooldown.CurrentCharges == 2 && Player.HasStatus(true, StatusID.BioblasterPrimed) && !Player.HasStatus(true, StatusID.AirAnchorPrimed, StatusID.ChainSawPrimed, StatusID.DrillPrimed, StatusID.Overheated_3149) && BioblasterPvP.CanUse(out act, skipAoeCheck: true)) return true;
if (ChainSawPvP.Cooldown.CurrentCharges == 2 && Player.HasStatus(true, StatusID.ChainSawPrimed) && !Player.HasStatus(true, StatusID.BioblasterPrimed, StatusID.BioblasterPrimed, StatusID.DrillPrimed, StatusID.Overheated_3149) && ChainSawPvP.CanUse(out act, skipAoeCheck: true)) return true;
if (DrillPvP.Cooldown.CurrentCharges == 2 && Player.HasStatus(true, StatusID.DrillPrimed) && !Player.HasStatus(true, StatusID.BioblasterPrimed, StatusID.ChainSawPrimed, StatusID.AirAnchorPrimed, StatusID.Overheated_3149) && DrillPvP.CanUse(out act)) return true;

if (Player.HasStatus(true, StatusID.Overheated_3149))
{
act = null;

{
if (WildfirePvP.CanUse(out act)) return true;
}
if (WildfirePvP.IsInCooldown)
{
if (BlastChargePvP.CanUse(out act, skipCastingCheck: true)) return true;
}
return false;
}

if (BlastChargePvP.CanUse(out act, skipCastingCheck: true)) return true;

return base.GeneralGCD(out act);
}
}

0 comments on commit 5e36f2d

Please sign in to comment.