qstbak/Questionable/Questionable.Controller.Steps.Interactions/AutoVendorPurchase.cs
2026-08-17 20:29:32 +10:00

36 lines
1.4 KiB
C#

using System.Collections.Generic;
using Microsoft.Extensions.Logging;
using Questionable.Controller.CustomDelivery;
using Questionable.Controller.Steps.Common;
using Questionable.Model;
using Questionable.Model.Questing;
using Questionable.Navigation;
namespace Questionable.Controller.Steps.Interactions;
internal static class AutoVendorPurchase
{
internal sealed class Factory(VendorResolverService vendorResolver, SmartNavRouteEnqueuer routeEnqueuer, ILogger<Factory> logger) : ITaskFactory
{
public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step)
{
if (step.InteractionType != EInteractionType.PurchaseItem || step.DataId.HasValue || !step.ItemId.HasValue)
{
yield break;
}
VendorResolverService.VendorInfo? vendor = vendorResolver.ResolveVendor(step.ItemId.Value);
if (!vendor.HasValue)
{
logger.LogWarning("No vendor with a known location sells item {ItemId}; cannot auto-purchase", step.ItemId);
yield break;
}
int quantity = step.ItemCount ?? 1;
foreach (ITask item in routeEnqueuer.BuildRoutedTasks(vendor.Value.TerritoryId, vendor.Value.Position))
{
yield return item;
}
yield return new Mount.UnmountTask();
yield return new VendorPurchaseTask(vendor.Value.VendorNpcId, new global::_003C_003Ez__ReadOnlySingleElementList<VendorPurchaseTask.PurchaseItem>(new VendorPurchaseTask.PurchaseItem(step.ItemId.Value, quantity)), vendor.Value.DialogOptionIndex);
}
}
}