Example #1
0
        //protected override bool ShouldBombardment(out TrinityActor target)
        //{
        //    target = null;

        //    if (!Skills.Crusader.Bombardment.CanCast())
        //        return false;

        //    target = TargetUtil.GetBestClusterUnit() ?? CurrentTarget;
        //    return target != null;
        //}

        protected override bool ShouldBombardment(out TrinityActor target)
        {
            target = null;
            if (!Skills.Crusader.Bombardment.CanCast())
            {
                return(false);
            }

            target = TargetUtil.GetBestClusterUnit() ?? CurrentTarget;

            //credit: noxiaz, fix for out of combat bombard
            if (target == null && Settings.BombardmentOOC)
            {
                // The check is needed becasue its normally only "ironskin" that decide when ever possible to cast bombardment or not.
                var isCastWindow = !ShouldWaitForConventionofElements(
                    Skills.Crusader.Bombardment,
                    Element.Physical,
                    1500,
                    1000);

                if (isCastWindow &&
                    !ShouldBombardWheneverPossible ||
                    ShouldBombardWheneverPossible)
                {
                    // Get the closest target possible
                    target = HostileMonsters.Where(x => x.Distance < 150f).OrderBy(x => x.Distance).FirstOrDefault();
                }
            }

            return(target != null);
        }
        public TrinityPower GetOffensivePower()
        {
            TrinityPower power;

            Core.Logger.Log(LogCategory.Routine, $"FanBuff={IsFanBuffReady} TrashCluster={IsFanTrashCluster} EliteCluster={IsFanEliteCluster} Element={IsLightningElement} Crit%={Player.CriticalChancePct}");

            if (Player.CurrentHealthPct < 0.2 && Skills.DemonHunter.FanOfKnives.CanCast())
            {
                Core.Logger.Log(LogCategory.Routine, "About to die...");
                return(FanOfKnives());
            }

            if (ShouldFan())
            {
                Core.Logger.Log(LogCategory.Routine, "Its time for the pain");

                // +15% dmg
                var isWolfBuffReady = !Skills.DemonHunter.Companion.IsActive || Skills.DemonHunter.Companion.IsBuffActive;
                if (!isWolfBuffReady && Skills.DemonHunter.Companion.CanCast())
                {
                    return(Companion());
                }

                // +40% dmg
                var isVengeanceReady = !Skills.DemonHunter.Vengeance.IsActive || Skills.DemonHunter.Vengeance.IsBuffActive;
                if (!isVengeanceReady && Skills.DemonHunter.Vengeance.CanCast())
                {
                    return(Vengeance());
                }

                //if (!Player.IsMaxCriticalChance)
                //{
                //    return Walk(TargetUtil.BestAoeUnit(100f, true));
                //}

                var clusterUnits = TargetUtil.GetBestClusterUnits().Where(u => u.IsElite || u.NearbyUnitsWithinDistance() > ClusterSize).Select(u => u.Position);
                var fanPosition  = TargetUtil.GetCentroid(clusterUnits);

                // If we cant get there, dont miss the opportunity.
                if (IsReallyBlocked && TimeFromElementStart(Element.Lightning) > 3000)
                {
                    Core.Logger.Log(LogCategory.Routine, "Deloying Blocked Fan");
                    return(FanOfKnives());
                }

                return(FanOfKnives(fanPosition));
            }

            if (!IsReallyBlocked)
            {
                var pullingUnit = HostileMonsters
                                  .Where(u => Math.Abs(u.HitPointsPct - 1) < float.Epsilon && (u.IsElite || u.NearbyUnitsWithinDistance(10f) > 3))
                                  .OrderByDescending(u => u.Distance).FirstOrDefault();

                if (pullingUnit != null)
                {
                    Core.Logger.Log(LogCategory.Routine, "Pulling units");
                    return(Walk(pullingUnit));
                }
            }

            if (IsBossFight && LordGreenStoneDamageStacks < 15)
            {
                Core.Logger.Log(LogCategory.Routine, "Attacking while waiting for fan");
                if (TryPrimaryPower(out power))
                {
                    return(power);
                }
            }

            if (LordGreenStoneDamageStacks < 28 || !IsLightningElement)
            {
                Core.Logger.Log(LogCategory.Routine, "Hanging out near fan position");
                return(Walk(TargetUtil.GetLoiterPosition(TargetUtil.BestAoeUnit(100f, true), 30f)));
            }

            Core.Logger.Log(LogCategory.Routine, "Moving to fan position");
            return(Walk(TargetUtil.BestAoeUnit(100f, true)));
        }