Exemple #1
0
        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);
        }
Exemple #2
0
        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());
        }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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);
        }