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.

358 lines
10 KiB

local VUHDO_IN_RAID_TARGETS = { };
VUHDO_IN_RAID_TARGET_BUTTONS = { };
local VUHDO_IN_RAID_TARGET_BUTTONS = VUHDO_IN_RAID_TARGET_BUTTONS;
local VUHDO_TOT_GUIDS = { };
-------------------------------------------------
local UnitClass = UnitClass;
local UnitPowerType = UnitPowerType;
-- Disable local alias so function can be overloaded by Velhari Health Fix addon
--local UnitHealthMax = UnitHealthMax;
local UnitHealth = UnitHealth;
local UnitName = UnitName;
local UnitPower = UnitPower;
local UnitPowerMax = UnitPowerMax;
local UnitIsDeadOrGhost = UnitIsDeadOrGhost;
local UnitIsConnected = UnitIsConnected;
local UnitIsUnit = UnitIsUnit;
local UnitExists = UnitExists;
local UnitCreatureType = UnitCreatureType;
local strfind = strfind;
local gsub = gsub;
local GetRaidTargetIndex = GetRaidTargetIndex;
local tonumber = tonumber;
local pairs = pairs;
local tostring = tostring;
local twipe = table.wipe;
local _;
local VUHDO_CUSTOM_INFO;
local VUHDO_CLASS_IDS;
local VUHDO_getHealthBar;
local VUHDO_customizeText;
local VUHDO_setRaidTargetIconTexture
local VUHDO_RAID;
local VUHDO_getUnitButtons;
local VUHDO_getTargetButton;
local VUHDO_getTotButton;
local VUHDO_PANEL_SETUP;
local VUHDO_getTargetBarRoleIcon;
local VUHDO_POWER_TYPE_COLORS;
local VUHDO_BUTTON_CACHE;
local VUHDO_getUnitZoneName;
local VUHDO_getDisplayUnit;
local VUHDO_textColor;
local VUHDO_isTargetInRange;
local sOOROpacity;
function VUHDO_customTargetInitLocalOverrides()
VUHDO_CUSTOM_INFO = _G["VUHDO_CUSTOM_INFO"];
VUHDO_CLASS_IDS = _G["VUHDO_CLASS_IDS"];
VUHDO_getHealthBar = _G["VUHDO_getHealthBar"];
VUHDO_customizeText = _G["VUHDO_customizeText"];
VUHDO_setRaidTargetIconTexture = _G["VUHDO_setRaidTargetIconTexture"];
VUHDO_RAID = _G["VUHDO_RAID"];
VUHDO_getUnitButtons = _G["VUHDO_getUnitButtons"];
VUHDO_getTargetButton = _G["VUHDO_getTargetButton"];
VUHDO_getTotButton = _G["VUHDO_getTotButton"];
VUHDO_BUTTON_CACHE = _G["VUHDO_BUTTON_CACHE"];
VUHDO_PANEL_SETUP = _G["VUHDO_PANEL_SETUP"];
VUHDO_getTargetBarRoleIcon = _G["VUHDO_getTargetBarRoleIcon"];
VUHDO_POWER_TYPE_COLORS = _G["VUHDO_POWER_TYPE_COLORS"];
VUHDO_getUnitZoneName = _G["VUHDO_getUnitZoneName"];
VUHDO_getDisplayUnit = _G["VUHDO_getDisplayUnit"];
VUHDO_textColor = _G["VUHDO_textColor"];
VUHDO_isTargetInRange = _G["VUHDO_isTargetInRange"];
if VUHDO_PANEL_SETUP["BAR_COLORS"]["OUTRANGED"]["useOpacity"] then
sOOROpacity = VUHDO_PANEL_SETUP["BAR_COLORS"]["OUTRANGED"]["O"];
else
sOOROpacity = 1;
end
end
------------------------------------------------------------------
--
local tManaBar;
local tInfo;
local function VUHDO_customizeManaBar(aButton)
_, tInfo = VUHDO_getDisplayUnit(aButton);
if tInfo["connected"] then
tManaBar = VUHDO_getHealthBar(aButton, 2);
tManaBar:SetValue(tInfo["powermax"] < 2 and 0 or tInfo["power"] / tInfo["powermax"]); -- Some addons return 1 mana-max instead of zero
tManaBar:SetVuhDoColor(VUHDO_POWER_TYPE_COLORS[tInfo["powertype"]]);
else
VUHDO_getHealthBar(aButton, 2):SetValue(0);
end
end
--
local tInfo;
local tLocalClass, tClassName;
local tPowerType;
local tName;
local function VUHDO_fillCustomInfo(aUnit)
tLocalClass, tClassName = UnitClass(aUnit);
tPowerType = UnitPowerType(aUnit);
tName = UnitName(aUnit);
tInfo = VUHDO_CUSTOM_INFO;
tInfo["healthmax"] = UnitHealthMax(aUnit);
tInfo["health"] = UnitHealth(aUnit);
tInfo["name"] = tName;
tInfo["unit"] = aUnit;
tInfo["class"] = tClassName;
tInfo["powertype"] = tonumber(tPowerType);
tInfo["power"] = UnitPower(aUnit);
tInfo["powermax"] = UnitPowerMax(aUnit);
tInfo["dead"] = UnitIsDeadOrGhost(aUnit);
tInfo["connected"] = UnitIsConnected(aUnit);
if tLocalClass == tName then
tInfo["className"] = UnitCreatureType(aUnit) or "";
else
tInfo["className"] = tLocalClass or "";
end
tInfo["classId"] = VUHDO_CLASS_IDS[tClassName];
tInfo["fullName"] = tName;
tInfo["zone"], tInfo["map"] = (VUHDO_RAID["player"] or { })["zone"], (VUHDO_RAID["player"] or { })["map"];
tInfo["fixResolveId"] = nil;
tInfo["raidIcon"] = GetRaidTargetIndex(aUnit);
end
--
local tBar;
local tQuota;
local function VUHDO_targetHealthBouquetCallback(aButton, aUnit, anIsActive, anIcon, aCurrValue, aCounter, aMaxValue, aColor, aBuffName, aBouquetName)
tQuota = anIsActive and (aMaxValue or 0) > 0
and aCurrValue / aMaxValue or 0;
if tQuota > 0 then
tBar = VUHDO_getHealthBar(aButton, 1);
tBar:SetValue(tQuota);
tBar:SetVuhDoColor(aColor);
VUHDO_getBarText(tBar):SetTextColor(VUHDO_textColor(aColor));
VUHDO_getLifeText(tBar):SetTextColor(VUHDO_textColor(aColor));
aButton:SetAlpha(1);
else
aButton:SetAlpha(0);
end
end
--
local tTexture;
local tIconIdx;
function VUHDO_customizeTargetBar(aButton, aUnit, anIsInRange)
VUHDO_CUSTOM_INFO["range"] = anIsInRange;
VUHDO_invokeCustomBouquet(aButton, aUnit, VUHDO_RAID[aUnit] or VUHDO_CUSTOM_INFO, VUHDO_I18N_DEF_BOUQUET_TARGET_HEALTH, VUHDO_targetHealthBouquetCallback);
VUHDO_customizeText(aButton, 1, true); -- VUHDO_UPDATE_ALL
VUHDO_customizeManaBar(aButton, true);
tIconIdx = GetRaidTargetIndex(aUnit);
if not VUHDO_PANEL_SETUP[VUHDO_BUTTON_CACHE[aButton]]["RAID_ICON"]["show"]
or not VUHDO_PANEL_SETUP["RAID_ICON_FILTER"][tIconIdx] then
tIconIdx = nil;
end
if tIconIdx then
tTexture = VUHDO_getTargetBarRoleIcon(aButton, 50);
VUHDO_setRaidTargetIconTexture(tTexture, tIconIdx);
tTexture:Show();
else
VUHDO_getTargetBarRoleIcon(aButton, 50):Hide();
end
end
local VUHDO_customizeTargetBar = VUHDO_customizeTargetBar;
-- Wir merken uns die Target-Buttons, wenn das Ziel im Raid ist,
-- um Gesundheitsupdates mit dem regul�ren Mechanismus durchzuf�hren
-- die Target-Buttons sind also durch den Target-Namen indiziert.
local tName;
local function VUHDO_rememberTargetButton(aTargetUnit, aButton)
for tUnit, tInfo in pairs(VUHDO_RAID) do
if UnitIsUnit(tUnit, aTargetUnit) then
tName = tInfo["name"];
if not VUHDO_IN_RAID_TARGET_BUTTONS[tName] then
VUHDO_IN_RAID_TARGET_BUTTONS[tName] = { };
end
VUHDO_IN_RAID_TARGET_BUTTONS[tName][aButton] = aButton;
VUHDO_IN_RAID_TARGETS[aTargetUnit] = tName;
break;
end
end
end
-- L�sche alle Target-Buttons der Person, deren Ziel sich ge�ndert hat
-- Wobei die Buttons mit dem Namen des TARGETS indiziert sind, welchen
-- wir uns VUHDO_IN_RAID_TARGETS aber gemerkt haben
local tName;
local function VUHDO_forgetTargetButton(aTargetUnit, aButton)
tName = VUHDO_IN_RAID_TARGETS[aTargetUnit];
if tName then
if not VUHDO_IN_RAID_TARGET_BUTTONS[tName] then
VUHDO_IN_RAID_TARGET_BUTTONS[tName] = { };
end
VUHDO_IN_RAID_TARGET_BUTTONS[tName][aButton] = nil;
end
end
--
local sTargetSourceUnits = {};
local sUnitTargetsUnits = {};
local sUnitTotUnits = {};
--
local tTargetButton, tTotButton;
local tAllButtons;
local tTarget;
local tTargetOfTarget;
function VUHDO_updateTargetBars(aUnit)
if strfind(aUnit, "target", 1, true) and aUnit ~= "target" then
if not sTargetSourceUnits[aUnit] then
sTargetSourceUnits[aUnit] = gsub(aUnit, "target", "");
end
aUnit = sTargetSourceUnits[aUnit];
end
tAllButtons = VUHDO_getUnitButtons(aUnit);
if not tAllButtons then return; end
if not sUnitTargetsUnits[aUnit] then
sUnitTargetsUnits[aUnit] = aUnit .. "target";
end
tTarget = sUnitTargetsUnits[aUnit];
if not sUnitTotUnits[tTarget] then
sUnitTotUnits[tTarget] = tTarget .. "target";
end
tTargetOfTarget = sUnitTotUnits[tTarget];
for _, tButton in pairs(tAllButtons) do
VUHDO_forgetTargetButton(tTarget, VUHDO_getTargetButton(tButton));
VUHDO_forgetTargetButton(tTargetOfTarget, VUHDO_getTotButton(tButton));
end
VUHDO_IN_RAID_TARGETS[tTarget] = nil;
VUHDO_IN_RAID_TARGETS[tTargetOfTarget] = nil;
if not UnitExists(tTarget) then
for _, tButton in pairs(tAllButtons) do
VUHDO_getTargetButton(tButton):SetAlpha(0);
VUHDO_getTotButton(tButton):SetAlpha(0);
end
return;
end
-- Target
VUHDO_fillCustomInfo(tTarget);
for _, tButton in pairs(tAllButtons) do
if VUHDO_PANEL_SETUP[VUHDO_BUTTON_CACHE[tButton]]["SCALING"]["showTarget"] then
tTargetButton = VUHDO_getTargetButton(tButton);
VUHDO_customizeTargetBar(tTargetButton, tTarget, VUHDO_isTargetInRange(tTarget));
tTargetButton:SetAlpha(1);
VUHDO_rememberTargetButton(tTarget, tTargetButton);
end
end
-- Target-of-target
if not UnitExists(tTargetOfTarget) then
for _, tButton in pairs(tAllButtons) do
VUHDO_getTotButton(tButton):SetAlpha(0);
end
return;
end
VUHDO_fillCustomInfo(tTargetOfTarget);
for _, tButton in pairs(tAllButtons) do
if VUHDO_PANEL_SETUP[VUHDO_BUTTON_CACHE[tButton]]["SCALING"]["showTot"] then
tTotButton = VUHDO_getTotButton(tButton);
VUHDO_customizeTargetBar(tTotButton, tTargetOfTarget, VUHDO_isTargetInRange(tTargetOfTarget));
tTotButton:SetAlpha(1);
VUHDO_rememberTargetButton(tTargetOfTarget, tTotButton);
end
end
end
local VUHDO_updateTargetBars = VUHDO_updateTargetBars;
--
function VUHDO_rebuildTargets()
if not VUHDO_INTERNAL_TOGGLES[22] then return; end-- VUHDO_UPDATE_UNIT_TARGET
twipe(VUHDO_IN_RAID_TARGETS);
twipe(VUHDO_IN_RAID_TARGET_BUTTONS);
twipe(VUHDO_TOT_GUIDS);
for tUnit, _ in pairs(VUHDO_RAID) do
VUHDO_updateTargetBars(tUnit);
end
end
--
local tTotUnit, tGuid;
local tAllButtons;
local function VUHDO_updateTargetHealth(aUnit, aTargetUnit)
tAllButtons = VUHDO_getUnitButtons(aUnit);
if not tAllButtons then return; end
if not VUHDO_IN_RAID_TARGETS[aTargetUnit] then
VUHDO_fillCustomInfo(aTargetUnit);
for _, tButton in pairs(tAllButtons) do
VUHDO_customizeTargetBar(VUHDO_getTargetButton(tButton), aTargetUnit, VUHDO_isTargetInRange(aTargetUnit));
end
end
if not sUnitTotUnits[aTargetUnit] then
sUnitTotUnits[aTargetUnit] = aTargetUnit .. "target";
end
tTotUnit = sUnitTotUnits[tTarget];
tGuid = UnitGUID(tTotUnit);
if VUHDO_TOT_GUIDS[aUnit] ~= tGuid then
VUHDO_updateTargetBars(aUnit);
VUHDO_TOT_GUIDS[aUnit] = tGuid;
elseif VUHDO_IN_RAID_TARGETS[tTotUnit] == nil and UnitExists(tTotUnit) then
VUHDO_fillCustomInfo(tTotUnit);
for _, tButton in pairs(tAllButtons) do
VUHDO_customizeTargetBar(VUHDO_getTotButton(tButton), tTotUnit, VUHDO_isTargetInRange(tTotUnit));
end
end
end
--
function VUHDO_updateAllOutRaidTargetButtons()
for tUnit, tInfo in pairs(VUHDO_RAID) do
if UnitExists(tInfo["targetUnit"]) then
VUHDO_updateTargetHealth(tUnit, tInfo["targetUnit"]);
end
end
end