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