local min = math.min;
local UnitName, UnitClass, UnitExists = UnitName, UnitClass, UnitExists;
local UnitDebuff, UnitIsCharmed = UnitDebuff, UnitIsCharmed;
-local UnitPower, UnitPowerMax, UnitPowerType = UnitPower, UnitPowerMax, UnitPowerType;
local UnitHealth, UnitHealthMax = UnitHealth, UnitHealthMax;
local UnitIsAFK, UnitIsDND = UnitIsAFK, UnitIsDND;
local UnitGetIncomingHeals, UnitGetTotalAbsorbs = UnitGetIncomingHeals, UnitGetTotalAbsorbs;
local overlayColorDispel = Settings.OverlayColorDispel;
local overlayColorCharm = Settings.OverlayColorCharm;
local overlayColorAlert = Settings.OverlayColorAlert;
-local powerColors = Settings.PowerColors;
local width = Settings.Width;
local M = {};
if frame.unit == "focus" then frame:RegisterEvent("PLAYER_FOCUS_CHANGED") end
end
-local function unregisterPower(frame)
- frame.health:SetPoint("BOTTOMLEFT", frame.background, "BOTTOMLEFT");
- frame.overlay:SetPoint("BOTTOMRIGHT", frame.background, "BOTTOMRIGHT");
- frame.mana:Hide();
- frame:UnregisterEvent("PARTY_MEMBER_ENABLE");
- frame:UnregisterEvent("PARTY_MEMBER_DISABLE");
- frame:UnregisterEvent("UNIT_POWER");
- frame:UnregisterEvent("UNIT_MAXPOWER");
- frame:UnregisterEvent("UNIT_DISPLAYPOWER");
- frame:UnregisterEvent("UNIT_POWER_BAR_SHOW");
- frame:UnregisterEvent("UNIT_POWER_BAR_HIDE");
-end
-
-local function registerPower(frame)
- frame.health:SetPoint("BOTTOMLEFT", frame.background, "BOTTOMLEFT", 0, 2);
- frame.overlay:SetPoint("BOTTOMRIGHT", frame.background, "BOTTOMRIGHT", 0, 2);
- frame.mana:Show();
- frame:RegisterEvent("PARTY_MEMBER_ENABLE");
- frame:RegisterEvent("PARTY_MEMBER_DISABLE");
- frame:RegisterUnitEvent("UNIT_POWER", frame.unit);
- frame:RegisterUnitEvent("UNIT_MAXPOWER", frame.unit);
- frame:RegisterUnitEvent("UNIT_DISPLAYPOWER", frame.unit);
- frame:RegisterUnitEvent("UNIT_POWER_BAR_SHOW", frame.unit);
- frame:RegisterUnitEvent("UNIT_POWER_BAR_HIDE", frame.unit);
-end
-
function M.RegisterUnitEvents(frame)
-- events are taken from FrameXML/CompactUnitFrame.lua
local displayed = frame.unit ~= frame.displayed and frame.displayed or nil;
end
local registerUnitEvents = M.RegisterUnitEvents;
-local function updateMaxHealth(frame, unit)
- frame.health.max = UnitHealthMax(unit);
-end
-
-local function updateHealth(frame, unit)
- local current, max = UnitHealth(unit), frame.health.max;
- if current > max or max <= 0 then
- -- somehow current health has gone over the maximum (missed maxhealth event possibly)
- -- just put health bar full and update max health for next event
- frame.health:SetWidth(width);
- updateMaxHealth(frame, unit);
- frame.health:Show();
- elseif current <= 0 or UnitIsDeadOrGhost(unit) then
- frame.health:Hide();
- else
- frame.health:SetWidth(current/max*width);
- frame.health:Show();
- end
-end
-
local function updateText(frame, unit)
- local healthLost = frame.health.max - UnitHealth(unit);
if UnitIsDeadOrGhost(unit) then
frame.text:SetText("Dead");
frame.text:Show();
elseif UnitIsAFK(unit) then
frame.text:SetText("afk");
frame.text:Show();
- elseif UnitIsDND(unit) and healthLost == 0 then
+ elseif UnitIsDND(unit) then
frame.text:SetText("dnd");
frame.text:Show();
- elseif healthLost > 0 then
- if healthLost > 1200000000 then -- 1.2B
- frame.text:SetFormattedText("-%.1fB", healthLost / 1000000000);
- elseif healthLost > 1200000 then -- 1.2M
- frame.text:SetFormattedText("-%.1fM", healthLost / 1000000);
- elseif healthLost > 1000 then -- 1K
- frame.text:SetFormattedText("-%dK", healthLost / 1000);
- else
- frame.text:SetFormattedText("-%d", healthLost)
- end
- frame.text:Show();
else
frame.text:Hide();
end
end
-local function updateMaxPower(frame, unit)
- frame.mana.max = UnitPowerMax(unit);
+local function updateMaxHealth(frame, unit)
+ frame.health.max = UnitHealthMax(unit);
end
-local function updatePower(frame, unit)
- local current, max = UnitPower(unit), frame.mana.max;
- if current <= 0 then
- frame.mana:Hide();
- elseif current > max or max <= 0 then
- frame.mana:SetWidth(width);
- updateMaxPower(frame, unit);
- frame.mana:Show();
+local function updateHealth(frame, unit)
+ local current, max = UnitHealth(unit), frame.health.max;
+ if current > max or max <= 0 then
+ -- somehow current health has gone over the maximum (missed maxhealth event possibly)
+ -- just put health bar full and update max health for next event
+ frame.health:SetWidth(width);
+ updateMaxHealth(frame, unit);
+ frame.health:Show();
+ elseif current <= 0 or UnitIsDeadOrGhost(unit) then
+ frame.dead = true;
+ frame.health:Hide();
+ updateText(frame, unit); -- update death
else
- frame.mana:SetWidth(current/max*width);
- frame.mana:Show();
+ frame.health:SetWidth(current/max*width);
+ frame.health:Show();
end
-end
-local function updatePowerColor(frame, unit)
- frame.mana:SetVertexColor(unpack(powerColors[UnitPowerType(unit)]));
+ if frame.dead and current > 0 then
+ frame.dead = nil;
+ updateText(frame, unit); -- update revive
+ end
end
+-- TODO maybe add a prefix when in vehicle
local function updateName(frame, unit)
local name = UnitName(unit);
if not name then return end
if role == "HEALER" then
frame.role:SetTexCoord(0.75, 1, 0, 1);
frame.role:Show();
- registerPower(frame);
- frame.role.healer = true;
elseif role == "TANK" then
frame.role:SetTexCoord(0.5, 0.75, 0, 1);
frame.role:Show();
- if frame.role.healer then
- frame.role.healer = false;
- unregisterPower(frame);
- end
else
frame.role:Hide();
- if frame.role.healer then
- frame.role.healer = false;
- unregisterPower(frame);
- end
end
end
local eventFuncs = {
["UNIT_HEALTH"] = function(frame)
updateHealth(frame, frame.displayed);
- updateText(frame, frame.displayed);
updateShield(frame, frame.displayed);
updateHealAbsorb(frame, frame.displayed);
-- no heal prediction update, that doesn't overflow too much
- -- raid marker update here, because marker is removed when unit dies
+ -- raid marker update here, if needed
+ -- because marker is removed when unit dies
-- without a RAID_TARGET_UPDATE event
- updateRaidMarker(frame, frame.unit);
- end,
- ["UNIT_POWER"] = function(frame)
- updatePower(frame, frame.displayed);
+ --updateRaidMarker(frame, frame.unit);
end,
["UNIT_AURA"] = function(frame)
updateAuras(frame, frame.displayed);
["UNIT_MAXHEALTH"] = function(frame)
updateMaxHealth(frame, frame.displayed);
updateHealth(frame, frame.displayed);
- updateText(frame, frame.displayed);
updateShield(frame, frame.displayed);
updateHealAbsorb(frame, frame.displayed);
end,
- ["UNIT_MAXPOWER"] = function(frame)
- updateMaxPower(frame, frame.displayed);
- updatePower(frame, frame.displayed);
- end,
- ["UNIT_DISPLAYPOWER"] = function(frame)
- updatePowerColor(frame, frame.displayed);
- updateMaxPower(frame, frame.displayed);
- updatePower(frame, frame.displayed);
- end,
["UNIT_NAME_UPDATE"] = function(frame)
- updateName(frame, frame.displayed);
+ updateName(frame, frame.unit);
end,
["UNIT_CONNECTION"] = function(frame)
updateText(frame, frame.displayed);
end,
- ["PARTY_MEMBER_ENABLE"] = function(frame)
- -- new power info possibly (FrameXML/CompactUnitFrame.lua)
- updateMaxPower(frame, frame.displayed);
- updatePowerColor(frame, frame.displayed);
- end,
["PLAYER_ROLES_ASSIGNED"] = function(frame)
updateRole(frame, frame.unit);
end,
updateMaxHealth(frame, frame.displayed);
updateHealth(frame, frame.displayed);
updateText(frame, frame.displayed);
- if frame.role.healer then
- updateMaxPower(frame, frame.displayed);
- updatePower(frame, frame.displayed);
- updatePowerColor(frame, frame.displayed);
- end
updateAuras(frame, frame.displayed);
updateShield(frame, frame.displayed);
updateHealPred(frame, frame.displayed);
updateHealAbsorb(frame, frame.displayed);
updateAggro(frame, frame.displayed);
- updateName(frame, frame.displayed);
+ updateName(frame, frame.unit);
updateReadyCheck(frame, frame.unit);
updateRaidMarker(frame, frame.displayed);
end,
};
eventFuncs["UNIT_HEALTH_FREQUENT"] = eventFuncs["UNIT_HEALTH"];
-eventFuncs["PARTY_MEMBER_DISABLE"] = eventFuncs["PARTY_MEMBER_ENABLE"];
eventFuncs["PLAYER_FLAGS_CHANGED"] = eventFuncs["UNIT_CONNECTION"];
-eventFuncs["UNIT_POWER_BAR_SHOW"] = eventFuncs["UNIT_DISPLAYPOWER"];
-eventFuncs["UNIT_POWER_BAR_HIDE"] = eventFuncs["UNIT_DISPLAYPOWER"];
eventFuncs["READY_CHECK_CONFIRM"] = eventFuncs["READY_CHECK"];
eventFuncs["READY_CHECK_FINISHED"] = eventFuncs["READY_CHECK"];
eventFuncs["UNIT_ENTERED_VEHICLE"] = eventFuncs["UPDATE_ALL_BARS"];