Don't return completed main scenario quest
authorLiza Carvelli <liza@carvel.li>
Fri, 2 Aug 2024 11:47:00 +0000 (13:47 +0200)
committerLiza Carvelli <liza@carvel.li>
Fri, 2 Aug 2024 11:52:46 +0000 (13:52 +0200)
Questionable/GameFunctions.cs

index 76b03cfaa9bc52ddf00104d03ab332f99097b4ad..ee975accb4298703cf54c921dd24b5a16497e6d0 100644 (file)
@@ -149,10 +149,7 @@ internal sealed unsafe class GameFunctions
             // always prioritize accepting MSQ quests, to make sure we don't turn in one MSQ quest and then go off to do
             // side quests until the end of time.
             var msqQuest = GetMainScenarioQuest(questManager);
-            if (msqQuest.CurrentQuest != 0 &&
-                _questRegistry.IsKnownQuest(msqQuest.CurrentQuest) &&
-                IsReadyToAcceptQuest(msqQuest.CurrentQuest) &&
-                !questManager->IsQuestAccepted(msqQuest.CurrentQuest))
+            if (msqQuest.CurrentQuest != 0 && _questRegistry.IsKnownQuest(msqQuest.CurrentQuest))
                 return msqQuest;
 
             // Use the quests in the same order as they're shown in the to-do list, e.g. if the MSQ is the first item,
@@ -224,6 +221,11 @@ internal sealed unsafe class GameFunctions
         if (questManager->IsQuestAccepted(currentQuest) && questManager->GetQuestById(currentQuest)->IsHidden)
             return default;
 
+        // it can sometimes happen (although this isn't reliably reproducible) that the quest returned here
+        // is one you've just completed.
+        if (!IsReadyToAcceptQuest(currentQuest))
+            return default;
+
         // if we're not at a high enough level to continue, we also ignore it
         var currentLevel = _clientState.LocalPlayer?.Level ?? 0;
         if (currentLevel != 0 &&