f37369cdda
Co-authored-by: Cursor <cursoragent@cursor.com>
77 lines
2.7 KiB
C#
77 lines
2.7 KiB
C#
using FFXIVClientStructs.FFXIV.Client.Game;
|
|
using System;
|
|
|
|
namespace HSUI.Helpers
|
|
{
|
|
internal class SpellHelper
|
|
{
|
|
#region Singleton
|
|
private static Lazy<SpellHelper> _lazyInstance = new Lazy<SpellHelper>(() => new SpellHelper());
|
|
|
|
public static SpellHelper Instance => _lazyInstance.Value;
|
|
|
|
~SpellHelper()
|
|
{
|
|
Dispose(false);
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
Dispose(true);
|
|
GC.SuppressFinalize(this);
|
|
}
|
|
|
|
protected void Dispose(bool disposing)
|
|
{
|
|
if (!disposing)
|
|
{
|
|
return;
|
|
}
|
|
|
|
_lazyInstance = new Lazy<SpellHelper>(() => new SpellHelper());
|
|
}
|
|
#endregion
|
|
|
|
private readonly unsafe ActionManager* _actionManager;
|
|
|
|
public unsafe SpellHelper()
|
|
{
|
|
_actionManager = ActionManager.Instance();
|
|
}
|
|
|
|
public unsafe uint GetSpellActionId(uint actionId) => _actionManager->GetAdjustedActionId(actionId);
|
|
|
|
public unsafe float GetRecastTimeElapsed(uint actionId) => _actionManager->GetRecastTimeElapsed(ActionType.Action, GetSpellActionId(actionId));
|
|
public unsafe float GetRealRecastTimeElapsed(uint actionId) => _actionManager->GetRecastTimeElapsed(ActionType.Action, actionId);
|
|
|
|
public unsafe float GetRecastTime(uint actionId) => _actionManager->GetRecastTime(ActionType.Action, GetSpellActionId(actionId));
|
|
public unsafe float GetRealRecastTime(uint actionId) => _actionManager->GetRecastTime(ActionType.Action, actionId);
|
|
|
|
public unsafe uint GetLastUsedActionId() => _actionManager->Combo.Action;
|
|
|
|
public float GetSpellCooldown(uint actionId) => Math.Abs(GetRecastTime(GetSpellActionId(actionId)) - GetRecastTimeElapsed(GetSpellActionId(actionId)));
|
|
public float GetRealSpellCooldown(uint actionId) => Math.Abs(GetRealRecastTime(actionId) - GetRealRecastTimeElapsed(actionId));
|
|
|
|
public int GetSpellCooldownInt(uint actionId)
|
|
{
|
|
int cooldown = (int)Math.Ceiling(GetSpellCooldown(actionId) % GetRecastTime(actionId));
|
|
return Math.Max(0, cooldown);
|
|
}
|
|
|
|
public int GetStackCount(int maxStacks, uint actionId)
|
|
{
|
|
int cooldown = GetSpellCooldownInt(actionId);
|
|
float recastTime = GetRecastTime(actionId);
|
|
|
|
if (cooldown <= 0 || recastTime == 0)
|
|
{
|
|
return maxStacks;
|
|
}
|
|
|
|
return maxStacks - (int)Math.Ceiling(cooldown / (recastTime / maxStacks));
|
|
}
|
|
|
|
public unsafe bool IsActionHighlighted(uint actionId, ActionType type = ActionType.Action) => _actionManager->IsActionHighlighted(type, actionId);
|
|
}
|
|
}
|