Пример #1
0
        private static async Task <HandleMinionResult> HandleMinion(YokaiMinion minion)
        {
            if (ConditionParser.HasAtLeast(minion.MedalItemId, YokaiWatchGrindData.GetMedalsToFarm(minion)))
            {
                return(HandleMinionResult.Finished);
            }

            if (minion.Ignored)
            {
                return(HandleMinionResult.Ignored);
            }

            if (SummonMinion.CanSummonMinion() && !await SummonMinion.IsMinionSummoned(minion.EnglishName))
            {
                var summonMinionResult = await SummonMinion.Main(minion.EnglishName);

                if (summonMinionResult != SummonMinionResult.Success)
                {
                    minion.Ignored = true;
                    return(HandleMinionResult.Failed);
                }
            }

            if (Core.Player.InCombat || !WorldManager.CanTeleport() || WorldManager.ZoneId == GetMinionMedalZone(minion))
            {
                return(HandleMinionResult.InProgress);
            }

            var medalsToFarm = YokaiWatchGrindData.GetMedalsToFarm(minion) - OracleInventoryManager.GetItemAmount(minion.MedalItemId);

            Logger.SendLog("We need " + medalsToFarm + " Legendary " + minion.EnglishName + " Medal(s). Teleporting to your chosen zone.");
            await ZoneChange.HandleZoneChange(GetMinionMedalZone(minion), true);

            return(HandleMinionResult.InProgress);
        }
Пример #2
0
        private static async Task EquipOffHand()
        {
            var equipResult = await OracleInventoryManager.EquipItem(ShieldPaladinItemId, EquipmentSlot.OffHand);

            switch (equipResult)
            {
            case EquipItemResult.ItemNotFound:
                Logger.SendErrorLog("Could not find the Zenith Relic Offhand for the current class.");
                OracleBot.StopOracle("Can't find Zenith Relic Offhand in character inventory.");
                break;

            case EquipItemResult.BagSlotNotFound:
                Logger.SendDebugLog("Could not find the bag slot for the Zenith Relic Offhand.");
                break;

            case EquipItemResult.Success:
                Logger.SendLog("Successfully equipped " + OracleInventoryManager.GetEquipmentSlotBagSlot(EquipmentSlot.OffHand).EnglishName + ".");
                break;

            case EquipItemResult.Failure:
                Logger.SendDebugLog("Equipping the Zenith Relic Offhand failed.");
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Пример #3
0
        internal static async Task <bool> HandleYokaiWatchGrind()
        {
            // Summoning a chocobo dismisses your minion, meaning we can't use it here.
            if (!ChocoboManager.BlockSummon)
            {
                ChocoboManager.BlockSummon = true;
            }

            if (ChocoboManager.Summoned)
            {
                await ChocoboManager.DismissChocobo();
            }

            if (!ConditionParser.HasAtLeast(YokaiWatchGrindData.YokaiMedal, ModeSettings.Instance.YokaiMedalsToFarm))
            {
                if (OracleInventoryManager.IsItemEquipped(YokaiWatchGrindData.YokaiWatchItem, EquipmentSlot.Bracelet))
                {
                    var equipResult = await OracleInventoryManager.EquipItem(YokaiWatchGrindData.YokaiWatchItem, EquipmentSlot.Bracelet);

                    if (equipResult != EquipItemResult.Success)
                    {
                        Logger.SendErrorLog("Unable to equip the Yo-kai Watch.");
                        ignoreNormalMedals = true;
                    }
                }
            }

            foreach (var minion in YokaiWatchGrindData.Minions)
            {
                if (await HandleMinion(minion) == HandleMinionResult.InProgress)
                {
                    return(true);
                }
            }

            if (!ConditionParser.HasAtLeast(YokaiWatchGrindData.YokaiMedal, ModeSettings.Instance.YokaiMedalsToFarm) && !ignoreNormalMedals)
            {
                await TeleportIfNeeded(YokaiWatchGrindData.GetNormalMedalZone());

                return(true);
            }

            if (Core.Player.InCombat)
            {
                return(true);
            }

            Logger.SendLog("We've farmed the medals we need for all minions! Stopping Oracle.");
            await OracleTeleportManager.TeleportToClosestCity();

            OracleBot.StopOracle("We are done!");

            return(true);
        }
Пример #4
0
        internal static async Task <RestockGysahlGreensResult> HandleRestockGyshalGreens()
        {
            if (!OracleInventoryManager.ShouldRestockGreens())
            {
                return(RestockGysahlGreensResult.Success);
            }

            Logger.SendLog("Going to restock our Gysahl Greens.");
            originZoneId = WorldManager.ZoneId;
            await OracleTeleportManager.TeleportToClosestCity();

            uint    vendorNpcId;
            Vector3 vendorLocation;

            switch (WorldManager.ZoneId)
            {
            case GridaniaZoneId:
                vendorNpcId    = MaisentaNpcId;
                vendorLocation = MaisentaLocation;
                break;

            case LimsaLominsaZoneId:
                vendorNpcId    = BangoZangoNpcId;
                vendorLocation = BangoZangoLocation;
                break;

            case UldahZoneId:
                vendorNpcId    = RoarichNpcId;
                vendorLocation = RoarichLocation;
                break;

            case IdyllshireZoneId:
                vendorNpcId    = JunkmongerNpcId;
                vendorLocation = JunkmongerLocation;
                break;

            default:
                Logger.SendErrorLog("Not in a city that sells Gysahl Greens.");
                return(RestockGysahlGreensResult.Failure);
            }

            Logger.SendDebugLog("Going to NPC " + vendorNpcId + " at " + vendorLocation + ".");
            if (Core.Player.Distance(vendorLocation) > 4f)
            {
                await OracleMovementManager.NavigateToLocation(vendorLocation, 2f, false);
            }

            var openCorrectShopResult = await OpenCorrectShopWindow(vendorNpcId);

            if (!openCorrectShopResult)
            {
                return(RestockGysahlGreensResult.Failure);
            }

            var amountToBuy   = Convert.ToUInt32(MainSettings.Instance.ChocoboGreensRestockAmount) - OracleInventoryManager.GetItemAmount(GysahlGreenItemId);
            var buyItemResult = await OracleInventoryManager.BuyItem(GysahlGreenItemId, amountToBuy);

            if (buyItemResult != BuyItemResult.Success)
            {
                return(RestockGysahlGreensResult.Failure);
            }

            if (ModeSettings.Instance.OracleOperationMode != OracleOperationMode.LevelMode &&
                ModeSettings.Instance.OracleOperationMode != OracleOperationMode.MultiLevelMode)
            {
                await OracleTeleportManager.TeleportToAetheryte(WorldManager.GetZoneForAetheryteId(originZoneId));
            }

            return(OracleInventoryManager.GetItemAmount(GysahlGreenItemId) >= MainSettings.Instance.ChocoboGreensRestockAmount
                       ? RestockGysahlGreensResult.Success
                       : RestockGysahlGreensResult.Failure);
        }
Пример #5
0
        internal static async Task <bool> HandleAnimaGrind()
        {
            if (!ConditionParser.HasQuest(AnimaQuest))
            {
                Logger.SendErrorLog("You do not have the quest 'Soul Without Life', which is required to run in Anima grind mode.");
                OracleBot.StopOracle("Required quest is not picked up.");
                return(true);
            }

            if (ConditionParser.GetQuestStep(AnimaQuest) != AnimaQuestStep)
            {
                OracleFateManager.PausePoiSetting = true;

                if (WorldManager.ZoneId != ZoneMorDhona)
                {
                    await ZoneChange.HandleZoneChange(ZoneMorDhona, false);
                }

                // Step 1: Talk to Rowena.
                if (ConditionParser.GetQuestStep(AnimaQuest) == 1)
                {
                    var rowenaLocation = new Vector3(25.65759f, 29f, -822.5876f);
                    if (Core.Player.Distance(rowenaLocation) > 10f)
                    {
                        await OracleMovementManager.NavigateToLocation(rowenaLocation, 2f, false);
                    }

                    const uint rowenaNpcId      = 1001304;
                    var        rowenaGameObject = GameObjectManager.GameObjects.FirstOrDefault(npc => npc.NpcId == rowenaNpcId);
                    if (rowenaGameObject != null)
                    {
                        if (Core.Player.Distance2D(rowenaGameObject.Location) > 4f)
                        {
                            await OracleMovementManager.NavigateToLocation(rowenaGameObject.Location, 4f, false);
                        }

                        rowenaGameObject.Interact();
                        await Coroutine.Sleep(MainSettings.Instance.ActionDelay);

                        await SkipDialogue.Main();
                    }
                }

                // Step 2: Talk to Syndony.
                if (ConditionParser.GetQuestStep(AnimaQuest) == 2)
                {
                    var syndonyLocation = new Vector3(56.6797f, 50f, -777.5304f);
                    if (Core.Player.Distance(syndonyLocation) > 10f)
                    {
                        await OracleMovementManager.NavigateToLocation(syndonyLocation, 2f, false);
                    }

                    const uint syndonyNpcId      = 1016289;
                    var        syndonyGameObject = GameObjectManager.GameObjects.FirstOrDefault(npc => npc.NpcId == syndonyNpcId);
                    if (syndonyGameObject != null)
                    {
                        if (Core.Player.Distance2D(syndonyGameObject.Location) > 4f)
                        {
                            await OracleMovementManager.NavigateToLocation(syndonyGameObject.Location, 4f, false);
                        }

                        syndonyGameObject.Interact();
                        await Coroutine.Sleep(MainSettings.Instance.ActionDelay);

                        await SkipDialogue.Main();
                    }
                }
            }
            else
            {
                if (OracleFateManager.PausePoiSetting)
                {
                    OracleFateManager.PausePoiSetting = false;
                }
            }

            if (!ConditionParser.HasAtLeast(LuminousIceCrystal, ModeSettings.Instance.AnimaCrystalsToFarm))
            {
                if (OracleClassManager.GetTrueLevel() < 50)
                {
                    Logger.SendErrorLog("You are too low level to run FATEs in Coerthas Western Highlands.");
                    OracleBot.StopOracle("Too low level to continue.");
                    return(true);
                }

                if (Core.Player.InCombat || !WorldManager.CanTeleport() || WorldManager.ZoneId == ZoneCoerthasWesternHighlands)
                {
                    return(true);
                }

                var amountNeeded = ModeSettings.Instance.AnimaCrystalsToFarm - OracleInventoryManager.GetItemAmount(LuminousIceCrystal);
                if (amountNeeded == 1)
                {
                    Logger.SendLog("We need " + amountNeeded + " more Luminous Ice Crystal.");
                }
                else
                {
                    Logger.SendLog("We need " + amountNeeded + " more Luminous Ice Crystals.");
                }

                await ZoneChange.HandleZoneChange(ZoneCoerthasWesternHighlands, true);
            }
            else if (!ConditionParser.HasAtLeast(LuminousWindCrystal, ModeSettings.Instance.AnimaCrystalsToFarm))
            {
                if (OracleClassManager.GetTrueLevel() < 50)
                {
                    Logger.SendErrorLog("You are too low level to run FATEs in The Sea of Clouds.");
                    OracleBot.StopOracle("Too low level to continue.");
                    return(true);
                }

                if (Core.Player.InCombat || !WorldManager.CanTeleport() || WorldManager.ZoneId == ZoneSeaOfClouds)
                {
                    return(true);
                }

                var amountNeeded = ModeSettings.Instance.AnimaCrystalsToFarm - OracleInventoryManager.GetItemAmount(LuminousWindCrystal);
                if (amountNeeded == 1)
                {
                    Logger.SendLog("We need " + amountNeeded + " more Luminous Wind Crystal.");
                }
                else
                {
                    Logger.SendLog("We need " + amountNeeded + " more Luminous Wind Crystals.");
                }

                await ZoneChange.HandleZoneChange(ZoneSeaOfClouds, true);
            }
            else if (!ConditionParser.HasAtLeast(LuminousEarthCrystal, ModeSettings.Instance.AnimaCrystalsToFarm))
            {
                if (OracleClassManager.GetTrueLevel() < 50)
                {
                    Logger.SendErrorLog("You are too low level to run FATEs in The Dravanian Forelands.");
                    OracleBot.StopOracle("Too low level to continue.");
                    return(true);
                }

                if (Core.Player.InCombat || !WorldManager.CanTeleport() || WorldManager.ZoneId == ZoneDravanianForelands)
                {
                    return(true);
                }

                var amountNeeded = ModeSettings.Instance.AnimaCrystalsToFarm - OracleInventoryManager.GetItemAmount(LuminousEarthCrystal);
                if (amountNeeded == 1)
                {
                    Logger.SendLog("We need " + amountNeeded + " more Luminous Earth Crystal.");
                }
                else
                {
                    Logger.SendLog("We need " + amountNeeded + " more Luminous Earth Crystals.");
                }

                await ZoneChange.HandleZoneChange(ZoneDravanianForelands, true);
            }
            else if (!ConditionParser.HasAtLeast(LuminousLightningCrystal, ModeSettings.Instance.AnimaCrystalsToFarm))
            {
                if (OracleClassManager.GetTrueLevel() < 52)
                {
                    Logger.SendErrorLog("You are too low level to run FATEs in The Churning Mists.");
                    OracleBot.StopOracle("Too low level to continue.");
                    return(true);
                }

                if (Core.Player.InCombat || !WorldManager.CanTeleport() || WorldManager.ZoneId == ZoneChurningMists)
                {
                    return(true);
                }

                var amountNeeded = ModeSettings.Instance.AnimaCrystalsToFarm - OracleInventoryManager.GetItemAmount(LuminousLightningCrystal);
                if (amountNeeded == 1)
                {
                    Logger.SendLog("We need " + amountNeeded + " more Luminous Lightning Crystal.");
                }
                else
                {
                    Logger.SendLog("We need " + amountNeeded + " more Luminous Lightning Crystals.");
                }

                await ZoneChange.HandleZoneChange(ZoneChurningMists, true);
            }
            else if (!ConditionParser.HasAtLeast(LuminousWaterCrystal, ModeSettings.Instance.AnimaCrystalsToFarm))
            {
                if (OracleClassManager.GetTrueLevel() < 54)
                {
                    Logger.SendErrorLog("You are too low level to run FATEs in The Dravanian Hinterlands.");
                    OracleBot.StopOracle("Too low level to continue.");
                    return(true);
                }

                if (Core.Player.InCombat || !WorldManager.CanTeleport() || WorldManager.ZoneId == ZoneDravanianHinterlands)
                {
                    return(true);
                }

                var amountNeeded = ModeSettings.Instance.AnimaCrystalsToFarm - OracleInventoryManager.GetItemAmount(LuminousWaterCrystal);
                if (amountNeeded == 1)
                {
                    Logger.SendLog("We need " + amountNeeded + " more Luminous Water Crystal.");
                }
                else
                {
                    Logger.SendLog("We need " + amountNeeded + " more Luminous Water Crystals.");
                }

                await ZoneChange.HandleZoneChange(ZoneDravanianHinterlands, true);
            }
            else if (!ConditionParser.HasAtLeast(LuminousFireCrystal, ModeSettings.Instance.AnimaCrystalsToFarm))
            {
                if (OracleClassManager.GetTrueLevel() < 55)
                {
                    Logger.SendErrorLog("You are too low level to run FATEs in Azys Lla.");
                    OracleBot.StopOracle("Too low level to continue.");
                    return(true);
                }

                if (Core.Player.InCombat || !WorldManager.CanTeleport() || WorldManager.ZoneId == ZoneAzysLla)
                {
                    return(true);
                }

                var amountNeeded = ModeSettings.Instance.AnimaCrystalsToFarm - OracleInventoryManager.GetItemAmount(LuminousFireCrystal);
                if (amountNeeded == 1)
                {
                    Logger.SendLog("We need " + amountNeeded + " more Luminous Fire Crystal.");
                }
                else
                {
                    Logger.SendLog("We need " + amountNeeded + " more Luminous Fire Crystals.");
                }

                await ZoneChange.HandleZoneChange(ZoneAzysLla, true);
            }
            else if (!Core.Player.InCombat)
            {
                Logger.SendLog("We have collected " + ModeSettings.Instance.AnimaCrystalsToFarm + " of every crystal! Stopping Oracle.");

                await OracleTeleportManager.TeleportToClosestCity();

                if (OracleTeleportManager.InCity())
                {
                    OracleBot.StopOracle("We are done!");
                }
            }

            return(true);
        }
Пример #6
0
        private static async Task <bool> Main()
        {
            OracleFateManager.ForceUpdateGameCache();

            if (OracleFateManager.FateDatabase == null)
            {
                await LoadOracleDatabase.Main();
            }

            if (Poi.Current == null)
            {
                Poi.Current = new Poi(Vector3.Zero, PoiType.None);
                return(false);
            }

            if (Poi.Current.Type == PoiType.Death || Core.Player.IsDead)
            {
                if (Poi.Current.Type == PoiType.Death || Core.Player.IsDead)
                {
                    Logger.SendLog("We died, attempting to recover.");
                }

                if (Poi.Current.Type != PoiType.Death)
                {
                    Poi.Current = new Poi(Core.Player, PoiType.Death);
                }

                return(false);
            }

            await ChocoboHandler.HandleChocobo();

            if (Poi.Current.Type == PoiType.Kill)
            {
                await CombatHandler.HandleCombat();

                return(false);
            }

            if (OracleInventoryManager.ShouldRestockGreens())
            {
                await RestockGysahlGreens.HandleRestockGyshalGreens();

                return(false);
            }

            switch (ModeSettings.Instance.OracleOperationMode)
            {
            case OracleOperationMode.FateGrind:
                await FateGrind.HandleFateGrind();

                break;

            case OracleOperationMode.LevelMode:
                await Levelling.HandleLevelling();

                break;

            case OracleOperationMode.MultiLevelMode:
                await MultiLevelling.HandleMultiLevelling();

                break;

            case OracleOperationMode.SpecificFates:
                await SpecificFates.HandleSpecificFates();

                break;

            case OracleOperationMode.AtmaGrind:
                await AtmaGrind.HandleAtmaGrind();

                break;

            case OracleOperationMode.AnimusGrind:
                await AnimusGrind.HandleAnimusGrind();

                break;

            case OracleOperationMode.AnimaGrind:
                await AnimaGrind.HandleAnimaGrind();

                break;

            case OracleOperationMode.YokaiWatchGrind:
                await YokaiWatchGrind.HandleYokaiWatchGrind();

                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            if (Poi.Current.Type == PoiType.Fate || OracleFateManager.CurrentFateId != 0)
            {
                await FateHandler.HandleFate();

                return(false);
            }

            if (Poi.Current.Type == PoiType.Wait)
            {
                await WaitHandler.HandleWait();
            }

            // Always return false to not block the tree.
            return(false);
        }
Пример #7
0
        internal static async Task <bool> HandleAtmaGrind()
        {
            if (!OracleClassManager.ClassJobCanFarmAtma(Core.Player.CurrentJob))
            {
                Logger.SendErrorLog("Your current class (" + OracleClassManager.GetClassJobName(Core.Player.CurrentJob) + ") cannot farm Atma.");
                OracleBot.StopOracle("Current class cannot farm Atma.");
                return(true);
            }

            var weaponId = GetClassJobZenithWeapon(Core.Player.CurrentJob);

            if (!OracleInventoryManager.IsItemEquipped(weaponId, EquipmentSlot.MainHand))
            {
                await EquipMainHand();
            }

            // Special case for Gladiator/Paladin shield.
            if ((Core.Player.CurrentJob == ClassJobType.Gladiator || Core.Player.CurrentJob == ClassJobType.Paladin) &&
                !OracleInventoryManager.IsItemEquipped(ShieldPaladinItemId, EquipmentSlot.OffHand))
            {
                await EquipOffHand();
            }

            if (!ConditionParser.HasAtLeast(AtmaLionItemId, ModeSettings.Instance.AtmaToFarm))
            {
                if (Core.Player.InCombat || !WorldManager.CanTeleport() || WorldManager.ZoneId == AtmaLionZoneId)
                {
                    return(true);
                }

                Logger.SendLog("We need " + (ModeSettings.Instance.AtmaToFarm - OracleInventoryManager.GetItemAmount(AtmaLionItemId)) + " Atma of the Lion.");
                await ZoneChange.HandleZoneChange(AtmaLionZoneId, true);
            }
            else if (!ConditionParser.HasAtLeast(AtmaWaterBearerItemId, ModeSettings.Instance.AtmaToFarm))
            {
                if (Core.Player.InCombat || !WorldManager.CanTeleport() || WorldManager.ZoneId == AtmaWaterBearerZoneId)
                {
                    return(true);
                }

                Logger.SendLog("We need " + (ModeSettings.Instance.AtmaToFarm - OracleInventoryManager.GetItemAmount(AtmaWaterBearerItemId))
                               + " Atma of the Water-bearer.");
                await ZoneChange.HandleZoneChange(AtmaWaterBearerZoneId, true);
            }
            else if (!ConditionParser.HasAtLeast(AtmaRamItemId, ModeSettings.Instance.AtmaToFarm))
            {
                if (Core.Player.InCombat || !WorldManager.CanTeleport() || WorldManager.ZoneId == AtmaRamZoneId)
                {
                    return(true);
                }

                Logger.SendLog("We need " + (ModeSettings.Instance.AtmaToFarm - OracleInventoryManager.GetItemAmount(AtmaRamItemId)) + " Atma of the Ram.");
                await ZoneChange.HandleZoneChange(AtmaRamZoneId, true);
            }
            else if (!ConditionParser.HasAtLeast(AtmaCrabItemId, ModeSettings.Instance.AtmaToFarm))
            {
                if (Core.Player.InCombat || !WorldManager.CanTeleport() || WorldManager.ZoneId == AtmaCrabZoneId)
                {
                    return(true);
                }

                Logger.SendLog("We need " + (ModeSettings.Instance.AtmaToFarm - OracleInventoryManager.GetItemAmount(AtmaCrabItemId)) + " Atma of the Crab.");
                await ZoneChange.HandleZoneChange(AtmaCrabZoneId, true);
            }
            else if (!ConditionParser.HasAtLeast(AtmaFishItemId, ModeSettings.Instance.AtmaToFarm))
            {
                if (Core.Player.InCombat || !WorldManager.CanTeleport() || WorldManager.ZoneId == AtmaFishZoneId)
                {
                    return(true);
                }

                Logger.SendLog("We need " + (ModeSettings.Instance.AtmaToFarm - OracleInventoryManager.GetItemAmount(AtmaFishItemId)) + " Atma of the Fish.");
                await ZoneChange.HandleZoneChange(AtmaFishZoneId, true);
            }
            else if (!ConditionParser.HasAtLeast(AtmaBullItemId, ModeSettings.Instance.AtmaToFarm))
            {
                if (Core.Player.InCombat || !WorldManager.CanTeleport() || WorldManager.ZoneId == AtmaBullZoneId)
                {
                    return(true);
                }

                Logger.SendLog("We need " + (ModeSettings.Instance.AtmaToFarm - OracleInventoryManager.GetItemAmount(AtmaBullItemId)) + " Atma of the Bull.");
                await ZoneChange.HandleZoneChange(AtmaBullZoneId, true);
            }
            else if (!ConditionParser.HasAtLeast(AtmaScalesItemId, ModeSettings.Instance.AtmaToFarm))
            {
                if (Core.Player.InCombat || !WorldManager.CanTeleport() || WorldManager.ZoneId == AtmaScalesZoneId)
                {
                    return(true);
                }

                Logger.SendLog("We need " + (ModeSettings.Instance.AtmaToFarm - OracleInventoryManager.GetItemAmount(AtmaScalesItemId))
                               + " Atma of the Scales.");
                await ZoneChange.HandleZoneChange(AtmaScalesZoneId, true);
            }
            else if (!ConditionParser.HasAtLeast(AtmaTwinsItemId, ModeSettings.Instance.AtmaToFarm))
            {
                if (Core.Player.InCombat || !WorldManager.CanTeleport() || WorldManager.ZoneId == AtmaTwinsZoneId)
                {
                    return(true);
                }

                Logger.SendLog("We need " + (ModeSettings.Instance.AtmaToFarm - OracleInventoryManager.GetItemAmount(AtmaTwinsItemId)) + " Atma of the Twins.");
                await ZoneChange.HandleZoneChange(AtmaTwinsZoneId, true);
            }
            else if (!ConditionParser.HasAtLeast(AtmaScorpionItemId, ModeSettings.Instance.AtmaToFarm))
            {
                if (Core.Player.InCombat || !WorldManager.CanTeleport() || WorldManager.ZoneId == AtmaScorpionZoneId)
                {
                    return(true);
                }

                Logger.SendLog("We need " + (ModeSettings.Instance.AtmaToFarm - OracleInventoryManager.GetItemAmount(AtmaScorpionItemId))
                               + " Atma of the Scorpion.");
                await ZoneChange.HandleZoneChange(AtmaScorpionZoneId, true);
            }
            else if (!ConditionParser.HasAtLeast(AtmaArcherItemId, ModeSettings.Instance.AtmaToFarm))
            {
                if (Core.Player.InCombat || !WorldManager.CanTeleport() || WorldManager.ZoneId == AtmaArcherZoneId)
                {
                    return(true);
                }

                Logger.SendLog("We need " + (ModeSettings.Instance.AtmaToFarm - OracleInventoryManager.GetItemAmount(AtmaArcherItemId))
                               + " Atma of the Archer.");
                await ZoneChange.HandleZoneChange(AtmaArcherZoneId, true);
            }
            else if (!ConditionParser.HasAtLeast(AtmaGoatItemId, ModeSettings.Instance.AtmaToFarm))
            {
                if (Core.Player.InCombat || !WorldManager.CanTeleport() || WorldManager.ZoneId == AtmaGoatZoneId)
                {
                    return(true);
                }

                Logger.SendLog("We need " + (ModeSettings.Instance.AtmaToFarm - OracleInventoryManager.GetItemAmount(AtmaGoatItemId)) + " Atma of the Goat.");
                await ZoneChange.HandleZoneChange(AtmaGoatZoneId, true);
            }
            else if (!ConditionParser.HasAtLeast(AtmaMaidenItemId, ModeSettings.Instance.AtmaToFarm))
            {
                if (Core.Player.InCombat || !WorldManager.CanTeleport() || WorldManager.ZoneId == AtmaMaidenZoneId)
                {
                    return(true);
                }

                Logger.SendLog("We need " + (ModeSettings.Instance.AtmaToFarm - OracleInventoryManager.GetItemAmount(AtmaMaidenItemId))
                               + " Atma of the Maiden.");
                await ZoneChange.HandleZoneChange(AtmaMaidenZoneId, true);
            }
            else if (!Core.Player.InCombat)
            {
                Logger.SendLog("We have collected " + ModeSettings.Instance.AtmaToFarm + " of every Atma! Stopping Oracle.");
                await OracleTeleportManager.TeleportToClosestCity();

                OracleBot.StopOracle("We are done!");
            }

            return(true);
        }