protected override bool ShouldSevenSidedStrike(out TrinityActor target) { target = null; var skill = Skills.Monk.SevenSidedStrike; var nearbyUnitsWithEP = WeightedUnits.Any(u => u.Distance < 20f && HasEP(u)); //var nearbyUnitsWithGungdoEP = CurrentTarget.HasDebuff((SNOPower)455436); if (!skill.CanCast()) { return(false); } if (!TargetUtil.AnyMobsInRange(45f) && !CurrentTarget.IsTreasureGoblin) { return(false); } if (!nearbyUnitsWithEP && !Legendary.Madstone.IsEquipped) { return(false); } //if (!nearbyUnitsWithGungdoEP) // return false; target = TargetUtil.GetBestClusterUnit() ?? CurrentTarget; return(target != null); }
public TrinityPower GetOffensivePower() { TrinityActor target; TrinityPower power = null; Vector3 position; if (ShouldDashingStrike(out position)) { return(DashingStrike(position)); } if (ShouldCycloneStrike()) { return(CycloneStrike()); } if (ShouldSevenSidedStrike(out target)) { return(SevenSidedStrike(target)); } if (!WeightedUnits.Any(u => u.Distance < 20f && HasEP(u))) { return(GetExplodingPalmPrimary()); } return(GetPrimary()); }
protected bool IsReasonToUse(SkillSettings settings, Skill skill) { var routine = Core.Routines.CurrentRoutine; if (settings.Reasons.HasFlag(UseReasons.Elites) && TargetUtil.AnyElitesInRange(40f)) { return(true); } if (settings.Reasons.HasFlag(UseReasons.Trash) && TargetUtil.ClusterExists(routine.TrashRange, routine.TrashRange, routine.ClusterSize)) { return(true); } if (settings.Reasons.HasFlag(UseReasons.Surrounded) && TargetUtil.NumMobsInRange(25f) >= Math.Max(ClusterSize, 5)) { return(true); } if (settings.Reasons.HasFlag(UseReasons.Avoiding) && IsCurrentlyAvoiding) { return(true); } if (settings.Reasons.HasFlag(UseReasons.Blocked) && PlayerMover.IsBlocked) { return(true); } if (settings.Reasons.HasFlag(UseReasons.DumpResource) && Player.PrimaryResourcePct < 0.8f) { return(true); } if (settings.Reasons.HasFlag(UseReasons.Goblins) && WeightedUnits.Any(u => u.IsTreasureGoblin)) { return(true); } if (settings.Reasons.HasFlag(UseReasons.HealthEmergency) && Player.CurrentHealthPct < TrinityCombat.Routines.Current.EmergencyHealthPct) { return(true); } if (settings.Reasons.HasFlag(UseReasons.Buff) && settings.BuffCondition != null && settings.BuffCondition()) { return(true); } return(false); }
protected virtual bool ShouldSweepingWind() { if (!Skills.Monk.SweepingWind.CanCast()) { return(false); } var buffCooldownRemanining = Core.Cooldowns.GetBuffCooldownRemaining(SNOPower.Monk_SweepingWind); if (buffCooldownRemanining.TotalMilliseconds > 750) { return(false); } if (!WeightedUnits.Any(u => u.Distance < 100f)) { return(false); } return(true); }
protected virtual bool ShouldSevenSidedStrike(out TrinityActor target) { target = null; if (!Skills.Monk.SevenSidedStrike.CanCast()) { return(false); } if (!TargetUtil.AnyMobsInRange(45f)) { return(false); } if (Player.PrimaryResource < PrimaryEnergyReserve) { return(false); } if (Skills.Monk.ExplodingPalm.IsActive && !WeightedUnits.Any(u => u.IsUnit && u.Distance < 35f && u.HasDebuff(SNOPower.Monk_ExplodingPalm))) { return(false); } var isElitesInRange = TargetUtil.AnyElitesInRange(15, 1); var isSpamRelatedItems = Legendary.Madstone.IsEquipped || Sets.UlianasStratagem.IsMaxBonusActive; var isLowHealth = Player.CurrentHealthPct < 0.55f; var isLargerCluster = TargetUtil.ClusterExists(20f, 20f, LargeClusterSize); if (isElitesInRange || isSpamRelatedItems || isLowHealth || isLargerCluster) { target = TargetUtil.GetBestClusterUnit(); return(target != null); } return(false); }
public TrinityPower GetOffensivePower() { TrinityPower power; TrinityActor target; var bestCluster = TargetUtil.GetBestClusterPoint(); var energyLevelReady = !Legendary.AquilaCuirass.IsEquipped || Player.PrimaryResourcePct > 0.95; if (bestCluster.Distance(Player.Position) > 15f && CanTeleportTo(bestCluster) && energyLevelReady) { return(Teleport(bestCluster)); } if (IsArchonActive) { if (CanTeleport) { Teleport(TargetUtil.GetBestClusterPoint()); } if (Skills.Wizard.ArchonDisintegrationWave.CanCast()) { // Use Wave to pull and ignite monsters that are lined up nicely and are not burning. var pierceUnits = WeightedUnits.Where(u => u.Distance < 50f && !u.Attributes.HasThirdFirebirdStack && !u.Attributes.HasFirstFirebirdStack && (u.CountUnitsInFront() + u.CountUnitsBehind(15f)) > 5).ToList(); var bestPierceUnit = pierceUnits.OrderBy(u => u.Distance).FirstOrDefault(u => u.Distance <= 15f); if (bestPierceUnit != null) { return(ArchonDisintegrationWave(bestPierceUnit)); } } if (ShouldArchonStrike(out target)) { return(ArchonStrike(target)); } return(null); } if (TrySpecialPower(out power)) { return(power); } if (TrySecondaryPower(out power)) { return(power); } if (TryPrimaryPower(out power)) { return(power); } if (IsNoPrimary) { return(Walk(CurrentTarget)); } return(null); }