#region Combat
public Composite MainRotation()
{
return new PrioritySelector(
new Decorator(ret => Me.IsDead || Me.IsGhost || Me.IsCasting || Me.IsChanneling, new ActionAlwaysSucceed()),
new Decorator(ret => (Me.GroupInfo.IsInParty || Me.GroupInfo.IsInRaid) && (Me.CurrentMap.IsDungeon || Me.CurrentMap.IsRaid) && Me.CurrentTarget != null && !Me.CurrentTarget.Combat, new ActionAlwaysSucceed()),
//Movement
new Decorator(ret => ARSettings.Instance.FaceTarget && ValidUnit(Me.CurrentTarget) && !Me.IsSafelyFacing(Me.CurrentTarget, 70f) && Me.CurrentTarget.InLineOfSight && !Me.HasAura("Killing Spree"), new Action(delegate { Me.CurrentTarget.Face(); return RunStatus.Failure; })),
new Decorator(ret => ARSettings.Instance.Movement && SpellManager.HasSpell("Shadowstep") && ARSettings.Instance.ShadowStep && ValidUnit(Me.CurrentTarget) && Me.CurrentTarget.Distance > 10 && Me.CurrentTarget.InLineOfSpellSight && !Me.HasAura("Killing Spree"), new Action(delegate { CastSpell("Shadowstep", Me.CurrentTarget); return RunStatus.Failure; })),
new Decorator(ret => ARSettings.Instance.Movement && SpellManager.HasSpell("Rocket Jump") && Me.IsSafelyFacing(Me.CurrentTarget, 20f) && ValidUnit(Me.CurrentTarget) && Me.CurrentTarget.Distance > 15 && Me.CurrentTarget.InLineOfSpellSight && !Me.HasAura("Killing Spree"), new Action(delegate { CastSpell("Rocket Jump", Me.CurrentTarget); return RunStatus.Failure; })),
new Decorator(ret => ARSettings.Instance.Movement && SpellManager.HasSpell("Sprint") && (SpellManager.HasSpell("Shadow Step") && !SpellManager.CanCast("Shadow Step") || !SpellManager.HasSpell("Shadow Step")) && ValidUnit(Me.CurrentTarget) && !Me.CurrentTarget.IsWithinMeleeRange && Me.CurrentTarget.InLineOfSpellSight && !Me.HasAura("Killing Spree"), new Action(delegate { CastSpell("Sprint", Me.CurrentTarget); return RunStatus.Failure; })),
new Decorator(ret => ARSettings.Instance.Movement && Me.CurrentTarget.Distance > 2.5 && !Me.CurrentTarget.IsWithinMeleeRange && !Me.HasAura("Killing Spree"), new Action(delegate { MoveBehind(Me.CurrentTarget); Logging.Write("Moving to the target"); return RunStatus.Failure; })),
new Decorator(ret => ARSettings.Instance.Movement && ValidUnit(Me.CurrentTarget) && (Me.CurrentTarget.Distance > 2.5 && Me.CurrentTarget.IsWithinMeleeRange) && !Me.HasAura("Killing Spree"), new Action(delegate { Navigator.PlayerMover.MoveStop(); return RunStatus.Failure; })),
//End of Movement
//Pick Pocket -- 5m default seems buggy atm
new Decorator(ret => Me.HasAura("Stealth") && ValidUnit(Me.CurrentTarget) && Me.CurrentTarget.IsHumanoid && Me.CurrentTarget.Distance <= 5, new Action(delegate { CastSpell("Pick Pocket", Me.CurrentTarget); return RunStatus.Failure; })),
//Target is interuptable
new Decorator(ret => SpellManager.HasSpell("Kick") && ARSettings.Instance.Kick && !Me.IsStealthed && ValidUnit(Me.CurrentTarget) && IsEnemy(Me.CurrentTarget) && (Me.CurrentTarget.IsCasting || Me.CurrentTarget.IsChanneling) && Me.CurrentTarget.CanInterruptCurrentSpellCast, new Action(delegate { CastSpell("Kick", Me.CurrentTarget); return RunStatus.Failure; })),
//Energy Regen Mechanic -- Slice and Dice
new Decorator(ret => SpellManager.HasSpell("Slice and Dice") && CP() > 0 && (!Me.HasAura("Slice and Dice") || Me.GetAuraTimeLeft("Slice and Dice", true).TotalSeconds < 3), new Action(delegate { CastSpell("Slice and Dice", Me); return RunStatus.Failure; })),
//Energy Regen Mechanic -- Rupture
new Decorator(ret => SpellManager.HasSpell("Rupture") && !Me.IsStealthed && ValidUnit(Me.CurrentTarget) && IsEnemy(Me.CurrentTarget) && Me.IsFacing(Me.CurrentTarget) && ((ARSettings.Instance.Spec == "Combat" && ARSettings.Instance.Rupture && !Me.HasAura("Blade Flurry") && CP() > 4) || ARSettings.Instance.Spec != "Combat" && CP() > 0) && (!Me.CurrentTarget.HasMyAura("Rupture") || Me.CurrentTarget.GetAuraTimeLeft("Rupture", true).TotalSeconds < 5), new Action(delegate { CastSpell("Rupture", Me.CurrentTarget); return RunStatus.Failure; })),
//Tricks of the Trade -- Target's Target
new Decorator(ret => SpellManager.HasSpell("Tricks of the Trade") && (Me.GroupInfo.IsInParty || Me.GroupInfo.IsInRaid) && (Me.IsStealthed || (Me.FocusedUnit != null && !Me.FocusedUnit.IsAlive && Me.FocusedUnit.IsFriendly)) && Me.CurrentTarget.CurrentTarget.IsAlive && Me.CurrentTarget.CurrentTarget.IsFriendly, new Action(delegate { CastSpell("Tricks of the Trade", Me.CurrentTarget.CurrentTarget); return RunStatus.Failure; })),
//Tricks of the Trade -- Focus Target
new Decorator(ret => SpellManager.HasSpell("Tricks of the Trade") && (Me.GroupInfo.IsInParty || Me.GroupInfo.IsInRaid) && !Me.IsStealthed && Me.FocusedUnit != null && Me.FocusedUnit.IsAlive && Me.FocusedUnit.IsFriendly, new Action(delegate { CastSpell("Tricks of the Trade", Me.FocusedUnit); return RunStatus.Failure; })),
//Blade Flurry
new Decorator(ret => SpellManager.HasSpell("Blade Flurry") && ARSettings.Instance.BladeFlurry && ValidUnit(Me.CurrentTarget) && IsEnemy(Me.CurrentTarget) && Me.IsFacing(Me.CurrentTarget) && !Me.HasAura("Killing Spree") && BFaddCount() >= 2 && !Me.HasAura("Blade Flurry"), new Action(delegate { CastSpell("Blade Flurry", Me); return RunStatus.Failure; })),
new Decorator(ret => SpellManager.HasSpell("Blade Flurry") && ARSettings.Instance.BladeFlurry && ValidUnit(Me.CurrentTarget) && IsEnemy(Me.CurrentTarget) && Me.IsFacing(Me.CurrentTarget) && !Me.HasAura("Killing Spree") && BFaddCount() < 2 && Me.HasAura("Blade Flurry"), new Action(delegate { Me.CancelAura("Blade Flurry"); return RunStatus.Failure; })),
//Self Heals
//Recup
new Decorator(ret => SpellManager.HasSpell("Recuperate") && ARSettings.Instance.Recuperate && Me.ComboPoints > 0 && Me.HealthPercent < ARSettings.Instance.RHP && !Me.HasAura("Recuperate"), new Action(delegate{CastSpell("Recuperate", Me);return RunStatus.Failure;})),
//Shiv
new Decorator(ret => SpellManager.HasSpell("Shiv") && ARSettings.Instance.AShiv && !Me.IsStealthed && ARSettings.Instance.OHPoison == "Cripple Poison" && Me.HasAura(ARSettings.Instance.OHPoison) && ValidUnit(Me.CurrentTarget) && IsEnemy(Me.CurrentTarget) && Me.CurrentTarget.IsMoving && !Me.CurrentTarget.HasAura("Debilitating poison"), new Action(delegate { CastSpell("Shiv", Me.CurrentTarget); return RunStatus.Failure; })),
new Decorator(ret => SpellManager.HasSpell("Shiv") && ARSettings.Instance.AShiv && !Me.IsStealthed && ARSettings.Instance.OHPoison == "Mind-numbing Poison" && Me.HasAura(ARSettings.Instance.OHPoison) && !SpellManager.CanCast("Kick") && ValidUnit(Me.CurrentTarget) && IsEnemy(Me.CurrentTarget) && !Me.CurrentTarget.HasAura("Mind Paralysis"), new Action(delegate { CastSpell("Shiv", Me.CurrentTarget); return RunStatus.Failure; })),
new Decorator(ret => SpellManager.HasSpell("Shiv") && ARSettings.Instance.AShiv && !Me.IsStealthed && ARSettings.Instance.OHPoison == "Leeching Poison" && Me.HasAura(ARSettings.Instance.OHPoison) && Me.HealthPercent < ARSettings.Instance.RHP, new Action(delegate { CastSpell("Shiv", Me.CurrentTarget); return RunStatus.Failure; })),
#region Boss CD's / Always Use CD's
// Defensive cooldowns
new Decorator(ret => SpellManager.HasSpell("Evasion") && ARSettings.Instance.UseCDs && ValidUnit(Me.CurrentTarget) && !Me.IsStealthed && Me.HealthPercent <= 50, new Action(delegate { CastSpell("Evasion", Me); return RunStatus.Failure; })),
new Decorator(ret => SpellManager.HasSpell("Combat Readiness") && !SpellManager.CanCast("Evasion") && !Me.HasAura("Evasion") && ARSettings.Instance.UseCDs && ValidUnit(Me.CurrentTarget) && !Me.IsStealthed && Me.HealthPercent <= 50, new Action(delegate { CastSpell("Combat Readiness", Me); return RunStatus.Failure; })),
//Boss CDs / always use CDs
//Expose Armor
new Decorator(ret => SpellManager.HasSpell("Expose Armor") && ARSettings.Instance.ExposeArmor && (IsTargetBoss() || ARSettings.Instance.UseCDs) && ValidUnit(Me.CurrentTarget) && IsEnemy(Me.CurrentTarget) && Me.IsFacing(Me.CurrentTarget) && !Me.IsStealthed && Me.CurrentTarget.HasMyAura("Weakened Armor") && Me.CurrentTarget.GetAuraByName("Weakened Armor").StackCount < 3, new Action(delegate { CastSpell("Expose Armor", Me.CurrentTarget); return RunStatus.Failure; })),
new Decorator(ret => SpellManager.HasSpell("Expose Armor") && ARSettings.Instance.ExposeArmor && (IsTargetBoss() || ARSettings.Instance.UseCDs) && ValidUnit(Me.CurrentTarget) && IsEnemy(Me.CurrentTarget) && Me.IsFacing(Me.CurrentTarget) && !Me.IsStealthed && (!Me.CurrentTarget.HasAura("Weakened Armor") || Me.CurrentTarget.GetAuraTimeLeft("Weakened Armor", false).TotalSeconds < 3), new Action(delegate { CastSpell("Expose Armor", Me.CurrentTarget); return RunStatus.Failure; })),
//Shadow Blades
new Decorator(ret => SpellManager.HasSpell("Shadow Blades") && ARSettings.Instance.ShadowBlades && (IsTargetBoss() || ARSettings.Instance.UseCDs) && ValidUnit(Me.CurrentTarget) && IsEnemy(Me.CurrentTarget) && Me.IsFacing(Me.CurrentTarget) && !Me.HasAura("Killing Spree") && !Me.IsStealthed, new Action(delegate { CastSpell("Shadow Blades", Me); return RunStatus.Failure; })),
//Vanish
new Decorator(ret => SpellManager.HasSpell("Vanish") && ARSettings.Instance.Vanish && (IsTargetBoss() || ARSettings.Instance.UseCDs) && ValidUnit(Me.CurrentTarget) && IsEnemy(Me.CurrentTarget) && Me.IsFacing(Me.CurrentTarget) && !Me.IsStealthed && ((ARSettings.Instance.Spec == "Sublety" && !Me.CurrentTarget.HasMyAura("Find Weakness")) || ARSettings.Instance.Spec != "Sublety"), new Action(delegate {CastSpell("Vanish", Me); return RunStatus.Failure;})),
//Assassination - Vendetta
new Decorator(ret => SpellManager.HasSpell("Vendetta") && ARSettings.Instance.Vendetta && (IsTargetBoss() || ARSettings.Instance.UseCDs) && ValidUnit(Me.CurrentTarget) && IsEnemy(Me.CurrentTarget) && Me.IsFacing(Me.CurrentTarget), new Action(delegate { CastSpell("Vendetta", Me.CurrentTarget); return RunStatus.Failure; })),
//Combat - Adrenaline Rush
new Decorator(ret => SpellManager.HasSpell("Adrenaline Rush") && ARSettings.Instance.AdrenalineRush && (IsTargetBoss() || ARSettings.Instance.UseCDs) && ValidUnit(Me.CurrentTarget) && IsEnemy(Me.CurrentTarget) && Me.IsFacing(Me.CurrentTarget) && !Me.HasAura("Killing Spree") && !Me.IsStealthed, new Action(delegate { CastSpell("Adrenaline Rush", Me); return RunStatus.Failure; })),
//Combat - Killing Spree
new Decorator(ret => SpellManager.HasSpell("Killing Spree") && ARSettings.Instance.KillingSpree && (IsTargetBoss() || ARSettings.Instance.UseCDs) && ValidUnit(Me.CurrentTarget) && IsEnemy(Me.CurrentTarget) && !Me.IsStealthed && Me.CurrentEnergy < 40 && !Me.HasAura("Adrenaline Rush") && !Me.HasAura("Shadow Blades"), new Action(delegate {CastSpell("Killing Spree", Me); return RunStatus.Failure;})),
//Sublety - Premeditation
new Decorator(ret => SpellManager.HasSpell("Premeditation") && ARSettings.Instance.Premeditation && (IsTargetBoss() || ARSettings.Instance.UseCDs) && ValidUnit(Me.CurrentTarget) && IsEnemy(Me.CurrentTarget) && Me.IsFacing(Me.CurrentTarget) && (Me.IsStealthed || Me.HasAura("Shadow Dance")), new Action(delegate { CastSpell("Premeditation", Me.CurrentTarget); return RunStatus.Failure; })),
//Sublety - Shadow Dance
// ***** needs behind check *****
new Decorator(ret => SpellManager.HasSpell("Shadow Dance") && ARSettings.Instance.ShadowDance && (IsTargetBoss() || ARSettings.Instance.UseCDs) && ValidUnit(Me.CurrentTarget) && IsEnemy(Me.CurrentTarget) && Me.IsFacing(Me.CurrentTarget) && !Me.IsStealthed && !Me.CurrentTarget.HasMyAura("Find Weakness"), new Action(delegate { CastSpell("Shadow Dance", Me); return RunStatus.Failure; })),
//Talent - Preparation
// ***** need talent checker *****
new Decorator(ret => SpellManager.HasSpell("Preparation") && ARSettings.Instance.Preparation && (IsTargetBoss() || ARSettings.Instance.UseCDs) && !SpellManager.CanCast("Vanish") && ValidUnit(Me.CurrentTarget) && IsEnemy(Me.CurrentTarget) && Me.IsFacing(Me.CurrentTarget) && !Me.IsStealthed, new Action(delegate { CastSpell("Preparation", Me); return RunStatus.Failure; })),
//Racials
//Arcane Torrent
new Decorator(ret => SpellManager.HasSpell("Arcane Torrent") && ARSettings.Instance.ArcaneTorrent && (IsTargetBoss() || ARSettings.Instance.UseCDs) && ValidUnit(Me.CurrentTarget) && Me.IsFacing(Me.CurrentTarget) && !Me.IsStealthed && (Me.CurrentEnergy < 85 || ((Me.CurrentTarget.IsCasting || Me.CurrentTarget.IsChanneling) && Me.CurrentTarget.CanInterruptCurrentSpellCast && Me.CurrentTarget.Distance <= 8)), new Action(delegate { CastSpell("Arcane Torrent", Me.CurrentTarget); return RunStatus.Failure; })),
//Berserking
new Decorator(ret => SpellManager.HasSpell("Berserking") && ARSettings.Instance.Berserking && (IsTargetBoss() || ARSettings.Instance.UseCDs) && ValidUnit(Me.CurrentTarget) && IsEnemy(Me.CurrentTarget) && Me.IsFacing(Me.CurrentTarget) && !Me.IsStealthed, new Action(delegate { CastSpell("Berserking", Me); return RunStatus.Failure; })),
//Blood Fury
new Decorator(ret => SpellManager.HasSpell("Blood Fury") && ARSettings.Instance.BloodFury && (IsTargetBoss() || ARSettings.Instance.UseCDs) && ValidUnit(Me.CurrentTarget) && IsEnemy(Me.CurrentTarget) && Me.IsFacing(Me.CurrentTarget) && !Me.IsStealthed, new Action(delegate { CastSpell("Blood Fury", Me); return RunStatus.Failure; })),
//Rocket Barrage
new Decorator(ret => SpellManager.HasSpell("Rocket Barrage") && ARSettings.Instance.RocketBarrage && (IsTargetBoss() || ARSettings.Instance.UseCDs) && ValidUnit(Me.CurrentTarget) && Me.CurrentTarget.Distance <= 30 && Me.IsFacing(Me.CurrentTarget) && !Me.IsStealthed, new Action(delegate { CastSpell("Rocket Barrage", Me.CurrentTarget); return RunStatus.Failure; })),
//Engy Gloves
new Decorator(ret => ARSettings.Instance.UseEngineeringGloves && (IsTargetBoss() || ARSettings.Instance.UseCDs) && ValidUnit(Me.CurrentTarget) && IsEnemy(Me.CurrentTarget) && Me.IsFacing(Me.CurrentTarget) && !Me.IsStealthed && Me.Inventory.Equipped.Hands.Usable && Me.Inventory.Equipped.Hands.Cooldown == 0, new Action(delegate { Me.Inventory.Equipped.Hands.Use(); return RunStatus.Failure; })),
//Trinkets
new Decorator(ret => ARSettings.Instance.UseTrinkets && (IsTargetBoss() || ARSettings.Instance.UseCDs) && ValidUnit(Me.CurrentTarget) && IsEnemy(Me.CurrentTarget) && Me.IsFacing(Me.CurrentTarget) && !Me.IsStealthed && Me.Inventory.Equipped.Trinket1.Usable && Me.Inventory.Equipped.Trinket1.Cooldown == 0, new Action(delegate { Me.Inventory.Equipped.Trinket1.Use(); return RunStatus.Failure; })),
new Decorator(ret => ARSettings.Instance.UseTrinkets && (IsTargetBoss() || ARSettings.Instance.UseCDs) && ValidUnit(Me.CurrentTarget) && IsEnemy(Me.CurrentTarget) && Me.IsFacing(Me.CurrentTarget) && !Me.IsStealthed && Me.Inventory.Equipped.Trinket2.Usable && Me.Inventory.Equipped.Trinket2.Cooldown == 0, new Action(delegate { Me.Inventory.Equipped.Trinket2.Use(); return RunStatus.Failure; })),
#endregion
//AoE
new Decorator(ret => SpellManager.HasSpell("Fan of Knives") && ARSettings.Instance.AOE && addCount() >= ARSettings.Instance.AoeAmount, AoERotation()),
//Assassination
new Decorator(ret => SpellManager.HasSpell("Mutilate") && (!SpellManager.HasSpell("Fan of Knives") || !ARSettings.Instance.AOE || addCount() < ARSettings.Instance.AoeAmount), AssassinationRotation()),
//Combat Spec
new Decorator(ret => !SpellManager.HasSpell("Mutilate") && !SpellManager.HasSpell("Backstab") && (!SpellManager.HasSpell("Fan of Knives") || !ARSettings.Instance.AOE || addCount() < ARSettings.Instance.AoeAmount), CombatRotation()),
//Sublety Spec
new Decorator(ret => SpellManager.HasSpell("Backstab") && (SpellManager.HasSpell("Fan of Knives") || !ARSettings.Instance.AOE || addCount() < ARSettings.Instance.AoeAmount), SubletyRotation())
);
}