f37369cdda
Co-authored-by: Cursor <cursoragent@cursor.com>
221 lines
6.6 KiB
C#
221 lines
6.6 KiB
C#
using HSUI.Helpers;
|
|
using HSUI.Interface.Party;
|
|
using Dalamud.Bindings.ImGui;
|
|
using Newtonsoft.Json;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace HSUI.Interface.PartyCooldowns
|
|
{
|
|
public enum PartyCooldownEnabled
|
|
{
|
|
PartyCooldownsAndPartyFrames = 0,
|
|
PartyCooldowns = 1,
|
|
PartyFrames = 2,
|
|
Disabled = 3
|
|
}
|
|
|
|
public class PartyCooldown
|
|
{
|
|
public readonly PartyCooldownData Data;
|
|
public readonly uint SourceId;
|
|
public readonly uint MemberLevel;
|
|
public readonly IPartyFramesMember? Member;
|
|
|
|
public double LastTimeUsed = 0;
|
|
public double OverridenCooldownStartTime = -1;
|
|
public bool IgnoreNextUse = false;
|
|
|
|
public PartyCooldown(PartyCooldownData data, uint sourceID, uint level, IPartyFramesMember? member)
|
|
{
|
|
Data = data;
|
|
SourceId = sourceID;
|
|
MemberLevel = level;
|
|
Member = member;
|
|
}
|
|
|
|
public float EffectTimeRemaining()
|
|
{
|
|
int duration = GetEffectDuration();
|
|
double timeSinceUse = ImGui.GetTime() - LastTimeUsed;
|
|
if (IgnoreNextUse || timeSinceUse > duration)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return duration - (float)timeSinceUse;
|
|
}
|
|
|
|
public float CooldownTimeRemaining()
|
|
{
|
|
float cooldown = GetCooldown();
|
|
double timeSinceUse = OverridenCooldownStartTime != -1 ? ImGui.GetTime() - OverridenCooldownStartTime : ImGui.GetTime() - LastTimeUsed;
|
|
|
|
if (timeSinceUse > cooldown)
|
|
{
|
|
OverridenCooldownStartTime = -1;
|
|
LastTimeUsed = 0;
|
|
return 0;
|
|
}
|
|
|
|
return cooldown - (float)timeSinceUse;
|
|
}
|
|
|
|
public int GetCooldown()
|
|
{
|
|
// special case for troubadour, shield samba and tactician
|
|
if (Data.ActionId == 7405 || Data.ActionId == 16012 || Data.ActionId == 16889)
|
|
{
|
|
return MemberLevel < 88 ? Data.CooldownDuration : 90;
|
|
}
|
|
// special case for swiftcast
|
|
else if (Data.ActionId == 7561)
|
|
{
|
|
return MemberLevel < 94 ? Data.CooldownDuration : 40;
|
|
}
|
|
|
|
return Data.CooldownDuration;
|
|
}
|
|
|
|
public int GetEffectDuration()
|
|
{
|
|
// special case for reprisal, feint and addle
|
|
if (MemberLevel < 98) { return Data.EffectDuration; }
|
|
if (Data.ActionId != 7535 && Data.ActionId != 7549 && Data.ActionId != 7560) { return Data.EffectDuration; }
|
|
|
|
return 15;
|
|
}
|
|
|
|
public string TooltipText()
|
|
{
|
|
int duration = GetEffectDuration();
|
|
string effectDuration = duration > 0 ? $"Duration: {duration}s \n" : "";
|
|
return $"{effectDuration}Recast Time: {GetCooldown()}s";
|
|
}
|
|
}
|
|
|
|
public class PartyCooldownData : IEquatable<PartyCooldownData>
|
|
{
|
|
public PartyCooldownEnabled EnabledV2 = PartyCooldownEnabled.PartyCooldownsAndPartyFrames;
|
|
|
|
public uint ActionId = 0;
|
|
public uint RequiredLevel = 0;
|
|
public uint DisabledAfterLevel = 0;
|
|
|
|
public uint JobId = 0; // keep this for backwards compatibility
|
|
public List<uint>? JobIds = null;
|
|
|
|
public JobRoles Role = JobRoles.Unknown; // keep this for backwards compatibility
|
|
public List<JobRoles>? Roles = null;
|
|
|
|
public HashSet<uint> ExcludedJobIds = new();
|
|
|
|
public int CooldownDuration = 0;
|
|
public int EffectDuration = 0;
|
|
|
|
public int Priority = 0;
|
|
public int Column = 1;
|
|
|
|
public List<uint> SharedActionIds = new();
|
|
|
|
[JsonIgnore] public uint IconId = 0;
|
|
[JsonIgnore] public string Name = "";
|
|
[JsonIgnore] public string? OverriddenCooldownText = null;
|
|
[JsonIgnore] public string? OverriddenDurationText = null;
|
|
|
|
public virtual bool IsUsableBy(uint jobId)
|
|
{
|
|
JobRoles roleForJob = JobsHelper.RoleForJob(jobId);
|
|
|
|
if (Roles != null)
|
|
{
|
|
foreach (JobRoles role in Roles)
|
|
{
|
|
if (role == roleForJob)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
if (Role != JobRoles.Unknown)
|
|
{
|
|
return Role == roleForJob;
|
|
}
|
|
|
|
if (JobIds != null)
|
|
{
|
|
foreach (uint id in JobIds)
|
|
{
|
|
if (id == jobId)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
|
|
return JobId == jobId;
|
|
}
|
|
|
|
public bool HasRole(JobRoles role)
|
|
{
|
|
if (Roles != null)
|
|
{
|
|
return Roles.Contains(role);
|
|
}
|
|
|
|
if (Role != JobRoles.Unknown)
|
|
{
|
|
return Role == role;
|
|
}
|
|
|
|
if (JobIds != null)
|
|
{
|
|
foreach (uint jobId in JobIds)
|
|
{
|
|
JobRoles roleForJob = JobsHelper.RoleForJob(jobId);
|
|
if (roleForJob == role)
|
|
{
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
return JobsHelper.RoleForJob(JobId) == role;
|
|
}
|
|
|
|
public bool IsEnabledForPartyCooldowns()
|
|
{
|
|
return EnabledV2 == PartyCooldownEnabled.PartyCooldownsAndPartyFrames ||
|
|
EnabledV2 == PartyCooldownEnabled.PartyCooldowns;
|
|
}
|
|
|
|
public bool IsEnabledForPartyFrames()
|
|
{
|
|
return EnabledV2 == PartyCooldownEnabled.PartyCooldownsAndPartyFrames ||
|
|
EnabledV2 == PartyCooldownEnabled.PartyFrames;
|
|
}
|
|
|
|
public bool Equals(PartyCooldownData? other)
|
|
{
|
|
if (other == null) { return false; }
|
|
|
|
return
|
|
ActionId == other.ActionId &&
|
|
RequiredLevel == other.RequiredLevel &&
|
|
DisabledAfterLevel == other.DisabledAfterLevel &&
|
|
JobId == other.JobId &&
|
|
(JobIds == null && other.JobIds == null || (JobIds != null && other.JobIds != null && JobIds.Equals(other.JobIds))) &&
|
|
Role == other.Role &&
|
|
(Roles == null && other.Roles == null || (Roles != null && other.Roles != null && Roles.Equals(other.Roles))) &&
|
|
CooldownDuration == other.CooldownDuration &&
|
|
EffectDuration == other.EffectDuration &&
|
|
SharedActionIds == other.SharedActionIds;
|
|
}
|
|
}
|
|
}
|