forked from aly/qstbak
muffin v7.5.12
This commit is contained in:
parent
3102923ce2
commit
911ed68baa
65 changed files with 2356 additions and 1539 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue