Files
coa-weakauras/WeakAuras/compat.lua
T
2022-01-01 20:26:30 +03:00

166 lines
4.1 KiB
Lua

local ipairs = ipairs
local pairs = pairs
local ceil, floor = math.ceil, math.floor
local GetInstanceInfo = GetInstanceInfo
local GetNumPartyMembers = GetNumPartyMembers
local GetNumRaidMembers = GetNumRaidMembers
function tInvert(tbl)
local inverted = {};
for k, v in pairs(tbl) do
inverted[v] = k;
end
return inverted;
end
function Round(value)
if value < 0 then
return ceil(value - .5);
end
return floor(value + .5);
end
function tIndexOf(tbl, item)
for i, v in ipairs(tbl) do
if item == v then
return i;
end
end
end
function IsInGroup()
return GetNumPartyMembers() > 0 or GetNumRaidMembers() > 0
end
function IsInRaid()
return GetNumRaidMembers() > 0
end
function GetNumSubgroupMembers()
return GetNumPartyMembers()
end
function GetNumGroupMembers()
return IsInRaid() and GetNumRaidMembers() or GetNumPartyMembers()
end
RAID_CLASS_COLORS.HUNTER.colorStr = "ffabd473"
RAID_CLASS_COLORS.WARLOCK.colorStr = "ff8788ee"
RAID_CLASS_COLORS.PRIEST.colorStr = "ffffffff"
RAID_CLASS_COLORS.PALADIN.colorStr = "fff58cba"
RAID_CLASS_COLORS.MAGE.colorStr = "ff3fc7eb"
RAID_CLASS_COLORS.ROGUE.colorStr = "fffff569"
RAID_CLASS_COLORS.DRUID.colorStr = "ffff7d0a"
RAID_CLASS_COLORS.SHAMAN.colorStr = "ff0070de"
RAID_CLASS_COLORS.WARRIOR.colorStr = "ffc79c6e"
RAID_CLASS_COLORS.DEATHKNIGHT.colorStr = "ffc41f3b"
if not SmoothStatusBarMixin then
function Lerp(startValue, endValue, amount)
return (1 - amount) * startValue + amount * endValue;
end
function Clamp(value, min, max)
if value > max then
return max;
elseif value < min then
return min;
end
return value;
end
function Saturate(value)
return Clamp(value, 0, 1);
end
local TARGET_FRAME_PER_SEC = 60;
function DeltaLerp(startValue, endValue, amount, timeSec)
return Lerp(startValue, endValue, Saturate(amount * timeSec * TARGET_FRAME_PER_SEC));
end
function FrameDeltaLerp(startValue, endValue, amount, elapsed)
return DeltaLerp(startValue, endValue, amount, elapsed);
end
local g_updatingBars = {};
local function IsCloseEnough(bar, newValue, targetValue)
local min, max = bar:GetMinMaxValues();
local range = max - min;
if range > 0 then
return math.abs((newValue - targetValue) / range) < .00001;
end
return true;
end
local function ProcessSmoothStatusBars(self, elapsed)
for bar, targetValue in pairs(g_updatingBars) do
local effectiveTargetValue = Clamp(targetValue, bar:GetMinMaxValues());
local newValue = FrameDeltaLerp(bar:GetValue(), effectiveTargetValue, .25, elapsed);
if IsCloseEnough(bar, newValue, effectiveTargetValue) then
g_updatingBars[bar] = nil;
bar:SetValue(effectiveTargetValue);
else
bar:SetValue(newValue);
end
end
end
CreateFrame("Frame"):SetScript("OnUpdate", ProcessSmoothStatusBars)
SmoothStatusBarMixin = {};
function SmoothStatusBarMixin:ResetSmoothedValue(value) --If nil, tries to set to the last target value
local targetValue = g_updatingBars[self];
if targetValue then
g_updatingBars[self] = nil;
self:SetValue(value or targetValue);
elseif value then
self:SetValue(value);
end
end
function SmoothStatusBarMixin:SetSmoothedValue(value)
g_updatingBars[self] = value;
end
function SmoothStatusBarMixin:SetMinMaxSmoothedValue(min, max)
self:SetMinMaxValues(min, max);
local targetValue = g_updatingBars[self];
if targetValue then
local ratio = 1;
if max ~= 0 and self.lastSmoothedMax and self.lastSmoothedMax ~= 0 then
ratio = max / self.lastSmoothedMax;
end
g_updatingBars[self] = targetValue * ratio;
end
self.lastSmoothedMin = min;
self.lastSmoothedMax = max;
end
end
do
local texture_mt = getmetatable(CreateFrame("Frame"):CreateTexture()).__index
local setDesaturated = texture_mt.SetDesaturated
texture_mt.SetDesaturated = function(self, desaturated, ...)
self._isDesaturated = desaturated
return setDesaturated(self, desaturated, ...)
end
local setTexture = texture_mt.SetTexture
texture_mt.SetTexture = function(self, ...)
local isDesaturated = self._isDesaturated
local apply = setTexture(self, ...)
self:SetDesaturated(isDesaturated)
return apply
end
end