Esempio n. 1
0
        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());
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
    /*	***************************************************************/

    #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);
    }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
        /// <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);
        }
Esempio n. 7
0
 internal static FateData GetPreviousFateData()
 {
     return(FateManager.GetFateById(PreviousFateId));
 }
Esempio n. 8
0
 internal static FateData GetCurrentFateData()
 {
     return(FateManager.GetFateById(CurrentFateId));
 }
Esempio n. 9
0
        internal static FateData GetChainFate(uint fateId)
        {
            var oracleFate = FateDatabase.GetFateFromId(fateId);

            return(oracleFate.ChainId != 0 ? FateManager.GetFateById(oracleFate.ChainId) : null);
        }
Esempio n. 10
0
 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);
        }
Esempio n. 12
0
        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);
        }