From 8a011bb1f47cc2e9bb98337ba87c850546a3c2a9 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sun, 18 Aug 2024 00:41:58 +0200 Subject: [PATCH] Update collectable logic for items above your level/low collectability increase --- .../Steps/Gathering/DoGatherCollectable.cs | 43 +++++++++++++++++-- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/Questionable/Controller/Steps/Gathering/DoGatherCollectable.cs b/Questionable/Controller/Steps/Gathering/DoGatherCollectable.cs index 10fb9faa..3c6f776d 100644 --- a/Questionable/Controller/Steps/Gathering/DoGatherCollectable.cs +++ b/Questionable/Controller/Steps/Gathering/DoGatherCollectable.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using Dalamud.Game.Text; using Dalamud.Plugin.Services; @@ -25,7 +26,10 @@ internal sealed class DoGatherCollectable( private bool _revisitTriggered; private Queue? _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; @@ -71,10 +75,27 @@ internal sealed class DoGatherCollectable( 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(); } @@ -108,7 +129,7 @@ internal sealed class DoGatherCollectable( 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 ); @@ -120,17 +141,25 @@ internal sealed class DoGatherCollectable( private Queue 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 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; } @@ -138,17 +167,23 @@ internal sealed class DoGatherCollectable( // 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; } @@ -168,7 +203,7 @@ internal sealed class DoGatherCollectable( } 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(