You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
386 lines
12 KiB
386 lines
12 KiB
|
2 years ago
|
VUHDO_MAY_DEBUFF_ANIM = true;
|
||
|
|
|
||
|
|
local VUHDO_DEBUFF_ICONS = { };
|
||
|
|
local sIsName;
|
||
|
|
local sIsShowOnlyForFriendly;
|
||
|
|
|
||
|
|
-- BURST CACHE ---------------------------------------------------
|
||
|
|
|
||
|
|
local floor = floor;
|
||
|
|
local GetTime = GetTime;
|
||
|
|
local pairs = pairs;
|
||
|
|
local twipe = table.wipe;
|
||
|
|
local _;
|
||
|
|
local huge = math.huge;
|
||
|
|
|
||
|
|
local _G = getfenv();
|
||
|
|
|
||
|
|
local VUHDO_getUnitButtons;
|
||
|
|
local VUHDO_getUnitButtonsSafe;
|
||
|
|
local VUHDO_getBarIconTimer
|
||
|
|
local VUHDO_getBarIconCounter;
|
||
|
|
local VUHDO_getBarIconFrame;
|
||
|
|
local VUHDO_getBarIcon;
|
||
|
|
local VUHDO_getBarIconName;
|
||
|
|
local VUHDO_getShieldPerc;
|
||
|
|
|
||
|
|
local VUHDO_CONFIG;
|
||
|
|
local sCuDeStoredSettings;
|
||
|
|
local sMaxIcons;
|
||
|
|
local sStaticConfig;
|
||
|
|
|
||
|
|
local sEmpty = { };
|
||
|
|
|
||
|
|
function VUHDO_customDebuffIconsInitLocalOverrides()
|
||
|
|
-- functions
|
||
|
|
VUHDO_getUnitButtons = _G["VUHDO_getUnitButtons"];
|
||
|
|
VUHDO_getBarIconTimer = _G["VUHDO_getBarIconTimer"];
|
||
|
|
VUHDO_getBarIconCounter = _G["VUHDO_getBarIconCounter"];
|
||
|
|
VUHDO_getBarIconFrame = _G["VUHDO_getBarIconFrame"];
|
||
|
|
VUHDO_getBarIcon = _G["VUHDO_getBarIcon"];
|
||
|
|
VUHDO_getBarIconName = _G["VUHDO_getBarIconName"];
|
||
|
|
VUHDO_getShieldPerc = _G["VUHDO_getShieldPerc"];
|
||
|
|
VUHDO_getUnitButtonsSafe = _G["VUHDO_getUnitButtonsSafe"];
|
||
|
|
|
||
|
|
VUHDO_CONFIG = _G["VUHDO_CONFIG"];
|
||
|
|
sCuDeStoredSettings = VUHDO_CONFIG["CUSTOM_DEBUFF"]["STORED_SETTINGS"];
|
||
|
|
sMaxIcons = VUHDO_CONFIG["CUSTOM_DEBUFF"]["max_num"];
|
||
|
|
if (sMaxIcons < 1) then -- Damit das Bouquet item "Letzter Debuff" funktioniert
|
||
|
|
sMaxIcons = 1;
|
||
|
|
end
|
||
|
|
sIsName = VUHDO_CONFIG["CUSTOM_DEBUFF"]["isName"];
|
||
|
|
sIsShowOnlyForFriendly = VUHDO_CONFIG["CUSTOM_DEBUFF"]["isShowOnlyForFriendly"];
|
||
|
|
|
||
|
|
sStaticConfig = {
|
||
|
|
["isStaticConfig"] = true,
|
||
|
|
["animate"] = VUHDO_CONFIG["CUSTOM_DEBUFF"]["animate"],
|
||
|
|
["timer"] = VUHDO_CONFIG["CUSTOM_DEBUFF"]["timer"],
|
||
|
|
["isStacks"] = VUHDO_CONFIG["CUSTOM_DEBUFF"]["isStacks"],
|
||
|
|
["isAliveTime"] = false,
|
||
|
|
["isFullDuration"] = false,
|
||
|
|
["isMine"] = true,
|
||
|
|
["isOthers"] = true,
|
||
|
|
["isBarGlow"] = false,
|
||
|
|
["isIconGlow"] = false,
|
||
|
|
};
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
----------------------------------------------------
|
||
|
|
|
||
|
|
--
|
||
|
|
local tAliveTime;
|
||
|
|
local tRemain;
|
||
|
|
local tStacks;
|
||
|
|
local tCuDeStoConfig;
|
||
|
|
local tNameLabel;
|
||
|
|
local tTimeStamp;
|
||
|
|
local tShieldPerc;
|
||
|
|
local tName;
|
||
|
|
local tButton;
|
||
|
|
local tIsAnim;
|
||
|
|
local tIsBarGlow;
|
||
|
|
local tIsIconGlow;
|
||
|
|
local function VUHDO_animateDebuffIcon(aButton, anIconInfo, aNow, anIconIndex, anIsInit, aUnit)
|
||
|
|
|
||
|
|
tCuDeStoConfig = sCuDeStoredSettings[anIconInfo[3]] or sCuDeStoredSettings[tostring(anIconInfo[7])] or sStaticConfig;
|
||
|
|
|
||
|
|
if tCuDeStoConfig["isStaticConfig"] and
|
||
|
|
(VUHDO_DEBUFF_BLACKLIST[anIconInfo[3]] or VUHDO_DEBUFF_BLACKLIST[tostring(anIconInfo[7])]) then
|
||
|
|
VUHDO_removeDebuffIcon(aUnit, anIconInfo[3]);
|
||
|
|
|
||
|
|
return;
|
||
|
|
end
|
||
|
|
|
||
|
|
tIsAnim = tCuDeStoConfig["animate"] and VUHDO_MAY_DEBUFF_ANIM;
|
||
|
|
tIsBarGlow = tCuDeStoConfig["isBarGlow"];
|
||
|
|
tIsIconGlow = tCuDeStoConfig["isIconGlow"];
|
||
|
|
tTimeStamp = anIconInfo[2];
|
||
|
|
tAliveTime = anIsInit and 0 or aNow - tTimeStamp;
|
||
|
|
tName = anIconInfo[3];
|
||
|
|
|
||
|
|
if tCuDeStoConfig["timer"] then
|
||
|
|
if tCuDeStoConfig["isAliveTime"] then
|
||
|
|
VUHDO_getBarIconTimer(aButton, anIconIndex):SetText(tAliveTime < 99.5 and floor(tAliveTime + 0.5) or ">>");
|
||
|
|
else
|
||
|
|
tRemain = (anIconInfo[4] or aNow - 1) - aNow;
|
||
|
|
|
||
|
|
if tRemain >= 0 and (tRemain < 10 or tCuDeStoConfig["isFullDuration"]) then
|
||
|
|
VUHDO_getBarIconTimer(aButton, anIconIndex):SetText(tRemain > 100 and ">>" or floor(tRemain));
|
||
|
|
else
|
||
|
|
VUHDO_getBarIconTimer(aButton, anIconIndex):SetText("");
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
tShieldPerc = VUHDO_getShieldPerc(aUnit, tName);
|
||
|
|
tStacks = tShieldPerc ~= 0 and tShieldPerc or anIconInfo[5] or 0;
|
||
|
|
|
||
|
|
VUHDO_getBarIconCounter(aButton, anIconIndex):SetText((tCuDeStoConfig["isStacks"] and tStacks > 1) and tStacks or "");
|
||
|
|
|
||
|
|
if anIsInit then
|
||
|
|
VUHDO_getBarIcon(aButton, anIconIndex):SetTexture(anIconInfo[1]);
|
||
|
|
if sIsName then
|
||
|
|
tNameLabel = VUHDO_getBarIconName(aButton, anIconIndex);
|
||
|
|
tNameLabel:SetText(tName);
|
||
|
|
tNameLabel:SetAlpha(1);
|
||
|
|
end
|
||
|
|
VUHDO_getBarIconFrame(aButton, anIconIndex):SetAlpha(1);
|
||
|
|
|
||
|
|
if tIsAnim then VUHDO_setDebuffAnimation(1.2); end
|
||
|
|
|
||
|
|
if tIsBarGlow then
|
||
|
|
VUHDO_LibCustomGlow.PixelGlow_Start(
|
||
|
|
aButton,
|
||
|
|
tCuDeStoConfig["barGlowColor"] and {
|
||
|
|
tCuDeStoConfig["barGlowColor"]["R"],
|
||
|
|
tCuDeStoConfig["barGlowColor"]["G"],
|
||
|
|
tCuDeStoConfig["barGlowColor"]["B"],
|
||
|
|
tCuDeStoConfig["barGlowColor"]["O"]
|
||
|
|
} or {
|
||
|
|
VUHDO_PANEL_SETUP.BAR_COLORS["DEBUFF_BAR_GLOW"]["R"],
|
||
|
|
VUHDO_PANEL_SETUP.BAR_COLORS["DEBUFF_BAR_GLOW"]["R"],
|
||
|
|
VUHDO_PANEL_SETUP.BAR_COLORS["DEBUFF_BAR_GLOW"]["B"],
|
||
|
|
VUHDO_PANEL_SETUP.BAR_COLORS["DEBUFF_BAR_GLOW"]["O"]
|
||
|
|
},
|
||
|
|
14, -- number of particles
|
||
|
|
0.3, -- frequency
|
||
|
|
8, -- length
|
||
|
|
2, -- thickness
|
||
|
|
0, -- x offset
|
||
|
|
0, -- y offset
|
||
|
|
false, -- border
|
||
|
|
VUHDO_CUSTOM_GLOW_CUDE_FRAME_KEY
|
||
|
|
);
|
||
|
|
end
|
||
|
|
|
||
|
|
if tIsIconGlow then
|
||
|
|
VUHDO_LibCustomGlow.PixelGlow_Start(
|
||
|
|
VUHDO_getBarIconFrame(aButton, anIconIndex),
|
||
|
|
tCuDeStoConfig["iconGlowColor"] and {
|
||
|
|
tCuDeStoConfig["iconGlowColor"]["R"],
|
||
|
|
tCuDeStoConfig["iconGlowColor"]["G"],
|
||
|
|
tCuDeStoConfig["iconGlowColor"]["B"],
|
||
|
|
tCuDeStoConfig["iconGlowColor"]["O"]
|
||
|
|
} or {
|
||
|
|
VUHDO_PANEL_SETUP.BAR_COLORS["DEBUFF_ICON_GLOW"]["R"],
|
||
|
|
VUHDO_PANEL_SETUP.BAR_COLORS["DEBUFF_ICON_GLOW"]["R"],
|
||
|
|
VUHDO_PANEL_SETUP.BAR_COLORS["DEBUFF_ICON_GLOW"]["B"],
|
||
|
|
VUHDO_PANEL_SETUP.BAR_COLORS["DEBUFF_ICON_GLOW"]["O"]
|
||
|
|
},
|
||
|
|
8, -- number of particles
|
||
|
|
0.3, -- frequency
|
||
|
|
6, -- length
|
||
|
|
2, -- thickness
|
||
|
|
0, -- x offset
|
||
|
|
0, -- y offset
|
||
|
|
false, -- border
|
||
|
|
VUHDO_CUSTOM_GLOW_CUDE_ICON_KEY
|
||
|
|
);
|
||
|
|
end
|
||
|
|
elseif VUHDO_getBarIcon(aButton, anIconIndex):GetTexture() ~= anIconInfo[1] then
|
||
|
|
VUHDO_getBarIcon(aButton, anIconIndex):SetTexture(anIconInfo[1]);
|
||
|
|
VUHDO_getBarIconFrame(aButton, anIconIndex):SetAlpha(1);
|
||
|
|
|
||
|
|
VUHDO_updateHealthBarsFor(aUnit, VUHDO_UPDATE_RANGE);
|
||
|
|
end
|
||
|
|
|
||
|
|
if tIsAnim then
|
||
|
|
tButton = VUHDO_getBarIconButton(aButton, anIconIndex);
|
||
|
|
if tAliveTime <= 0.4 then tButton:SetScale(1 + tAliveTime * 2.5);
|
||
|
|
elseif tAliveTime <= 0.6 then -- Keep size
|
||
|
|
elseif tAliveTime <= 1.1 then tButton:SetScale(3.2 - 2 * tAliveTime);
|
||
|
|
else tButton:SetScale(1); end
|
||
|
|
else -- Falls Custom Debuff vorher Animation hatte und dieser nicht
|
||
|
|
VUHDO_getBarIconButton(aButton, anIconIndex):SetScale(1);
|
||
|
|
end
|
||
|
|
|
||
|
|
if sIsName and tAliveTime > 2 then
|
||
|
|
VUHDO_getBarIconName(aButton, anIconIndex):SetAlpha(0);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
local tNow;
|
||
|
|
function VUHDO_updateAllDebuffIcons(anIsFrequent)
|
||
|
|
tNow = GetTime();
|
||
|
|
|
||
|
|
for tUnit, tAllDebuffInfos in pairs(VUHDO_DEBUFF_ICONS) do
|
||
|
|
for tIndex, tDebuffInfo in pairs(tAllDebuffInfos) do
|
||
|
|
if not anIsFrequent or tDebuffInfo[2] + 1.21 >= tNow then
|
||
|
|
for _, tButton in pairs(VUHDO_getUnitButtonsSafe(tUnit)) do
|
||
|
|
VUHDO_animateDebuffIcon(tButton, tDebuffInfo, tNow, tIndex + 39, false, tUnit);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
-- 1 = icon, 2 = timestamp, 3 = name, 4 = expiration time, 5 = stacks, 6 = Duration, 7 = Start time
|
||
|
|
local tSlot;
|
||
|
|
local tOldest;
|
||
|
|
local tTimestamp;
|
||
|
|
local tFrame, tIconInfo;
|
||
|
|
function VUHDO_addDebuffIcon(aUnit, anIcon, aName, anExpiry, aStacks, aDuration, anIsBuff, aSpellId, aCnt)
|
||
|
|
if not VUHDO_DEBUFF_ICONS[aUnit] then
|
||
|
|
VUHDO_DEBUFF_ICONS[aUnit] = { };
|
||
|
|
end
|
||
|
|
|
||
|
|
tOldest = huge;
|
||
|
|
tSlot = 1;
|
||
|
|
for tCnt = 1, sMaxIcons do
|
||
|
|
if not VUHDO_DEBUFF_ICONS[aUnit][tCnt] then tSlot = tCnt; break;
|
||
|
|
else
|
||
|
|
tTimestamp = VUHDO_DEBUFF_ICONS[aUnit][tCnt][2];
|
||
|
|
if tTimestamp > 0 and tTimestamp < tOldest then
|
||
|
|
tOldest = tTimestamp;
|
||
|
|
tSlot = tCnt;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
tIconInfo = { anIcon, -1, aName, anExpiry, aStacks, aDuration, aSpellId };
|
||
|
|
VUHDO_DEBUFF_ICONS[aUnit][tSlot] = tIconInfo;
|
||
|
|
|
||
|
|
for _, tButton in pairs(VUHDO_getUnitButtonsSafe(aUnit)) do
|
||
|
|
VUHDO_animateDebuffIcon(tButton, tIconInfo, GetTime(), tSlot + 39, true, aUnit);
|
||
|
|
|
||
|
|
tFrame = VUHDO_getBarIconFrame(tButton, tSlot + 39);
|
||
|
|
tFrame["debuffInfo"], tFrame["debuffSpellId"], tFrame["isBuff"], tFrame["debuffCnt"] = aName, aSpellId, anIsBuff, aCnt;
|
||
|
|
end
|
||
|
|
tIconInfo[2] = GetTime();
|
||
|
|
|
||
|
|
VUHDO_updateHealthBarsFor(aUnit, VUHDO_UPDATE_RANGE);
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
local tIconInfo;
|
||
|
|
local tFound;
|
||
|
|
function VUHDO_updateDebuffIcon(aUnit, anIcon, aName, anExpiry, aStacks, aDuration, anIsBuff, aSpellId, aCnt)
|
||
|
|
|
||
|
|
if not VUHDO_DEBUFF_ICONS[aUnit] then
|
||
|
|
VUHDO_DEBUFF_ICONS[aUnit] = { };
|
||
|
|
end
|
||
|
|
|
||
|
|
tFound = false;
|
||
|
|
|
||
|
|
for tCnt = 1, sMaxIcons do
|
||
|
|
tIconInfo = VUHDO_DEBUFF_ICONS[aUnit][tCnt];
|
||
|
|
|
||
|
|
if tIconInfo and tIconInfo[3] == aName then
|
||
|
|
tFound = true;
|
||
|
|
|
||
|
|
tIconInfo[1], tIconInfo[3], tIconInfo[4], tIconInfo[5], tIconInfo[6], tIconInfo[7] = anIcon, aName, anExpiry, aStacks, aDuration, aSpellId;
|
||
|
|
|
||
|
|
for _, tButton in pairs(VUHDO_getUnitButtonsSafe(aUnit)) do
|
||
|
|
tFrame = VUHDO_getBarIconFrame(tButton, tCnt + 39);
|
||
|
|
tFrame["debuffInfo"], tFrame["debuffSpellId"], tFrame["isBuff"], tFrame["debuffCnt"] = aName, aSpellId, anIsBuff, aCnt;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if not tFound and (not sIsShowOnlyForFriendly or UnitIsFriend("player", aUnit)) then
|
||
|
|
VUHDO_addDebuffIcon(aUnit, anIcon, aName, anExpiry, aStacks, aDuration, anIsBuff, aSpellId, aCnt);
|
||
|
|
end
|
||
|
|
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
local tAllButtons2;
|
||
|
|
local tFrame;
|
||
|
|
function VUHDO_removeDebuffIcon(aUnit, aName)
|
||
|
|
tAllButtons2 = VUHDO_getUnitButtons(aUnit);
|
||
|
|
if not tAllButtons2 then return; end
|
||
|
|
|
||
|
|
for tCnt2 = 1, sMaxIcons do
|
||
|
|
if (VUHDO_DEBUFF_ICONS[aUnit][tCnt2] or sEmpty)[3] == aName then
|
||
|
|
VUHDO_DEBUFF_ICONS[aUnit][tCnt2][2] = 1; -- ~= -1, lock icon to not be processed by onupdate
|
||
|
|
for _, tButton2 in pairs(tAllButtons2) do
|
||
|
|
VUHDO_LibCustomGlow.PixelGlow_Stop(tButton2, VUHDO_CUSTOM_GLOW_CUDE_FRAME_KEY);
|
||
|
|
|
||
|
|
tFrame = VUHDO_getBarIconFrame(tButton2, tCnt2 + 39);
|
||
|
|
if tFrame then
|
||
|
|
VUHDO_LibCustomGlow.PixelGlow_Stop(tFrame, VUHDO_CUSTOM_GLOW_CUDE_ICON_KEY);
|
||
|
|
|
||
|
|
tFrame:SetAlpha(0);
|
||
|
|
|
||
|
|
tFrame["debuffInfo"] = nil;
|
||
|
|
tFrame["debuffSpellId"] = nil;
|
||
|
|
tFrame["isBuff"] = nil;
|
||
|
|
tFrame["debuffCnt"] = nil;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
twipe(VUHDO_DEBUFF_ICONS[aUnit][tCnt2]);
|
||
|
|
VUHDO_DEBUFF_ICONS[aUnit][tCnt2] = nil;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
local tAllButtons3;
|
||
|
|
local tFrame;
|
||
|
|
function VUHDO_removeAllDebuffIcons(aUnit)
|
||
|
|
tAllButtons3 = VUHDO_getUnitButtons(aUnit);
|
||
|
|
if not tAllButtons3 then return; end
|
||
|
|
|
||
|
|
for _, tButton3 in pairs(tAllButtons3) do
|
||
|
|
VUHDO_LibCustomGlow.PixelGlow_Stop(tButton3, VUHDO_CUSTOM_GLOW_CUDE_FRAME_KEY);
|
||
|
|
|
||
|
|
for tCnt3 = 40, 39 + sMaxIcons do
|
||
|
|
tFrame = VUHDO_getBarIconFrame(tButton3, tCnt3);
|
||
|
|
if tFrame then
|
||
|
|
VUHDO_LibCustomGlow.PixelGlow_Stop(tFrame, VUHDO_CUSTOM_GLOW_CUDE_ICON_KEY);
|
||
|
|
|
||
|
|
tFrame:SetAlpha(0);
|
||
|
|
|
||
|
|
tFrame["debuffInfo"] = nil;
|
||
|
|
tFrame["debuffSpellId"] = nil;
|
||
|
|
tFrame["isBuff"] = nil;
|
||
|
|
tFrame["debuffCnt"] = nil;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if VUHDO_DEBUFF_ICONS[aUnit] then twipe(VUHDO_DEBUFF_ICONS[aUnit]); end
|
||
|
|
VUHDO_updateBouquetsForEvent(aUnit, 29);
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
local tDebuffInfo;
|
||
|
|
local tCurrInfo;
|
||
|
|
function VUHDO_getLatestCustomDebuff(aUnit)
|
||
|
|
tDebuffInfo = sEmpty;
|
||
|
|
|
||
|
|
for tCnt = 1, sMaxIcons do
|
||
|
|
tCurrInfo = (VUHDO_DEBUFF_ICONS[aUnit] or sEmpty)[tCnt];
|
||
|
|
if tCurrInfo and tCurrInfo[2] > (tDebuffInfo[2] or 0) then
|
||
|
|
tDebuffInfo = tCurrInfo;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
return tDebuffInfo[1], tDebuffInfo[4], tDebuffInfo[5], tDebuffInfo[6];
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
function VUHDO_getDebuffIcons()
|
||
|
|
|
||
|
|
return VUHDO_DEBUFF_ICONS;
|
||
|
|
|
||
|
|
end
|
||
|
|
|