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 #36 from FFXIV-CombatReborn/ICWA-SMN-to-RR
Browse files Browse the repository at this point in the history
ICWA SMN added to RebornRotations, now new default
  • Loading branch information
LTS-FFXIV authored Jul 5, 2024
2 parents 978cabe + 1e996ba commit 3444e46
Show file tree
Hide file tree
Showing 2 changed files with 232 additions and 28 deletions.
159 changes: 159 additions & 0 deletions BasicRotations/Magical/SMN_Archive
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
using System.ComponentModel;

namespace DefaultRotations.Magical;

[Rotation("Default", CombatType.PvE, GameVersion = "7.00")]
[SourceCode(Path = "main/DefaultRotations/Magical/SMN_Default.cs")]
[Api(2)]
public sealed class SMN_Default : SummonerRotation
{
#region Config Options
public enum SwiftType : byte
{
No,
Emerald,
Ruby,
All,
}

public enum SummonOrderType : byte
{
[Description("Topaz-Emerald-Ruby")]
TopazEmeraldRuby,

[Description("Topaz-Ruby-Emerald")]
TopazRubyEmerald,

[Description("Emerald-Topaz-Ruby")]
EmeraldTopazRuby,
}

[RotationConfig(CombatType.PvE, Name = "Use Crimson Cyclone. Will use at any range, regardless of saftey use with caution.")]
public bool AddCrimsonCyclone { get; set; } = true;

[RotationConfig(CombatType.PvE, Name = "Use Bahamut no matter what whenever it's up lol don't wait")]
public bool AlwaysBaha { get; set; } = false;

[RotationConfig(CombatType.PvE, Name = "Use Swiftcast")]
public SwiftType AddSwiftcast { get; set; } = SwiftType.No;

[RotationConfig(CombatType.PvE, Name = "Order")]
public SummonOrderType SummonOrder { get; set; } = SummonOrderType.EmeraldTopazRuby;
#endregion

#region Countdown Logic
protected override IAction? CountDownAction(float remainTime)
{
if (SummonCarbunclePvE.CanUse(out var act)) return act;

if (remainTime <= RuinPvE.Info.CastTime + CountDownAhead
&& RuinPvE.CanUse(out act)) return act;
return base.CountDownAction(remainTime);
}
#endregion

#region Move Logic
[RotationDesc(ActionID.CrimsonCyclonePvE)]
protected override bool MoveForwardGCD(out IAction? act)
{
if (CrimsonCyclonePvE.CanUse(out act, skipAoeCheck: true)) return true;
return base.MoveForwardGCD(out act);
}
#endregion

#region oGCD Logic
protected override bool AttackAbility(IAction nextGCD, out IAction? act)
{
if (IsBurst && !Player.HasStatus(false, StatusID.SearingLight))
{
if (SearingLightPvE.CanUse(out act, skipAoeCheck: true)) return true;
}

var IsTargetBoss = HostileTarget?.IsBossFromTTK() ?? false;
var IsTargetDying = HostileTarget?.IsDying() ?? false;

if ((InBahamut && SummonBahamutPvE.Cooldown.ElapsedOneChargeAfterGCD(3) || InPhoenix ||
IsTargetBoss && IsTargetDying) && EnkindleBahamutPvE.CanUse(out act, skipAoeCheck: true)) return true;

if ((SummonBahamutPvE.Cooldown.ElapsedOneChargeAfterGCD(3) || IsTargetBoss && IsTargetDying) && DeathflarePvE.CanUse(out act, skipAoeCheck: true)) return true;
if (RekindlePvE.CanUse(out act, skipAoeCheck: true)) return true;
if (MountainBusterPvE.CanUse(out act, skipAoeCheck: true)) return true;

if ((Player.HasStatus(false, StatusID.SearingLight) && InBahamut && (SummonBahamutPvE.Cooldown.ElapsedOneChargeAfterGCD(3) || !EnergyDrainPvE.Cooldown.IsCoolingDown) ||
!SearingLightPvE.EnoughLevel || IsTargetBoss && IsTargetDying) && PainflarePvE.CanUse(out act)) return true;

if ((Player.HasStatus(false, StatusID.SearingLight) && InBahamut && (SummonBahamutPvE.Cooldown.ElapsedOneChargeAfterGCD(3) || !EnergyDrainPvE.Cooldown.IsCoolingDown) ||
!SearingLightPvE.EnoughLevel || IsTargetBoss && IsTargetDying) && FesterPvE.CanUse(out act)) return true;

if (EnergySiphonPvE.CanUse(out act)) return true;
if (EnergyDrainPvE.CanUse(out act)) return true;

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

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

if ((Player.HasStatus(false, StatusID.SearingLight) || SearingLightPvE.Cooldown.IsCoolingDown) && AlwaysBaha && SummonBahamutPvE.CanUse(out act)) return true;

if (SlipstreamPvE.CanUse(out act, skipAoeCheck: true)) return true;

if (CrimsonStrikePvE.CanUse(out act, skipAoeCheck: true)) return true;

//AOE
if (PreciousBrilliancePvE.CanUse(out act)) return true;
//Single
if (GemshinePvE.CanUse(out act)) return true;

if (!IsMoving && AddCrimsonCyclone && CrimsonCyclonePvE.CanUse(out act, skipAoeCheck: true)) return true;

if ((Player.HasStatus(false, StatusID.SearingLight) || SearingLightPvE.Cooldown.IsCoolingDown) && SummonBahamutPvE.CanUse(out act)) return true;

if (!SummonBahamutPvE.EnoughLevel && HasHostilesInRange && AetherchargePvE.CanUse(out act)) return true;

if (IsMoving && (Player.HasStatus(true, StatusID.GarudasFavor) || InIfrit)
&& !Player.HasStatus(true, StatusID.Swiftcast) && !InBahamut && !InPhoenix
&& RuinIvPvE.CanUse(out act, skipAoeCheck: true)) return true;

switch (SummonOrder)
{
case SummonOrderType.TopazEmeraldRuby:
default:
if (SummonTopazPvE.CanUse(out act)) return true;
if (SummonEmeraldPvE.CanUse(out act)) return true;
if (SummonRubyPvE.CanUse(out act)) return true;
break;

case SummonOrderType.TopazRubyEmerald:
if (SummonTopazPvE.CanUse(out act)) return true;
if (SummonRubyPvE.CanUse(out act)) return true;
if (SummonEmeraldPvE.CanUse(out act)) return true;
break;

case SummonOrderType.EmeraldTopazRuby:
if (SummonEmeraldPvE.CanUse(out act)) return true;
if (SummonTopazPvE.CanUse(out act)) return true;
if (SummonRubyPvE.CanUse(out act)) return true;
break;
}

if (SummonTimeEndAfterGCD() && AttunmentTimeEndAfterGCD() &&
!Player.HasStatus(true, StatusID.Swiftcast) && !InBahamut && !InPhoenix &&
RuinIvPvE.CanUse(out act, skipAoeCheck: true)) return true;

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

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

return base.GeneralGCD(out act);
}
#endregion

#region Extra Methods
public override bool CanHealSingleSpell => false;

#endregion
}
101 changes: 73 additions & 28 deletions BasicRotations/Magical/SMN_Default.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,16 +30,20 @@ public enum SummonOrderType : byte

[RotationConfig(CombatType.PvE, Name = "Use Crimson Cyclone. Will use at any range, regardless of saftey use with caution.")]
public bool AddCrimsonCyclone { get; set; } = true;

[RotationConfig(CombatType.PvE, Name = "Use Bahamut no matter what whenever it's up lol don't wait")]
public bool AlwaysBaha { get; set; } = false;

[RotationConfig(CombatType.PvE, Name = "Use Swiftcast")]
public SwiftType AddSwiftcast { get; set; } = SwiftType.No;

// [RotationConfig(CombatType.PvE, Name = "Use Swiftcast")]
// public SwiftType AddSwiftcast { get; set; } = SwiftType.Emerald;

[RotationConfig(CombatType.PvE, Name = "Order")]
public SummonOrderType SummonOrder { get; set; } = SummonOrderType.EmeraldTopazRuby;
public SummonOrderType SummonOrder { get; set; } = SummonOrderType.TopazEmeraldRuby;

[RotationConfig(CombatType.PvE, Name = "Use radiant on cooldown. But still keeping one charge")]
public bool RadiantOnCooldown { get; set; } = true;

[RotationConfig(CombatType.PvE, Name = "Use medicine when available on burst -- need some test --")]
public bool UseMedicine { get; set; } = false;
#endregion


#region Countdown Logic
protected override IAction? CountDownAction(float remainTime)
Expand All @@ -60,35 +64,71 @@ protected override bool MoveForwardGCD(out IAction? act)
return base.MoveForwardGCD(out act);
}
#endregion


#region oGCD Logic
protected override bool AttackAbility(IAction nextGCD, out IAction? act)
{
if (IsBurst && !Player.HasStatus(false, StatusID.SearingLight))
// switch (AddSwiftcast)
// {
// case SwiftType.Emerald:
// if (InGaruda && Player.Level > 86)
// {
// if (SwiftcastPvE.CanUse(out act)) return true;
// }
// break;
// case SwiftType.Ruby:
// if (InIfrit)
// {
// if (SwiftcastPvE.CanUse(out act)) return true;
// }
// break;
// case SwiftType.All:
// if (InGaruda && Player.Level > 86 || InIfrit)
// {
// if (SwiftcastPvE.CanUse(out act)) return true;
// }
// break;
// case SwiftType.No:
// break;
// }

if (RadiantOnCooldown && RadiantAegisPvE.Cooldown.CurrentCharges == 2 && (SummonBahamutPvE.Cooldown.IsCoolingDown && Player.Level < 100 || SummonSolarBahamutPvE.Cooldown.IsCoolingDown && Player.Level <= 100) && RadiantAegisPvE.CanUse(out act)) return true;
if (RadiantOnCooldown && Player.Level < 88 && SummonBahamutPvE.Cooldown.IsCoolingDown && RadiantAegisPvE.CanUse(out act, false,false,false,true)) return true;


var IsTargetBoss = HostileTarget?.IsBossFromTTK() ?? false;
var IsTargetDying = HostileTarget?.IsDying() ?? false;

// Adding tincture timing to rotations
if (InBahamut || InSolarBahamut && UseMedicine && !Player.HasStatus(false, StatusID.SearingLight) && SummonBahamutPvE.Cooldown.ElapsedOneChargeAfterGCD(0) || SummonSolarBahamutPvE.Cooldown.ElapsedOneChargeAfterGCD(0) )
{
if (UseBurstMedicine(out act)) return true;
}

if (!Player.HasStatus(false, StatusID.SearingLight) && InBahamut || InSolarBahamut && SummonBahamutPvE.Cooldown.ElapsedOneChargeAfterGCD(1) || SummonSolarBahamutPvE.Cooldown.ElapsedOneChargeAfterGCD(1) )
{
if (SearingLightPvE.CanUse(out act, skipAoeCheck: true)) return true;
}

var IsTargetBoss = HostileTarget?.IsBossFromTTK() ?? false;
var IsTargetDying = HostileTarget?.IsDying() ?? false;

if ((InBahamut && SummonBahamutPvE.Cooldown.ElapsedOneChargeAfterGCD(3) || InPhoenix ||
IsTargetBoss && IsTargetDying) && EnkindleBahamutPvE.CanUse(out act, skipAoeCheck: true)) return true;

if ((SummonBahamutPvE.Cooldown.ElapsedOneChargeAfterGCD(3) || IsTargetBoss && IsTargetDying) && DeathflarePvE.CanUse(out act, skipAoeCheck: true)) return true;

if ((InBahamut || InSolarBahamut && (SummonSolarBahamutPvE.Cooldown.ElapsedOneChargeAfterGCD(3) || SummonBahamutPvE.Cooldown.ElapsedOneChargeAfterGCD(3) || IsTargetBoss && IsTargetDying)) && EnergySiphonPvE.CanUse(out act)) return true;
if ((InBahamut || InSolarBahamut && (SummonSolarBahamutPvE.Cooldown.ElapsedOneChargeAfterGCD(3) || SummonBahamutPvE.Cooldown.ElapsedOneChargeAfterGCD(3) || IsTargetBoss && IsTargetDying)) && EnergyDrainPvE.CanUse(out act)) return true;
if ((InBahamut && (SummonBahamutPvE.Cooldown.ElapsedOneChargeAfterGCD(4) || InPhoenix || IsTargetBoss && IsTargetDying)) && EnkindleBahamutPvE.CanUse(out act)) return true;
if ((InSolarBahamut && (SummonSolarBahamutPvE.Cooldown.ElapsedOneChargeAfterGCD(4) || IsTargetBoss && IsTargetDying)) && EnkindleSolarBahamutPvE.CanUse(out act)) return true;
if ((InBahamut && (SummonBahamutPvE.Cooldown.ElapsedOneChargeAfterGCD(5) || IsTargetBoss && IsTargetDying)) && DeathflarePvE.CanUse(out act, skipAoeCheck: true)) return true;
if ((InSolarBahamut && (SummonSolarBahamutPvE.Cooldown.ElapsedOneChargeAfterGCD(5) || IsTargetBoss && IsTargetDying)) && SunflarePvE.CanUse(out act, skipAoeCheck: true)) return true;
if (RekindlePvE.CanUse(out act, skipAoeCheck: true)) return true;
if (MountainBusterPvE.CanUse(out act, skipAoeCheck: true)) return true;

if ((Player.HasStatus(false, StatusID.SearingLight) && InBahamut && (SummonBahamutPvE.Cooldown.ElapsedOneChargeAfterGCD(3) || !EnergyDrainPvE.Cooldown.IsCoolingDown) ||
!SearingLightPvE.EnoughLevel || IsTargetBoss && IsTargetDying) && PainflarePvE.CanUse(out act)) return true;
if ((InBahamut || InSolarBahamut && Player.HasStatus(false, StatusID.SearingLight) && (SummonBahamutPvE.Cooldown.ElapsedOneChargeAfterGCD(4) || !EnergyDrainPvE.Cooldown.IsCoolingDown) || !SearingLightPvE.EnoughLevel || IsTargetBoss && IsTargetDying) && PainflarePvE.CanUse(out act)) return true;

if ((Player.HasStatus(false, StatusID.SearingLight) && InBahamut && (SummonBahamutPvE.Cooldown.ElapsedOneChargeAfterGCD(3) || !EnergyDrainPvE.Cooldown.IsCoolingDown) ||
!SearingLightPvE.EnoughLevel || IsTargetBoss && IsTargetDying) && FesterPvE.CanUse(out act)) return true;
if ((InBahamut || InSolarBahamut && Player.HasStatus(false, StatusID.SearingLight) && (SummonBahamutPvE.Cooldown.ElapsedOneChargeAfterGCD(4) || !EnergyDrainPvE.Cooldown.IsCoolingDown) || !SearingLightPvE.EnoughLevel || IsTargetBoss && IsTargetDying) && FesterPvE.CanUse(out act) || NecrotizePvE.CanUse(out act)) return true;


if (EnergySiphonPvE.CanUse(out act)) return true;
if (EnergyDrainPvE.CanUse(out act)) return true;

return base.AttackAbility(nextGCD, out act);
if ((InBahamut || InSolarBahamut && (SummonSolarBahamutPvE.Cooldown.ElapsedOneChargeAfterGCD(5) || IsTargetBoss && IsTargetDying)) && SearingFlashPvE.CanUse(out act, skipAoeCheck: true)) return true;
if (DoesAnyPlayerNeedHeal() && !InBahamut || !InSolarBahamut && LuxSolarisPvE.CanUse(out act, skipAoeCheck: true)) return true;
return base.AttackAbility(nextGCD,out act);
}
#endregion

Expand All @@ -97,15 +137,15 @@ protected override bool GeneralGCD(out IAction? act)
{
if (SummonCarbunclePvE.CanUse(out act)) return true;

if ((Player.HasStatus(false, StatusID.SearingLight) || SearingLightPvE.Cooldown.IsCoolingDown) && AlwaysBaha && SummonBahamutPvE.CanUse(out act)) return true;
if (IsBurst && (!SearingLightPvE.Cooldown.IsCoolingDown && SummonBahamutPvE.CanUse(out act) || SummonSolarBahamutPvE.CanUse(out act))) return true;

if (SlipstreamPvE.CanUse(out act, skipAoeCheck: true)) return true;

if (CrimsonStrikePvE.CanUse(out act, skipAoeCheck: true)) return true;

//AOE

if (PreciousBrilliancePvE.CanUse(out act)) return true;
//Single

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

if (!IsMoving && AddCrimsonCyclone && CrimsonCyclonePvE.CanUse(out act, skipAoeCheck: true)) return true;
Expand Down Expand Up @@ -155,5 +195,10 @@ protected override bool GeneralGCD(out IAction? act)
#region Extra Methods
public override bool CanHealSingleSpell => false;

public bool DoesAnyPlayerNeedHeal()
{
return PartyMembersAverHP < 80.0f;
}

#endregion
}
}

0 comments on commit 3444e46

Please sign in to comment.