GameFunctions gameFunctions,
ICondition condition,
ILogger<DoInteract> logger)
- : TaskExecutor<Task>
+ : TaskExecutor<Task>, IConditionChangeAware
{
private bool _needsUnmount;
+ private EInteractionState _interactionState = EInteractionState.None;
private DateTime _continueAt = DateTime.MinValue;
public Quest? Quest => Task.Quest;
if (gameObject.IsTargetable && HasAnyMarker(gameObject))
{
- ProgressContext =
- InteractionProgressContext.FromActionUseOrDefault(() => gameFunctions.InteractWith(gameObject));
- _continueAt = DateTime.Now.AddSeconds(0.5);
+ TriggerInteraction(gameObject);
return true;
}
}
else
{
- if (ProgressContext != null && ProgressContext.WasSuccessful())
+ if (ProgressContext != null && (ProgressContext.WasSuccessful() || _interactionState == EInteractionState.InteractionConfirmed))
return ETaskResult.TaskComplete;
if (InteractionType == EInteractionType.Gather && condition[ConditionFlag.Gathering])
if (gameObject == null || !gameObject.IsTargetable || !HasAnyMarker(gameObject))
return ETaskResult.StillRunning;
+ TriggerInteraction(gameObject);
+ return ETaskResult.StillRunning;
+ }
+
+ private void TriggerInteraction(IGameObject gameObject)
+ {
ProgressContext =
- InteractionProgressContext.FromActionUseOrDefault(() => gameFunctions.InteractWith(gameObject));
+ InteractionProgressContext.FromActionUseOrDefault(() =>
+ {
+ if (gameFunctions.InteractWith(gameObject))
+ _interactionState = EInteractionState.InteractionTriggered;
+ else
+ _interactionState = EInteractionState.None;
+ return _interactionState != EInteractionState.None;
+ });
_continueAt = DateTime.Now.AddSeconds(0.5);
- return ETaskResult.StillRunning;
}
private unsafe bool HasAnyMarker(IGameObject gameObject)
var gameObjectStruct = (FFXIVClientStructs.FFXIV.Client.Game.Object.GameObject*)gameObject.Address;
return gameObjectStruct->NamePlateIconId != 0;
}
+
+ public void OnConditionChange(ConditionFlag flag, bool value)
+ {
+ if (ProgressContext != null && (ProgressContext.WasInterrupted() || ProgressContext.WasSuccessful()))
+ return;
+
+ logger.LogDebug("Condition change: {Flag} = {Value}", flag, value);
+ if (_interactionState == EInteractionState.InteractionTriggered &&
+ flag is ConditionFlag.OccupiedInQuestEvent or ConditionFlag.OccupiedInEvent &&
+ value)
+ {
+ logger.LogInformation("Interaction was most likely triggered");
+ _interactionState = EInteractionState.InteractionConfirmed;
+ }
+ }
+
+ private enum EInteractionState
+ {
+ None,
+ InteractionTriggered,
+ InteractionConfirmed,
+ }
}
}
#endif
#if false
- unsafe {
+ unsafe
+ {
var questManager = QuestManager.Instance();
if (questManager != null)
{
#endif
#if false
- unsafe {
+ unsafe
+ {
var director = UIState.Instance()->DirectorTodo.Director;
if (director != null)
{
ImGui.Text($"Ico: {director->IconId}");
if (director->EventHandlerInfo != null)
{
- ImGui.Text($" EHI CI: {director->EventHandlerInfo->EventId.ContentId}");
- ImGui.Text($" EHI EI: {director->EventHandlerInfo->EventId.Id}");
- ImGui.Text($" EHI EEI: {director->EventHandlerInfo->EventId.EntryId}");
- ImGui.Text($" EHI F: {director->EventHandlerInfo->Flags}");
+ ImGui.Text($" EHI CI: {director->Info.EventId.ContentId}");
+ ImGui.Text($" EHI EI: {director->Info.EventId.Id}");
+ ImGui.Text($" EHI EEI: {director->Info.EventId.EntryId}");
+ ImGui.Text($" EHI F: {director->Info.Flags}");
}
}
}
#endif
+#if false
+ unsafe
+ {
+ var actionManager = ActionManager.Instance();
+ ImGui.Text(
+ $"A1: {actionManager->CastActionId} ({actionManager->LastUsedActionSequence} → {actionManager->LastHandledActionSequence})");
+ ImGui.Text($"A2: {actionManager->CastTimeElapsed} / {actionManager->CastTimeTotal}");
+ }
+#endif
+
if (_targetManager.Target != null)
{
DrawTargetDetails(_targetManager.Target);