internal static async Task <Dictionary <FateData, float> > GetActiveFateDistances(Vector3 location) { var activeFates = new Dictionary <FateData, float>(); if (!WorldManager.CanFly) { var navRequest = FateManager.ActiveFates.Select(fate => new CanFullyNavigateTarget { Id = fate.Id, Position = fate.Location }).ToList(); var navTask = Navigator.NavigationProvider.CanFullyNavigateTo(navRequest, location, WorldManager.ZoneId); var navResults = await Coroutine.ExternalTask(navTask); foreach (var result in navResults.Where(result => result.CanNavigate != 0)) { activeFates.Add(FateManager.GetFateById(result.Id), result.PathLength); await Coroutine.Yield(); } } else { foreach (var fate in FateManager.ActiveFates) { activeFates.Add(fate, fate.Location.Distance(location)); } } return(activeFates); }
private static bool IsLevelSyncNeeded(GameObject battleCharacter) { if (battleCharacter.FateId == 0) { return(false); } return(FateManager.GetFateById(battleCharacter.FateId).MaxLevel < OracleClassManager.GetTrueLevel()); }
private void BSettingSaveTemplate_Click(object sender, RoutedEventArgs e) { SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "自定义模板(*.json)|*.json"; if (saveFileDialog.ShowDialog() == false) { return; } FateManager.Save(saveFileDialog.FileName, Config.Instance.Watch.Fates); MessageBox.Show(string.Format("已成功保存自定义模板 [{0}]", saveFileDialog.FileName), Data.Title); }
/* ***************************************************************/ #region 获取缘分 public List <FateData> getMyFate(FateManager manager) { List <FateData> myFate = new List <FateData>(); if (config.fateID != null) { foreach (int fateId in config.fateID) { myFate.Add(manager.getFateDataFromID(fateId)); } } return(myFate); }
private void BSettingLoadTemplate_Click(object sender, RoutedEventArgs e) { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Filter = "自定义模板(*.json)|*.json"; if (openFileDialog.ShowDialog() == false) { return; } var list = FateManager.Load(openFileDialog.FileName); if (list == null) { MessageBox.Show("文件读取失败,请确认选择的文件由本插件导出", Data.Title, MessageBoxButton.OK, MessageBoxImage.Error); return; } ApplyFateList(list); MessageBox.Show(string.Format("已成功应用自定义模板 [{0}]", openFileDialog.FileName), Data.Title); }
/// <summary> /// Will automatically sync to a FATE if selected mob is part of a FATE. /// </summary> /// <returns></returns> private bool ExecuteAutoSyncFate() { // Because RebornBuddy can be whimsical with it's Core.Target... var target = Core.Target as BattleCharacter; // We have a target and it is part of a FATE. if (target != null && target.IsCharacter() && target.IsFate) { var fate = FateManager.GetFateById(target.FateId); // Sync us down, Scotty! if (fate != null && fate.Within2D(Core.Me.Location) && Core.Me.ClassLevel > fate.MaxLevel) { LogHelper.Instance.Log(Resources.Localization.Msg_AutoSyncFate, fate.Name); Core.Me.SyncToFate(); return(true); } } return(false); }
internal static FateData GetPreviousFateData() { return(FateManager.GetFateById(PreviousFateId)); }
internal static FateData GetCurrentFateData() { return(FateManager.GetFateById(CurrentFateId)); }
internal static FateData GetChainFate(uint fateId) { var oracleFate = FateDatabase.GetFateFromId(fateId); return(oracleFate.ChainId != 0 ? FateManager.GetFateById(oracleFate.ChainId) : null); }
internal static void ForceUpdateGameCache() { FateManager.Update(); GameObjectManager.Clear(); GameObjectManager.Update(); }
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); }
internal static async Task <bool> HandleCombat() { var currentBc = Poi.Current.BattleCharacter; if (currentBc == null) { return(false); } if (!currentBc.IsValid) { OracleFateManager.ClearPoi("Targeted unit is not valid.", false); return(true); } if (mostRecentBc == null || mostRecentBc != currentBc) { mostRecentBc = currentBc; lastHpValue = mostRecentBc.CurrentHealth; noDamageTimeout = Stopwatch.StartNew(); } if (lastHpValue != mostRecentBc.CurrentHealth) { noDamageTimeout.Restart(); lastHpValue = mostRecentBc.CurrentHealth; } if (ShouldBlacklistCombatPoi()) { OracleFateManager.ClearPoi("Mob's HP has not changed in " + MainSettings.Instance.CombatNoDamageTimeout / 1000 + " seconds, blacklisting and selecting a new mob."); Blacklist.Add(currentBc, BlacklistFlags.Combat, TimeSpan.FromMinutes(1), "No damage taken timeout triggered."); mostRecentBc = null; noDamageTimeout = null; Core.Player.ClearTarget(); return(true); } if (!currentBc.IsFate && !currentBc.IsDead && GameObjectManager.Attackers.All(mob => mob.ObjectId != currentBc.ObjectId) && OracleFateManager.CurrentFateId != 0) { OracleFateManager.ClearPoi("Targeted unit is not in combat with us, nor part of the current FATE.", false); Blacklist.Add(currentBc, BlacklistFlags.Combat, TimeSpan.FromSeconds(30), "Not a FATE mob."); return(true); } // If target is not a FATE mob and is tapped by someone else. if (!currentBc.IsFate && currentBc.TappedByOther) { OracleFateManager.ClearPoi("Targeted unit is not a FATE mob and is tapped by someone else."); Blacklist.Add(currentBc, BlacklistFlags.Combat, TimeSpan.FromSeconds(30), "Tapped by another person."); Core.Player.ClearTarget(); if (WaitSettings.Instance.FateWaitMode == FateWaitMode.GrindMobs) { var target = await OracleCombatManager.GetGrindTarget(); if (target == null) { return(true); } Logger.SendLog("Selecting " + target.Name + " (" + target.ObjectId.ToString("X") + ") as the next target to kill.", true); Poi.Current = new Poi(target, PoiType.Kill); } return(true); } // If target is a FATE mob, we need to handle several potential issues. if (currentBc.IsFate) { var fate = FateManager.GetFateById(Poi.Current.BattleCharacter.FateId); if (fate == null) { return(true); } if (!OracleFateManager.IsLevelSyncNeeded(fate)) { return(true); } if (fate.Status != FateStatus.NOTACTIVE) { if (fate.Within2D(Core.Player.Location)) { await OracleFateManager.SyncLevel(fate); } else if (GameObjectManager.Attackers.Contains(Poi.Current.BattleCharacter)) { await OracleMovementManager.MoveToCurrentFate(true); await OracleFateManager.SyncLevel(fate); } } } return(true); }