local function updateText(frame, unit)
if UnitIsDeadOrGhost(unit) then
+ frame.dead = true;
frame.text:SetText("Dead");
frame.text:Show();
elseif not UnitIsConnected(unit) 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);
+ frame.health.width = 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.health:SetWidth(current/max*width);
+ local w = current/max*width;
+ frame.health:SetWidth(w);
+ frame.health.width = w;
frame.health:Show();
end
end
M.UpdateHealth = updateHealth;
--- TODO maybe add a prefix when in vehicle
local function updateName(frame, unit)
local name = UnitName(unit);
if not name then return end
- frame.name:SetText(ssub(name, 1, 6));
+ name = ssub(name, 1, 6);
+ if frame.unit == unit then
+ frame.name:SetText(name);
+ else
+ frame.name:SetFormattedText("-%s", name);
+ end
local _, class = UnitClass(unit);
local color = RAID_CLASS_COLORS[class];
local function updateHealPred(frame, unit)
local incoming = UnitGetIncomingHeals(unit) or 0;
if incoming > 0 then
- -- always at least 1 pixel space for heal prediction
- local space = width - frame.health:GetWidth() + 1;
incoming = (incoming / frame.health.max) * width;
- frame.healpred:SetWidth(min(space, incoming));
+ -- always at least 1 pixel space for heal prediction
+ frame.healpred:SetWidth(min(width - frame.health.width + 1, incoming));
frame.healpred:Show();
else
frame.healpred:Hide();
local function updateShield(frame, unit)
local shield = UnitGetTotalAbsorbs(unit) or 0;
if shield > 0 then
- local space = width - frame.health:GetWidth();
+ local space = width - frame.health.width;
shield = (shield / frame.health.max) * width;
if space == 0 then
frame.shield:Hide();
local function updateHealAbsorb(frame, unit)
local absorb = UnitGetTotalHealAbsorbs(unit) or 0;
if absorb > 0 then
- local space = frame.health:GetWidth();
absorb = (absorb / frame.health.max) * width;
- frame.healabsorb:SetWidth(min(space, absorb));
+ frame.healabsorb:SetWidth(min(frame.health.width, absorb));
frame.healabsorb:Show();
else
frame.healabsorb:Hide();
updateShield(frame, frame.displayed);
updateHealAbsorb(frame, frame.displayed);
-- no heal prediction update, that doesn't overflow too much
- -- 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_AURA"] = function(frame)
updateAuras(frame, frame.displayed);