-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using Dalamud.Game.Text;
using Dalamud.Plugin.Services;
private bool _revisitTriggered;
private Queue<EAction>? _actionQueue;
- public ITask With(GatheringController.GatheringRequest currentRequest, GatheringNode currentNode, bool revisitRequired)
+ private bool? _expectedScrutiny;
+
+ public ITask With(GatheringController.GatheringRequest currentRequest, GatheringNode currentNode,
+ bool revisitRequired)
{
_currentRequest = currentRequest;
_currentNode = currentNode;
if (nodeCondition == null)
return ETaskResult.TaskComplete;
+ if (_expectedScrutiny != null)
+ {
+ if (nodeCondition.ScrutinyActive != _expectedScrutiny)
+ return ETaskResult.StillRunning;
+
+ // continue on next frame
+ _expectedScrutiny = null;
+ return ETaskResult.StillRunning;
+ }
+
if (_actionQueue != null && _actionQueue.TryPeek(out EAction nextAction))
{
if (gameFunctions.UseAction(nextAction))
{
+ _expectedScrutiny = nextAction switch
+ {
+ EAction.ScrutinyMiner or EAction.ScrutinyBotanist => true,
+ EAction.ScourMiner or EAction.ScourBotanist or EAction.MeticulousMiner
+ or EAction.MeticulousBotanist => false,
+ _ => null
+ };
logger.LogInformation("Used action {Action} on node", nextAction);
_actionQueue.Dequeue();
}
MaxCollectability: atkValues[14].UInt,
CurrentIntegrity: atkValues[62].UInt,
MaxIntegrity: atkValues[63].UInt,
- ScrutinyActive: atkValues[80].Bool,
+ ScrutinyActive: atkValues[54].Bool,
CollectabilityFromScour: atkValues[48].UInt,
CollectabilityFromMeticulous: atkValues[51].UInt
);
private Queue<EAction> GetNextActions(NodeCondition nodeCondition)
{
uint gp = clientState.LocalPlayer!.CurrentGp;
+ logger.LogTrace(
+ "Getting next actions (with {GP} GP, {MeticulousCollectability}~ meticulous, {ScourCollectability}~ scour)",
+ gp, nodeCondition.CollectabilityFromMeticulous, nodeCondition.CollectabilityFromScour);
+
Queue<EAction> actions = new();
uint neededCollectability = nodeCondition.CollectabilityToGoal(_currentRequest.Collectability);
if (neededCollectability <= nodeCondition.CollectabilityFromMeticulous)
{
+ logger.LogTrace("Can get all needed {NeededCollectability} from {Collectability}~ meticulous",
+ neededCollectability, nodeCondition.CollectabilityFromMeticulous);
actions.Enqueue(PickAction(EAction.MeticulousMiner, EAction.MeticulousBotanist));
return actions;
}
if (neededCollectability <= nodeCondition.CollectabilityFromScour)
{
+ logger.LogTrace("Can get all needed {NeededCollectability} from {Collectability}~ scour",
+ neededCollectability, nodeCondition.CollectabilityFromScour);
actions.Enqueue(PickAction(EAction.ScourMiner, EAction.ScourBotanist));
return actions;
}
// neither action directly solves our problem
if (!nodeCondition.ScrutinyActive && gp >= 200)
{
+ logger.LogTrace("Still missing {NeededCollectability} collectability, scrutiny inactive",
+ neededCollectability);
actions.Enqueue(PickAction(EAction.ScrutinyMiner, EAction.ScrutinyBotanist));
return actions;
}
if (nodeCondition.ScrutinyActive)
{
+ logger.LogTrace("Scrutiny active, need {NeededCollectability} and we expect {Collectability}~ meticulous",
+ neededCollectability, nodeCondition.CollectabilityFromMeticulous);
actions.Enqueue(PickAction(EAction.MeticulousMiner, EAction.MeticulousBotanist));
return actions;
}
else
{
+ logger.LogTrace("Scrutiny active, need {NeededCollectability} and we expect {Collectability}~ scour",
+ neededCollectability, nodeCondition.CollectabilityFromScour);
actions.Enqueue(PickAction(EAction.ScourMiner, EAction.ScourBotanist));
return actions;
}
}
public override string ToString() =>
- $"DoGatherCollectable({SeIconChar.Collectible.ToIconString()} {_currentRequest.Collectability}){(_revisitRequired ? " if revist" : "")}";
+ $"DoGatherCollectable({SeIconChar.Collectible.ToIconString()}/{_expectedScrutiny} {_currentRequest.Collectability}){(_revisitRequired ? " if revist" : "")}";
[SuppressMessage("ReSharper", "NotAccessedPositionalProperty.Local")]
private sealed record NodeCondition(