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