1
0
Fork 0
forked from aly/qstbak

muffin v7.5.12

This commit is contained in:
alydev 2026-08-19 13:19:57 +10:00
parent 3102923ce2
commit 911ed68baa
65 changed files with 2356 additions and 1539 deletions

View file

@ -61,6 +61,11 @@ internal sealed class QuestController : MiniTaskController<QuestController>
}
}
internal void ResetInitialQuestWork(QuestProgressInfo? questWork)
{
InitialQuestWork = questWork;
}
public void SetSequence(byte sequence, int step = 0)
{
Sequence = sequence;
@ -180,6 +185,8 @@ internal sealed class QuestController : MiniTaskController<QuestController>
private QuestProgress? _pendingQuest;
private (ElementId QuestId, QuestProgressInfo QuestWork)? _initialQuestWorkPreservedForReload;
private EAutomationType _automationType;
private bool _commandAfterStopFired;
@ -210,6 +217,10 @@ internal sealed class QuestController : MiniTaskController<QuestController>
private bool _resumeAfterSideTasks;
private bool _resumeAfterDutyExit;
private bool _resumeAfterOccupiedQuestTransition;
private bool _runningDebugTasks;
private const char ClipboardSeparator = ';';
@ -360,6 +371,13 @@ internal sealed class QuestController : MiniTaskController<QuestController>
Dictionary<GatheringPointId, GatheringRoot> gatheringPoints = _gatheringPointRegistry.Build();
_framework.RunOnFrameworkThread(delegate
{
QuestProgress questProgress = CurrentQuestDetails?.Progress;
QuestProgressInfo questProgressInfo = questProgress?.InitialQuestWork;
if (questProgress != null && questProgressInfo == null)
{
questProgressInfo = _questFunctions.GetQuestProgressInfo(questProgress.Quest.Id);
}
_initialQuestWorkPreservedForReload = ((questProgress != null && questProgressInfo != null) ? new(ElementId, QuestProgressInfo)?((questProgress.Quest.Id, questProgressInfo)) : (((ElementId, QuestProgressInfo)?)null));
ResetInternalState();
_gatheringPointRegistry.Publish(gatheringPoints);
_questRegistry.Publish(questSnapshot);
@ -373,6 +391,8 @@ internal sealed class QuestController : MiniTaskController<QuestController>
_pendingQuest = null;
_simulatedQuest = null;
_safeAnimationEnd = 0L;
_resumeAfterDutyExit = false;
_resumeAfterOccupiedQuestTransition = false;
DebugState = null;
}
@ -501,6 +521,28 @@ internal sealed class QuestController : MiniTaskController<QuestController>
DebugState = "Not logged in";
return;
}
if (_resumeAfterDutyExit)
{
if (ConditionHelper.IsBetweenAreas(_condition) || IsInsideDutyInstance())
{
DebugState = "Waiting for duty exit";
return;
}
_resumeAfterDutyExit = false;
CheckNextTasks("Resume after duty exit");
return;
}
if (_resumeAfterOccupiedQuestTransition)
{
if (_gameFunctions.IsOccupied())
{
DebugState = "Waiting for quest transition to finish";
return;
}
_resumeAfterOccupiedQuestTransition = false;
CheckNextTasks("Resume after occupied quest transition");
return;
}
if (_runningDebugTasks)
{
if (!_taskQueue.AllTasksComplete)
@ -638,8 +680,32 @@ internal sealed class QuestController : MiniTaskController<QuestController>
}
else if (questProgress.Sequence != b)
{
if (IsDutyChainActive())
{
DebugState = "Waiting for duty to finish";
return;
}
questProgress.SetSequence(b);
CheckNextTasks($"New sequence {questProgress == _startedQuest}");
QuestProgressInfo questProgressInfo = _questFunctions.GetQuestProgressInfo(questProgress.Quest.Id);
questProgress.ResetInitialQuestWork(questProgressInfo);
_logger.LogDebug("Captured initial quest variables for {QuestId} sequence {Sequence}: {QuestWork}", questProgress.Quest.Id, b, questProgressInfo);
bool flag = _gameFunctions.IsOccupied();
if (flag)
{
EAutomationType automationType = AutomationType;
bool flag2 = (uint)(automationType - 1) <= 2u;
flag = flag2;
}
if (flag)
{
ClearTasksInternal();
_resumeAfterOccupiedQuestTransition = true;
DebugState = "Waiting for quest transition to finish";
}
else
{
CheckNextTasks($"New sequence {questProgress == _startedQuest}");
}
}
else if (questProgress.Step == 255)
{
@ -770,6 +836,25 @@ internal sealed class QuestController : MiniTaskController<QuestController>
return (null, 0);
}
private bool IsInsideDutyInstance()
{
uint territoryType = _clientState.TerritoryType;
if (_territoryData.IsDutyInstance(territoryType))
{
return !_territoryData.IsFieldOperation(territoryType);
}
return false;
}
private bool IsDutyChainActive()
{
if (!(_taskQueue.CurrentTaskExecutor?.CurrentTask is IDutyTask))
{
return _taskQueue.RemainingTasks.Any((ITask x) => x is IDutyTask);
}
return true;
}
private bool IsLevelingModeActive()
{
ITask task = _taskQueue.CurrentTaskExecutor?.CurrentTask;
@ -890,6 +975,8 @@ internal sealed class QuestController : MiniTaskController<QuestController>
_deathCount = 0;
_deathRecoveryPending = false;
_resumeAfterSideTasks = false;
_resumeAfterDutyExit = false;
_resumeAfterOccupiedQuestTransition = false;
SessionConditions.Clear();
_conditionsMetAtStart.Clear();
}
@ -1179,12 +1266,29 @@ internal sealed class QuestController : MiniTaskController<QuestController>
{
return null;
}
questProgress.CaptureInitialQuestWork(_questFunctions.GetQuestProgressInfo(questId));
return questProgress.InitialQuestWork;
}
private QuestProgress CreateQuestProgress(Quest quest, byte sequence = 0, int step = 0)
{
return new QuestProgress(quest, sequence, step, _questFunctions.GetQuestProgressInfo(quest.Id));
(ElementId, QuestProgressInfo)? initialQuestWorkPreservedForReload = _initialQuestWorkPreservedForReload;
QuestProgressInfo questProgressInfo;
if (initialQuestWorkPreservedForReload.HasValue)
{
(ElementId, QuestProgressInfo) valueOrDefault = initialQuestWorkPreservedForReload.GetValueOrDefault();
if (valueOrDefault.Item1.Equals(quest.Id))
{
questProgressInfo = valueOrDefault.Item2;
_initialQuestWorkPreservedForReload = null;
_logger.LogDebug("Restored initial quest variables for {QuestId} after data reload: {QuestWork}", quest.Id, questProgressInfo);
goto IL_0075;
}
}
questProgressInfo = _questFunctions.GetQuestProgressInfo(quest.Id);
goto IL_0075;
IL_0075:
return new QuestProgress(quest, sequence, step, questProgressInfo);
}
private void CaptureInitialQuestWork(QuestProgress? progress, ElementId questId)
@ -1257,8 +1361,9 @@ internal sealed class QuestController : MiniTaskController<QuestController>
return;
}
}
if (questStep != null && questStep.TerritoryId != _clientState.TerritoryType && (_territoryData.IsDutyInstance(_clientState.TerritoryType) || _territoryData.IsQuestBattleInstance(_clientState.TerritoryType)))
if (questStep != null && questStep.TerritoryId != _clientState.TerritoryType && IsInsideDutyInstance())
{
_resumeAfterDutyExit = true;
_logger.LogDebug("Deferring next step: step territory {StepTerritory} != current instance territory {CurrentTerritory}, waiting for duty exit", questStep.TerritoryId, _clientState.TerritoryType);
DebugState = "Waiting for duty exit";
return;