From 7cd9b15270a53b3c833f41e00ed755a30e22b2ef Mon Sep 17 00:00:00 2001 From: Aleksi Blinnikka Date: Wed, 31 Jan 2018 05:11:13 +0200 Subject: [PATCH 1/1] Add pet frame, remove mana bars from non-healers Starting to be messy, cleanup required --- OmaRF/Events.lua | 88 ++++++++++++++++++++++++++++++++++------ OmaRF/Indicators.lua | 60 +++++++++++++++++++++++---- OmaRF/RaidFrame.lua | 96 +++++++++----------------------------------- OmaRF/Settings.lua | 33 ++++++++------- OmaUF/Events.lua | 43 ++++++++++++-------- OmaUF/UnitFrames.lua | 66 +++++++++++++++++++----------- 6 files changed, 233 insertions(+), 153 deletions(-) diff --git a/OmaRF/Events.lua b/OmaRF/Events.lua index 0932ec1..aeafc6a 100644 --- a/OmaRF/Events.lua +++ b/OmaRF/Events.lua @@ -34,17 +34,45 @@ local width = Settings.Width; 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); @@ -54,8 +82,13 @@ function M.RegisterEvents(frame) 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; @@ -208,8 +241,14 @@ local function updateHealAbsorb(frame, unit) 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)); @@ -246,12 +285,12 @@ local function updateVehicle(frame) 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 @@ -260,11 +299,23 @@ local function updateRole(frame, unit) 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 @@ -284,6 +335,10 @@ local function updateReadyCheck(frame, unit) end end +local function updateRaidMarker(frame, unit) + --print(unit, "marker"); +end + local eventFuncs = { ["UNIT_HEALTH"] = function(frame) updateHealth(frame, frame.displayed); @@ -291,6 +346,9 @@ local eventFuncs = { 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); @@ -346,7 +404,11 @@ local eventFuncs = { ["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); @@ -358,11 +420,11 @@ local eventFuncs = { 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"]; diff --git a/OmaRF/Indicators.lua b/OmaRF/Indicators.lua index b3c7d07..3ecdcf6 100644 --- a/OmaRF/Indicators.lua +++ b/OmaRF/Indicators.lua @@ -8,8 +8,9 @@ local CTimerAfter = C_Timer.After; 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 = {}; @@ -18,6 +19,49 @@ local auraFilters = {"HELPFUL", "HARMFUL"}; 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(""); @@ -74,6 +118,7 @@ function M.CheckIndicators(frame, unit) 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; @@ -88,7 +133,8 @@ function M.CheckIndicators(frame, unit) 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); @@ -98,6 +144,9 @@ function M.CheckIndicators(frame, unit) 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 @@ -121,9 +170,6 @@ function M.CheckIndicators(frame, unit) frame.inds:Hide(); frame.major:Hide(); end -end -function M.LoadChar() - watchedAuras = Settings.Character["WatchedAuras"]; - positions = Settings.Character.Positions; + return alert; end diff --git a/OmaRF/RaidFrame.lua b/OmaRF/RaidFrame.lua index 783cdeb..ad802cb 100644 --- a/OmaRF/RaidFrame.lua +++ b/OmaRF/RaidFrame.lua @@ -11,10 +11,11 @@ local GameTooltip = nil; 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; @@ -24,7 +25,6 @@ local healpredColor = Settings.HealpredColor; 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 = {}; @@ -36,44 +36,6 @@ local raid = {}; 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 @@ -86,21 +48,10 @@ local function unitUpdate(self, elapsed) 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) @@ -108,12 +59,12 @@ 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 @@ -124,11 +75,8 @@ local function setupFrame(frame, secure, unit) 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); @@ -145,16 +93,13 @@ local function setupFrame(frame, secure, unit) 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"); @@ -178,12 +123,11 @@ local function setupFrame(frame, secure, unit) 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"); @@ -198,8 +142,8 @@ local function setupFrame(frame, secure, unit) 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); @@ -207,9 +151,6 @@ local function setupFrame(frame, secure, unit) 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 @@ -325,14 +266,16 @@ end 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); @@ -389,7 +332,6 @@ CFrame:RegisterEvent("PLAYER_REGEN_ENABLED"); CFrame:SetScript("OnEvent", function(self, event, addon) if event == "PLAYER_LOGIN" then OmaRFLoadChar(); - OmaRFIndicators.LoadChar(); hideBlizzardRaid(); initialize(); elseif event == "PLAYER_REGEN_ENABLED" then diff --git a/OmaRF/Settings.lua b/OmaRF/Settings.lua index 2015a1a..ef6d46b 100644 --- a/OmaRF/Settings.lua +++ b/OmaRF/Settings.lua @@ -98,23 +98,26 @@ local settings = { }, 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; diff --git a/OmaUF/Events.lua b/OmaUF/Events.lua index 7b39aeb..cbc8b0a 100644 --- a/OmaUF/Events.lua +++ b/OmaUF/Events.lua @@ -24,7 +24,6 @@ local Settings = OmaUFSettings; local baseColor = Settings.BaseColor; local healthColor = Settings.HealthColor; local powerColors = Settings.PowerColors; -local width = Settings.Width; local M = {}; OmaUFEvents = M; @@ -62,13 +61,13 @@ local function updateHealth(frame, unit) 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 @@ -85,8 +84,16 @@ local function updateHealthText(frame, unit) 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(); @@ -109,15 +116,15 @@ local function updatePower(frame, unit) 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 @@ -143,6 +150,7 @@ local function updatePowerColor(frame, unit) 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)); @@ -152,8 +160,8 @@ local function updateHealPred(frame, unit) 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 @@ -165,8 +173,8 @@ local function updateShield(frame, unit) 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(); @@ -190,7 +198,7 @@ local function updateHealAbsorb(frame, unit) 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 @@ -237,6 +245,7 @@ local function updateRole(frame, unit) end local function updateLevelText(frame, unit, levelup) + if not frame.level then return end if levelup then -- PLAYER_LEVEL_UP frame.level:SetText(levelup); @@ -388,7 +397,7 @@ local eventFuncs = { 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); @@ -416,7 +425,7 @@ local eventFuncs = { 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); @@ -441,7 +450,7 @@ local eventFuncs = { 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"]; diff --git a/OmaUF/UnitFrames.lua b/OmaUF/UnitFrames.lua index f4b7521..2c338f0 100644 --- a/OmaUF/UnitFrames.lua +++ b/OmaUF/UnitFrames.lua @@ -51,6 +51,15 @@ local events = { "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 = {}; @@ -68,16 +77,16 @@ local function frameHide(frame) 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; @@ -90,6 +99,11 @@ local function setupFrame(frame, secure, 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); @@ -163,10 +177,12 @@ local function setupFrame(frame, secure, unit) 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); @@ -198,16 +214,23 @@ local function initializePlayer(parent) 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) @@ -215,17 +238,11 @@ 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() @@ -239,6 +256,7 @@ local function initialize() GameTooltip = _G["GameTooltip"]; GameTooltip_SetDefaultAnchor = _G["GameTooltip_SetDefaultAnchor"]; initializePlayer(UIParent); + initializePet(_G["OmaPlayer"]); initializeTarget(UIParent); -- TODO boss frames, pet frame, (arena frames) end @@ -248,7 +266,7 @@ local function hideBlizzardFrames() 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(); -- 2.39.5