private async Task MainMenu() { TreeRoot.StatusText = "Running Main Menu"; if (PartyManager.IsInParty && PartyManager.IsPartyLeader) { if (!IsCrossRealm) { Logger.Warn("I am a Party Leader, waiting for everyone to join the zone."); await Coroutine.Wait(TimeSpan.FromMinutes(30), PartyLeaderWaitConditions); } else { Logger.Warn("I am a Party Leader in a XRealm Party. I assume everyone is in the zone."); } if (DeepDungeon.StopPlz) { return; } Logger.Warn("Everyone is now in the zone"); for (var i = 0; i < 6; i++) { Logger.Warn("Giving them {0} seconds to do what they need to at the NPC", 60 - i * 10); await Coroutine.Sleep(TimeSpan.FromSeconds(10)); if (DeepDungeon.StopPlz) { return; } } } //read the current level state await ReadStartingLevel(); // have save data and our max level is if (GetFloorStatus(_saveStates)) { Logger.Verbose("Resetting the floor"); await DeepDungeonSaveData.ClickReset(UseSaveSlot); // todo: wait for server response in a better way. await Coroutine.Sleep(1000); } if (_error) { lock (_errorLock) { _error = false; } } if (!PartyManager.IsInParty || PartyManager.IsPartyLeader) { Logger.Verbose("Starting Save Slot Selection process"); await DeepDungeonSaveData.ClickSaveSlot(UseSaveSlot); await Coroutine.Wait(2000, () => SelectString.IsOpen || ContentsFinderConfirm.IsOpen || SelectYesno.IsOpen); // if select yesno is open (new as of 4.36 hotfixes) if (SelectYesno.IsOpen) { SelectYesno.ClickYes(); await Coroutine.Sleep(1000); } // if we are using an "empty" save slot if (SelectString.IsOpen) { Logger.Verbose("Using Empty Save Slot"); Logger.Verbose("Going through the Talk dialogs..."); await Coroutine.Sleep(1000); SelectString.ClickSlot(0); await Coroutine.Sleep(1000); // Logger.Verbose("Are you sure Fixed Party"); await Coroutine.Wait(1000, () => SelectYesno.IsOpen); await Coroutine.Sleep(150); if (SelectYesno.IsOpen) { SelectYesno.ClickYes(); await Coroutine.Sleep(150); } await Coroutine.Sleep(1000); //-- Are you sure you want to enter alone? if (!PartyManager.IsInParty) { // Logger.Verbose("Enter Alone Talk"); //talk stuff await Coroutine.Wait(1000, () => Talk.DialogOpen); await Coroutine.Sleep(150); Talk.Next(); await Coroutine.Sleep(500); // Logger.Verbose("Enter Alone?"); await Coroutine.Wait(1000, () => SelectYesno.IsOpen); SelectYesno.ClickYes(); await Coroutine.Sleep(1000); } // Logger.Verbose("Floor 51 wait"); //--floor 51 logic await Coroutine.Wait(1000, () => SelectString.IsOpen || ContentsFinderConfirm.IsOpen); if (SelectString.IsOpen) { await Coroutine.Sleep(1000); if (Settings.Instance.StartAt51) { Logger.Verbose("Start at {1}: {0}", _bettertargetFloor.End > Constants.SelectedDungeon.CheckPointLevel - 1, Constants.SelectedDungeon.CheckPointLevel); } if (Settings.Instance.StartAt51 && _bettertargetFloor.End > Constants.SelectedDungeon.CheckPointLevel - 1) { SelectString.ClickSlot(1); } else { SelectString.ClickSlot(0); } await Coroutine.Sleep(1000); } Logger.Verbose("Done with window interaction."); } else { Logger.Verbose($"ContentsFinderConfirm is open: {ContentsFinderConfirm.IsOpen} so we aren't going through the main menu."); } _bettertargetFloor = null; } Logger.Info("Waiting on the queue, Or for an error."); DungeonQueue.Reset(); }
/// <summary> /// Determines if we need to reset the floors levels. /// Returns TRUE: Reset the floor data /// Returns FALSE: Go to the next set. /// </summary> /// <param name="apLevels"></param> /// <param name="sdSaveStates"></param> /// <returns></returns> public bool GetFloorStatus(byte[] apLevels, DeepDungeonSaveState[] sdSaveStates) { var stop = Settings.Instance.SelectedLevel; try { if (!PartyManager.IsInParty && !Settings.Instance.SoloStop) { Logger.Warn("You are solo, Setting the bot to do 1-10."); stop = Settings.Instance.FloorSettings[0]; } _targetFloor = stop; Logger.Verbose("Going to floor: {0}", _targetFloor.LevelMax); } catch (Exception) { Logger.Verbose("Exception with setting floor data. setting target floor to 10"); _targetFloor = new FloorSetting { LevelMax = 10 }; } Logger.Verbose("Starting Level {0}", _targetFloor.LevelMax - 9); var lm = _targetFloor.LevelMax < sdSaveStates[UseSaveSlot].Floor; var notfixed = !sdSaveStates[UseSaveSlot].FixedParty; var cjChanged = sdSaveStates[UseSaveSlot].Class != Core.Me.CurrentJob; var partyData = sdSaveStates[UseSaveSlot].PartyMembers.ToList(); var saved = sdSaveStates[UseSaveSlot].Saved; bool partySize; var partyClass = false; //if (saved && partyData.Count == PartyManager.NumMembers) //{ // foreach (var r in partyData) // { // var c = PartyManager.AllMembers.FirstOrDefault(i => i.Name == r.Name); // if (c == null) // { // Logger.Warn("Resetting save data: A member in the party has changed."); // partyClass = true; // break; // } // if (c.Class == r.Class) continue; // Logger.Warn("Resetting save data: Someone has changed jobs"); // partyClass = true; // break; // } //} if (PartyManager.IsInParty) { partySize = PartyManager.NumMembers != partyData.Count; } else { partySize = partyData.Count != 1; } if (saved && lm) { Logger.Verbose("Resetting save data: Level Max ({0}) is Less than floor value: {1}", _targetFloor.LevelMax, sdSaveStates[UseSaveSlot].Floor); } if (saved && notfixed) { Logger.Verbose("Resetting save data: Our class/job has changed from: {0} to {1}", sdSaveStates[UseSaveSlot].Class, Core.Me.CurrentJob); } if (saved && partySize) { Logger.Verbose("Resetting save data: Our Party has changed. {0} != {1}", PartyManager.NumMembers, partyData.Count); } if (saved && _error) { Logger.Verbose("Resetting save data: there was a warning waiting for the duty finder."); } return(saved && (lm || notfixed || cjChanged || partySize || partyClass || _error)); }
/// <summary> /// Determines if we need to reset the floors levels. /// Returns TRUE: Reset the floor data /// Returns FALSE: Go to the next set. /// </summary> /// <param name="sdSaveStates"></param> /// <returns></returns> private bool GetFloorStatus(DeepDungeonSaveState[] sdSaveStates) { var stop = Settings.Instance.BetterSelectedLevel; //Settings.Instance.SelectedLevel; try { _bettertargetFloor = stop; Logger.Verbose("Going to floor: {0}", _bettertargetFloor.End); } catch (Exception) { Logger.Verbose("Exception with setting floor data. setting target floor to 10"); stop = Constants.SelectedDungeon.Floors[0]; } Logger.Verbose("Starting Level {0}", _bettertargetFloor.Start); var lm = _bettertargetFloor.End < sdSaveStates[UseSaveSlot].Floor; var notfixed = !sdSaveStates[UseSaveSlot].FixedParty; var cjChanged = sdSaveStates[UseSaveSlot].Class != Core.Me.CurrentJob; var partyData = sdSaveStates[UseSaveSlot].PartyMembers.ToList(); var saved = sdSaveStates[UseSaveSlot].Saved; bool partySize; //var partyClass = false; if (PartyManager.IsInParty) { partySize = PartyManager.NumMembers != partyData.Count; } else { partySize = partyData.Count != 1; } if (saved && lm) { Logger.Verbose("Resetting save data: Level Max ({0}) is Less than floor value: {1}", _bettertargetFloor.End, sdSaveStates[UseSaveSlot].Floor); } if (saved && notfixed) { Logger.Verbose("Resetting save data: Our class/job has changed from: {0} to {1}", sdSaveStates[UseSaveSlot].Class, Core.Me.CurrentJob); } if (saved && partySize) { Logger.Verbose("Resetting save data: Our Party has changed. {0} != {1}", PartyManager.NumMembers, partyData.Count); } if (saved && _error) { Logger.Verbose("Resetting save data: there was a warning waiting for the duty finder."); } if (Settings.Instance.StartAt51 && sdSaveStates[UseSaveSlot].Floor < Constants.SelectedDungeon.CheckPointLevel) { Logger.Verbose("Resetting save data: Level start ({0}) is Less than checkpoint floor: {1}", sdSaveStates[UseSaveSlot].Floor, Constants.SelectedDungeon.CheckPointLevel); } return(saved && (lm || notfixed || cjChanged || partySize || _error || Settings.Instance.StartAt51 && sdSaveStates[UseSaveSlot].Floor < Constants.SelectedDungeon.CheckPointLevel)); }
private async Task MainMenu() { TreeRoot.StatusText = "Running Main Menu"; if (PartyManager.IsInParty) { Logger.Warn("I am in a party. I am waiting for everyone to join the zone."); await Coroutine.Wait(TimeSpan.FromMinutes(30), PartyLeaderWaitConditions); if (DeepDungeon.StopPlz) { return; } if (PartyManager.IsPartyLeader) { Logger.Warn("Everyone is now in the zone"); for (var i = 0; i < 6; i++) { Logger.Warn("Giving them {0} seconds to do what they need to at the NPC", 60 - i * 10); await Coroutine.Sleep(TimeSpan.FromSeconds(10)); if (DeepDungeon.StopPlz) { return; } } } } //read the current level state await ReadStartingLevel(); // have save data and our max level is if (GetFloorStatus(_aetherialLevels, _saveStates)) { Logger.Verbose("Resetting the floor"); await DeepDungeonSaveData.ClickReset(UseSaveSlot); _saveStates = Sd.SaveStates; } if (_error) { lock (_errorLock) _error = false; } if (!PartyManager.IsInParty || PartyManager.IsPartyLeader) { await DeepDungeonSaveData.ClickSaveSlot(UseSaveSlot); // if we are using an "empty" save slot if (!_saveStates[UseSaveSlot].Saved) { Logger.Verbose("Using Empty Save Slot"); Logger.Verbose("Going through the Talk dialogs..."); // -- Fixed Party -- await Coroutine.Sleep(1000); await Coroutine.Wait(1000, () => SelectString.IsOpen); SelectString.ClickSlot(0); await Coroutine.Sleep(500); // Logger.Verbose("Are you sure Fixed Party"); await Coroutine.Wait(1000, () => SelectYesno.IsOpen); if (SelectYesno.IsOpen) { SelectYesno.ClickYes(); } await Coroutine.Sleep(500); //-- Are you sure you want to enter alone? if (!PartyManager.IsInParty) { // Logger.Verbose("Enter Alone Talk"); //talk stuff await Coroutine.Wait(1000, () => Talk.DialogOpen); Talk.Next(); await Coroutine.Sleep(500); // Logger.Verbose("Enter Alone?"); await Coroutine.Wait(1000, () => SelectYesno.IsOpen); SelectYesno.ClickYes(); await Coroutine.Sleep(500); } // Logger.Verbose("Floor 51 wait"); //--floor 51 logic await Coroutine.Wait(1000, () => SelectString.IsOpen || ContentsFinderConfirm.IsOpen); if (SelectString.IsOpen) { await Coroutine.Sleep(500); if (Settings.Instance.StartAt51) { Logger.Verbose("Start at 51: {0}", _targetFloor.LevelMax > 50); } if (Settings.Instance.StartAt51 && _targetFloor.LevelMax > 50) { SelectString.ClickSlot(1); } else { SelectString.ClickSlot(0); } } Logger.Verbose("Done with window interaction."); } _targetFloor = null; } Logger.Info("Waiting on the queue, Or for an error."); DungeonQueue.Reset(); }