muffin v7.38.4

This commit is contained in:
alydev 2025-11-23 16:08:02 +10:00
parent bbc394c386
commit 7177a5440c
8 changed files with 5330 additions and 4542 deletions

View file

@ -56,6 +56,8 @@ internal sealed class QuestFunctions
private readonly HashSet<ushort> _alreadyLoggedLevelRequirements = new HashSet<ushort>();
private readonly HashSet<ushort> _alreadyLoggedGcLockedQuests = new HashSet<ushort>();
private ElementId? _lastLoggedLevelLockedMsq;
private ElementId? _lastLoggedForcedClassQuest;
@ -155,7 +157,10 @@ internal sealed class QuestFunctions
QuestReference questReference = GetMainScenarioQuest().Item1;
if (questReference.CurrentQuest != null && !_questRegistry.IsKnownQuest(questReference.CurrentQuest))
{
_logger.LogWarning("MSQ {MsqQuestId} is not in the quest registry, resetting to NoQuest", questReference.CurrentQuest);
if (questReference.CurrentQuest is QuestId questId && _alreadyLoggedUnobtainableQuestsDetailed.Add(questId.Value))
{
_logger.LogWarning("MSQ {MsqQuestId} is not in the quest registry, resetting to NoQuest", questReference.CurrentQuest);
}
questReference = QuestReference.NoQuest(questReference.State);
}
byte currentLevel = _clientState.LocalPlayer?.Level ?? 0;
@ -200,15 +205,15 @@ internal sealed class QuestFunctions
select x).ToList();
if (list.Count > 0)
{
ElementId questId = list.First().QuestId;
if (!IsQuestComplete(questId))
ElementId questId2 = list.First().QuestId;
if (!IsQuestComplete(questId2))
{
if (_lastLoggedForcedClassQuest != questId)
if (_lastLoggedForcedClassQuest != questId2)
{
_logger.LogInformation("MSQ level locked. Forcing class quest {ClassQuestId} for {ClassJob} (level {QuestLevel})", questId, valueOrDefault, list.First().Level);
_lastLoggedForcedClassQuest = questId;
_logger.LogInformation("MSQ level locked. Forcing class quest {ClassQuestId} for {ClassJob} (level {QuestLevel})", questId2, valueOrDefault, list.First().Level);
_lastLoggedForcedClassQuest = questId2;
}
return new QuestReference(questId, QuestManager.GetQuestSequence(questId.Value), questReference.State);
return new QuestReference(questId2, QuestManager.GetQuestSequence(questId2.Value), questReference.State);
}
}
else if (_lastLoggedLevelLockedMsq == questReference.CurrentQuest && _lastLoggedForcedClassQuest == null)
@ -222,9 +227,9 @@ internal sealed class QuestFunctions
select x).ToList();
if (list2.Count > 0)
{
ElementId questId2 = list2.First().QuestId;
_logger.LogInformation("MSQ level locked. Prioritizing class quest {ClassQuestId} for {ClassJob} (level {QuestLevel}) from registry", questId2, valueOrDefault, list2.First().Level);
return new QuestReference(questId2, QuestManager.GetQuestSequence(questId2.Value), questReference.State);
ElementId questId3 = list2.First().QuestId;
_logger.LogInformation("MSQ level locked. Prioritizing class quest {ClassQuestId} for {ClassJob} (level {QuestLevel}) from registry", questId3, valueOrDefault, list2.First().Level);
return new QuestReference(questId3, QuestManager.GetQuestSequence(questId3.Value), questReference.State);
}
_logger.LogWarning("MSQ level locked but no available early class quests found for {ClassJob} at level {CurrentLevel}", valueOrDefault, currentLevel);
}
@ -471,6 +476,20 @@ internal sealed class QuestFunctions
return (new QuestReference(questId, QuestManager.GetQuestSequence(questId.Value), MainScenarioQuestState.Available), item);
}
private static byte GetRequiredGCRank(QuestId questId)
{
return questId.Value switch
{
1128 => 8,
1129 => 8,
1130 => 8,
1131 => 9,
1132 => 9,
1133 => 9,
_ => 1,
};
}
private unsafe bool IsOnAlliedSocietyMount()
{
BattleChara* ptr = (BattleChara*)(_clientState.LocalPlayer?.Address ?? 0);
@ -859,9 +878,19 @@ internal sealed class QuestFunctions
return true;
}
QuestInfo questInfo = (QuestInfo)_questData.GetQuestInfo(questId);
if (questInfo.GrandCompany != FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany.None && questInfo.GrandCompany != GetGrandCompany())
if (questInfo.GrandCompany != FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany.None)
{
return true;
FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany grandCompany = GetGrandCompany();
byte grandCompanyRank = GetGrandCompanyRank();
byte requiredGCRank = GetRequiredGCRank(questId);
if (questInfo.GrandCompany != grandCompany || grandCompanyRank < requiredGCRank)
{
if (_alreadyLoggedGcLockedQuests.Add(questId.Value))
{
_logger.LogDebug("Quest {QuestId} locked: required GC {RequiredGc}, required rank {RequiredRank}, player GC {PlayerGc}, player rank {PlayerRank}", questId, questInfo.GrandCompany, requiredGCRank, grandCompany, grandCompanyRank);
}
return true;
}
}
if (questInfo.AlliedSociety != EAlliedSociety.None && questInfo.IsRepeatable)
{
@ -1274,6 +1303,11 @@ internal sealed class QuestFunctions
return (FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany)PlayerState.Instance()->GrandCompany;
}
public unsafe byte GetGrandCompanyRank()
{
return PlayerState.Instance()->GetGrandCompanyRank();
}
public bool IsMainScenarioQuestComplete()
{
return IsQuestComplete(_questData.LastMainScenarioQuestId);