Make AcceptQuest/CompleteQuest skippable if their relevant quest has been accepted/completed

This commit is contained in:
Liza 2024-07-21 10:40:39 +02:00
parent e6a9c21c0f
commit 07b4765478
Signed by: liza
GPG Key ID: 7199F8D727D55F67
5 changed files with 49 additions and 14 deletions

View File

@ -184,7 +184,8 @@
"ChocoboUnlocked", "ChocoboUnlocked",
"AetheryteShortcutIfInSameTerritory", "AetheryteShortcutIfInSameTerritory",
"NotTargetable", "NotTargetable",
"ItemNotInInventory" "ItemNotInInventory",
"WakingSandsMainArea"
] ]
} }
}, },

View File

@ -13,5 +13,6 @@ public sealed class SkipConditionConverter() : EnumConverter<ESkipCondition>(Val
{ ESkipCondition.AetheryteShortcutIfInSameTerritory, "AetheryteShortcutIfInSameTerritory" }, { ESkipCondition.AetheryteShortcutIfInSameTerritory, "AetheryteShortcutIfInSameTerritory" },
{ ESkipCondition.NotTargetable, "NotTargetable" }, { ESkipCondition.NotTargetable, "NotTargetable" },
{ ESkipCondition.ItemNotInInventory, "ItemNotInInventory" }, { ESkipCondition.ItemNotInInventory, "ItemNotInInventory" },
{ ESkipCondition.WakingSandsMainArea, "WakingSandsMainArea" },
}; };
} }

View File

@ -14,4 +14,7 @@ public enum ESkipCondition
AetheryteShortcutIfInSameTerritory, AetheryteShortcutIfInSameTerritory,
NotTargetable, NotTargetable,
ItemNotInInventory, ItemNotInInventory,
// TODO: This is an indication the whole skip bit should be optimized/parameterized to some extent
WakingSandsMainArea,
} }

View File

@ -28,7 +28,9 @@ internal static class SkipCondition
step.SkipIf.Where(x => x != ESkipCondition.AetheryteShortcutIfInSameTerritory).ToList(); step.SkipIf.Where(x => x != ESkipCondition.AetheryteShortcutIfInSameTerritory).ToList();
if (relevantConditions.Count == 0 && if (relevantConditions.Count == 0 &&
step.CompletionQuestVariablesFlags.Count == 0 && step.CompletionQuestVariablesFlags.Count == 0 &&
step.RequiredQuestVariables.Count == 0) step.RequiredQuestVariables.Count == 0 &&
step.PickUpQuestId == null &&
step.NextQuestId == null)
return null; return null;
return serviceProvider.GetRequiredService<CheckTask>() return serviceProvider.GetRequiredService<CheckTask>()
@ -143,6 +145,28 @@ internal static class SkipCondition
} }
} }
if (Step.SkipIf.Contains(ESkipCondition.WakingSandsMainArea))
{
var position = clientState.LocalPlayer!.Position;
if (position.X < 24)
{
logger.LogInformation("Skipping step, as we're not in the Solar");
return true;
}
}
if (Step.PickUpQuestId != null && gameFunctions.IsQuestAcceptedOrComplete(Step.PickUpQuestId.Value))
{
logger.LogInformation("Skipping step, as we have already picked up the relevant quest");
return true;
}
if (Step.TurnInQuestId != null && gameFunctions.IsQuestComplete(Step.TurnInQuestId.Value))
{
logger.LogInformation("Skipping step, as we have already completed the relevant quest");
return true;
}
return false; return false;
} }

View File

@ -108,20 +108,26 @@ internal static class WaitAtEnd
]; ];
case EInteractionType.AcceptQuest: case EInteractionType.AcceptQuest:
return {
[ var accept = serviceProvider.GetRequiredService<WaitQuestAccepted>()
serviceProvider.GetRequiredService<WaitQuestAccepted>() .With(step.PickUpQuestId ?? quest.QuestId);
.With(step.PickUpQuestId ?? quest.QuestId), var delay = serviceProvider.GetRequiredService<WaitDelay>();
serviceProvider.GetRequiredService<WaitDelay>() if (step.PickUpQuestId != null)
]; return [accept, delay, Next(quest, sequence)];
else
return [accept, delay];
}
case EInteractionType.CompleteQuest: case EInteractionType.CompleteQuest:
return {
[ var complete = serviceProvider.GetRequiredService<WaitQuestCompleted>()
serviceProvider.GetRequiredService<WaitQuestCompleted>() .With(step.TurnInQuestId ?? quest.QuestId);
.With(step.TurnInQuestId ?? quest.QuestId), var delay = serviceProvider.GetRequiredService<WaitDelay>();
serviceProvider.GetRequiredService<WaitDelay>() if (step.NextQuestId != null)
]; return [complete, delay, Next(quest, sequence)];
else
return [complete, delay];
}
case EInteractionType.Interact: case EInteractionType.Interact:
default: default: