public static Composite CreateFireMageNormalCombat() { return(new PrioritySelector( Safers.EnsureTarget(), Common.CreateStayAwayFromFrozenTargetsBehavior(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Helpers.Common.CreateAutoAttack(true), Spell.WaitForCast(true), // Defensive stuff new Decorator( ret => StyxWoW.Me.ActiveAuras.ContainsKey("Ice Block"), new ActionIdle()), Spell.BuffSelf("Ice Block", ret => StyxWoW.Me.HealthPercent < 20 && !StyxWoW.Me.ActiveAuras.ContainsKey("Hypothermia")), // Cooldowns Spell.BuffSelf("Evocation", ret => StyxWoW.Me.ManaPercent < 30 || (TalentManager.HasGlyph("Evocation") && StyxWoW.Me.HealthPercent < 50)), Spell.BuffSelf("Mage Ward", ret => StyxWoW.Me.HealthPercent <= 80), Spell.BuffSelf("Mana Shield", ret => StyxWoW.Me.HealthPercent <= 60), new Decorator( ret => Unit.NearbyUnfriendlyUnits.Count(u => u.IsTargetingMeOrPet) >= 3, new PrioritySelector( Spell.BuffSelf("Mirror Image") )), Common.CreateUseManaGemBehavior(ret => StyxWoW.Me.ManaPercent < 80), // Rotation Spell.Cast("Dragon's Breath", ret => StyxWoW.Me.IsSafelyFacing(StyxWoW.Me.CurrentTarget, 90) && StyxWoW.Me.CurrentTarget.DistanceSqr <= 8 * 8), Spell.Cast("Fire Blast", ret => StyxWoW.Me.ActiveAuras.ContainsKey("Impact")), new Decorator( ret => !Unit.NearbyUnfriendlyUnits.Any(u => u.DistanceSqr < 10 * 10 && u.IsCrowdControlled()), new PrioritySelector( Spell.BuffSelf("Frost Nova", ret => Unit.NearbyUnfriendlyUnits.Any(u => u.DistanceSqr <= 8 * 8 && !u.HasAura("Freeze") && !u.HasAura("Frost Nova") && !u.Stunned)) )), Common.CreateMagePolymorphOnAddBehavior(), // Rotation Spell.Cast("Combustion", ret => (StyxWoW.Me.CurrentTarget.HasMyAura("Living Bomb") || !SpellManager.HasSpell("Living Bomb")) && (StyxWoW.Me.CurrentTarget.HasMyAura("Ignite") || TalentManager.GetCount(2, 4) == 0) && StyxWoW.Me.CurrentTarget.HasMyAura("Pyroblast!")), Spell.Cast("Scorch", ret => StyxWoW.Me.CurrentTarget.GetAuraTimeLeft("Critical Mass", true).TotalSeconds < 1 && TalentManager.GetCount(2, 20) != 0), Spell.Cast("Pyroblast", ret => StyxWoW.Me.ActiveAuras.ContainsKey("Hot Streak")), Spell.BuffSelf("Flame Orb"), Spell.Buff("Living Bomb", true), Spell.Cast("Fireball"), Movement.CreateMoveToTargetBehavior(true, 35f) )); }
public static Composite CreateSubtletyRogueInstanceCombat() { return(new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), new Decorator( ret => !StyxWoW.Me.HasAura("Vanish"), Helpers.Common.CreateAutoAttack(true)), Helpers.Common.CreateInterruptSpellCast(ret => StyxWoW.Me.CurrentTarget), // Defensive Spell.BuffSelf("Evasion", ret => Unit.NearbyUnfriendlyUnits.Count(u => u.DistanceSqr < 6 * 6 && u.IsTargetingMeOrPet) >= 1), Spell.BuffSelf("Cloak of Shadows", ret => Unit.NearbyUnfriendlyUnits.Count(u => u.IsTargetingMeOrPet && u.IsCasting) >= 1), // Redirect if we have CP left Spell.Cast("Redirect", ret => StyxWoW.Me.RawComboPoints > 0 && StyxWoW.Me.ComboPoints < 1), // Agro management Spell.Cast( "Tricks of the Trade", ret => Common.BestTricksTarget, ret => SingularSettings.Instance.Rogue.UseTricksOfTheTrade), Spell.Cast("Feint", ret => StyxWoW.Me.CurrentTarget.ThreatInfo.RawPercent > 80), Movement.CreateMoveBehindTargetBehavior(), new Decorator( ret => Unit.NearbyUnfriendlyUnits.Count(u => u.DistanceSqr < 8 * 8) >= 3, Spell.BuffSelf("Fan of Knives", ret => Item.RangedIsType(WoWItemWeaponClass.Thrown))), Spell.BuffSelf("Preparation", ret => SpellManager.HasSpell("Vanish") && SpellManager.Spells["Vanish"].CooldownTimeLeft.TotalSeconds > 10 && SpellManager.Spells["Shadowstep"].CooldownTimeLeft.TotalSeconds > 10), Spell.BuffSelf("Shadow Dance", ret => StyxWoW.Me.CurrentTarget.MeIsBehind), Spell.BuffSelf("Slice and Dice", ret => StyxWoW.Me.RawComboPoints > 0 && StyxWoW.Me.GetAuraTimeLeft("Slice and Dice", true).TotalSeconds < 3), Spell.Buff("Rupture", true, ret => StyxWoW.Me.ComboPoints >= 4), Spell.BuffSelf("Recuperate", ret => TalentManager.GetCount(3, 8) > 0 && StyxWoW.Me.RawComboPoints > 0), Spell.Cast("Eviscerate", ret => StyxWoW.Me.ComboPoints == 5), // Vanish + Shadowstep + Premeditation + Ambush combo new Decorator( ret => StyxWoW.Me.HasAura("Vanish"), new PrioritySelector( Spell.Cast("Shadowstep"), Spell.BuffSelf("Premeditation", ret => StyxWoW.Me.ComboPoints <= 3), Spell.Cast("Ambush", ret => StyxWoW.Me.CurrentTarget.MeIsBehind) )), Spell.Cast("Ambush", ret => StyxWoW.Me.CurrentTarget.MeIsBehind && StyxWoW.Me.HasAura("Shadow Dance")), Spell.Cast("Backstab", ret => StyxWoW.Me.CurrentTarget.MeIsBehind && !StyxWoW.Me.HasAura("Shadow Dance")), Spell.Cast("Hemorrhage", ret => !StyxWoW.Me.CurrentTarget.MeIsBehind), Spell.Cast("Sinister Strike", ret => !SpellManager.HasSpell("Hemorrhage") && !StyxWoW.Me.CurrentTarget.MeIsBehind), Movement.CreateMoveToMeleeBehavior(true) )); }
public static Composite CreateFireMageInstancePullAndCombat() { return(new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Helpers.Common.CreateAutoAttack(true), Spell.WaitForCast(true), // Defensive stuff new Decorator( ret => StyxWoW.Me.ActiveAuras.ContainsKey("Ice Block"), new ActionIdle()), Spell.BuffSelf("Ice Block", ret => StyxWoW.Me.HealthPercent < 20 && !StyxWoW.Me.ActiveAuras.ContainsKey("Hypothermia")), // Cooldowns Spell.BuffSelf("Evocation", ret => StyxWoW.Me.ManaPercent < 30), Spell.BuffSelf("Mirror Image"), Spell.BuffSelf("Mage Ward", ret => StyxWoW.Me.HealthPercent <= 75), Common.CreateUseManaGemBehavior(ret => StyxWoW.Me.ManaPercent < 80), // AoE comes first new Decorator( ret => Unit.UnfriendlyUnitsNearTarget(10f).Count() >= 3, new PrioritySelector( Spell.Cast("Fire Blast", ret => StyxWoW.Me.ActiveAuras.ContainsKey("Impact") && (StyxWoW.Me.CurrentTarget.HasMyAura("Combustion") || TalentManager.GetCount(2, 13) == 0)), Spell.CastOnGround("Blast Wave", ret => Clusters.GetBestUnitForCluster(Unit.NearbyUnfriendlyUnits, ClusterType.Radius, 8f).Location), Spell.Cast("Dragon's Breath", ret => Clusters.GetClusterCount(StyxWoW.Me.CurrentTarget, Unit.NearbyUnfriendlyUnits, ClusterType.Cone, 15f) >= 3), Spell.CastOnGround("Flamestrike", ret => Clusters.GetBestUnitForCluster(Unit.NearbyUnfriendlyUnits, ClusterType.Radius, 8f).Location, ret => !ObjectManager.GetObjectsOfType <WoWDynamicObject>().Any(o => o.CasterGuid == StyxWoW.Me.Guid && o.Spell.Name == "Flamestrike" && o.Location.Distance( Clusters.GetBestUnitForCluster(Unit.NearbyUnfriendlyUnits, ClusterType.Radius, 8f).Location) < o.Radius)) )), Spell.BuffSelf("Time Warp", ret => !StyxWoW.Me.IsInRaid && StyxWoW.Me.CurrentTarget.HealthPercent > 20 && StyxWoW.Me.CurrentTarget.IsBoss() && !StyxWoW.Me.HasAura("Temporal Displacement")), // Rotation Spell.Cast("Combustion", ret => (StyxWoW.Me.CurrentTarget.HasMyAura("Living Bomb") || !SpellManager.HasSpell("Living Bomb")) && (StyxWoW.Me.CurrentTarget.HasMyAura("Ignite") || TalentManager.GetCount(2, 4) == 0) && StyxWoW.Me.CurrentTarget.HasMyAura("Pyroblast!")), Spell.Cast("Scorch", ret => StyxWoW.Me.CurrentTarget.GetAuraTimeLeft("Critical Mass", true).TotalSeconds < 1 && TalentManager.GetCount(2, 20) != 0), Spell.Cast("Pyroblast", ret => StyxWoW.Me.ActiveAuras.ContainsKey("Hot Streak")), Spell.BuffSelf("Flame Orb"), Spell.Buff("Living Bomb", true), Spell.Cast("Fireball"), Movement.CreateMoveToTargetBehavior(true, 35f) )); }
public static Composite CreateAssaRoguePvPCombat() { return(new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), new Decorator( ret => !StyxWoW.Me.HasAura("Vanish"), Helpers.Common.CreateAutoAttack(true)), Helpers.Common.CreateInterruptSpellCast(ret => StyxWoW.Me.CurrentTarget), // Defensive Spell.BuffSelf("Evasion", ret => Unit.NearbyUnfriendlyUnits.Count(u => u.DistanceSqr < 6 * 6 && u.IsTargetingMeOrPet) >= 1), Spell.BuffSelf("Cloak of Shadows", ret => Unit.NearbyUnfriendlyUnits.Count(u => u.IsTargetingMeOrPet && u.IsCasting) >= 1), Spell.BuffSelf("Smoke Bomb", ret => StyxWoW.Me.HealthPercent < 15), // Redirect if we have CP left Spell.Cast("Redirect", ret => StyxWoW.Me.RawComboPoints > 0 && StyxWoW.Me.ComboPoints < 1), Spell.BuffSelf("Vanish", ret => TalentManager.GetCount(1, 14) > 0 && StyxWoW.Me.CurrentTarget.HasMyAura("Rupture") && StyxWoW.Me.HasAura("Slice and Dice")), Spell.Cast("Garrote", ret => (StyxWoW.Me.HasAura("Vanish") || StyxWoW.Me.IsStealthed) && StyxWoW.Me.CurrentTarget.MeIsBehind), Spell.BuffSelf("Vendetta"), Spell.Buff("Rupture", true, ret => StyxWoW.Me.ComboPoints >= 4), Spell.BuffSelf("Slice and Dice", ret => StyxWoW.Me.RawComboPoints > 0 && StyxWoW.Me.GetAuraTimeLeft("Slice and Dice", true).TotalSeconds < 3), Spell.BuffSelf("Cold Blood", ret => StyxWoW.Me.ComboPoints >= 4 && StyxWoW.Me.CurrentTarget.HealthPercent >= 35 || StyxWoW.Me.ComboPoints == 5 || !SpellManager.HasSpell("Envenom")), Spell.Cast("Eviscerate", ret => (StyxWoW.Me.CurrentTarget.HealthPercent <= 40 || !SpellManager.HasSpell("Envenom")) && StyxWoW.Me.ComboPoints >= 4), Spell.Cast("Kidney Shot", ret => StyxWoW.Me.ComboPoints >= 4 && !StyxWoW.Me.CurrentTarget.IsStunned()), Spell.Cast("Envenom", ret => StyxWoW.Me.CurrentTarget.HealthPercent >= 35 && StyxWoW.Me.ComboPoints >= 4), Spell.Cast("Envenom", ret => StyxWoW.Me.CurrentTarget.HealthPercent < 35 && StyxWoW.Me.ComboPoints == 5), Spell.Cast("Backstab", ret => StyxWoW.Me.CurrentTarget.HealthPercent < 35 && TalentManager.GetCount(1, 13) > 0 && StyxWoW.Me.CurrentTarget.MeIsBehind && !StyxWoW.Me.HasAura("Cold Blood")), Spell.Cast("Mutilate", ret => (StyxWoW.Me.CurrentTarget.HealthPercent >= 35 || TalentManager.GetCount(1, 13) == 0 || !StyxWoW.Me.CurrentTarget.MeIsBehind) && !StyxWoW.Me.HasAura("Cold Blood")), Movement.CreateMoveToMeleeBehavior(true) )); }
public static Composite CreateSubtletyRogueNormalCombat() { return(new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), new Decorator( ret => !StyxWoW.Me.HasAura("Vanish"), Helpers.Common.CreateAutoAttack(true)), Helpers.Common.CreateInterruptSpellCast(ret => StyxWoW.Me.CurrentTarget), // Don't do anything if we casted vanish new Decorator( ret => StyxWoW.Me.HasAura("Vanish"), new ActionAlwaysSucceed()), // Defensive Spell.BuffSelf("Evasion", ret => Unit.NearbyUnfriendlyUnits.Count(u => u.DistanceSqr < 6 * 6 && u.IsTargetingMeOrPet) >= 2), Spell.BuffSelf("Cloak of Shadows", ret => Unit.NearbyUnfriendlyUnits.Count(u => u.IsTargetingMeOrPet && u.IsCasting) >= 1), Spell.BuffSelf("Smoke Bomb", ret => StyxWoW.Me.HealthPercent < 15), Common.CreateRogueBlindOnAddBehavior(), // Redirect if we have CP left Spell.Cast("Redirect", ret => StyxWoW.Me.RawComboPoints > 0 && StyxWoW.Me.ComboPoints < 1), Spell.BuffSelf("Vanish", ret => StyxWoW.Me.HealthPercent < 20), Spell.BuffSelf("Preparation", ret => SpellManager.HasSpell("Vanish") && SpellManager.Spells["Vanish"].CooldownTimeLeft.TotalSeconds > 10 && StyxWoW.Me.HealthPercent < 25), Spell.BuffSelf("Shadow Dance", ret => Unit.NearbyUnfriendlyUnits.Count(u => u.IsTargetingMeOrPet) >= 3), Spell.Cast("Cheap Shot", ret => StyxWoW.Me.HasAura("Shadow Dance")), Spell.BuffSelf("Slice and Dice", ret => StyxWoW.Me.RawComboPoints > 0 && StyxWoW.Me.GetAuraTimeLeft("Slice and Dice", true).TotalSeconds < 3), Spell.Buff("Rupture", true, ret => StyxWoW.Me.ComboPoints >= 4 && StyxWoW.Me.CurrentTarget.Elite), Spell.BuffSelf("Recuperate", ret => TalentManager.GetCount(3, 8) > 0 && StyxWoW.Me.RawComboPoints > 0), Spell.Cast("Eviscerate", ret => StyxWoW.Me.CurrentTarget.HealthPercent < 40 && StyxWoW.Me.ComboPoints >= 2), Spell.Cast("Eviscerate", ret => StyxWoW.Me.ComboPoints == 5), Spell.Cast("Ambush", ret => StyxWoW.Me.CurrentTarget.MeIsBehind && StyxWoW.Me.HasAura("Shadow Dance")), Spell.Cast("Backstab", ret => StyxWoW.Me.CurrentTarget.MeIsBehind && !StyxWoW.Me.HasAura("Shadow Dance")), Spell.Cast("Hemorrhage", ret => !StyxWoW.Me.CurrentTarget.MeIsBehind), Spell.Cast("Sinister Strike", ret => !SpellManager.HasSpell("Hemorrhage") && !StyxWoW.Me.CurrentTarget.MeIsBehind), Movement.CreateMoveToMeleeBehavior(true) )); }
/// <summary> /// Finds the max range of a specific totem, where you'll still receive the buff. /// </summary> /// <remarks> /// Created 3/26/2011. /// </remarks> /// <param name = "totem">The totem.</param> /// <returns>The calculated totem range.</returns> public static float GetTotemRange(WoWTotem totem) { // 15% extra range if talented for Totemic Reach for each point float talentFactor = (TalentManager.GetCount(2, 7) * 0.15f) + 1; switch (totem) { case WoWTotem.Flametongue: case WoWTotem.Stoneskin: case WoWTotem.StrengthOfEarth: case WoWTotem.Windfury: case WoWTotem.WrathOfAir: case WoWTotem.ManaSpring: return(40f * talentFactor); case WoWTotem.ElementalResistance: case WoWTotem.HealingStream: case WoWTotem.TranquilMind: case WoWTotem.Tremor: return(30f * talentFactor); case WoWTotem.Searing: return(20f * talentFactor); case WoWTotem.Earthbind: return(10f * talentFactor); case WoWTotem.Grounding: case WoWTotem.Magma: return(8f * talentFactor); case WoWTotem.Stoneclaw: // stoneclaw isn't effected by Totemic Reach (according to basically everything online) return(8f); case WoWTotem.EarthElemental: case WoWTotem.FireElemental: // Not really sure about these 3. return(20f); case WoWTotem.ManaTide: // Again... not sure :S return(30f * talentFactor); } return(0f); }
/// <summary>Creates an interrupt spell cast composite. This will attempt to use racials before any class/spec abilities. It will attempt to stun if possible!</summary> /// <remarks>Created 9/7/2011.</remarks> /// <param name="onUnit">The on unit.</param> /// <returns>.</returns> public static Composite CreateInterruptSpellCast(UnitSelectionDelegate onUnit) { return (new Decorator( // If the target is casting, and can actually be interrupted, AND we've waited out the double-interrupt timer, then find something to interrupt with. ret => onUnit != null && onUnit(ret) != null && onUnit(ret).IsCasting&& onUnit(ret).CanInterruptCurrentSpellCast /* && PreventDoubleInterrupt*/, new PrioritySelector( Spell.Cast("Rebuke", onUnit), Spell.Cast("Avenger's Shield", onUnit), Spell.Cast("Hammer of Justice", onUnit), Spell.Cast("Repentance", onUnit, ret => onUnit(ret).IsPlayer || onUnit(ret).IsDemon || onUnit(ret).IsHumanoid || onUnit(ret).IsDragon || onUnit(ret).IsGiant || onUnit(ret).IsUndead), Spell.Cast("Kick", onUnit), Spell.Cast("Gouge", onUnit, ret => !onUnit(ret).IsBoss() && !onUnit(ret).MeIsSafelyBehind), // Can't gouge bosses. Spell.Cast("Counterspell", onUnit), Spell.Cast("Wind Shear", onUnit), Spell.Cast("Pummel", onUnit), // Gag Order only works on non-bosses due to it being a silence, not an interrupt! Spell.Cast("Heroic Throw", onUnit, ret => TalentManager.GetCount(3, 7) == 2 && !onUnit(ret).IsBoss()), Spell.Cast("Silence", onUnit), Spell.Cast("Silencing Shot", onUnit), // Can't stun most bosses. So use it on trash, etc. Spell.Cast("Bash", onUnit, ret => !onUnit(ret).IsBoss()), Spell.Cast("Skull Bash (Cat)", onUnit, ret => StyxWoW.Me.Shapeshift == ShapeshiftForm.Cat), Spell.Cast("Skull Bash (Bear)", onUnit, ret => StyxWoW.Me.Shapeshift == ShapeshiftForm.Bear), Spell.Cast("Solar Beam", onUnit, ret => StyxWoW.Me.Shapeshift == ShapeshiftForm.Moonkin), Spell.Cast("Strangulate", onUnit), Spell.Cast("Mind Freeze", onUnit), // Racials last. Spell.Cast("Arcane Torrent", onUnit), // Don't waste stomp on bosses. They can't be stunned 99% of the time! Spell.Cast("War Stomp", onUnit, ret => !onUnit(ret).IsBoss() && onUnit(ret).Distance < 8) ))); }
public static Composite CreateElementalShamanInstancePullAndCombat() { return(new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Spell.WaitForCast(true), Totems.CreateSetTotems(), Common.CreateInterruptSpellCast(ret => StyxWoW.Me.CurrentTarget), Spell.BuffSelf("Lightning Shield"), Spell.BuffSelf("Spiritwalker's Grace", ret => StyxWoW.Me.IsMoving && StyxWoW.Me.Combat), Spell.BuffSelf("Elemental Mastery", ret => StyxWoW.Me.HasAnyAura("Bloodlust", "Heroism", "Time Warp", "Ancient Hysteria")), Spell.BuffSelf("Elemental Mastery", ret => StyxWoW.Me.IsMoving && StyxWoW.Me.Combat && (!SpellManager.HasSpell("Spiritwalker's Grace") || SpellManager.Spells["Spiritwalker's Grace"].Cooldown && !StyxWoW.Me.HasAura("Spiritwalker's Grace"))), new Decorator( ret => Unit.UnfriendlyUnitsNearTarget(10f).Count() >= 3, new PrioritySelector( Spell.CastOnGround("Earthquake", ret => StyxWoW.Me.CurrentTarget.Location), Spell.Cast("Chain Lightning", ret => Clusters.GetBestUnitForCluster(Unit.UnfriendlyUnitsNearTarget(15f), ClusterType.Chained, 12)) )), // Totem stuff // Pop the ele on bosses Spell.BuffSelf("Fire Elemental Totem", ret => StyxWoW.Me.CurrentTarget.IsBoss() && !StyxWoW.Me.Totems.Any(t => t.WoWTotem == WoWTotem.FireElemental)), Spell.BuffSelf("Searing Totem", ret => StyxWoW.Me.CurrentTarget.Distance < Totems.GetTotemRange(WoWTotem.Searing) - 2f && !StyxWoW.Me.Totems.Any( t => t.Unit != null && t.WoWTotem == WoWTotem.Searing && t.Unit.Location.Distance(StyxWoW.Me.CurrentTarget.Location) < Totems.GetTotemRange(WoWTotem.Searing)) && !StyxWoW.Me.Totems.Any(t => t.WoWTotem == WoWTotem.FireElemental)), Spell.Buff("Flame Shock", true), Spell.Cast("Lava Burst"), Spell.Cast("Earth Shock", ret => (StyxWoW.Me.HasAura("Lightning Shield", 7) || TalentManager.GetCount(1, 13) == 0) && StyxWoW.Me.CurrentTarget.GetAuraTimeLeft("Flame Shock", true).TotalSeconds > 6), Spell.Cast("Unleash Elements", ret => Item.HasWeaponImbue(WoWInventorySlot.MainHand, "Flametongue") && StyxWoW.Me.IsMoving && !StyxWoW.Me.HasAura("Spiritwalker's Grace")), Spell.Cast("Chain Lightning", ret => Unit.UnfriendlyUnitsNearTarget(10f).Count() >= 2), Spell.Cast("Lightning Bolt"), Movement.CreateMoveToTargetBehavior(true, 35f) )); }
public static Composite CreateMarksmanHunterInstancePullAndCombat() { return(new PrioritySelector( Common.CreateHunterCallPetBehavior(true), Safers.EnsureTarget(), Spell.BuffSelf("Disengage", ret => SingularSettings.Instance.Hunter.UseDisengage && StyxWoW.Me.CurrentTarget.Distance < Spell.MeleeRange + 3f), Common.CreateHunterBackPedal(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Helpers.Common.CreateAutoAttack(true), new Decorator( ret => StyxWoW.Me.CurrentTarget.Distance < 35f, Movement.CreateEnsureMovementStoppedBehavior()), new Decorator( ret => StyxWoW.Me.IsCasting && StyxWoW.Me.CastingSpell.Name == "Steady Shot", new Action(ret => DoubleSteadyCast = true)), Spell.WaitForCast(true), Helpers.Common.CreateInterruptSpellCast(ret => StyxWoW.Me.CurrentTarget), Spell.Buff("Hunter's Mark"), Spell.BuffSelf("Aspect of the Hawk"), Spell.Cast("Mend Pet", ret => StyxWoW.Me.GotAlivePet && !StyxWoW.Me.Pet.HasAura("Mend Pet") && (StyxWoW.Me.Pet.HealthPercent < SingularSettings.Instance.Hunter.MendPetPercent || (StyxWoW.Me.Pet.HappinessPercent < 90 && TalentManager.HasGlyph("Mend Pet")))), // Cooldowns Spell.BuffSelf("Readiness", ret => !StyxWoW.Me.HasAura("Rapid Fire") && SpellManager.HasSpell("Rapid Fire") && SpellManager.Spells["Rapid Fire"].Cooldown), Spell.BuffSelf("Rapid Fire", ret => (StyxWoW.Me.HasAura("Call of the Wild") || !StyxWoW.Me.PetSpells.Any(s => s.Spell != null && s.Spell.Name == "Call of the Wild" && s.Spell.CooldownTimeLeft.TotalSeconds < 60)) && !StyxWoW.Me.HasAnyAura("Bloodlust", "Heroism", "Time Warp", "The Beast Within")), new Decorator( ret => Unit.UnfriendlyUnitsNearTarget(10f).Count() >= 3, new PrioritySelector( Common.CreateHunterTrapBehavior("Explosive Trap"), Spell.Cast("Multi Shot"), Spell.Cast("Steady Shot"), Movement.CreateMoveToTargetBehavior(true, 35f) ) ), // Above 90% Careful Aim rotation new Decorator( ret => TalentManager.GetCount(2, 6) > 0 && StyxWoW.Me.CurrentTarget.HealthPercent > 90, new PrioritySelector( new Decorator( ret => StyxWoW.Me.IsMoving, new PrioritySelector( Spell.Cast("Aimed Shot", ret => StyxWoW.Me.HasAura("Fire!")), Spell.Buff("Serpent Sting", true), Spell.Cast("Chimera Shot") )), Spell.Cast("Aimed Shot"), Spell.Cast("Steady Shot"), Movement.CreateMoveToTargetBehavior(true, 35f) )), // Rotation Spell.Buff("Serpent Sting", true), Spell.Cast("Chimera Shot"), Spell.Cast("Steady Shot", ret => DoubleSteadyCast), Spell.Cast("Kill Shot"), Spell.Cast("Aimed Shot", ret => StyxWoW.Me.HasAura("Fire!")), Spell.Cast("Arcane Shot", ret => StyxWoW.Me.FocusPercent > 40), Spell.Cast("Steady Shot"), Movement.CreateMoveToTargetBehavior(true, 35f) )); }
private static Composite CreateFeralCatInstanceCombat() { return(new PrioritySelector( Spell.BuffSelf("Cat Form"), Spell.Cast("Feral Charge (Cat)"), Spell.Cast("Dash", ret => StyxWoW.Me.CurrentTarget.Distance > Spell.MeleeRange + 2f && !StyxWoW.Me.HasAura("Stampeding Roar")), Spell.BuffSelf("Stampeding Roar (Cat)", ret => StyxWoW.Me.CurrentTarget.Distance > Spell.MeleeRange + 2f && !StyxWoW.Me.HasAura("Dash")), Spell.BuffSelf("Barkskin", ret => StyxWoW.Me.HealthPercent < Settings.FeralBarkskin), Spell.BuffSelf("Survival Instincts", ret => StyxWoW.Me.HealthPercent < Settings.SurvivalInstinctsHealth), new Decorator( ret => Unit.NearbyUnfriendlyUnits.Count(u => u.DistanceSqr < 5 * 5) >= 3, new PrioritySelector( Spell.BuffSelf("Tiger's Fury"), Spell.BuffSelf("Berserk"), Spell.Cast("Swipe (Cat)"), Movement.CreateMoveToMeleeBehavior(true) )), Movement.CreateMoveBehindTargetBehavior(), Spell.BuffSelf("Tiger's Fury", ret => StyxWoW.Me.EnergyPercent < 35 && !StyxWoW.Me.HasAura("Stampede")), Spell.BuffSelf("Berserk", ret => StyxWoW.Me.HasAura("Tiger's Fury")), Spell.Cast("Mangle (Cat)", ret => Has4PieceTier11Bonus && StyxWoW.Me.GetAuraTimeLeft("Strength of the Panther", false).TotalSeconds < 3), Spell.Buff("Faerie Fire (Feral)", ret => !StyxWoW.Me.CurrentTarget.HasSunders()), Spell.Buff("Mangle (Cat)", "Mangle", "Trauma", "Stampede"), Spell.Cast("Ravage!", ret => StyxWoW.Me.GetAuraTimeLeft("Stampede", true).TotalSeconds < 3), Spell.Cast("Ferocious Bite", ret => TalentManager.GetCount(2, 19) == 2 && StyxWoW.Me.CurrentTarget.HealthPercent < (Has2PieceTier13Bonus ? 60 : 25) && (StyxWoW.Me.ComboPoints == 5 || StyxWoW.Me.CurrentTarget.HasMyAura("Rip") && StyxWoW.Me.CurrentTarget.GetAuraTimeLeft("Rip", true).TotalSeconds < 3)), Spell.Cast("Shred", ret => TalentManager.HasGlyph("Bloodletting") && StyxWoW.Me.CurrentTarget.HasMyAura("Rip") && StyxWoW.Me.CurrentTarget.MeIsBehind && StyxWoW.Me.CurrentTarget.GetAuraTimeLeft("Rip", true).TotalSeconds < 14), Spell.Cast("Rip", ret => StyxWoW.Me.ComboPoints == 5 && StyxWoW.Me.CurrentTarget.GetAuraTimeLeft("Rip", true).TotalSeconds < 2), Spell.Cast("Ferocious Bite", ret => StyxWoW.Me.HasAura("Berserk") && StyxWoW.Me.ComboPoints == 5 && StyxWoW.Me.CurrentTarget.HasMyAura("Rip") && StyxWoW.Me.CurrentTarget.HasMyAura("Savage Roar") && StyxWoW.Me.CurrentTarget.GetAuraTimeLeft("Rip", true).TotalSeconds >= 5 && StyxWoW.Me.CurrentTarget.GetAuraTimeLeft("Savage Roar", true).TotalSeconds >= 3), Spell.Cast("Rake", ret => StyxWoW.Me.HasAura("Tiger's Fury") && StyxWoW.Me.CurrentTarget.HasMyAura("Rake") && StyxWoW.Me.CurrentTarget.GetAuraTimeLeft("Rake", true).TotalSeconds < 9), Spell.Cast("Rake", ret => StyxWoW.Me.CurrentTarget.GetAuraTimeLeft("Rake", true).TotalSeconds < 3), Spell.Cast("Shred", ret => StyxWoW.Me.HasAura("Omen of Clarity") && StyxWoW.Me.CurrentTarget.MeIsBehind), Spell.Cast("Mangle (Cat)", ret => StyxWoW.Me.HasAura("Omen of Clarity") && !StyxWoW.Me.CurrentTarget.MeIsBehind), Spell.Cast("Savage Roar", ret => StyxWoW.Me.GetAuraTimeLeft("Savage Roar", true).TotalSeconds < 2), Spell.Cast("Ferocious Bite", ret => StyxWoW.Me.ComboPoints == 5 && StyxWoW.Me.CurrentTarget.HasMyAura("Rip") && StyxWoW.Me.CurrentTarget.GetAuraTimeLeft("Rip", true).TotalSeconds >= 14 && (TalentManager.GetCount(2, 17) < 2 || StyxWoW.Me.CurrentTarget.HasMyAura("Savage Roar") && StyxWoW.Me.CurrentTarget.GetAuraTimeLeft("Savage Roar", true).TotalSeconds >= 10)), Spell.Cast("Ravage!", ret => StyxWoW.Me.HasAura("Stampede") && !StyxWoW.Me.HasAura("Omen of Clarity") && (StyxWoW.Me.HasAura("Tiger's Fury") || SpellManager.HasSpell("Tiger's Fury") && !SpellManager.GlobalCooldown && SpellManager.Spells["Tiger's Fury"].CooldownTimeLeft.TotalSeconds <= 3)), Spell.Cast("Mangle (Cat)", ret => Has4PieceTier11Bonus && !StyxWoW.Me.HasAura("Strength of the Panther", 3)), new Decorator( ret => StyxWoW.Me.CurrentTarget.MeIsBehind, new PrioritySelector( Spell.Cast("Shred", ret => StyxWoW.Me.HasAura("Tiger's Fury") && StyxWoW.Me.HasAura("Berserk")), Spell.Cast("Shred", ret => SpellManager.HasSpell("Tiger's Fury") && !SpellManager.GlobalCooldown && SpellManager.Spells["Tiger's Fury"].CooldownTimeLeft.TotalSeconds <= 3), Spell.Cast("Shred", ret => StyxWoW.Me.ComboPoints == 4), Spell.Cast("Shred", ret => StyxWoW.Me.EnergyPercent >= 85))), new Decorator( ret => !StyxWoW.Me.CurrentTarget.MeIsBehind, new PrioritySelector( Spell.Cast("Mangle (Cat)", ret => StyxWoW.Me.HasAura("Tiger's Fury") && StyxWoW.Me.HasAura("Berserk")), Spell.Cast("Mangle (Cat)", ret => SpellManager.HasSpell("Tiger's Fury") && !SpellManager.GlobalCooldown && SpellManager.Spells["Tiger's Fury"].CooldownTimeLeft.TotalSeconds <= 3), Spell.Cast("Mangle (Cat)", ret => StyxWoW.Me.ComboPoints == 4), Spell.Cast("Mangle (Cat)", ret => StyxWoW.Me.EnergyPercent >= 85))), Movement.CreateMoveToMeleeBehavior(true) )); }
public static Composite CreateAssaRogueInstanceCombat() { return(new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), new Decorator( ret => !StyxWoW.Me.HasAura("Vanish"), Helpers.Common.CreateAutoAttack(true)), Helpers.Common.CreateInterruptSpellCast(ret => StyxWoW.Me.CurrentTarget), // Defensive Spell.BuffSelf("Evasion", ret => Unit.NearbyUnfriendlyUnits.Count(u => u.DistanceSqr < 6 * 6 && u.IsTargetingMeOrPet) >= 1), Spell.BuffSelf("Cloak of Shadows", ret => Unit.NearbyUnfriendlyUnits.Count(u => u.IsTargetingMeOrPet && u.IsCasting) >= 1), // Redirect if we have CP left Spell.Cast("Redirect", ret => StyxWoW.Me.RawComboPoints > 0 && StyxWoW.Me.ComboPoints < 1), // Agro management Spell.Cast( "Tricks of the Trade", ret => Common.BestTricksTarget, ret => SingularSettings.Instance.Rogue.UseTricksOfTheTrade), Spell.Cast("Feint", ret => StyxWoW.Me.CurrentTarget.ThreatInfo.RawPercent > 80), Movement.CreateMoveBehindTargetBehavior(), Spell.BuffSelf("Vanish", ret => TalentManager.GetCount(1, 14) > 0 && StyxWoW.Me.CurrentTarget.HasMyAura("Rupture") && StyxWoW.Me.HasAura("Slice and Dice")), Spell.Cast("Garrote", ret => (StyxWoW.Me.HasAura("Vanish") || StyxWoW.Me.IsStealthed) && StyxWoW.Me.CurrentTarget.MeIsBehind), Spell.BuffSelf("Vendetta", ret => StyxWoW.Me.CurrentTarget.IsBoss() && (StyxWoW.Me.CurrentTarget.HealthPercent < 35 || TalentManager.GetCount(1, 13) == 0)), new Decorator( ret => Unit.NearbyUnfriendlyUnits.Count(u => u.DistanceSqr < 8 * 8) >= 3, Spell.BuffSelf("Fan of Knives", ret => Item.RangedIsType(WoWItemWeaponClass.Thrown))), Spell.Buff("Rupture", true, ret => StyxWoW.Me.ComboPoints >= 4), Spell.BuffSelf("Slice and Dice", ret => StyxWoW.Me.RawComboPoints > 0 && StyxWoW.Me.GetAuraTimeLeft("Slice and Dice", true).TotalSeconds < 3), Spell.BuffSelf("Cold Blood", ret => StyxWoW.Me.ComboPoints >= 4 && StyxWoW.Me.CurrentTarget.HealthPercent >= 35 || StyxWoW.Me.ComboPoints == 5 || !SpellManager.HasSpell("Envenom")), Spell.Cast("Eviscerate", ret => (!StyxWoW.Me.CurrentTarget.Elite || !SpellManager.HasSpell("Envenom")) && StyxWoW.Me.ComboPoints >= 4), Spell.Cast("Envenom", ret => StyxWoW.Me.CurrentTarget.HealthPercent >= 35 && StyxWoW.Me.ComboPoints >= 4), Spell.Cast("Envenom", ret => StyxWoW.Me.CurrentTarget.HealthPercent < 35 && StyxWoW.Me.ComboPoints == 5), Spell.Cast("Backstab", ret => StyxWoW.Me.CurrentTarget.HealthPercent < 35 && TalentManager.GetCount(1, 13) > 0 && StyxWoW.Me.CurrentTarget.MeIsBehind && !StyxWoW.Me.HasAura("Cold Blood")), Spell.Cast("Mutilate", ret => (StyxWoW.Me.CurrentTarget.HealthPercent >= 35 || TalentManager.GetCount(1, 13) == 0 || !StyxWoW.Me.CurrentTarget.MeIsBehind) && !StyxWoW.Me.HasAura("Cold Blood")), Movement.CreateMoveToMeleeBehavior(true) )); }
public static Composite CreateBloodDeathKnightInstanceCombat() { return (new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Spell.WaitForCast(), Helpers.Common.CreateAutoAttack(true), Helpers.Common.CreateInterruptSpellCast(ret => StyxWoW.Me.CurrentTarget), Spell.BuffSelf("Blood Presence"), // Anti-magic shell Spell.BuffSelf("Anti-Magic Shell", ret => Unit.NearbyUnfriendlyUnits.Any(u => (u.IsCasting || u.ChanneledCastingSpellId != 0) && u.CurrentTargetGuid == StyxWoW.Me.Guid && SingularSettings.Instance.DeathKnight.UseAntiMagicShell)), /* * Big cooldown section. By default, all cooldowns are priorotized by their time ascending * for maximum uptime in the long term. By default, all cooldowns are also exlusive. This * means they will be used in rotation rather than conjunction. This is required for high * end blood tanking. */ Spell.BuffSelf("Death Pact", ret => StyxWoW.Me.HealthPercent < SingularSettings.Instance.DeathKnight.PetSacrificePercent && StyxWoW.Me.GotAlivePet), Spell.BuffSelf("Rune Tap", ret => StyxWoW.Me.HealthPercent < 90 && StyxWoW.Me.HasAura("Will of the Necropolis")), Spell.BuffSelf("Death Coil", ret => StyxWoW.Me.HealthPercent < 70 && StyxWoW.Me.HasAura("Lichborne")), Spell.Cast("Dancing Rune Weapon", ret => SingularSettings.Instance.DeathKnight.UseDancingRuneWeapon && Unit.NearbyUnfriendlyUnits.Count() > 2), Spell.BuffSelf("Bone Shield", ret => SingularSettings.Instance.DeathKnight.UseBoneShield && (!SingularSettings.Instance.DeathKnight.BoneShieldExclusive || (!StyxWoW.Me.HasAura("Vampiric Blood") && !StyxWoW.Me.HasAura("Dancing Rune Weapon") && !StyxWoW.Me.HasAura("Lichborne") && !StyxWoW.Me.HasAura("Icebound Fortitude")))), Spell.BuffSelf("Vampiric Blood", ret => SingularSettings.Instance.DeathKnight.UseVampiricBlood && StyxWoW.Me.HealthPercent < SingularSettings.Instance.DeathKnight.VampiricBloodPercent && (!SingularSettings.Instance.DeathKnight.VampiricBloodExclusive || (!StyxWoW.Me.HasAura("Bone Shield") && !StyxWoW.Me.HasAura("Dancing Rune Weapon") && !StyxWoW.Me.HasAura("Lichborne") && !StyxWoW.Me.HasAura("Icebound Fortitude")))), Spell.BuffSelf("Lichborne", ret => SingularSettings.Instance.DeathKnight.UseLichborne && StyxWoW.Me.HealthPercent < SingularSettings.Instance.DeathKnight.LichbornePercent && StyxWoW.Me.CurrentRunicPower >= 60 && (!SingularSettings.Instance.DeathKnight.LichborneExclusive || (!StyxWoW.Me.HasAura("Bone Shield") && !StyxWoW.Me.HasAura("Vampiric Blood") && !StyxWoW.Me.HasAura("Dancing Rune Weapon") && !StyxWoW.Me.HasAura("Icebound Fortitude")))), Spell.BuffSelf("Raise Dead", ret => SingularSettings.Instance.DeathKnight.UsePetSacrifice && StyxWoW.Me.HealthPercent < SingularSettings.Instance.DeathKnight.PetSacrificeSummonPercent && (!SingularSettings.Instance.DeathKnight.PetSacrificeExclusive || (!StyxWoW.Me.HasAura("Bone Shield") && !StyxWoW.Me.HasAura("Vampiric Blood") && !StyxWoW.Me.HasAura("Dancing Rune Weapon") && !StyxWoW.Me.HasAura("Lichborne") && !StyxWoW.Me.HasAura("Icebound Fortitude")))), Spell.BuffSelf("Icebound Fortitude", ret => SingularSettings.Instance.DeathKnight.UseIceboundFortitude && StyxWoW.Me.HealthPercent < SingularSettings.Instance.DeathKnight.IceboundFortitudePercent && (!SingularSettings.Instance.DeathKnight.IceboundFortitudeExclusive || (!StyxWoW.Me.HasAura("Bone Shield") && !StyxWoW.Me.HasAura("Vampiric Blood") && !StyxWoW.Me.HasAura("Dancing Rune Weapon") && !StyxWoW.Me.HasAura("Lichborne")))), Spell.BuffSelf("Empower Rune Weapon", ret => StyxWoW.Me.HealthPercent < SingularSettings.Instance.DeathKnight.EmpowerRuneWeaponPercent && !SpellManager.CanCast("Death Strike")), Spell.BuffSelf("Army of the Dead", ret => SingularSettings.Instance.DeathKnight.UseArmyOfTheDead && StyxWoW.Me.HealthPercent < SingularSettings.Instance.DeathKnight.ArmyOfTheDeadPercent), new Sequence( Spell.Cast("Death Grip", ret => SingularSettings.Instance.EnableTaunting && StyxWoW.Me.CurrentTarget.DistanceSqr > 10 * 10), new DecoratorContinue( ret => StyxWoW.Me.IsMoving, new Action(ret => Navigator.PlayerMover.MoveStop())), new WaitContinue(1, new ActionAlwaysSucceed()) ), Spell.Cast("Dark Command", ret => TankManager.Instance.NeedToTaunt.FirstOrDefault(), ret => SingularSettings.Instance.EnableTaunting), // Start AoE section new Decorator(ret => Unit.UnfriendlyUnitsNearTarget(15f).Count() >= SingularSettings.Instance.DeathKnight.DeathAndDecayCount, new PrioritySelector( Spell.CastOnGround("Death and Decay", ret => StyxWoW.Me.CurrentTarget.Location, ret => SingularSettings.Instance.DeathKnight.UseDeathAndDecay), Spell.Cast("Outbreak", ret => !StyxWoW.Me.CurrentTarget.HasMyAura("Frost Fever") || !StyxWoW.Me.CurrentTarget.HasAura("Blood Plague")), Spell.Buff("Icy Touch", true, ret => Spell.GetSpellCooldown("Outbreak").TotalSeconds > 10, "Frost Fever"), Spell.Buff("Plague Strike", true, ret => Spell.GetSpellCooldown("Outbreak").TotalSeconds > 10, "Blood Plague"), Spell.Cast("Pestilence", ret => StyxWoW.Me.CurrentTarget.HasMyAura("Blood Plague") && StyxWoW.Me.CurrentTarget.HasMyAura("Frost Fever") && Unit.UnfriendlyUnitsNearTarget(10f).Count(u => !u.HasMyAura("Blood Plague") && !u.HasMyAura("Frost Fever")) > 0), Spell.Cast("Blood Boil", ret => TalentManager.GetCount(1, 6) > 0 && Unit.UnfriendlyUnitsNearTarget(12f).Count(u => !u.HasMyAura("Scarlet Fever")) > 0), new Sequence( Spell.Cast("Death Strike", ret => DeathStrikeTimer.IsFinished), new Action(ret => DeathStrikeTimer.Reset())), Spell.Cast("Blood Boil"), Spell.Cast("Heart Strike"), Spell.Cast("Rune Strike"), Spell.Cast("Icy Touch"), Movement.CreateMoveToMeleeBehavior(true) )), Spell.Cast("Outbreak", ret => !StyxWoW.Me.CurrentTarget.HasMyAura("Frost Fever") || !StyxWoW.Me.CurrentTarget.HasAura("Blood Plague")), Spell.Buff("Icy Touch", true, ret => Spell.GetSpellCooldown("Outbreak").TotalSeconds > 10, "Frost Fever"), Spell.Buff("Plague Strike", true, ret => Spell.GetSpellCooldown("Outbreak").TotalSeconds > 10, "Blood Plague"), // If we don't have RS yet, just resort to DC. Its not the greatest, but oh well. Make sure we keep enough RP banked for a self-heal if need be. Spell.Cast("Death Coil", ret => !SpellManager.HasSpell("Rune Strike") && StyxWoW.Me.CurrentRunicPower >= 80), Spell.Cast("Death Coil", ret => !StyxWoW.Me.CurrentTarget.IsWithinMeleeRange), Spell.Cast("Rune Strike"), new Sequence( Spell.Cast("Death Strike", ret => DeathStrikeTimer.IsFinished), new Action(ret => DeathStrikeTimer.Reset())), Spell.Cast("Blood Boil"), Spell.Cast("Heart Strike"), Spell.Cast("Icy Touch"), Movement.CreateMoveToMeleeBehavior(true) )); }
public static Composite CreateAfflictionCombat() { PetManager.WantedPet = "Felhunter"; return(new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Spell.WaitForCast(true), Helpers.Common.CreateAutoAttack(true), Helpers.Common.CreateInterruptSpellCast(ret => StyxWoW.Me.CurrentTarget), // Emergencies new Decorator( ret => StyxWoW.Me.HealthPercent < 20, new PrioritySelector( //Spell.Buff("Fear", ret => !Me.CurrentTarget.HasAura("Fear")), Spell.Cast("Howl of Terror", ret => StyxWoW.Me.CurrentTarget.Distance < 10 && StyxWoW.Me.CurrentTarget.IsPlayer), Spell.Cast( "Death Coil", ret => !StyxWoW.Me.CurrentTarget.HasAura("Howl of Terror") && !StyxWoW.Me.CurrentTarget.HasAura("Fear")), Spell.BuffSelf("Soulburn", ret => StyxWoW.Me.CurrentSoulShards > 0), Spell.Cast("Drain Life") )), Spell.Cast("Life Tap", ret => StyxWoW.Me.ManaPercent < 10), Spell.Cast("Health Funnel", ret => StyxWoW.Me.GotAlivePet && PetManager.PetTimer.IsFinished && StyxWoW.Me.Pet.HealthPercent < 30), // Finishing sequence Spell.Cast( "Soul Swap", ret => !StyxWoW.Me.HasAura("Soul Swap") && StyxWoW.Me.CurrentTarget.HealthPercent < 10 && StyxWoW.Me.CurrentTarget.HasAura("Unstable Affliction") && !StyxWoW.Me.CurrentTarget.IsBoss()), Spell.Cast("Drain Soul", ret => StyxWoW.Me.CurrentTarget.HealthPercent < 10), // Elites new Decorator( ret => StyxWoW.Me.CurrentTarget.IsBoss(), new PrioritySelector( Spell.BuffSelf("Demon Soul"), Spell.Buff("Curse of Elements", ret => !StyxWoW.Me.CurrentTarget.HasAura("Curse of Elements")), new Decorator( ret => SpellManager.CanCast("Summon Infernal"), new Action( ret => { SpellManager.Cast("Summon Infernal"); LegacySpellManager.ClickRemoteLocation(StyxWoW.Me.CurrentTarget.Location); })) )), // AoE new Decorator( ret => Unit.NearbyUnfriendlyUnits.Count(u => u.Distance < 15) >= 5, new PrioritySelector( Spell.BuffSelf("Demon Soul"), Spell.BuffSelf( "Soulburn", ret => !StyxWoW.Me.CurrentTarget.HasAura("Seed of Corruption") && StyxWoW.Me.CurrentSoulShards > 0 && TalentManager.GetCount(1, 15) == 1), Spell.Buff("Seed of Corruption", ret => !StyxWoW.Me.CurrentTarget.HasAura("Seed of Corruption")) )), // Standard Nuking Spell.Cast("Shadow Bolt", ret => StyxWoW.Me.HasAura("Shadow Trance")), Spell.Cast("Haunt"), Spell.Cast("Soul Swap", ret => StyxWoW.Me.HasAura("Soul Swap") && StyxWoW.Me.CurrentTarget.HealthPercent > 10), Spell.Buff("Bane of Doom", ret => StyxWoW.Me.CurrentTarget.IsBoss() && !StyxWoW.Me.CurrentTarget.HasAura("Bane of Doom")), Spell.Buff( "Bane of Agony", ret => !StyxWoW.Me.CurrentTarget.HasAura("Bane of Agony") && !StyxWoW.Me.CurrentTarget.HasAura("Bane of Doom")), Spell.Buff( "Corruption", ret => !StyxWoW.Me.CurrentTarget.HasAura("Corruption") && !StyxWoW.Me.CurrentTarget.HasAura("Seed of Corruption")), Spell.Buff("Unstable Affliction", ret => StyxWoW.Me.CurrentTarget.GetAuraTimeLeft("Unstable Affliction", true).TotalSeconds < 2), Spell.Cast("Drain Soul", ret => StyxWoW.Me.CurrentTarget.HealthPercent < 25), Spell.Cast("Shadowflame", ret => StyxWoW.Me.CurrentTarget.Distance < 5), Spell.BuffSelf("Demon Soul"), Spell.Buff("Curse of the Elements", ret => !StyxWoW.Me.CurrentTarget.IsPlayer), Spell.Buff("Curse of Weakness", ret => StyxWoW.Me.CurrentTarget.IsPlayer && !StyxWoW.Me.CurrentTarget.HasAura("Curse of Weakness")), Spell.Cast("Life Tap", ret => StyxWoW.Me.ManaPercent < 50 && StyxWoW.Me.HealthPercent > 70), Spell.Cast("Drain Life", ret => StyxWoW.Me.HealthPercent < 70), Spell.Cast("Health Funnel", ret => StyxWoW.Me.GotAlivePet && PetManager.PetTimer.IsFinished && StyxWoW.Me.Pet.HealthPercent < 70), Spell.Cast("Shadow Bolt"), Spell.Cast("Fel Flame", ret => StyxWoW.Me.IsMoving), Movement.CreateMoveToTargetBehavior(true, 35f) )); }