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