Skipping quest steps based on CompletionFlags now works
This commit is contained in:
parent
a7459a628a
commit
400b727f49
@ -89,7 +89,7 @@
|
||||
"Z": 419.7605
|
||||
},
|
||||
"TerritoryId": 959,
|
||||
"InteractionType": "Instruction",
|
||||
"InteractionType": "WaitForManualProgress",
|
||||
"Comment": "Follow Argos"
|
||||
},
|
||||
{
|
||||
@ -148,7 +148,7 @@
|
||||
"Z": 523.5217
|
||||
},
|
||||
"TerritoryId": 959,
|
||||
"InteractionType": "Instruction",
|
||||
"InteractionType": "WaitForManualProgress",
|
||||
"Comment": "Follow Argos"
|
||||
},
|
||||
{
|
||||
|
@ -110,18 +110,18 @@
|
||||
"InteractionType": "Jump",
|
||||
"JumpDestination": {
|
||||
"Position": {
|
||||
"X": -444.84818,
|
||||
"Y": -160.76439,
|
||||
"Z": -645.7075
|
||||
"X": -443.62042,
|
||||
"Y": -160.7644,
|
||||
"Z": -644.7719
|
||||
}
|
||||
},
|
||||
"Comment": "Platform 4"
|
||||
},
|
||||
{
|
||||
"Position": {
|
||||
"X": -444.84818,
|
||||
"Y": -160.76439,
|
||||
"Z": -645.7075
|
||||
"X": -443.62042,
|
||||
"Y": -160.7644,
|
||||
"Z": -644.7719
|
||||
},
|
||||
"TerritoryId": 959,
|
||||
"InteractionType": "Jump",
|
||||
@ -280,7 +280,8 @@
|
||||
"Z": -620.05035
|
||||
},
|
||||
"TerritoryId": 959,
|
||||
"InteractionType": "Interact"
|
||||
"InteractionType": "Interact",
|
||||
"Comment": "FIXME Auto-playing quests seems to get stuck here/do nothing"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
@ -129,8 +129,7 @@
|
||||
"Z": 301.63266
|
||||
},
|
||||
"TerritoryId": 956,
|
||||
"InteractionType": "Interact",
|
||||
"Comment": "TODO Should cancel navmesh if condition is [OccupiedInCutsceneEvent OR BetweenAreas]; then verify next marker distance"
|
||||
"InteractionType": "WalkTo"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
@ -105,6 +105,23 @@
|
||||
{
|
||||
"Sequence": 5,
|
||||
"Steps": [
|
||||
{
|
||||
"Position": {
|
||||
"X": 26.119669,
|
||||
"Y": 269.043,
|
||||
"Z": -587.29144
|
||||
},
|
||||
"TerritoryId": 960,
|
||||
"InteractionType": "WalkTo",
|
||||
"CompletionQuestVariablesFlags": [
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
null,
|
||||
-128
|
||||
]
|
||||
},
|
||||
{
|
||||
"DataId": 2012354,
|
||||
"Position": {
|
||||
|
@ -45,7 +45,7 @@
|
||||
},
|
||||
"TerritoryId": 960,
|
||||
"InteractionType": "WaitForManualProgress",
|
||||
"Comment": "Identify Anomaly (Elbow/Knee)"
|
||||
"Comment": "Identify Anomaly (Head, Elbow or Knee)"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
@ -112,6 +112,12 @@ internal sealed class MovementController : IDisposable
|
||||
|
||||
if (IsPathRunning && Destination != null)
|
||||
{
|
||||
if (_gameFunctions.IsLoadingScreenVisible())
|
||||
{
|
||||
Stop();
|
||||
return;
|
||||
}
|
||||
|
||||
Vector3 localPlayerPosition = _clientState.LocalPlayer?.Position ?? Vector3.Zero;
|
||||
if ((localPlayerPosition - Destination.Position).Length() < Destination.StopDistance)
|
||||
{
|
||||
|
@ -76,7 +76,7 @@ internal static class SkipCondition
|
||||
}
|
||||
|
||||
QuestWork? questWork = gameFunctions.GetQuestEx(QuestId);
|
||||
if (questWork != null && Step.MatchesQuestVariables(questWork.Value))
|
||||
if (questWork != null && Step.MatchesQuestVariables(questWork.Value, true))
|
||||
{
|
||||
logger.LogInformation("Skipping step, as quest variables match");
|
||||
return true;
|
||||
|
@ -18,7 +18,7 @@ internal static class WaitAtEnd
|
||||
{
|
||||
public IEnumerable<ITask> CreateAllTasks(Quest quest, QuestSequence sequence, QuestStep step)
|
||||
{
|
||||
if (step.CompletionQuestVariablesFlags.Count == 6)
|
||||
if (step.CompletionQuestVariablesFlags.Count == 6 && step.CompletionQuestVariablesFlags.Any(x => x is > 0))
|
||||
{
|
||||
var task = serviceProvider.GetRequiredService<WaitForCompletionFlags>()
|
||||
.With(quest, step);
|
||||
@ -129,7 +129,7 @@ internal static class WaitAtEnd
|
||||
public ETaskResult Update()
|
||||
{
|
||||
QuestWork? questWork = gameFunctions.GetQuestEx(Quest.QuestId);
|
||||
return questWork != null && Step.MatchesQuestVariables(questWork.Value)
|
||||
return questWork != null && Step.MatchesQuestVariables(questWork.Value, false)
|
||||
? ETaskResult.TaskComplete
|
||||
: ETaskResult.StillRunning;
|
||||
}
|
||||
|
@ -534,9 +534,7 @@ internal sealed unsafe class GameFunctions
|
||||
|
||||
public bool IsOccupied()
|
||||
{
|
||||
if (_gameGui.TryGetAddonByName("FadeMiddle", out AtkUnitBase* fade) &&
|
||||
LAddon.IsAddonReady(fade) &&
|
||||
fade->IsVisible)
|
||||
if (IsLoadingScreenVisible())
|
||||
return true;
|
||||
|
||||
return _condition[ConditionFlag.Occupied] || _condition[ConditionFlag.Occupied30] ||
|
||||
@ -546,4 +544,11 @@ internal sealed unsafe class GameFunctions
|
||||
_condition[ConditionFlag.Casting] || _condition[ConditionFlag.Unknown57] ||
|
||||
_condition[ConditionFlag.BetweenAreas] || _condition[ConditionFlag.BetweenAreas51];
|
||||
}
|
||||
|
||||
public bool IsLoadingScreenVisible()
|
||||
{
|
||||
return _gameGui.TryGetAddonByName("FadeMiddle", out AtkUnitBase* fade) &&
|
||||
LAddon.IsAddonReady(fade) &&
|
||||
fade->IsVisible;
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Numerics;
|
||||
using System.Text.Json.Serialization;
|
||||
@ -50,7 +51,11 @@ internal sealed class QuestStep
|
||||
public IList<short?> CompletionQuestVariablesFlags { get; set; } = new List<short?>();
|
||||
public IList<DialogueChoice> DialogueChoices { get; set; } = new List<DialogueChoice>();
|
||||
|
||||
public unsafe bool MatchesQuestVariables(QuestWork questWork)
|
||||
/// <summary>
|
||||
/// Positive values: Must be set to this value; will wait for the step to have these set.
|
||||
/// Negative values: Will skip if set to this value, won't wait for this to be set.
|
||||
/// </summary>
|
||||
public unsafe bool MatchesQuestVariables(QuestWork questWork, bool forSkip)
|
||||
{
|
||||
if (CompletionQuestVariablesFlags.Count != 6)
|
||||
return false;
|
||||
@ -62,11 +67,19 @@ internal sealed class QuestStep
|
||||
continue;
|
||||
|
||||
byte actualValue = questWork.Variables[i];
|
||||
byte expectedValue = check > 0 ? (byte)check : (byte)0;
|
||||
byte checkByte = check > 0 ? (byte)check : (byte)-check;
|
||||
|
||||
if ((actualValue & checkByte) != expectedValue)
|
||||
return false;
|
||||
if (forSkip)
|
||||
{
|
||||
byte expectedValue = (byte)Math.Abs(check.Value);
|
||||
if ((actualValue & checkByte) != expectedValue)
|
||||
return false;
|
||||
}
|
||||
else if (!forSkip && check > 0)
|
||||
{
|
||||
byte expectedValue = check > 0 ? (byte)check : (byte)0;
|
||||
if ((actualValue & checkByte) != expectedValue)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -1,7 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0-windows</TargetFramework>
|
||||
<Version>0.8</Version>
|
||||
<Version>0.9</Version>
|
||||
<LangVersion>12</LangVersion>
|
||||
<Nullable>enable</Nullable>
|
||||
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
|
||||
|
Loading…
Reference in New Issue
Block a user