local M = {};
OmaRFEvents = M;
function M.RegisterEvents(frame)
+ frame:RegisterEvent("PLAYER_ENTERING_WORLD");
+ frame:RegisterEvent("PLAYER_ROLES_ASSIGNED");
+ frame:RegisterEvent("READY_CHECK");
+ frame:RegisterEvent("READY_CHECK_FINISHED");
+ frame:RegisterEvent("PARTY_MEMBER_ENABLE");
+ frame:RegisterEvent("PARTY_MEMBER_DISABLE");
+ frame:RegisterEvent("GROUP_ROSTER_UPDATE");
+ 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("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: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
-- TODO raid marker support
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);
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_CONNECTION", frame.unit, displayed);
frame:RegisterUnitEvent("INCOMING_RESURRECT_CHANGED", frame.unit, displayed);
frame:RegisterUnitEvent("PLAYER_FLAGS_CHANGED", frame.unit, displayed);
+ frame:RegisterUnitEvent("READY_CHECK_CONFIRM", frame.unit, displayed);
+ frame:RegisterUnitEvent("UNIT_ENTERED_VEHICLE", frame.unit, displayed);
+ frame:RegisterUnitEvent("UNIT_EXITED_VEHICLE", frame.unit, displayed);
+ frame:RegisterUnitEvent("UNIT_PET", frame.unit, displayed);
+ frame:RegisterUnitEvent("RAID_TARGET_UPDATE", frame.unit, displayed);
end
-local registerEvents = M.RegisterEvents;
+local registerUnitEvents = M.RegisterUnitEvents;
local function updateHealth(frame, unit)
local current, max = UnitHealth(unit), frame.health.max;
end
local function updateAuras(frame, unit)
- checkIndicators(frame, unit);
- if UnitDebuff(unit, 1, "RAID") ~= nil then
+ local alert = checkIndicators(frame, unit);
+ if alert then
+ if frame.overlay.color ~= overlayColorAlert then
+ frame.overlay:SetVertexColor(unpack(overlayColorAlert));
+ frame.overlay:Show();
+ frame.overlay.color = overlayColorAlert;
+ end
+ elseif UnitDebuff(unit, 1, "RAID") ~= nil then
-- something dispellable
if frame.overlay.color ~= overlayColorDispel then
frame.overlay:SetVertexColor(unpack(overlayColorDispel));
if not frame.inVehicle then
frame.inVehicle = true;
frame.displayed = frame.vehicle;
- registerEvents(frame);
+ registerUnitEvents(frame);
end
elseif frame.inVehicle then
frame.inVehicle = false;
frame.displayed = frame.unit;
- registerEvents(frame);
+ registerUnitEvents(frame);
end
end
if role == "HEALER" then
frame.role:SetTexCoord(0.75, 1, 0, 1);
frame.role:Show();
+ if not frame.role.healer then
+ registerPower(frame);
+ frame.role.healer = true;
+ end
elseif role == "TANK" then
frame.role:SetTexCoord(0.5, 0.75, 0, 1);
frame.role:Show();
+ if frame.role.healer then
+ unregisterPower(frame);
+ frame.role.healer = false;
+ end
else
frame.role:Hide();
+ if frame.role.healer then
+ unregisterPower(frame);
+ frame.role.healer = false;
+ end
end
end
end
end
+local function updateRaidMarker(frame, unit)
+ --print(unit, "marker");
+end
+
local eventFuncs = {
["UNIT_HEALTH"] = function(frame)
updateHealth(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
+ -- without a RAID_TARGET_UPDATE event
+ updateRaidMarker(frame, frame.unit);
end,
["UNIT_POWER"] = function(frame)
updatePower(frame, frame.displayed);
["READY_CHECK"] = function(frame)
updateReadyCheck(frame, frame.unit);
end,
+ ["RAID_TARGET_UPDATE"] = function(frame)
+ updateRaidMarker(frame, frame.unit);
+ end,
["UPDATE_ALL_BARS"] = function(frame)
+ updateRole(frame, frame.unit);
updateVehicle(frame);
updateMaxHealth(frame, frame.displayed);
updateMaxPower(frame, frame.displayed);
updateHealPred(frame, frame.displayed);
updateHealAbsorb(frame, frame.displayed);
updatePowerColor(frame, frame.displayed);
- updateIncomingRes(frame, frame.unit);
- updateReadyCheck(frame, frame.unit);
updateAggro(frame, frame.displayed);
updateName(frame, frame.displayed);
- updateRole(frame, frame.unit);
+ updateIncomingRes(frame, frame.unit);
+ updateReadyCheck(frame, frame.unit);
+ updateRaidMarker(frame, frame.unit);
end,
};
eventFuncs["UNIT_HEALTH_FREQUENT"] = eventFuncs["UNIT_HEALTH"];
local Settings = OmaRFSettings;
local majorAuras = Settings.MajorAuras;
-local positions = {};
-local watchedAuras = {};
+local indSize = Settings.IndSize;
+local positions = nil;
+local watchedAuras = nil;
local updaters = {};
local updating = {};
local M = {};
OmaRFIndicators = M;
+function M.SetupIndicators(frame)
+ if not watchedAuras then
+ watchedAuras = Settings.Character["WatchedAuras"];
+ positions = Settings.Character.Positions;
+ end
+
+ frame.inds = CreateFrame("Frame", nil, frame);
+ frame.inds:SetAllPoints();
+ frame.inds:Hide();
+ for _, pos in pairs(positions) do
+ frame.inds[pos] = frame.inds:CreateTexture(nil, "OVERLAY");
+ frame.inds[pos]:SetPoint(pos, frame.inds, pos);
+ frame.inds[pos]:SetWidth(indSize);
+ frame.inds[pos]:SetHeight(indSize);
+ frame.inds[pos]:SetTexture("Interface\\AddOns\\OmaRF\\images\\rhomb");
+ frame.inds[pos]:SetVertexColor(1, 0, 0);
+ frame.inds[pos]:Hide();
+ frame.inds[pos].text = frame.inds:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
+ frame.inds[pos].text:SetPoint("BOTTOMRIGHT", frame.inds[pos], "BOTTOMRIGHT");
+ frame.inds[pos].text:Hide();
+ end
+ frame.major = CreateFrame("Frame", nil, frame);
+ frame.major:SetPoint("TOPLEFT", frame, "TOPLEFT", 4, -indSize + 4);
+ frame.major:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT");
+ for i = 1,3 do
+ frame.major[i] = frame.major:CreateTexture(nil, "OVERLAY");
+ if i == 1 then
+ frame.major[i]:SetPoint("TOPLEFT", frame.major, "TOPLEFT");
+ else
+ frame.major[i]:SetPoint("TOPLEFT", frame.major[i-1], "TOPRIGHT");
+ end
+ frame.major[i]:SetWidth(indSize*2);
+ frame.major[i]:SetHeight(indSize*2);
+ frame.major[i]:Hide();
+ frame.major[i].text = frame.major:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
+ frame.major[i].text:SetPoint("BOTTOMRIGHT", frame.major[i], "BOTTOMRIGHT");
+ frame.major[i].text:Hide();
+ frame.major[i].stack = frame.major:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
+ frame.major[i].stack:SetPoint("TOPLEFT", frame.major[i], "TOPLEFT");
+ frame.major[i].stack:Hide();
+ end
+end
+
local function remaining(text, expires, current)
if expires == 0 then
text:SetText("");
local name, icon, count, expires, caster, id;
local showInds, showMajors, needUpdate = false, false, false;
local majorPos = 1;
+ local alert = false; -- color the whole bar
local current = GetTime();
for _, filter in ipairs(auraFilters) do
local i = 1;
frame.inds[pos].text:Show();
showInds = true;
end
- if (majorAuras[id] or majorAuras[name]) and majorPos <= 3 then
+ local major = majorAuras[id] or majorAuras[name];
+ if major and majorPos <= 3 then
needUpdate = remaining(frame.major[majorPos].text, expires, current);
frame.major[majorPos].expires = expires;
frame.major[majorPos]:SetTexture(icon);
frame.major[majorPos].stack:SetText(count);
frame.major[majorPos].stack:Show();
end
+ if major.bar then
+ alert = true;
+ end
showMajors = true;
majorPos = majorPos + 1;
end
frame.inds:Hide();
frame.major:Hide();
end
-end
-function M.LoadChar()
- watchedAuras = Settings.Character["WatchedAuras"];
- positions = Settings.Character.Positions;
+ return alert;
end
local GameTooltip_SetDefaultAnchor = nil;
local registerEvents = OmaRFEvents.RegisterEvents;
+local registerUnitEvents = OmaRFEvents.RegisterUnitEvents;
local unitEvent = OmaRFEvents.UnitEvent;
+local setupIndicators = OmaRFIndicators.SetupIndicators;
local Settings = OmaRFSettings;
-local indSize = Settings.IndSize;
local baseColor = Settings.BaseColor;
local bgColor = Settings.BgColor;
local healthColor = Settings.HealthColor;
local healabsorbColor = Settings.HealabsorbColor;
local width, height = Settings.Width, Settings.Height;
-- placeholders with visible values when error happens
-local positions = {};
local anchorX, anchorY = 10, 10;
local attributes = {};
local M = {};
OmaRaidFrame = M;
-local function setupIndicators(frame)
- frame.inds = CreateFrame("Frame", nil, frame);
- frame.inds:SetAllPoints();
- frame.inds:Hide();
- for _, pos in pairs(positions) do
- frame.inds[pos] = frame.inds:CreateTexture(nil, "OVERLAY");
- frame.inds[pos]:SetPoint(pos, frame.inds, pos);
- frame.inds[pos]:SetWidth(indSize);
- frame.inds[pos]:SetHeight(indSize);
- frame.inds[pos]:SetTexture("Interface\\AddOns\\OmaRF\\images\\rhomb");
- frame.inds[pos]:SetVertexColor(1, 0, 0);
- frame.inds[pos]:Hide();
- frame.inds[pos].text = frame.inds:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
- frame.inds[pos].text:SetPoint("BOTTOMRIGHT", frame.inds[pos], "BOTTOMRIGHT");
- frame.inds[pos].text:Hide();
- end
- frame.major = CreateFrame("Frame", nil, frame);
- frame.major:SetPoint("TOPLEFT", frame, "TOPLEFT", 4, -indSize + 4);
- frame.major:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT");
- for i = 1,3 do
- frame.major[i] = frame.major:CreateTexture(nil, "OVERLAY");
- if i == 1 then
- frame.major[i]:SetPoint("TOPLEFT", frame.major, "TOPLEFT");
- else
- frame.major[i]:SetPoint("TOPLEFT", frame.major[i-1], "TOPRIGHT");
- end
- frame.major[i]:SetWidth(indSize*2);
- frame.major[i]:SetHeight(indSize*2);
- frame.major[i]:Hide();
- frame.major[i].text = frame.major:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
- frame.major[i].text:SetPoint("BOTTOMRIGHT", frame.major[i], "BOTTOMRIGHT");
- frame.major[i].text:Hide();
- frame.major[i].stack = frame.major:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
- frame.major[i].stack:SetPoint("TOPLEFT", frame.major[i], "TOPLEFT");
- frame.major[i].stack:Hide();
- end
-end
-
local function unitUpdate(self, elapsed)
-- there's no in/out of range event, have to check each frame
-- from FrameXML/CompactUnitFrame.lua
end
local function frameShow(frame)
- frame:RegisterEvent("PARTY_MEMBER_ENABLE");
- frame:RegisterEvent("PARTY_MEMBER_DISABLE");
- frame:RegisterEvent("UNIT_ENTERED_VEHICLE");
- frame:RegisterEvent("UNIT_EXITED_VEHICLE");
- frame:RegisterEvent("UNIT_PET");
- frame:RegisterEvent("PLAYER_ROLES_ASSIGNED");
- frame:RegisterEvent("GROUP_ROSTER_UPDATE");
- frame:RegisterEvent("PLAYER_ENTERING_WORLD");
- frame:RegisterEvent("READY_CHECK");
- frame:RegisterEvent("READY_CHECK_CONFIRM");
- frame:RegisterEvent("READY_CHECK_FINISHED");
- if frame.unit == "focus" then frame:RegisterEvent("PLAYER_FOCUS_CHANGED") end
registerEvents(frame);
+ registerUnitEvents(frame);
frame:SetScript("OnUpdate", unitUpdate);
- unitEvent(frame, "UPDATE_ALL_BARS", frame.displayed);
+ unitEvent(frame, "UPDATE_ALL_BARS");
end
local function frameHide(frame)
frame:SetScript("OnUpdate", nil);
end
-local function showTooltip(frame)
- GameTooltip_SetDefaultAnchor(GameTooltip, frame);
- GameTooltip:SetUnit(frame:GetAttribute("unit"));
+local function showTooltip(secure)
+ GameTooltip_SetDefaultAnchor(GameTooltip, secure);
+ GameTooltip:SetUnit(secure:GetAttribute("unit"));
end
-local function hideTooltip(frame)
+local function hideTooltip(secure)
GameTooltip:FadeOut();
end
frame.displayed = unit;
-- hide frame to get initial frameShow call
frame:Hide();
- if unit == "player" then
- frame.vehicle = "vehicle";
- else
- frame.vehicle = unit.."pet";
- end
+ if unit == "player" then frame.vehicle = "vehicle"
+ else frame.vehicle = unit.."pet" end
-- create visuals
secure:SetWidth(width+2);
secure:SetHeight(height+2);
frame.health = frame:CreateTexture(nil, "BORDER");
frame.health:SetTexture("Interface\\RaidFrame\\Raid-Bar-Hp-Fill");
frame.health:SetPoint("TOPLEFT", frame.background, "TOPLEFT");
- frame.health:SetPoint("BOTTOMLEFT", frame.background, "BOTTOMLEFT", 0, 2);
+ frame.health:SetPoint("BOTTOMLEFT", frame.background, "BOTTOMLEFT");
frame.health:SetVertexColor(unpack(healthColor));
- frame.health:SetWidth(width);
- frame.health.max = UnitHealthMax(unit);
frame.mana = frame:CreateTexture(nil, "BORDER");
frame.mana:SetPoint("TOPLEFT", frame.background, "BOTTOMLEFT", 0, 2);
frame.mana:SetPoint("BOTTOMLEFT", frame.background, "BOTTOMLEFT");
frame.mana:SetColorTexture(1, 1, 1);
- frame.mana:SetWidth(width);
- frame.mana.max = UnitPowerMax(unit);
+ frame.mana:Hide();
frame.shield = frame:CreateTexture(nil, "BORDER");
frame.shield:SetPoint("TOPLEFT", frame.health, "TOPRIGHT");
frame.shield:SetPoint("BOTTOMLEFT", frame.health, "BOTTOMRIGHT");
frame.role = frame:CreateTexture(nil, "ARTWORK");
frame.role:SetPoint("BOTTOMRIGHT", frame.background, "BOTTOMRIGHT", -2, 2);
frame.role:SetPoint("TOPLEFT", frame.background, "BOTTOMRIGHT", -14, 14);
- frame.role:SetTexCoord(0.75, 1, 0, 1);
frame.role:SetTexture("Interface\\LFGFRAME\\LFGROLE");
frame.role:Hide();
frame.overlay = frame:CreateTexture(nil, "ARTWORK", nil, 1);
frame.overlay:SetPoint("TOPLEFT", frame.background, "TOPLEFT");
- frame.overlay:SetPoint("BOTTOMRIGHT", frame.background, "BOTTOMRIGHT", 0, 2);
+ frame.overlay:SetPoint("BOTTOMRIGHT", frame.background, "BOTTOMRIGHT");
frame.overlay:SetColorTexture(1, 1, 1);
frame.overlay:Hide();
frame.name = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
frame.rez:SetTexture("Interface\\RaidFrame\\Raid-Icon-Rez");
frame.rez:Hide();
frame.ready = frame:CreateTexture(nil, "OVERLAY");
- frame.ready:SetPoint("TOPLEFT", frame.background, "BOTTOMLEFT", 0, 12);
- frame.ready:SetPoint("BOTTOMRIGHT", frame.background, "BOTTOMLEFT", 12, 0);
+ frame.ready:SetPoint("TOPLEFT", frame.background, "BOTTOMLEFT", 0, 14);
+ frame.ready:SetPoint("BOTTOMRIGHT", frame.background, "BOTTOMLEFT", 14, 0);
frame.ready:Hide();
-- set up indicators
setupIndicators(frame);
frame:SetScript("OnShow", frameShow);
frame:SetScript("OnHide", frameHide);
frame:SetScript("OnEvent", unitEvent);
- -- let other addons hook these to anchor tooltip elsewhere
- GameTooltip = _G["GameTooltip"];
- GameTooltip_SetDefaultAnchor = _G["GameTooltip_SetDefaultAnchor"];
secure:SetScript("OnEnter", showTooltip);
secure:SetScript("OnLeave", hideTooltip);
-- set attributes
local function loadCharSettings()
anchorX, anchorY = Settings.Character.AnchorX, Settings.Character.AnchorY;
attributes = Settings.Character.Clickheal;
- positions = Settings.Character.Positions;
end
local function initialize()
+ -- let other addons hook these to anchor tooltip elsewhere
+ GameTooltip = _G["GameTooltip"];
+ GameTooltip_SetDefaultAnchor = _G["GameTooltip_SetDefaultAnchor"];
loadCharSettings();
CFrame:SetPoint("CENTER", nil, "CENTER", anchorX, anchorY);
CFrame:SetHeight((height+2)*8);
- CFrame:SetWidth((width+2)*5+1);
+ CFrame:SetWidth((width+2)*5);
initializeParty(CFrame);
initializeRaid(CFrame);
initializeFocus(CFrame);
CFrame:SetScript("OnEvent", function(self, event, addon)
if event == "PLAYER_LOGIN" then
OmaRFLoadChar();
- OmaRFIndicators.LoadChar();
hideBlizzardRaid();
initialize();
elseif event == "PLAYER_REGEN_ENABLED" then
},
MajorAuras = {
-- Antorus
- ["Psychic Assault"] = true,
- ["Everburning Flames"] = true,
- ["Corrupt"] = true,
- ["Sleep Canister"] = true,
- ["Misery"] = true,
- ["Necrotic Embrace"] = true,
- ["Fulminating Pulse"] = true,
- ["Chilled Blood"] = true,
- ["Soulblight"] = true,
- ["Soulburst"] = true,
- ["Soulbomb"] = true,
+ ["Psychic Assault"] = {bar=false},
+ ["Everburning Flames"] = {bar=false},
+ ["Corrupt"] = {bar=false},
+ ["Sleep Canister"] = {bar=false},
+ ["Misery"] = {bar=true},
+ ["Necrotic Embrace"] = {bar=false},
+ ["Fulminating Pulse"] = {bar=false},
+ ["Chilled Blood"] = {bar=false},
+ ["Soulblight"] = {bar=false},
+ ["Soulburst"] = {bar=false},
+ ["Soulbomb"] = {bar=false},
+ ["Shock Grenade"] = {bar=false},
+ -- Trial of Valor
+ ["Unholy Reckoning"] = {bar=false},
-- Proving Grounds for testing
- ["Aqua Bomb"] = true,
+ ["Aqua Bomb"] = {bar=false},
-- Mythic+
- [209858] = true, -- Necrotic Rot
- [240559] = true, -- Grievous Wound
- [240443] = true, -- Burst
+ [209858] = {bar=false}, -- Necrotic Rot
+ [240559] = {bar=false}, -- Grievous Wound
+ [240443] = {bar=false}, -- Burst
},
};
OmaRFSettings = settings;
local baseColor = Settings.BaseColor;
local healthColor = Settings.HealthColor;
local powerColors = Settings.PowerColors;
-local width = Settings.Width;
local M = {};
OmaUFEvents = M;
max = frame.health.max;
if current > max then
-- error state, still over maximum
- frame.health:SetWidth(width);
+ frame.health:SetWidth(frame.width);
return;
end
elseif max > 0 then
- frame.health:SetWidth(current/frame.health.max*width);
+ frame.health:SetWidth(current/frame.health.max*frame.width);
else
- frame.health:SetWidth(width);
+ frame.health:SetWidth(frame.width);
return;
end
elseif not UnitIsConnected(unit) then
frame.healthText:SetText("DC");
frame.healthText:Show();
- elseif max > 0 and current < max then
- frame.healthText:SetText(ceil(current/max*100));
+ elseif max > 0 then
+ if current > 1200000000 then -- 1.2B
+ frame.healthText:SetFormattedText("%.1fB", current / 1000000000);
+ elseif current > 1200000 then -- 1.2M
+ frame.healthText:SetFormattedText("%.1fM", current / 1000000);
+ elseif current > 1000 then -- 1K
+ frame.healthText:SetFormattedText("%.1fK", current / 1000);
+ else
+ frame.healthText:SetFormattedText("%d", current)
+ end
frame.healthText:Show();
else
frame.healthText:Hide();
max = frame.mana.max;
if current > max then
-- error
- frame.mana:SetWidth(width);
+ frame.mana:SetWidth(frame.width);
return;
end
end
if max > 0 then
- frame.mana:SetWidth(UnitPower(unit)/max*width);
+ frame.mana:SetWidth(UnitPower(unit)/max*frame.width);
frame.mana:Show();
else
- frame.mana:SetWidth(width);
+ frame.mana:SetWidth(frame.width);
frame.mana:Show();
end
end
end
local function updateName(frame, unit)
+ if not frame.name then return end
local name = UnitName(unit);
if not name then return end
frame.name:SetText(ssub(name, 1, 10));
local incoming = UnitGetIncomingHeals(unit) or 0;
if incoming > 0 then
local max = frame.health.max;
- local space = width - frame.health:GetWidth() + 1;
- local pred = (incoming / max) * width;
+ local space = frame.width - frame.health:GetWidth() + 1;
+ local pred = (incoming / max) * frame.width;
frame.healpred:SetWidth(min(space, pred));
frame.healpred:Show();
else
local shield = UnitGetTotalAbsorbs(unit) or 0;
if shield > 0 then
local max = frame.health.max;
- local space = width - frame.health:GetWidth();
- shield = (shield / max) * width;
+ local space = frame.width - frame.health:GetWidth();
+ shield = (shield / max) * frame.width;
if space == 0 then
frame.shield:Hide();
frame.shieldhl:Show();
if absorb > 0 then
local max = frame.health.max;
local space = frame.health:GetWidth();
- absorb = (absorb / max) * width;
+ absorb = (absorb / max) * frame.width;
frame.healabsorb:SetWidth(min(space, absorb));
frame.healabsorb:Show();
else
end
local function updateLevelText(frame, unit, levelup)
+ if not frame.level then return end
if levelup then
-- PLAYER_LEVEL_UP
frame.level:SetText(levelup);
end,
["UNIT_NAME_UPDATE"] = function(frame)
updateName(frame, frame.displayed);
- updateHealthColor(frame, frame.unit);
+ updateHealthColor(frame, frame.displayed);
end,
["UNIT_CONNECTION"] = function(frame)
updateHealthText(frame, frame.displayed);
end,
["UNIT_FACTION"] = function(frame)
updatePVP(frame, frame.unit);
- updateHealthColor(frame, frame.unit);
+ updateHealthColor(frame, frame.displayed);
end,
["PARTY_LEADER_CHANGED"] = function(frame)
updateLeaderIcon(frame, frame.unit);
updateStatus(frame, frame.unit);
updatePVP(frame, frame.unit);
updateLeaderIcon(frame, frame.unit);
- updateHealthColor(frame, frame.unit);
+ updateHealthColor(frame, frame.displayed);
end,
};
eventFuncs["UNIT_HEALTH_FREQUENT"] = eventFuncs["UNIT_HEALTH"];
"PLAYER_ENTERING_WORLD",
"PLAYER_TARGET_CHANGED",
},
+ ["pet"] = {
+ "UNIT_ENTERED_VEHICLE",
+ "UNIT_EXITED_VEHICLE",
+ "UNIT_PET",
+ "PLAYER_ENTERING_WORLD",
+ "PLAYER_LEVEL_UP",
+ "PLAYER_REGEN_DISABLED",
+ "PLAYER_REGEN_ENABLED",
+ },
};
local M = {};
frame:UnregisterAllEvents();
end
-local function showTooltip(frame)
- GameTooltip_SetDefaultAnchor(GameTooltip, frame);
- GameTooltip:SetUnit(frame:GetAttribute("unit"));
+local function showTooltip(secure)
+ GameTooltip_SetDefaultAnchor(GameTooltip, secure);
+ GameTooltip:SetUnit(secure:GetAttribute("unit"));
end
-local function hideTooltip(frame)
+local function hideTooltip(secure)
GameTooltip:FadeOut();
end
-local function setupFrame(frame, secure, unit)
+local function setupFrame(frame, secure, unit, width, height)
secure:SetAttribute("unit", unit);
frame:SetAttribute("unit", unit);
frame.unit = unit;
frame.vehicle = unit.."pet";
end
-- create visuals
+ secure:SetWidth(width+2);
+ secure:SetHeight(height+2);
+ frame:SetWidth(width+2);
+ frame:SetHeight(height+2);
+ frame.width = width;
frame.base = frame:CreateTexture(nil, "BACKGROUND");
frame.base:SetAllPoints();
frame.base:SetColorTexture(1, 1, 1);
frame.leader:SetPoint("TOPLEFT", frame.healthback, "TOPLEFT", -6, 6);
frame.leader:SetPoint("BOTTOMRIGHT", frame.healthback, "TOPLEFT", 6, -6);
frame.leader:Hide();
- frame.name = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightLarge");
- frame.name:SetPoint("LEFT", frame.healthback, "LEFT", 2, 1);
- frame.level = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
- frame.level:SetPoint("LEFT", frame.manaback, "LEFT", 2, 1);
+ if unit ~= "pet" then
+ frame.name = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlightLarge");
+ frame.name:SetPoint("LEFT", frame.healthback, "LEFT", 2, 1);
+ frame.level = frame:CreateFontString(nil, "OVERLAY", "GameFontHighlight");
+ frame.level:SetPoint("LEFT", frame.manaback, "LEFT", 2, 1);
+ end
-- set scripts
frame:SetScript("OnShow", frameShow);
frame:SetScript("OnHide", frameHide);
local frame = CreateFrame("Frame", "OmaPlayer", parent);
local unit = "player";
secure:SetPoint("CENTER", parent, "CENTER", -300, -175);
- secure:SetWidth(width+2);
- secure:SetHeight(height+2);
frame:SetPoint("CENTER", parent, "CENTER", -300, -175);
- frame:SetWidth(width+2);
- frame:SetHeight(height+2);
- setupFrame(frame, secure, unit);
+ setupFrame(frame, secure, unit, width, height);
+ RegisterUnitWatch(frame);
+ RegisterUnitWatch(secure);
+ --RegisterStateDriver(secure, "vehicleui", "[vehicleui] vehicle; no");
+ --secure:SetAttribute("_onstate-vehicleui", vehicletoggle);
+end
+
+local function initializePet(parent)
+ local secure = CreateFrame("Button", "OmaPetSecure", parent, inheritedFrames);
+ local frame = CreateFrame("Frame", "OmaPet", parent);
+ local unit = "pet";
+ secure:SetPoint("TOPRIGHT", parent, "TOPLEFT", -10, 0);
+ frame:SetPoint("TOPRIGHT", parent, "TOPLEFT", -10, 0);
+ setupFrame(frame, secure, unit, width/2, height/2);
RegisterUnitWatch(frame);
RegisterUnitWatch(secure);
- RegisterStateDriver(secure, "vehicleui", "[vehicleui] vehicle; no");
- secure:SetAttribute("_onstate-vehicleui", vehicletoggle);
end
local function initializeTarget(parent)
local frame = CreateFrame("Frame", "OmaTarget", parent);
local unit = "target";
secure:SetPoint("CENTER", parent, "CENTER", 300, -175);
- secure:SetWidth(width+2);
- secure:SetHeight(height+2);
frame:SetPoint("CENTER", parent, "CENTER", 300, -175);
- frame:SetWidth(width+2);
- frame:SetHeight(height+2);
- setupFrame(frame, secure, unit);
+ setupFrame(frame, secure, unit, width, height);
createAuraFrame(frame, unit);
RegisterUnitWatch(frame);
RegisterUnitWatch(secure);
- RegisterStateDriver(secure, "vehicleui", "[vehicleui] vehicle; no");
- secure:SetAttribute("_onstate-vehicleui", vehicletoggle);
end
local function loadCharSettings()
GameTooltip = _G["GameTooltip"];
GameTooltip_SetDefaultAnchor = _G["GameTooltip_SetDefaultAnchor"];
initializePlayer(UIParent);
+ initializePet(_G["OmaPlayer"]);
initializeTarget(UIParent);
-- TODO boss frames, pet frame, (arena frames)
end
if hidden then return end
hidden = true;
- for _, frame in pairs({PlayerFrame, TargetFrame, TargetFrameToT}) do
+ for _, frame in pairs({PlayerFrame, TargetFrame, TargetFrameToT, PetFrame}) do
frame:UnregisterAllEvents();
frame.healthbar:UnregisterAllEvents();
frame.manabar:UnregisterAllEvents();