protected override RunStatus PostAction(object context) { List <string> lines; try { lines = SelectIconString.Lines(); } catch { return(RunStatus.Failure); } if (lines == null) { return(RunStatus.Failure); } int lineCount = lines.Count; int choiceIndex = lineCount - choiceOffset; if (choiceIndex >= lineCount || choiceIndex < 0) { return(RunStatus.Failure); } SelectIconString.ClickSlot((uint)choiceIndex); Logger.CardinalMessage("Selected icon string: {0}", lines[choiceIndex]); return(RunStatus.Success); }
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); }