muffin v7.38.4
This commit is contained in:
parent
bbc394c386
commit
7177a5440c
8 changed files with 5330 additions and 4542 deletions
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue