Only auto-accept leves
authorLiza Carvelli <liza@carvel.li>
Thu, 8 Aug 2024 21:58:29 +0000 (23:58 +0200)
committerLiza Carvelli <liza@carvel.li>
Thu, 8 Aug 2024 21:58:43 +0000 (23:58 +0200)
Questionable/Controller/GameUiController.cs
Questionable/Data/LeveData.cs
Questionable/Validation/Validators/UniqueStartStopValidator.cs

index 8e92e23101279d85edf20583d25708e02a17b6ff..829953c1e0d0d3a41cb4919035d428cbcb4fa6aa 100644 (file)
@@ -784,7 +784,7 @@ internal sealed class GameUiController : IDisposable
             AddonJournalResult* addon = (AddonJournalResult*)args.Addon;
 
             string questName = addon->AtkTextNode250->NodeText.ToString();
-            if (_questController.CurrentQuest != null &&
+            if (_questController.CurrentQuest is { Quest.Id: LeveId } &&
                 GameFunctions.GameStringEquals(_questController.CurrentQuest.Quest.Info.Name, questName))
                 addon->FireCallbackInt(0);
             else
index 463f7c439b51a3381e77d946fd642f511ce64c0c..a8d5835caa9129fef861033a4cc9e6126001af5a 100644 (file)
@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
 using System.Linq;
 using FFXIVClientStructs.FFXIV.Common.Math;
 using LLib.GameData;
@@ -24,7 +25,9 @@ internal sealed class LeveData
 
     public void AddQuestSteps(LeveInfo leveInfo, QuestRoot questRoot)
     {
-        LeveStepData leveStepData = Leves.Single(x => x.IssuerDataId == leveInfo.IssuerDataId);
+        LeveStepData leveStepData = Leves.SingleOrDefault(x => x.IssuerDataId == leveInfo.IssuerDataId)
+                                    ?? throw new InvalidOperationException(
+                                        $"No leve location for issuer data id {leveInfo.IssuerDataId} found");
 
         QuestSequence? startSequence = questRoot.QuestSequence.FirstOrDefault(x => x.Sequence == 0);
         if (startSequence == null)
index 60f67b12d9018bd9e51d23280b130bbbbe14013e..b7e088133434e63856f9702d914dda1f202f9759 100644 (file)
@@ -12,9 +12,10 @@ internal sealed class UniqueStartStopValidator : IQuestValidator
         if (quest.Id is SatisfactionSupplyNpcId)
             yield break;
 
-        var questAccepts = FindQuestStepsWithInteractionType(quest, EInteractionType.AcceptQuest)
-            .Where(x => x.Step.PickUpQuestId == null)
-            .ToList();
+        var questAccepts =
+            FindQuestStepsWithInteractionType(quest, [EInteractionType.AcceptQuest, EInteractionType.AcceptLeve])
+                .Where(x => x.Step.PickUpQuestId == null)
+                .ToList();
         foreach (var accept in questAccepts)
         {
             if (accept.Sequence.Sequence != 0 || accept.StepId != quest.FindSequence(0)!.Steps.Count - 1)
@@ -44,9 +45,10 @@ internal sealed class UniqueStartStopValidator : IQuestValidator
             };
         }
 
-        var questCompletes = FindQuestStepsWithInteractionType(quest, EInteractionType.CompleteQuest)
-            .Where(x => x.Step.TurnInQuestId == null)
-            .ToList();
+        var questCompletes =
+            FindQuestStepsWithInteractionType(quest, [EInteractionType.CompleteQuest, EInteractionType.CompleteLeve])
+                .Where(x => x.Step.TurnInQuestId == null)
+                .ToList();
         foreach (var complete in questCompletes)
         {
             if (complete.Sequence.Sequence != 255 || complete.StepId != quest.FindSequence(255)!.Steps.Count - 1)
@@ -78,6 +80,6 @@ internal sealed class UniqueStartStopValidator : IQuestValidator
     }
 
     private static IEnumerable<(QuestSequence Sequence, int StepId, QuestStep Step)> FindQuestStepsWithInteractionType(
-        Quest quest, EInteractionType interactionType)
-        => quest.AllSteps().Where(x => x.Step.InteractionType == interactionType);
+        Quest quest, List<EInteractionType> interactionType)
+        => quest.AllSteps().Where(x => interactionType.Contains(x.Step.InteractionType));
 }