For some reason the Blizzard damage meters frame in edit mode for visibility only has 3 options. Always Visible, In Combat and Hidden. I want the Frame to only be shown and interactive outside of combat. Why isn’t this an option?
I tried to use various addons that all only effect the visibility, but don’t do anything for the interaction aspect. Like I don’t want my mouse clicks over that part of my screen to be absorbed by the hidden frame, which does occur.
I then decided to have Claude create an addon, but problems with taint errors occurred with every attempt at making the frame non-interactive during combat.
This is the code and where Claude informed me to get help from someone more knowledgeable on the matter. Thanks in advance for any help.
“How do I make a SecureActionButtonTemplate block all mouse interaction without also preventing camera rotation via click-and-drag on the game world behind it?”
– DPSMeterHider
-- Hides the Blizzard Damage Meter during combat using alpha fade (0.5s).
-- Fades it back in when leaving combat.
--
-- Requires the Damage Meter to be enabled in:
-- Options > Gameplay Enhancements > Damage Meter
local FADE_DURATION = 0.5
local METER_FRAME_NAME = “DamageMeter”
local overlays = {}
local overlaysCreated = false
local NEEDS_UIPARENT_OVERLAY = {
DamageMeterSessionWindow1 = true,
DamageMeterSessionWindow2 = true,
}
local function CreateUIParentOverlay(target, index)
local ov = CreateFrame(“Button”, “DPSMeterHiderOverlay” .. index, UIParent, “SecureActionButtonTemplate”)
ov:SetFrameStrata(“TOOLTIP”)
ov:SetFrameLevel(100)
ov:EnableMouse(true)
ov:SetAttribute(“type”, “”)
ov:Hide()
local ok = pcall(function()
ov:SetPoint(“TOPLEFT”, target, “TOPLEFT”, 0, 0)
ov:SetPoint(“BOTTOMRIGHT”, target, “BOTTOMRIGHT”, 0, 0)
end)
if not ok then
ov:SetAllPoints(_G[METER_FRAME_NAME])
end
RegisterStateDriver(ov, “visibility”, “[combat] show; hide”)
overlays[#overlays + 1] = ov
end
local function SetupOverlays()
if overlaysCreated then return end
local root = _G[METER_FRAME_NAME]
if not root then return end
local targets = {}
if root:IsMouseEnabled() then
targets[#targets + 1] = root
end
local n = root:GetNumChildren()
for i = 1, n do
local child = select(i, root:GetChildren())
if child:IsMouseEnabled() then
targets[#targets + 1] = child
end
end
for i, target in ipairs(targets) do
local name = target:GetName()
if name and NEEDS_UIPARENT_OVERLAY[name] then
CreateUIParentOverlay(target, i)
else
local ov = CreateFrame(“Button”, “DPSMeterHiderOverlay” .. i, target, “SecureActionButtonTemplate”)
ov:SetFrameLevel(target:GetFrameLevel() + 500)
ov:EnableMouse(true)
ov:SetAttribute(“type”, “”)
ov:Hide()
local ok = pcall(function() ov:SetAllPoints(target) end)
if ok then
RegisterStateDriver(ov, “visibility”, “[combat] show; hide”)
overlays[#overlays + 1] = ov
else
ov:SetParent(nil)
end
end
end
overlaysCreated = true
end
local activeTicker = nil
local function CancelActiveTicker()
if activeTicker then
activeTicker:Cancel()
activeTicker = nil
end
end
local function FadeOut(f)
if not f then return end
CancelActiveTicker()
local startAlpha = f:GetAlpha()
local elapsed = 0
local tickRate = 0.016
local ticks = math.ceil(FADE_DURATION / tickRate)
activeTicker = C_Timer.NewTicker(tickRate, function()
elapsed = elapsed + tickRate
local progress = math.min(elapsed / FADE_DURATION, 1)
f:SetAlpha(startAlpha * (1 - progress))
if progress >= 1 then
CancelActiveTicker()
end
end, ticks)
end
local function FadeIn(f)
if not f then return end
CancelActiveTicker()
local startAlpha = f:GetAlpha()
local elapsed = 0
local tickRate = 0.016
local ticks = math.ceil(FADE_DURATION / tickRate)
activeTicker = C_Timer.NewTicker(tickRate, function()
elapsed = elapsed + tickRate
local progress = math.min(elapsed / FADE_DURATION, 1)
f:SetAlpha(startAlpha + (1 - startAlpha) * progress)
if progress >= 1 then
CancelActiveTicker()
end
end, ticks)
end
local function OnCombatStart()
FadeOut(_G[METER_FRAME_NAME])
end
local function OnCombatEnd()
FadeIn(_G[METER_FRAME_NAME])
end
local eventFrame = CreateFrame(“Frame”, “DPSMeterHiderFrame”, UIParent)
eventFrame:RegisterEvent(“ADDON_LOADED”)
eventFrame:RegisterEvent(“PLAYER_REGEN_DISABLED”)
eventFrame:RegisterEvent(“PLAYER_REGEN_ENABLED”)
eventFrame:SetScript(“OnEvent”, function(self, event, arg1)
if event == “ADDON_LOADED” then
if arg1 == “DPSMeterHider” then
print(“|cff00ccff[DPSMeterHider]|r Loaded. Blizzard Damage Meter will hide during combat.”)
print(“|cff00ccff[DPSMeterHider]|r Tip: Make sure Damage Meter is enabled under Options > Gameplay Enhancements.”)
SetupOverlays()
end
if arg1 == “Blizzard_DamageMeter” then
SetupOverlays()
if InCombatLockdown() then
local f = _G[METER_FRAME_NAME]
if f then f:SetAlpha(0) end
end
end
elseif event == “PLAYER_REGEN_DISABLED” then
OnCombatStart()
elseif event == “PLAYER_REGEN_ENABLED” then
OnCombatEnd()
end
end)