예제 #1
0
        protected virtual bool ShouldSpiritBarrage(out TrinityActor target)
        {
            target = null;

            var skill = Skills.WitchDoctor.SpiritBarrage;

            if (!skill.CanCast())
            {
                return(false);
            }

            if (Player.PrimaryResource < PrimaryEnergyReserve)
            {
                return(false);
            }

            // Allow opportunity for other spenders to be cast.
            if (Skills.WitchDoctor.SpiritBarrage.TimeSinceUse < 750)
            {
                return(false);
            }

            target = TargetUtil.GetBestClusterUnit() ?? CurrentTarget;

            if (Runes.WitchDoctor.Phantasm.IsActive)
            {
                var numPhantasmsAtTarget = SpellHistory.FindSpells(skill.SNOPower, target.Position, 12f, 5).Count();
                if (numPhantasmsAtTarget >= 3)
                {
                    return(false);
                }
            }

            return(true);
        }
예제 #2
0
        protected override bool ShouldBlizzard(out TrinityActor target)
        {
            target = null;
            var blizzardDelay = Runes.Wizard.Snowbound.IsActive ? Settings.BlizzardSnowboundDelay : Settings.BlizzardFrozenSolidDelay;
            var skill         = Skills.Wizard.Blizzard;

            if (!skill.CanCast())
            {
                return(false);
            }

            if (skill.TimeSinceUse < blizzardDelay)
            {
                return(false);
            }

            target = TargetUtil.GetBestClusterUnit(BlizzardRadius, 70f) ?? CurrentTarget;
            if (target == null)
            {
                return(false);
            }

            var isExistingBlizzard = SpellHistory.FindSpells(skill.SNOPower, target.Position, BlizzardRadius, 6).Any();

            return(!isExistingBlizzard);
        }
예제 #3
0
        protected virtual bool ShouldHydra(out Vector3 position)
        {
            TrinityActor target;

            position = Vector3.Zero;

            var skill = Skills.Wizard.Hydra;

            if (!skill.CanCast())
            {
                return(false);
            }

            target = TargetUtil.GetBestClusterUnit() ?? CurrentTarget;
            if (target == null)
            {
                return(false);
            }

            var isHydraAtLocation = SpellHistory.FindSpells(skill.SNOPower, target.Position, 15f, 6).Any();

            if (isHydraAtLocation)
            {
                return(false);
            }

            if (Player.Summons.HydraCount < MaxHydras && ZetaDia.Me.IsInCombat)
            {
                Core.Logger.Log(LogCategory.Routine, $"Casting Hydra, Less than max Hydras! ({Player.Summons.HydraCount}/{MaxHydras})");
                position = target.Position;
                return(true);
            }

            return(false);
        }
예제 #4
0
        protected virtual bool ShouldBlizzard(out TrinityActor target)
        {
            target = null;

            var skill = Skills.Wizard.Blizzard;

            if (!skill.CanCast())
            {
                return(false);
            }

            target = TargetUtil.GetBestClusterUnit(BlizzardRadius, 70f) ?? CurrentTarget;
            if (target == null)
            {
                return(false);
            }

            var isExistingBlizzard = SpellHistory.FindSpells(skill.SNOPower, target.Position, BlizzardRadius, 6).Any();

            return(!isExistingBlizzard);
        }
예제 #5
0
        protected override bool ShouldSlowTime(out Vector3 position)
        {
            position = Vector3.Zero;

            var skill = Skills.Wizard.SlowTime;

            if (!skill.CanCast())
            {
                return(false);
            }

            var myPosition      = ZetaDia.Me.Position;
            var clusterPosition = TargetUtil.GetBestClusterPoint(0f, 50f);
            var bubbles         = SpellHistory.FindSpells(skill.SNOPower, 12).ToList();
            var bubblePositions = new List <Vector3>(bubbles.Select(b => b.TargetPosition));
            var isDefensiveRune = Runes.Wizard.PointOfNoReturn.IsActive || Runes.Wizard.StretchTime.IsActive || Runes.Wizard.Exhaustion.IsActive;

            Func <Vector3, bool> isBubbleAtPosition = pos => bubblePositions.Any(b => b.Distance(pos) <= 14f && pos.Distance(myPosition) < SlowTimeRange);

            // On Self
            if (TargetUtil.ClusterExists(15f, 60f, 8) && isDefensiveRune && !isBubbleAtPosition(myPosition))
            {
                position = MathEx.GetPointAt(myPosition, 10f, Player.Rotation);
                return(true);
            }

            // On Elites
            if (CurrentTarget.IsElite && CurrentTarget.Distance < SlowTimeRange && !isBubbleAtPosition(CurrentTarget.Position))
            {
                position = CurrentTarget.Position;
                return(true);
            }

            // On Clusters
            if (TargetUtil.ClusterExists(50f, 5) && clusterPosition.Distance(myPosition) < SlowTimeRange && !isBubbleAtPosition(clusterPosition))
            {
                position = clusterPosition;
                return(true);
            }

            // Delseres Magnum Opus Set
            if (Sets.DelseresMagnumOpus.IsEquipped)
            {
                var isLargeCluster = Core.Clusters.LargeCluster.Exists && Core.Clusters.LargeCluster.Position.Distance(myPosition) < SlowTimeRange;
                if (isLargeCluster && !isBubbleAtPosition(Core.Clusters.LargeCluster.Position))
                {
                    position = Core.Clusters.LargeCluster.Position;
                    return(true);
                }

                var isAnyCluster = Core.Clusters.BestCluster.Exists && Core.Clusters.BestCluster.Position.Distance(myPosition) < SlowTimeRange;
                if (isAnyCluster && !isBubbleAtPosition(Core.Clusters.BestCluster.Position))
                {
                    position = Core.Clusters.BestCluster.Position;
                    return(true);
                }

                if (!isBubbleAtPosition(myPosition))
                {
                    position = MathEx.GetPointAt(myPosition, 10f, Player.Rotation);
                    return(true);
                }
            }

            return(false);
        }