예제 #1
0
        public TrinityPower GetOffensivePower()
        {
            var          position = Vector3.Zero;
            TrinityActor target;

            if (IsArchonActive)
            {
                target = TargetUtil.SafeList(true)
                         .FirstOrDefault(a => a.IsBoss && !a.IsShadowClone && a.Distance < 125f) ??
                         TargetUtil.SafeList(true)
                         .Where(a => a.IsElite &&
                                a.EliteType != EliteTypes.Minion &&
                                !a.IsIllusion &&
                                a.Distance < 125f)
                         .OrderBy(a => a.NearbyUnitsWithinDistance(6f))
                         .FirstOrDefault() ??
                         TargetUtil.SafeList(true)
                         .Where(a => a.IsTrashMob &&
                                a.IsInLineOfSight &&
                                !a.IsSummoner &&
                                !a.IsSummoned &&
                                a.Distance < 50f)
                         .OrderByDescending(a => a.NearbyUnitsWithinDistance(6f))
                         .FirstOrDefault() ??
                         CurrentTarget;
            }
            else
            {
                target = TargetUtil.SafeList(true)
                         .FirstOrDefault(a => a.IsBoss &&
                                         !a.IsShadowClone &&
                                         a.Distance < 125f) ??
                         TargetUtil.SafeList(true)
                         .Where(a => a.IsMonster &&
                                a.Distance < 50f &&
                                a.IsInLineOfSight)
                         .OrderBy(a => a.Distance)
                         .FirstOrDefault(a => TrinityGrid.Instance.CanRayWalk(Player.Position, a.Position)) ??
                         CurrentTarget;
            }

            if (target == null)
            {
                return(null);
            }

            if (position != Vector3.Zero)
            {
                return(Teleport(position));
            }

            Skill teleport = Skills.Wizard.Teleport;

            if (Skills.Wizard.ArchonTeleport.CanCast() ||
                Skills.Wizard.Teleport.CanCast())
            {
                teleport = IsArchonActive ? Skills.Wizard.ArchonTeleport : Skills.Wizard.Teleport;
                var needTeleport = !Core.Buffs.HasInvulnerableShrine &&
                                   Core.Avoidance.InAvoidance(Player.Position) ||
                                   !Core.Buffs.HasInvulnerableShrine &&
                                   Player.CurrentHealthPct < 1 &&
                                   teleport.TimeSinceUse > 1500 ||
                                   TargetUtil.AnyElitesInRange(15) &&
                                   teleport.TimeSinceUse > 2000 ||
                                   TargetUtil.AnyBossesInRange(30) ||
                                   TargetUtil.NumMobsInRange() > 3 ||
                                   teleport.TimeSinceUse > 3000;

                if (needTeleport)
                {
                    if (position == Vector3.Zero)
                    {
                        Core.Avoidance.Avoider.TryGetSafeSpot(out position, 30, 45);
                    }

                    return(Teleport(position));
                }
            }

            if (IsArchonActive)
            {
                return(ArchonDisintegrationWave(target));
            }

            if (Skills.Wizard.Archon.CanCast() &&
                TalRashaStacks >= 3 &&
                Player.Summons.HydraCount >= 2)
            {
                return(Archon());
            }

            var hydra      = Skills.Wizard.Hydra;
            var rayOfFrost = Skills.Wizard.RayOfFrost;

            var elite = TargetUtil.SafeList(true)
                        .Where(a => a.IsElite &&
                               a.IsInLineOfSight &&
                               a.EliteType != EliteTypes.Minion &&
                               !a.IsIllusion &&
                               a.Distance < 50f)
                        .OrderByDescending(a => a.Distance)
                        .FirstOrDefault();

            if (Skills.Wizard.Archon.CanCast() &&
                TalRashaStacks < 3)
            {
                if (Player.Summons.HydraCount < 2 ||
                    hydra.TimeSinceUse > 6000)
                {
                    return(Hydra(elite?.Position ?? target.Position));
                }

                if (rayOfFrost.TimeSinceUse > 6000)
                {
                    return(RayOfFrost(target));
                }

                if (teleport.TimeSinceUse > 6000 &&
                    Core.Avoidance.Avoider.TryGetSafeSpot(out position, 20, 50))
                {
                    return(Teleport(position));
                }
            }

            if (Skills.Wizard.Hydra.CanCast() &&
                Player.Summons.HydraCount < 2 &&
                IsInCombat)
            {
                return(new TrinityPower(Skills.Wizard.Hydra, 50, elite ?? target));
            }

            if (Skills.Wizard.RayOfFrost.CanCast() &&
                Player.PrimaryResource > 15)
            {
                return(RayOfFrost(target));
            }

            return(Walk(Player.Position));
        }