I did a rewrite of your code, i could tell its really messy
Check it out and tell me if it works as desired, i kept your way of canceling the timers.
Code:
assert(LoadAddOn("Blizzard_TimeManager"))
local DHMB
local Minimap_Buttons = {
GameTimeFrame,
GarrisonLandingPageMinimapButton,
GuildInstanceDifficulty,
MiniMapChallengeMode,
MiniMapInstanceDifficulty,
MiniMapTracking,
MiniMapTrackingButton,
MiniMapWorldMapButton,
MinimapZoneTextButton,
MinimapZoomIn,
MinimapZoomOut,
QueueStatusMinimapButton,
TimeManagerClockButton,
}
local function Stop_Minimap_Loop_Pulse_Anim()
GarrisonLandingPageMinimapButton.MinimapLoopPulseAnim:Stop()
end
local function Hide_MinimapBorderTop_MinimapButtons()
MinimapBorderTop:SetAlpha(0)
for _, frame in pairs(Minimap_Buttons) do
frame:SetAlpha(0)
end
end
local function OnEnter()
if DHMB then DHMB:Cancel() end
for _, frame in pairs(Minimap_Buttons) do
frame:SetAlpha(1)
end
MinimapBorderTop:SetAlpha(1)
Stop_Minimap_Loop_Pulse_Anim()
end
local function OnLeave()
DHMB = C_Timer.NewTimer(.25, Hide_MinimapBorderTop_MinimapButtons)
Stop_Minimap_Loop_Pulse_Anim()
end
local function SetupHooks(frame)
frame:HookScript("OnEnter", OnEnter)
frame:HookScript("OnLeave", OnLeave)
end
SetupHooks(MiniMapMailFrame)
SetupHooks(Minimap)
MinimapBorderTop:SetAlpha(0)
for _, frame in pairs(Minimap_Buttons) do
SetupHooks(frame):
frame:SetAlpha(0)
end
Edit:
Something to point out, some mistakes you made:
- HookScript only takes one function, you inserted multiple ones
- many code parts got executed in the same situations as other, i combined this into one function to clean it up
- you were running code that didn't use loop objects or variables in a loop which is unecessary (running Minimap:HookScript inside the loop over your minimap buttons.)
- dont use global variables if you dont need to. (DHMB was global)
Happy learning