using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game;
using FFXIVClientStructs.FFXIV.Client.Game.Character;
+using FFXIVClientStructs.FFXIV.Client.UI.Agent;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Questionable.Functions;
internal sealed class ItemUseModule : ICombatModule
{
private readonly IServiceProvider _serviceProvider;
- private readonly GameFunctions _gameFunctions;
private readonly ICondition _condition;
private readonly ILogger<ItemUseModule> _logger;
private ICombatModule? _delegate;
private CombatController.CombatData? _combatData;
private bool _isDoingRotation;
+ private DateTime _continueAt;
- public ItemUseModule(IServiceProvider serviceProvider, GameFunctions gameFunctions, ICondition condition,
- ILogger<ItemUseModule> logger)
+ public ItemUseModule(IServiceProvider serviceProvider, ICondition condition, ILogger<ItemUseModule> logger)
{
_serviceProvider = serviceProvider;
- _gameFunctions = gameFunctions;
_condition = condition;
_logger = logger;
}
{
_combatData = combatData;
_isDoingRotation = true;
+ _continueAt = DateTime.Now;
return true;
}
_isDoingRotation = false;
_combatData = null;
_delegate = null;
+ _continueAt = DateTime.Now;
}
return true;
if (_delegate == null)
return;
+ if (_continueAt > DateTime.Now)
+ return;
+
if (_combatData?.CombatItemUse == null)
{
_delegate.Update(nextTarget);
{
_isDoingRotation = false;
_delegate.Stop();
+ return;
}
}
{
_isDoingRotation = false;
_delegate.Stop();
- _gameFunctions.UseItem(nextTarget.DataId, _combatData.CombatItemUse.ItemId);
+ unsafe
+ {
+ AgentInventoryContext.Instance()->UseItem(_combatData.CombatItemUse.ItemId);
+ }
+ _continueAt = DateTime.Now.AddSeconds(2);
}
else
_delegate.Update(nextTarget);
else if (_condition[ConditionFlag.Casting])
{
// do nothing
+ DateTime alternativeContinueAt = DateTime.Now.AddSeconds(0.5);
+ if (alternativeContinueAt > _continueAt)
+ _continueAt = alternativeContinueAt;
}
else
{
BattleChara* battleChara = (BattleChara*)gameObject.Address;
if (_combatData.CombatItemUse.Condition == ECombatItemUseCondition.Incapacitated)
return (battleChara->Flags2 & 128u) != 0;
+
+ if (_combatData.CombatItemUse.Condition == ECombatItemUseCondition.HealthPercent)
+ return (100f * battleChara->Health / battleChara->MaxHealth) < _combatData.CombatItemUse.Value;
}
return false;