local UnitGetIncomingHeals, UnitGetTotalAbsorbs = UnitGetIncomingHeals, UnitGetTotalAbsorbs;
local UnitThreatSituation, GetThreatStatusColor = UnitThreatSituation, GetThreatStatusColor;
local UnitIsDeadOrGhost, UnitIsConnected = UnitIsDeadOrGhost, UnitIsConnected;
-local UnitGetTotalHealAbsorbs = UnitGetTotalHealAbsorbs;
local UnitHasVehicleUI, UnitTargetsVehicleInRaidUI = UnitHasVehicleUI, UnitTargetsVehicleInRaidUI;
local UnitLevel, UnitClassification = UnitLevel, UnitClassification;
local UnitAffectingCombat, IsResting = UnitAffectingCombat, IsResting;
local HasLFGRestrictions = HasLFGRestrictions;
local UnitPlayerControlled, UnitIsPlayer = UnitPlayerControlled, UnitIsPlayer;
local UnitIsTapDenied, UnitSelectionColor = UnitIsTapDenied, UnitSelectionColor;
+local GetRaidTargetIndex, SetRaidTargetIconTexture = GetRaidTargetIndex, SetRaidTargetIconTexture;
local RAID_CLASS_COLORS = RAID_CLASS_COLORS;
local updateAuraFrames = OmaUFAuras.UpdateAuras;
local M = {};
OmaUFEvents = M;
function M.RegisterUnitEvents(frame)
- -- events are taken from FrameXML/CompactUnitFrame.lua
- -- TODO raid marker support,
- -- player flags support (/afk, /dnd)
+ -- events are taken from FrameXML/CompactUnitFrame.lua and FrameXML/TargetFrame.lua
+ -- TODO player flags support (/afk, /dnd)
+ frame:RegisterEvent("RAID_TARGET_UPDATE"); -- have to register all and just check
local displayed = frame.unit ~= frame.displayed and frame.displayed or nil;
frame:RegisterUnitEvent("UNIT_HEALTH", frame.unit, displayed);
frame:RegisterUnitEvent("UNIT_HEALTH_FREQUENT", frame.unit, displayed);
frame:RegisterUnitEvent("UNIT_MAXHEALTH", frame.unit, displayed);
- frame:RegisterUnitEvent("UNIT_POWER", frame.unit, displayed);
- frame:RegisterUnitEvent("UNIT_MAXPOWER", frame.unit, displayed);
- frame:RegisterUnitEvent("UNIT_DISPLAYPOWER", frame.unit, displayed);
- frame:RegisterUnitEvent("UNIT_POWER_BAR_SHOW", frame.unit, displayed);
- frame:RegisterUnitEvent("UNIT_POWER_BAR_HIDE", frame.unit, displayed);
+ if frame.mana then
+ frame:RegisterUnitEvent("UNIT_POWER", frame.unit, displayed);
+ frame:RegisterUnitEvent("UNIT_MAXPOWER", frame.unit, displayed);
+ frame:RegisterUnitEvent("UNIT_DISPLAYPOWER", frame.unit, displayed);
+ frame:RegisterUnitEvent("UNIT_POWER_BAR_SHOW", frame.unit, displayed);
+ frame:RegisterUnitEvent("UNIT_POWER_BAR_HIDE", frame.unit, displayed);
+ end
+ if frame.shield then
+ frame:RegisterUnitEvent("UNIT_ABSORB_AMOUNT_CHANGED", frame.unit, displayed);
+ end
+ if frame.auras then
+ frame:RegisterUnitEvent("UNIT_AURA", frame.unit, displayed);
+ end
frame:RegisterUnitEvent("UNIT_NAME_UPDATE", frame.unit, displayed);
- frame:RegisterUnitEvent("UNIT_AURA", frame.unit, displayed);
- frame:RegisterUnitEvent("UNIT_HEAL_PREDICTION", frame.unit, displayed);
- frame:RegisterUnitEvent("UNIT_ABSORB_AMOUNT_CHANGED", frame.unit, displayed);
- frame:RegisterUnitEvent("UNIT_HEAL_ABSORB_AMOUNT_CHANGED", frame.unit, displayed);
frame:RegisterUnitEvent("UNIT_THREAT_SITUATION_UPDATE", frame.unit, displayed);
frame:RegisterUnitEvent("UNIT_CONNECTION", frame.unit, displayed);
frame:RegisterUnitEvent("UNIT_FACTION", frame.unit, displayed);
frame.healthText:SetText("Dead");
elseif not UnitIsConnected(unit) then
frame.healthText:SetText("DC");
+ elseif frame.healthText.percent then
+ frame.healthText:SetFormattedText("%.1f", UnitHealth(unit)/frame.health.max*100);
else
local current = UnitHealth(unit);
- if current > 1200000000 then -- 1.2B
- frame.healthText:SetFormattedText("%.1fB", current / 1000000000);
- elseif current > 1200000 then -- 1.2M
- frame.healthText:SetFormattedText("%.1fM", current / 1000000);
+ if current > 1000000000 then -- 1.0B
+ frame.healthText:SetFormattedText("%.2fB", current / 1000000000);
+ elseif current > 1000000 then -- 1.0M
+ frame.healthText:SetFormattedText("%.2fM", current / 1000000);
elseif current > 1000 then -- 1K
frame.healthText:SetFormattedText("%.1fK", current / 1000);
else
local function updateName(frame, unit)
local name = UnitName(unit);
if not name then return end
- frame.name:SetText(ssub(name, 1, 10));
-end
-
-local function updateHealPred(frame, unit)
- local incoming = UnitGetIncomingHeals(unit) or 0;
- if incoming > 0 then
- local space = frame.width - frame.health:GetWidth() + 1;
- incoming = (incoming / frame.health.max) * frame.width;
- frame.healpred:SetWidth(min(space, incoming));
- frame.healpred:Show();
- else
- frame.healpred:Hide();
- end
+ frame.name:SetText(ssub(name, 1, frame.name.count));
end
local function updateShield(frame, unit)
end
end
-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) * frame.width;
- frame.healabsorb:SetWidth(min(space, absorb));
- frame.healabsorb:Show();
- else
- frame.healabsorb:Hide();
- end
-end
-
local function updateAuras(frame, unit)
- if frame.auras then updateAuraFrames(frame, unit) end
+ updateAuraFrames(frame, unit);
end
local function updateAggro(frame, unit)
end
end
+-- only works for player frame
local function updateVehicle(frame)
- local shouldTargetVehicle = UnitHasVehicleUI(frame.unit) and
- UnitTargetsVehicleInRaidUI(frame.unit) and UnitExists(frame.vehicle);
+ local shouldTargetVehicle = UnitHasVehicleUI("player") and
+ UnitTargetsVehicleInRaidUI("player") and UnitExists("vehicle");
if shouldTargetVehicle then
if not frame.inVehicle then
frame.inVehicle = true;
end
end
+local pvpIcons = {
+ Alliance = "Interface\\TARGETINGFRAME\\UI-PVP-Alliance",
+ Horde = "Interface\\TARGETINGFRAME\\UI-PVP-Horde"
+};
local function updatePVP(frame, unit)
if UnitIsPVPFreeForAll(unit) then
frame.pvp:SetTexture("Interface\\TARGETINGFRAME\\UI-PVP-FFA");
faction = "Horde";
end
end
- frame.pvp:SetTexture("Interface\\TARGETINGFRAME\\UI-PVP-"..faction);
+ frame.pvp:SetTexture(pvpIcons[faction]);
frame.pvp:Show();
else
frame.pvp:Hide();
end
end
+local function updateRaidMarker(frame, unit)
+ local index = GetRaidTargetIndex(unit);
+ if index then
+ SetRaidTargetIconTexture(frame.targeticon, index);
+ frame.targeticon:Show();
+ else
+ frame.targeticon:Hide();
+ end
+end
+
local eventFuncs = {
["UNIT_HEALTH"] = function(frame)
updateHealth(frame, frame.displayed);
updateHealthText(frame, frame.displayed);
- updateShield(frame, frame.displayed);
- updateHealAbsorb(frame, frame.displayed);
+ if frame.shield then updateShield(frame, frame.displayed) end
end,
["UNIT_POWER"] = function(frame)
updatePower(frame, frame.displayed);
["UNIT_AURA"] = function(frame)
updateAuras(frame, frame.displayed);
end,
- ["UNIT_HEAL_PREDICTION"] = function(frame)
- updateHealPred(frame, frame.displayed);
- end,
["UNIT_ABSORB_AMOUNT_CHANGED"] = function(frame)
updateShield(frame, frame.displayed);
end,
- ["UNIT_HEAL_ABSORB_AMOUNT_CHANGED"] = function(frame)
- updateHealAbsorb(frame, frame.displayed);
- end,
["UNIT_THREAT_SITUATION_UPDATE"] = function(frame)
updateAggro(frame, frame.displayed);
end,
updateMaxHealth(frame, frame.displayed);
updateHealth(frame, frame.displayed);
updateHealthText(frame, frame.displayed);
- updateShield(frame, frame.displayed);
- updateHealAbsorb(frame, frame.displayed);
+ if frame.shield then updateShield(frame, frame.displayed) end
end,
["UNIT_MAXPOWER"] = function(frame)
updateMaxPower(frame, frame.displayed);
["PARTY_LEADER_CHANGED"] = function(frame)
updateLeaderIcon(frame, frame.unit);
end,
+ ["RAID_TARGET_UPDATE"] = function(frame)
+ updateRaidMarker(frame, frame.displayed);
+ end,
["UPDATE_ALL_BARS"] = function(frame)
if frame.vehicle then updateVehicle(frame) end
updateMaxHealth(frame, frame.displayed);
- updateMaxPower(frame, frame.displayed);
updateHealth(frame, frame.displayed);
updateHealthText(frame, frame.displayed);
- updatePower(frame, frame.displayed);
- updatePowerText(frame, frame.displayed);
- updateAuras(frame, frame.displayed);
- updateShield(frame, frame.displayed);
- updateHealPred(frame, frame.displayed);
- updateHealAbsorb(frame, frame.displayed);
- updatePowerColor(frame, frame.displayed);
+ updateHealthColor(frame, frame.displayed);
updateAggro(frame, frame.displayed);
+ updateRaidMarker(frame, frame.displayed);
+ if frame.mana then
+ updateMaxPower(frame, frame.displayed);
+ updatePower(frame, frame.displayed);
+ updatePowerText(frame, frame.displayed);
+ updatePowerColor(frame, frame.displayed);
+ end
+ if frame.auras then updateAuras(frame, frame.displayed) end
+ if frame.shield then updateShield(frame, frame.displayed) end
if frame.name then updateName(frame, frame.displayed) end
if frame.level then updateLevelText(frame, frame.unit) end
if frame.status then updateStatus(frame, frame.unit) end
if frame.pvp then updatePVP(frame, frame.unit) end
if frame.leader then updateLeaderIcon(frame, frame.unit) end
- updateHealthColor(frame, frame.displayed);
end,
};
eventFuncs["UNIT_HEALTH_FREQUENT"] = eventFuncs["UNIT_HEALTH"];
eventFuncs["GROUP_ROSTER_UPDATE"] = eventFuncs["UPDATE_ALL_BARS"];
eventFuncs["PLAYER_ENTERING_WORLD"] = eventFuncs["UPDATE_ALL_BARS"];
eventFuncs["PLAYER_TARGET_CHANGED"] = eventFuncs["UPDATE_ALL_BARS"];
+eventFuncs["INSTANCE_ENCOUNTER_ENGAGE_UNIT"] = eventFuncs["UPDATE_ALL_BARS"];
+eventFuncs["UNIT_TARGETABLE_CHANGED"] = eventFuncs["UPDATE_ALL_BARS"];
function M.UnitEvent(self, event, arg1)
eventFuncs[event](self, arg1);