Update movement logic to handle cases where you're stopped too far away
This commit is contained in:
parent
25bfb6033b
commit
e4b5ccec36
@ -50,7 +50,8 @@
|
||||
},
|
||||
"TerritoryId": 613,
|
||||
"InteractionType": "WalkTo",
|
||||
"$": "Sui-no-Sato, NE inside"
|
||||
"$": "Sui-no-Sato, NE inside",
|
||||
"RestartNavigationIfCancelled": false
|
||||
},
|
||||
{
|
||||
"Position": {
|
||||
@ -122,7 +123,8 @@
|
||||
},
|
||||
"TerritoryId": 613,
|
||||
"InteractionType": "WalkTo",
|
||||
"$": "Sui-no-Sato, NE outside"
|
||||
"$": "Sui-no-Sato, NE outside",
|
||||
"RestartNavigationIfCancelled": false
|
||||
},
|
||||
{
|
||||
"DataId": 1023280,
|
||||
|
@ -23,7 +23,8 @@
|
||||
},
|
||||
"TerritoryId": 613,
|
||||
"InteractionType": "WalkTo",
|
||||
"$": "Sui-no-Sato, NE outside"
|
||||
"$": "Sui-no-Sato, NE outside",
|
||||
"RestartNavigationIfCancelled": false
|
||||
},
|
||||
{
|
||||
"DataId": 1023280,
|
||||
|
@ -85,7 +85,8 @@
|
||||
},
|
||||
"TerritoryId": 613,
|
||||
"InteractionType": "WalkTo",
|
||||
"$": "Sui-no-Sato, NE outside"
|
||||
"$": "Sui-no-Sato, NE outside",
|
||||
"RestartNavigationIfCancelled": false
|
||||
},
|
||||
{
|
||||
"DataId": 1023280,
|
||||
|
@ -91,6 +91,7 @@
|
||||
"TerritoryId": 613,
|
||||
"InteractionType": "WalkTo",
|
||||
"$": "Exile, outside",
|
||||
"RestartNavigationIfCancelled": false,
|
||||
"Fly": true
|
||||
},
|
||||
{
|
||||
@ -164,6 +165,7 @@
|
||||
"TerritoryId": 613,
|
||||
"InteractionType": "WalkTo",
|
||||
"$": "Sui-no-Sato, SW outside",
|
||||
"RestartNavigationIfCancelled": false,
|
||||
"Fly": true
|
||||
},
|
||||
{
|
||||
|
@ -49,7 +49,8 @@
|
||||
},
|
||||
"TerritoryId": 613,
|
||||
"InteractionType": "WalkTo",
|
||||
"$": "Sui-no-Sato, NE outside"
|
||||
"$": "Sui-no-Sato, NE outside",
|
||||
"RestartNavigationIfCancelled": false
|
||||
},
|
||||
{
|
||||
"DataId": 1019970,
|
||||
|
@ -28,7 +28,8 @@
|
||||
},
|
||||
"TerritoryId": 613,
|
||||
"InteractionType": "WalkTo",
|
||||
"$": "Sui-no-Sato, NE inside"
|
||||
"$": "Sui-no-Sato, NE inside",
|
||||
"RestartNavigationIfCancelled": false
|
||||
},
|
||||
{
|
||||
"DataId": 1019978,
|
||||
|
@ -92,6 +92,10 @@
|
||||
"type": "boolean",
|
||||
"description": "Most interactions with objects are checked for a Y (height) difference of 2 in-game units. If set to true, the game won't attempt to get any closer if the height difference is larger than this."
|
||||
},
|
||||
"RestartNavigationIfCancelled": {
|
||||
"type": "boolean",
|
||||
"description": "For some specific loading screen transitions (e.g. when entering/leaving the water through the portals in the ruby sea), setting this to 'false' means it won't re-attempt to move to the portal after the loading animation"
|
||||
},
|
||||
"TerritoryId": {
|
||||
"type": "integer",
|
||||
"description": "The territory id associated with the location",
|
||||
|
@ -36,6 +36,7 @@ public sealed class QuestStep
|
||||
public bool? Land { get; set; }
|
||||
public bool? Sprint { get; set; }
|
||||
public bool? IgnoreDistanceToObject { get; set; }
|
||||
public bool? RestartNavigationIfCancelled { get; set; }
|
||||
public string? Comment { get; set; }
|
||||
|
||||
/// <summary>
|
||||
|
@ -151,7 +151,7 @@ internal sealed class MovementController : IDisposable
|
||||
|
||||
if (IsPathRunning && Destination != null)
|
||||
{
|
||||
if (_gameFunctions.IsLoadingScreenVisible(false))
|
||||
if (_gameFunctions.IsLoadingScreenVisible())
|
||||
{
|
||||
_logger.LogInformation("Stopping movement, loading screen visible");
|
||||
Stop();
|
||||
|
@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
using System.Numerics;
|
||||
using Dalamud.Game.ClientState.Conditions;
|
||||
@ -67,7 +68,7 @@ internal static class MoveTo
|
||||
public ITask Move(MoveParams moveParams)
|
||||
{
|
||||
return new MoveInternal(moveParams, movementController, gameFunctions,
|
||||
loggerFactory.CreateLogger<MoveInternal>(), condition, dataManager);
|
||||
loggerFactory.CreateLogger<MoveInternal>(), condition, clientState, dataManager);
|
||||
}
|
||||
|
||||
public ITask Land()
|
||||
@ -163,20 +164,24 @@ internal static class MoveTo
|
||||
private readonly MovementController _movementController;
|
||||
private readonly ILogger<MoveInternal> _logger;
|
||||
private readonly ICondition _condition;
|
||||
private readonly IClientState _clientState;
|
||||
|
||||
private readonly Action _startAction;
|
||||
private readonly Vector3 _destination;
|
||||
private readonly MoveParams _moveParams;
|
||||
|
||||
public MoveInternal(MoveParams moveParams,
|
||||
MovementController movementController,
|
||||
GameFunctions gameFunctions,
|
||||
ILogger<MoveInternal> logger,
|
||||
ICondition condition,
|
||||
IClientState clientState,
|
||||
IDataManager dataManager)
|
||||
{
|
||||
_movementController = movementController;
|
||||
_logger = logger;
|
||||
_condition = condition;
|
||||
_clientState = clientState;
|
||||
_cannotExecuteAtThisTime = dataManager.GetString<LogMessage>(579, x => x.Text)!;
|
||||
|
||||
_destination = moveParams.Destination;
|
||||
@ -206,6 +211,8 @@ internal static class MoveTo
|
||||
ignoreDistanceToObject: moveParams.IgnoreDistanceToObject,
|
||||
land: moveParams.Land);
|
||||
}
|
||||
|
||||
_moveParams = moveParams;
|
||||
}
|
||||
|
||||
public bool Start()
|
||||
@ -224,6 +231,15 @@ internal static class MoveTo
|
||||
if (movementStartedAt == DateTime.MaxValue || movementStartedAt.AddSeconds(2) >= DateTime.Now)
|
||||
return ETaskResult.StillRunning;
|
||||
|
||||
if (_moveParams.RestartNavigation &&
|
||||
Vector3.Distance(_clientState.LocalPlayer!.Position, _destination) >
|
||||
(_moveParams.StopDistance ?? QuestStep.DefaultStopDistance) + 5f)
|
||||
{
|
||||
_logger.LogInformation("Looks like movement was interrupted, re-attempting to move");
|
||||
_startAction();
|
||||
return ETaskResult.StillRunning;
|
||||
}
|
||||
|
||||
return ETaskResult.TaskComplete;
|
||||
}
|
||||
|
||||
@ -248,7 +264,8 @@ internal static class MoveTo
|
||||
bool Sprint = true,
|
||||
bool Fly = false,
|
||||
bool Land = false,
|
||||
bool IgnoreDistanceToObject = false)
|
||||
bool IgnoreDistanceToObject = false,
|
||||
bool RestartNavigation = true)
|
||||
{
|
||||
public MoveParams(QuestStep step, Vector3 destination)
|
||||
: this(step.TerritoryId,
|
||||
@ -259,7 +276,8 @@ internal static class MoveTo
|
||||
step.Sprint != false,
|
||||
step.Fly == true,
|
||||
step.Land == true,
|
||||
step.IgnoreDistanceToObject == true)
|
||||
step.IgnoreDistanceToObject == true,
|
||||
step.RestartNavigationIfCancelled != false)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
@ -398,7 +398,7 @@ internal sealed unsafe class GameFunctions
|
||||
if (!_clientState.IsLoggedIn || _clientState.LocalPlayer == null)
|
||||
return true;
|
||||
|
||||
if (IsLoadingScreenVisible(true))
|
||||
if (IsLoadingScreenVisible())
|
||||
return true;
|
||||
|
||||
if (_condition[ConditionFlag.Crafting])
|
||||
@ -438,19 +438,16 @@ internal sealed unsafe class GameFunctions
|
||||
flags.Contains(ConditionFlag.OccupiedInQuestEvent);
|
||||
}
|
||||
|
||||
public bool IsLoadingScreenVisible(bool all)
|
||||
public bool IsLoadingScreenVisible()
|
||||
{
|
||||
if (_gameGui.TryGetAddonByName("FadeMiddle", out AtkUnitBase* fade) && LAddon.IsAddonReady(fade) && fade->IsVisible)
|
||||
return true;
|
||||
|
||||
if (all)
|
||||
{
|
||||
if (_gameGui.TryGetAddonByName("FadeBack", out fade) && LAddon.IsAddonReady(fade) && fade->IsVisible)
|
||||
return true;
|
||||
|
||||
if (_gameGui.TryGetAddonByName("NowLoading", out fade) && LAddon.IsAddonReady(fade) && fade->IsVisible)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user