{
"$schema": "https://git.carvel.li/liza/Questionable/raw/branch/master/QuestPaths/quest-v1.json",
"Author": "liza",
- "Disabled": true,
"QuestSequence": [
{
"Sequence": 0,
{
"Sequence": 1,
"Steps": [
+ {
+ "DataId": 1024777,
+ "Position": {
+ "X": -41.641907,
+ "Y": 55.97816,
+ "Z": 211.38318
+ },
+ "TerritoryId": 612,
+ "InteractionType": "Interact"
+ }
+ ]
+ },
+ {
+ "Sequence": 2,
+ "Steps": [
+ {
+ "Position": {
+ "X": 482.93036,
+ "Y": 42.43753,
+ "Z": 350.85095
+ },
+ "StopDistance": 0.5,
+ "TerritoryId": 612,
+ "InteractionType": "Combat",
+ "EnemySpawnType": "AutoOnEnterArea",
+ "KillEnemyDataIds": [
+ 8593
+ ],
+ "Fly": true,
+ "Land": true
+ }
]
},
{
--- /dev/null
+using System;
+using System.Numerics;
+using Dalamud.Game.ClientState.Objects.Types;
+using Questionable.Functions;
+using Questionable.Model;
+using Questionable.Model.Questing;
+
+namespace Questionable.Controller.CombatModules;
+
+/// <summary>
+/// Commandeered Magitek Armor; used in 'Magiteknical Failure' quest.
+/// </summary>
+internal sealed class Mount147Module : ICombatModule
+{
+ public const ushort MountId = 147;
+ private readonly EAction[] _actions = [EAction.Trample];
+
+ private readonly MovementController _movementController;
+ private readonly GameFunctions _gameFunctions;
+
+
+ public Mount147Module(MovementController movementController, GameFunctions gameFunctions)
+ {
+ _movementController = movementController;
+ _gameFunctions = gameFunctions;
+ }
+
+ public bool CanHandleFight(CombatController.CombatData combatData) => _gameFunctions.GetMountId() == MountId;
+
+ public bool Start(CombatController.CombatData combatData) => true;
+
+ public bool Stop() => true;
+
+ public void Update(IGameObject gameObject)
+ {
+ if (_movementController.IsPathfinding || _movementController.IsPathRunning)
+ return;
+
+ foreach (EAction action in _actions)
+ {
+ if (_gameFunctions.UseAction(gameObject, action, checkCanUse: false))
+ return;
+ }
+ }
+
+ public void MoveToTarget(IGameObject gameObject)
+ {
+ }
+
+ public bool CanAttack(IBattleNpc target) => target.DataId is 8593;
+}
ArgumentNullException.ThrowIfNull(step.EnemySpawnType);
- if (gameFunctions.GetMountId() != Mount128Module.MountId)
+ if (gameFunctions.GetMountId() != Mount128Module.MountId &&
+ gameFunctions.GetMountId() != Mount147Module.MountId)
yield return new Mount.UnmountTask();
if (step.CombatDelaySecondsAtStart != null)
}
// if the quest uses no mount actions, that's not a mount quest
- if (!quest.AllSteps().Any(x => x.Step.Action is { } action && action.RequiresMount()))
+ if (!quest.AllSteps().Any(x => (x.Step.Action is { } action && action.RequiresMount()) || (x.Step.InteractionType == EInteractionType.Combat && x.Step.KillEnemyDataIds.Contains(8593))))
{
logger.LogInformation("Quest doesn't use any mount actions, teleporting to {Aetheryte}", mountConfiguration.ClosestAetheryte);
return teleportTask;
{ 66, new(1016093, EAetheryteLocation.SeaOfCloudsOkZundu) },
{ 79, new(1017031, EAetheryteLocation.DravanianForelandsAnyxTrine) },
{ 89, new(1017322, EAetheryteLocation.ChurningMistsZenith) },
+ { 147, new(1024777, EAetheryteLocation.FringesPeeringStones) },
{ 369, new(1051798, EAetheryteLocation.KozamaukaDockPoga) },
}.AsReadOnly();
serviceCollection.AddSingleton<LeveUiController>();
serviceCollection.AddSingleton<ICombatModule, Mount128Module>();
+ serviceCollection.AddSingleton<ICombatModule, Mount147Module>();
serviceCollection.AddSingleton<ICombatModule, ItemUseModule>();
serviceCollection.AddSingleton<ICombatModule, BossModModule>();
serviceCollection.AddSingleton<ICombatModule, RotationSolverRebornModule>();