muffin v6.22

This commit is contained in:
alydev 2025-10-13 03:16:55 +10:00
parent b7a9243899
commit c9048e8eb4
2 changed files with 3433 additions and 3042 deletions

File diff suppressed because it is too large Load diff

View file

@ -5,6 +5,7 @@ using Dalamud.Interface;
using Dalamud.Interface.Components; using Dalamud.Interface.Components;
using Dalamud.Interface.Utility.Raii; using Dalamud.Interface.Utility.Raii;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Controller; using Questionable.Controller;
using Questionable.Data; using Questionable.Data;
@ -59,7 +60,7 @@ internal sealed class QuestJournalUtils
{ {
return; return;
} }
using (ImRaii.Disabled(!_questFunctions.IsReadyToAcceptQuest(questInfo.QuestId))) using (ImRaii.Disabled(!_questFunctions.IsReadyToAcceptQuest(questInfo.QuestId) || quest == null || quest.Root.Disabled))
{ {
if (ImGui.MenuItem("Start as next quest")) if (ImGui.MenuItem("Start as next quest"))
{ {
@ -67,6 +68,21 @@ internal sealed class QuestJournalUtils
_questController.Start(label); _questController.Start(label);
} }
} }
if (ImGui.IsItemHovered(ImGuiHoveredFlags.AllowWhenDisabled))
{
if (!_questFunctions.IsReadyToAcceptQuest(questInfo.QuestId))
{
ImGui.SetTooltip("Quest is not ready to accept");
}
else if (quest == null)
{
ImGui.SetTooltip("Quest has no path available");
}
else if (quest.Root.Disabled)
{
ImGui.SetTooltip("Quest path is disabled");
}
}
List<ElementId> incompletePrerequisiteQuests = GetIncompletePrerequisiteQuests(questInfo); List<ElementId> incompletePrerequisiteQuests = GetIncompletePrerequisiteQuests(questInfo);
using (ImRaii.Disabled(incompletePrerequisiteQuests.Count == 0)) using (ImRaii.Disabled(incompletePrerequisiteQuests.Count == 0))
{ {
@ -84,7 +100,7 @@ internal sealed class QuestJournalUtils
{ {
if (incompletePrerequisiteQuests.Count == 0) if (incompletePrerequisiteQuests.Count == 0)
{ {
ImGui.SetTooltip("No quests to add (quest may be complete or already in priority)"); ImGui.SetTooltip("No quests to add (quest may be complete, disabled, locked with no unlock path, or already in priority)");
} }
else else
{ {
@ -101,26 +117,44 @@ internal sealed class QuestJournalUtils
} }
} }
private List<ElementId> GetIncompletePrerequisiteQuests(IQuestInfo questInfo) private unsafe List<ElementId> GetIncompletePrerequisiteQuests(IQuestInfo questInfo)
{ {
List<ElementId> list = new List<ElementId>(); List<ElementId> list = new List<ElementId>();
HashSet<ElementId> visited = new HashSet<ElementId>(); HashSet<ElementId> visited = new HashSet<ElementId>();
CollectPrerequisitesRecursive(questInfo, list, visited); CollectPrerequisitesRecursive(questInfo, list, visited);
list.Reverse(); list.Reverse();
Quest quest2;
List<ElementId> list2 = (from qId in list.Where(delegate(ElementId qId) List<ElementId> list2 = (from qId in list.Where(delegate(ElementId qId)
{ {
if (!_questData.TryGetQuestInfo(qId, out IQuestInfo questInfo2)) if (!_questData.TryGetQuestInfo(qId, out IQuestInfo questInfo2))
{ {
return false; return false;
} }
return questInfo2.IsRepeatable || !_questFunctions.IsQuestComplete(qId); if (questInfo2.IsRepeatable && qId is QuestId questId2)
{
if (QuestManager.Instance()->IsDailyQuestCompleted(questId2.Value))
{
return false;
}
}
else if (_questFunctions.IsQuestComplete(qId))
{
return false;
}
return true;
}) })
where !_questFunctions.IsQuestUnobtainable(qId) where !_questFunctions.IsQuestUnobtainable(qId)
where _questRegistry.IsKnownQuest(qId) where _questRegistry.IsKnownQuest(qId)
where (!_questRegistry.TryGetQuest(qId, out quest2) || !quest2.Root.Disabled) ? true : false
where !_questController.ManualPriorityQuests.Any((Quest q) => q.Id.Equals(qId)) where !_questController.ManualPriorityQuests.Any((Quest q) => q.Id.Equals(qId))
select qId).ToList(); select qId).ToList();
list2.Reverse(); list2.Reverse();
if ((questInfo.IsRepeatable || !_questFunctions.IsQuestComplete(questInfo.QuestId)) && !_questFunctions.IsQuestUnobtainable(questInfo.QuestId) && _questRegistry.IsKnownQuest(questInfo.QuestId) && !_questController.ManualPriorityQuests.Any((Quest q) => q.Id.Equals(questInfo.QuestId))) bool flag = false;
flag = ((!questInfo.IsRepeatable || !(questInfo.QuestId is QuestId questId)) ? (!_questFunctions.IsQuestComplete(questInfo.QuestId)) : (!QuestManager.Instance()->IsDailyQuestCompleted(questId.Value)));
Quest quest;
bool flag2 = _questRegistry.TryGetQuest(questInfo.QuestId, out quest) && quest.Root.Disabled;
bool flag3 = _questFunctions.IsQuestLocked(questInfo.QuestId) && questInfo.PreviousQuests.Count == 0;
if (flag && !flag2 && !flag3 && !_questFunctions.IsQuestUnobtainable(questInfo.QuestId) && _questRegistry.IsKnownQuest(questInfo.QuestId) && !_questController.ManualPriorityQuests.Any((Quest q) => q.Id.Equals(questInfo.QuestId)))
{ {
list2.Add(questInfo.QuestId); list2.Add(questInfo.QuestId);
} }
@ -194,7 +228,7 @@ internal sealed class QuestJournalUtils
else else
{ {
_logger.LogWarning("No quests were added to priority list for '{QuestName}'", questInfo.Name); _logger.LogWarning("No quests were added to priority list for '{QuestName}'", questInfo.Name);
_chatGui.Print("No quests to add (may be complete or already in priority).", "Questionable", 576); _chatGui.Print("No quests to add (may be complete, disabled, locked with no unlock path, or already in priority).", "Questionable", 576);
} }
} }