using Dalamud.Game.ClientState.Objects.Enums;
using Dalamud.Game.ClientState.Objects.Types;
using Dalamud.Plugin.Services;
+using FFXIVClientStructs.FFXIV.Client.Game;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Questionable.Controller.Steps.Shared;
internal static class Interact
{
- internal sealed class Factory(GameFunctions gameFunctions, ICondition condition, ILoggerFactory loggerFactory) : ITaskFactory
+ internal sealed class Factory(GameFunctions gameFunctions, ICondition condition, ILoggerFactory loggerFactory)
+ : ITaskFactory
{
public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step)
{
yield return new WaitAtEnd.WaitDelay();
yield return Interact(step.DataId.Value, quest, step.InteractionType,
- step.TargetTerritoryId != null || quest.Id is SatisfactionSupplyNpcId);
+ step.TargetTerritoryId != null || quest.Id is SatisfactionSupplyNpcId, step.PickUpItemId);
}
- internal ITask Interact(uint dataId, Quest? quest, EInteractionType interactionType, bool skipMarkerCheck = false)
+ internal ITask Interact(uint dataId, Quest? quest, EInteractionType interactionType,
+ bool skipMarkerCheck = false, uint? pickUpItemId = null)
{
- return new DoInteract(dataId, quest, interactionType, skipMarkerCheck, gameFunctions, condition,
- loggerFactory.CreateLogger<DoInteract>());
+ return new DoInteract(dataId, quest, interactionType, skipMarkerCheck, pickUpItemId, gameFunctions,
+ condition, loggerFactory.CreateLogger<DoInteract>());
}
}
Quest? quest,
EInteractionType interactionType,
bool skipMarkerCheck,
+ uint? pickUpItemId,
GameFunctions gameFunctions,
ICondition condition,
ILogger<DoInteract> logger)
private DateTime _continueAt = DateTime.MinValue;
public Quest? Quest => quest;
+
public EInteractionType InteractionType
{
get => interactionType;
_needsUnmount = false;
}
- if (_interactionState == EInteractionState.InteractionConfirmed)
- return ETaskResult.TaskComplete;
+ if (pickUpItemId != null)
+ {
+ unsafe
+ {
+ InventoryManager* inventoryManager = InventoryManager.Instance();
+ if (inventoryManager->GetInventoryItemCount(pickUpItemId.Value) > 0)
+ return ETaskResult.TaskComplete;
+ }
+ }
+ else
+ {
+ if (_interactionState == EInteractionState.InteractionConfirmed)
+ return ETaskResult.TaskComplete;
- if (interactionType == EInteractionType.InternalGather && condition[ConditionFlag.Gathering])
- return ETaskResult.TaskComplete;
+ if (interactionType == EInteractionType.InternalGather && condition[ConditionFlag.Gathering])
+ return ETaskResult.TaskComplete;
+ }
IGameObject? gameObject = gameFunctions.FindObjectByDataId(dataId);
if (gameObject == null || !gameObject.IsTargetable || !HasAnyMarker(gameObject))