local module = ArcHUD:NewModule("MirrorTimer") module.unit = "player" module.defaults = { Enabled = true, Outline = true, ShowSpell = true, Side = 1, Level = -1, } module.options = { {name = "ShowSpell", text = "SHOWSPELL", tooltip = "SHOWSPELL"}, attach = true, } module.localized = true module.disableEvents = { {frame = "MirrorTimer1", hide = TRUE, events = {"MIRROR_TIMER_PAUSE", "MIRROR_TIMER_STOP", "PLAYER_ENTERING_WORLD"}}, {frame = "MirrorTimer2", hide = TRUE, events = {"MIRROR_TIMER_PAUSE", "MIRROR_TIMER_STOP", "PLAYER_ENTERING_WORLD"}}, {frame = "MirrorTimer3", hide = TRUE, events = {"MIRROR_TIMER_PAUSE", "MIRROR_TIMER_STOP", "PLAYER_ENTERING_WORLD"}}, {frame = "UIParent", hide = FALSE, events = {"MIRROR_TIMER_START"}}, } function module:Initialize() -- Setup the frame we need self.f = self:CreateRing(true, ArcHUDFrame) self.f:SetAlpha(0) self.Text = {} self.Text[1] = self:CreateFontString(self.f, "BACKGROUND", {140, 16}, 14, "CENTER", {1.0, 1.0, 1.0}, {"BOTTOM", "ArcHUDFrameCombo", "TOP", 0, 96}) self.Text[2] = self:CreateFontString(self.f, "BACKGROUND", {140, 16}, 14, "CENTER", {1.0, 1.0, 1.0}, {"TOPLEFT", self.Text[1], "BOTTOMLEFT", 0, 0}) self.Text[3] = self:CreateFontString(self.f, "BACKGROUND", {140, 16}, 14, "CENTER", {1.0, 1.0, 1.0}, {"TOPLEFT", self.Text[2], "BOTTOMLEFT", 0, 0}) -- Override Update timer self:RegisterMetro(self.name .. "Update", self.UpdateTimers, 0.05, self) end function module:Update() if(self.db.profile.ShowSpell) then for i=1,3 do self.Text[i]:Show() end else for i=1,3 do self.Text[i]:Hide() end end if(self.db.profile.Outline) then self.f.BG:Show() else self.f.BG:Hide() end -- Clear all points for the ring self.f:ClearAllPoints() if(self.db.profile.Side == 1) then -- Attach to left side self.f:SetPoint("TOPLEFT", self.parent:GetModule("Anchors").Left, "TOPLEFT", self.db.profile.Level * -15, 0) self.f.BG:SetReversed(false) self.f:SetReversed(false) else -- Attach to right side self.f:SetPoint("TOPRIGHT", self.parent:GetModule("Anchors").Right, "TOPRIGHT", self.db.profile.Level * 15, 0) self.f.BG:SetReversed(true) self.f:SetReversed(true) end self.f.BG:SetAngle(180) end function module:Enable() self.f.fadeIn = 0.25 self.f.fadeOut = 2 self.f.dirty = true -- Register the events we will use self:RegisterEvent("MIRROR_TIMER_START") self:RegisterEvent("MIRROR_TIMER_PAUSE") self:RegisterEvent("MIRROR_TIMER_STOP") self:RegisterEvent("PLAYER_ENTERING_WORLD") -- Activate the timers self:StartMetro(self.name .. "Update") self:StartMetro(self.name .. "Alpha") self:StartMetro(self.name .. "Fade") if(not self.timers) then self.timers = {count = 0} self.timer = 0 end self.f:Show() end function module:UpdateTimers(elapsed) for i=1,MIRRORTIMER_NUMTIMERS do if(self.timers[i] and not self.timers[i].paused) then self.timers[i].value = self.timers[i].value + self.timers[i].scale * elapsed*1000 if(self.timers[i].value > self.timers[i].maxvalue) then self.timers[i].value = self.timers[i].maxvalue end --self:Msg("Updating timer %d: %d time elapsed, value now: %d", i, elapsed*1000, self.timers[i].value) if(self.timer == i) then self.f:SetMax(self.timers[i].maxvalue) self.f:SetValue(self.timers[i].value) end local texttime = "" local time_remaining = self.timers[i].value if((time_remaining/1000) > 60) then local minutes = math.floor(time_remaining/60000) local seconds = math.floor(((time_remaining/60000) - minutes) * 60) if(seconds < 10) then texttime = minutes..":0"..seconds else texttime = minutes..":"..seconds end else local intlength = string.len(string.format("%u",time_remaining/1000)) texttime = strsub(string.format("%f",time_remaining/1000),1,intlength+2) end self.Text[i]:SetText(self.timers[i].label..": "..texttime) else self.Text[i]:SetText("") end end end function module:MIRROR_TIMER_START() -- Find a free timer table local updTimer, newTimer for i=1,MIRRORTIMER_NUMTIMERS do if(self.timers[i] and self.timers[i].timer == arg1) then updTimer = i break end end if(not updTimer) then for i=1,MIRRORTIMER_NUMTIMERS do if(not self.timers[i]) then newTimer = i break end end end if(newTimer) then -- Add timer to table self.timers[newTimer] = { timer = arg1, value = arg2, maxvalue = arg3, scale = arg4, paused = (arg5 > 0 and arg5 or nil), label = arg6, } -- Switch ring color to the new timer self.f:UpdateColor(MirrorTimerColors[arg1]) self.timer = newTimer self.timers.count = self.timers.count + 1 --self:Msg("Adding new timer %d: %s, %d, %d, %d, %d, %s", newTimer, arg1, arg2, arg3, arg4, arg5, arg6) elseif(updTimer) then -- Update existing timer self.timers[updTimer] = { timer = arg1, value = arg2, maxvalue = arg3, scale = arg4, paused = (arg5 > 0 and arg5 or nil), label = arg6, } --self:Msg("Updating timer %d: %s, %d, %d, %d, %d, %s", updTimer, arg1, arg2, arg3, arg4, arg5, arg6) end if(ArcHUD.db.profile.FadeIC > ArcHUD.db.profile.FadeOOC) then self.f:SetRingAlpha(ArcHUD.db.profile.FadeIC) else self.f:SetRingAlpha(ArcHUD.db.profile.FadeOOC) end end function module:MIRROR_TIMER_PAUSE() for i=1,MIRRORTIMER_NUMTIMERS do if(self.timers[i]) then self.timers[i].paused = (arg1 > 0 and 1 or nil) end end end function module:MIRROR_TIMER_STOP() for i=1,MIRRORTIMER_NUMTIMERS do if(self.timers[i] and self.timers[i].timer == arg1) then if(self.timers[i+1]) then self.timers[i] = self.timers[i+1] self.timers[i+1] = nil else self.timers[i] = nil end self.timers.count = self.timers.count - 1 --self:Msg("Stopping timer %d: %s", i, arg1) end end if(self.timers.count == 0) then --self:Msg("No timers left, hiding") self.f:SetRingAlpha(0) else if(not self.timers[self.timer]) then for i=MIRRORTIMER_NUMTIMERS,1,-1 do if(self.timers[i]) then self.timer = i self.f:UpdateColor(MirrorTimerColors[self.timers[i].timer]) break end end end end end function module:PLAYER_ENTERING_WORLD() for i=1,MIRRORTIMER_NUMTIMERS do self.timers[i] = nil end self.timers.count = 0 self.f:SetRingAlpha(0) end