public static Composite CreateShadowHeal() { return(new PrioritySelector( Spell.BuffSelf("Power Word: Shield", ret => Me.HealthPercent < PriestSettings.PowerWordShield && !Me.HasAura("Weakened Soul")), Common.CreatePsychicScreamBehavior(), Spell.Cast( "Shadow Mend", ctx => Me, ret => { if (Me.HealthPercent > PriestSettings.ShadowHeal) { return false; } if (Unit.UnitsInCombatWithMeOrMyStuff(40).Any(u => !u.IsCrowdControlled())) { return false; } return true; } ) )); }
public static Composite CreateHolyHeal() { return(new PrioritySelector( CreateHolyDiagnosticOutputBehavior("HEAL"), HealerManager.CreateStayNearTankBehavior(), // Group heals new Decorator( ret => Unit.NearbyGroupMembers.Any(m => m.IsAlive && !m.IsMe), CreateHolyHealOnlyBehavior(false, true) ), // Solo heals new Decorator( ret => !Unit.NearbyGroupMembers.Any(m => m.IsAlive && !m.IsMe), new PrioritySelector( Spell.Cast("Desperate Prayer", ret => Me, ret => Me.Combat && Me.HealthPercent < PriestSettings.DesperatePrayerHealth), // keep heal buffs on if glyphed Spell.BuffSelf("Prayer of Mending", ret => Me.Combat && Me.HealthPercent <= 90), Spell.BuffSelf("Renew", ret => Me.Combat && Me.HealthPercent <= 95), Common.CreatePsychicScreamBehavior(), Spell.Cast("Flash Heal", ctx => Me, ret => Me.HealthPercent <= PriestSettings.ShadowHeal), Spell.Cast("Flash Heal", ctx => Me, ret => !Me.Combat && Me.PredictedHealthPercent(includeMyHeals: true) <= 90) ) ))); }
public static Composite CreatePriestShadowNormalCombat() { return(new PrioritySelector( Helpers.Common.EnsureReadyToAttackFromLongRange(), Spell.WaitForCastOrChannel(), CreateFightAssessment(), new Decorator( ret => !Spell.IsGlobalCooldown(), new PrioritySelector( SingularRoutine.MoveBehaviorInlineToCombat(BehaviorType.Heal), SingularRoutine.MoveBehaviorInlineToCombat(BehaviorType.CombatBuffs), Helpers.Common.CreateInterruptBehavior(), Movement.WaitForFacing(), Movement.WaitForLineOfSpellSight(), new Decorator( req => !Me.CurrentTarget.IsTrivial(), new PrioritySelector( Dispelling.CreatePurgeEnemyBehavior("Dispel Magic"), // Mana Management stuff - send in the fiends Common.CreateShadowfiendBehavior(), // Defensive stuff Spell.BuffSelf("Dispersion", ret => Me.ManaPercent < PriestSettings.DispersionMana || Me.HealthPercent < 40 || (Me.ManaPercent < SingularSettings.Instance.MinMana && Me.IsSwimming) || Unit.NearbyUnfriendlyUnits.Count(t => t.GotTarget() && t.CurrentTarget.IsTargetingMyStuff()) >= 3), Common.CreatePriestShackleUndeadAddBehavior(), Common.CreatePsychicScreamBehavior(), Spell.HandleOffGCD( new PrioritySelector( ctx => Me.CurrentTarget.TimeToDeath() > 15 || cntAoeTargets > 1, new Sequence( Spell.BuffSelfAndWait(sp => "Vampiric Embrace", req => ((bool)req) && Me.HealthPercent < PriestSettings.VampiricEmbracePct), Spell.BuffSelf("Power Infusion") ), Spell.Cast("Power Infusion", req => ((bool)req) || Me.HasAura("Vampiric Embrace")) ) ) ) ), // Shadow immune npcs. // Spell.Cast("Holy Fire", req => Me.CurrentTarget.IsImmune(WoWSpellSchool.Shadow)), // AoE Rotation new Decorator( ret => Spell.UseAOE && cntAoeTargets > 1, new PrioritySelector( ctx => AoeTargets.FirstOrDefault(u => Me.IsSafelyFacing(u) && u.InLineOfSpellSight), Spell.Cast("Void Eruption", when => !InVoidform), Spell.Cast( "Mind Sear", mov => true, on => { IEnumerable <WoWUnit> aoeTargetsFacing = AoeTargets.Where(u => Me.IsSafelyFacing(u) && u.InLineOfSpellSight && u.IsTrivial()); WoWUnit unit = Clusters.GetBestUnitForCluster(aoeTargetsFacing, ClusterType.Radius, 10); if (unit == null) { return null; } if (3 > Clusters.GetClusterCount(unit, AoeTargets, ClusterType.Radius, 10)) { return null; } if (Unit.UnfriendlyUnits(50).Any(u => !u.IsTrivial() && unit.SpellDistance(u) < 12)) { return null; } Logger.Write(LogColor.Hilite, "^Trivial Farming: all trivial mobs within 12 yds of {0}", unit.SafeName()); return unit; }, cancel => Me.HealthPercent < PriestSettings.ShadowHeal ), Spell.Buff("Shadow Word: Pain", true), // no multi message for current target Spell.Buff("Vampiric Touch", true), // no multi message for current target Spell.Buff( // multi-dot others w/ message "Vampiric Touch", true, on => { WoWUnit dotTarget = AoeTargets.FirstOrDefault(u => u != Me.CurrentTarget && !u.HasMyAura("Vampiric Touch") && u.InLineOfSpellSight && !Spell.DoubleCastContains(u, "Vampiric Touch")); if (dotTarget != null && Spell.CanCastHack("Vampiric Touch", dotTarget)) { Logger.Write(LogColor.Hilite, "^Multi-DoT: cast Vampiric Touch on {0}", dotTarget.SafeName()); return dotTarget; } return null; }, req => true ), Spell.Buff( // multi-dot others w/ message "Shadow Word: Pain", true, on => { WoWUnit dotTarget = AoeTargets.FirstOrDefault(u => u != Me.CurrentTarget && !u.HasMyAura("Shadow Word: Pain") && u.InLineOfSpellSight && !Spell.DoubleCastContains(u, "Shadow Word: Pain")); if (dotTarget != null && Spell.CanCastHack("Shadow Word: Pain", dotTarget)) { Logger.Write(LogColor.Hilite, "^Multi-DoT: cast Shadow Word: Pain on {0}", dotTarget.SafeName()); return dotTarget; } return null; }, req => true ), // When we enter void form, even if AOE, we use our single target rotation after maintaining debuffs. new Decorator(ret => InVoidform, CreateMaintainVoidformBehaviour()), // filler spell Spell.Cast( "Mind Sear", mov => true, on => { IEnumerable <WoWUnit> AoeTargetsFacing = AoeTargets.Where(u => Me.IsSafelyFacing(u) && u.InLineOfSpellSight); WoWUnit unit = Clusters.GetBestUnitForCluster(AoeTargetsFacing, ClusterType.Radius, 10); if (unit == null) { return null; } if (4 > Clusters.GetClusterCount(unit, AoeTargets, ClusterType.Radius, 10)) { return null; } return unit; }, cancel => Me.HealthPercent < PriestSettings.ShadowHeal ), CastMindFlay(on => (WoWUnit)on, req => cntAoeTargets < 4) ) ), new Decorator(ret => InVoidform, CreateMaintainVoidformBehaviour()), CreateBuildVoidformBehaviour() ) ) )); }