Hide + Make non-interactive Frames during combat

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)