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.
603 lines
19 KiB
603 lines
19 KiB
|
2 years ago
|
local huge = math.huge;
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
local VUHDO_CUSTOM_DEBUFF_CONFIG = { };
|
||
|
|
local VUHDO_UNIT_CUSTOM_DEBUFFS = { };
|
||
|
|
setmetatable(VUHDO_UNIT_CUSTOM_DEBUFFS, VUHDO_META_NEW_ARRAY);
|
||
|
|
local VUHDO_LAST_UNIT_DEBUFFS = { };
|
||
|
|
local VUHDO_PLAYER_ABILITIES = { };
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
local VUHDO_IGNORE_DEBUFFS_BY_CLASS = { };
|
||
|
|
local VUHDO_IGNORE_DEBUFF_NAMES = { };
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
local VUHDO_DEBUFF_TYPES = {
|
||
|
|
["Magic"] = VUHDO_DEBUFF_TYPE_MAGIC,
|
||
|
|
["Disease"] = VUHDO_DEBUFF_TYPE_DISEASE,
|
||
|
|
["Poison"] = VUHDO_DEBUFF_TYPE_POISON,
|
||
|
|
["Curse"] = VUHDO_DEBUFF_TYPE_CURSE
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
VUHDO_DEBUFF_BLACKLIST = {
|
||
|
|
[GetSpellInfo(69127)] = true, -- Chill of the Throne
|
||
|
|
[GetSpellInfo(57724)] = true, -- Sated (Bloodlust)
|
||
|
|
[GetSpellInfo(71328)] = true, -- Dungeon Cooldown
|
||
|
|
[GetSpellInfo(57723)] = true, -- Exhaustion (Heroism)
|
||
|
|
[GetSpellInfo(80354)] = true, -- Temporal Displacement (Time Warp)
|
||
|
|
[VUHDO_SPELL_ID.DEBUFF_FATIGUED] = true -- Fatigued (Primal Fury)
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
-- BURST CACHE ---------------------------------------------------
|
||
|
|
|
||
|
|
local VUHDO_CONFIG;
|
||
|
|
local VUHDO_RAID;
|
||
|
|
local VUHDO_PANEL_SETUP;
|
||
|
|
local VUHDO_DEBUFF_COLORS = { };
|
||
|
|
|
||
|
|
local VUHDO_shouldScanUnit;
|
||
|
|
local VUHDO_DEBUFF_BLACKLIST = { };
|
||
|
|
|
||
|
|
local UnitDebuff = UnitDebuff;
|
||
|
|
local UnitBuff = UnitBuff;
|
||
|
|
local UnitIsFriend = UnitIsFriend;
|
||
|
|
local table = table;
|
||
|
|
local GetTime = GetTime;
|
||
|
|
local PlaySoundFile = PlaySoundFile;
|
||
|
|
local InCombatLockdown = InCombatLockdown;
|
||
|
|
local twipe = table.wipe;
|
||
|
|
local pairs = pairs;
|
||
|
|
local _;
|
||
|
|
local tostring = tostring;
|
||
|
|
|
||
|
|
local sIsNotRemovableOnly;
|
||
|
|
local sIsNotRemovableOnlyIcons;
|
||
|
|
local sIsUseDebuffIcon;
|
||
|
|
local sIsUseDebuffIconBossOnly;
|
||
|
|
local sIsMiBuColorsInFight;
|
||
|
|
local sStdDebuffSound;
|
||
|
|
local sAllDebuffSettings;
|
||
|
|
local sIsShowOnlyForFriendly;
|
||
|
|
local sEmpty = { };
|
||
|
|
--local sColorArray = nil;
|
||
|
|
|
||
|
|
function VUHDO_debuffsInitLocalOverrides()
|
||
|
|
VUHDO_CONFIG = _G["VUHDO_CONFIG"];
|
||
|
|
VUHDO_RAID = _G["VUHDO_RAID"];
|
||
|
|
VUHDO_PANEL_SETUP = _G["VUHDO_PANEL_SETUP"];
|
||
|
|
VUHDO_DEBUFF_BLACKLIST = _G["VUHDO_DEBUFF_BLACKLIST"];
|
||
|
|
|
||
|
|
VUHDO_shouldScanUnit = _G["VUHDO_shouldScanUnit"];
|
||
|
|
|
||
|
|
sIsNotRemovableOnly = not VUHDO_CONFIG["DETECT_DEBUFFS_REMOVABLE_ONLY"];
|
||
|
|
sIsNotRemovableOnlyIcons = not VUHDO_CONFIG["DETECT_DEBUFFS_REMOVABLE_ONLY_ICONS"];
|
||
|
|
sIsUseDebuffIcon = VUHDO_PANEL_SETUP["BAR_COLORS"]["useDebuffIcon"];
|
||
|
|
sIsUseDebuffIconBossOnly = VUHDO_PANEL_SETUP["BAR_COLORS"]["useDebuffIconBossOnly"];
|
||
|
|
sIsMiBuColorsInFight = VUHDO_BUFF_SETTINGS["CONFIG"]["BAR_COLORS_IN_FIGHT"];
|
||
|
|
sStdDebuffSound = VUHDO_CONFIG["SOUND_DEBUFF"];
|
||
|
|
sAllDebuffSettings = VUHDO_CONFIG["CUSTOM_DEBUFF"]["STORED_SETTINGS"];
|
||
|
|
sIsShowOnlyForFriendly = VUHDO_CONFIG["CUSTOM_DEBUFF"]["isShowOnlyForFriendly"];
|
||
|
|
|
||
|
|
VUHDO_DEBUFF_COLORS = {
|
||
|
|
[1] = VUHDO_PANEL_SETUP["BAR_COLORS"]["DEBUFF1"],
|
||
|
|
[2] = VUHDO_PANEL_SETUP["BAR_COLORS"]["DEBUFF2"],
|
||
|
|
[3] = VUHDO_PANEL_SETUP["BAR_COLORS"]["DEBUFF3"],
|
||
|
|
[4] = VUHDO_PANEL_SETUP["BAR_COLORS"]["DEBUFF4"],
|
||
|
|
[6] = VUHDO_PANEL_SETUP["BAR_COLORS"]["DEBUFF6"],
|
||
|
|
};
|
||
|
|
|
||
|
|
--[[if not sColorArray then
|
||
|
|
sColorArray = { };
|
||
|
|
for tCnt = 1, 40 do
|
||
|
|
sColorArray[tCnt] = { };
|
||
|
|
end
|
||
|
|
end]]
|
||
|
|
end
|
||
|
|
|
||
|
|
----------------------------------------------------
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
local function VUHDO_copyColorTo(aSource, aDest)
|
||
|
|
aDest["R"], aDest["G"], aDest["B"] = aSource["R"], aSource["G"], aSource["B"];
|
||
|
|
aDest["TR"], aDest["TG"], aDest["TB"] = aSource["TR"], aSource["TG"], aSource["TB"];
|
||
|
|
aDest["O"], aDest["TO"] = aSource["O"], aSource["TO"];
|
||
|
|
aDest["useText"], aDest["useBackground"], aDest["useOpacity"] = aSource["useText"], aSource["useBackground"], aSource["useOpacity"];
|
||
|
|
return aDest;
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
local tSourceColor;
|
||
|
|
local tDebuffSettings;
|
||
|
|
local tDebuff;
|
||
|
|
local tColor = { };
|
||
|
|
local tEmpty = { };
|
||
|
|
function _VUHDO_getDebuffColor(anInfo)
|
||
|
|
|
||
|
|
if anInfo["charmed"] then
|
||
|
|
return VUHDO_PANEL_SETUP["BAR_COLORS"]["CHARMED"];
|
||
|
|
end
|
||
|
|
|
||
|
|
tDebuff = anInfo["debuff"];
|
||
|
|
|
||
|
|
if not anInfo["mibucateg"] and (tDebuff or 0) == 0 then -- VUHDO_DEBUFF_TYPE_NONE
|
||
|
|
return tEmpty;
|
||
|
|
end
|
||
|
|
|
||
|
|
if (tDebuff or 6) ~= 6 and VUHDO_DEBUFF_COLORS[tDebuff] then -- VUHDO_DEBUFF_TYPE_CUSTOM
|
||
|
|
return VUHDO_DEBUFF_COLORS[tDebuff];
|
||
|
|
end
|
||
|
|
|
||
|
|
tDebuffSettings = sAllDebuffSettings[anInfo["debuffName"]];
|
||
|
|
|
||
|
|
if tDebuff == 6 and tDebuffSettings ~= nil -- VUHDO_DEBUFF_TYPE_CUSTOM
|
||
|
|
and tDebuffSettings["isColor"] then
|
||
|
|
if tDebuffSettings["color"] ~= nil then
|
||
|
|
tSourceColor = tDebuffSettings["color"];
|
||
|
|
else
|
||
|
|
tSourceColor = VUHDO_DEBUFF_COLORS[6];
|
||
|
|
end
|
||
|
|
|
||
|
|
twipe(tColor);
|
||
|
|
|
||
|
|
if VUHDO_DEBUFF_COLORS[6]["useBackground"] then
|
||
|
|
tColor["R"], tColor["G"], tColor["B"], tColor["O"], tColor["useBackground"] = tSourceColor["R"], tSourceColor["G"], tSourceColor["B"], tSourceColor["O"], true;
|
||
|
|
end
|
||
|
|
|
||
|
|
if VUHDO_DEBUFF_COLORS[6]["useText"] then
|
||
|
|
tColor["TR"], tColor["TG"], tColor["TB"], tColor["TO"], tColor["useText"] = tSourceColor["TR"], tSourceColor["TG"], tSourceColor["TB"], tSourceColor["TO"], true;
|
||
|
|
end
|
||
|
|
|
||
|
|
return tColor;
|
||
|
|
end
|
||
|
|
|
||
|
|
if not anInfo["mibucateg"] or not VUHDO_BUFF_SETTINGS[anInfo["mibucateg"]] then return tEmpty; end
|
||
|
|
|
||
|
|
tSourceColor = VUHDO_BUFF_SETTINGS[anInfo["mibucateg"]]["missingColor"];
|
||
|
|
twipe(tColor);
|
||
|
|
if VUHDO_BUFF_SETTINGS["CONFIG"]["BAR_COLORS_TEXT"] then
|
||
|
|
tColor["useText"], tColor["TR"], tColor["TG"], tColor["TB"], tColor["TO"] = true, tSourceColor["TR"], tSourceColor["TG"], tSourceColor["TB"], tSourceColor["TO"];
|
||
|
|
end
|
||
|
|
|
||
|
|
if VUHDO_BUFF_SETTINGS["CONFIG"]["BAR_COLORS_BACKGROUND"] then
|
||
|
|
tColor["useBackground"], tColor["R"], tColor["G"], tColor["B"], tColor["O"] = true, tSourceColor["R"], tSourceColor["G"], tSourceColor["B"], tSourceColor["O"];
|
||
|
|
end
|
||
|
|
|
||
|
|
return tColor;
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
local tCopy = { };
|
||
|
|
function VUHDO_getDebuffColor(anInfo)
|
||
|
|
return VUHDO_copyColorTo(_VUHDO_getDebuffColor(anInfo), tCopy);
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
local tNextSoundTime = 0;
|
||
|
|
local function VUHDO_playDebuffSound(aSound, aDebuffName)
|
||
|
|
if (aSound or "") == "" or GetTime() < tNextSoundTime then
|
||
|
|
return;
|
||
|
|
end
|
||
|
|
|
||
|
|
local tSuccess = VUHDO_playSoundFile(aSound);
|
||
|
|
|
||
|
|
if tSuccess then
|
||
|
|
tNextSoundTime = GetTime() + 2;
|
||
|
|
else
|
||
|
|
if aDebuffName then
|
||
|
|
VUHDO_Msg(format(VUHDO_I18N_PLAY_SOUND_FILE_CUSTOM_DEBUFF_ERR, aSound, aDebuffName));
|
||
|
|
else
|
||
|
|
VUHDO_Msg(format(VUHDO_I18N_PLAY_SOUND_FILE_DEBUFF_ERR, aSound));
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
local tIconIndex = 0;
|
||
|
|
local tIconArray;
|
||
|
|
local tIconArrayDispenser = { };
|
||
|
|
local function VUHDO_getOrCreateIconArray(anIcon, aExpiry, aStacks, aDuration, anIsBuff, aSpellId, aCnt)
|
||
|
|
tIconIndex = tIconIndex + 1;
|
||
|
|
if #tIconArrayDispenser < tIconIndex then
|
||
|
|
tIconArray = { anIcon, aExpiry, aStacks, aDuration, anIsBuff, aSpellId, aCnt };
|
||
|
|
tIconArrayDispenser[tIconIndex] = tIconArray;
|
||
|
|
else
|
||
|
|
tIconArray = tIconArrayDispenser[tIconIndex];
|
||
|
|
tIconArray[1], tIconArray[2], tIconArray[3], tIconArray[4], tIconArray[5], tIconArray[6], tIconArray[7]
|
||
|
|
= anIcon, aExpiry, aStacks, aDuration, anIsBuff, aSpellId, aCnt;
|
||
|
|
end
|
||
|
|
|
||
|
|
return tIconArray;
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
function VUHDO_resetDebuffIconDispenser()
|
||
|
|
twipe(tIconArrayDispenser);
|
||
|
|
tIconIndex = 0;
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
local VUHDO_UNIT_DEBUFF_INFOS = { };
|
||
|
|
setmetatable(VUHDO_UNIT_DEBUFF_INFOS, {
|
||
|
|
__index = function(aTable, aKey)
|
||
|
|
local tValue = {
|
||
|
|
["CHOSEN"] = { [1] = nil, [2] = 0 },
|
||
|
|
[VUHDO_DEBUFF_TYPE_POISON] = { },
|
||
|
|
[VUHDO_DEBUFF_TYPE_DISEASE] = { },
|
||
|
|
[VUHDO_DEBUFF_TYPE_MAGIC] = { },
|
||
|
|
[VUHDO_DEBUFF_TYPE_CURSE] = { },
|
||
|
|
};
|
||
|
|
|
||
|
|
rawset(aTable, aKey, tValue);
|
||
|
|
return tValue;
|
||
|
|
end
|
||
|
|
});
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
local sCurChosenType;
|
||
|
|
local sCurChosenName;
|
||
|
|
local sCurChosenSpellId;
|
||
|
|
local sCurIsStandard;
|
||
|
|
local sCurIcons = { };
|
||
|
|
|
||
|
|
local tUnitDebuffInfo;
|
||
|
|
local function VUHDO_initDebuffInfos(aUnit)
|
||
|
|
tUnitDebuffInfo = VUHDO_UNIT_DEBUFF_INFOS[aUnit];
|
||
|
|
tUnitDebuffInfo[1][2] = nil; -- VUHDO_DEBUFF_TYPE_POISON
|
||
|
|
tUnitDebuffInfo[2][2] = nil; -- VUHDO_DEBUFF_TYPE_DISEASE
|
||
|
|
tUnitDebuffInfo[3][2] = nil; -- VUHDO_DEBUFF_TYPE_MAGIC
|
||
|
|
tUnitDebuffInfo[4][2] = nil; -- VUHDO_DEBUFF_TYPE_CURSE
|
||
|
|
|
||
|
|
sCurChosenType = VUHDO_DEBUFF_TYPE_NONE;
|
||
|
|
sCurChosenName = "";
|
||
|
|
sCurChosenSpellId = nil;
|
||
|
|
sCurIsStandard = false;
|
||
|
|
tIconIndex = 0;
|
||
|
|
twipe(sCurIcons);
|
||
|
|
|
||
|
|
return tUnitDebuffInfo;
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
local tInfo;
|
||
|
|
local tSound;
|
||
|
|
local tRemaining;
|
||
|
|
local tAbility;
|
||
|
|
local tSchool;
|
||
|
|
local tName, tIcon, tStacks, tTypeString, tDuration, tExpiry, tUnitCaster, tSpellId, tIsBossDebuff;
|
||
|
|
local tDebuffConfig;
|
||
|
|
local tIsRelevant;
|
||
|
|
local tNow;
|
||
|
|
local tUnitDebuffInfo;
|
||
|
|
local tType;
|
||
|
|
local tDebuffSettings;
|
||
|
|
local tCurChosenStoredName;
|
||
|
|
function VUHDO_determineDebuff(aUnit)
|
||
|
|
tInfo = (VUHDO_RAID or sEmpty)[aUnit];
|
||
|
|
|
||
|
|
if not tInfo then
|
||
|
|
return 0, ""; -- VUHDO_DEBUFF_TYPE_NONE
|
||
|
|
elseif VUHDO_CONFIG_SHOW_RAID then
|
||
|
|
return tInfo["debuff"], tInfo["debuffName"];
|
||
|
|
end
|
||
|
|
|
||
|
|
tUnitDebuffInfo = VUHDO_initDebuffInfos(aUnit);
|
||
|
|
|
||
|
|
if VUHDO_shouldScanUnit(aUnit) then
|
||
|
|
tNow = GetTime();
|
||
|
|
|
||
|
|
for tCnt = 1, huge do
|
||
|
|
tName, tIcon, tStacks, tTypeString, tDuration, tExpiry, tUnitCaster, _, _, tSpellId, _, tIsBossDebuff = UnitDebuff(aUnit, tCnt);
|
||
|
|
if not tIcon then
|
||
|
|
break;
|
||
|
|
end
|
||
|
|
|
||
|
|
if (tExpiry or 0) == 0 then tExpiry = (sCurIcons[tName] or sEmpty)[2] or tNow; end
|
||
|
|
|
||
|
|
-- Custom Debuff?
|
||
|
|
tDebuffConfig = VUHDO_CUSTOM_DEBUFF_CONFIG[tName] or VUHDO_CUSTOM_DEBUFF_CONFIG[tostring(tSpellId)] or sEmpty;
|
||
|
|
|
||
|
|
if tDebuffConfig[1] and ((tDebuffConfig[3] and tUnitCaster == "player") or (tDebuffConfig[4] and tUnitCaster ~= "player")) then -- Color?
|
||
|
|
sCurChosenType, sCurChosenName, sCurChosenSpellId = 6, tName, tSpellId; -- VUHDO_DEBUFF_TYPE_CUSTOM
|
||
|
|
end
|
||
|
|
|
||
|
|
tStacks = tStacks or 0;
|
||
|
|
|
||
|
|
if sCurIcons[tName] then
|
||
|
|
-- if we de-dupe a debuff by name then ensure it is tracked as another "stack"
|
||
|
|
-- oddly by default UnitAura returns a "stack" of 0 for un-stackable debuffs
|
||
|
|
-- in the common case (no de-dupe by name) we'll retain this default
|
||
|
|
if tStacks == 0 then
|
||
|
|
tStacks = 1;
|
||
|
|
end
|
||
|
|
|
||
|
|
if sCurIcons[tName][3] > 0 then
|
||
|
|
tStacks = tStacks + sCurIcons[tName][3];
|
||
|
|
else
|
||
|
|
tStacks = tStacks + 1;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if tDebuffConfig[2] and ((tDebuffConfig[3] and tUnitCaster == "player") or (tDebuffConfig[4] and tUnitCaster ~= "player")) then -- Icon?
|
||
|
|
sCurIcons[tName] = VUHDO_getOrCreateIconArray(tIcon, tExpiry, tStacks, tDuration, false, tSpellId, tCnt);
|
||
|
|
end
|
||
|
|
|
||
|
|
tType = VUHDO_DEBUFF_TYPES[tTypeString];
|
||
|
|
tAbility = VUHDO_PLAYER_ABILITIES[tType] and UnitIsFriend("player", aUnit);
|
||
|
|
tIsRelevant = not VUHDO_IGNORE_DEBUFF_NAMES[tName]
|
||
|
|
and not (VUHDO_IGNORE_DEBUFFS_BY_CLASS[tInfo["class"] or ""] or sEmpty)[tName];
|
||
|
|
|
||
|
|
if tType and tIsRelevant then
|
||
|
|
tSchool = tUnitDebuffInfo[tType];
|
||
|
|
tRemaining = floor(tExpiry - tNow);
|
||
|
|
if (tSchool[2] or 0) < tRemaining then
|
||
|
|
tSchool[1], tSchool[2], tSchool[3], tSchool[4] = tIcon, tRemaining, tStacks, tDuration;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if sCurChosenType ~= 6 -- VUHDO_DEBUFF_TYPE_CUSTOM
|
||
|
|
and not VUHDO_DEBUFF_BLACKLIST[tName]
|
||
|
|
and not VUHDO_DEBUFF_BLACKLIST[tostring(tSpellId)]
|
||
|
|
and tIsRelevant then
|
||
|
|
|
||
|
|
if sIsUseDebuffIcon and (tIsBossDebuff or not sIsUseDebuffIconBossOnly)
|
||
|
|
and (sIsNotRemovableOnlyIcons or tAbility ~= nil) then
|
||
|
|
|
||
|
|
sCurIcons[tName] = VUHDO_getOrCreateIconArray(tIcon, tExpiry, tStacks, tDuration, false, tSpellId, tCnt);
|
||
|
|
sCurIsStandard = true;
|
||
|
|
end
|
||
|
|
|
||
|
|
-- Entweder F�higkeit vorhanden ODER noch keiner gew�hlt UND auch nicht entfernbare
|
||
|
|
-- Either ability available OR none selected AND not removable (DETECT_DEBUFFS_REMOVABLE_ONLY)
|
||
|
|
if tType and (tAbility or (sCurChosenType == 0 and sIsNotRemovableOnly)) then -- VUHDO_DEBUFF_TYPE_NONE
|
||
|
|
sCurChosenType = tType;
|
||
|
|
tUnitDebuffInfo["CHOSEN"][1], tUnitDebuffInfo["CHOSEN"][2] = tIcon, tStacks;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
for tCnt = 1, huge do
|
||
|
|
tName, tIcon, tStacks, _, tDuration, tExpiry, tUnitCaster, _, _, tSpellId = UnitBuff(aUnit, tCnt);
|
||
|
|
if not tIcon then break; end
|
||
|
|
|
||
|
|
tDebuffConfig = VUHDO_CUSTOM_DEBUFF_CONFIG[tName] or VUHDO_CUSTOM_DEBUFF_CONFIG[tostring(tSpellId)] or sEmpty;
|
||
|
|
|
||
|
|
if tDebuffConfig[1] and ((tDebuffConfig[3] and tUnitCaster == "player") or (tDebuffConfig[4] and tUnitCaster ~= "player")) then -- Color?
|
||
|
|
sCurChosenType, sCurChosenName, sCurChosenSpellId = 6, tName, tSpellId; -- VUHDO_DEBUFF_TYPE_CUSTOM
|
||
|
|
end
|
||
|
|
|
||
|
|
if tDebuffConfig[2] and ((tDebuffConfig[3] and tUnitCaster == "player") or (tDebuffConfig[4] and tUnitCaster ~= "player")) then -- Icon?
|
||
|
|
sCurIcons[tName] = VUHDO_getOrCreateIconArray(tIcon, tExpiry, tStacks or 0, tDuration, true, tSpellId, tCnt);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
-- Gained new custom debuff?
|
||
|
|
-- note we only play sounds for debuff customs with isIcon set to true
|
||
|
|
for tName, tDebuffInfo in pairs(sCurIcons) do
|
||
|
|
|
||
|
|
if not VUHDO_UNIT_CUSTOM_DEBUFFS[aUnit][tName] then
|
||
|
|
if not sIsShowOnlyForFriendly or UnitIsFriend("player", aUnit) then
|
||
|
|
-- tExpiry, tStacks, tIcon
|
||
|
|
VUHDO_UNIT_CUSTOM_DEBUFFS[aUnit][tName] = { tDebuffInfo[2], tDebuffInfo[3], tDebuffInfo[1], tDebuffInfo[7] };
|
||
|
|
|
||
|
|
VUHDO_addDebuffIcon(aUnit, tDebuffInfo[1], tName, tDebuffInfo[2], tDebuffInfo[3], tDebuffInfo[4], tDebuffInfo[5], tDebuffInfo[6], tDebuffInfo[7]);
|
||
|
|
|
||
|
|
if not VUHDO_IS_CONFIG and VUHDO_MAY_DEBUFF_ANIM then
|
||
|
|
-- the key used to store the debuff settings is either the debuff name or spell ID
|
||
|
|
tDebuffSettings = sAllDebuffSettings[tName] or sAllDebuffSettings[tostring(tDebuffInfo[6])];
|
||
|
|
|
||
|
|
if tDebuffSettings then -- particular custom debuff sound?
|
||
|
|
VUHDO_playDebuffSound(tDebuffSettings["SOUND"], tName);
|
||
|
|
elseif VUHDO_CONFIG["CUSTOM_DEBUFF"]["SOUND"] then -- default custom debuff sound?
|
||
|
|
VUHDO_playDebuffSound(VUHDO_CONFIG["CUSTOM_DEBUFF"]["SOUND"], tName);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
VUHDO_updateBouquetsForEvent(aUnit, 29); -- VUHDO_UPDATE_CUSTOM_DEBUFF
|
||
|
|
end
|
||
|
|
-- update number of stacks?
|
||
|
|
elseif VUHDO_UNIT_CUSTOM_DEBUFFS[aUnit][tName][1] ~= tDebuffInfo[2]
|
||
|
|
or VUHDO_UNIT_CUSTOM_DEBUFFS[aUnit][tName][2] ~= tDebuffInfo[3]
|
||
|
|
or VUHDO_UNIT_CUSTOM_DEBUFFS[aUnit][tName][3] ~= tDebuffInfo[1]
|
||
|
|
or VUHDO_UNIT_CUSTOM_DEBUFFS[aUnit][tName][4] ~= tDebuffInfo[7] then
|
||
|
|
|
||
|
|
VUHDO_UNIT_CUSTOM_DEBUFFS[aUnit][tName][1] = tDebuffInfo[2];
|
||
|
|
VUHDO_UNIT_CUSTOM_DEBUFFS[aUnit][tName][2] = tDebuffInfo[3];
|
||
|
|
VUHDO_UNIT_CUSTOM_DEBUFFS[aUnit][tName][3] = tDebuffInfo[1];
|
||
|
|
VUHDO_UNIT_CUSTOM_DEBUFFS[aUnit][tName][4] = tDebuffInfo[7];
|
||
|
|
|
||
|
|
VUHDO_updateDebuffIcon(aUnit, tDebuffInfo[1], tName, tDebuffInfo[2], tDebuffInfo[3], tDebuffInfo[4], tDebuffInfo[5], tDebuffInfo[6], tDebuffInfo[7]);
|
||
|
|
|
||
|
|
VUHDO_updateBouquetsForEvent(aUnit, 29); -- VUHDO_UPDATE_CUSTOM_DEBUFF
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
-- Play standard debuff sound?
|
||
|
|
if sStdDebuffSound
|
||
|
|
and (sCurChosenType ~= VUHDO_DEBUFF_TYPE_NONE or sCurIsStandard)
|
||
|
|
and sCurChosenType ~= VUHDO_DEBUFF_TYPE_CUSTOM
|
||
|
|
and sCurChosenType ~= VUHDO_LAST_UNIT_DEBUFFS[aUnit]
|
||
|
|
and tInfo["range"] then
|
||
|
|
|
||
|
|
VUHDO_playDebuffSound(sStdDebuffSound);
|
||
|
|
VUHDO_LAST_UNIT_DEBUFFS[aUnit] = sCurChosenType;
|
||
|
|
end
|
||
|
|
end -- shouldScanUnit
|
||
|
|
|
||
|
|
-- Lost old custom debuff?
|
||
|
|
for tName, _ in pairs(VUHDO_UNIT_CUSTOM_DEBUFFS[aUnit]) do
|
||
|
|
if not sCurIcons[tName] then
|
||
|
|
twipe(VUHDO_UNIT_CUSTOM_DEBUFFS[aUnit][tName]);
|
||
|
|
VUHDO_UNIT_CUSTOM_DEBUFFS[aUnit][tName] = nil;
|
||
|
|
VUHDO_removeDebuffIcon(aUnit, tName);
|
||
|
|
VUHDO_updateBouquetsForEvent(aUnit, 29); -- VUHDO_UPDATE_CUSTOM_DEBUFF
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
if sCurChosenType == VUHDO_DEBUFF_TYPE_NONE and tInfo["missbuff"] and (sIsMiBuColorsInFight or not InCombatLockdown()) then
|
||
|
|
sCurChosenType = VUHDO_DEBUFF_TYPE_MISSING_BUFF;
|
||
|
|
end
|
||
|
|
|
||
|
|
-- we need to return the actual key that the debuff settings are stored under
|
||
|
|
-- this key is either the debuff name or the debuff spell ID
|
||
|
|
if sAllDebuffSettings[sCurChosenName] ~= nil then
|
||
|
|
tCurChosenStoredName = sCurChosenName;
|
||
|
|
elseif sAllDebuffSettings[tostring(sCurChosenSpellId)] ~= nil then
|
||
|
|
tCurChosenStoredName = tostring(sCurChosenSpellId);
|
||
|
|
end
|
||
|
|
|
||
|
|
return sCurChosenType, tCurChosenStoredName;
|
||
|
|
end
|
||
|
|
|
||
|
|
local VUHDO_determineDebuff = VUHDO_determineDebuff;
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
function VUHDO_updateAllCustomDebuffs(anIsEnableAnim)
|
||
|
|
twipe(VUHDO_UNIT_CUSTOM_DEBUFFS);
|
||
|
|
VUHDO_MAY_DEBUFF_ANIM = false;
|
||
|
|
for tUnit, tInfo in pairs(VUHDO_RAID) do
|
||
|
|
VUHDO_removeAllDebuffIcons(tUnit);
|
||
|
|
tInfo["debuff"], tInfo["debuffName"] = VUHDO_determineDebuff(tUnit);
|
||
|
|
end
|
||
|
|
VUHDO_MAY_DEBUFF_ANIM = anIsEnableAnim;
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
-- Remove debuffing abilities individually not known to the player
|
||
|
|
function VUHDO_initDebuffs()
|
||
|
|
local tAbility;
|
||
|
|
|
||
|
|
local _, tClass = UnitClass("player");
|
||
|
|
twipe(VUHDO_PLAYER_ABILITIES);
|
||
|
|
|
||
|
|
for tDebuffType, tAbilities in pairs(VUHDO_INIT_DEBUFF_ABILITIES[tClass] or sEmpty) do
|
||
|
|
for tCnt = 1, #tAbilities do
|
||
|
|
tAbility = tAbilities[tCnt];
|
||
|
|
-- VUHDO_Msg("check: " .. tAbility);
|
||
|
|
if VUHDO_isSpellKnown(tAbility) or tAbility == "*" then
|
||
|
|
VUHDO_PLAYER_ABILITIES[tDebuffType] = VUHDO_SPEC_TO_DEBUFF_ABIL[tAbility] or tAbility;
|
||
|
|
-- VUHDO_Msg("KEEP: Type " .. tDebuffType .. " because of spell " .. VUHDO_PLAYER_ABILITIES[tDebuffType]);
|
||
|
|
break;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
end
|
||
|
|
-- VUHDO_Msg("---");
|
||
|
|
|
||
|
|
if not VUHDO_CONFIG then VUHDO_CONFIG = _G["VUHDO_CONFIG"]; end
|
||
|
|
|
||
|
|
twipe(VUHDO_CUSTOM_DEBUFF_CONFIG);
|
||
|
|
|
||
|
|
for _, tDebuffName in pairs(VUHDO_CONFIG["CUSTOM_DEBUFF"]["STORED"]) do
|
||
|
|
if not VUHDO_CUSTOM_DEBUFF_CONFIG[tDebuffName] then
|
||
|
|
VUHDO_CUSTOM_DEBUFF_CONFIG[tDebuffName] = { };
|
||
|
|
end
|
||
|
|
|
||
|
|
VUHDO_CUSTOM_DEBUFF_CONFIG[tDebuffName][1] = VUHDO_CONFIG["CUSTOM_DEBUFF"]["STORED_SETTINGS"][tDebuffName]["isColor"];
|
||
|
|
VUHDO_CUSTOM_DEBUFF_CONFIG[tDebuffName][2] = VUHDO_CONFIG["CUSTOM_DEBUFF"]["STORED_SETTINGS"][tDebuffName]["isIcon"];
|
||
|
|
|
||
|
|
if VUHDO_CONFIG["CUSTOM_DEBUFF"]["STORED_SETTINGS"][tDebuffName]["isMine"] == nil then
|
||
|
|
VUHDO_CONFIG["CUSTOM_DEBUFF"]["STORED_SETTINGS"][tDebuffName]["isMine"] = true;
|
||
|
|
end
|
||
|
|
|
||
|
|
VUHDO_CUSTOM_DEBUFF_CONFIG[tDebuffName][3] = VUHDO_CONFIG["CUSTOM_DEBUFF"]["STORED_SETTINGS"][tDebuffName]["isMine"];
|
||
|
|
|
||
|
|
if VUHDO_CONFIG["CUSTOM_DEBUFF"]["STORED_SETTINGS"][tDebuffName]["isOthers"] == nil then
|
||
|
|
VUHDO_CONFIG["CUSTOM_DEBUFF"]["STORED_SETTINGS"][tDebuffName]["isOthers"] = true;
|
||
|
|
end
|
||
|
|
|
||
|
|
VUHDO_CUSTOM_DEBUFF_CONFIG[tDebuffName][4] = VUHDO_CONFIG["CUSTOM_DEBUFF"]["STORED_SETTINGS"][tDebuffName]["isOthers"];
|
||
|
|
end
|
||
|
|
|
||
|
|
for tDebuffName, _ in pairs(VUHDO_CUSTOM_DEBUFF_CONFIG) do
|
||
|
|
if not VUHDO_CONFIG["CUSTOM_DEBUFF"]["STORED_SETTINGS"][tDebuffName] then
|
||
|
|
VUHDO_CUSTOM_DEBUFF_CONFIG[tDebuffName] = nil;
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
twipe(VUHDO_IGNORE_DEBUFF_NAMES);
|
||
|
|
|
||
|
|
if VUHDO_CONFIG["DETECT_DEBUFFS_IGNORE_NO_HARM"] then
|
||
|
|
VUHDO_IGNORE_DEBUFFS_BY_CLASS = VUHDO_INIT_IGNORE_DEBUFFS_BY_CLASS;
|
||
|
|
VUHDO_tableAddAllKeys(VUHDO_IGNORE_DEBUFF_NAMES, VUHDO_INIT_IGNORE_DEBUFFS_NO_HARM);
|
||
|
|
else
|
||
|
|
VUHDO_IGNORE_DEBUFFS_BY_CLASS = sEmpty;
|
||
|
|
end
|
||
|
|
|
||
|
|
if VUHDO_CONFIG["DETECT_DEBUFFS_IGNORE_MOVEMENT"] then
|
||
|
|
VUHDO_tableAddAllKeys(VUHDO_IGNORE_DEBUFF_NAMES, VUHDO_INIT_IGNORE_DEBUFFS_MOVEMENT);
|
||
|
|
end
|
||
|
|
|
||
|
|
if VUHDO_CONFIG["DETECT_DEBUFFS_IGNORE_DURATION"] then
|
||
|
|
VUHDO_tableAddAllKeys(VUHDO_IGNORE_DEBUFF_NAMES, VUHDO_INIT_IGNORE_DEBUFFS_DURATION);
|
||
|
|
end
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
function VUHDO_getDebuffAbilities()
|
||
|
|
return VUHDO_PLAYER_ABILITIES;
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
function VUHDO_getUnitDebuffSchoolInfos(aUnit, aDebuffSchool)
|
||
|
|
return VUHDO_UNIT_DEBUFF_INFOS[aUnit][aDebuffSchool];
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
function VUHDO_getChosenDebuffInfo(aUnit)
|
||
|
|
return VUHDO_UNIT_DEBUFF_INFOS[aUnit]["CHOSEN"];
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
function VUHDO_resetDebuffsFor(aUnit)
|
||
|
|
VUHDO_initDebuffInfos(aUnit);
|
||
|
|
twipe(VUHDO_UNIT_CUSTOM_DEBUFFS[aUnit]);
|
||
|
|
end
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
--
|
||
|
|
function VUHDO_getUnitCustomDebuffs()
|
||
|
|
|
||
|
|
return VUHDO_UNIT_CUSTOM_DEBUFFS;
|
||
|
|
|
||
|
|
end
|
||
|
|
|