Skip to content

Commit

Permalink
Utility module slight cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
awgil committed Feb 2, 2025
1 parent c6a8eef commit 1518d5f
Show file tree
Hide file tree
Showing 22 changed files with 93 additions and 166 deletions.
14 changes: 7 additions & 7 deletions BossMod/Autorotation/Utility/ClassASTUtility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ public enum StarOption { None, Use, End }
public enum HoroscopeOption { None, Use, End }
public enum MacrocosmosOption { None, Use, End }
public enum HeliosOption { None, Use, UseEx }
public Actor? TargetChoice(StrategyValues.OptionRef strategy) => ResolveTargetOverride(strategy.Value);

public static readonly ActionID IDLimitBreak3 = ActionID.MakeSpell(AST.AID.AstralStasis);

Expand Down Expand Up @@ -60,19 +59,20 @@ public static RotationModuleDefinition Definition()
return res;
}

// TODO: revise, this should be much simpler
public override void Execute(StrategyValues strategy, ref Actor? primaryTarget, float estimatedAnimLockDelay, bool isMoving)
{
ExecuteShared(strategy, IDLimitBreak3, primaryTarget);
ExecuteSimple(strategy.Option(Track.Lightspeed), AST.AID.Lightspeed, Player);
ExecuteSimple(strategy.Option(Track.BeneficII), AST.AID.BeneficII, TargetChoice(strategy.Option(Track.BeneficII)) ?? Player, 1.5f); // TODO[cast-time]: adjustment (swiftcast etc)
ExecuteSimple(strategy.Option(Track.EssentialDignity), AST.AID.EssentialDignity, TargetChoice(strategy.Option(Track.EssentialDignity)) ?? Player);
ExecuteSimple(strategy.Option(Track.AspectedBenefic), AST.AID.AspectedBenefic, TargetChoice(strategy.Option(Track.AspectedBenefic)) ?? Player);
ExecuteSimple(strategy.Option(Track.Synastry), AST.AID.Synastry, TargetChoice(strategy.Option(Track.Synastry)) ?? Player);
ExecuteSimple(strategy.Option(Track.BeneficII), AST.AID.BeneficII, Player, 1.5f); // TODO[cast-time]: adjustment (swiftcast etc)
ExecuteSimple(strategy.Option(Track.EssentialDignity), AST.AID.EssentialDignity, Player);
ExecuteSimple(strategy.Option(Track.AspectedBenefic), AST.AID.AspectedBenefic, Player);
ExecuteSimple(strategy.Option(Track.Synastry), AST.AID.Synastry, Player);
ExecuteSimple(strategy.Option(Track.CollectiveUnconscious), AST.AID.CollectiveUnconscious, Player);
ExecuteSimple(strategy.Option(Track.CelestialOpposition), AST.AID.CelestialOpposition, Player);
ExecuteSimple(strategy.Option(Track.CelestialIntersection), AST.AID.CelestialIntersection, Player);
ExecuteSimple(strategy.Option(Track.NeutralSect), AST.AID.NeutralSect, Player);
ExecuteSimple(strategy.Option(Track.Exaltation), AST.AID.Exaltation, TargetChoice(strategy.Option(Track.Exaltation)) ?? Player);
ExecuteSimple(strategy.Option(Track.Exaltation), AST.AID.Exaltation, Player);
ExecuteSimple(strategy.Option(Track.SunSign), AST.AID.SunSign, Player);

var star = strategy.Option(Track.EarthlyStar);
Expand All @@ -83,7 +83,7 @@ public override void Execute(StrategyValues strategy, ref Actor? primaryTarget,
_ => default
};
if (starAction != default)
QueueOGCD(starAction, TargetChoice(star) ?? primaryTarget ?? Player);
QueueOGCD(starAction, ResolveTargetOverride(star.Value) ?? primaryTarget ?? Player);

//Aspected Helios full execution
var heliosUp = StatusDetails(Player, AST.SID.AspectedHelios, Player.InstanceID).Left > 0.1f || StatusDetails(Player, AST.SID.HeliosConjunction, Player.InstanceID).Left > 0.1f;
Expand Down
19 changes: 10 additions & 9 deletions BossMod/Autorotation/Utility/ClassBRDUtility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,10 @@
public sealed class ClassBRDUtility(RotationModuleManager manager, Actor player) : RoleRangedUtility(manager, player)
{
public enum Track { WardensPaean = SharedTrack.Count, Troubadour, NaturesMinne }
public enum TroubOption { None, Use87, Use87IfNotActive, Use88, Use88IfNotActive }

public static readonly ActionID IDLimitBreak3 = ActionID.MakeSpell(BRD.AID.SagittariusArrow);

public enum TroubOption { None, Use87, Use87IfNotActive, Use88, Use88IfNotActive }

public static RotationModuleDefinition Definition()
{
var res = new RotationModuleDefinition("Utility: BRD", "Cooldown Planner support for Utility Actions.\nNOTE: This is NOT a rotation preset! All Utility modules are STRICTLY for cooldown-planning usage.", "Utility for planner", "veyn", RotationModuleQuality.Excellent, BitMask.Build((int)Class.BRD), 100);
Expand All @@ -34,14 +33,16 @@ public override void Execute(StrategyValues strategy, ref Actor? primaryTarget,
ExecuteSimple(strategy.Option(Track.WardensPaean), BRD.AID.WardensPaean, ResolveTargetOverride(strategy.Option(Track.WardensPaean).Value) ?? primaryTarget ?? Player);
ExecuteSimple(strategy.Option(Track.NaturesMinne), BRD.AID.NaturesMinne, Player);

// TODO: for 'if-not-active' strategy, add configurable min-time-left
// TODO: combine 87/88 options
var troub = strategy.Option(Track.Troubadour);
var hasDefensive = Player.FindStatus(BRD.SID.Troubadour) != null || Player.FindStatus(MCH.SID.Tactician) != null || Player.FindStatus(DNC.SID.ShieldSamba) != null;
if (troub.As<TroubOption>() != TroubOption.None)
var wantTroub = troub.As<TroubOption>() switch
{
if (troub.As<TroubOption>() is TroubOption.Use87 or TroubOption.Use88)
Hints.ActionsToExecute.Push(ActionID.MakeSpell(BRD.AID.Troubadour), Player, troub.Priority(), troub.Value.ExpireIn);
if (troub.As<TroubOption>() is TroubOption.Use87IfNotActive or TroubOption.Use88IfNotActive && !hasDefensive)
Hints.ActionsToExecute.Push(ActionID.MakeSpell(BRD.AID.Troubadour), Player, troub.Priority(), troub.Value.ExpireIn);
}
TroubOption.Use87 or TroubOption.Use88 => true,
TroubOption.Use87IfNotActive or TroubOption.Use88IfNotActive => Player.FindStatus(BRD.SID.Troubadour) == null && Player.FindStatus(MCH.SID.Tactician) == null && Player.FindStatus(DNC.SID.ShieldSamba) == null,
_ => false
};
if (wantTroub)
Hints.ActionsToExecute.Push(ActionID.MakeSpell(BRD.AID.Troubadour), Player, troub.Priority(), troub.Value.ExpireIn);
}
}
17 changes: 9 additions & 8 deletions BossMod/Autorotation/Utility/ClassDNCUtility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
public sealed class ClassDNCUtility(RotationModuleManager manager, Actor player) : RoleRangedUtility(manager, player)
{
public enum Track { CuringWaltz = SharedTrack.Count, ShieldSamba, Improvisation }

public enum SambaOption { None, Use87, Use87IfNotActive, Use88, Use88IfNotActive }

public static readonly ActionID IDLimitBreak3 = ActionID.MakeSpell(DNC.AID.CrimsonLotus);
Expand Down Expand Up @@ -34,14 +33,16 @@ public override void Execute(StrategyValues strategy, ref Actor? primaryTarget,
ExecuteSimple(strategy.Option(Track.CuringWaltz), DNC.AID.CuringWaltz, Player);
ExecuteSimple(strategy.Option(Track.Improvisation), DNC.AID.Improvisation, Player);

// TODO: for 'if-not-active' strategy, add configurable min-time-left
// TODO: combine 87/88 options
var samba = strategy.Option(Track.ShieldSamba);
var hasDefensive = Player.FindStatus(BRD.SID.Troubadour) != null || Player.FindStatus(MCH.SID.Tactician) != null || Player.FindStatus(DNC.SID.ShieldSamba) != null;
if (samba.As<SambaOption>() != SambaOption.None)
var wantSamba = samba.As<SambaOption>() switch
{
if (samba.As<SambaOption>() is SambaOption.Use87 or SambaOption.Use88)
Hints.ActionsToExecute.Push(ActionID.MakeSpell(DNC.AID.ShieldSamba), Player, samba.Priority(), samba.Value.ExpireIn);
if (samba.As<SambaOption>() is SambaOption.Use87IfNotActive or SambaOption.Use88IfNotActive && !hasDefensive)
Hints.ActionsToExecute.Push(ActionID.MakeSpell(DNC.AID.ShieldSamba), Player, samba.Priority(), samba.Value.ExpireIn);
}
SambaOption.Use87 or SambaOption.Use88 => true,
SambaOption.Use87IfNotActive or SambaOption.Use88IfNotActive => Player.FindStatus(BRD.SID.Troubadour) == null && Player.FindStatus(MCH.SID.Tactician) == null && Player.FindStatus(DNC.SID.ShieldSamba) == null,
_ => false
};
if (wantSamba)
Hints.ActionsToExecute.Push(ActionID.MakeSpell(DNC.AID.ShieldSamba), Player, samba.Priority(), samba.Value.ExpireIn);
}
}
22 changes: 10 additions & 12 deletions BossMod/Autorotation/Utility/ClassMCHUtility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,11 @@

public sealed class ClassMCHUtility(RotationModuleManager manager, Actor player) : RoleRangedUtility(manager, player)
{
// Add all MCH tracks to end of list, starting with Tactician
// SharedTrack.Count here is the "end" of the track list, so we set the first track we want as the "end"
public enum Track { Tactician = SharedTrack.Count, Dismantle }
public enum TactOption { None, Use87, Use87IfNotActive, Use88, Use88IfNotActive }

// Add Machinist LB3
public static readonly ActionID IDLimitBreak3 = ActionID.MakeSpell(MCH.AID.SatelliteBeam);

public enum TactOption { None, Use87, Use87IfNotActive, Use88, Use88IfNotActive }

public static RotationModuleDefinition Definition()
{
var res = new RotationModuleDefinition("Utility: MCH", "Cooldown Planner support for Utility Actions.\nNOTE: This is NOT a rotation preset! All Utility modules are STRICTLY for cooldown-planning usage.", "Utility for planner", "Aimsucks", RotationModuleQuality.Excellent, BitMask.Build((int)Class.MCH), 100);
Expand All @@ -34,14 +30,16 @@ public override void Execute(StrategyValues strategy, ref Actor? primaryTarget,
ExecuteShared(strategy, IDLimitBreak3, primaryTarget);
ExecuteSimple(strategy.Option(Track.Dismantle), MCH.AID.Dismantle, ResolveTargetOverride(strategy.Option(Track.Dismantle).Value) ?? primaryTarget);

// TODO: for 'if-not-active' strategy, add configurable min-time-left
// TODO: combine 87/88 options
var tact = strategy.Option(Track.Tactician);
var hasDefensive = Player.FindStatus(BRD.SID.Troubadour) != null || Player.FindStatus(MCH.SID.Tactician) != null || Player.FindStatus(DNC.SID.ShieldSamba) != null;
if (tact.As<TactOption>() != TactOption.None)
var wantTact = tact.As<TactOption>() switch
{
if (tact.As<TactOption>() is TactOption.Use87 or TactOption.Use88)
Hints.ActionsToExecute.Push(ActionID.MakeSpell(MCH.AID.Tactician), Player, tact.Priority(), tact.Value.ExpireIn);
if (tact.As<TactOption>() is TactOption.Use87IfNotActive or TactOption.Use88IfNotActive && !hasDefensive)
Hints.ActionsToExecute.Push(ActionID.MakeSpell(MCH.AID.Tactician), Player, tact.Priority(), tact.Value.ExpireIn);
}
TactOption.Use87 or TactOption.Use88 => true,
TactOption.Use87IfNotActive or TactOption.Use88IfNotActive => Player.FindStatus(BRD.SID.Troubadour) == null && Player.FindStatus(MCH.SID.Tactician) == null && Player.FindStatus(DNC.SID.ShieldSamba) == null,
_ => false
};
if (wantTact)
Hints.ActionsToExecute.Push(ActionID.MakeSpell(MCH.AID.Tactician), Player, tact.Priority(), tact.Value.ExpireIn);
}
}
2 changes: 0 additions & 2 deletions BossMod/Autorotation/Utility/ClassMNKUtility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,6 @@ public sealed class ClassMNKUtility(RotationModuleManager manager, Actor player)
{
public enum Track { Mantra = SharedTrack.Count, RiddleOfEarth, Thunderclap }
public enum DashStrategy { None, GapClose, GapCloseHold1, GapCloseHold2 }
public float CDleft => World.Client.Cooldowns[ActionDefinitions.GCDGroup].Remaining;
public bool InMeleeRange(Actor? target) => Player.DistanceToHitbox(target) <= 3; //Checks if we're inside melee range

public static readonly ActionID IDLimitBreak3 = ActionID.MakeSpell(MNK.AID.FinalHeaven);

Expand Down
67 changes: 4 additions & 63 deletions BossMod/Autorotation/Utility/ClassNINUtility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public override void Execute(StrategyValues strategy, ref Actor? primaryTarget,
ExecuteShared(strategy, IDLimitBreak3, primaryTarget);
ExecuteSimple(strategy.Option(Track.ShadeShift), NIN.AID.ShadeShift, Player);

// TODO: revise, this doesn't look correct (shukuchi is area targeted, so it should use that; probably should expose options to use regardless of melee distance...)
var dash = strategy.Option(Track.Shukuchi);
var dashStrategy = strategy.Option(Track.Shukuchi).As<DashStrategy>();
var dashTarget = ResolveTargetOverride(dash.Value) ?? primaryTarget; //Smart-Targeting
Expand All @@ -37,70 +38,10 @@ public override void Execute(StrategyValues strategy, ref Actor? primaryTarget,
{
DashStrategy.None => false,
DashStrategy.GapClose => distance is > 3f and <= 20f,
DashStrategy.GapCloseHold1 => distance is > 3f and <= 20f && cd <= 60.5f,
DashStrategy.GapCloseHold1 => distance is > 3f and <= 20f && cd <= 60.5f, // TODO: this condition doesn't look correct...
_ => false,
};
if (shouldDash)
QueueOGCD(NIN.AID.Shukuchi, dashTarget, 3000);
if (shouldDash && dashTarget != null)
Hints.ActionsToExecute.Push(ActionID.MakeSpell(NIN.AID.Shukuchi), null, dash.Priority(), dash.Value.ExpireIn, 0, 0, dashTarget.PosRot.XYZ());
}

#region Core Execution Helpers

public NIN.AID NextGCD; //Next global cooldown action to be used
public void QueueGCD<P>(NIN.AID aid, Actor? target, P priority, float delay = 0) where P : Enum
=> QueueGCD(aid, target, (int)(object)priority, delay);

public void QueueGCD(NIN.AID aid, Actor? target, int priority = 8, float delay = 0)
{
var NextGCDPrio = 0;

if (priority == 0)
return;

if (QueueAction(aid, target, ActionQueue.Priority.High, delay) && priority > NextGCDPrio)
{
NextGCD = aid;
}
}

public void QueueOGCD<P>(NIN.AID aid, Actor? target, P priority, float delay = 0) where P : Enum
=> QueueOGCD(aid, target, (int)(object)priority, delay);

public void QueueOGCD(NIN.AID aid, Actor? target, int priority = 4, float delay = 0)
{
if (priority == 0)
return;

QueueAction(aid, target, ActionQueue.Priority.Medium + priority, delay);
}

public bool QueueAction(NIN.AID aid, Actor? target, float priority, float delay)
{
if ((uint)(object)aid == 0)
return false;

var def = ActionDefinitions.Instance.Spell(aid);
if (def == null)
return false;

if (def.Range != 0 && target == null)
{
return false;
}

Vector3 targetPos = default;

if (def.AllowedTargets.HasFlag(ActionTargets.Area))
{
if (def.Range == 0)
targetPos = Player.PosRot.XYZ();
else if (target != null)
targetPos = target.PosRot.XYZ();
}

Hints.ActionsToExecute.Push(ActionID.MakeSpell(aid), target, priority, delay: delay, targetPos: targetPos);
return true;
}
#endregion

}
12 changes: 6 additions & 6 deletions BossMod/Autorotation/Utility/ClassPCTUtility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,14 +26,14 @@ public override void Execute(StrategyValues strategy, ref Actor? primaryTarget,
{
ExecuteShared(strategy, IDLimitBreak3, primaryTarget);

var canCoat = ActionUnlocked(ActionID.MakeSpell(PCT.AID.TemperaCoat)) && World.Client.Cooldowns[ActionDefinitions.Instance.Spell(PCT.AID.TemperaCoat)!.MainCooldownGroup].Remaining < 0.6f;
var hasCoat = StatusDetails(Player, PCT.SID.TemperaCoat, Player.InstanceID).Left > 0.1f;
var canGrassa = ActionUnlocked(ActionID.MakeSpell(PCT.AID.TemperaGrassa)) && hasCoat;
var hasGrassa = StatusDetails(Player, PCT.SID.TemperaGrassa, Player.InstanceID).Left > 0.1f;
var tempera = strategy.Option(Track.TemperaCoat);
var temperaStrat = tempera.As<TemperaCoatOption>();
if (temperaStrat != TemperaCoatOption.None)
{
var canCoat = ActionUnlocked(ActionID.MakeSpell(PCT.AID.TemperaCoat)) && World.Client.Cooldowns[ActionDefinitions.Instance.Spell(PCT.AID.TemperaCoat)!.MainCooldownGroup].Remaining < 0.6f;
var hasCoat = StatusDetails(Player, PCT.SID.TemperaCoat, Player.InstanceID).Left > 0.1f;
var canGrassa = ActionUnlocked(ActionID.MakeSpell(PCT.AID.TemperaGrassa)) && hasCoat;
var hasGrassa = StatusDetails(Player, PCT.SID.TemperaGrassa, Player.InstanceID).Left > 0.1f;
if (temperaStrat == TemperaCoatOption.CoatOnly)
{
if (canCoat && (!hasCoat || !hasGrassa))
Expand All @@ -42,9 +42,9 @@ public override void Execute(StrategyValues strategy, ref Actor? primaryTarget,
if (temperaStrat == TemperaCoatOption.CoatGrassaASAP)
{
if (canCoat && !hasCoat)
Hints.ActionsToExecute.Push(ActionID.MakeSpell(PCT.AID.TemperaCoat), Player, tempera.Priority() + 2000, tempera.Value.ExpireIn);
Hints.ActionsToExecute.Push(ActionID.MakeSpell(PCT.AID.TemperaCoat), Player, tempera.Priority() + 2000, tempera.Value.ExpireIn); // TODO: revise, this is bad, utility modules should not arbitrarily adjust priorities
if (canGrassa && !hasGrassa)
Hints.ActionsToExecute.Push(ActionID.MakeSpell(PCT.AID.TemperaGrassa), Player, tempera.Priority() + 2000, tempera.Value.ExpireIn);
Hints.ActionsToExecute.Push(ActionID.MakeSpell(PCT.AID.TemperaGrassa), Player, tempera.Priority() + 2000, tempera.Value.ExpireIn); // TODO: revise, this is bad, utility modules should not arbitrarily adjust priorities
}
if (temperaStrat == TemperaCoatOption.CoatGrassaWhenever)
{
Expand Down
2 changes: 1 addition & 1 deletion BossMod/Autorotation/Utility/ClassPLDUtility.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public static RotationModuleDefinition Definition()
public override void Execute(StrategyValues strategy, ref Actor? primaryTarget, float estimatedAnimLockDelay, bool isMoving)
{
ExecuteShared(strategy, IDLimitBreak3, IDStanceApply, IDStanceRemove, (uint)PLD.SID.IronWill, primaryTarget);
ExecuteSimple(strategy.Option(Track.Cover), PLD.AID.Cover, ResolveTargetOverride(strategy.Option(Track.Cover).Value) ?? primaryTarget ?? Player); //Cover execution
ExecuteSimple(strategy.Option(Track.Cover), PLD.AID.Cover, primaryTarget ?? Player); //Cover execution
ExecuteSimple(strategy.Option(Track.Bulwark), PLD.AID.Bulwark, Player); //Bulwark execution
ExecuteSimple(strategy.Option(Track.DivineVeil), PLD.AID.DivineVeil, Player); //DivineVeil execution
ExecuteSimple(strategy.Option(Track.PassageOfArms), PLD.AID.PassageOfArms, Player); //PassageOfArms execution
Expand Down
Loading

0 comments on commit 1518d5f

Please sign in to comment.