Add 'Ants in the Pants' Ananta quest
authorLiza Carvelli <liza@carvel.li>
Thu, 26 Dec 2024 14:26:41 +0000 (15:26 +0100)
committerLiza Carvelli <liza@carvel.li>
Thu, 26 Dec 2024 14:26:41 +0000 (15:26 +0100)
QuestPaths/4.x - Stormblood/Allied Societies/Ananta/Dailies/3061_Ants in the Pants.json
Questionable/Controller/CombatModules/Mount147Module.cs [new file with mode: 0644]
Questionable/Controller/Steps/Interactions/Combat.cs
Questionable/Controller/Steps/QuestCleanUp.cs
Questionable/Data/AlliedSocietyData.cs
Questionable/QuestionablePlugin.cs

index 48f32de4b72e2d462bcf2d426e9221d978708f4e..6592441bfbd2d0ea81305dbd5a3e281f25e958c4 100644 (file)
@@ -1,7 +1,6 @@
 {
   "$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
+        }
       ]
     },
     {
diff --git a/Questionable/Controller/CombatModules/Mount147Module.cs b/Questionable/Controller/CombatModules/Mount147Module.cs
new file mode 100644 (file)
index 0000000..f0c4317
--- /dev/null
@@ -0,0 +1,51 @@
+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;
+}
index f0b7ff15f6317a3fa20bd1c81414b7d82ab28bfc..c0a09a3af513ea698cafbc260a1acb491d06c4c8 100644 (file)
@@ -22,7 +22,8 @@ internal static class Combat
 
             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)
index d5564180b7acc7892d51bc95cbc4010361f10463..d9c7701f5e5bd7d4637fb211e1f23e56e0f4ab25 100644 (file)
@@ -38,7 +38,7 @@ internal static class QuestCleanUp
                 }
 
                 // 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;
index 0ac4db0722f87083730f6446fe8aea66bbb36bef..4d38853958209fe5a91675cb93e42ab0b91da9aa 100644 (file)
@@ -16,6 +16,7 @@ internal sealed class AlliedSocietyData
             { 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();
 
index 73af794f6d86a924b94942776ee8e89214095e75..6c89d5ad5d8f69c5a5b463c5fcdea96369359337 100644 (file)
@@ -246,6 +246,7 @@ public sealed class QuestionablePlugin : IDalamudPlugin
         serviceCollection.AddSingleton<LeveUiController>();
 
         serviceCollection.AddSingleton<ICombatModule, Mount128Module>();
+        serviceCollection.AddSingleton<ICombatModule, Mount147Module>();
         serviceCollection.AddSingleton<ICombatModule, ItemUseModule>();
         serviceCollection.AddSingleton<ICombatModule, BossModModule>();
         serviceCollection.AddSingleton<ICombatModule, RotationSolverRebornModule>();