Exemplo n.º 1
0
        internal static async Task <BattleCharacter> GetGrindTarget()
        {
            if (OracleClassManager.ClassChangedTimer != null && OracleClassManager.ClassChangedTimer.Elapsed < TimeSpan.FromSeconds(30))
            {
                Logger.SendLog("Waiting for class change skill cooldown to expire before selecting a target.");
                return(null);
            }

            if (checkForTargetCooldown != null && checkForTargetCooldown.Elapsed <= TimeSpan.FromSeconds(5))
            {
                return(null);
            }

            var targets = GameObjectManager.GetObjectsOfType <BattleCharacter>().Where(GrindMobFilter).OrderBy(bc => bc.Distance()).Take(8).ToList();

            if (!targets.Any())
            {
                return(null);
            }

            var navRequest = targets.Select(target => new CanFullyNavigateTarget
            {
                Id       = target.ObjectId,
                Position = target.Location
            }).ToList();
            var navTask    = Navigator.NavigationProvider.CanFullyNavigateTo(navRequest, Core.Player.Location, WorldManager.ZoneId);
            var navResults = await Coroutine.ExternalTask(navTask);

            var viableTargets = new Dictionary <BattleCharacter, float>();

            foreach (var result in navResults)
            {
                if (result.CanNavigate == 0)
                {
                    var blacklistEntry = Blacklist.GetEntry(result.Id);
                    if (blacklistEntry == null)
                    {
                        var mob = GameObjectManager.GetObjectByObjectId(result.Id);
                        Logger.SendDebugLog("Blacklisting " + mob.Name + " (" + mob.ObjectId.ToString("X") + "). It can't be navigated to.");
                        Blacklist.Add(mob, BlacklistFlags.Combat, TimeSpan.FromMinutes(15), "Can't navigate to mob.");
                    }
                }
                else
                {
                    var battleCharacter = targets.FirstOrDefault(target => target.ObjectId == result.Id);
                    if (battleCharacter != null)
                    {
                        viableTargets.Add(battleCharacter, result.PathLength);
                    }
                }

                await Coroutine.Yield();
            }

            checkForTargetCooldown = Stopwatch.StartNew();
            return(viableTargets.OrderBy(order => order.Value).FirstOrDefault().Key);
        }
Exemplo n.º 2
0
        private async Task <bool> FindNode(bool retryCenterHotspot = true)
        {
            if (Node != null)
            {
                return(false);
            }

            StatusText = Localization.ExGather_SearchForNodes;

            while (Behaviors.ShouldContinue)
            {
                IEnumerable <GatheringPointObject> nodes =
                    GameObjectManager.GetObjectsOfType <GatheringPointObject>().Where(gpo => gpo.CanGather).ToArray();

                if (GatherStrategy == GatherStrategy.TouchAndGo && HotSpots != null)
                {
                    if (GatherObjects != null)
                    {
                        nodes = nodes.Where(gpo => GatherObjects.Contains(gpo.EnglishName, StringComparer.InvariantCultureIgnoreCase));
                    }

                    foreach (var node in
                             nodes.Where(gpo => HotSpots.CurrentOrDefault.WithinHotSpot2D(gpo.Location))
                             .OrderBy(gpo => gpo.Location.Distance2D(ExProfileBehavior.Me.Location))
                             .Skip(1))
                    {
                        if (!Blacklist.Contains(node.ObjectId, BlacklistFlags.Interact))
                        {
                            Blacklist.Add(
                                node,
                                BlacklistFlags.Interact,
                                TimeSpan.FromSeconds(18),
                                Localization.ExGather_SkipFurthestNodes);
                        }
                    }
                }

                nodes = nodes.Where(gpo => !Blacklist.Contains(gpo.ObjectId, BlacklistFlags.Interact));

                if (FreeRange)
                {
                    nodes = nodes.Where(gpo => gpo.Distance2D(ExProfileBehavior.Me.Location) < Radius);
                }
                else
                {
                    if (HotSpots != null)
                    {
                        nodes = nodes.Where(gpo => HotSpots.CurrentOrDefault.WithinHotSpot2D(gpo.Location));
                    }
                }

                // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression
                if (GatherObjects != null)
                {
                    Node =
                        nodes.OrderBy(
                            gpo =>
                            GatherObjects.FindIndex(i => string.Equals(gpo.EnglishName, i, StringComparison.InvariantCultureIgnoreCase)))
                        .ThenBy(gpo => gpo.Location.Distance2D(ExProfileBehavior.Me.Location))
                        .FirstOrDefault(gpo => GatherObjects.Contains(gpo.EnglishName, StringComparer.InvariantCultureIgnoreCase));
                }
                else
                {
                    Node = nodes.OrderBy(gpo => gpo.Location.Distance2D(ExProfileBehavior.Me.Location)).FirstOrDefault();
                }

                if (Node == null)
                {
                    if (HotSpots != null)
                    {
                        var myLocation = ExProfileBehavior.Me.Location;

                        var distanceToFurthestVisibleGameObject =
                            GameObjectManager.GameObjects.Select(o => o.Location.Distance2D(myLocation))
                            .OrderByDescending(o => o)
                            .FirstOrDefault();

                        var distanceToFurthestVectorInHotspot = myLocation.Distance2D(HotSpots.CurrentOrDefault)
                                                                + HotSpots.CurrentOrDefault.Radius;

                        if (myLocation.Distance2D(HotSpots.CurrentOrDefault) > Radius && GatherStrategy == GatherStrategy.GatherOrCollect &&
                            retryCenterHotspot && distanceToFurthestVisibleGameObject <= distanceToFurthestVectorInHotspot)
                        {
                            Logger.Verbose(Localization.ExGather_DistanceObject + distanceToFurthestVisibleGameObject);
                            Logger.Verbose(Localization.ExGather_DistanceHotSpot + distanceToFurthestVectorInHotspot);

                            Logger.Warn(
                                Localization.ExGather_NoAvailableNode);
                            await HotSpots.CurrentOrDefault.XYZ.MoveTo(radius : Radius, name : HotSpots.CurrentOrDefault.Name);

                            retryCenterHotspot = false;
                            await Coroutine.Yield();

                            continue;
                        }

                        if (!await ChangeHotSpot())
                        {
                            retryCenterHotspot = false;
                            await Coroutine.Yield();

                            continue;
                        }
                    }

                    if (FreeRange && !FreeRangeConditional())
                    {
                        await Coroutine.Yield();

                        isDone = true;
                        return(true);
                    }

                    return(true);
                }

                var entry = Blacklist.GetEntry(Node.ObjectId);
                if (entry != null && entry.Flags.HasFlag(BlacklistFlags.Interact))
                {
                    Logger.Warn(Localization.ExGather_NodeBlacklist);

                    if (await
                        Coroutine.Wait(entry.Length,
                                       () => entry.IsFinished || Node.Location.Distance2D(ExProfileBehavior.Me.Location) > Radius) ||
                        Core.Player.IsDead)
                    {
                        if (!entry.IsFinished)
                        {
                            Node = null;
                            Logger.Info(Localization.ExGather_NodeReset);
                            return(false);
                        }
                    }

                    Logger.Info(Localization.ExGather_NodeBlacklistRemoved);
                }

                Logger.Info(Localization.ExGather_NodeSet + Node);

                if (HotSpots == null)
                {
                    MovementManager.SetFacing2D(Node.Location);
                }

                if (Poi.Current.Unit != Node)
                {
                    Poi.Current = new Poi(Node, PoiType.Gather);
                }

                return(true);
            }

            return(true);
        }
        private static bool Filter(BattleCharacter battleCharacter)
        {
            var currentFate    = OracleFateManager.GetCurrentFateData();
            var blacklistEntry = Blacklist.GetEntry(battleCharacter);

            if (!battleCharacter.IsValid || battleCharacter.IsDead || !battleCharacter.IsVisible)
            {
                return(false);
            }

            if (!battleCharacter.CanAttack)
            {
                return(false);
            }

            if (blacklistEntry != null)
            {
                return(false);
            }

            if (battleCharacter.IsFateGone)
            {
                return(false);
            }

            if (IsLevelSyncNeeded(battleCharacter) && !FateManager.GetFateById(battleCharacter.FateId).Within2D(battleCharacter.Location))
            {
                return(false);
            }

            if (GameObjectManager.Attackers.Contains(battleCharacter))
            {
                return(true);
            }

            if (battleCharacter.HasTarget && battleCharacter.CurrentTargetId == Core.Player.ObjectId)
            {
                return(true);
            }

            if (ChocoboManager.Object != null && battleCharacter.HasTarget && battleCharacter.CurrentTargetId == ChocoboManager.Object.ObjectId)
            {
                return(true);
            }

            if (!battleCharacter.IsFate && currentFate != null)
            {
                return(false);
            }

            if (currentFate != null && battleCharacter.FateId != currentFate.Id)
            {
                return(false);
            }

            if (currentFate == null || !currentFate.IsValid)
            {
                return(false);
            }

            return(!Core.Player.InCombat);
        }
Exemplo n.º 4
0
        // 30May2013-08:11UTC chinajade
        public static List <string> CheckCore(
            WoWObject wowObject,
            QuestBehaviorBase coreAttributes)
        {
            var exclusionReasons = new List <string>();
            const BlacklistFlags interestingBlacklistFlags = BlacklistFlags.Combat | BlacklistFlags.Interact | BlacklistFlags.Pull;

            if (!Query.IsViable(wowObject))
            {
                exclusionReasons.Add("[NotViable]");
                return(exclusionReasons);
            }

            var blacklistEntry = Blacklist.GetEntry(wowObject.Guid);

            if ((blacklistEntry != null) && ((blacklistEntry.Flags & interestingBlacklistFlags) != 0))
            {
                var blacklistInfo = new List <string>();

                var blacklistTimeRemaining = blacklistEntry.Started + blacklistEntry.Length - DateTime.Now;
                blacklistInfo.Add(string.Format("Time({0}/{1})",
                                                Utility.PrettyTime(blacklistTimeRemaining),
                                                Utility.PrettyTime(blacklistEntry.Length)));

                if (blacklistEntry.Flags.HasFlag(BlacklistFlags.Combat))
                {
                    blacklistInfo.Add("ForCombat");
                }
                if (blacklistEntry.Flags.HasFlag(BlacklistFlags.Interact))
                {
                    blacklistInfo.Add("ForInteract");
                }
                if (blacklistEntry.Flags.HasFlag(BlacklistFlags.Loot))
                {
                    blacklistInfo.Add("ForLoot");
                }
                if (blacklistEntry.Flags.HasFlag(BlacklistFlags.Node))
                {
                    blacklistInfo.Add("ForNode");
                }
                if (blacklistEntry.Flags.HasFlag(BlacklistFlags.Pull))
                {
                    blacklistInfo.Add("ForPull");
                }

                exclusionReasons.Add(string.Format("Blacklisted({0})", string.Join(",", blacklistInfo)));
            }

            if (!Query.IsStateMatch_IgnoreMobsInBlackspots(wowObject, coreAttributes.IgnoreMobsInBlackspots))
            {
                var coveringBlackspots =
                    from blackspot in Query.FindCoveringBlackspots(wowObject.Location)
                    select string.Format("Blackspot({0}, r:{1})", blackspot.Location, blackspot.Radius);

                exclusionReasons.Add(string.Format("InBlackspot(object @{0}; {1})",
                                                   wowObject.Location,
                                                   string.Join(", ", coveringBlackspots)));
            }

            if (!Query.IsStateMatch_MeshNavigable(wowObject, coreAttributes.MovementBy))
            {
                exclusionReasons.Add("NotMeshNavigable");
            }

            if (Query.IsInCompetition(wowObject, coreAttributes.NonCompeteDistance))
            {
                int playerCount = Query.FindPlayersNearby(wowObject.Location, coreAttributes.NonCompeteDistance).Count();

                if (playerCount > 0)
                {
                    exclusionReasons.Add(string.Format("InCompetition({0} players within {1:F1}, expires in {2})",
                                                       playerCount,
                                                       coreAttributes.NonCompeteDistance,
                                                       Utility.PrettyTime(Query.InCompetitionTimeRemaining(wowObject))));
                }

                var  wowUnit  = wowObject.ToUnit();
                bool isTagged = (wowUnit != null) && !Query.IsSharedWorldResource(wowUnit) && !wowUnit.IsUntagged();
                if (isTagged)
                {
                    exclusionReasons.Add("TaggedByOtherPlayer");
                }
            }

            return(exclusionReasons);
        }