Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        private async Task <bool> UsingTownPortal()
        {
            if (!await CommonCoroutines.UseTownPortal())
            {
                return(false);
            }

            State = States.UsedTownPortal;
            return(false);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        /// <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);
        }
Beispiel #6
0
        private async Task <bool> UsingTownPortal()
        {
            if (HasReachedDestionation)
            {
                State = States.Completed;
                return(false);
            }

            if (!await CommonCoroutines.UseTownPortal("Adventurer"))
            {
                return(false);
            }

            State = States.UsedTownPortal;
            return(false);
        }
Beispiel #7
0
        /// <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);
        }