public static Composite WitchDoctorCombat() { return(new PrioritySelector(CtxChanger, new Decorator( ctx => ctx is CombatContext && ((CombatContext)ctx).CurrentTarget != null, new PrioritySelector( Common.CreateUsePotion(), Common.CreateWaitWhileFearedStunnedFrozenOrBlind(), Common.CreateGetHealthGlobe(), Common.CreateUseHealthWell(), Common.CreateWaitForAttack(), Kiting.CreateKitingBehavior(), // Make sure we are within range/line of sight of the unit. Movement.MoveTo(ctx => ((CombatContext)ctx).TargetPosition, BelphegorSettings.Instance.WitchDoctor.MaximumRange), new SelfCast(SNOPower.Witchdoctor_SpiritWalk, extra => ((CombatContext)extra).CurrentHealthPercentage <= BelphegorSettings.Instance.WitchDoctor.SpiritWalkHp), new SelfCast(SNOPower.Witchdoctor_Sacrifice, ctx => Minion.PetCount(((CombatContext)ctx), Pet.ZombieDogs) > 1 && ((CombatContext)ctx).CurrentHealthPercentage <= BelphegorSettings.Instance.WitchDoctor.SacrificeHp), new SelfCast(SNOPower.Witchdoctor_Hex), new SelfCast(SNOPower.Witchdoctor_SoulHarvest, ctx => Clusters.GetClusterCount(ZetaDia.Me, ((CombatContext)ctx), 16f) >= BelphegorSettings.Instance.WitchDoctor.SoulHarvestAoECount || (((CombatContext)ctx).CurrentTargetIsElite && ((CombatContext)ctx).TargetDistance < 16f)), new CastAtLocation(SNOPower.Witchdoctor_Piranhas, ctx => ((CombatContext)ctx).TargetPosition, ctx => ((CombatContext)ctx).CurrentTargetIsElite || Clusters.GetClusterCount(((CombatContext)ctx).CurrentTarget, ((CombatContext)ctx), 10f) >= BelphegorSettings.Instance.WitchDoctor.PiranhasAoECount), new SelfCast(SNOPower.Witchdoctor_BigBadVoodoo, ctx => Clusters.GetClusterCount( ((CombatContext)ctx).CurrentTarget, ((CombatContext)ctx), 40f) >= BelphegorSettings.Instance.WitchDoctor.BigBadVoodooAoECount || ((CombatContext)ctx).CurrentTargetIsElite), new SelfCast(SNOPower.Witchdoctor_FetishArmy, ctx => Clusters.GetClusterCount( ((CombatContext)ctx).CurrentTarget, ((CombatContext)ctx), 40f) >= BelphegorSettings.Instance.WitchDoctor.FetishArmyAoECount || ((CombatContext)ctx).CurrentTargetIsElite), new SelfCast(SNOPower.Witchdoctor_Horrify, extra => Clusters.GetClusterCount( ((CombatContext)extra).CurrentTarget, ((CombatContext)extra), 40f) >= BelphegorSettings.Instance.WitchDoctor.HorrifyAoECount), new CastOnUnit(SNOPower.Witchdoctor_MassConfusion, ctx => ((CombatContext)ctx).TargetGuid, extra => Clusters.GetClusterCount( ((CombatContext)extra).CurrentTarget, ((CombatContext)extra), 40f) >= BelphegorSettings.Instance.WitchDoctor. MassConfusionAoECount), new CastOnUnit(SNOPower.Witchdoctor_GraspOfTheDead, ctx => ((CombatContext)ctx).TargetGuid), new CastAtLocation(SNOPower.Witchdoctor_AcidCloud, ctx => ((CombatContext)ctx).TargetPosition, ctx => AcidTimer.IsFinished && Clusters.GetClusterCount( ((CombatContext)ctx).CurrentTarget, ((CombatContext)ctx), 18f) >= BelphegorSettings.Instance.WitchDoctor. AcidCloudAoECount, s => AcidTimer.Reset()), new CastAtLocation(SNOPower.Witchdoctor_Firebats, ctx => ((CombatContext)ctx).TargetPosition, extra => Clusters.GetClusterCount( ((CombatContext)extra).CurrentTarget, ((CombatContext)extra), 40f) >= BelphegorSettings.Instance.WitchDoctor. FirebatsAoECount), new CastAtLocation(SNOPower.Witchdoctor_WallOfZombies, ctx => ((CombatContext)ctx).TargetPosition, extra => Clusters.GetClusterCount( ((CombatContext)extra).CurrentTarget, ((CombatContext)extra), 40f) >= BelphegorSettings.Instance.WitchDoctor. WallOfZombiesAoECount), new CastOnUnit(SNOPower.Witchdoctor_Locust_Swarm, ctx => ((CombatContext)ctx).TargetGuid, ctx => LocustSwarmTimer.IsFinished && ((CombatContext)ctx).TargetDistance < 16 && ((CombatContext)ctx).CurrentTargetIsElite || Clusters.GetClusterCount( ((CombatContext)ctx).CurrentTarget, ((CombatContext)ctx), 20) >= BelphegorSettings.Instance.WitchDoctor. LocustSwarmAoECount, s => LocustSwarmTimer.Reset()), new CastOnUnit(SNOPower.Witchdoctor_Haunt, ctx => ((CombatContext)ctx).TargetGuid, extra => HauntTimer.IsFinished, s => HauntTimer.Reset()), //Other spells new CastOnUnit(SNOPower.Witchdoctor_SpiritBarrage, ctx => ((CombatContext)ctx).TargetGuid), new CastOnUnit(SNOPower.Witchdoctor_ZombieCharger, ctx => ((CombatContext)ctx).TargetGuid), //Primary new CastAtLocation(SNOPower.Witchdoctor_PlagueOfToads, ctx => ((CombatContext)ctx).TargetPosition), new CastAtLocation(SNOPower.Witchdoctor_CorpseSpider, ctx => ((CombatContext)ctx).TargetPosition), new CastOnUnit(SNOPower.Witchdoctor_Firebomb, ctx => ((CombatContext)ctx).TargetGuid), new CastOnUnit(SNOPower.Witchdoctor_PoisonDart, ctx => ((CombatContext)ctx).TargetGuid) ) ), new Action(ret => RunStatus.Success) )); }