From 11d5898ccfe471b0e4ee9a1bd511f5b30338b8a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Klemen=20Ko=C5=A1ir?= Date: Tue, 6 Jan 2026 22:44:33 +0900 Subject: [PATCH] Allow marking completed repeatable quests as done --- QuestJournal/Configuration.cs | 1 + QuestJournal/UI/MainWindow.cs | 2 +- QuestJournal/UI/QuestDetailWindow.cs | 2 +- QuestJournal/UI/Renderer/FeatureRenderer.cs | 6 +++--- QuestJournal/UI/Renderer/JobRenderer.cs | 4 ++-- QuestJournal/UI/Renderer/MsqRenderer.cs | 4 ++-- QuestJournal/UI/Renderer/SettingsRenderer.cs | 17 +++++++++++++++++ QuestJournal/Utils/OtherUtils.cs | 4 ++-- QuestJournal/Utils/RendererUtils.cs | 14 +++++++------- 9 files changed, 36 insertions(+), 18 deletions(-) diff --git a/QuestJournal/Configuration.cs b/QuestJournal/Configuration.cs index c5bb723..42531cb 100644 --- a/QuestJournal/Configuration.cs +++ b/QuestJournal/Configuration.cs @@ -11,6 +11,7 @@ public class Configuration : IPluginConfiguration public string StarterClass { get; set; } = "Gladiator"; public bool CensorStarterLocations { get; set; } = false; + public bool MarkCompletedRepeatableQuests { get; set; } = false; public bool DeveloperMode { get; set; } = false; public int Version { get; set; } = 0; diff --git a/QuestJournal/UI/MainWindow.cs b/QuestJournal/UI/MainWindow.cs index e010b9d..3be70c5 100644 --- a/QuestJournal/UI/MainWindow.cs +++ b/QuestJournal/UI/MainWindow.cs @@ -44,7 +44,7 @@ public MainWindow(IPluginLog log, Configuration configuration, QuestJournal ques msqRenderer = new MsqRenderer(msqHandler, rendererUtils, configuration, log); jobRenderer = new JobRenderer(jobHandler, rendererUtils, log); - featureRenderer = new FeatureRenderer(featureHandler, rendererUtils, log); + featureRenderer = new FeatureRenderer(featureHandler, rendererUtils, configuration, log); settingsRenderer = new SettingsRenderer(configuration, this); } diff --git a/QuestJournal/UI/QuestDetailWindow.cs b/QuestJournal/UI/QuestDetailWindow.cs index d0a92c5..4b41854 100644 --- a/QuestJournal/UI/QuestDetailWindow.cs +++ b/QuestJournal/UI/QuestDetailWindow.cs @@ -33,7 +33,7 @@ public QuestDetailWindow(QuestModel questModel, List questList, Rend public override void Draw() { - rendererUtils.DrawSelectedQuestDetails(questModel, ref questList, configuration.CensorStarterLocations); + rendererUtils.DrawSelectedQuestDetails(questModel, ref questList, configuration.CensorStarterLocations, configuration.MarkCompletedRepeatableQuests); } public void Dispose() diff --git a/QuestJournal/UI/Renderer/FeatureRenderer.cs b/QuestJournal/UI/Renderer/FeatureRenderer.cs index c3f4a2f..c9e79ef 100644 --- a/QuestJournal/UI/Renderer/FeatureRenderer.cs +++ b/QuestJournal/UI/Renderer/FeatureRenderer.cs @@ -9,7 +9,7 @@ namespace QuestJournal.UI.Renderer; -public class FeatureRenderer(FeatureHandler featureHandler, RendererUtils rendererUtils, IPluginLog log) +public class FeatureRenderer(FeatureHandler featureHandler, RendererUtils rendererUtils, Configuration configuration, IPluginLog log) { private List dropDownCategories = new(); private Dictionary dropDownCategoryMap = new(); @@ -43,8 +43,8 @@ public void DrawFeatures() rendererUtils.DrawSearchBar(ref searchQuery, highlightedQuestCount); ImGui.Text($"Loaded {questCount} quests for journal genre category: {selectedDropDownCategory}."); - rendererUtils.DrawSelectedQuestDetails(selectedQuest, ref questList, false); - rendererUtils.DrawQuestWidgets(questList, ref searchQuery, ref selectedQuest, false); + rendererUtils.DrawSelectedQuestDetails(selectedQuest, ref questList, false, configuration.MarkCompletedRepeatableQuests); + rendererUtils.DrawQuestWidgets(questList, ref searchQuery, ref selectedQuest, false, configuration.MarkCompletedRepeatableQuests); } public void ReloadQuests() diff --git a/QuestJournal/UI/Renderer/JobRenderer.cs b/QuestJournal/UI/Renderer/JobRenderer.cs index 1a38d46..16933b2 100644 --- a/QuestJournal/UI/Renderer/JobRenderer.cs +++ b/QuestJournal/UI/Renderer/JobRenderer.cs @@ -39,8 +39,8 @@ public void DrawJobs() rendererUtils.DrawSearchBar(ref searchQuery, highlightedQuestCount); ImGui.Text($"Loaded {questCount} quests for journal genre category: {selectedDropDownCategory}."); - rendererUtils.DrawSelectedQuestDetails(selectedQuest, ref questList, false); - rendererUtils.DrawQuestWidgets(questList, ref searchQuery, ref selectedQuest, false); + rendererUtils.DrawSelectedQuestDetails(selectedQuest, ref questList, false, false); + rendererUtils.DrawQuestWidgets(questList, ref searchQuery, ref selectedQuest, false, false); } public void ReloadQuests() diff --git a/QuestJournal/UI/Renderer/MsqRenderer.cs b/QuestJournal/UI/Renderer/MsqRenderer.cs index 9f196cb..bab9a2c 100644 --- a/QuestJournal/UI/Renderer/MsqRenderer.cs +++ b/QuestJournal/UI/Renderer/MsqRenderer.cs @@ -37,8 +37,8 @@ public void DrawMSQ() quest.QuestTitle.Contains(searchQuery, StringComparison.OrdinalIgnoreCase)); rendererUtils.DrawSearchBar(ref searchQuery, highlightedQuestCount); - rendererUtils.DrawSelectedQuestDetails(selectedQuest, ref questList, configuration.CensorStarterLocations); - rendererUtils.DrawQuestWidgets(questList, ref searchQuery, ref selectedQuest, configuration.CensorStarterLocations); + rendererUtils.DrawSelectedQuestDetails(selectedQuest, ref questList, configuration.CensorStarterLocations, false); + rendererUtils.DrawQuestWidgets(questList, ref searchQuery, ref selectedQuest, configuration.CensorStarterLocations, false); } public void ReloadQuests() diff --git a/QuestJournal/UI/Renderer/SettingsRenderer.cs b/QuestJournal/UI/Renderer/SettingsRenderer.cs index 74f079b..15c2f21 100644 --- a/QuestJournal/UI/Renderer/SettingsRenderer.cs +++ b/QuestJournal/UI/Renderer/SettingsRenderer.cs @@ -148,6 +148,23 @@ public void DrawSettings() ImGui.Spacing(); ImGui.Spacing(); + ImGui.Separator(); + ImGui.Text("Mark completed repeatable quests"); + var markCompletedRepeatableQuests = configuration.MarkCompletedRepeatableQuests; + if (ImGui.Checkbox( + "This will always mark completed repeatable quests as done.", + ref markCompletedRepeatableQuests)) + { + configuration.MarkCompletedRepeatableQuests = markCompletedRepeatableQuests; + configuration.Save(); + } + + ImGui.Spacing(); + ImGui.Spacing(); + ImGui.Spacing(); + ImGui.Spacing(); + ImGui.Spacing(); + ImGui.Text("Developer Settings"); ImGui.Separator(); var devMode = configuration.DeveloperMode; diff --git a/QuestJournal/Utils/OtherUtils.cs b/QuestJournal/Utils/OtherUtils.cs index 2e5679b..9312a47 100644 --- a/QuestJournal/Utils/OtherUtils.cs +++ b/QuestJournal/Utils/OtherUtils.cs @@ -58,7 +58,7 @@ public static void OpenMapAtLocation(QuestModel quest, IPluginLog log) } } - public static QuestStatusModel GetQuestStatus(QuestModel quest) + public static QuestStatusModel GetQuestStatus(QuestModel quest, bool markCompletedRepeatableQuests) { bool isComplete; bool isAccepted; @@ -66,7 +66,7 @@ public static QuestStatusModel GetQuestStatus(QuestModel quest) { isAccepted = QuestManager.Instance()->IsQuestAccepted(quest.QuestId); - isComplete = quest.IsRepeatable + isComplete = (quest.IsRepeatable && !markCompletedRepeatableQuests) ? QuestManager.Instance()->IsDailyQuestCompleted((ushort)quest.QuestId) : QuestManager.IsQuestComplete(quest.QuestId); } diff --git a/QuestJournal/Utils/RendererUtils.cs b/QuestJournal/Utils/RendererUtils.cs index 3090705..b407b9b 100644 --- a/QuestJournal/Utils/RendererUtils.cs +++ b/QuestJournal/Utils/RendererUtils.cs @@ -100,7 +100,7 @@ private Vector4 DetermineQuestColor(bool isComplete, bool isMatch, bool isSelect return new Vector4(1f, 1f, 1f, 1f); // Default white } - public void DrawQuestWidgets(List quests, ref string searchQuery, ref QuestModel? selectedQuest, bool censorStarterLocations) + public void DrawQuestWidgets(List quests, ref string searchQuery, ref QuestModel? selectedQuest, bool censorStarterLocations, bool markCompletedRepeatableQuests) { var childHeight = ImGui.GetContentRegionAvail().Y; ImGui.BeginChild("QuestWidgetRegion", new Vector2(0, childHeight), false); @@ -125,7 +125,7 @@ public void DrawQuestWidgets(List quests, ref string searchQuery, re { isAccepted = QuestManager.Instance()->IsQuestAccepted(quests[i].QuestId); - isComplete = quests[i].IsRepeatable + isComplete = (quests[i].IsRepeatable && !markCompletedRepeatableQuests) ? QuestManager.Instance()->IsDailyQuestCompleted((ushort)quests[i].QuestId) : QuestManager.IsQuestComplete(quests[i].QuestId); } @@ -205,7 +205,7 @@ public void DrawQuestWidgets(List quests, ref string searchQuery, re ImGui.EndChild(); } - public void DrawSelectedQuestDetails(QuestModel? quest, ref List questList, bool censorStarterLocations) + public void DrawSelectedQuestDetails(QuestModel? quest, ref List questList, bool censorStarterLocations, bool markCompletedRepeatableQuests) { if (quest == null) { @@ -315,7 +315,7 @@ public void DrawSelectedQuestDetails(QuestModel? quest, ref List que !q.PreviousQuestIds.Any(id => currentQuestList.Any(ql => ql.QuestId == id))); if (firstQuest != null) { - var firstQuestStatusInfo = OtherUtils.GetQuestStatus(firstQuest); + var firstQuestStatusInfo = OtherUtils.GetQuestStatus(firstQuest, markCompletedRepeatableQuests); if (ImGui.Selectable($"{firstQuestStatusInfo.StatusSymbol} {firstQuest.QuestTitle ?? "None"}##{firstQuest.QuestId}")) { questJournal.OpenQuestWindow(firstQuest, questList); @@ -341,7 +341,7 @@ public void DrawSelectedQuestDetails(QuestModel? quest, ref List que if (previousQuest != null) { - var previousQuestStatusInfo = OtherUtils.GetQuestStatus(previousQuest); + var previousQuestStatusInfo = OtherUtils.GetQuestStatus(previousQuest, markCompletedRepeatableQuests); if (ImGui.Selectable($"{previousQuestStatusInfo.StatusSymbol} {previousQuest.QuestTitle ?? "None"}##{previousQuestId}")) { questJournal.OpenQuestWindow(previousQuest, questList); @@ -368,7 +368,7 @@ public void DrawSelectedQuestDetails(QuestModel? quest, ref List que if (nextQuest != null) { - var nextQuestStatusInfo = OtherUtils.GetQuestStatus(nextQuest); + var nextQuestStatusInfo = OtherUtils.GetQuestStatus(nextQuest, markCompletedRepeatableQuests); if (ImGui.Selectable($"{nextQuestStatusInfo.StatusSymbol} {nextQuest.QuestTitle ?? "None"}##{nextQuestId}")) { questJournal.OpenQuestWindow(nextQuest, questList); @@ -396,7 +396,7 @@ public void DrawSelectedQuestDetails(QuestModel? quest, ref List que { isAccepted = QuestManager.Instance()->IsQuestAccepted(quest.QuestId); - isComplete = quest.IsRepeatable + isComplete = (quest.IsRepeatable && !markCompletedRepeatableQuests) ? QuestManager.Instance()->IsDailyQuestCompleted((ushort)quest.QuestId) : QuestManager.IsQuestComplete(quest.QuestId); }