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