Update teleport logic for priority quests/lower estimated gil cost

pull/2/head
Liza 2024-08-22 12:50:45 +02:00
parent 6ea9f282f3
commit 99cd1dd023
Signed by: liza
GPG Key ID: 7199F8D727D55F67
1 changed files with 28 additions and 6 deletions

View File

@ -12,11 +12,11 @@ using FFXIVClientStructs.FFXIV.Component.GUI;
using LLib.GameData;
using LLib.GameUI;
using Lumina.Excel.GeneratedSheets;
using Microsoft.Extensions.Logging;
using Questionable.Controller;
using Questionable.Controller.Steps.Interactions;
using Questionable.Data;
using Questionable.Model;
using Questionable.Model.Common;
using Questionable.Model.Questing;
using GrandCompany = FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany;
using Quest = Questionable.Model.Quest;
@ -32,6 +32,7 @@ internal sealed unsafe class QuestFunctions
private readonly IDataManager _dataManager;
private readonly IClientState _clientState;
private readonly IGameGui _gameGui;
private readonly ILogger<QuestFunctions> _logger;
public QuestFunctions(
QuestRegistry questRegistry,
@ -40,7 +41,8 @@ internal sealed unsafe class QuestFunctions
Configuration configuration,
IDataManager dataManager,
IClientState clientState,
IGameGui gameGui)
IGameGui gameGui,
ILogger<QuestFunctions> logger)
{
_questRegistry = questRegistry;
_questData = questData;
@ -49,6 +51,7 @@ internal sealed unsafe class QuestFunctions
_dataManager = dataManager;
_clientState = clientState;
_gameGui = gameGui;
_logger = logger;
}
public (ElementId? CurrentQuest, byte Sequence) GetCurrentQuest()
@ -251,8 +254,7 @@ internal sealed unsafe class QuestFunctions
//
// Of course, they can still be accepted manually.
InventoryManager* inventoryManager = InventoryManager.Instance();
if (inventoryManager->GetItemCountInContainer(1, InventoryType.Currency) < 2000)
return null;
int gil = inventoryManager->GetItemCountInContainer(1, InventoryType.Currency);
return GetPriorityQuestsThatCanBeAccepted()
.Where(x =>
@ -278,11 +280,20 @@ internal sealed unsafe class QuestFunctions
if (!_questRegistry.TryGetQuest(x, out Quest? quest))
return false;
if (gil < EstimateTeleportCosts(quest))
return false;
return quest.AllSteps().All(y =>
{
if (y.Step.AetheryteShortcut is { } aetheryteShortcut &&
_aetheryteFunctions.IsAetheryteUnlocked(aetheryteShortcut))
return false;
!_aetheryteFunctions.IsAetheryteUnlocked(aetheryteShortcut))
{
if (y.Step.SkipConditions?.AetheryteShortcutIf?.AetheryteLocked == aetheryteShortcut)
{
// _logger.LogTrace("Checking priority quest {QuestId}: aetheryte locked, but is listed as skippable", quest.Id);
}
else return false;
}
if (y.Step.AethernetShortcut is { } aethernetShortcut &&
(!_aetheryteFunctions.IsAetheryteUnlocked(aethernetShortcut.From) ||
@ -294,6 +305,17 @@ internal sealed unsafe class QuestFunctions
});
}
private static int EstimateTeleportCosts(Quest quest)
{
/*
if (quest.Info.Expansion == EExpansionVersion.ARealmReborn)
return 300 * quest.AllSteps().Count(x => x.Step.AetheryteShortcut != null);
else
return 1000 * quest.AllSteps().Count(x => x.Step.AetheryteShortcut != null);
*/
return 0;
}
private List<ElementId> GetPriorityQuestsThatCanBeAccepted()
{
List<ElementId> priorityQuests =