public static Composite CreateMageFireInstancePullAndCombat() { 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.IsSelected(13))), Spell.CastOnGround("Blast Wave", ret => Clusters.GetBestUnitForCluster(Unit.NearbyUnitsInCombatWithMe, ClusterType.Radius, 8f).Location), Spell.Cast("Dragon's Breath", ret => Clusters.GetClusterCount(StyxWoW.Me, Unit.NearbyUnitsInCombatWithMe, ClusterType.Cone, 15f) >= 3), Spell.CastOnGround("Flamestrike", ret => Clusters.GetBestUnitForCluster(Unit.NearbyUnitsInCombatWithMe, 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.NearbyUnitsInCombatWithMe, ClusterType.Radius, 8f).Location) < o.Radius)) )), Spell.BuffSelf("Time Warp", ret => !StyxWoW.Me.GroupInfo.IsInRaid && StyxWoW.Me.CurrentTarget.HealthPercent > 20 && StyxWoW.Me.CurrentTarget.IsBoss() && !StyxWoW.Me.HasAura("Temporal Displacement")), // Rotation Spell.Cast("Frostfire Bolt", ret => StyxWoW.Me.CurrentTarget.IsImmune(WoWSpellSchool.Fire)), Spell.Cast("Living Bomb", ret => !StyxWoW.Me.CurrentTarget.HasAura("Living Bomb") || (StyxWoW.Me.CurrentTarget.HasAura("Living Bomb") && StyxWoW.Me.CurrentTarget.GetAuraTimeLeft("Living Bomb", true).TotalSeconds <= 2)), Spell.Cast("Inferno Blast", ret => StyxWoW.Me.HasAura("Heating Up")), Spell.Cast("Frost Bomb", ret => Unit.UnfriendlyUnitsNearTarget(10f).Count() >= 1), Spell.Cast("Combustion", ret => StyxWoW.Me.CurrentTarget.HasMyAura("Ignite") && StyxWoW.Me.CurrentTarget.HasMyAura("Pyroblast")), Spell.Cast("Pyroblast", ret => StyxWoW.Me.ActiveAuras.ContainsKey("Pyroblast!")), Spell.Cast("Fireball", ret => !SpellManager.HasSpell("Scorch")), Spell.Cast("Frostfire bolt", ret => !SpellManager.HasSpell("Fireball")), Spell.Cast("Scorch"), Movement.CreateMoveToTargetBehavior(true, 39f) )); }
public static Composite CreatePaladinHolyCombatBehavior() { return (new PrioritySelector( Spell.Buff("Judgment", ret => SpellManager.HasSpell("Judgment") && StyxWoW.Me.GotTarget && StyxWoW.Me.CurrentTarget.Distance <= SpellManager.Spells["Judgment"].MaxRange - 2 && StyxWoW.Me.CurrentTarget.InLineOfSpellSight && StyxWoW.Me.IsSafelyFacing(StyxWoW.Me.CurrentTarget)), new Decorator( ret => Unit.NearbyFriendlyPlayers.Count(u => u.IsInMyPartyOrRaid) == 0, new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Helpers.Common.CreateAutoAttack(true), Helpers.Common.CreateInterruptSpellCast(ret => StyxWoW.Me.CurrentTarget), Spell.Buff("Judgment"), Spell.Cast("Hammer of Wrath"), Spell.Cast("Holy Shock"), Spell.Cast("Crusader Strike"), Spell.Cast("Denounce"), Movement.CreateMoveToTargetBehavior(true, 5f) )) )); }
public static Composite CreateFeralInstanceCombat() { return(new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Spell.WaitForCast(), Helpers.Common.CreateAutoAttack(true), Helpers.Common.CreateInterruptSpellCast(ret => StyxWoW.Me.CurrentTarget), new Decorator( ret => !Group.Tanks.Any() && !Group.Healers.Any(), new PrioritySelector( new Decorator( ret => SingularSettings.Instance.Druid.ManualFeralForm == FeralForm.None && StyxWoW.Me.CurrentMap.IsDungeon, new Action(ret => Logger.Write("Singular can't decide which form to use since there is no roles set in your raid. Please set ManualFeralForm setting to your desired form from Class Config"))), new Decorator( ret => SingularSettings.Instance.Druid.ManualFeralForm == FeralForm.Cat || !StyxWoW.Me.CurrentMap.IsDungeon, CreateFeralCatInstanceCombat()), CreateFeralBearInstanceCombat() )), new Decorator( ret => !Group.MeIsTank && Group.Tanks.Any(t => t.IsAlive), CreateFeralCatInstanceCombat()), CreateFeralBearInstanceCombat() )); }
public static Composite CreateDiscCombatComposite() { return(new PrioritySelector( new Decorator( ret => !Unit.NearbyGroupMembers.Any(), new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Helpers.Common.CreateInterruptSpellCast(ret => StyxWoW.Me.CurrentTarget), Spell.Cast("Mindbender"), Spell.Cast("Shadowfiend", ret => StyxWoW.Me.ManaPercent < 50), //Spell.Cast("Archangel", ret => StyxWoW.Me.HasAura("Evangelism", 5)), Spell.Cast("Shadow Word: Death", ret => StyxWoW.Me.CurrentTarget.HealthPercent <= 20), Spell.Buff("Shadow Word: Pain", true), Spell.Cast("Penance"), Spell.Cast("Holy Fire"), Spell.Cast("Smite", ret => !SpellManager.HasSpell("Power Word: Solace") || StyxWoW.Me.ManaPercent >= 10), Spell.Cast("Power Word: Solace", ret => StyxWoW.Me.ManaPercent < 10), //Spell.Cast("Mind Spike", ret => !SpellManager.HasSpell("Power Word: Solace")), Movement.CreateMoveToTargetBehavior(true, 30) )) )); }
public static Composite CreateBeastMasterHunterInstancePullAndCombat() { 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()), 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("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")), Spell.BuffSelf("Fervor", ret => StyxWoW.Me.FocusPercent <= 50 && (!StyxWoW.Me.GotAlivePet || StyxWoW.Me.Pet.FocusPercent <= 50)), Spell.BuffSelf("Bestial Wrath", ret => StyxWoW.Me.GotAlivePet && (!SpellManager.HasSpell("Kill Command") || SpellManager.Spells["Kill Command"].CooldownTimeLeft.TotalSeconds < 2)), new Decorator( ret => Unit.UnfriendlyUnitsNearTarget(10f).Count() >= 3, new PrioritySelector( Common.CreateHunterTrapBehavior("Explosive Trap"), Spell.Cast("Multi Shot"), Spell.Cast("Cobra Shot"), Spell.Cast("Steady Shot"), Movement.CreateMoveToTargetBehavior(true, 35f) ) ), // Rotation Spell.Buff("Serpent Sting", true), Spell.Cast("Kill Command", ret => StyxWoW.Me.GotAlivePet && StyxWoW.Me.Pet.Location.Distance(StyxWoW.Me.CurrentTarget.Location) < Spell.MeleeRange), Spell.Cast("Kill Shot"), Spell.Cast("Focus Fire", ret => StyxWoW.Me.GotAlivePet && !StyxWoW.Me.HasAura("The Beast Within") && StyxWoW.Me.Pet.HasAura("Frenzy Effect", 5)), Spell.Cast("Arcane Shot", ret => StyxWoW.Me.FocusPercent > 40), Spell.Cast("Cobra Shot"), Spell.Cast("Steady Shot", ret => !SpellManager.HasSpell("Cobra Shot")), Movement.CreateMoveToTargetBehavior(true, 35f) )); }
public static Composite CreateLowbieWarlockCombat() { return(new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Helpers.Common.CreateAutoAttack(false), Spell.WaitForCast(true), new Decorator( ret => !Spell.IsGlobalCooldown(), new PrioritySelector( Helpers.Common.CreateInterruptSpellCast(ret => StyxWoW.Me.CurrentTarget), // Spell.PreventDoubleCast("Immolate"), Spell.Cast("Life Tap", ret => StyxWoW.Me.ManaPercent < 50 && StyxWoW.Me.HealthPercent > 70), Spell.Cast("Drain Life", ret => StyxWoW.Me.HealthPercent < 70), Spell.Buff("Immolate"), Spell.Buff("Corruption"), Spell.Cast("Shadow Bolt") ) ), Movement.CreateMoveToTargetBehavior(true, 35f) )); }
public static Composite CreateRogueCombatPull() { return(new PrioritySelector( Common.CreateRogueDismount("Pulling"), Common.CreateRoguePullBuffs(), // needed because some Bots not calling this behavior Safers.EnsureTarget(), Common.CreateRoguePullSkipNonPickPocketableMob(), Common.CreateRogueControlNearbyEnemyBehavior(), Common.CreateRogueMoveBehindTarget(), Common.RogueEnsureReadyToAttackFromMelee(), Spell.WaitForCastOrChannel(), new Decorator( ret => !Spell.IsGlobalCooldown() && Me.GotTarget() && Me.IsSafelyFacing(Me.CurrentTarget), new PrioritySelector( CreateCombatDiagnosticOutputBehavior("Pull"), Common.CreateRoguePullPickPocketButDontAttack(), Common.CreateRogueOpenerBehavior(), Common.CreatePullMobMovingAwayFromMe(), Common.CreateAttackFlyingOrUnreachableMobs(), // ok, everything else failed so just hit him!!!! Spell.Buff("Revealing Strike", req => true), Spell.Cast("Pistol Shot") ) ) )); }
public static Composite CreateProtectionPaladinCombat() { return(new PrioritySelector( ctx => TankManager.Instance.FirstUnit ?? StyxWoW.Me.CurrentTarget, Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Helpers.Common.CreateAutoAttack(true), Helpers.Common.CreateInterruptSpellCast(ret => (WoWUnit)ret), // Seal twisting. If our mana gets stupid low, just throw on insight to get some mana back quickly, then put our main seal back on. // This is Seal of Truth once we get it, Righteousness when we dont. Spell.BuffSelf("Seal of Insight", ret => StyxWoW.Me.ManaPercent < 5), Spell.BuffSelf("Seal of Truth", ret => StyxWoW.Me.ManaPercent >= 5), Spell.BuffSelf("Seal of Righteousness", ret => StyxWoW.Me.ManaPercent >= 5 && !SpellManager.HasSpell("Seal of Truth")), // Defensive Spell.BuffSelf("Hand of Freedom", ret => StyxWoW.Me.HasAuraWithMechanic(WoWSpellMechanic.Dazed, WoWSpellMechanic.Disoriented, WoWSpellMechanic.Frozen, WoWSpellMechanic.Incapacitated, WoWSpellMechanic.Rooted, WoWSpellMechanic.Slowed, WoWSpellMechanic.Snared)), Spell.BuffSelf("Divine Shield", ret => StyxWoW.Me.CurrentMap.IsBattleground && StyxWoW.Me.HealthPercent <= 20 && !StyxWoW.Me.HasAura("Forbearance")), Spell.Cast("Hand of Reckoning", ret => TankManager.Instance.NeedToTaunt.FirstOrDefault(), ret => StyxWoW.Me.IsInInstance), //Multi target new Decorator( ret => Unit.UnfriendlyUnitsNearTarget(8f).Count() >= 1, new PrioritySelector( Spell.Cast("Hammer of the Righteous"), Spell.Cast("Hammer of Justice", ctx => !StyxWoW.Me.IsInParty), Spell.Cast("Consecration", ret => Unit.NearbyUnfriendlyUnits.Count(u => u.Distance <= 8) >= 3 || StyxWoW.Me.CurrentTarget.IsBoss()), Spell.Cast("Holy Wrath"), Spell.Cast("Avenger's Shield", ret => !SingularSettings.Instance.Paladin.AvengersPullOnly), Spell.BuffSelf("Inquisition"), Spell.Cast("Shield of the Righteous", ret => StyxWoW.Me.CurrentHolyPower == 3), Spell.Cast("Judgement"), Spell.Cast("Crusader Strike"), Movement.CreateMoveToMeleeBehavior(true) )), //Single target Spell.Cast("Shield of the Righteous", ret => StyxWoW.Me.CurrentHolyPower == 3), Spell.Cast("Crusader Strike"), Spell.Cast("Hammer of Justice"), Spell.Cast("Judgement"), Spell.Cast("Hammer of Wrath", ret => ((WoWUnit)ret).HealthPercent <= 20), Spell.Cast("Avenger's Shield", ret => !SingularSettings.Instance.Paladin.AvengersPullOnly), // Don't waste mana on cons if its not a boss. Spell.Cast("Consecration", ret => Unit.NearbyUnfriendlyUnits.Count(u => u.Distance <= 8) >= 3 || StyxWoW.Me.CurrentTarget.IsBoss()), Spell.Cast("Holy Wrath"), Movement.CreateMoveToMeleeBehavior(true))); }
public static Composite CreateLowbieDeathKnightCombat() { return(new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Helpers.Common.CreateAutoAttack(true), Helpers.Common.CreateInterruptSpellCast(ret => StyxWoW.Me.CurrentTarget), new Sequence( Spell.Cast("Death Grip", ret => 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("Death Coil"), Spell.Buff("Icy Touch", true, "Frost Fever"), Spell.Buff("Plague Strike", true, "Blood Plague"), Spell.Cast("Blood Strike"), Spell.Cast("Icy Touch"), Spell.Cast("Plague Strike"), Movement.CreateMoveToMeleeBehavior(true) )); }
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 CreateLowbieDeathKnightCombat() { return(new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Helpers.Common.CreateAutoAttack(true), Helpers.Common.CreateInterruptSpellCast(ret => StyxWoW.Me.CurrentTarget), // Anti-magic shell - no cost and doesnt trigger GCD Spell.BuffSelf("Anti-Magic Shell", ret => Unit.NearbyUnfriendlyUnits.Any(u => (u.IsCasting || u.ChanneledCastingSpellId != 0) && u.CurrentTargetGuid == StyxWoW.Me.Guid)), new Sequence( Spell.Cast("Death Grip", ret => 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("Death Coil"), Spell.Buff("Icy Touch", true, "Frost Fever"), Spell.Buff("Plague Strike", true, "Blood Plague"), Spell.Cast("Blood Strike"), Spell.Cast("Icy Touch"), Spell.Cast("Plague Strike"), Movement.CreateMoveToMeleeBehavior(true) )); }
public static Composite CreatePriestShadowPvPPullAndCombat() { return(new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Spell.WaitForCast(true), Spell.BuffSelf("Shadow Form"), Helpers.Common.CreateInterruptSpellCast(ret => StyxWoW.Me.CurrentTarget), // Defensive stuff Spell.BuffSelf("Power Word: Shield", ret => !StyxWoW.Me.HasAura("Weakened Soul")), Spell.BuffSelf("Dispersion", ret => StyxWoW.Me.HealthPercent < 40), Spell.BuffSelf("Psychic Scream", ret => Unit.NearbyUnfriendlyUnits.Count(u => u.DistanceSqr < 10 * 10) >= 1), // Offensive Spell.Cast("Shadow Word: Death", ret => StyxWoW.Me.CurrentTarget.HealthPercent <= 20), // We don't want to dot targets below 40% hp to conserve mana. Mind Blast/Flay will kill them soon anyway Spell.Cast("Mind Blast", ret => StyxWoW.Me.GetCurrentPower(WoWPowerType.ShadowOrbs) < 3), Spell.Buff("Devouring Plague", true, ret => StyxWoW.Me.GetCurrentPower(WoWPowerType.ShadowOrbs) >= 3), Spell.Buff("Shadow Word: Pain", true, ret => StyxWoW.Me.CurrentTarget.Elite || StyxWoW.Me.CurrentTarget.HealthPercent > 30), Spell.Buff("Vampiric Touch", true, ret => StyxWoW.Me.CurrentTarget.Elite || StyxWoW.Me.CurrentTarget.HealthPercent > 30), Spell.Cast("Mindbender"), Spell.Cast("Power Infusion"), Spell.Cast("Mind Blast"), Spell.Cast("Shadowfiend", ret => StyxWoW.Me.ManaPercent <= SingularSettings.Instance.Priest.ShadowfiendMana && StyxWoW.Me.CurrentTarget.HealthPercent >= 60), // Mana check is for mana management. Don't mess with it Spell.Cast("Mind Flay", ret => StyxWoW.Me.ManaPercent >= SingularSettings.Instance.Priest.MindFlayMana), // Helpers.Common.CreateUseWand(ret => SingularSettings.Instance.Priest.UseWand), // we no longer have wands or shoot Movement.CreateMoveToTargetBehavior(true, 35f) )); }
public static Composite CreateArcaneMagePvPPullAndCombat() { return(new PrioritySelector( Safers.EnsureTarget(), Common.CreateStayAwayFromFrozenTargetsBehavior(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Spell.WaitForCast(true), // Defensive stuff new Decorator( ret => StyxWoW.Me.ActiveAuras.ContainsKey("Ice Block"), new ActionIdle()), Spell.BuffSelf("Ice Block", ret => StyxWoW.Me.HealthPercent < 10 && !StyxWoW.Me.ActiveAuras.ContainsKey("Hypothermia")), Spell.BuffSelf("Mana Shield", ret => StyxWoW.Me.HealthPercent <= 75), Spell.BuffSelf("Frost Nova", ret => Unit.NearbyUnfriendlyUnits.Any(u => u.Distance <= 11 && !u.HasAura("Frost Nova"))), Common.CreateMagePolymorphOnAddBehavior(), Spell.BuffSelf("Mana Shield", ret => StyxWoW.Me.ManaPercent < 30), Spell.BuffSelf("Evocation", ret => StyxWoW.Me.ManaPercent < 30 && (StyxWoW.Me.HasAura("Mana Shield") || !SpellManager.HasSpell("Mana Shield"))), Spell.BuffSelf("Arcane Power"), Spell.BuffSelf("Mirror Image"), Spell.BuffSelf("Flame Orb"), Spell.Cast("Arcane Missiles", ret => StyxWoW.Me.HasAura("Arcane Missiles!")), Spell.Cast("Arcane Barrage", ret => StyxWoW.Me.GetAuraByName("Arcane Charge") != null && StyxWoW.Me.GetAuraByName("Arcane Charge").StackCount >= 4), Spell.Cast("Frostfire Bolt", ret => !SpellManager.HasSpell("Arcane Blast")), Spell.Cast("Arcane Blast"), Movement.CreateMoveToTargetBehavior(true, 39f) )); }
public static Composite CreateArmsNormalPull() { return(new PrioritySelector( Safers.EnsureTarget(), Movement.CreateFaceTargetBehavior(), Movement.CreateMoveToLosBehavior(), Helpers.Common.CreateAutoAttack(false), Spell.WaitForCast(), //Dismount new Decorator(ret => StyxWoW.Me.Mounted, Helpers.Common.CreateDismount("Pulling")), //Shoot flying targets new Decorator( ret => StyxWoW.Me.CurrentTarget.IsFlying, new PrioritySelector( Spell.Cast("Heroic Throw"), Spell.Cast("Throw"), Movement.CreateMoveToTargetBehavior(true, 27f) )), //Buff up Spell.Cast(Common.SelectedShout), Common.CreateChargeBehavior(), // Move to Melee Movement.CreateMoveToMeleeBehavior(true) )); }
public static Composite CreateFeralNormalPull() { return(new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), new Decorator( ret => StyxWoW.Me.Level < 20, CreateFeralLevel1020Pull()), new Decorator( ret => StyxWoW.Me.Level < 46, CreateFeralLevel2046Pull()), Spell.BuffSelf("Cat Form"), Spell.BuffSelf("Prowl", ret => StyxWoW.Me.CurrentTarget.DistanceSqr < 30 * 30), Spell.Cast("Feral Charge (Cat)"), Spell.Cast("Dash", ret => StyxWoW.Me.CurrentTarget.Distance > Spell.MeleeRange + 2f && !StyxWoW.Me.HasAura("Stampeding Roar") && (!SpellManager.HasSpell("Feral Charge (Cat)") || SpellManager.Spells["Feral Charge (Cat)"].CooldownTimeLeft.TotalSeconds >= 3)), Spell.BuffSelf("Stampeding Roar (Cat)", ret => StyxWoW.Me.CurrentTarget.Distance > Spell.MeleeRange + 2f && !StyxWoW.Me.HasAura("Dash") && (!SpellManager.HasSpell("Feral Charge (Cat)") || SpellManager.Spells["Feral Charge (Cat)"].CooldownTimeLeft.TotalSeconds >= 3)), Spell.Cast("Pounce"), Spell.Cast("Shred", ret => StyxWoW.Me.CurrentTarget.MeIsBehind), Spell.Cast("Mangle (Cat)"), Spell.Cast("Moonfire", ret => StyxWoW.Me.CurrentTarget.Distance2DSqr < 10 * 10 && Math.Abs(StyxWoW.Me.CurrentTarget.Z - StyxWoW.Me.Z) > 5), Movement.CreateMoveToMeleeBehavior(true) )); }
public static Composite CreateSubtletyRogueInstancePull() { return(new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Spell.BuffSelf("Stealth"), // Garrote if we can, SS is kinda meh as an opener. Spell.Cast("Premeditation", ret => StyxWoW.Me.ComboPoints <= 3), Spell.Cast("Shadowstep"), Spell.Cast("Garrote", ret => StyxWoW.Me.CurrentTarget.MeIsBehind && !StyxWoW.Me.HasAura("Vanish")), Spell.Cast("Ambush", ret => (!SpellManager.HasSpell("Garrote") || StyxWoW.Me.HasAura("Vanish")) && StyxWoW.Me.CurrentTarget.MeIsBehind), Spell.Cast("Cheap Shot", ret => !StyxWoW.Me.CurrentTarget.MeIsBehind), Spell.Cast("Hemorrhage", ret => !SpellManager.HasSpell("Cheap Shot") && !StyxWoW.Me.CurrentTarget.MeIsBehind), Spell.Cast("Sinister Strike", ret => !SpellManager.HasSpell("Hemorrhage")), new Decorator( ret => StyxWoW.Me.CurrentTarget.IsFlying || StyxWoW.Me.CurrentTarget.Distance2DSqr < 5 * 5 && Math.Abs(StyxWoW.Me.Z - StyxWoW.Me.CurrentTarget.Z) >= 5, new PrioritySelector( Spell.Cast("Throw", ret => Item.RangedIsType(WoWItemWeaponClass.Thrown)), Spell.Cast("Shoot", ret => Item.RangedIsType(WoWItemWeaponClass.Bow) || Item.RangedIsType(WoWItemWeaponClass.Gun)), Spell.Cast("Stealth", ret => StyxWoW.Me.HasAura("Stealth")) )), Movement.CreateMoveToMeleeBehavior(true) )); }
public static Composite CreateHolyPaladinCombatBehavior() { return (new PrioritySelector( Safers.EnsureTarget(), Spell.Buff("Judgement", ret => SpellManager.HasSpell("Judgement") && StyxWoW.Me.CurrentTarget.Distance <= SpellManager.Spells["Judgement"].MaxRange - 2 && StyxWoW.Me.CurrentTarget.InLineOfSpellSight && StyxWoW.Me.IsSafelyFacing(StyxWoW.Me.CurrentTarget)), new Decorator( ret => Battlegrounds.IsInsideBattleground || (!StyxWoW.Me.IsInParty && !StyxWoW.Me.IsInRaid), new PrioritySelector( Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Helpers.Common.CreateAutoAttack(true), Helpers.Common.CreateInterruptSpellCast(ret => StyxWoW.Me.CurrentTarget), Spell.Buff("Judgement"), Spell.Cast("Hammer of Wrath"), Spell.Cast("Holy Shock"), Spell.Cast("Crusader Strike"), Spell.Cast("Exorcism"), Spell.Cast("Holy Wrath"), Spell.Cast("Consecration"), Movement.CreateMoveToTargetBehavior(true, 5f) )) )); }
public static Composite CreateAssaRogueNormalPull() { return(new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Spell.BuffSelf("Sprint", ret => StyxWoW.Me.IsMoving && StyxWoW.Me.HasAura("Stealth")), Spell.BuffSelf("Stealth"), // Garrote if we can, SS is kinda meh as an opener. Spell.Cast("Garrote", ret => StyxWoW.Me.CurrentTarget.MeIsBehind), Spell.Cast("Cheap Shot", ret => !SpellManager.HasSpell("Garrote") || !StyxWoW.Me.CurrentTarget.MeIsBehind), Spell.Cast("Ambush", ret => !SpellManager.HasSpell("Cheap Shot") && StyxWoW.Me.CurrentTarget.MeIsBehind), Spell.Cast("Mutilate", ret => !SpellManager.HasSpell("Cheap Shot") && !StyxWoW.Me.CurrentTarget.MeIsBehind), new Decorator( ret => StyxWoW.Me.CurrentTarget.IsFlying || StyxWoW.Me.CurrentTarget.Distance2DSqr < 5 * 5 && Math.Abs(StyxWoW.Me.Z - StyxWoW.Me.CurrentTarget.Z) >= 5, new PrioritySelector( Spell.Cast("Throw", ret => Item.RangedIsType(WoWItemWeaponClass.Thrown)), Spell.Cast("Shoot", ret => Item.RangedIsType(WoWItemWeaponClass.Bow) || Item.RangedIsType(WoWItemWeaponClass.Gun)), Spell.Cast("Stealth", ret => StyxWoW.Me.HasAura("Stealth")) )), Movement.CreateMoveToMeleeBehavior(true) )); }
public static Composite CreateRogueSubtletyNormalPull() { return(new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Spell.BuffSelf("Stealth"), // Garrote if we can, SS is kinda meh as an opener. Spell.Cast("Premeditation"), Spell.Cast("Shadowstep"), Spell.Cast("Garrote", ret => StyxWoW.Me.CurrentTarget.MeIsBehind), Spell.Cast("Ambush", ret => !SpellManager.HasSpell("Garrote") && StyxWoW.Me.CurrentTarget.MeIsBehind), Spell.Cast("Cheap Shot", ret => !StyxWoW.Me.CurrentTarget.MeIsBehind), Spell.Cast("Hemorrhage", ret => !SpellManager.HasSpell("Cheap Shot") && !StyxWoW.Me.CurrentTarget.MeIsBehind), Spell.Cast("Sinister Strike", ret => !SpellManager.HasSpell("Hemorrhage")), new Decorator( ret => StyxWoW.Me.CurrentTarget.IsFlying || StyxWoW.Me.CurrentTarget.Distance2DSqr < 5 * 5 && Math.Abs(StyxWoW.Me.Z - StyxWoW.Me.CurrentTarget.Z) >= 5, new PrioritySelector( Spell.Cast("Deadly Throw", ret => SpellManager.HasSpell("Deadly Throw")), Spell.Cast("Throw"), Spell.Cast("Stealth", ret => StyxWoW.Me.HasAura("Stealth")) )), Movement.CreateMoveToMeleeBehavior(true) )); }
public static Composite CreateShamanEnhancementNormalPull() { return(new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Spell.WaitForCast(true), Common.CreateShamanImbueMainHandBehavior(Imbue.Windfury, Imbue.Flametongue), Common.CreateShamanImbueOffHandBehavior(Imbue.Flametongue), Spell.BuffSelf("Lightning Shield"), new Decorator( ret => StyxWoW.Me.Level < 20, new PrioritySelector( Spell.Cast("Lightning Bolt"), Movement.CreateMoveToTargetBehavior(true, 35f) )), Helpers.Common.CreateAutoAttack(true), new Decorator(ret => StyxWoW.Me.CurrentTarget.DistanceSqr < 20 * 20, Totems.CreateTotemsNormalBehavior()), Spell.Cast("Lightning Bolt", ret => StyxWoW.Me.HasAura("Maelstrom Weapon", 5)), Spell.Cast("Unleash Weapon", ret => StyxWoW.Me.Inventory.Equipped.OffHand != null && StyxWoW.Me.Inventory.Equipped.OffHand.TemporaryEnchantment.Id == 5), Spell.Cast("Earth Shock"), Movement.CreateMoveToMeleeBehavior(true) )); }
public static Composite CreateLowbieWarriorCombat() { return(new PrioritySelector( // Ensure Target Safers.EnsureTarget(), // LOS Check Movement.CreateMoveToLosBehavior(), // face target Movement.CreateFaceTargetBehavior(), // Auto Attack Common.CreateAutoAttack(false), Helpers.Common.CreateInterruptSpellCast(ret => StyxWoW.Me.CurrentTarget), // Heal Spell.Cast("Victory Rush"), //rend Spell.Buff("Rend"), // AOE new Decorator( ret => Clusters.GetClusterCount(StyxWoW.Me, Unit.NearbyUnfriendlyUnits, ClusterType.Radius, 6f) >= 2, new PrioritySelector( Spell.Cast("Victory Rush", ret => StyxWoW.Me.HealthPercent < 80), Spell.Cast("Thunder Clap"), Spell.Cast("Strike"))), // DPS Spell.Cast("Strike"), Spell.Cast("Thunder Clap", ret => StyxWoW.Me.RagePercent > 50), //move to melee Movement.CreateMoveToTargetBehavior(true, 5f) )); }
public static Composite CreateEnhancementShamanNormalPull() { return(new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Spell.WaitForCast(true), Spell.Cast("Lightning Shield", ret => StyxWoW.Me, ret => !StyxWoW.Me.HasAura("Lightning Shield", 2)), new Decorator( ret => StyxWoW.Me.Level < 20, new PrioritySelector( new Decorator( ret => StyxWoW.Me.CurrentTarget.DistanceSqr < 40 * 40, Totems.CreateSetTotems()), Spell.Cast("Lightning Bolt"), Movement.CreateMoveToTargetBehavior(true, 35f) )), Common.CreateAutoAttack(true), new Decorator( ret => StyxWoW.Me.CurrentTarget.DistanceSqr < 20 * 20, Totems.CreateSetTotems()), Spell.Cast("Earth Shock"), Movement.CreateMoveToMeleeBehavior(true) )); }
public static Composite CreateAssaRoguePull() { return(new PrioritySelector( Common.CreateRogueDismount("Pulling"), Common.CreateRoguePullBuffs(), // needed because some Bots not calling this behavior Safers.EnsureTarget(), Common.CreateRoguePullSkipNonPickPocketableMob(), Common.CreateRogueControlNearbyEnemyBehavior(), Common.CreateRogueMoveBehindTarget(), Common.RogueEnsureReadyToAttackFromMelee(), Spell.WaitForCastOrChannel(), new Decorator( ret => !Spell.IsGlobalCooldown() && Me.GotTarget() && Me.IsSafelyFacing(Me.CurrentTarget), new PrioritySelector( new Action(ret => { Me.CurrentTarget.TimeToDeath(); return RunStatus.Failure; }), CreateAssaDiagnosticOutputBehavior("Pull"), Common.CreateRoguePullPickPocketButDontAttack(), Common.CreateRogueOpenerBehavior(), Common.CreatePullMobMovingAwayFromMe(), Common.CreateAttackFlyingOrUnreachableMobs(), Spell.Cast("Mutilate", req => Common.HasTwoDaggers), AssaCastSinisterStrike() ) ) )); }
public static Composite CreateMistweaverMonkCombatBehavior() { return(new PrioritySelector( CreateMistweaverMonkHealing(false) #if NOTYET , new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Helpers.Common.CreateAutoAttack(true), Common.CastLikeMonk("Blackout Kick", ret => Me.CurrentChi >= 2 && (!Me.HasAura("Serpent's Zeal", 2) || Me.GetAuraTimeLeft("Serpent's Zeal", true).TotalSeconds < 5)), Common.CastLikeMonk("Tiger Palm", ret => Me.CurrentChi >= 1 && (!Me.HasAura("Vital Mists", 5) || Me.GetAuraTimeLeft("Vital Mists", true).TotalSeconds < 5)), Common.CastLikeMonk("Expel Harm", ret => Me, ret => Me.HealthPercent < 90 && Me.CurrentChi < Me.MaxChi), Common.CastLikeMonk("Jab", ret => Me.CurrentChi < Me.MaxChi), new Decorator(ret => !Me.IsCasting, new PrioritySelector( Common.CastLikeMonk("Roll", ret => Me.CurrentTarget.Distance >= 10 && Me.CurrentTarget.Distance <= 25), Movement.CreateMoveToMeleeBehavior(true) ) ) ) #endif )); }
public static Composite CreateShadowPriestPvPPullAndCombat() { return(new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Spell.WaitForCast(true), Spell.BuffSelf("Shadow Form"), Helpers.Common.CreateInterruptSpellCast(ret => StyxWoW.Me.CurrentTarget), // Defensive stuff Spell.BuffSelf("Power Word: Shield", ret => !StyxWoW.Me.HasAura("Weakened Soul")), Spell.BuffSelf("Dispersion", ret => StyxWoW.Me.HealthPercent < 40), Spell.BuffSelf("Psychic Scream", ret => Unit.NearbyUnfriendlyUnits.Count(u => u.DistanceSqr < 10 * 10) >= 1), // Offensive Spell.Buff("Shadow Word: Pain", true), Spell.Cast("Mind Blast", ret => StyxWoW.Me.HasAura("Shadow Orb")), Spell.Buff("Vampiric Touch", true), Spell.Buff("Devouring Plague", true), Spell.Cast("Mind Blast"), Spell.Cast("Shadow Word: Death", ret => StyxWoW.Me.CurrentTarget.HealthPercent <= 25), Spell.BuffSelf("Archangel"), Spell.Cast("Shadowfiend"), Spell.Cast("Mind Flay"), Movement.CreateMoveToTargetBehavior(true, 35f) )); }
public static Composite CreateRogueSubtletyNormalPull() { return(new PrioritySelector( Common.CreateRogueDismount("Pulling"), Common.CreateRoguePullBuffs(), // needed because some Bots not calling this behavior Safers.EnsureTarget(), Common.CreateRoguePullSkipNonPickPocketableMob(), Common.CreateRogueControlNearbyEnemyBehavior(), Common.CreateRogueMoveBehindTarget(), Common.RogueEnsureReadyToAttackFromMelee(), Spell.WaitForCastOrChannel(), new Decorator( ret => !Spell.IsGlobalCooldown() && Me.GotTarget() && Me.IsSafelyFacing(Me.CurrentTarget), new PrioritySelector( CreateSubteltyDiagnosticOutputBehavior("Pull"), Common.CreateRoguePullPickPocketButDontAttack(), Common.CreateRogueOpenerBehavior(), Common.CreatePullMobMovingAwayFromMe(), Common.CreateAttackFlyingOrUnreachableMobs(), // ok, everything else failed so just hit him!!!! Spell.HandleOffGCD(Spell.Buff("Premeditation", req => Common.AreStealthAbilitiesAvailable && Me.ComboPoints < 4 && Me.CurrentTarget.IsWithinMeleeRange)) ) ) )); }
public static Composite CreateLowbieDruidCombat() { return(new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), // Make sure we're in cat form first, period. Spell.BuffSelf("Cat Form"), Helpers.Common.CreateInterruptSpellCast(ret => StyxWoW.Me.CurrentTarget), //Healing if needed in combat Spell.BuffSelf("Rejuvenation", ret => StyxWoW.Me.HealthPercent <= 60), Helpers.Common.CreateAutoAttack(true), new Decorator( ret => StyxWoW.Me.HasAura("Cat Form"), new PrioritySelector( Spell.Buff("Rake", true), Spell.Cast("Ferocious Bite", ret => StyxWoW.Me.ComboPoints > 4 || StyxWoW.Me.ComboPoints > 1 && StyxWoW.Me.CurrentTarget.HealthPercent < 40), Spell.Cast("Mangle"), Movement.CreateMoveToMeleeBehavior(true))), //Pre Cat spells Spell.Buff("Moonfire"), Spell.Cast("Wrath"), Movement.CreateMoveToTargetBehavior(true, 30f) )); }
public static Composite CreateFeralPvPPull() { return(new PrioritySelector( Safers.EnsureTarget(), Spell.BuffSelf("Cat Form"), Spell.BuffSelf("Prowl"), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Spell.WaitForCast(), Spell.Cast("Feral Charge (Cat)"), Spell.Cast("Dash", ret => StyxWoW.Me.CurrentTarget.Distance > Spell.MeleeRange + 2f && !StyxWoW.Me.HasAura("Stampeding Roar") && (!SpellManager.HasSpell("Feral Charge (Cat)") || SpellManager.Spells["Feral Charge (Cat)"].CooldownTimeLeft.TotalSeconds >= 3)), Spell.BuffSelf("Stampeding Roar (Cat)", ret => StyxWoW.Me.CurrentTarget.Distance > Spell.MeleeRange + 2f && !StyxWoW.Me.HasAura("Dash") && (!SpellManager.HasSpell("Feral Charge (Cat)") || SpellManager.Spells["Feral Charge (Cat)"].CooldownTimeLeft.TotalSeconds >= 3)), //Spell.Cast("Ravage", ret => StyxWoW.Me.CurrentTarget.IsSitting), Spell.Cast("Pounce", ret => !StyxWoW.Me.CurrentTarget.IsStunned()), Spell.Cast("Ravage"), Movement.CreateMoveToMeleeBehavior(true) )); }
public static Composite CreateFeralNormalCombat() { return(new PrioritySelector( Safers.EnsureTarget(), Common.CreateNonRestoHeals(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Helpers.Common.CreateAutoAttack(true), Helpers.Common.CreateInterruptSpellCast(ret => StyxWoW.Me.CurrentTarget), new Decorator( ret => Unit.UnfriendlyUnitsNearTarget(8f).Count() >= 3, new PrioritySelector( Spell.Cast("Swipe (Cat)"), Spell.Cast("Mangle (Cat)") )), new Decorator( ret => StyxWoW.Me.Level < 86, CreateFeralCombat()), Movement.CreateMoveBehindTargetBehavior(), Spell.Cast("Shred", ret => StyxWoW.Me.CurrentTarget.MeIsBehind), Spell.Cast("Mangle (Cat)", ret => !StyxWoW.Me.CurrentTarget.MeIsBehind), Movement.CreateMoveToMeleeBehavior(true) )); }
public static Composite CreateRestoShamanCombatBehavior() { return (new PrioritySelector( new Decorator( ret => Unit.NearbyFriendlyPlayers.Count(u => u.IsInMyPartyOrRaid) == 0, new PrioritySelector( Safers.EnsureTarget(), Movement.CreateMoveToLosBehavior(), Movement.CreateFaceTargetBehavior(), Common.CreateInterruptSpellCast(ret => StyxWoW.Me.CurrentTarget), Spell.BuffSelf("Fire Elemental Totem", ret => (StyxWoW.Me.CurrentTarget.Elite || Unit.NearbyUnfriendlyUnits.Count(u => u.IsTargetingMeOrPet) >= 3) && !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.Cast("Earth Shock"), Spell.Cast("Lightning Bolt"), Movement.CreateMoveToTargetBehavior(true, 35f) )) )); }