public static async Task <bool> LeaveFinishedRift() { var turnInStep = RiftHelper.RiftQuest?.Step == RiftQuest.RiftStep.NotStarted && RiftHelper.RiftQuest?.State == QuestState.InProgress; if (turnInStep) { if (Targetting.RoutineWantsToLoot()) { return(true); } if (Player.IsInRift || Player.IsIsInGreaterRift) { Log.Info("Going to town, rift is finished"); await CommonCoroutines.UseTownPortal(); return(true); } if (Player.IsInTown && AutoFollow.CurrentLeader != null && !AutoFollow.CurrentLeader.IsInTown) { Log.Info("Waiting for leader to return to town"); await Coroutine.Sleep(1000); return(true); } } return(false); }
public static async Task <bool> Execute() { if (ZetaDia.Me.IsInCombat) { Core.Logger.Debug("[ReturnToStash] Cannot return to stash while in combat"); return(false); } if (!ZetaDia.IsInTown && ZetaDia.Me.IsFullyValid() && !ZetaDia.Me.IsInCombat && UIElements.BackgroundScreenPCButtonRecall.IsEnabled) { StartedOutOfTown = true; await CommonCoroutines.UseTownPortal("[ReturnToStash] Returning to stash"); return(true); } if (!GameUI.IsElementVisible(GameUI.StashDialogMainPage) && ZetaDia.IsInTown) { GameUI.CloseVendorWindow(); if (TownInfo.Stash.Distance > 10f) { if (!await MoveToAndInteract.Execute(TownInfo.Stash.GetActor())) { return(true); } } } return(true); }
private async Task <bool> UsingTownPortal() { if (!await CommonCoroutines.UseTownPortal()) { return(false); } State = States.UsedTownPortal; return(false); }
public static async Task <bool> ReturnToStashTask() { if (ZetaDia.Me.IsInCombat) { Logger.LogDebug("Cannot return to stash while in combat"); return(false); } if (!ZetaDia.IsInTown && ZetaDia.Me.IsFullyValid() && !ZetaDia.Me.IsInCombat && UIElements.BackgroundScreenPCButtonRecall.IsEnabled) { StartedOutOfTown = true; await CommonCoroutines.UseTownPortal("Returning to stash"); return(true); } if (!GameUI.IsElementVisible(GameUI.StashDialogMainPage) && ZetaDia.IsInTown) { // Move to Stash if (TownRun.StashLocation.Distance2D(ZetaDia.Me.Position) > 10f) { await MoveTo(TownRun.StashLocation, "Shared Stash"); return(true); } if (TownRun.StashLocation.Distance2D(ZetaDia.Me.Position) <= 10f && TownRun.SharedStash == null) { Logger.LogError("Shared Stash actor is null!"); return(false); } // Open Stash if (TownRun.StashLocation.Distance2D(ZetaDia.Me.Position) <= 10f && TownRun.SharedStash != null && !GameUI.IsElementVisible(GameUI.StashDialogMainPage)) { while (ZetaDia.Me.Movement.IsMoving) { Navigator.PlayerMover.MoveStop(); await Coroutine.Yield(); } Logger.Log("Opening Stash"); TownRun.SharedStash.Interact(); await Coroutine.Sleep(200); await Coroutine.Yield(); if (GameUI.IsElementVisible(GameUI.StashDialogMainPage)) { return(true); } return(true); } } return(true); }
/// <summary> /// Move to orek and interact with him. /// </summary> public static async Task <bool> LeaveRiftWhenDone() { if (RiftHelper.IsInRift && RiftHelper.RiftQuest.Step == RiftQuest.RiftStep.Cleared) { if (!await CommonCoroutines.UseTownPortal("Rift Finished")) { return(false); } return(true); } return(false); }
private async Task <bool> UsingTownPortal() { if (HasReachedDestionation) { State = States.Completed; return(false); } if (!await CommonCoroutines.UseTownPortal("Adventurer")) { return(false); } State = States.UsedTownPortal; return(false); }
/// <summary> /// Move to orek and interact with him. /// </summary> public static async Task <bool> LeaveRiftWhenDone() { if (!RiftHelper.IsInRift || RiftHelper.RiftQuest.Step != RiftQuest.RiftStep.Cleared) { return(false); } var followerAllowedToLeave = !AutoFollow.CurrentLeader.IsInSameWorld || AutoFollow.CurrentLeader.IsCastingTownPortal || AutoFollow.CurrentLeader.IsVendoring; if ((Player.IsLeader || followerAllowedToLeave)) { if (!await CommonCoroutines.UseTownPortal("Rift Finished")) { return(false); } return(true); } await Coroutine.Sleep(1000); Log.Info("Waiting for leader to be ready before leaving rift... "); return(false); }
private static async Task <bool> OpenRiftTask() { // Move to and use Greater Rift Portal if (ZetaDia.Me.IsParticipatingInTieredLootRun && ZetaDia.IsInTown && ZetaDia.CurrentLevelAreaId == (int)SNOLevelArea.x1_Westm_Hub && ConditionParser.IsActiveQuestAndStep((int)SNOQuest.X1_LR_DungeonFinder, 13)) { // [202EBD3C] GizmoType: Portal Name: X1_OpenWorld_Tiered_Rifts_Portal-5041 ActorSNO: 396751 Distance: 11.58544 Position: <606.84, 750.39, 2.53> Barracade: False Radius: 8.316568 var moveToPortal = new MoveToActorTag { QuestId = (int)SNOQuest.X1_LR_DungeonFinder, StepId = 13, ActorId = GreaterRiftPortalSNO, X = 606, Y = 750, Z = 2, IsPortal = true, InteractRange = 9, Timeout = 10 }; Logr.Log("Queueing MoveToActor for interacting with Greater Rift Portal"); BotBehaviorQueue.Queue(moveToPortal, ret => ZetaDia.Me.IsParticipatingInTieredLootRun && ZetaDia.IsInTown && ZetaDia.CurrentLevelAreaId == (int)SNOLevelArea.x1_Westm_Hub && !ConditionParser.IsActiveQuestAndStep(337492, 10)); return(true); } if (!SimpleFollow.Leader.RequestOpenRift) { return(false); } if (HighestLevelTieredRiftKey > SimpleFollow.Leader.HighestTeamRiftKey) { return(false); } // In regular rift quests if (ConditionParser.IsActiveQuestAndStep(337492, 1) || ConditionParser.IsActiveQuestAndStep(337492, 3) || ConditionParser.IsActiveQuestAndStep(337492, 13) || ConditionParser.IsActiveQuestAndStep(337492, 16)) { return(false); } // In Rift Trial if (ZetaDia.ActInfo.ActiveQuests.Any(q => q.QuestSNO == (int)SNOQuest.p1_TieredRift_Challenge)) { return(false); } // Our rift key is the lowest of the team, lets open a rift! var keyPriorityList = SimpleFollow.Leader.RiftKeyPriority; if (keyPriorityList.Count != 3) { throw new ArgumentOutOfRangeException("RiftKeyPriority", "Expected 3 Rift keys, API is broken?"); } if (ZetaDia.Actors.GetActorsOfType <DiaObject>(true).Any(i => i.IsValid && i.ActorSNO == RiftPortalSNO)) { Logr.Log("Rift Portal already open!"); return(false); } if (!ZetaDia.IsInTown) { return(await CommonCoroutines.UseTownPortal("Going to town to open rift")); } bool needsGreaterKeys = !ZetaDia.Me.Inventory.Backpack.Any(i => IsRiftKey(i) && IsGreaterRiftKey(i)) && ZetaDia.Me.Inventory.StashItems.Any(i => IsRiftKey(i) && IsGreaterRiftKey(i)); bool needsTrialKeys = !ZetaDia.Me.Inventory.Backpack.Any(i => IsRiftKey(i) && IsTrialRiftKey(i)) && ZetaDia.Me.Inventory.StashItems.Any(i => IsRiftKey(i) && IsTrialRiftKey(i)); bool needsNormalKeys = !ZetaDia.Me.Inventory.Backpack.Any(i => IsRiftKey(i) && IsNormalKey(i)) && ZetaDia.Me.Inventory.StashItems.Any(i => IsRiftKey(i) && IsNormalKey(i)); if (needsGreaterKeys) { Logr.Log("Moving to stash to get Greater Rift Keys"); BotBehaviorQueue.Queue(new GetItemFromStashTag { GreaterRiftKey = true, StackCount = 1 }); return(true); } if (needsTrialKeys) { Logr.Log("Moving to stash to get Trial Rift Keys"); BotBehaviorQueue.Queue(new GetItemFromStashTag { ActorId = 408416, StackCount = 1 }); return(true); } if (needsNormalKeys) { Logr.Log("Moving to stash to get Rift Keys"); BotBehaviorQueue.Queue(new GetItemFromStashTag { ActorId = (int)SNOActor.LootRunKey, StackCount = 1 }); return(true); } int questStepId = 1; var quest = ZetaDia.ActInfo.ActiveQuests.FirstOrDefault(q => q.QuestSNO == (int)SNOQuest.X1_LR_DungeonFinder); if (quest != null) { questStepId = quest.QuestStep; } if (ZetaDia.IsInTown && !ConditionParser.ActorExistsAt(RiftPortalSNO, 606, 750, 2, 50) && !ConditionParser.ActorExistsAt(GreaterRiftPortalSNO, 606, 750, 2, 50)) { BotBehaviorQueue.Reset(); Logr.Log("Queueing QTOpenRiftWrapper"); BotBehaviorQueue.Queue(new QTOpenRiftWrapperTag()); BotBehaviorQueue.Queue(new WaitTimerTag { QuestId = 337492, StepId = questStepId, WaitTime = 2000 }); FollowTag.LastInteractTime = DateTime.Now.AddSeconds(15); } if (ZetaDia.IsInTown && ConditionParser.ActorExistsAt(RiftPortalSNO, 606, 750, 2, 50) && ConditionParser.IsActiveQuestAndStep(337492, questStepId)) { Logr.Log("Queueing MoveToActor for Rift Portal"); BotBehaviorQueue.Reset(); BotBehaviorQueue.Queue(new MoveToActorTag { QuestId = 337492, StepId = questStepId, ActorId = RiftPortalSNO, Timeout = 10 }); BotBehaviorQueue.Queue(new WaitTimerTag { QuestId = 337492, StepId = questStepId, WaitTime = 2000 }); FollowTag.LastInteractTime = DateTime.Now.AddSeconds(15); } if (ZetaDia.IsInTown && ConditionParser.ActorExistsAt(GreaterRiftPortalSNO, 606, 750, 2, 50) && ConditionParser.IsActiveQuestAndStep(337492, questStepId)) { Logr.Log("Queueing MoveToActor for Greater Rift Portal"); BotBehaviorQueue.Reset(); BotBehaviorQueue.Queue(new MoveToActorTag { QuestId = 337492, StepId = questStepId, ActorId = GreaterRiftPortalSNO, Timeout = 10 }); BotBehaviorQueue.Queue(new WaitTimerTag { QuestId = 337492, StepId = questStepId, WaitTime = 2000 }); FollowTag.LastInteractTime = DateTime.Now.AddSeconds(15); } return(true); }
private async Task <bool> GetItemFromStashRoutine() { if (!ZetaDia.IsInGame) { return(false); } if (ZetaDia.IsLoadingWorld) { return(false); } if (!ZetaDia.IsInTown) { _isDone = true; return(false); } if (ZetaDia.Me == null) { return(false); } if (!ZetaDia.Me.IsValid) { return(false); } // Validate parameters if (GameBalanceId == 0 && ActorId == 0 && !GreaterRiftKey) { Logger.Error("GetItemFromStash: invalid parameters. Please specify at least gameBalanceId=\"\" or actorId=\"\" with valid ID numbers or set greaterRiftKey=\"True\""); _isDone = true; return(true); } var backPackCount = ZetaDia.Me.Inventory.Backpack.Where(ItemMatcherFunc).Sum(i => i.ItemStackQuantity); // Check to see if we already have the stack in our backpack if (StackCount != 0 && backPackCount >= StackCount) { Logger.Log("Already have {0} items in our backpack (GameBalanceId={1} ActorSNO={2} GreaterRiftKey={3})", backPackCount, GameBalanceId, ActorId, GreaterRiftKey); _isDone = true; return(true); } // Go to Town if (!ZetaDia.IsInTown) { await CommonCoroutines.UseTownPortal("Returning to Town to get Item"); } // Move to Stash if (StashLocation.Distance2D(ZetaDia.Me.Position) > 10f) { await CommonCoroutines.MoveAndStop(StashLocation, 10f, "Stash Location"); } if (StashLocation.Distance2D(ZetaDia.Me.Position) <= 10f && SharedStash == null) { Logger.Error("Shared Stash actor is null!"); } // Open Stash if (StashLocation.Distance2D(ZetaDia.Me.Position) <= 10f && SharedStash != null && !UIElements.StashWindow.IsVisible) { Logger.Log("Opening Stash"); SharedStash.Interact(); await Coroutine.Sleep(500); } if (UIElements.StashWindow.IsVisible) { Logger.Debug("Stash window is visible"); var itemList = ZetaDia.Me.Inventory.StashItems.Where(ItemMatcherFunc).ToList(); var firstItem = itemList.FirstOrDefault(); // Check to see if we have the item in the stash bool invalidGameBalanceId = false, invalidActorId = false; if (GameBalanceId != 0 && itemList.All(item => item.GameBalanceId != GameBalanceId)) { Logger.Error("Unable to find item in stash with GameBalanceId {0}", GameBalanceId); invalidGameBalanceId = true; } if (ActorId != 0 && itemList.All(item => item.ActorSNO != ActorId)) { Logger.Error("Unable to find item in stash with ActorSNO {0}", ActorId); invalidActorId = true; } if (firstItem == null || (invalidGameBalanceId && invalidActorId)) { _isDone = true; return(true); } Vector2 freeItemSlot = Helpers.ItemManager.FindValidBackpackLocation(firstItem.IsTwoSquareItem); if (freeItemSlot.X == -1 && freeItemSlot.Y == -1) { Logger.Log("No free slots to move items to"); _isDone = true; return(true); } var itemCount = 0; while ((StackCount == 0 || StackCount > backPackCount) && (MaxItems <= 0 || itemCount < MaxItems)) { bool highestFirst = QuestToolsSettings.Instance.UseHighestKeystone; var itemsList = ZetaDia.Me.Inventory.StashItems.Where(ItemMatcherFunc).ToList(); ACDItem item; if (GreaterRiftKey && highestFirst) { item = itemsList.OrderByDescending(i => i.TieredLootRunKeyLevel) .ThenBy(i => i.ItemStackQuantity) .FirstOrDefault(); } else if (GreaterRiftKey && !highestFirst) { item = itemsList.OrderBy(i => i.TieredLootRunKeyLevel) .ThenBy(i => i.ItemStackQuantity) .FirstOrDefault(); } else { item = itemsList.OrderBy(i => i.ItemStackQuantity).FirstOrDefault(); } if (item == null) { break; } Logger.Debug("Withdrawing item {0} from stash {0}", item.Name); ZetaDia.Me.Inventory.QuickWithdraw(item); itemCount++; await Coroutine.Yield(); backPackCount = ZetaDia.Me.Inventory.Backpack.Where(ItemMatcherFunc).Sum(i => i.ItemStackQuantity); } if (MaxItems > 0 && itemCount >= MaxItems) { _isDone = true; Logger.Log("Have max items of {0} in backpack", itemCount); return(true); } if (backPackCount >= StackCount) { _isDone = true; Logger.Log("Have stack count of {0} items in backpack", backPackCount); return(true); } } Logger.Debug("No Action Taken (StackCount={0} backPackCount={1} GameBalanceId={2} ActorId={3} GreaterRiftKey={4}", StackCount, backPackCount, GameBalanceId, ActorId, GreaterRiftKey); return(true); }
private async Task <bool> UpgradeGemsTask(bool force = false) { if (VendorDialog.IsVisible && (GameUI.IsElementVisible(UpgradeGemButton) && UpgradeGemButton.IsEnabled) || GameUI.IsElementVisible(UpgradeButton)) { bool hasUpgradeableGems = ZetaDia.Actors.GetActorsOfType <ACDItem>() .Where(item => item.ItemType == ItemType.LegendaryGem).Any(item => GetUpgradeChance(item) > 0.00f); if (!hasUpgradeableGems) { Logger.Error("No valid gems found to upgrade! Leaving game..."); await CommonCoroutines.UseTownPortal("Unable to upgrade gem - leaving game"); await Coroutine.Sleep(100); await Coroutine.Yield(); await CommonCoroutines.LeaveGame("Unable to upgrade gem"); _isDone = true; await Coroutine.Sleep(100); await Coroutine.Yield(); return(true); } float minimumGemChance = force ? 0f : QuestToolsSettings.Instance.MinimumGemChance; List <ACDItem> gems = ZetaDia.Actors.GetActorsOfType <ACDItem>() .Where(item => item.ItemType == ItemType.LegendaryGem && GetUpgradeChance(item) > 0.00f && GetUpgradeChance(item) >= minimumGemChance) .OrderByDescending(item => GetUpgradeChance(item)) .ThenByDescending(item => item.JewelRank).ToList(); if (gems.Count == 0 && !_isGemsOnly) //No gems that can be upgraded - upgrade keystone { return(false); } if (gems.Count == 0 && _isGemsOnly) { gems = ZetaDia.Actors.GetActorsOfType <ACDItem>() .Where(item => item.ItemType == ItemType.LegendaryGem) .Where(item => !IsMaxLevelGem(item) && GetUpgradeChance(item) > 0.00f) .OrderByDescending(item => GetUpgradeChance(item)) .ThenByDescending(item => item.JewelRank).ToList(); } _isGemsOnly = true; int selectedGemId = int.MaxValue; string selectedGemPreference = ""; foreach (string gemName in QuestToolsSettings.Instance.GemPriority) { selectedGemId = DataDictionary.LegendaryGems.FirstOrDefault(kv => kv.Value == gemName).Key; // Map to known gem type or dynamic priority if (selectedGemId == int.MaxValue) { Logger.Error("Invalid Gem Name: {0}", gemName); continue; } // Equipped Gems if (selectedGemId == 0) { selectedGemPreference = gemName; if (gems.Any(IsGemEquipped)) { gems = gems.Where(item => item.InventorySlot == InventorySlot.Socket).ToList(); break; } } // Lowest Rank if (selectedGemId == 1) { selectedGemPreference = gemName; gems = gems.OrderBy(item => item.JewelRank).ToList(); break; } // Highest Rank if (selectedGemId == 2) { selectedGemPreference = gemName; gems = gems.OrderByDescending(item => item.JewelRank).ToList(); break; } // Selected gem if (gems.Any(i => i.ActorSNO == selectedGemId)) { selectedGemPreference = gemName; if (gems.Any(i => i.ActorSNO == selectedGemId)) { gems = gems.Where(i => i.ActorSNO == selectedGemId).Take(1).ToList(); break; } } // No gem found... skip! } if (selectedGemId < 10) { Logger.Log("Using gem priority of {0}", selectedGemPreference); } var bestGem = gems.FirstOrDefault(); if (bestGem != null && await CommonCoroutines.AttemptUpgradeGem(bestGem)) { await Coroutine.Sleep(250); GameUI.SafeClickElement(VendorCloseButton, "Vendor Window Close Button"); await Coroutine.Yield(); return(true); } else { /* * Demonbuddy MAY randomly fail to upgrade the selected gem. This is a workaround, in case we get stuck... */ var randomGems = ZetaDia.Actors.GetActorsOfType <ACDItem>() .Where(item => item.ItemType == ItemType.LegendaryGem) .OrderBy(item => item.JewelRank).ToList(); Random random = new Random(DateTime.UtcNow.Millisecond); int i = random.Next(0, randomGems.Count - 1); var randomGem = randomGems.ElementAtOrDefault(i); if (randomGem == null) { Logger.Error("Error: No gems found"); return(false); } Logger.Error("Gem Upgrade failed! Upgrading random Gem {0} ({1}) - {2:##.##}% {3} ", randomGem.Name, randomGem.JewelRank, GetUpgradeChance(randomGem) * 100, IsGemEquipped(randomGem) ? "Equipped" : string.Empty); if (!await CommonCoroutines.AttemptUpgradeGem(randomGem)) { Logger.Error("Random gem upgrade also failed. Something... seriously... wrong... "); } return(true); } } return(false); }