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,
|
"TerritoryId": 613,
|
||||||
"InteractionType": "WalkTo",
|
"InteractionType": "WalkTo",
|
||||||
"$": "Sui-no-Sato, NE inside"
|
"$": "Sui-no-Sato, NE inside",
|
||||||
|
"RestartNavigationIfCancelled": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"Position": {
|
"Position": {
|
||||||
@ -122,7 +123,8 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 613,
|
"TerritoryId": 613,
|
||||||
"InteractionType": "WalkTo",
|
"InteractionType": "WalkTo",
|
||||||
"$": "Sui-no-Sato, NE outside"
|
"$": "Sui-no-Sato, NE outside",
|
||||||
|
"RestartNavigationIfCancelled": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"DataId": 1023280,
|
"DataId": 1023280,
|
||||||
|
@ -23,7 +23,8 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 613,
|
"TerritoryId": 613,
|
||||||
"InteractionType": "WalkTo",
|
"InteractionType": "WalkTo",
|
||||||
"$": "Sui-no-Sato, NE outside"
|
"$": "Sui-no-Sato, NE outside",
|
||||||
|
"RestartNavigationIfCancelled": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"DataId": 1023280,
|
"DataId": 1023280,
|
||||||
|
@ -85,7 +85,8 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 613,
|
"TerritoryId": 613,
|
||||||
"InteractionType": "WalkTo",
|
"InteractionType": "WalkTo",
|
||||||
"$": "Sui-no-Sato, NE outside"
|
"$": "Sui-no-Sato, NE outside",
|
||||||
|
"RestartNavigationIfCancelled": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"DataId": 1023280,
|
"DataId": 1023280,
|
||||||
|
@ -91,6 +91,7 @@
|
|||||||
"TerritoryId": 613,
|
"TerritoryId": 613,
|
||||||
"InteractionType": "WalkTo",
|
"InteractionType": "WalkTo",
|
||||||
"$": "Exile, outside",
|
"$": "Exile, outside",
|
||||||
|
"RestartNavigationIfCancelled": false,
|
||||||
"Fly": true
|
"Fly": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -164,6 +165,7 @@
|
|||||||
"TerritoryId": 613,
|
"TerritoryId": 613,
|
||||||
"InteractionType": "WalkTo",
|
"InteractionType": "WalkTo",
|
||||||
"$": "Sui-no-Sato, SW outside",
|
"$": "Sui-no-Sato, SW outside",
|
||||||
|
"RestartNavigationIfCancelled": false,
|
||||||
"Fly": true
|
"Fly": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -49,7 +49,8 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 613,
|
"TerritoryId": 613,
|
||||||
"InteractionType": "WalkTo",
|
"InteractionType": "WalkTo",
|
||||||
"$": "Sui-no-Sato, NE outside"
|
"$": "Sui-no-Sato, NE outside",
|
||||||
|
"RestartNavigationIfCancelled": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"DataId": 1019970,
|
"DataId": 1019970,
|
||||||
|
@ -28,7 +28,8 @@
|
|||||||
},
|
},
|
||||||
"TerritoryId": 613,
|
"TerritoryId": 613,
|
||||||
"InteractionType": "WalkTo",
|
"InteractionType": "WalkTo",
|
||||||
"$": "Sui-no-Sato, NE inside"
|
"$": "Sui-no-Sato, NE inside",
|
||||||
|
"RestartNavigationIfCancelled": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"DataId": 1019978,
|
"DataId": 1019978,
|
||||||
|
@ -92,6 +92,10 @@
|
|||||||
"type": "boolean",
|
"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."
|
"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": {
|
"TerritoryId": {
|
||||||
"type": "integer",
|
"type": "integer",
|
||||||
"description": "The territory id associated with the location",
|
"description": "The territory id associated with the location",
|
||||||
|
@ -36,6 +36,7 @@ public sealed class QuestStep
|
|||||||
public bool? Land { get; set; }
|
public bool? Land { get; set; }
|
||||||
public bool? Sprint { get; set; }
|
public bool? Sprint { get; set; }
|
||||||
public bool? IgnoreDistanceToObject { get; set; }
|
public bool? IgnoreDistanceToObject { get; set; }
|
||||||
|
public bool? RestartNavigationIfCancelled { get; set; }
|
||||||
public string? Comment { get; set; }
|
public string? Comment { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -151,7 +151,7 @@ internal sealed class MovementController : IDisposable
|
|||||||
|
|
||||||
if (IsPathRunning && Destination != null)
|
if (IsPathRunning && Destination != null)
|
||||||
{
|
{
|
||||||
if (_gameFunctions.IsLoadingScreenVisible(false))
|
if (_gameFunctions.IsLoadingScreenVisible())
|
||||||
{
|
{
|
||||||
_logger.LogInformation("Stopping movement, loading screen visible");
|
_logger.LogInformation("Stopping movement, loading screen visible");
|
||||||
Stop();
|
Stop();
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
using Dalamud.Game.ClientState.Conditions;
|
using Dalamud.Game.ClientState.Conditions;
|
||||||
@ -67,7 +68,7 @@ internal static class MoveTo
|
|||||||
public ITask Move(MoveParams moveParams)
|
public ITask Move(MoveParams moveParams)
|
||||||
{
|
{
|
||||||
return new MoveInternal(moveParams, movementController, gameFunctions,
|
return new MoveInternal(moveParams, movementController, gameFunctions,
|
||||||
loggerFactory.CreateLogger<MoveInternal>(), condition, dataManager);
|
loggerFactory.CreateLogger<MoveInternal>(), condition, clientState, dataManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ITask Land()
|
public ITask Land()
|
||||||
@ -163,20 +164,24 @@ internal static class MoveTo
|
|||||||
private readonly MovementController _movementController;
|
private readonly MovementController _movementController;
|
||||||
private readonly ILogger<MoveInternal> _logger;
|
private readonly ILogger<MoveInternal> _logger;
|
||||||
private readonly ICondition _condition;
|
private readonly ICondition _condition;
|
||||||
|
private readonly IClientState _clientState;
|
||||||
|
|
||||||
private readonly Action _startAction;
|
private readonly Action _startAction;
|
||||||
private readonly Vector3 _destination;
|
private readonly Vector3 _destination;
|
||||||
|
private readonly MoveParams _moveParams;
|
||||||
|
|
||||||
public MoveInternal(MoveParams moveParams,
|
public MoveInternal(MoveParams moveParams,
|
||||||
MovementController movementController,
|
MovementController movementController,
|
||||||
GameFunctions gameFunctions,
|
GameFunctions gameFunctions,
|
||||||
ILogger<MoveInternal> logger,
|
ILogger<MoveInternal> logger,
|
||||||
ICondition condition,
|
ICondition condition,
|
||||||
|
IClientState clientState,
|
||||||
IDataManager dataManager)
|
IDataManager dataManager)
|
||||||
{
|
{
|
||||||
_movementController = movementController;
|
_movementController = movementController;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_condition = condition;
|
_condition = condition;
|
||||||
|
_clientState = clientState;
|
||||||
_cannotExecuteAtThisTime = dataManager.GetString<LogMessage>(579, x => x.Text)!;
|
_cannotExecuteAtThisTime = dataManager.GetString<LogMessage>(579, x => x.Text)!;
|
||||||
|
|
||||||
_destination = moveParams.Destination;
|
_destination = moveParams.Destination;
|
||||||
@ -206,6 +211,8 @@ internal static class MoveTo
|
|||||||
ignoreDistanceToObject: moveParams.IgnoreDistanceToObject,
|
ignoreDistanceToObject: moveParams.IgnoreDistanceToObject,
|
||||||
land: moveParams.Land);
|
land: moveParams.Land);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_moveParams = moveParams;
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool Start()
|
public bool Start()
|
||||||
@ -224,6 +231,15 @@ internal static class MoveTo
|
|||||||
if (movementStartedAt == DateTime.MaxValue || movementStartedAt.AddSeconds(2) >= DateTime.Now)
|
if (movementStartedAt == DateTime.MaxValue || movementStartedAt.AddSeconds(2) >= DateTime.Now)
|
||||||
return ETaskResult.StillRunning;
|
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;
|
return ETaskResult.TaskComplete;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -248,7 +264,8 @@ internal static class MoveTo
|
|||||||
bool Sprint = true,
|
bool Sprint = true,
|
||||||
bool Fly = false,
|
bool Fly = false,
|
||||||
bool Land = false,
|
bool Land = false,
|
||||||
bool IgnoreDistanceToObject = false)
|
bool IgnoreDistanceToObject = false,
|
||||||
|
bool RestartNavigation = true)
|
||||||
{
|
{
|
||||||
public MoveParams(QuestStep step, Vector3 destination)
|
public MoveParams(QuestStep step, Vector3 destination)
|
||||||
: this(step.TerritoryId,
|
: this(step.TerritoryId,
|
||||||
@ -259,7 +276,8 @@ internal static class MoveTo
|
|||||||
step.Sprint != false,
|
step.Sprint != false,
|
||||||
step.Fly == true,
|
step.Fly == true,
|
||||||
step.Land == 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)
|
if (!_clientState.IsLoggedIn || _clientState.LocalPlayer == null)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (IsLoadingScreenVisible(true))
|
if (IsLoadingScreenVisible())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (_condition[ConditionFlag.Crafting])
|
if (_condition[ConditionFlag.Crafting])
|
||||||
@ -438,19 +438,16 @@ internal sealed unsafe class GameFunctions
|
|||||||
flags.Contains(ConditionFlag.OccupiedInQuestEvent);
|
flags.Contains(ConditionFlag.OccupiedInQuestEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool IsLoadingScreenVisible(bool all)
|
public bool IsLoadingScreenVisible()
|
||||||
{
|
{
|
||||||
if (_gameGui.TryGetAddonByName("FadeMiddle", out AtkUnitBase* fade) && LAddon.IsAddonReady(fade) && fade->IsVisible)
|
if (_gameGui.TryGetAddonByName("FadeMiddle", out AtkUnitBase* fade) && LAddon.IsAddonReady(fade) && fade->IsVisible)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (all)
|
if (_gameGui.TryGetAddonByName("FadeBack", out fade) && LAddon.IsAddonReady(fade) && fade->IsVisible)
|
||||||
{
|
return true;
|
||||||
if (_gameGui.TryGetAddonByName("FadeBack", out fade) && LAddon.IsAddonReady(fade) && fade->IsVisible)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
if (_gameGui.TryGetAddonByName("NowLoading", out fade) && LAddon.IsAddonReady(fade) && fade->IsVisible)
|
if (_gameGui.TryGetAddonByName("NowLoading", out fade) && LAddon.IsAddonReady(fade) && fade->IsVisible)
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user