MIRRORTIMER_NUMTIMERS = 3; MirrorTimerColors = { }; MirrorTimerColors["EXHAUSTION"] = { r = 1.00, g = 0.90, b = 0.00 }; MirrorTimerColors["BREATH"] = { r = 0.00, g = 0.50, b = 1.00 }; MirrorTimerColors["DEATH"] = { r = 1.00, g = 0.70, b = 0.00 }; MirrorTimerColors["FEIGNDEATH"] = { r = 1.00, g = 0.70, b = 0.00 }; function MirrorTimer_Show(timer, value, maxvalue, scale, paused, label) -- Pick a free dialog to use local dialog = nil; if ( not dialog ) then -- Find an open dialog of the requested type for index = 1, MIRRORTIMER_NUMTIMERS, 1 do local frame = _G["MirrorTimer"..index]; if ( frame:IsShown() and (frame.timer == timer) ) then dialog = frame; break; end end end if ( not dialog ) then -- Find a free dialog for index = 1, STATICPOPUP_NUMDIALOGS, 1 do local frame = _G["MirrorTimer"..index]; if ( not frame:IsShown() ) then dialog = frame; break; end end end if ( not dialog ) then return nil; end dialog.timer = timer; dialog.value = (value / 1000); dialog.scale = scale; if ( paused > 0 ) then dialog.paused = 1; else dialog.paused = nil; end -- Set the text of the dialog local text = _G[dialog:GetName().."Text"]; text:SetText(label); -- Set the status bar of the dialog local statusbar = _G[dialog:GetName().."StatusBar"]; local color = MirrorTimerColors[timer]; statusbar:SetMinMaxValues(0, (maxvalue / 1000)); statusbar:SetValue(dialog.value); statusbar:SetStatusBarColor(color.r, color.g, color.b); dialog:Show(); return dialog; end function MirrorTimerFrame_OnLoad(self) self:RegisterEvent("MIRROR_TIMER_PAUSE"); self:RegisterEvent("MIRROR_TIMER_STOP"); self:RegisterEvent("PLAYER_ENTERING_WORLD"); self.timer = nil; end function MirrorTimerFrame_OnEvent(self, event, ...) if ( event == "PLAYER_ENTERING_WORLD" ) then for index=1, MIRRORTIMER_NUMTIMERS do local timer, value, maxvalue, scale, paused, label = GetMirrorTimerInfo(index); if ( timer == "UNKNOWN") then self:Hide(); self.timer = nil; else MirrorTimer_Show(timer, value, maxvalue, scale, paused, label) end end end local arg1 = ...; if ( not self:IsShown() or (arg1 ~= self.timer) ) then return; end if ( event == "MIRROR_TIMER_PAUSE" ) then if ( arg1 > 0 ) then self.paused = 1; else self.paused = nil; end return; elseif ( event == "MIRROR_TIMER_STOP" ) then self:Hide(); self.timer = nil; end end function MirrorTimerFrame_OnUpdate(frame, elapsed) if ( frame.paused ) then return; end local statusbar = _G[frame:GetName().."StatusBar"]; frame.value = GetMirrorTimerProgress(frame.timer) / 1000; statusbar:SetValue(frame.value); end