Ejemplo n.º 1
0
        public static async Task <bool> ChooseString(uint index)
        {
            if (!SelectString.IsOpen)
            {
                return(false);
            }

            var lines = SelectString.Lines();

            int ticks = 0;

            while (ticks < 20 && SelectString.IsOpen)
            {
                SelectString.ClickSlot(index);
                await Coroutine.Sleep(500);

                ticks++;

                var current = SelectString.Lines();
                if (!lines.SequenceEqual(current))
                {
                    break;
                }
            }

            return(true);
        }
Ejemplo n.º 2
0
        public async Task <bool> ReturnToZone()
        {
            await this.TeleportTo();

            await this.Interact();

            await Coroutine.Wait(5000, () => SelectString.IsOpen);

            if (!SelectString.IsOpen)
            {
                Logger.Instance.Error("Timeout, SelectString window did not open.");
                return(false);
            }

            if (SelectString.Lines().Any(line => line.Contains(AethernetText)))
            {
                Logger.Instance.Info("Selecting line " + AethernetText);
                SelectString.ClickLineContains(AethernetText);
                // SelectString.ClickSlot(0);  going to try to make it more compatible with possible changes to game.

                await Coroutine.Wait(5000, () => !SelectString.IsOpen);

                await Coroutine.Wait(10000, () => SelectString.IsOpen);

                if (!SelectString.IsOpen)
                {
                    Logger.Instance.Error("Timeout, SelectString window did not open.");
                    return(false);
                }
            }

            Logger.Instance.Info("Selecting line " + Slot);
            SelectString.ClickSlot(Slot);

            await Coroutine.Wait(5000, () => CommonBehaviors.IsLoading);

            await CommonTasks.HandleLoading();

            await Coroutine.Sleep(2000); // Weird stuff happens without this.

            return(true);
        }
Ejemplo n.º 3
0
        protected override async Task <bool> Main()
        {
            await this.Interact(Distance);

            await Coroutine.Wait(5000, () => SelectString.IsOpen);

            if (!SelectString.IsOpen)
            {
                Logger.Error(Localization.Localization.ExUseAethernet_SelectLineTimeout);
                return(isDone = true);
            }

            if (SelectString.Lines().Any(line => line.Contains(AethernetText)))
            {
                Logger.Info(Localization.Localization.ExUseAethernet_SelectLine + AethernetText);
                SelectString.ClickLineContains(AethernetText);
                // SelectString.ClickSlot(0);  going to try to make it more compatible with possible changes to game.

                await Coroutine.Wait(5000, () => !SelectString.IsOpen);

                await Coroutine.Wait(10000, () => SelectString.IsOpen);

                if (!SelectString.IsOpen)
                {
                    Logger.Error(Localization.Localization.ExUseAethernet_SelectLineTimeout);
                    return(isDone = true);
                }
            }

            Logger.Info(Localization.Localization.ExUseAethernet_SelectLine + Slot);
            SelectString.ClickSlot(Slot);

            await Coroutine.Wait(5000, () => CommonBehaviors.IsLoading);

            await CommonTasks.HandleLoading();

            await Coroutine.Sleep(2000); // Weird stuff happens without this.

            return(isDone = true);
        }
Ejemplo n.º 4
0
        internal async Task <VentureCheck> CheckRetainer()
        {
            foreach (var lines in SelectString.Lines())
            {
                // TODO: Add CN 'in progress' text.
                if (lines.Contains("(Complete on ") ||
                    lines.Contains("(Abschluss am ") ||
                    lines.Contains("[Fin le ") ||
                    lines.Contains("確認 [~"))
                {
                    return(VentureCheck.InProgress);
                }

                if (lines.EndsWith("(Complete)") ||
                    lines.EndsWith("Unternehmung einsehen") ||
                    lines.EndsWith("tâche terminée") ||
                    lines.EndsWith("[完了]") ||
                    lines.EndsWith("[探险归来]"))
                {
                    // Click on the completed venture
                    SelectString.ClickSlot(5);
                    await Coroutine.Wait(5000, () => RetainerTaskResult.IsOpen);

                    // Assign a new venture
                    RetainerTaskResult.Reassign();
                    await Coroutine.Wait(5000, () => RetainerTaskAsk.IsOpen);

                    // Confirm new venture
                    RetainerTaskAsk.Confirm();
                    await Coroutine.Wait(5000, () => Talk.DialogOpen);

                    // Skip dialog
                    Talk.Next();
                    return(VentureCheck.Completed);
                }
            }
            return(VentureCheck.None);
        }
Ejemplo n.º 5
0
        public async Task <bool> RetainerHandleVentures()
        {
            if (!SelectString.IsOpen)
            {
                return(false);
            }

            if (SelectString.Lines().Contains(Translator.VentureCompleteText))
            {
                //Log("Venture Done");
                SelectString.ClickLineEquals(Translator.VentureCompleteText);

                await Coroutine.Wait(5000, () => RetainerTaskResult.IsOpen);

                if (!RetainerTaskResult.IsOpen)
                {
                    Log("RetainerTaskResult didn't open");
                    return(false);
                }

                var taskId = AgentRetainerVenture.Instance.RetainerTask;

                var task = VentureData.Value.FirstOrDefault(i => i.Id == taskId);

                if (task != default(RetainerTaskData))
                {
                    Log($"Finished Venture {task.Name}");
                    Log($"Reassigning Venture {task.Name}");
                }
                else
                {
                    Log($"Finished Venture");
                    Log($"Reassigning Venture");
                }

                RetainerTaskResult.Reassign();

                await Coroutine.Wait(5000, () => RetainerTaskAsk.IsOpen);

                if (!RetainerTaskAsk.IsOpen)
                {
                    Log("RetainerTaskAsk didn't open");
                    return(false);
                }

                await Coroutine.Wait(2000, RetainerTaskAskExtensions.CanAssign);

                if (RetainerTaskAskExtensions.CanAssign())
                {
                    RetainerTaskAsk.Confirm();
                }
                else
                {
                    Log($"RetainerTaskAsk Error: {RetainerTaskAskExtensions.GetErrorReason()}");
                    RetainerTaskAsk.Close();
                }

                await Coroutine.Wait(1500, () => DialogOpen || SelectString.IsOpen);

                await Coroutine.Sleep(200);

                if (DialogOpen)
                {
                    Next();
                }
                await Coroutine.Sleep(200);

                await Coroutine.Wait(5000, () => SelectString.IsOpen);
            }
            else
            {
                Log("Venture Not Done");
            }


            return(true);
        }
Ejemplo n.º 6
0
        public static async Task SmallTalk(int waitTime = 500)
        {
            await Coroutine.Wait(waitTime, () => InSmallTalk);

            while (InSmallTalk)
            {
                await Coroutine.Yield();

                if (CommonBehaviors.IsLoading)
                {
                    await Coroutine.Wait(-1, () => !CommonBehaviors.IsLoading);
                }

                if (SelectYesno.IsOpen)
                {
                    SelectYesno.ClickNo();
                }

                if (SelectString.IsOpen)
                {
                    if (!await WindowEscapeSpam("SelectString"))
                    {
                        if (SelectString.Lines().Contains("Cancel"))
                        {
                            SelectString.ClickLineContains("Cancel");
                        }
                        else if (SelectString.Lines().Contains("Quit"))
                        {
                            SelectString.ClickLineContains("Quit");
                        }
                        else if (SelectString.Lines().Contains("Exit"))
                        {
                            SelectString.ClickLineContains("Exit");
                        }
                        else
                        {
                            SelectString.ClickSlot((uint)(SelectString.LineCount - 1));
                        }
                    }
                }

                if (SelectIconString.IsOpen)
                {
                    if (!await WindowEscapeSpam("SelectIconString"))
                    {
                        if (SelectIconString.Lines().Contains("Cancel"))
                        {
                            SelectString.ClickLineContains("Cancel");
                        }
                        else if (SelectIconString.Lines().Contains("Quit"))
                        {
                            SelectString.ClickLineContains("Quit");
                        }
                        else if (SelectIconString.Lines().Contains("Exit"))
                        {
                            SelectString.ClickLineContains("Exit");
                        }
                        else
                        {
                            SelectIconString.ClickSlot((uint)(SelectIconString.LineCount - 1));
                        }
                    }
                }

                while (QuestLogManager.InCutscene)
                {
                    AgentCutScene.Instance.PromptSkip();
                    if (AgentCutScene.Instance.CanSkip && SelectString.IsOpen)
                    {
                        SelectString.ClickSlot(0);
                    }
                    await Coroutine.Yield();
                }

                while (Talk.DialogOpen)
                {
                    Talk.Next();
                    await Coroutine.Wait(100, () => !Talk.DialogOpen);

                    await Coroutine.Wait(100, () => Talk.DialogOpen);

                    await Coroutine.Yield();
                }

                if (JournalAccept.IsOpen)
                {
                    JournalAccept.Decline();
                }

                await Coroutine.Wait(500, () => InSmallTalk);
            }
        }
Ejemplo n.º 7
0
        protected override async Task <bool> Main()
        {
            if (interactTimeout.Elapsed.TotalSeconds > Timeout)
            {
                Logger.Error(Localization.Localization.ExTurnInGuildLeve_TurninTimeout);
                isDone = true;
                return(true);
            }

            if (!checkedTransport)
            {
                checkedTransport = true;

                StatusText = Localization.Localization.ExTurnInGuildLeve_CheckTransport;

                var selectYesnoCountWindow = new SelectYesnoCount();
                if (await selectYesnoCountWindow.Refresh(2000))
                {
                    StatusText = Localization.Localization.ExTurnInGuildLeve_SelectTransport;

                    if (AcceptTransport)
                    {
                        selectYesnoCountWindow.Yes();
                        await Coroutine.Wait(5000, () => CommonBehaviors.IsLoading);

                        await Coroutine.Wait(System.Threading.Timeout.Infinite, () => !CommonBehaviors.IsLoading);
                    }
                    else
                    {
                        await selectYesnoCountWindow.CloseInstance();
                    }

                    return(true);
                }
            }

            // Movement
            if (ExProfileBehavior.Me.Distance(Location) > 3.5)
            {
                StatusText = Localization.Localization.ExTurnInGuildLeve_Move + NpcId;

                await Location.MoveTo(radius : 3.4f, name : " NpcId: " + NpcId);

                return(true);
            }

            if (!interactTimeout.IsRunning)
            {
                interactTimeout.Restart();
            }

            // Interact
            if (Core.Target == null && ExProfileBehavior.Me.Distance(Location) <= 3.5)
            {
                return(await InteractWithNpc());
            }

            if (Talk.DialogOpen)
            {
                await HandleTalk();
            }

            if (SelectIconString.IsOpen)
            {
                if (iconStringIndex == 9001)
                {
                    iconStringIndex = (uint)SelectIconString.Lines().Count - 1;
                }

                // We will just click the last quest and decrement until we have either no quests left or none to turn in.
                SelectIconString.ClickSlot(--iconStringIndex);
                await Coroutine.Sleep(500);

                if (iconStringIndex == uint.MaxValue)
                {
                    Logger.Warn(Localization.Localization.ExTurnInGuildLeve_NothingToTurnin);

                    isDone = true;
                    return(true);
                }

                return(true);
            }

            if (SelectString.IsOpen)
            {
                var lines = SelectString.Lines();

                // If Collect Reward exists, we click that; otherwise we will click Close. (-1 as uint = uint.MaxValue)
                var index = (uint)lines.IndexOf(CollectRewardText, StringComparer.InvariantCultureIgnoreCase);

                if (index != uint.MaxValue)
                {
                    Logger.Info(Localization.Localization.ExTurnInGuildLeve_CollectReward, WorldManager.EorzaTime);
                    SelectString.ClickSlot(index);
                    await Coroutine.Yield();

                    return(true);
                }

                // If yes is an option, click it to turn in more items.(crafting)
                index = (uint)lines.IndexOf(YesText, StringComparer.InvariantCultureIgnoreCase);

                if (index != uint.MaxValue)
                {
                    Logger.Info(Localization.Localization.ExTurnInGuildLeve_TurninMore, WorldManager.EorzaTime);
                    SelectString.ClickSlot(index);
                    await Coroutine.Yield();

                    return(true);
                }

                Logger.Warn(Localization.Localization.ExTurnInGuildLeve_NoRewardsLeft);
                isDone = true;
                SelectString.ClickSlot(index);
                await Coroutine.Yield();

                return(true);
            }

            if (Request.IsOpen)
            {
                var itemCount = Memory.Request.ItemsToTurnIn.Length;

                var itemId = Memory.Request.ItemId1;

                IEnumerable <BagSlot> itemSlots =
                    InventoryManager.FilledInventoryAndArmory.Where(
                        bs => bs.RawItemId == itemId && !Blacklist.Contains((uint)bs.Pointer.ToInt32(), BlacklistFlags.Loot)).ToArray();

                if (HqOnly)
                {
                    itemSlots = itemSlots.Where(bs => bs.IsHighQuality);
                }

                if (NqOnly)
                {
                    itemSlots = itemSlots.Where(bs => !bs.IsHighQuality);
                }

                var items = itemSlots.Take(itemCount).ToArray();

                if (items.Length == 0)
                {
                    Logger.Warn(Localization.Localization.ExTurnInGuildLeve_NoItemToTurnin, HqOnly, NqOnly, itemId);
                    isDone = true;
                    return(true);
                }

                StatusText = Localization.Localization.ExTurnInGuildLeve_TurnIn;

                var isHq            = items.Any(i => i.IsHighQuality);
                var itemName        = items[0].EnglishName;
                var requestAttempts = 0;
                while (Request.IsOpen && requestAttempts++ < 5 && Behaviors.ShouldContinue)
                {
                    foreach (var item in items)
                    {
                        item.Handover();
                        await Coroutine.Yield();
                    }

                    await Coroutine.Wait(1000, () => Request.HandOverButtonClickable);

                    if (Request.HandOverButtonClickable)
                    {
                        Request.HandOver();

                        if (isHq)
                        {
                            await Coroutine.Wait(2000, () => !Request.IsOpen && SelectYesno.IsOpen);
                        }
                        else
                        {
                            await Coroutine.Wait(2000, () => !Request.IsOpen);
                        }
                    }
                }

                turnedItemsIn = true;

                if (SelectYesno.IsOpen)
                {
                    SelectYesno.ClickYes();
                    await Coroutine.Yield();

                    Logger.Info(Localization.Localization.ExTurnInGuildLeve_TurnInHq, itemName, WorldManager.EorzaTime);
                }
                else
                {
                    Logger.Info(Localization.Localization.ExTurnInGuildLeve_TurnInNq, itemName, WorldManager.EorzaTime);
                }

                await HandleTalk();

                await Coroutine.Wait(2000, () => JournalResult.IsOpen);

                return(true);
            }

            if (JournalResult.IsOpen)
            {
                await Coroutine.Wait(2000, () => JournalResult.ButtonClickable);

                JournalResult.Complete();
                Logger.Info(Localization.Localization.ExTurnInGuildLeve_Complete, WorldManager.EorzaTime);

                await Coroutine.Wait(2000, () => !JournalResult.IsOpen);
                await HandleTalk();

                return(true);
            }

            if (!await WaitForOpenWindow())
            {
                if (MultipleQuests)
                {
                    Logger.Info(Localization.Localization.ExTurnInGuildLeve_OpenWindow);
                    CloseWindows();
                    ExProfileBehavior.Me.ClearTarget();
                }
                else
                {
                    isDone = true;
                }
            }

            return(true);
        }
Ejemplo n.º 8
0
        protected override async Task <bool> Main()
        {
            var retainerList = new RetainerList();

            foreach (var unit in GameObjectManager.GameObjects.OrderBy(r => r.Distance()))
            {
                if (unit.NpcId == 2000401 || unit.NpcId == 2000441)
                {
                    unit.Interact();
                    break;
                }
            }

            if (!await Coroutine.Wait(5000, () => RetainerList.IsOpen))
            {
                return(isDone = true);
            }
            {
                uint index = 0;
                while (index < RetainerCount)
                {
                    Log("Checking Retainer n° " + (index + 1));
                    await Coroutine.Sleep(200);

                    // Select retainer
                    await retainerList.SelectRetainerAndSkipDialog(index);

                    await Coroutine.Wait(5000, () => SelectString.IsOpen);

                    string ventureLine = SelectString.Lines()[5];
                    Log("Venture Status : " + ventureLine);
                    if (ventureLine.EndsWith("(Complete)") || ventureLine.EndsWith("Unternehmung einsehen") || ventureLine.EndsWith("tâche terminée") || ventureLine.EndsWith("[完了]") || ventureLine.EndsWith("[探险归来]"))
                    {
                        Log("Venture Completed !");
                        // Click on the completed venture
                        SelectString.ClickSlot(5);
                        await Coroutine.Wait(5000, () => RetainerTaskResult.IsOpen);

                        // Assign a new venture
                        RetainerTaskResult.Reassign();
                        await Coroutine.Wait(5000, () => RetainerTaskAsk.IsOpen);

                        // Confirm new venture
                        RetainerTaskAsk.Confirm();
                        await Coroutine.Wait(5000, () => Talk.DialogOpen);

                        // Skip Dialog
                        Talk.Next();
                        await Coroutine.Wait(5000, () => SelectString.IsOpen);
                    }
                    SelectString.ClickSlot((uint)SelectString.LineCount - 1);
                    await Coroutine.Wait(5000, () => Talk.DialogOpen);

                    // Skip Dialog
                    Talk.Next();
                    await Coroutine.Wait(5000, () => RetainerList.IsOpen);

                    index++;
                }
                Log("No more Retainer to check");
                await retainerList.CloseInstanceGently();

                return(isDone = true);
            }
        }
Ejemplo n.º 9
0
        protected override async Task <bool> Main()
        {
            foreach (var unit in GameObjectManager.GameObjects.OrderBy(r => r.Distance()))
            {
                if (unit.NpcId == 2000401 || unit.NpcId == 2000441)
                {
                    unit.Interact();
                    break;
                }
            }
            if (!await Coroutine.Wait(5000, () => SelectString.IsOpen))
            {
                return(isDone = true);
            }
            {
                uint count     = 0;
                var  lineC     = SelectString.LineCount;
                var  countLine = (uint)lineC;
                foreach (var retainer in SelectString.Lines())
                {
                    if (retainer.EndsWith("]") || retainer.EndsWith(")"))
                    {
                        Log("Checking Retainer n° " + (count + 1));
                        // If Venture Completed
                        if (retainer.EndsWith("[探险归来]") || retainer.EndsWith("[Tâche terminée]") || retainer.EndsWith("(Venture complete)"))
                        {
                            Log("Venture Completed !");
                            // Select the retainer
                            SelectString.ClickSlot(count);
                            if (!await Coroutine.Wait(5000, () => Talk.DialogOpen))
                            {
                                continue;
                            }
                            // Skip Dialog
                            Talk.Next();
                            if (!await Coroutine.Wait(5000, () => SelectString.IsOpen))
                            {
                                continue;
                            }
                            // Click on the completed venture
                            SelectString.ClickSlot(5);
                            if (!await Coroutine.Wait(5000, () => RetainerTaskResult.IsOpen))
                            {
                                continue;
                            }
                            // Assign a new venture
                            RetainerTaskResult.Reassign();
                            if (!await Coroutine.Wait(5000, () => RetainerTaskAsk.IsOpen))
                            {
                                continue;
                            }
                            // Confirm new venture
                            RetainerTaskAsk.Confirm();
                            if (!await Coroutine.Wait(5000, () => Talk.DialogOpen))
                            {
                                continue;
                            }
                            // Skip Dialog
                            Talk.Next();
                            if (!await Coroutine.Wait(5000, () => SelectString.IsOpen))
                            {
                                continue;
                            }
                            SelectString.ClickSlot((uint)SelectString.LineCount - 1);
                            if (!await Coroutine.Wait(5000, () => Talk.DialogOpen))
                            {
                                continue;
                            }
                            // Skip Dialog
                            Talk.Next();
                            await Coroutine.Sleep(3000);

                            foreach (var unit in GameObjectManager.GameObjects.OrderBy(r => r.Distance()))
                            {
                                if (unit.NpcId == 2000401 || unit.NpcId == 2000441)
                                {
                                    unit.Interact();
                                    break;
                                }
                            }
                            if (await Coroutine.Wait(5000, () => SelectString.IsOpen))
                            {
                                count++;
                            }
                        }
                        else
                        {
                            Log("Venture not Completed !");
                            count++;
                        }
                    }
                    else
                    {
                        Log("No more Retainer to check");
                        SelectString.ClickSlot(countLine - 1);
                    }
                }
                return(isDone = true);
            }
        }
Ejemplo n.º 10
0
        protected override async Task <bool> Main()
        {
            var retainerList = new RetainerList();

            foreach (var unit in GameObjectManager.GameObjects.OrderBy(r => r.Distance()))
            {
                if (unit.NpcId == 2000401 || unit.NpcId == 2000441 || unit.Name == "Summoning Bell" || unit.Name == "Sonnette" || unit.Name == "Krämerklingel" ||
                    unit.Name == "リテイナーベル" || unit.Name == "传唤铃")
                {
                    unit.Interact();
                    break;
                }
            }

            if (!await Coroutine.Wait(5000, () => RetainerList.IsOpen))
            {
                return(isDone = true);
            }
            {
                int  retainerCount = GetRetainerNum.GetNumberOfRetainers();
                uint index         = 0;
                while (index < retainerCount)
                {
                    Log("Checking Retainer n° " + (index + 1));
                    await Coroutine.Sleep(300);

                    // Select retainer
                    await retainerList.SelectRetainerAndSkipDialog(index);

                    await Coroutine.Wait(5000, () => SelectString.IsOpen);

                    if (!SelectString.IsOpen)
                    {
                        Log("Something went wrong when checking Retainer n° " + (index + 1) + ", its contract might be suspended !");
                        break;
                    }
                    string ventureLine = SelectString.Lines()[5];
                    Log("Venture Status : " + ventureLine);
                    if (ventureLine.EndsWith("(Complete)") || ventureLine.EndsWith("Unternehmung einsehen") || ventureLine.EndsWith("tâche terminée") || ventureLine.EndsWith("[完了]") || ventureLine.EndsWith("[探险归来]") || ventureLine.EndsWith("[结束]"))
                    {
                        Log("Venture Completed !");
                        // Click on the completed venture
                        SelectString.ClickSlot(5);
                        await Coroutine.Wait(5000, () => RetainerTaskResult.IsOpen);

                        // Assign a new venture
                        RetainerTaskResult.Reassign();
                        await Coroutine.Wait(5000, () => RetainerTaskAsk.IsOpen);

                        // Confirm new venture
                        RetainerTaskAsk.Confirm();
                        await Coroutine.Wait(5000, () => Talk.DialogOpen);

                        // Skip Dialog
                        Talk.Next();
                        await Coroutine.Wait(5000, () => SelectString.IsOpen);
                    }
                    SelectString.ClickSlot((uint)SelectString.LineCount - 1);
                    await Coroutine.Wait(5000, () => Talk.DialogOpen);

                    // Skip Dialog
                    Talk.Next();
                    await Coroutine.Wait(5000, () => RetainerList.IsOpen);

                    index++;
                }
                Log("No more Retainer to check");
                if (!retainerList.IsValid)
                {
                    await retainerList.Refresh(1000);
                }
                await retainerList.CloseInstance(300);

                return(isDone = true);
            }
        }
Ejemplo n.º 11
0
        protected override async Task <bool> Main()
        {
            foreach (var unit in GameObjectManager.GameObjects.OrderBy(r => r.Distance()))
            {
                if (unit.Name == "传唤铃" || unit.NpcId == 2000401 || unit.NpcId == 2000441)
                {
                    unit.Interact();
                    break;
                }
            }
            if (!await Coroutine.Wait(3000, () => SelectString.IsOpen))
            {
                if (RaptureAtkUnitManager.GetWindowByName("RetainerList") == null)
                {
                    return(isDone = true);
                }

                const int Offset0           = 0x1CA;
                const int Offset2           = 0x160;
                var       elementCount      = Core.Memory.Read <ushort>(RaptureAtkUnitManager.GetWindowByName("RetainerList").Pointer + Offset0);
                var       addr              = Core.Memory.Read <IntPtr>(RaptureAtkUnitManager.GetWindowByName("RetainerList").Pointer + Offset2);
                TwoInt[]  elements          = Core.Memory.ReadArray <TwoInt>(addr, elementCount);
                int       NumberOfRetainers = elements[2].TrimmedData;
                for (var i = 0; i < NumberOfRetainers; i++)
                {
                    RaptureAtkUnitManager.GetWindowByName("RetainerList").SendAction(2, 3UL, 2UL, 3UL, (ulong)i);
                    await Coroutine.Sleep(300);

                    await Coroutine.Wait(9000, () => Talk.DialogOpen);

                    Talk.Next();

                    if (!await Coroutine.Wait(5000, () => SelectString.IsOpen))
                    {
                        return(isDone = true);
                    }
                    foreach (var retainer in SelectString.Lines())
                    {
                        if (retainer.EndsWith("[结束]") || retainer.EndsWith("[Tâche terminée]") || retainer.EndsWith("(Venture complete)"))
                        {
                            Log("探险结束!");
                            SelectString.ClickSlot(5);
                            if (!await Coroutine.Wait(5000, () => RetainerTaskResult.IsOpen))
                            {
                                continue;
                            }
                            RetainerTaskResult.Reassign();
                            if (!await Coroutine.Wait(5000, () => RetainerTaskAsk.IsOpen))
                            {
                                continue;
                            }
                            RetainerTaskAsk.Confirm();
                            if (!await Coroutine.Wait(5000, () => Talk.DialogOpen))
                            {
                                continue;
                            }
                            Talk.Next();
                            if (!await Coroutine.Wait(5000, () => SelectString.IsOpen))
                            {
                                continue;
                            }
                        }
                    }

                    SelectString.ClickSlot((uint)SelectString.LineCount - 1);
                    if (!await Coroutine.Wait(5000, () => Talk.DialogOpen))
                    {
                        continue;
                    }
                    Talk.Next();
                    await Coroutine.Sleep(3000);
                }
                RaptureAtkUnitManager.GetWindowByName("RetainerList").SendAction(1, 3uL, 4294967295uL);
            }
            return(isDone = true);
        }