Only use combat-starting items until in combat
authorLiza Carvelli <liza@carvel.li>
Fri, 26 Jul 2024 08:41:35 +0000 (10:41 +0200)
committerLiza Carvelli <liza@carvel.li>
Fri, 26 Jul 2024 08:41:35 +0000 (10:41 +0200)
Questionable/Controller/Steps/Interactions/Combat.cs
Questionable/Controller/Steps/Interactions/UseItem.cs

index a26272486fda985aac47f5ee16dcd3b03d3b7d79..1f3c9002021ea7c2d148ded272083fb1cd27a181 100644 (file)
@@ -47,7 +47,7 @@ internal static class Combat
                     ArgumentNullException.ThrowIfNull(step.ItemId);
 
                     yield return serviceProvider.GetRequiredService<UseItem.UseOnObject>()
-                        .With(step.DataId.Value, step.ItemId.Value);
+                        .With(step.DataId.Value, step.ItemId.Value, true);
                     yield return CreateTask(quest, sequence, step);
                     break;
                 }
index c0beee00eab88b15329d36c1b97d7b680a897957..f451c355587eeb4af13eb8bebfd6ddad079cda80 100644 (file)
@@ -2,6 +2,8 @@
 using System.Collections.Generic;
 using System.Globalization;
 using System.Numerics;
+using Dalamud.Game.ClientState.Conditions;
+using Dalamud.Plugin.Services;
 using FFXIVClientStructs.FFXIV.Client.Game;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.Logging;
@@ -88,13 +90,14 @@ internal static class UseItem
         }
     }
 
-    internal abstract class UseItemBase(ILogger logger) : ITask
+    internal abstract class UseItemBase(ICondition condition, ILogger logger) : ITask
     {
         private bool _usedItem;
         private DateTime _continueAt;
         private int _itemCount;
 
         public uint ItemId { get; set; }
+        public bool StartingCombat { get; set; }
 
         protected abstract bool UseItem();
 
@@ -118,6 +121,9 @@ internal static class UseItem
             if (DateTime.Now <= _continueAt)
                 return ETaskResult.StillRunning;
 
+            if (StartingCombat && condition[ConditionFlag.InCombat])
+                return ETaskResult.TaskComplete;
+
             if (ItemId == VesperBayAetheryteTicket && _usedItem)
             {
                 InventoryManager* inventoryManager = InventoryManager.Instance();
@@ -150,7 +156,8 @@ internal static class UseItem
     }
 
 
-    internal sealed class UseOnGround(GameFunctions gameFunctions, ILogger<UseOnGround> logger) : UseItemBase(logger)
+    internal sealed class UseOnGround(GameFunctions gameFunctions, ICondition condition, ILogger<UseOnGround> logger)
+        : UseItemBase(condition, logger)
     {
         public uint DataId { get; set; }
 
@@ -166,8 +173,11 @@ internal static class UseItem
         public override string ToString() => $"UseItem({ItemId} on ground at {DataId})";
     }
 
-    internal sealed class UseOnPosition(GameFunctions gameFunctions, ILogger<UseOnPosition> logger)
-        : UseItemBase(logger)
+    internal sealed class UseOnPosition(
+        GameFunctions gameFunctions,
+        ICondition condition,
+        ILogger<UseOnPosition> logger)
+        : UseItemBase(condition, logger)
     {
         public Vector3 Position { get; set; }
 
@@ -184,14 +194,16 @@ internal static class UseItem
             $"UseItem({ItemId} on ground at {Position.ToString("G", CultureInfo.InvariantCulture)})";
     }
 
-    internal sealed class UseOnObject(GameFunctions gameFunctions, ILogger<UseOnObject> logger) : UseItemBase(logger)
+    internal sealed class UseOnObject(GameFunctions gameFunctions, ICondition condition, ILogger<UseOnObject> logger)
+        : UseItemBase(condition, logger)
     {
         public uint DataId { get; set; }
 
-        public ITask With(uint dataId, uint itemId)
+        public ITask With(uint dataId, uint itemId, bool startingCombat = false)
         {
             DataId = dataId;
             ItemId = itemId;
+            StartingCombat = startingCombat;
             return this;
         }
 
@@ -200,7 +212,8 @@ internal static class UseItem
         public override string ToString() => $"UseItem({ItemId} on {DataId})";
     }
 
-    internal sealed class Use(GameFunctions gameFunctions, ILogger<Use> logger) : UseItemBase(logger)
+    internal sealed class Use(GameFunctions gameFunctions, ICondition condition, ILogger<Use> logger)
+        : UseItemBase(condition, logger)
     {
         public ITask With(uint itemId)
         {