Simple Legion Ret rotation Wrote this up quickly because Singular wasn't giving me the results i wanted. I used https://www.thebuddyforum.com/honor...paladin/241633-pve-winifix-retri-paladin.html as a base, removed the contents of it and added in the current skills i use. This got me up from 15k-ish to to 25k-ish on the training dummies and up near 30k during Archimonde. Probably not ideal but it works for me. It will make sure you always have Greater Blessing of Might on you and will pop wings whenever it is on cooldown. I am using Final Verdict, Zeal, Blinding Light, Blade of Wrath, Justicar's Vengeance, Cavalier and Divine Purpose. If anyone has any suggestions feel free to send them to me or post below. Updated Copy (Waits for Judgment before using abilities. Need feedback on this) PHP: using System.Threading.Tasks; using CommonBehaviors.Actions; using Styx; using Styx.Common; using Styx.CommonBot; using Styx.CommonBot.Coroutines; using Styx.CommonBot.Routines; using Styx.TreeSharp; using Styx.WoWInternals.WoWObjects; //using System.Windows.Media; using System.Collections.Generic; using Styx.WoWInternals; using System.Linq; namespace SimpleRetRotation { public class SimpleRetRotation : CombatRoutine { public override WoWClass Class { get { return StyxWoW.Me.Specialization == WoWSpec.PaladinRetribution ? WoWClass.Paladin : WoWClass.None; } } public override string Name { get { return "[munakfreak] Simple Pally Ret"; } } public override Composite CombatBehavior { get { return new ActionRunCoroutine(ctx => CombatCoroutine()); } } public override Composite PreCombatBuffBehavior { get { return new ActionRunCoroutine(ctx => PreCombatCoroutine()); } } #region Behaviors private static async Task<bool> PreCombatCoroutine() { // Pause while casting, dead, mounted etc if (StyxWoW.Me.IsCasting || SpellManager.GlobalCooldown || !StyxWoW.Me.IsAlive || StyxWoW.Me.Mounted || StyxWoW.Me.IsOnTransport) return true; // Return false at the end of the buffing logic // If we don't return false, then it'll prevent moving further down the 'global' tree. I.e. it won't call CombatBehavior etc. return false; } static IEnumerable<WoWUnit> UnfriendlyUnits { get { return ObjectManager.GetObjectsOfType<WoWUnit>(true, false). Where(u => !u.IsDead && u.CanSelect && u.Attackable && !u.IsFriendly && u.IsWithinMeleeRange); } } private static async Task<bool> CombatCoroutine() { // Pause while casting etc if (StyxWoW.Me.IsCasting || SpellManager.GlobalCooldown) return true; if (!StyxWoW.Me.CurrentTarget.IsAlive || !StyxWoW.Me.CurrentTarget.IsWithinMeleeRange) return true; if (!StyxWoW.Me.HasAura("Avenging Wrath")) if (await SpellCast("Avenging Wrath")) return true; if (await SpellCast("Judgment")) return true; if (StyxWoW.Me.CurrentHolyPower >= 3 || StyxWoW.Me.HasAura("Divine Purpose")) { if (StyxWoW.Me.HasAura("Divine Purpose") && StyxWoW.Me.CurrentTarget.HasAura("Judgment")) if (await SpellCast("Justicar's Vengeance")) return true; if (UnfriendlyUnits.Count() >= 3) if (StyxWoW.Me.CurrentHolyPower >= 3 && await SpellCast("Divine Storm")) return true; if (StyxWoW.Me.CurrentTarget.HasAura("Judgment")) if (StyxWoW.Me.CurrentHolyPower >= 3 && await SpellCast("Templar's Verdict")) return true; } if (await SpellCast("Blade of Justice")) return true; if (await SpellCast("Crusader Strike")) return true; return false; } #endregion #region Casting Tasks private static async Task<bool> SpellCast(string spell, WoWUnit target) { // Return false if we can't cast the spell if (!SpellManager.CanCast(spell)) return false; // Cast spell, return false if it fails to cast if (!SpellManager.Cast(spell, target)) return false; //Logging.Write("[Retri] Cast {0} on {1}", spell, target.SafeName); // Wait for lag await CommonCoroutines.SleepForLagDuration(); // return true - we've cast the spell successfully. return true; } private static async Task<bool> SpellCast(string spell) { return await SpellCast(spell, StyxWoW.Me.CurrentTarget); } #endregion } } Older Copy PHP: using System.Threading.Tasks; using CommonBehaviors.Actions; using Styx; using Styx.Common; using Styx.CommonBot; using Styx.CommonBot.Coroutines; using Styx.CommonBot.Routines; using Styx.TreeSharp; using Styx.WoWInternals.WoWObjects; using System.Windows.Media; using System.Collections.Generic; using Styx.WoWInternals; using System.Linq; namespace SimpleRetRotation { public class SimpleRetRotation : CombatRoutine { public override WoWClass Class { get { return StyxWoW.Me.Specialization == WoWSpec.PaladinRetribution ? WoWClass.Paladin : WoWClass.None; } } public override string Name { get { return "[munakfreak] Simple Pally Ret"; } } public override Composite CombatBehavior { get { return new ActionRunCoroutine(ctx => CombatCoroutine()); } } public override Composite PreCombatBuffBehavior { get { return new ActionRunCoroutine(ctx => PreCombatCoroutine()); } } #region Behaviors private static async Task<bool> PreCombatCoroutine() { // Pause while casting, dead, mounted etc if (StyxWoW.Me.IsCasting || SpellManager.GlobalCooldown || !StyxWoW.Me.IsAlive || StyxWoW.Me.Mounted || StyxWoW.Me.IsOnTransport) return true; // Check if we have our self buff on if (!StyxWoW.Me.HasAura("Greater Blessing of Might") && await SpellCast("Greater Blessing of Might")) return true; // Return false at the end of the buffing logic // If we don't return false, then it'll prevent moving further down the 'global' tree. I.e. it won't call CombatBehavior etc. return false; } static IEnumerable<WoWUnit> UnfriendlyUnits { get { return ObjectManager.GetObjectsOfType<WoWUnit>(true, false). Where(u => !u.IsDead && u.CanSelect && u.Attackable && !u.IsFriendly && u.IsWithinMeleeRange); } } private static async Task<bool> CombatCoroutine() { // Pause while casting etc if (StyxWoW.Me.IsCasting || SpellManager.GlobalCooldown) return true; if (!StyxWoW.Me.CurrentTarget.IsAlive || !StyxWoW.Me.CurrentTarget.IsWithinMeleeRange) return true; // We don't have a delay on interrupting so we place it after global cd checking if (StyxWoW.Me.CurrentTarget.IsCasting && StyxWoW.Me.CurrentTarget.CanInterruptCurrentSpellCast && await SpellCast("Rebuke")) return true; if (!StyxWoW.Me.HasAura("Avenging Wrath")) if (await SpellCast("Avenging Wrath")) return true; if (await SpellCast("Judgment")) return true; if (UnfriendlyUnits.Count() >= 3) { if (StyxWoW.Me.CurrentHolyPower >= 3 && await SpellCast("Divine Storm")) return true; } else { if (StyxWoW.Me.HasAura("Divine Purpose") && await SpellCast("Justicar's Vengeance")) return true; if (StyxWoW.Me.CurrentHolyPower >= 3 && await SpellCast("Templar's Verdict")) return true; } if (await SpellCast("Blade of Justice")) return true; if (await SpellCast("Crusader Strike")) return true; return false; } #endregion #region Casting Tasks private static async Task<bool> SpellCast(string spell, WoWUnit target) { // Return false if we can't cast the spell if (!SpellManager.CanCast(spell)) return false; // Cast spell, return false if it fails to cast if (!SpellManager.Cast(spell, target)) return false; //Logging.Write("[Retri] Cast {0} on {1}", spell, target.SafeName); // Wait for lag await CommonCoroutines.SleepForLagDuration(); // return true - we've cast the spell successfully. return true; } private static async Task<bool> SpellCast(string spell) { return await SpellCast(spell, StyxWoW.Me.CurrentTarget); } #endregion } }
i copied an old one i did before testing so it is actually wrong. I will update it when i get home with the correct one.
FYI - This will only show up if you are Retribution spec when you load it based on: Code: public override WoWClass Class { get { return StyxWoW.Me.Specialization == WoWSpec.PaladinRetribution ? WoWClass.Paladin : WoWClass.None; } } What that is saying is "Return WoWClass.Paladin if my spec = Retribution. Else, return no class.