Commit c9db6482 authored by Ivaria's avatar Ivaria
Browse files

Added new special panel type for boss encounter unit frames. Listen to...

Added new special panel type for boss encounter unit frames.  Listen to UNIT_HEALTH_FREQUENT for more responsive health updates.
parent 27d06461
......@@ -33,6 +33,14 @@ local VUHDO_INTERNAL_TOGGLES = { };
local VUHDO_PANEL_UNITS = { };
setmetatable(VUHDO_PANEL_UNITS, VUHDO_META_NEW_ARRAY);
-- TODO: make local
VUHDO_BOSS_UNIT = { };
for i = 1, MAX_BOSS_FRAMES do
local bossUnitId = format("boss%d", i);
VUHDO_BOSS_UNIT[bossUnitId] = true;
end
VUHDO_PLAYER_CLASS = nil;
VUHDO_PLAYER_NAME = nil;
......@@ -163,7 +171,7 @@ local function VUHDO_updateAllRaidNames()
twipe(VUHDO_RAID_NAMES);
for tUnit, tInfo in pairs(VUHDO_RAID) do
if tUnit ~= "focus" and tUnit ~= "target" then
if not VUHDO_isSpecialUnit(tUnit) then
-- ensure not to overwrite a player name with a pet's identical name
if not VUHDO_RAID_NAMES[tInfo["name"]] or not tInfo["isPet"] then
VUHDO_RAID_NAMES[tInfo["name"]] = tUnit;
......@@ -220,7 +228,7 @@ local function VUHDO_sortEmergencies()
twipe(VUHDO_RAID_SORTED);
for tUnit, tInfo in pairs(VUHDO_RAID) do
if "target" ~= tUnit and "focus" ~= tUnit
if not VUHDO_isSpecialUnit(tUnit)
and VUHDO_getUnitHealthPercent(tInfo) < sTrigger and VUHDO_isValidEmergency(tInfo) then
VUHDO_RAID_SORTED[#VUHDO_RAID_SORTED + 1] = tUnit;
......@@ -290,8 +298,7 @@ function VUHDO_setHealth(aUnit, aMode)
tOwner = VUHDO_PET_2_OWNER[aUnit];
tIsPet = tOwner ~= nil;
if strfind(aUnit, tUnitId, 1, true) or tIsPet
or aUnit == "player" or aUnit == "focus" or aUnit == "target" then
if strfind(aUnit, tUnitId, 1, true) or tIsPet or aUnit == "player" or VUHDO_isSpecialUnit(aUnit) then
tIsDead = UnitIsDeadOrGhost(aUnit) and not UnitIsFeignDeath(aUnit);
if tIsDead then
......@@ -357,7 +364,7 @@ function VUHDO_setHealth(aUnit, aMode)
tInfo["mibucateg"] = nil;
tInfo["mibuvariants"] = nil;]]
if aUnit ~= "focus" and aUnit ~= "target" then
if not VUHDO_isSpecialUnit(aUnit) then
if not tIsPet and tInfo["fullName"] == tName and VUHDO_RAID_NAMES[tName] then
VUHDO_IS_SUSPICIOUS_ROSTER = true;
end
......@@ -417,7 +424,7 @@ end
local tOwner;
local tIsPet;
function VUHDO_updateHealth(aUnit, aMode)
tIsPet = VUHDO_RAID[aUnit]["isPet"];
tIsPet = VUHDO_RAID[aUnit] and VUHDO_RAID[aUnit]["isPet"];
if not tIsPet or VUHDO_INTERNAL_TOGGLES[26] then -- VUHDO_UPDATE_PETS -- Enthlt nur Pets als eigene Balken, vehicles werden ?ber owner dargestellt s.unten
VUHDO_setHealth(aUnit, aMode);
......@@ -490,7 +497,7 @@ end
--
local function VUHDO_removeUnitFromRaidGroups(aUnit)
for tModelId, tAllUnits in pairs(VUHDO_GROUPS) do
if tModelId ~= 41 and tModelId ~= 42 and tModelId ~= 43 then -- VUHDO_ID_MAINTANKS -- VUHDO_ID_PRIVATE_TANKS -- VUHDO_ID_MAIN_ASSISTS
if tModelId ~= 41 and tModelId ~= 42 and tModelId ~= 43 and tModelId ~= 44 then -- VUHDO_ID_MAINTANKS -- VUHDO_ID_PRIVATE_TANKS -- VUHDO_ID_MAIN_ASSISTS -- VUHDO_ID_BOSSES
for tIndex, tUnit in pairs(tAllUnits) do
if tUnit == aUnit then tremove(tAllUnits, tIndex); end
end
......@@ -509,6 +516,8 @@ local function VUHDO_removeSpecialFromAllRaidGroups()
VUHDO_removeUnitFromRaidGroups(tUnit); -- VUHDO_ID_PRIVATE_TANKS
elseif VUHDO_CONFIG["OMIT_MAIN_ASSIST"] and VUHDO_isModelConfigured(43) and VUHDO_isUnitInModelIterative(tUnit, 43) then -- VUHDO_ID_MAIN_ASSISTS
VUHDO_removeUnitFromRaidGroups(tUnit); -- VUHDO_ID_MAIN_ASSISTS
elseif VUHDO_isModelConfigured(44) and VUHDO_isUnitInModelIterative(tUnit, 44) then -- VUHDO_ID_BOSSES
VUHDO_removeUnitFromRaidGroups(tUnit); -- VUHDO_ID_BOSSES
end
end
end
......@@ -559,6 +568,15 @@ end
--
local function VUHDO_addUnitToBosses()
for bossUnitId, _ in pairs(VUHDO_BOSS_UNIT) do
VUHDO_tableUniqueAdd(VUHDO_GROUPS[44], bossUnitId); -- VUHDO_ID_BOSSES
end
end
--
local tVehicleInfo = { ["isVehicle"] = true };
local function VUHDO_addUnitToPets(aPetUnit)
......@@ -601,7 +619,7 @@ local function VUHDO_updateGroupArrays(anWasMacroRestore)
for tUnit, tInfo in pairs(VUHDO_RAID) do
if not tInfo["isPet"] then
if "focus" ~= tUnit and "target" ~= tUnit then
if not VUHDO_isSpecialUnit(tUnit) then
VUHDO_addUnitToGroup(tUnit, tInfo["group"]);
VUHDO_addUnitToClass(tUnit, tInfo["classId"]);
VUHDO_addUnitToVehicles(tUnit);
......@@ -618,10 +636,11 @@ local function VUHDO_updateGroupArrays(anWasMacroRestore)
VUHDO_addUnitToCtraMainTanks();
VUHDO_addUnitToPrivateTanks();
VUHDO_addUnitToBosses();
-- Need MTs for role estimation
for tUnit, tInfo in pairs(VUHDO_RAID) do
if "focus" ~= tUnit and "target" ~= tUnit and not tInfo["isPet"] then
if not VUHDO_isSpecialUnit(tUnit) and not tInfo["isPet"] then
VUHDO_addUnitToRole(tUnit);
end
end
......@@ -764,6 +783,23 @@ function VUHDO_reloadRaidMembers()
VUHDO_setHealthSafe("target", 1); -- VUHDO_UPDATE_ALL
end
for bossUnitId, _ in pairs(VUHDO_BOSS_UNIT) do
if UnitExists(bossUnitId) then
VUHDO_setHealth(bossUnitId, 1); -- VUHDO_UPDATE_ALL
else
-- FIXME: find a more efficient way to trigger boss removal
VUHDO_removeHots(bossUnitId);
VUHDO_resetDebuffsFor(bossUnitId);
VUHDO_removeAllDebuffIcons(bossUnitId);
VUHDO_updateTargetBars(bossUnitId);
table.wipe(VUHDO_RAID[bossUnitId] or tEmptyInfo);
VUHDO_RAID[bossUnitId] = nil;
VUHDO_updateHealthBarsFor(bossUnitId, 1); -- VUHDO_UPDATE_ALL
VUHDO_initEventBouquetsFor(bossUnitId);
end
end
VUHDO_TIMERS["MIRROR_TO_MACRO"] = 8;
end
......@@ -839,6 +875,33 @@ function VUHDO_refreshRaidMembers()
VUHDO_setHealthSafe("target", 1); -- VUHDO_UPDATE_ALL
end
for bossUnitId, _ in pairs(VUHDO_BOSS_UNIT) do
if UnitExists(bossUnitId) then -- and UnitIsFriend("player", bossUnitId) then
tInfo = VUHDO_RAID[bossUnitId];
if not tInfo or VUHDO_RAID_GUIDS[UnitGUID(bossUnitId)] ~= bossUnitId then
VUHDO_setHealth(bossUnitId, 1); -- VUHDO_UPDATE_ALL
else
tInfo["group"] = VUHDO_getUnitGroup(bossUnitId, false);
tInfo["isVehicle"] = UnitHasVehicleUI(bossUnitId);
tInfo["afk"] = false;
tInfo["connected"] = true;
end
else
-- FIXME: find a more efficient way to trigger boss removal
VUHDO_removeHots(bossUnitId);
VUHDO_resetDebuffsFor(bossUnitId);
VUHDO_removeAllDebuffIcons(bossUnitId);
VUHDO_updateTargetBars(bossUnitId);
table.wipe(VUHDO_RAID[bossUnitId] or tEmptyInfo);
VUHDO_RAID[bossUnitId] = nil;
VUHDO_updateHealthBarsFor(bossUnitId, 1); -- VUHDO_UPDATE_ALL
VUHDO_initEventBouquetsFor(bossUnitId);
end
end
VUHDO_PLAYER_GROUP = VUHDO_getUnitGroup(VUHDO_PLAYER_RAID_ID, false);
VUHDO_updateAllRaidNames();
......
......@@ -352,6 +352,7 @@ function VUHDO_customizeText(aButton, aMode, anIsTarget)
VUHDO_getBarText(tHealthBar):SetText(
"focus" == tUnit and VUHDO_I18N_NO_FOCUS
or "target" == tUnit and VUHDO_I18N_NO_TARGET
or VUHDO_isBossUnit(tUnit) and VUHDO_I18N_NO_BOSS
or VUHDO_I18N_NOT_AVAILABLE);
VUHDO_getLifeText(tHealthBar):SetText("");
......@@ -359,8 +360,8 @@ function VUHDO_customizeText(aButton, aMode, anIsTarget)
end
tPanelNum = VUHDO_BUTTON_CACHE[aButton];
tSetup = VUHDO_PANEL_SETUP[tPanelNum];
tLifeConfig = tSetup["LIFE_TEXT"];
tSetup = VUHDO_PANEL_SETUP[tPanelNum];
tLifeConfig = tSetup["LIFE_TEXT"];
tIsHideIrrel = tLifeConfig["hideIrrelevant"] and VUHDO_getUnitHealthPercent(tInfo) >= VUHDO_CONFIG["EMERGENCY_TRIGGER"];
tIsShowLife = tLifeConfig["show"] and not tIsHideIrrel;
......@@ -677,9 +678,16 @@ function VUHDO_updateHealthBarsFor(aUnit, anUpdateMode)
tInfo = VUHDO_RAID[aUnit];
for _, tButton in pairs(tAllButtons) do
VUHDO_customizeText(tButton, 2, false); -- VUHDO_UPDATE_HEALTH
VUHDO_customizeDamageFlash(tButton, tInfo);
if tInfo then
VUHDO_customizeDamageFlash(tButton, tInfo);
end
end
if tInfo then
tInfo["lifeLossPerc"] = nil;
end
tInfo["lifeLossPerc"] = nil;
VUHDO_updateIncHeal(aUnit);
elseif 9 == anUpdateMode then -- VUHDO_UPDATE_INC
......
......@@ -53,6 +53,7 @@ VUHDO_ID_PETS = 40;
VUHDO_ID_MAINTANKS = 41;
VUHDO_ID_PRIVATE_TANKS = 42;
VUHDO_ID_MAIN_ASSISTS = 43;
VUHDO_ID_BOSSES = 44;
VUHDO_ID_MELEE = 50;
VUHDO_ID_RANGED = 51;
......@@ -121,6 +122,7 @@ VUHDO_ID_TYPE_MEMBERS = {
VUHDO_ID_PRIVATE_TANKS,
VUHDO_ID_PETS,
VUHDO_ID_VEHICLES,
VUHDO_ID_BOSSES,
VUHDO_ID_MELEE,
VUHDO_ID_RANGED,
VUHDO_ID_MELEE_TANK,
......
......@@ -112,7 +112,8 @@ end
local VUHDO_DEFAULT_MODELS = {
{ VUHDO_ID_GROUP_1, VUHDO_ID_GROUP_2, VUHDO_ID_GROUP_3, VUHDO_ID_GROUP_4, VUHDO_ID_GROUP_5, VUHDO_ID_GROUP_6, VUHDO_ID_GROUP_7, VUHDO_ID_GROUP_8 },
{ VUHDO_ID_PETS },
{ VUHDO_ID_PRIVATE_TANKS, VUHDO_ID_MAINTANKS },
{ VUHDO_ID_PRIVATE_TANKS, VUHDO_ID_MAINTANKS },
{ VUHDO_ID_BOSSES },
};
......
......@@ -423,6 +423,13 @@ function VUHDO_OnEvent(_, anEvent, anArg1, anArg2, anArg3, anArg4, anArg5, anArg
elseif "UNIT_HEALTH" == anEvent then
if (VUHDO_RAID or tEmptyRaid)[anArg1] then VUHDO_updateHealth(anArg1, 2); end -- VUHDO_UPDATE_HEALTH
-- TODO: is it ok to listen to both UNIT_HEALTH and UNIT_HEALTH_FREQUENT?
-- TODO: add options based on desired responsiveness and performance
elseif "UNIT_HEALTH_FREQUENT" == anEvent then
if (VUHDO_RAID or tEmptyRaid)[anArg1] or VUHDO_isBossUnit(anArg1) then
VUHDO_updateHealth(anArg1, 2);
end
elseif "UNIT_HEAL_PREDICTION" == anEvent then
if (VUHDO_RAID or tEmptyRaid)[anArg1] then -- auch target, focus
VUHDO_updateHealth(anArg1, 9); -- VUHDO_UPDATE_INC
......@@ -499,7 +506,9 @@ function VUHDO_OnEvent(_, anEvent, anArg1, anArg2, anArg3, anArg4, anArg5, anArg
elseif "RAID_TARGET_UPDATE" == anEvent then
VUHDO_TIMERS["CUSTOMIZE"] = 0.1;
elseif "GROUP_ROSTER_UPDATE" == anEvent then
-- INSTANCE_ENCOUNTER_ENGAGE_UNIT fires when a boss unit is added to the UI
-- this is essentially the equivalent of GROUP_ROSTER_UPDATE for bosses/NPCs
elseif "GROUP_ROSTER_UPDATE" == anEvent or "INSTANCE_ENCOUNTER_ENGAGE_UNIT" == anEvent then
--VUHDO_CURR_LAYOUT = VUHDO_SPEC_LAYOUTS["selected"];
--VUHDO_CURRENT_PROFILE = VUHDO_CONFIG["CURRENT_PROFILE"];
......@@ -982,18 +991,14 @@ local function VUHDO_updateAllRange()
-- Check if unit is in range
if sIsRangeKnown then
tIsInRange
= tInfo["connected"]
and (1 == IsSpellInRange(sRangeSpell, tUnit)
or ((tInfo["dead"] or tInfo["charmed"]) and tInfo["baseRange"])
or "player" == tUnit
or ((tUnit == "focus" or tUnit == "target") and CheckInteractDistance(tUnit, 1)));
tIsInRange = tInfo["connected"] and
(1 == IsSpellInRange(sRangeSpell, tUnit) or
((tInfo["dead"] or tInfo["charmed"]) and tInfo["baseRange"]) or "player" == tUnit or
(VUHDO_isSpecialUnit(tUnit) and CheckInteractDistance(tUnit, 1)));
else
tIsInRange
= tInfo["connected"]
and (tInfo["baseRange"]
or ((tUnit == "focus" or tUnit == "target")
and CheckInteractDistance(tUnit, 1)));
tIsInRange = tInfo["connected"] and
(tInfo["baseRange"] or
(VUHDO_isSpecialUnit(tUnit) and CheckInteractDistance(tUnit, 1)));
end
if tInfo["range"] ~= tIsInRange then
......@@ -1373,11 +1378,11 @@ end
local VUHDO_ALL_EVENTS = {
"VARIABLES_LOADED", "PLAYER_ENTERING_WORLD",
"UNIT_HEALTH", "UNIT_MAXHEALTH",
"VARIABLES_LOADED", "PLAYER_ENTERING_WORLD",
"UNIT_HEALTH", "UNIT_HEALTH_FREQUENT", "UNIT_MAXHEALTH",
"UNIT_AURA",
"UNIT_TARGET",
"GROUP_ROSTER_UPDATE",
"GROUP_ROSTER_UPDATE", "INSTANCE_ENCOUNTER_ENGAGE_UNIT",
"UNIT_PET",
"UNIT_ENTERED_VEHICLE", "UNIT_EXITED_VEHICLE", "UNIT_EXITING_VEHICLE",
"CHAT_MSG_ADDON",
......
......@@ -33,6 +33,7 @@ VUHDO_HEADER_TEXTS = {
[VUHDO_ID_MAINTANKS] = VUHDO_I18N_MAINTANKS,
[VUHDO_ID_MAIN_ASSISTS] = VUHDO_I18N_MAIN_ASSISTS,
[VUHDO_ID_PRIVATE_TANKS] = VUHDO_I18N_PRIVATE_TANKS,
[VUHDO_ID_BOSSES] = VUHDO_I18N_BOSSES,
[VUHDO_ID_MELEE] = VUHDO_I18N_MELEES,
[VUHDO_ID_RANGED] = VUHDO_I18N_RANGED,
......
......@@ -410,7 +410,13 @@ VUHDO_I18N_BOUQUET_PALADIN_TANK = "Flag: Role Tank, Paladin";
VUHDO_I18N_BOUQUET_DK_TANK = "Flag: Role Tank, Death Knight";
VUHDO_I18N_BOUQUET_MONK_TANK = "Flag: Role Tank, Monk";
VUHDO_I18N_BOUQUET_DRUID_TANK = "Flag: Role Tank, Druid";
-- 3.66
VUHDO_I18N_BOUQUET_PALADIN_BEACON = "Paladin Beacon";
VUHDO_I18N_BOUQUET_STATUS_EXCESS_ABSORB = "Statusbar: Excess Absorption %";
VUHDO_I18N_BOUQUET_STATUS_TOTAL_ABSORB = "Statusbar: Total Absorption %";
-- 3.67
VUHDO_I18N_NO_BOSS = "[no NPC]";
VUHDO_I18N_BOSSES = "NPCs";
......@@ -419,7 +419,13 @@ VUHDO_I18N_BOUQUET_PALADIN_TANK = "Flag: Role Tank, Paladin";
VUHDO_I18N_BOUQUET_DK_TANK = "Flag: Role Tank, Death Knight";
VUHDO_I18N_BOUQUET_MONK_TANK = "Flag: Role Tank, Monk";
VUHDO_I18N_BOUQUET_DRUID_TANK = "Flag: Role Tank, Druid";
-- 3.66
VUHDO_I18N_BOUQUET_PALADIN_BEACON = "Paladin Beacon";
VUHDO_I18N_BOUQUET_STATUS_EXCESS_ABSORB = "Statusbar: Excess Absorption %";
VUHDO_I18N_BOUQUET_STATUS_TOTAL_ABSORB = "Statusbar: Total Absorption %";
-- 3.67
VUHDO_I18N_NO_BOSS = "[no NPC]";
VUHDO_I18N_BOSSES = "NPCs";
......@@ -420,7 +420,13 @@ VUHDO_I18N_BOUQUET_PALADIN_TANK = "Flag: Role Tank, Paladin";
VUHDO_I18N_BOUQUET_DK_TANK = "Flag: Role Tank, Death Knight";
VUHDO_I18N_BOUQUET_MONK_TANK = "Flag: Role Tank, Monk";
VUHDO_I18N_BOUQUET_DRUID_TANK = "Flag: Role Tank, Druid";
-- 3.66
VUHDO_I18N_BOUQUET_PALADIN_BEACON = "Paladin Beacon";
VUHDO_I18N_BOUQUET_STATUS_EXCESS_ABSORB = "Statusbar: Excess Absorption %";
VUHDO_I18N_BOUQUET_STATUS_TOTAL_ABSORB = "Statusbar: Total Absorption %";
-- 3.67
VUHDO_I18N_NO_BOSS = "[no NPC]";
VUHDO_I18N_BOSSES = "NPCs";
......@@ -418,7 +418,13 @@ VUHDO_I18N_BOUQUET_PALADIN_TANK = "Flag: Role Tank, Paladin";
VUHDO_I18N_BOUQUET_DK_TANK = "Flag: Role Tank, Death Knight";
VUHDO_I18N_BOUQUET_MONK_TANK = "Flag: Role Tank, Monk";
VUHDO_I18N_BOUQUET_DRUID_TANK = "Flag: Role Tank, Druid";
-- 3.66
VUHDO_I18N_BOUQUET_PALADIN_BEACON = "Paladin Beacon";
VUHDO_I18N_BOUQUET_STATUS_EXCESS_ABSORB = "Statusbar: Excess Absorption %";
VUHDO_I18N_BOUQUET_STATUS_TOTAL_ABSORB = "Statusbar: Total Absorption %";
-- 3.67
VUHDO_I18N_NO_BOSS = "[no NPC]";
VUHDO_I18N_BOSSES = "NPCs";
......@@ -484,7 +484,13 @@ VUHDO_I18N_BOUQUET_PALADIN_TANK = "Flag: Role Tank, Paladin";
VUHDO_I18N_BOUQUET_DK_TANK = "Flag: Role Tank, Death Knight";
VUHDO_I18N_BOUQUET_MONK_TANK = "Flag: Role Tank, Monk";
VUHDO_I18N_BOUQUET_DRUID_TANK = "Flag: Role Tank, Druid";
-- 3.66
VUHDO_I18N_BOUQUET_PALADIN_BEACON = "Paladin Beacon";
VUHDO_I18N_BOUQUET_STATUS_EXCESS_ABSORB = "Statusbar: Excess Absorption %";
VUHDO_I18N_BOUQUET_STATUS_TOTAL_ABSORB = "Statusbar: Total Absorption %";
-- 3.67
VUHDO_I18N_NO_BOSS = "[no NPC]";
VUHDO_I18N_BOSSES = "NPCs";
......@@ -412,7 +412,13 @@ VUHDO_I18N_BOUQUET_PALADIN_TANK = "Flag: Role Tank, Paladin";
VUHDO_I18N_BOUQUET_DK_TANK = "Flag: Role Tank, Death Knight";
VUHDO_I18N_BOUQUET_MONK_TANK = "Flag: Role Tank, Monk";
VUHDO_I18N_BOUQUET_DRUID_TANK = "Flag: Role Tank, Druid";
-- 3.66
VUHDO_I18N_BOUQUET_PALADIN_BEACON = "Paladin Beacon";
VUHDO_I18N_BOUQUET_STATUS_EXCESS_ABSORB = "Statusbar: Excess Absorption %";
VUHDO_I18N_BOUQUET_STATUS_TOTAL_ABSORB = "Statusbar: Total Absorption %";
-- 3.67
VUHDO_I18N_NO_BOSS = "[no NPC]";
VUHDO_I18N_BOSSES = "NPCs";
......@@ -412,7 +412,13 @@ VUHDO_I18N_BOUQUET_PALADIN_TANK = "Flag: Role Tank, Paladin";
VUHDO_I18N_BOUQUET_DK_TANK = "Flag: Role Tank, Death Knight";
VUHDO_I18N_BOUQUET_MONK_TANK = "Flag: Role Tank, Monk";
VUHDO_I18N_BOUQUET_DRUID_TANK = "Flag: Role Tank, Druid";
-- 3.66
VUHDO_I18N_BOUQUET_PALADIN_BEACON = "Paladin Beacon";
VUHDO_I18N_BOUQUET_STATUS_EXCESS_ABSORB = "Statusbar: Excess Absorption %";
VUHDO_I18N_BOUQUET_STATUS_TOTAL_ABSORB = "Statusbar: Total Absorption %";
-- 3.67
VUHDO_I18N_NO_BOSS = "[no NPC]";
VUHDO_I18N_BOSSES = "NPCs";
......@@ -110,6 +110,10 @@ function VUHDO_isPanelVisible(aPanelNum)
return true;
end
if VUHDO_isModelInPanel(aPanelNum, 44) then -- VUHDO_ID_BOSSES
return true;
end
if VUHDO_CONFIG["HIDE_EMPTY_PANELS"] and not VUHDO_isConfigPanelShowing()
and #VUHDO_PANEL_UNITS[aPanelNum] == 0 then
return false;
......
......@@ -154,6 +154,7 @@ local VUHDO_RAID;
local VUHDO_UNIT_BUTTONS;
local VUHDO_CONFIG;
local VUHDO_GROUPS_BUFFS;
local VUHDO_BOSS_UNIT;
local sRangeSpell;
local sIsGuessRange = true;
local sScanRange;
......@@ -168,6 +169,7 @@ function VUHDO_toolboxInitLocalOverrides()
VUHDO_UNIT_BUTTONS = _G["VUHDO_UNIT_BUTTONS"];
VUHDO_CONFIG = _G["VUHDO_CONFIG"];
VUHDO_GROUPS_BUFFS = _G["VUHDO_GROUPS_BUFFS"];
VUHDO_BOSS_UNIT = _G["VUHDO_BOSS_UNIT"];
VUHDO_updateBouquetsForEvent = _G["VUHDO_updateBouquetsForEvent"];
sScanRange = tonumber(VUHDO_CONFIG["SCAN_RANGE"]);
sRangeSpell = VUHDO_CONFIG["RANGE_SPELL"];
......@@ -252,7 +254,7 @@ end
-- Extracts unit number from a Unit's name
local tUnitNo;
function VUHDO_getUnitNo(aUnit)
if "focus" == aUnit or "target" == aUnit then return 0; end
if not aUnit or VUHDO_isSpecialUnit(aUnit) then return 0; end
if "player" == aUnit then aUnit = VUHDO_PLAYER_RAID_ID or "player"; end
return tonumber(strsub(aUnit, -2, -1)) or tonumber(strsub(aUnit, -1)) or 1;
end
......@@ -262,7 +264,7 @@ local VUHDO_getUnitNo = VUHDO_getUnitNo;
-- returns the units subgroup number, or 0 for pets/focus
function VUHDO_getUnitGroup(aUnit, anIsPet)
if anIsPet or not aUnit or aUnit == "focus" or aUnit == "target" then return 0;
if anIsPet or not aUnit or VUHDO_isSpecialUnit(aUnit) then return 0;
elseif VUHDO_GROUP_TYPE_RAID == VUHDO_getCurrentGroupType() then
return select(3, GetRaidRosterInfo(VUHDO_getUnitNo(aUnit))) or 1;
else return 1; end
......@@ -280,10 +282,21 @@ local VUHDO_isTargetInRange = VUHDO_isTargetInRange;
-- returns wether or not a unit is in range
function VUHDO_isInRange(aUnit)
if "player" == aUnit then return true;
elseif "focus" == aUnit or "target" == aUnit then return VUHDO_isTargetInRange(aUnit);
elseif (sIsGuessRange) then return UnitInRange(aUnit);
else return 1 == IsSpellInRange(sRangeSpell, aUnit); end
if "player" == aUnit then
return true;
elseif VUHDO_isSpecialUnit(aUnit) then
return VUHDO_isTargetInRange(aUnit);
elseif (sIsGuessRange) then
return UnitInRange(aUnit);
else
local tIsSpellInRange = IsSpellInRange(sRangeSpell, aUnit);
if tIsSpellInRange ~= nil then
return (tIsSpellInRange == 1) and true or false;
else
return UnitInRange(aUnit);
end
end
end
......@@ -827,6 +840,8 @@ function VUHDO_getCurrentKeyModifierString()
IsShiftKeyDown() and "shift" or "");
end
-- Helper to serialize a table to a string for pretty printing
-- Taken from Lua Users Wiki: http://lua-users.org/wiki/TableUtils
function VUHDO_tableValueToString(v)
......@@ -842,6 +857,8 @@ function VUHDO_tableValueToString(v)
end
end
function VUHDO_tableKeyToString(k)
if "string" == type( k ) and string.match( k, "^[_%a][_%a%d]*$" ) then
return k
......@@ -850,6 +867,8 @@ function VUHDO_tableKeyToString(k)
end
end
function VUHDO_tableToString(tbl)
local result, done = {}, {}
for k, v in ipairs( tbl ) do
......@@ -865,3 +884,19 @@ function VUHDO_tableToString(tbl)
return "{" .. table.concat( result, "," ) .. "}"
end
function VUHDO_isBossUnit(aUnit)
return VUHDO_BOSS_UNIT and VUHDO_BOSS_UNIT[aUnit];
end
function VUHDO_isSpecialUnit(aUnit)
return aUnit == "focus" or aUnit == "target" or VUHDO_isBossUnit(aUnit);
end
......@@ -22,6 +22,8 @@ Bugfixes:
Improvements:
-- Bumped TOCs for 6.1
-- New special panel type 'NPCs' for boss encounter unit frames (thanks Dridzt)
-- Listen to UNIT_HEALTH_FREQUENT events for more responsive health reporting
--------------------------------------------------------------
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment