From 5e2d8f648b0a15a156484e33a5822cb7c72f0974 Mon Sep 17 00:00:00 2001 From: alydev Date: Wed, 26 Nov 2025 06:52:32 +1000 Subject: [PATCH] muffin v7.38.7 --- .../QuestController.cs | 51 +- .../Questionable.Data/ChangelogData.cs | 874 +++++++++--------- .../Questionable.External/QuestionableIpc.cs | 73 ++ .../DutyConfigComponent.cs | 136 ++- .../SinglePlayerDutyConfigComponent.cs | 2 +- .../StopConditionComponent.cs | 51 +- Questionable/Questionable/Configuration.cs | 2 + 7 files changed, 703 insertions(+), 486 deletions(-) diff --git a/Questionable/Questionable.Controller/QuestController.cs b/Questionable/Questionable.Controller/QuestController.cs index dafe051..265fa27 100644 --- a/Questionable/Questionable.Controller/QuestController.cs +++ b/Questionable/Questionable.Controller/QuestController.cs @@ -350,26 +350,30 @@ internal sealed class QuestController : MiniTaskController _escPressCount = 0; _lastEscPressTime = DateTime.MinValue; } - if (_configuration.Stop.Enabled && _configuration.Stop.LevelToStopAfter && _clientState.LocalPlayer != null) + if (_configuration.Stop.Enabled && _startedQuest != null) { - int level = _clientState.LocalPlayer.Level; - if (level >= _configuration.Stop.TargetLevel && IsRunning) + string text = _startedQuest.Quest.Id.ToString(); + if (_configuration.Stop.QuestSequences.TryGetValue(text, out var value) && value.HasValue) { - _logger.LogInformation("Reached level stop condition (level: {CurrentLevel}, target: {TargetLevel})", level, _configuration.Stop.TargetLevel); - _chatGui.Print($"Reached or exceeded target level {_configuration.Stop.TargetLevel}.", "Questionable", 576); - Stop($"Level stop condition reached [{level}]"); - return; + int sequence = _startedQuest.Sequence; + if (sequence >= value.Value && IsRunning) + { + _logger.LogInformation("Reached quest-specific sequence stop condition (quest: {QuestId}, sequence: {CurrentSequence}, target: {TargetSequence})", _startedQuest.Quest.Id, sequence, value.Value); + _chatGui.Print($"Quest '{_startedQuest.Quest.Info.Name}' reached sequence {sequence}, configured stop sequence is {value.Value}.", "Questionable", 576); + Stop($"Quest-specific sequence stop condition reached [{text}@{sequence}]"); + return; + } } - } - if (_configuration.Stop.Enabled && _configuration.Stop.SequenceToStopAfter && CurrentQuest != null) - { - int sequence = CurrentQuest.Sequence; - if (sequence >= _configuration.Stop.TargetSequence && IsRunning) + else if (_configuration.Stop.SequenceToStopAfter && CurrentQuest != null) { - _logger.LogInformation("Reached quest sequence stop condition (sequence: {CurrentSequence}, target: {TargetSequence})", sequence, _configuration.Stop.TargetSequence); - _chatGui.Print($"Quest sequence {sequence} reached target sequence {_configuration.Stop.TargetSequence}.", "Questionable", 576); - Stop($"Sequence stop condition reached [{sequence}]"); - return; + int sequence2 = CurrentQuest.Sequence; + if (sequence2 >= _configuration.Stop.TargetSequence && IsRunning) + { + _logger.LogInformation("Reached global quest sequence stop condition (sequence: {CurrentSequence}, target: {TargetSequence})", sequence2, _configuration.Stop.TargetSequence); + _chatGui.Print($"Quest sequence {sequence2} reached target sequence {_configuration.Stop.TargetSequence}.", "Questionable", 576); + Stop($"Sequence stop condition reached [{sequence2}]"); + return; + } } } bool flag = AutomationType == EAutomationType.Automatic && (_taskQueue.AllTasksComplete || _taskQueue.CurrentTaskExecutor?.CurrentTask is WaitAtEnd.WaitQuestAccepted); @@ -383,14 +387,17 @@ internal sealed class QuestController : MiniTaskController if (step == 0 || step == 255) { flag2 = true; - goto IL_04f5; + goto IL_054c; } } flag2 = false; - goto IL_04f5; + goto IL_054c; } - goto IL_04f9; - IL_04f9: + goto IL_0550; + IL_054c: + flag = flag2; + goto IL_0550; + IL_0550: if (flag && DateTime.Now >= CurrentQuest.StepProgress.StartedAt.AddSeconds(15.0)) { lock (_progressLock) @@ -405,10 +412,6 @@ internal sealed class QuestController : MiniTaskController CheckAutoRefreshCondition(); UpdateCurrentTask(); } - return; - IL_04f5: - flag = flag2; - goto IL_04f9; } private void CheckAutoRefreshCondition() diff --git a/Questionable/Questionable.Data/ChangelogData.cs b/Questionable/Questionable.Data/ChangelogData.cs index 113aacf..52d9248 100644 --- a/Questionable/Questionable.Data/ChangelogData.cs +++ b/Questionable/Questionable.Data/ChangelogData.cs @@ -11,14 +11,14 @@ internal static class ChangelogData static ChangelogData() { - int num = 41; + int num = 42; List list = new List(num); CollectionsMarshal.SetCount(list, num); Span span = CollectionsMarshal.AsSpan(list); int num2 = 0; ref ChangelogEntry reference = ref span[num2]; DateOnly releaseDate = new DateOnly(2025, 11, 25); - int num3 = 3; + int num3 = 2; List list2 = new List(num3); CollectionsMarshal.SetCount(list2, num3); Span span2 = CollectionsMarshal.AsSpan(list2); @@ -29,10 +29,10 @@ internal static class ChangelogData CollectionsMarshal.SetCount(list3, num5); Span span3 = CollectionsMarshal.AsSpan(list3); int num6 = 0; - span3[num6] = "Updated Allied Society journal text"; + span3[num6] = "Added individual sequence stop condition for each quest"; num6++; - span3[num6] = "Improved Allied Society rank handling"; - reference2 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list3); + span3[num6] = "Added Trials to Duties tab in config"; + reference2 = new ChangeEntry(EChangeCategory.Added, "Major features", list3); num4++; ref ChangeEntry reference3 = ref span2[num4]; num6 = 1; @@ -40,34 +40,36 @@ internal static class ChangelogData CollectionsMarshal.SetCount(list4, num6); span3 = CollectionsMarshal.AsSpan(list4); num5 = 0; - span3[num5] = "Added IPC for Allied Society: AddAlliedSocietyOptimalQuests, GetAlliedSocietyOptimalQuests"; + span3[num5] = "Added IPC for stop conditions: GetQuestSequenceStopCondition, SetQuestSequenceStopCondition, RemoveQuestSequenceStopCondition, GetAllQuestSequenceStopConditions"; reference3 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list4); - num4++; - ref ChangeEntry reference4 = ref span2[num4]; - num5 = 1; - List list5 = new List(num5); - CollectionsMarshal.SetCount(list5, num5); - span3 = CollectionsMarshal.AsSpan(list5); - num6 = 0; - span3[num6] = "Fixed quest (We Come in Peace)"; - reference4 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list5); - reference = new ChangelogEntry("7.38.6", releaseDate, list2); + reference = new ChangelogEntry("7.38.7", releaseDate, list2); num2++; - ref ChangelogEntry reference5 = ref span[num2]; - DateOnly releaseDate2 = new DateOnly(2025, 11, 24); - num4 = 2; - List list6 = new List(num4); - CollectionsMarshal.SetCount(list6, num4); - span2 = CollectionsMarshal.AsSpan(list6); + ref ChangelogEntry reference4 = ref span[num2]; + DateOnly releaseDate2 = new DateOnly(2025, 11, 25); + num4 = 3; + List list5 = new List(num4); + CollectionsMarshal.SetCount(list5, num4); + span2 = CollectionsMarshal.AsSpan(list5); num3 = 0; + ref ChangeEntry reference5 = ref span2[num3]; + num5 = 2; + List list6 = new List(num5); + CollectionsMarshal.SetCount(list6, num5); + span3 = CollectionsMarshal.AsSpan(list6); + num6 = 0; + span3[num6] = "Updated Allied Society journal text"; + num6++; + span3[num6] = "Improved Allied Society rank handling"; + reference5 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list6); + num3++; ref ChangeEntry reference6 = ref span2[num3]; num6 = 1; List list7 = new List(num6); CollectionsMarshal.SetCount(list7, num6); span3 = CollectionsMarshal.AsSpan(list7); num5 = 0; - span3[num5] = "Added Allied Society daily allowance tracker with bulk quest adding buttons"; - reference6 = new ChangeEntry(EChangeCategory.Added, "Major features", list7); + span3[num5] = "Added IPC for Allied Society: AddAlliedSocietyOptimalQuests, GetAlliedSocietyOptimalQuests"; + reference6 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list7); num3++; ref ChangeEntry reference7 = ref span2[num3]; num5 = 1; @@ -75,12 +77,12 @@ internal static class ChangelogData CollectionsMarshal.SetCount(list8, num5); span3 = CollectionsMarshal.AsSpan(list8); num6 = 0; - span3[num6] = "Added IPC for Allied Society: GetRemainingAllowances, GetTimeUntilReset, GetAvailableQuestIds, GetAllAvailableQuestCounts, IsMaxRank, GetCurrentRank, GetSocietiesWithAvailableQuests"; - reference7 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list8); - reference5 = new ChangelogEntry("7.38.5", releaseDate2, list6); + span3[num6] = "Fixed quest (We Come in Peace)"; + reference7 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list8); + reference4 = new ChangelogEntry("7.38.6", releaseDate2, list5); num2++; ref ChangelogEntry reference8 = ref span[num2]; - DateOnly releaseDate3 = new DateOnly(2025, 11, 23); + DateOnly releaseDate3 = new DateOnly(2025, 11, 24); num3 = 2; List list9 = new List(num3); CollectionsMarshal.SetCount(list9, num3); @@ -92,15 +94,41 @@ internal static class ChangelogData CollectionsMarshal.SetCount(list10, num6); span3 = CollectionsMarshal.AsSpan(list10); num5 = 0; - span3[num5] = "Explicitly declare support for BMR singleplayer duty (The Rematch)"; - reference9 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list10); + span3[num5] = "Added Allied Society daily allowance tracker with bulk quest adding buttons"; + reference9 = new ChangeEntry(EChangeCategory.Added, "Major features", list10); num4++; ref ChangeEntry reference10 = ref span2[num4]; - num5 = 8; + num5 = 1; List list11 = new List(num5); CollectionsMarshal.SetCount(list11, num5); span3 = CollectionsMarshal.AsSpan(list11); num6 = 0; + span3[num6] = "Added IPC for Allied Society: GetRemainingAllowances, GetTimeUntilReset, GetAvailableQuestIds, GetAllAvailableQuestCounts, IsMaxRank, GetCurrentRank, GetSocietiesWithAvailableQuests"; + reference10 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list11); + reference8 = new ChangelogEntry("7.38.5", releaseDate3, list9); + num2++; + ref ChangelogEntry reference11 = ref span[num2]; + DateOnly releaseDate4 = new DateOnly(2025, 11, 23); + num4 = 2; + List list12 = new List(num4); + CollectionsMarshal.SetCount(list12, num4); + span2 = CollectionsMarshal.AsSpan(list12); + num3 = 0; + ref ChangeEntry reference12 = ref span2[num3]; + num6 = 1; + List list13 = new List(num6); + CollectionsMarshal.SetCount(list13, num6); + span3 = CollectionsMarshal.AsSpan(list13); + num5 = 0; + span3[num5] = "Explicitly declare support for BMR singleplayer duty (The Rematch)"; + reference12 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list13); + num3++; + ref ChangeEntry reference13 = ref span2[num3]; + num5 = 8; + List list14 = new List(num5); + CollectionsMarshal.SetCount(list14, num5); + span3 = CollectionsMarshal.AsSpan(list14); + num6 = 0; span3[num6] = "Fixed quest (Microbrewing) to not get stuck near ramp"; num6++; span3[num6] = "Fixed quest (The Illuminated Land) where pathing would kill the player due to fall damage"; @@ -116,69 +144,37 @@ internal static class ChangelogData span3[num6] = "Fixed quest (Poisoned Hearts) where incorrect pathing caused the player to die"; num6++; span3[num6] = "Fixed quests (Savage Snares) and (An Apple a Day) not detecting kills"; - reference10 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list11); - reference8 = new ChangelogEntry("7.38.4", releaseDate3, list9); + reference13 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list14); + reference11 = new ChangelogEntry("7.38.4", releaseDate4, list12); num2++; - ref ChangelogEntry reference11 = ref span[num2]; - DateOnly releaseDate4 = new DateOnly(2025, 11, 23); - num4 = 3; - List list12 = new List(num4); - CollectionsMarshal.SetCount(list12, num4); - span2 = CollectionsMarshal.AsSpan(list12); - num3 = 0; - ref ChangeEntry reference12 = ref span2[num3]; + ref ChangelogEntry reference14 = ref span[num2]; + DateOnly releaseDate5 = new DateOnly(2025, 11, 23); + num3 = 3; + List list15 = new List(num3); + CollectionsMarshal.SetCount(list15, num3); + span2 = CollectionsMarshal.AsSpan(list15); + num4 = 0; + ref ChangeEntry reference15 = ref span2[num4]; num6 = 2; - List list13 = new List(num6); - CollectionsMarshal.SetCount(list13, num6); - span3 = CollectionsMarshal.AsSpan(list13); + List list16 = new List(num6); + CollectionsMarshal.SetCount(list16, num6); + span3 = CollectionsMarshal.AsSpan(list16); num5 = 0; span3[num5] = "Added RequireHq to crafting InteractionType"; num5++; span3[num5] = "Mark GC quests as Locked if rank not achieved"; - reference12 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list13); - num3++; - ref ChangeEntry reference13 = ref span2[num3]; - num5 = 2; - List list14 = new List(num5); - CollectionsMarshal.SetCount(list14, num5); - span3 = CollectionsMarshal.AsSpan(list14); - num6 = 0; - span3[num6] = "Added IPC for stop conditions: GetStopConditionsEnabled, SetStopConditionsEnabled, GetStopQuestList, AddStopQuest, RemoveStopQuest, ClearStopQuests, GetLevelStopCondition, SetLevelStopCondition, GetSequenceStopCondition, SetSequenceStopCondition"; - num6++; - span3[num6] = "Added IPC for priority quests: GetPriorityQuests, RemovePriorityQuest, ReorderPriorityQuest, GetAvailablePresets, GetPresetQuests, AddPresetToPriority, IsPresetAvailable, IsQuestInPriority, GetQuestPriorityIndex, HasAvailablePriorityQuests"; - reference13 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list14); - num3++; - ref ChangeEntry reference14 = ref span2[num3]; - num6 = 3; - List list15 = new List(num6); - CollectionsMarshal.SetCount(list15, num6); - span3 = CollectionsMarshal.AsSpan(list15); - num5 = 0; - span3[num5] = "Fixed line breaks not working in dialog strings"; - num5++; - span3[num5] = "Fixed quest (Labor of Love)"; - num5++; - span3[num5] = "Fixed quest (Sea of Sorrow)"; - reference14 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list15); - reference11 = new ChangelogEntry("7.38.3", releaseDate4, list12); - num2++; - ref ChangelogEntry reference15 = ref span[num2]; - DateOnly releaseDate5 = new DateOnly(2025, 11, 18); - num3 = 3; - List list16 = new List(num3); - CollectionsMarshal.SetCount(list16, num3); - span2 = CollectionsMarshal.AsSpan(list16); - num4 = 0; + reference15 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list16); + num4++; ref ChangeEntry reference16 = ref span2[num4]; num5 = 2; List list17 = new List(num5); CollectionsMarshal.SetCount(list17, num5); span3 = CollectionsMarshal.AsSpan(list17); num6 = 0; - span3[num6] = "Auto Duty unsync options for each duty (Duty Support, Unsync Solo, Unsync Party)"; + span3[num6] = "Added IPC for stop conditions: GetStopConditionsEnabled, SetStopConditionsEnabled, GetStopQuestList, AddStopQuest, RemoveStopQuest, ClearStopQuests, GetLevelStopCondition, SetLevelStopCondition, GetSequenceStopCondition, SetSequenceStopCondition"; num6++; - span3[num6] = "Added Auto Duty unsync options to quest schema and updated quests using old unsync method"; - reference16 = new ChangeEntry(EChangeCategory.Added, "Major features", list17); + span3[num6] = "Added IPC for priority quests: GetPriorityQuests, RemovePriorityQuest, ReorderPriorityQuest, GetAvailablePresets, GetPresetQuests, AddPresetToPriority, IsPresetAvailable, IsQuestInPriority, GetQuestPriorityIndex, HasAvailablePriorityQuests"; + reference16 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list17); num4++; ref ChangeEntry reference17 = ref span2[num4]; num6 = 3; @@ -186,15 +182,13 @@ internal static class ChangelogData CollectionsMarshal.SetCount(list18, num6); span3 = CollectionsMarshal.AsSpan(list18); num5 = 0; - span3[num5] = "Added IPC for duty sync handling: GetDefaultDutyMode, SetDefaultDutyMode"; + span3[num5] = "Fixed line breaks not working in dialog strings"; num5++; - span3[num5] = "Added IPC for duty mode overrides: GetDutyModeOverride, SetDutyModeOverride"; + span3[num5] = "Fixed quest (Labor of Love)"; num5++; - span3[num5] = "Added IPC for clearing overrides: ClearDutyModeOverride, ClearAllDutyModeOverrides"; - reference17 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list18); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed quest (Constant Cravings)"); - reference15 = new ChangelogEntry("7.38.2", releaseDate5, list16); + span3[num5] = "Fixed quest (Sea of Sorrow)"; + reference17 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list18); + reference14 = new ChangelogEntry("7.38.3", releaseDate5, list15); num2++; ref ChangelogEntry reference18 = ref span[num2]; DateOnly releaseDate6 = new DateOnly(2025, 11, 18); @@ -204,13 +198,15 @@ internal static class ChangelogData span2 = CollectionsMarshal.AsSpan(list19); num3 = 0; ref ChangeEntry reference19 = ref span2[num3]; - num5 = 1; + num5 = 2; List list20 = new List(num5); CollectionsMarshal.SetCount(list20, num5); span3 = CollectionsMarshal.AsSpan(list20); num6 = 0; - span3[num6] = "Added new fields to quest schema"; - reference19 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list20); + span3[num6] = "Auto Duty unsync options for each duty (Duty Support, Unsync Solo, Unsync Party)"; + num6++; + span3[num6] = "Added Auto Duty unsync options to quest schema and updated quests using old unsync method"; + reference19 = new ChangeEntry(EChangeCategory.Added, "Major features", list20); num3++; ref ChangeEntry reference20 = ref span2[num3]; num6 = 3; @@ -218,390 +214,422 @@ internal static class ChangelogData CollectionsMarshal.SetCount(list21, num6); span3 = CollectionsMarshal.AsSpan(list21); num5 = 0; + span3[num5] = "Added IPC for duty sync handling: GetDefaultDutyMode, SetDefaultDutyMode"; + num5++; + span3[num5] = "Added IPC for duty mode overrides: GetDutyModeOverride, SetDutyModeOverride"; + num5++; + span3[num5] = "Added IPC for clearing overrides: ClearDutyModeOverride, ClearAllDutyModeOverrides"; + reference20 = new ChangeEntry(EChangeCategory.Added, "IPC changes", list21); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed quest (Constant Cravings)"); + reference18 = new ChangelogEntry("7.38.2", releaseDate6, list19); + num2++; + ref ChangelogEntry reference21 = ref span[num2]; + DateOnly releaseDate7 = new DateOnly(2025, 11, 18); + num3 = 3; + List list22 = new List(num3); + CollectionsMarshal.SetCount(list22, num3); + span2 = CollectionsMarshal.AsSpan(list22); + num4 = 0; + ref ChangeEntry reference22 = ref span2[num4]; + num5 = 1; + List list23 = new List(num5); + CollectionsMarshal.SetCount(list23, num5); + span3 = CollectionsMarshal.AsSpan(list23); + num6 = 0; + span3[num6] = "Added new fields to quest schema"; + reference22 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list23); + num4++; + ref ChangeEntry reference23 = ref span2[num4]; + num6 = 3; + List list24 = new List(num6); + CollectionsMarshal.SetCount(list24, num6); + span3 = CollectionsMarshal.AsSpan(list24); + num5 = 0; span3[num5] = "A Faerie Tale Come True"; num5++; span3[num5] = "Constant Cravings"; num5++; span3[num5] = "A Bridge Too Full"; - reference20 = new ChangeEntry(EChangeCategory.QuestUpdates, "Added new quest paths", list21); - num3++; - ref ChangeEntry reference21 = ref span2[num3]; + reference23 = new ChangeEntry(EChangeCategory.QuestUpdates, "Added new quest paths", list24); + num4++; + ref ChangeEntry reference24 = ref span2[num4]; num5 = 3; - List list22 = new List(num5); - CollectionsMarshal.SetCount(list22, num5); - span3 = CollectionsMarshal.AsSpan(list22); + List list25 = new List(num5); + CollectionsMarshal.SetCount(list25, num5); + span3 = CollectionsMarshal.AsSpan(list25); num6 = 0; span3[num6] = "Fixed various quest schemas"; num6++; span3[num6] = "Fixed changelog bullet point encoding"; num6++; span3[num6] = "Fixed item use to wait until item is used before next action"; - reference21 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list22); - reference18 = new ChangelogEntry("7.38.1", releaseDate6, list19); + reference24 = new ChangeEntry(EChangeCategory.Fixed, "Bug fixes", list25); + reference21 = new ChangelogEntry("7.38.1", releaseDate7, list22); num2++; - ref ChangelogEntry reference22 = ref span[num2]; - DateOnly releaseDate7 = new DateOnly(2025, 11, 17); - num3 = 5; - List list23 = new List(num3); - CollectionsMarshal.SetCount(list23, num3); - span2 = CollectionsMarshal.AsSpan(list23); - num4 = 0; - ref ChangeEntry reference23 = ref span2[num4]; + ref ChangelogEntry reference25 = ref span[num2]; + DateOnly releaseDate8 = new DateOnly(2025, 11, 17); + num4 = 5; + List list26 = new List(num4); + CollectionsMarshal.SetCount(list26, num4); + span2 = CollectionsMarshal.AsSpan(list26); + num3 = 0; + ref ChangeEntry reference26 = ref span2[num3]; num6 = 2; - List list24 = new List(num6); - CollectionsMarshal.SetCount(list24, num6); - span3 = CollectionsMarshal.AsSpan(list24); + List list27 = new List(num6); + CollectionsMarshal.SetCount(list27, num6); + span3 = CollectionsMarshal.AsSpan(list27); num5 = 0; span3[num5] = "Quest sequence window to show expected sequences in each quest (with quest searching)"; num5++; span3[num5] = "Changelog"; - reference23 = new ChangeEntry(EChangeCategory.Added, "Major features", list24); - num4++; - ref ChangeEntry reference24 = ref span2[num4]; + reference26 = new ChangeEntry(EChangeCategory.Added, "Major features", list27); + num3++; + ref ChangeEntry reference27 = ref span2[num3]; num5 = 2; - List list25 = new List(num5); - CollectionsMarshal.SetCount(list25, num5); - span3 = CollectionsMarshal.AsSpan(list25); + List list28 = new List(num5); + CollectionsMarshal.SetCount(list28, num5); + span3 = CollectionsMarshal.AsSpan(list28); num6 = 0; span3[num6] = "Updated quest schemas"; num6++; span3[num6] = "Added search bar to preferred mounts and capitalization to mirror game mount names"; - reference24 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list25); - num4++; - ref ChangeEntry reference25 = ref span2[num4]; + reference27 = new ChangeEntry(EChangeCategory.Changed, "Improvements", list28); + num3++; + ref ChangeEntry reference28 = ref span2[num3]; num6 = 3; - List list26 = new List(num6); - CollectionsMarshal.SetCount(list26, num6); - span3 = CollectionsMarshal.AsSpan(list26); + List list29 = new List(num6); + CollectionsMarshal.SetCount(list29, num6); + span3 = CollectionsMarshal.AsSpan(list29); num5 = 0; span3[num5] = "Renamed IsQuestCompleted → IsQuestComplete"; num5++; span3[num5] = "Renamed IsQuestAvailable → IsReadyToAcceptQuest"; num5++; span3[num5] = "Added GetCurrentTask IPC"; - reference25 = new ChangeEntry(EChangeCategory.Changed, "IPC changes", list26); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added all Hildibrand quests"); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed credits/cutscenes playback"); - reference22 = new ChangelogEntry("7.38.0", releaseDate7, list23); - num2++; - ref ChangelogEntry reference26 = ref span[num2]; - DateOnly releaseDate8 = new DateOnly(2025, 11, 8); - num4 = 1; - List list27 = new List(num4); - CollectionsMarshal.SetCount(list27, num4); - span2 = CollectionsMarshal.AsSpan(list27); - num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Fall Guys quest (Just Crowning Around)"); - reference26 = new ChangelogEntry("6.38", releaseDate8, list27); - num2++; - ref ChangelogEntry reference27 = ref span[num2]; - DateOnly releaseDate9 = new DateOnly(2025, 11, 8); - num3 = 1; - List list28 = new List(num3); - CollectionsMarshal.SetCount(list28, num3); - span2 = CollectionsMarshal.AsSpan(list28); - num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Cosmic Exploration and various unlock quests"); - reference27 = new ChangelogEntry("6.37", releaseDate9, list28); - num2++; - ref ChangelogEntry reference28 = ref span[num2]; - DateOnly releaseDate10 = new DateOnly(2025, 11, 2); - num4 = 1; - List list29 = new List(num4); - CollectionsMarshal.SetCount(list29, num4); - span2 = CollectionsMarshal.AsSpan(list29); - num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy Rank 6 quest (With High Spirits)"); - reference28 = new ChangelogEntry("6.36", releaseDate10, list29); + reference28 = new ChangeEntry(EChangeCategory.Changed, "IPC changes", list29); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added all Hildibrand quests"); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed credits/cutscenes playback"); + reference25 = new ChangelogEntry("7.38.0", releaseDate8, list26); num2++; ref ChangelogEntry reference29 = ref span[num2]; - DateOnly releaseDate11 = new DateOnly(2025, 10, 28); + DateOnly releaseDate9 = new DateOnly(2025, 11, 8); num3 = 1; List list30 = new List(num3); CollectionsMarshal.SetCount(list30, num3); span2 = CollectionsMarshal.AsSpan(list30); num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed level 3 MSQ handling if character started on non-XP buff world"); - reference29 = new ChangelogEntry("6.35", releaseDate11, list30); + span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Fall Guys quest (Just Crowning Around)"); + reference29 = new ChangelogEntry("6.38", releaseDate9, list30); num2++; ref ChangelogEntry reference30 = ref span[num2]; - DateOnly releaseDate12 = new DateOnly(2025, 10, 23); - num4 = 2; + DateOnly releaseDate10 = new DateOnly(2025, 11, 8); + num4 = 1; List list31 = new List(num4); CollectionsMarshal.SetCount(list31, num4); span2 = CollectionsMarshal.AsSpan(list31); num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.Added, "Added clear priority quests on logout and on completion config settings"); - num3++; - span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed priority quest importing to respect import order"); - reference30 = new ChangelogEntry("6.34", releaseDate12, list31); + span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Cosmic Exploration and various unlock quests"); + reference30 = new ChangelogEntry("6.37", releaseDate10, list31); num2++; ref ChangelogEntry reference31 = ref span[num2]; - DateOnly releaseDate13 = new DateOnly(2025, 10, 23); + DateOnly releaseDate11 = new DateOnly(2025, 11, 2); num3 = 1; List list32 = new List(num3); CollectionsMarshal.SetCount(list32, num3); span2 = CollectionsMarshal.AsSpan(list32); num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed RSR combat module"); - reference31 = new ChangelogEntry("6.33", releaseDate13, list32); + span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy Rank 6 quest (With High Spirits)"); + reference31 = new ChangelogEntry("6.36", releaseDate11, list32); num2++; ref ChangelogEntry reference32 = ref span[num2]; - DateOnly releaseDate14 = new DateOnly(2025, 10, 23); + DateOnly releaseDate12 = new DateOnly(2025, 10, 28); num4 = 1; List list33 = new List(num4); CollectionsMarshal.SetCount(list33, num4); span2 = CollectionsMarshal.AsSpan(list33); num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy Rank 5 quest (Forged in Corn)"); - reference32 = new ChangelogEntry("6.32", releaseDate14, list33); + span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed level 3 MSQ handling if character started on non-XP buff world"); + reference32 = new ChangelogEntry("6.35", releaseDate12, list33); num2++; ref ChangelogEntry reference33 = ref span[num2]; - DateOnly releaseDate15 = new DateOnly(2025, 10, 21); - num3 = 1; + DateOnly releaseDate13 = new DateOnly(2025, 10, 23); + num3 = 2; List list34 = new List(num3); CollectionsMarshal.SetCount(list34, num3); span2 = CollectionsMarshal.AsSpan(list34); num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Added checks for moogle and allied society quests when using add all available quests"); - reference33 = new ChangelogEntry("6.31", releaseDate15, list34); + span2[num4] = new ChangeEntry(EChangeCategory.Added, "Added clear priority quests on logout and on completion config settings"); + num4++; + span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed priority quest importing to respect import order"); + reference33 = new ChangelogEntry("6.34", releaseDate13, list34); num2++; ref ChangelogEntry reference34 = ref span[num2]; - DateOnly releaseDate16 = new DateOnly(2025, 10, 21); + DateOnly releaseDate14 = new DateOnly(2025, 10, 23); num4 = 1; List list35 = new List(num4); CollectionsMarshal.SetCount(list35, num4); span2 = CollectionsMarshal.AsSpan(list35); num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.Added, "Added button to journal that allows adding all available quests to priority"); - reference34 = new ChangelogEntry("6.30", releaseDate16, list35); + span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed RSR combat module"); + reference34 = new ChangelogEntry("6.33", releaseDate14, list35); num2++; ref ChangelogEntry reference35 = ref span[num2]; - DateOnly releaseDate17 = new DateOnly(2025, 10, 20); - num3 = 2; + DateOnly releaseDate15 = new DateOnly(2025, 10, 23); + num3 = 1; List list36 = new List(num3); CollectionsMarshal.SetCount(list36, num3); span2 = CollectionsMarshal.AsSpan(list36); num4 = 0; - ref ChangeEntry reference36 = ref span2[num4]; + span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy Rank 5 quest (Forged in Corn)"); + reference35 = new ChangelogEntry("6.32", releaseDate15, list36); + num2++; + ref ChangelogEntry reference36 = ref span[num2]; + DateOnly releaseDate16 = new DateOnly(2025, 10, 21); + num4 = 1; + List list37 = new List(num4); + CollectionsMarshal.SetCount(list37, num4); + span2 = CollectionsMarshal.AsSpan(list37); + num3 = 0; + span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Added checks for moogle and allied society quests when using add all available quests"); + reference36 = new ChangelogEntry("6.31", releaseDate16, list37); + num2++; + ref ChangelogEntry reference37 = ref span[num2]; + DateOnly releaseDate17 = new DateOnly(2025, 10, 21); + num3 = 1; + List list38 = new List(num3); + CollectionsMarshal.SetCount(list38, num3); + span2 = CollectionsMarshal.AsSpan(list38); + num4 = 0; + span2[num4] = new ChangeEntry(EChangeCategory.Added, "Added button to journal that allows adding all available quests to priority"); + reference37 = new ChangelogEntry("6.30", releaseDate17, list38); + num2++; + ref ChangelogEntry reference38 = ref span[num2]; + DateOnly releaseDate18 = new DateOnly(2025, 10, 20); + num4 = 2; + List list39 = new List(num4); + CollectionsMarshal.SetCount(list39, num4); + span2 = CollectionsMarshal.AsSpan(list39); + num3 = 0; + ref ChangeEntry reference39 = ref span2[num3]; num5 = 2; - List list37 = new List(num5); - CollectionsMarshal.SetCount(list37, num5); - span3 = CollectionsMarshal.AsSpan(list37); + List list40 = new List(num5); + CollectionsMarshal.SetCount(list40, num5); + span3 = CollectionsMarshal.AsSpan(list40); num6 = 0; span3[num6] = "Added item count to combat handling rework"; num6++; span3[num6] = "Updated Pandora conflicting features"; - reference36 = new ChangeEntry(EChangeCategory.Changed, "Combat handling improvements", list37); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed quest to purchase Gysahl Greens if not in inventory"); - reference35 = new ChangelogEntry("6.29", releaseDate17, list36); - num2++; - ref ChangelogEntry reference37 = ref span[num2]; - DateOnly releaseDate18 = new DateOnly(2025, 10, 19); - num4 = 1; - List list38 = new List(num4); - CollectionsMarshal.SetCount(list38, num4); - span2 = CollectionsMarshal.AsSpan(list38); - num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Reworked kill count combat handling - combat and enemy kills are now processed instantly"); - reference37 = new ChangelogEntry("6.28", releaseDate18, list38); - num2++; - ref ChangelogEntry reference38 = ref span[num2]; - DateOnly releaseDate19 = new DateOnly(2025, 10, 18); - num3 = 2; - List list39 = new List(num3); - CollectionsMarshal.SetCount(list39, num3); - span2 = CollectionsMarshal.AsSpan(list39); - num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Improved Aether Current checking logic"); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed Chocobo Taxi Stand CheckSkip error and Patch 7.3 Fantasia unlock quest date/time"); - reference38 = new ChangelogEntry("6.27", releaseDate19, list39); - num2++; - ref ChangelogEntry reference39 = ref span[num2]; - DateOnly releaseDate20 = new DateOnly(2025, 10, 18); - num4 = 1; - List list40 = new List(num4); - CollectionsMarshal.SetCount(list40, num4); - span2 = CollectionsMarshal.AsSpan(list40); - num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 4 quests"); - reference39 = new ChangelogEntry("6.26", releaseDate20, list40); + reference39 = new ChangeEntry(EChangeCategory.Changed, "Combat handling improvements", list40); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed quest to purchase Gysahl Greens if not in inventory"); + reference38 = new ChangelogEntry("6.29", releaseDate18, list39); num2++; ref ChangelogEntry reference40 = ref span[num2]; - DateOnly releaseDate21 = new DateOnly(2025, 10, 17); + DateOnly releaseDate19 = new DateOnly(2025, 10, 19); num3 = 1; List list41 = new List(num3); CollectionsMarshal.SetCount(list41, num3); span2 = CollectionsMarshal.AsSpan(list41); num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added All Saints' Wake 2025 quests and 7.35 Yok Huy rank 4 quests"); - reference40 = new ChangelogEntry("6.25", releaseDate21, list41); + span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Reworked kill count combat handling - combat and enemy kills are now processed instantly"); + reference40 = new ChangelogEntry("6.28", releaseDate19, list41); num2++; ref ChangelogEntry reference41 = ref span[num2]; - DateOnly releaseDate22 = new DateOnly(2025, 10, 16); - num4 = 1; + DateOnly releaseDate20 = new DateOnly(2025, 10, 18); + num4 = 2; List list42 = new List(num4); CollectionsMarshal.SetCount(list42, num4); span2 = CollectionsMarshal.AsSpan(list42); num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 4 quests and Deep Dungeon quest"); - reference41 = new ChangelogEntry("6.24", releaseDate22, list42); + span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Improved Aether Current checking logic"); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed Chocobo Taxi Stand CheckSkip error and Patch 7.3 Fantasia unlock quest date/time"); + reference41 = new ChangelogEntry("6.27", releaseDate20, list42); num2++; ref ChangelogEntry reference42 = ref span[num2]; - DateOnly releaseDate23 = new DateOnly(2025, 10, 13); + DateOnly releaseDate21 = new DateOnly(2025, 10, 18); num3 = 1; List list43 = new List(num3); CollectionsMarshal.SetCount(list43, num3); span2 = CollectionsMarshal.AsSpan(list43); num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 3 quest (Larder Logistics)"); - reference42 = new ChangelogEntry("6.23", releaseDate23, list43); + span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 4 quests"); + reference42 = new ChangelogEntry("6.26", releaseDate21, list43); num2++; ref ChangelogEntry reference43 = ref span[num2]; - DateOnly releaseDate24 = new DateOnly(2025, 10, 12); - num4 = 3; + DateOnly releaseDate22 = new DateOnly(2025, 10, 17); + num4 = 1; List list44 = new List(num4); CollectionsMarshal.SetCount(list44, num4); span2 = CollectionsMarshal.AsSpan(list44); num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Prevent disabled or Locked quests from being started as 'Start as next quest'"); - num3++; - span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 3 quests"); - num3++; - span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed Yok Huy quest and journal quest chain priority issues"); - reference43 = new ChangelogEntry("6.22", releaseDate24, list44); + span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added All Saints' Wake 2025 quests and 7.35 Yok Huy rank 4 quests"); + reference43 = new ChangelogEntry("6.25", releaseDate22, list44); num2++; ref ChangelogEntry reference44 = ref span[num2]; - DateOnly releaseDate25 = new DateOnly(2025, 10, 12); - num3 = 2; + DateOnly releaseDate23 = new DateOnly(2025, 10, 16); + num3 = 1; List list45 = new List(num3); CollectionsMarshal.SetCount(list45, num3); span2 = CollectionsMarshal.AsSpan(list45); num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.Added, "Added expansion abbreviation to journal window"); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 3 quests"); - reference44 = new ChangelogEntry("6.21", releaseDate25, list45); + span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 4 quests and Deep Dungeon quest"); + reference44 = new ChangelogEntry("6.24", releaseDate23, list45); num2++; ref ChangelogEntry reference45 = ref span[num2]; - DateOnly releaseDate26 = new DateOnly(2025, 10, 10); - num4 = 2; + DateOnly releaseDate24 = new DateOnly(2025, 10, 13); + num4 = 1; List list46 = new List(num4); CollectionsMarshal.SetCount(list46, num4); span2 = CollectionsMarshal.AsSpan(list46); num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Allow completed repeatable quests to be used with 'Add quest and requirements to priority' feature"); - num3++; - span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 1 quest (A Work of Cart)"); - reference45 = new ChangelogEntry("6.20", releaseDate26, list46); + span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 3 quest (Larder Logistics)"); + reference45 = new ChangelogEntry("6.23", releaseDate24, list46); num2++; ref ChangelogEntry reference46 = ref span[num2]; - DateOnly releaseDate27 = new DateOnly(2025, 10, 9); + DateOnly releaseDate25 = new DateOnly(2025, 10, 12); num3 = 3; List list47 = new List(num3); CollectionsMarshal.SetCount(list47, num3); span2 = CollectionsMarshal.AsSpan(list47); num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.Added, "Added config to batch Allied Society quest turn-ins"); + span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Prevent disabled or Locked quests from being started as 'Start as next quest'"); num4++; - span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Repeatable quests now show correct availability state in journal"); + span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 3 quests"); num4++; - span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 2 quests"); - reference46 = new ChangelogEntry("6.19", releaseDate27, list47); + span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed Yok Huy quest and journal quest chain priority issues"); + reference46 = new ChangelogEntry("6.22", releaseDate25, list47); num2++; ref ChangelogEntry reference47 = ref span[num2]; - DateOnly releaseDate28 = new DateOnly(2025, 10, 9); + DateOnly releaseDate26 = new DateOnly(2025, 10, 12); num4 = 2; List list48 = new List(num4); CollectionsMarshal.SetCount(list48, num4); span2 = CollectionsMarshal.AsSpan(list48); num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Show once completed quests with improved state display"); + span2[num3] = new ChangeEntry(EChangeCategory.Added, "Added expansion abbreviation to journal window"); num3++; - span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy daily quest and improvements to various Yok Huy quests"); - reference47 = new ChangelogEntry("6.18", releaseDate28, list48); + span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 3 quests"); + reference47 = new ChangelogEntry("6.21", releaseDate26, list48); num2++; ref ChangelogEntry reference48 = ref span[num2]; - DateOnly releaseDate29 = new DateOnly(2025, 10, 8); - num3 = 1; + DateOnly releaseDate27 = new DateOnly(2025, 10, 10); + num3 = 2; List list49 = new List(num3); CollectionsMarshal.SetCount(list49, num3); span2 = CollectionsMarshal.AsSpan(list49); num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 1 and rank 2 quests"); - reference48 = new ChangelogEntry("6.17", releaseDate29, list49); + span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Allow completed repeatable quests to be used with 'Add quest and requirements to priority' feature"); + num4++; + span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 1 quest (A Work of Cart)"); + reference48 = new ChangelogEntry("6.20", releaseDate27, list49); num2++; ref ChangelogEntry reference49 = ref span[num2]; - DateOnly releaseDate30 = new DateOnly(2025, 10, 8); - num4 = 1; + DateOnly releaseDate28 = new DateOnly(2025, 10, 9); + num4 = 3; List list50 = new List(num4); CollectionsMarshal.SetCount(list50, num4); span2 = CollectionsMarshal.AsSpan(list50); num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Deep Dungeon quest (Faerie Tale)"); - reference49 = new ChangelogEntry("6.16", releaseDate30, list50); + span2[num3] = new ChangeEntry(EChangeCategory.Added, "Added config to batch Allied Society quest turn-ins"); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Repeatable quests now show correct availability state in journal"); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 2 quests"); + reference49 = new ChangelogEntry("6.19", releaseDate28, list50); num2++; ref ChangelogEntry reference50 = ref span[num2]; - DateOnly releaseDate31 = new DateOnly(2025, 10, 8); + DateOnly releaseDate29 = new DateOnly(2025, 10, 9); num3 = 2; List list51 = new List(num3); CollectionsMarshal.SetCount(list51, num3); span2 = CollectionsMarshal.AsSpan(list51); num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Dalamud cleanup"); + span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Show once completed quests with improved state display"); num4++; - span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed quest level requirement check log spam"); - reference50 = new ChangelogEntry("6.15", releaseDate31, list51); + span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy daily quest and improvements to various Yok Huy quests"); + reference50 = new ChangelogEntry("6.18", releaseDate29, list51); num2++; ref ChangelogEntry reference51 = ref span[num2]; - DateOnly releaseDate32 = new DateOnly(2025, 10, 8); + DateOnly releaseDate30 = new DateOnly(2025, 10, 8); num4 = 1; List list52 = new List(num4); CollectionsMarshal.SetCount(list52, num4); span2 = CollectionsMarshal.AsSpan(list52); num3 = 0; - span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed abandoned quest check logic if quest were MSQ"); - reference51 = new ChangelogEntry("6.14", releaseDate32, list52); + span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Yok Huy rank 1 and rank 2 quests"); + reference51 = new ChangelogEntry("6.17", releaseDate30, list52); num2++; ref ChangelogEntry reference52 = ref span[num2]; - DateOnly releaseDate33 = new DateOnly(2025, 10, 8); - num3 = 2; + DateOnly releaseDate31 = new DateOnly(2025, 10, 8); + num3 = 1; List list53 = new List(num3); CollectionsMarshal.SetCount(list53, num3); span2 = CollectionsMarshal.AsSpan(list53); num4 = 0; - ref ChangeEntry reference53 = ref span2[num4]; + span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Deep Dungeon quest (Faerie Tale)"); + reference52 = new ChangelogEntry("6.16", releaseDate31, list53); + num2++; + ref ChangelogEntry reference53 = ref span[num2]; + DateOnly releaseDate32 = new DateOnly(2025, 10, 8); + num4 = 2; + List list54 = new List(num4); + CollectionsMarshal.SetCount(list54, num4); + span2 = CollectionsMarshal.AsSpan(list54); + num3 = 0; + span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Dalamud cleanup"); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed quest level requirement check log spam"); + reference53 = new ChangelogEntry("6.15", releaseDate32, list54); + num2++; + ref ChangelogEntry reference54 = ref span[num2]; + DateOnly releaseDate33 = new DateOnly(2025, 10, 8); + num3 = 1; + List list55 = new List(num3); + CollectionsMarshal.SetCount(list55, num3); + span2 = CollectionsMarshal.AsSpan(list55); + num4 = 0; + span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed abandoned quest check logic if quest were MSQ"); + reference54 = new ChangelogEntry("6.14", releaseDate33, list55); + num2++; + ref ChangelogEntry reference55 = ref span[num2]; + DateOnly releaseDate34 = new DateOnly(2025, 10, 8); + num4 = 2; + List list56 = new List(num4); + CollectionsMarshal.SetCount(list56, num4); + span2 = CollectionsMarshal.AsSpan(list56); + num3 = 0; + ref ChangeEntry reference56 = ref span2[num3]; num6 = 3; - List list54 = new List(num6); - CollectionsMarshal.SetCount(list54, num6); - span3 = CollectionsMarshal.AsSpan(list54); + List list57 = new List(num6); + CollectionsMarshal.SetCount(list57, num6); + span3 = CollectionsMarshal.AsSpan(list57); num5 = 0; span3[num5] = "Context menu option to add required quests and their chain to priority list"; num5++; span3[num5] = "AetheryteShortcut to multiple quests"; num5++; span3[num5] = "Artisan as a recommended plugin/dependency"; - reference53 = new ChangeEntry(EChangeCategory.Added, "Quest improvements", list54); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed abandoned quest check and priority list issues"); - reference52 = new ChangelogEntry("6.13", releaseDate33, list53); + reference56 = new ChangeEntry(EChangeCategory.Added, "Quest improvements", list57); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed abandoned quest check and priority list issues"); + reference55 = new ChangelogEntry("6.13", releaseDate34, list56); num2++; - ref ChangelogEntry reference54 = ref span[num2]; - DateOnly releaseDate34 = new DateOnly(2025, 10, 7); - num4 = 4; - List list55 = new List(num4); - CollectionsMarshal.SetCount(list55, num4); - span2 = CollectionsMarshal.AsSpan(list55); - num3 = 0; - ref ChangeEntry reference55 = ref span2[num3]; + ref ChangelogEntry reference57 = ref span[num2]; + DateOnly releaseDate35 = new DateOnly(2025, 10, 7); + num3 = 4; + List list58 = new List(num3); + CollectionsMarshal.SetCount(list58, num3); + span2 = CollectionsMarshal.AsSpan(list58); + num4 = 0; + ref ChangeEntry reference58 = ref span2[num4]; num5 = 4; - List list56 = new List(num5); - CollectionsMarshal.SetCount(list56, num5); - span3 = CollectionsMarshal.AsSpan(list56); + List list59 = new List(num5); + CollectionsMarshal.SetCount(list59, num5); + span3 = CollectionsMarshal.AsSpan(list59); num6 = 0; span3[num6] = "FATE combat handling with auto level syncing"; num6++; @@ -610,67 +638,67 @@ internal static class ChangelogData span3[num6] = "Update quest tracking when quests are hidden or prioritised in game"; num6++; span3[num6] = "QuestMap as a recommended plugin/dependency"; - reference55 = new ChangeEntry(EChangeCategory.Added, "FATE and quest tracking", list56); - num3++; - ref ChangeEntry reference56 = ref span2[num3]; + reference58 = new ChangeEntry(EChangeCategory.Added, "FATE and quest tracking", list59); + num4++; + ref ChangeEntry reference59 = ref span2[num4]; num6 = 3; - List list57 = new List(num6); - CollectionsMarshal.SetCount(list57, num6); - span3 = CollectionsMarshal.AsSpan(list57); + List list60 = new List(num6); + CollectionsMarshal.SetCount(list60, num6); + span3 = CollectionsMarshal.AsSpan(list60); num5 = 0; span3[num5] = "Always prioritise next quest during teleportation/zone transitions"; num5++; span3[num5] = "Improved accepted quest logic with abandoned quest detection"; num5++; span3[num5] = "Show quests without quest paths as Locked"; - reference56 = new ChangeEntry(EChangeCategory.Changed, "Quest prioritisation improvements", list57); - num3++; - span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Deep Dungeon, Hildibrand, Yok Huy, Monster Hunter Wilds Collab, and Doman Enclave quests"); - num3++; - span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed accepted/active quest display and Hildibrand quest issues"); - reference54 = new ChangelogEntry("6.12", releaseDate34, list55); + reference59 = new ChangeEntry(EChangeCategory.Changed, "Quest prioritisation improvements", list60); + num4++; + span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.35 Deep Dungeon, Hildibrand, Yok Huy, Monster Hunter Wilds Collab, and Doman Enclave quests"); + num4++; + span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed accepted/active quest display and Hildibrand quest issues"); + reference57 = new ChangelogEntry("6.12", releaseDate35, list58); num2++; - ref ChangelogEntry reference57 = ref span[num2]; - DateOnly releaseDate35 = new DateOnly(2025, 10, 3); - num3 = 1; - List list58 = new List(num3); - CollectionsMarshal.SetCount(list58, num3); - span2 = CollectionsMarshal.AsSpan(list58); - num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Added remaining checks for quest priority to prevent infinite teleport looping"); - reference57 = new ChangelogEntry("6.11", releaseDate35, list58); - num2++; - ref ChangelogEntry reference58 = ref span[num2]; - DateOnly releaseDate36 = new DateOnly(2025, 10, 2); + ref ChangelogEntry reference60 = ref span[num2]; + DateOnly releaseDate36 = new DateOnly(2025, 10, 3); num4 = 1; - List list59 = new List(num4); - CollectionsMarshal.SetCount(list59, num4); - span2 = CollectionsMarshal.AsSpan(list59); + List list61 = new List(num4); + CollectionsMarshal.SetCount(list61, num4); + span2 = CollectionsMarshal.AsSpan(list61); num3 = 0; - ref ChangeEntry reference59 = ref span2[num3]; + span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Added remaining checks for quest priority to prevent infinite teleport looping"); + reference60 = new ChangelogEntry("6.11", releaseDate36, list61); + num2++; + ref ChangelogEntry reference61 = ref span[num2]; + DateOnly releaseDate37 = new DateOnly(2025, 10, 2); + num3 = 1; + List list62 = new List(num3); + CollectionsMarshal.SetCount(list62, num3); + span2 = CollectionsMarshal.AsSpan(list62); + num4 = 0; + ref ChangeEntry reference62 = ref span2[num4]; num5 = 2; - List list60 = new List(num5); - CollectionsMarshal.SetCount(list60, num5); - span3 = CollectionsMarshal.AsSpan(list60); + List list63 = new List(num5); + CollectionsMarshal.SetCount(list63, num5); + span3 = CollectionsMarshal.AsSpan(list63); num6 = 0; span3[num6] = "Don't show quests as available if player doesn't meet level requirements"; num6++; span3[num6] = "Updated 'required for MSQ' text in Crystal Tower quest preset window"; - reference59 = new ChangeEntry(EChangeCategory.Changed, "Quest window improvements", list60); - reference58 = new ChangelogEntry("6.10", releaseDate36, list59); + reference62 = new ChangeEntry(EChangeCategory.Changed, "Quest window improvements", list63); + reference61 = new ChangelogEntry("6.10", releaseDate37, list62); num2++; - ref ChangelogEntry reference60 = ref span[num2]; - DateOnly releaseDate37 = new DateOnly(2025, 9, 21); - num3 = 5; - List list61 = new List(num3); - CollectionsMarshal.SetCount(list61, num3); - span2 = CollectionsMarshal.AsSpan(list61); - num4 = 0; - ref ChangeEntry reference61 = ref span2[num4]; + ref ChangelogEntry reference63 = ref span[num2]; + DateOnly releaseDate38 = new DateOnly(2025, 9, 21); + num4 = 5; + List list64 = new List(num4); + CollectionsMarshal.SetCount(list64, num4); + span2 = CollectionsMarshal.AsSpan(list64); + num3 = 0; + ref ChangeEntry reference64 = ref span2[num3]; num6 = 4; - List list62 = new List(num6); - CollectionsMarshal.SetCount(list62, num6); - span3 = CollectionsMarshal.AsSpan(list62); + List list65 = new List(num6); + CollectionsMarshal.SetCount(list65, num6); + span3 = CollectionsMarshal.AsSpan(list65); num5 = 0; span3[num5] = "Reworked event quest handling - automatically displays when events are active"; num5++; @@ -679,13 +707,13 @@ internal static class ChangelogData span3[num5] = "Reworked Priority Quests tab (Manual Priority and Quest Presets)"; num5++; span3[num5] = "Quest path viewer site (https://wigglymuffin.github.io/FFXIV-Tools/)"; - reference61 = new ChangeEntry(EChangeCategory.Added, "Major system reworks", list62); - num4++; - ref ChangeEntry reference62 = ref span2[num4]; + reference64 = new ChangeEntry(EChangeCategory.Added, "Major system reworks", list65); + num3++; + ref ChangeEntry reference65 = ref span2[num3]; num5 = 4; - List list63 = new List(num5); - CollectionsMarshal.SetCount(list63, num5); - span3 = CollectionsMarshal.AsSpan(list63); + List list66 = new List(num5); + CollectionsMarshal.SetCount(list66, num5); + span3 = CollectionsMarshal.AsSpan(list66); num6 = 0; span3[num6] = "Questionable.IsQuestCompleted"; num6++; @@ -694,13 +722,13 @@ internal static class ChangelogData span3[num6] = "Questionable.IsQuestAccepted"; num6++; span3[num6] = "Questionable.IsQuestUnobtainable"; - reference62 = new ChangeEntry(EChangeCategory.Added, "New IPC commands", list63); - num4++; - ref ChangeEntry reference63 = ref span2[num4]; + reference65 = new ChangeEntry(EChangeCategory.Added, "New IPC commands", list66); + num3++; + ref ChangeEntry reference66 = ref span2[num3]; num6 = 5; - List list64 = new List(num6); - CollectionsMarshal.SetCount(list64, num6); - span3 = CollectionsMarshal.AsSpan(list64); + List list67 = new List(num6); + CollectionsMarshal.SetCount(list67, num6); + span3 = CollectionsMarshal.AsSpan(list67); num5 = 0; span3[num5] = "Improved JSON quest validation with specific error reasons"; num5++; @@ -711,25 +739,25 @@ internal static class ChangelogData span3[num5] = "Improved DialogueChoices regex matching"; num5++; span3[num5] = "Improved refresh checker for all quest states"; - reference63 = new ChangeEntry(EChangeCategory.Changed, "Various improvements", list64); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.31 Occult Crescent quests"); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed cutscene crashes, Single Player Duty triggers, and various quest issues"); - reference60 = new ChangelogEntry("6.9", releaseDate37, list61); + reference66 = new ChangeEntry(EChangeCategory.Changed, "Various improvements", list67); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added 7.31 Occult Crescent quests"); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed cutscene crashes, Single Player Duty triggers, and various quest issues"); + reference63 = new ChangelogEntry("6.9", releaseDate38, list64); num2++; - ref ChangelogEntry reference64 = ref span[num2]; - DateOnly releaseDate38 = new DateOnly(2025, 9, 2); - num4 = 4; - List list65 = new List(num4); - CollectionsMarshal.SetCount(list65, num4); - span2 = CollectionsMarshal.AsSpan(list65); - num3 = 0; - ref ChangeEntry reference65 = ref span2[num3]; + ref ChangelogEntry reference67 = ref span[num2]; + DateOnly releaseDate39 = new DateOnly(2025, 9, 2); + num3 = 4; + List list68 = new List(num3); + CollectionsMarshal.SetCount(list68, num3); + span2 = CollectionsMarshal.AsSpan(list68); + num4 = 0; + ref ChangeEntry reference68 = ref span2[num4]; num5 = 4; - List list66 = new List(num5); - CollectionsMarshal.SetCount(list66, num5); - span3 = CollectionsMarshal.AsSpan(list66); + List list69 = new List(num5); + CollectionsMarshal.SetCount(list69, num5); + span3 = CollectionsMarshal.AsSpan(list69); num6 = 0; span3[num6] = "Help commands and priority quest command"; num6++; @@ -738,72 +766,72 @@ internal static class ChangelogData span3[num6] = "Duty counts and controls in 'Quest Battles' tab"; num6++; span3[num6] = "'Refresh quest timer' setting (WIP)"; - reference65 = new ChangeEntry(EChangeCategory.Added, "Command and UI improvements", list66); - num3++; - span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Improved 'Clear All' buttons to require CTRL being held"); - num3++; - span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Zodiac quests and 7.31 Cosmic/Occult Crescent quests"); - num3++; - span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed Fishing for Friendship and Cosmic Exploration quests"); - reference64 = new ChangelogEntry("6.8", releaseDate38, list65); + reference68 = new ChangeEntry(EChangeCategory.Added, "Command and UI improvements", list69); + num4++; + span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Improved 'Clear All' buttons to require CTRL being held"); + num4++; + span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Zodiac quests and 7.31 Cosmic/Occult Crescent quests"); + num4++; + span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed Fishing for Friendship and Cosmic Exploration quests"); + reference67 = new ChangelogEntry("6.8", releaseDate39, list68); num2++; - ref ChangelogEntry reference66 = ref span[num2]; - DateOnly releaseDate39 = new DateOnly(2025, 8, 27); - num3 = 4; - List list67 = new List(num3); - CollectionsMarshal.SetCount(list67, num3); - span2 = CollectionsMarshal.AsSpan(list67); - num4 = 0; - ref ChangeEntry reference67 = ref span2[num4]; + ref ChangelogEntry reference69 = ref span[num2]; + DateOnly releaseDate40 = new DateOnly(2025, 8, 27); + num4 = 4; + List list70 = new List(num4); + CollectionsMarshal.SetCount(list70, num4); + span2 = CollectionsMarshal.AsSpan(list70); + num3 = 0; + ref ChangeEntry reference70 = ref span2[num3]; num6 = 2; - List list68 = new List(num6); - CollectionsMarshal.SetCount(list68, num6); - span3 = CollectionsMarshal.AsSpan(list68); + List list71 = new List(num6); + CollectionsMarshal.SetCount(list71, num6); + span3 = CollectionsMarshal.AsSpan(list71); num5 = 0; span3[num5] = "Icon to 'Clear All' button in stop conditions"; num5++; span3[num5] = "Duty counts and 'Enable All' button in 'Duties' tab"; - reference67 = new ChangeEntry(EChangeCategory.Added, "UI improvements", list68); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Renamed 'Clear' button to 'Clear All' in priority window"); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Rising 2025 Event Quests"); - num4++; - span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Fixed clipboard assigning blacklist to whitelist in 'Duties' tab"); - reference66 = new ChangelogEntry("6.7", releaseDate39, list67); + reference70 = new ChangeEntry(EChangeCategory.Added, "UI improvements", list71); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Renamed 'Clear' button to 'Clear All' in priority window"); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added Rising 2025 Event Quests"); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Fixed clipboard assigning blacklist to whitelist in 'Duties' tab"); + reference69 = new ChangelogEntry("6.7", releaseDate40, list70); num2++; - ref ChangelogEntry reference68 = ref span[num2]; - DateOnly releaseDate40 = new DateOnly(2025, 8, 25); - num4 = 2; - List list69 = new List(num4); - CollectionsMarshal.SetCount(list69, num4); - span2 = CollectionsMarshal.AsSpan(list69); - num3 = 0; - ref ChangeEntry reference69 = ref span2[num3]; + ref ChangelogEntry reference71 = ref span[num2]; + DateOnly releaseDate41 = new DateOnly(2025, 8, 25); + num3 = 2; + List list72 = new List(num3); + CollectionsMarshal.SetCount(list72, num3); + span2 = CollectionsMarshal.AsSpan(list72); + num4 = 0; + ref ChangeEntry reference72 = ref span2[num4]; num5 = 2; - List list70 = new List(num5); - CollectionsMarshal.SetCount(list70, num5); - span3 = CollectionsMarshal.AsSpan(list70); + List list73 = new List(num5); + CollectionsMarshal.SetCount(list73, num5); + span3 = CollectionsMarshal.AsSpan(list73); num6 = 0; span3[num6] = "Missing emotes to schema and emote handler"; num6++; span3[num6] = "Improved stop conditions with 'Clear All' button"; - reference69 = new ChangeEntry(EChangeCategory.Added, "Emote support and stop conditions", list70); - num3++; - span2[num3] = new ChangeEntry(EChangeCategory.Changed, "Stop at level functionality"); - reference68 = new ChangelogEntry("6.6", releaseDate40, list69); - num2++; - ref ChangelogEntry reference70 = ref span[num2]; - DateOnly releaseDate41 = new DateOnly(2025, 8, 25); - num3 = 2; - List list71 = new List(num3); - CollectionsMarshal.SetCount(list71, num3); - span2 = CollectionsMarshal.AsSpan(list71); - num4 = 0; - span2[num4] = new ChangeEntry(EChangeCategory.Fixed, "Potential fix to single/solo duties softlocking"); + reference72 = new ChangeEntry(EChangeCategory.Added, "Emote support and stop conditions", list73); num4++; - span2[num4] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added San d'Oria: The Second Walk and various side quests"); - reference70 = new ChangelogEntry("6.5", releaseDate41, list71); + span2[num4] = new ChangeEntry(EChangeCategory.Changed, "Stop at level functionality"); + reference71 = new ChangelogEntry("6.6", releaseDate41, list72); + num2++; + ref ChangelogEntry reference73 = ref span[num2]; + DateOnly releaseDate42 = new DateOnly(2025, 8, 25); + num4 = 2; + List list74 = new List(num4); + CollectionsMarshal.SetCount(list74, num4); + span2 = CollectionsMarshal.AsSpan(list74); + num3 = 0; + span2[num3] = new ChangeEntry(EChangeCategory.Fixed, "Potential fix to single/solo duties softlocking"); + num3++; + span2[num3] = new ChangeEntry(EChangeCategory.QuestUpdates, "Added San d'Oria: The Second Walk and various side quests"); + reference73 = new ChangelogEntry("6.5", releaseDate42, list74); Changelogs = list; } } diff --git a/Questionable/Questionable.External/QuestionableIpc.cs b/Questionable/Questionable.External/QuestionableIpc.cs index 6333ea6..bdd3124 100644 --- a/Questionable/Questionable.External/QuestionableIpc.cs +++ b/Questionable/Questionable.External/QuestionableIpc.cs @@ -137,6 +137,14 @@ internal sealed class QuestionableIpc : IDisposable private const string IpcSetSequenceStopCondition = "Questionable.SetSequenceStopCondition"; + private const string IpcGetQuestSequenceStopCondition = "Questionable.GetQuestSequenceStopCondition"; + + private const string IpcSetQuestSequenceStopCondition = "Questionable.SetQuestSequenceStopCondition"; + + private const string IpcRemoveQuestSequenceStopCondition = "Questionable.RemoveQuestSequenceStopCondition"; + + private const string IpcGetAllQuestSequenceStopConditions = "Questionable.GetAllQuestSequenceStopConditions"; + private const string IpcGetAlliedSocietyRemainingAllowances = "Questionable.AlliedSociety.GetRemainingAllowances"; private const string IpcGetAlliedSocietyTimeUntilReset = "Questionable.AlliedSociety.GetTimeUntilReset"; @@ -259,6 +267,14 @@ internal sealed class QuestionableIpc : IDisposable private readonly ICallGateProvider _setSequenceStopCondition; + private readonly ICallGateProvider _getQuestSequenceStopCondition; + + private readonly ICallGateProvider _setQuestSequenceStopCondition; + + private readonly ICallGateProvider _removeQuestSequenceStopCondition; + + private readonly ICallGateProvider> _getAllQuestSequenceStopConditions; + private readonly ICallGateProvider _getAlliedSocietyRemainingAllowances; private readonly ICallGateProvider _getAlliedSocietyTimeUntilReset; @@ -376,6 +392,14 @@ internal sealed class QuestionableIpc : IDisposable _getSequenceStopCondition.RegisterFunc(GetSequenceStopCondition); _setSequenceStopCondition = pluginInterface.GetIpcProvider("Questionable.SetSequenceStopCondition"); _setSequenceStopCondition.RegisterFunc(SetSequenceStopCondition); + _getQuestSequenceStopCondition = pluginInterface.GetIpcProvider("Questionable.GetQuestSequenceStopCondition"); + _getQuestSequenceStopCondition.RegisterFunc(GetQuestSequenceStopCondition); + _setQuestSequenceStopCondition = pluginInterface.GetIpcProvider("Questionable.SetQuestSequenceStopCondition"); + _setQuestSequenceStopCondition.RegisterFunc(SetQuestSequenceStopCondition); + _removeQuestSequenceStopCondition = pluginInterface.GetIpcProvider("Questionable.RemoveQuestSequenceStopCondition"); + _removeQuestSequenceStopCondition.RegisterFunc(RemoveQuestSequenceStopCondition); + _getAllQuestSequenceStopConditions = pluginInterface.GetIpcProvider>("Questionable.GetAllQuestSequenceStopConditions"); + _getAllQuestSequenceStopConditions.RegisterFunc(GetAllQuestSequenceStopConditions); _getAlliedSocietyRemainingAllowances = pluginInterface.GetIpcProvider("Questionable.AlliedSociety.GetRemainingAllowances"); _getAlliedSocietyRemainingAllowances.RegisterFunc(GetAlliedSocietyRemainingAllowances); _getAlliedSocietyTimeUntilReset = pluginInterface.GetIpcProvider("Questionable.AlliedSociety.GetTimeUntilReset"); @@ -925,6 +949,7 @@ internal sealed class QuestionableIpc : IDisposable bool num = _configuration.Stop.QuestsToStopAfter.Remove(elementId); if (num) { + _configuration.Stop.QuestSequences.Remove(questId); _pluginInterface.SavePluginConfig(_configuration); } return num; @@ -935,6 +960,7 @@ internal sealed class QuestionableIpc : IDisposable private bool ClearStopQuests() { _configuration.Stop.QuestsToStopAfter.Clear(); + _configuration.Stop.QuestSequences.Clear(); _pluginInterface.SavePluginConfig(_configuration); return true; } @@ -981,6 +1007,49 @@ internal sealed class QuestionableIpc : IDisposable return true; } + private int GetQuestSequenceStopCondition(string questId) + { + if (_configuration.Stop.QuestSequences.TryGetValue(questId, out var value) && value.HasValue) + { + return value.Value; + } + return -1; + } + + private bool SetQuestSequenceStopCondition(string questId, int targetSequence) + { + if (targetSequence < 0 || targetSequence > 255) + { + return false; + } + if (ElementId.TryFromString(questId, out ElementId elementId) && elementId != null && _questRegistry.IsKnownQuest(elementId)) + { + if (!_configuration.Stop.QuestsToStopAfter.Contains(elementId)) + { + _configuration.Stop.QuestsToStopAfter.Add(elementId); + } + _configuration.Stop.QuestSequences[questId] = targetSequence; + _pluginInterface.SavePluginConfig(_configuration); + return true; + } + return false; + } + + private bool RemoveQuestSequenceStopCondition(string questId) + { + bool num = _configuration.Stop.QuestSequences.Remove(questId); + if (num) + { + _pluginInterface.SavePluginConfig(_configuration); + } + return num; + } + + private Dictionary GetAllQuestSequenceStopConditions() + { + return _configuration.Stop.QuestSequences.Where>((KeyValuePair kvp) => kvp.Value.HasValue).ToDictionary((KeyValuePair kvp) => kvp.Key, (KeyValuePair kvp) => kvp.Value.Value); + } + private unsafe int GetAlliedSocietyRemainingAllowances() { QuestManager* ptr = QuestManager.Instance(); @@ -1179,6 +1248,10 @@ internal sealed class QuestionableIpc : IDisposable _reorderPriorityQuest.UnregisterFunc(); _removePriorityQuest.UnregisterFunc(); _getPriorityQuests.UnregisterFunc(); + _getAllQuestSequenceStopConditions.UnregisterFunc(); + _removeQuestSequenceStopCondition.UnregisterFunc(); + _setQuestSequenceStopCondition.UnregisterFunc(); + _getQuestSequenceStopCondition.UnregisterFunc(); _setSequenceStopCondition.UnregisterFunc(); _getSequenceStopCondition.UnregisterFunc(); _setLevelStopCondition.UnregisterFunc(); diff --git a/Questionable/Questionable.Windows.ConfigComponents/DutyConfigComponent.cs b/Questionable/Questionable.Windows.ConfigComponents/DutyConfigComponent.cs index 8c049e8..b4fd0e7 100644 --- a/Questionable/Questionable.Windows.ConfigComponents/DutyConfigComponent.cs +++ b/Questionable/Questionable.Windows.ConfigComponents/DutyConfigComponent.cs @@ -37,12 +37,14 @@ internal sealed class DutyConfigComponent : ConfigComponent private readonly Dictionary> _contentFinderConditionNames; + private readonly Dictionary> _allTrialNames; + public DutyConfigComponent(IDalamudPluginInterface pluginInterface, Configuration configuration, IDataManager dataManager, QuestRegistry questRegistry, AutoDutyIpc autoDutyIpc, TerritoryData territoryData) : base(pluginInterface, configuration) { _questRegistry = questRegistry; _autoDutyIpc = autoDutyIpc; - _contentFinderConditionNames = (from x in dataManager.GetExcelSheet() + var source = (from x in dataManager.GetExcelSheet() where x.RowId != 0 && !x.Unknown16 orderby x.Unknown15 select x.Content.ValueNullable into x @@ -57,7 +59,22 @@ internal sealed class DutyConfigComponent : ConfigComponent ContentType = x.ContentType.RowId, Level = x.ClassJobLevelRequired, SortKey = x.SortKey + }).ToList(); + _contentFinderConditionNames = (from x in source + where x.ContentType == 2 + group x by x.Expansion).ToDictionary(x => x.Key, x => x.Select(y => new DutyInfo(y.CfcId, y.TerritoryId, ConfigComponent.FormatLevel(y.Level) + " " + y.Name)).ToList()); + _allTrialNames = (from x in dataManager.GetExcelSheet() + where x.RowId != 0 && x.Content.RowId != 0 && x.ContentType.RowId == 4 + select new + { + Expansion = (EExpansionVersion)x.TerritoryType.Value.ExVersion.RowId, + CfcId = x.RowId, + Name = (territoryData.GetContentFinderCondition(x.RowId)?.Name ?? x.Name.ToDalamudString().ToString()), + TerritoryId = x.TerritoryType.RowId, + Level = x.ClassJobLevelRequired, + SortKey = x.SortKey } into x + orderby x.SortKey group x by x.Expansion).ToDictionary(x => x.Key, x => x.Select(y => new DutyInfo(y.CfcId, y.TerritoryId, ConfigComponent.FormatLevel(y.Level) + " " + y.Name)).ToList()); } @@ -78,6 +95,16 @@ internal sealed class DutyConfigComponent : ConfigComponent ImGuiComponents.HelpMarker("The combat module used for this is configured by AutoDuty, ignoring whichever selection you've made in Questionable's \"General\" configuration."); using (ImRaii.Disabled(!v)) { + using (ImRaii.PushIndent(ImGui.GetFrameHeight() + ImGui.GetStyle().ItemInnerSpacing.X)) + { + using (ImRaii.PushColor(ImGuiCol.Text, ImGuiColors.DalamudRed)) + { + ImGui.TextUnformatted("Work in Progress:"); + ImGui.BulletText("Duty Support mode is limited."); + ImGui.BulletText("Unsynced modes require being significantly overleveled or having a high-level party member."); + ImGui.BulletText("Most players will need to use Duty Support mode when progressing normally through the game."); + } + } ImGui.Spacing(); ImGui.Text("Default duty mode:"); ImGui.SameLine(); @@ -102,7 +129,22 @@ internal sealed class DutyConfigComponent : ConfigComponent } ImGui.Separator(); ImGui.Text("You can override the settings for each individual dungeon/trial:"); - DrawConfigTable(v); + using ImRaii.IEndObject endObject2 = ImRaii.TabBar("DutyTypeTabs"); + if (endObject2) + { + using (ImRaii.IEndObject endObject3 = ImRaii.TabItem("Dungeons")) + { + if (endObject3) + { + DrawConfigTable(v, _contentFinderConditionNames); + } + } + using ImRaii.IEndObject endObject4 = ImRaii.TabItem("Trials"); + if (endObject4) + { + DrawConfigTable(v, _allTrialNames); + } + } DrawEnableAllButton(); ImGui.SameLine(); DrawClipboardButtons(); @@ -111,9 +153,9 @@ internal sealed class DutyConfigComponent : ConfigComponent } } - private void DrawConfigTable(bool runInstancedContentWithAutoDuty) + private void DrawConfigTable(bool runInstancedContentWithAutoDuty, Dictionary> contentByExpansion) { - using ImRaii.IEndObject endObject = ImRaii.Child("DutyConfiguration", new Vector2(950f, 400f), border: true); + using ImRaii.IEndObject endObject = ImRaii.Child("DutyConfiguration", new Vector2(725f, 400f), border: true); if (!endObject) { return; @@ -122,7 +164,7 @@ internal sealed class DutyConfigComponent : ConfigComponent for (int i = 0; i < values.Length; i++) { EExpansionVersion eExpansionVersion = values[i]; - (int enabledCount, int totalCount) dutyCountsForExpansion = GetDutyCountsForExpansion(eExpansionVersion); + (int enabledCount, int totalCount) dutyCountsForExpansion = GetDutyCountsForExpansion(eExpansionVersion, contentByExpansion); int item = dutyCountsForExpansion.enabledCount; int item2 = dutyCountsForExpansion.totalCount; string obj = ((item2 > 0) ? $"{eExpansionVersion.ToFriendlyString()} ({item}/{item2})" : eExpansionVersion.ToFriendlyString()); @@ -146,7 +188,7 @@ internal sealed class DutyConfigComponent : ConfigComponent ImGui.TableSetupColumn("Name", ImGuiTableColumnFlags.WidthStretch); ImGui.TableSetupColumn("Enabled", ImGuiTableColumnFlags.WidthFixed, 200f); ImGui.TableSetupColumn("Mode", ImGuiTableColumnFlags.WidthFixed, 150f); - if (!_contentFinderConditionNames.TryGetValue(eExpansionVersion, out List value)) + if (!contentByExpansion.TryGetValue(eExpansionVersion, out List value)) { continue; } @@ -156,20 +198,28 @@ internal sealed class DutyConfigComponent : ConfigComponent uint num = CfcId; uint value2 = TerritoryId; string text = Name; - if (!_questRegistry.TryGetDutyByContentFinderConditionId(num, out DutyOptions dutyOptions)) - { - continue; - } + DutyOptions dutyOptions; + bool flag = _questRegistry.TryGetDutyByContentFinderConditionId(num, out dutyOptions); ImGui.TableNextRow(); - string[] items = (dutyOptions.Enabled ? SupportedCfcOptions : UnsupportedCfcOptions); - int currentItem = 0; - if (base.Configuration.Duties.WhitelistedDutyCfcIds.Contains(num)) + string[] items; + int currentItem; + if (flag) { - currentItem = 1; + items = (dutyOptions.Enabled ? SupportedCfcOptions : UnsupportedCfcOptions); + currentItem = 0; + if (base.Configuration.Duties.WhitelistedDutyCfcIds.Contains(num)) + { + currentItem = 1; + } + if (base.Configuration.Duties.BlacklistedDutyCfcIds.Contains(num)) + { + currentItem = 2; + } } - if (base.Configuration.Duties.BlacklistedDutyCfcIds.Contains(num)) + else { - currentItem = 2; + items = new string[2] { "Disabled", "Enabled" }; + currentItem = (base.Configuration.Duties.WhitelistedDutyCfcIds.Contains(num) ? 1 : 0); } if (ImGui.TableNextColumn()) { @@ -190,13 +240,17 @@ internal sealed class DutyConfigComponent : ConfigComponent table.AppendLiteral("ContentFinderConditionId: "); table.AppendFormatted(num); ImGui.BulletText(table); + if (flag) + { + ImGui.BulletText("Duty Support: Available"); + } } } if (runInstancedContentWithAutoDuty && !_autoDutyIpc.HasPath(num)) { ImGuiComponents.HelpMarker("This duty is not supported by AutoDuty", FontAwesomeIcon.Times, ImGuiColors.DalamudRed); } - else if (dutyOptions.Notes.Count > 0) + else if (flag && dutyOptions.Notes.Count > 0) { ConfigComponent.DrawNotes(dutyOptions.Enabled, dutyOptions.Notes); } @@ -213,14 +267,21 @@ internal sealed class DutyConfigComponent : ConfigComponent { base.Configuration.Duties.WhitelistedDutyCfcIds.Remove(num); base.Configuration.Duties.BlacklistedDutyCfcIds.Remove(num); - switch (currentItem) + if (flag) + { + switch (currentItem) + { + case 1: + base.Configuration.Duties.WhitelistedDutyCfcIds.Add(num); + break; + case 2: + base.Configuration.Duties.BlacklistedDutyCfcIds.Add(num); + break; + } + } + else if (currentItem == 1) { - case 1: base.Configuration.Duties.WhitelistedDutyCfcIds.Add(num); - break; - case 2: - base.Configuration.Duties.BlacklistedDutyCfcIds.Add(num); - break; } Save(); } @@ -236,8 +297,8 @@ internal sealed class DutyConfigComponent : ConfigComponent using (ImRaii.PushId(table)) { EDutyMode value3; - bool flag = base.Configuration.Duties.DutyModeOverrides.TryGetValue(num, out value3); - EDutyMode num2 = (flag ? value3 : ((EDutyMode)(-1))); + bool flag2 = base.Configuration.Duties.DutyModeOverrides.TryGetValue(num, out value3); + EDutyMode num2 = (flag2 ? value3 : ((EDutyMode)(-1))); Name = "Use Default"; string[] dutyModeLabels = DutyModeLabels; int num3 = 0; @@ -264,8 +325,8 @@ internal sealed class DutyConfigComponent : ConfigComponent } if (ImGui.IsItemHovered()) { - EDutyMode eDutyMode = (flag ? value3 : base.Configuration.Duties.DefaultDutyMode); - ImGui.SetTooltip(flag ? ("Override: " + DutyModeLabels[(int)eDutyMode]) : ("Using default: " + DutyModeLabels[(int)eDutyMode])); + EDutyMode eDutyMode = (flag2 ? value3 : base.Configuration.Duties.DefaultDutyMode); + ImGui.SetTooltip(flag2 ? ("Override: " + DutyModeLabels[(int)eDutyMode]) : ("Using default: " + DutyModeLabels[(int)eDutyMode])); } } } @@ -278,9 +339,9 @@ internal sealed class DutyConfigComponent : ConfigComponent } } - private (int enabledCount, int totalCount) GetDutyCountsForExpansion(EExpansionVersion expansion) + private (int enabledCount, int totalCount) GetDutyCountsForExpansion(EExpansionVersion expansion, Dictionary> contentByExpansion) { - if (!_contentFinderConditionNames.TryGetValue(expansion, out List value)) + if (!contentByExpansion.TryGetValue(expansion, out List value)) { return (enabledCount: 0, totalCount: 0); } @@ -296,6 +357,14 @@ internal sealed class DutyConfigComponent : ConfigComponent num++; } } + else + { + num2++; + if (base.Configuration.Duties.WhitelistedDutyCfcIds.Contains(num5)) + { + num++; + } + } } return (enabledCount: num, totalCount: num2); } @@ -306,14 +375,11 @@ internal sealed class DutyConfigComponent : ConfigComponent { base.Configuration.Duties.BlacklistedDutyCfcIds.Clear(); base.Configuration.Duties.WhitelistedDutyCfcIds.Clear(); - foreach (List value in _contentFinderConditionNames.Values) + foreach (List item2 in _contentFinderConditionNames.Values.Concat>(_allTrialNames.Values)) { - foreach (var (num3, _, _) in value) + foreach (var (item, _, _) in item2) { - if (_questRegistry.TryGetDutyByContentFinderConditionId(num3, out DutyOptions _)) - { - base.Configuration.Duties.WhitelistedDutyCfcIds.Add(num3); - } + base.Configuration.Duties.WhitelistedDutyCfcIds.Add(item); } } Save(); diff --git a/Questionable/Questionable.Windows.ConfigComponents/SinglePlayerDutyConfigComponent.cs b/Questionable/Questionable.Windows.ConfigComponents/SinglePlayerDutyConfigComponent.cs index 000a3eb..48c1f5b 100644 --- a/Questionable/Questionable.Windows.ConfigComponents/SinglePlayerDutyConfigComponent.cs +++ b/Questionable/Questionable.Windows.ConfigComponents/SinglePlayerDutyConfigComponent.cs @@ -716,7 +716,7 @@ internal sealed class SinglePlayerDutyConfigComponent : ConfigComponent private static ImRaii.IEndObject BeginChildArea() { - return ImRaii.Child("DutyConfiguration", new Vector2(675f, 400f), border: true); + return ImRaii.Child("DutyConfiguration", new Vector2(725f, 400f), border: true); } private void DrawEnableAllButton() diff --git a/Questionable/Questionable.Windows.ConfigComponents/StopConditionComponent.cs b/Questionable/Questionable.Windows.ConfigComponents/StopConditionComponent.cs index f532e5f..568d931 100644 --- a/Questionable/Questionable.Windows.ConfigComponents/StopConditionComponent.cs +++ b/Questionable/Questionable.Windows.ConfigComponents/StopConditionComponent.cs @@ -100,9 +100,9 @@ internal sealed class StopConditionComponent : ConfigComponent } } ImGui.Separator(); - ImGui.Text("Stop when quest sequence reaches:"); + ImGui.Text("Stop on quest sequence:"); bool v3 = base.Configuration.Stop.SequenceToStopAfter; - if (ImGui.Checkbox("Enable quest sequence stop condition", ref v3)) + if (ImGui.Checkbox("Enable global quest sequence stop condition", ref v3)) { base.Configuration.Stop.SequenceToStopAfter = v3; Save(); @@ -127,9 +127,10 @@ internal sealed class StopConditionComponent : ConfigComponent text.AppendLiteral(")"); ImGui.TextDisabled(text); } + ImGui.TextWrapped("Note: Individual quest sequences below override this global setting."); } ImGui.Separator(); - ImGui.Text("Stop when completing any of the quests selected below:"); + ImGui.Text("Stop when completing quests (or reaching specific sequences):"); DrawCurrentlyAcceptedQuests(); _questSelector.DrawSelection(); List questsToStopAfter = base.Configuration.Stop.QuestsToStopAfter; @@ -140,6 +141,10 @@ internal sealed class StopConditionComponent : ConfigComponent if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Trash, "Clear All")) { base.Configuration.Stop.QuestsToStopAfter.Clear(); + foreach (ElementId item in questsToStopAfter) + { + base.Configuration.Stop.QuestSequences.Remove(item.ToString()); + } Save(); } } @@ -178,6 +183,45 @@ internal sealed class StopConditionComponent : ConfigComponent { _questTooltipComponent.Draw(quest2.Info); } + ImGui.SameLine(); + string text2 = elementId.ToString(); + base.Configuration.Stop.QuestSequences.TryGetValue(text2, out var value); + bool v4 = value.HasValue; + text = new ImU8String(8, 1); + text.AppendLiteral("##UseSeq"); + text.AppendFormatted(text2); + if (ImGui.Checkbox(text, ref v4)) + { + if (v4) + { + base.Configuration.Stop.QuestSequences[text2] = 1; + } + else + { + base.Configuration.Stop.QuestSequences.Remove(text2); + } + Save(); + } + if (ImGui.IsItemHovered()) + { + ImGui.SetTooltip("Stop at specific sequence (unchecked = stop on quest completion)"); + } + using (ImRaii.Disabled(!v4)) + { + ImGui.SameLine(); + ImGui.Text("Seq:"); + ImGui.SameLine(); + ImGui.SetNextItemWidth(85f); + int data3 = value ?? 1; + text = new ImU8String(10, 1); + text.AppendLiteral("##SeqValue"); + text.AppendFormatted(text2); + if (ImGui.InputInt(text, ref data3, 1, 1) && v4) + { + base.Configuration.Stop.QuestSequences[text2] = Math.Max(0, Math.Min(255, data3)); + Save(); + } + } using (ImRaii.PushFont(UiBuilder.IconFont)) { ImGui.SameLine(ImGui.GetContentRegionAvail().X + ImGui.GetStyle().WindowPadding.X - ImGui.CalcTextSize(FontAwesomeIcon.Times.ToIconString()).X - ImGui.GetStyle().FramePadding.X * 2f); @@ -191,6 +235,7 @@ internal sealed class StopConditionComponent : ConfigComponent if (quest != null) { base.Configuration.Stop.QuestsToStopAfter.Remove(quest.Id); + base.Configuration.Stop.QuestSequences.Remove(quest.Id.ToString()); Save(); } } diff --git a/Questionable/Questionable/Configuration.cs b/Questionable/Questionable/Configuration.cs index 7be21f3..39cb0a4 100644 --- a/Questionable/Questionable/Configuration.cs +++ b/Questionable/Questionable/Configuration.cs @@ -52,6 +52,8 @@ internal sealed class Configuration : IPluginConfiguration [JsonProperty(ItemConverterType = typeof(ElementIdNConverter))] public List QuestsToStopAfter { get; set; } = new List(); + public Dictionary QuestSequences { get; set; } = new Dictionary(); + public bool LevelToStopAfter { get; set; } public int TargetLevel { get; set; } = 50;