//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))); }