X-Git-Url: https://www.aleksib.fi/git/wowui.git/blobdiff_plain/d180f82975c6b13a3380bd8df5ab47df70112c49..d89467e02ca50fb6e77a6b39cf940c6de28a7bcc:/OmaRF/RaidFrame.lua?ds=sidebyside diff --git a/OmaRF/RaidFrame.lua b/OmaRF/RaidFrame.lua index 31ef192..015ce88 100644 --- a/OmaRF/RaidFrame.lua +++ b/OmaRF/RaidFrame.lua @@ -4,16 +4,16 @@ local unpack, pairs, rawget = unpack, pairs, rawget; local format = string.format; local UnitHealthMax, UnitPowerMax = UnitHealthMax, UnitPowerMax; local UnitInRange = UnitInRange; +local InCombatLockdown = InCombatLockdown; local CreateFrame, RegisterStateDriver, RegisterUnitWatch = CreateFrame, RegisterStateDriver, RegisterUnitWatch; local STANDARD_TEXT_FONT = STANDARD_TEXT_FONT; +local GameTooltip = nil; +local GameTooltip_SetDefaultAnchor = nil; local registerEvents = OmaRFEvents.RegisterEvents; local unitEvent = OmaRFEvents.UnitEvent; local Settings = OmaRFSettings; -local positions = Settings.Positions; -local width, height = Settings.Character.Width, Settings.Character.Height; -local anchorX, anchorY = Settings.Character.AnchorX, Settings.Character.AnchorY; local indSize = Settings.IndSize; local baseColor = Settings.BaseColor; local bgColor = Settings.BgColor; @@ -22,7 +22,11 @@ local shieldColor = Settings.ShieldColor; local shieldhlColor = Settings.ShieldhlColor; local healpredColor = Settings.HealpredColor; local healabsorbColor = Settings.HealabsorbColor; -local attributes = Settings.Character.Clickheal; +-- placeholders with visible values when error happens +local positions = {}; +local width, height = 10, 10; +local anchorX, anchorY = 10, 10; +local attributes = {}; local CFrame = CreateFrame("Frame", "OmaRFFrame", UIParent); local inheritedFrames = "SecureUnitButtonTemplate,SecureHandlerStateTemplate"; @@ -56,7 +60,7 @@ local function setupIndicators(frame) if i == 1 then frame.major[i]:SetPoint("TOPLEFT", frame.major, "TOPLEFT"); else - frame.major[i]:SetPoint("TOPLEFT", frame.major[i-1], "TOPLEFT"); + frame.major[i]:SetPoint("TOPLEFT", frame.major[i-1], "TOPRIGHT"); end frame.major[i]:SetWidth(indSize*2); frame.major[i]:SetHeight(indSize*2); @@ -89,6 +93,11 @@ local function frameShow(frame) 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); frame:SetScript("OnUpdate", unitUpdate); unitEvent(frame, "UPDATE_ALL_BARS", frame.displayed); @@ -99,6 +108,15 @@ local function frameHide(frame) frame:SetScript("OnUpdate", nil); end +local function showTooltip(frame) + GameTooltip_SetDefaultAnchor(GameTooltip, PlayerFrame); + GameTooltip:SetUnit(frame:GetAttribute("unit")); +end + +local function hideTooltip(frame) + GameTooltip:FadeOut(); +end + local function setupFrame(frame, secure, unit) secure:SetAttribute("unit", unit); frame:SetAttribute("unit", unit); @@ -179,12 +197,21 @@ local function setupFrame(frame, secure, unit) frame.rez:SetPoint("BOTTOMRIGHT", frame.background, "CENTER", 12, -12); 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:Hide(); -- set up indicators setupIndicators(frame); -- set scripts 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 secure:RegisterForClicks("AnyDown"); for attr, val in pairs(attributes) do @@ -281,17 +308,100 @@ local function initializeRaid(parent) end end +local function initializeFocus(parent) + local secure = CreateFrame("Button", "OmaFocusSecure", parent, inheritedFrames); + local frame = CreateFrame("Frame", "OmaFocus", parent); + local unit = "focus"; + secure:SetPoint("BOTTOMLEFT", parent, "TOPLEFT"); + frame:SetPoint("BOTTOMLEFT", parent, "TOPLEFT"); + setupFrame(frame, secure, unit); + RegisterUnitWatch(frame); + RegisterUnitWatch(secure); + local vehicle = format("[@%s,unithasvehicleui] vehicle; no", unit); + RegisterStateDriver(secure, "vehicleui", vehicle); + secure:SetAttribute("_onstate-vehicleui", vehicletoggle); +end + local function initialize() CFrame:SetPoint("CENTER", nil, "CENTER", anchorX, anchorY); CFrame:SetHeight((height+2)*8); CFrame:SetWidth((width+2)*5+1); initializeParty(CFrame); initializeRaid(CFrame); + initializeFocus(CFrame); +end + +local function loadCharSettings() + width, height = Settings.Character.Width, Settings.Character.Height; + anchorX, anchorY = Settings.Character.AnchorX, Settings.Character.AnchorY; + attributes = Settings.Character.Clickheal; + positions = Settings.Character.Positions; +end + +-- hiding Blizzard frames somewhat based on ShadowedUF +local function hideBlizzardRaidButton() + if InCombatLockdown() then return end + local manager = CompactRaidFrameManager; + -- remove show and unlock buttons from manager + manager.displayFrame.hiddenModeToggle:Hide(); + manager.displayFrame.lockedModeToggle:Hide(); +end + +local hidden = false; +local function hideBlizzardRaid() + if hidden then return end + hidden = true; + local function hide() + if InCombatLockdown() then return end + CompactRaidFrameContainer:Hide(); + local shown = CompactRaidFrameManager_GetSetting("IsShown"); + if shown and shown ~= "0" then + CompactRaidFrameManager_SetSetting("IsShown", "0"); + end + end + + CompactRaidFrameContainer:UnregisterAllEvents(); + -- there may still be frames created at startup getting events + for i=1,MAX_RAID_MEMBERS do + local frame = _G["CompactRaidFrame"..i]; + if not frame then break end + frame:UnregisterAllEvents(); + end + hooksecurefunc("CompactRaidFrameManager_UpdateShown", hide); + hide(); + CompactRaidFrameContainer:HookScript("OnShow", hide); + hooksecurefunc("CompactRaidFrameManager_UpdateOptionsFlowContainer", hideBlizzardRaidButton); + hideBlizzardRaidButton(); + + -- hide focus frame + for _, frame in pairs({FocusFrame, FocusFrameToT}) do + frame:UnregisterAllEvents(); + frame.healthbar:UnregisterAllEvents(); + frame.manabar:UnregisterAllEvents(); + if frame.spellbar then frame.spellbar:UnregisterAllEvents() end + if frame.powerBarAlt then frame.powerBarAlt:UnregisterAllEvents() end + frame:Hide(); + end end +CFrame:RegisterEvent("ADDON_LOADED"); CFrame:RegisterEvent("PLAYER_LOGIN"); -CFrame:SetScript("OnEvent", function(self, event) +CFrame:RegisterEvent("PLAYER_REGEN_ENABLED"); +CFrame:SetScript("OnEvent", function(self, event, addon) if event == "PLAYER_LOGIN" then + hideBlizzardRaid(); initialize(); + elseif event == "ADDON_LOADED" and addon == "Blizzard_CompactRaidFrames" then + -- never really happening unless load order changes + hideBlizzardRaid(); + elseif event == "PLAYER_REGEN_ENABLED" then + -- if CompactRaidFrameManager_UpdateOptionsFlowContainer was called in combat + -- couldn't hide the button + hideBlizzardRaidButton(); + elseif event == "ADDON_LOADED" and addon == "OmaRF" then + OmaRFLoadChar(); + loadCharSettings(); + OmaRFEvents.LoadChar(); + OmaRFIndicators.LoadChar(); end end);