private static DateTime _coeElementTime;
private static Element _coeCurrentElement;
static CrusaderCombat()
{
Pulsator.OnPulse += (sender, args) => UpdateCoeTimer();
}
public static void UpdateCoeTimer()
{
if (CacheData.Buffs.ConventionElement == _coeCurrentElement) return;
_coeCurrentElement = CacheData.Buffs.ConventionElement;
_coeElementTime = DateTime.UtcNow;
}
public static int RemainingMsToElement(Element element, int offset = 0)
{
if (!Settings.Combat.Misc.UseConventionElementOnly || !Legendary.ConventionOfElements.IsEquipped) return 0;
var msSinceLastElementChange = DateTime.UtcNow.Subtract(_coeElementTime).TotalMilliseconds;
var elapsed = msSinceLastElementChange < 0 ? 0 : (int)msSinceLastElementChange;
var cycles = CrusaderCoERotation.IndexOf(element) -
CrusaderCoERotation.IndexOf(CacheData.Buffs.ConventionElement);
return (cycles > 0 ? cycles : 4 + cycles) * 4000 - elapsed + offset;
}
public static bool ShouldWaitForConventionofElements(Skill skill, Element element = Element.Unknown, int offset = 0)
{
if (!Settings.Combat.Misc.UseConventionElementOnly)
return false;
if (!Legendary.ConventionOfElements.IsEquipped)
return false;
var theElement = element == Element.Unknown ? skill.Element : element;
if (theElement == CacheData.Buffs.ConventionElement)
return false;
if (RemainingMsToElement(theElement, offset) <= 0)
return false;
return RemainingMsToElement(theElement, offset) < skill.Cooldown.TotalMilliseconds;
}