Gladdy-TBC/Modules/ShadowsightTimer.lua
2022-01-25 19:58:51 +01:00

435 lines
15 KiB
Lua

local floor, str_find, pairs = math.floor, string.find, pairs
local CreateFrame = CreateFrame
---------------------------
-- CORE
---------------------------
local Gladdy = LibStub("Gladdy")
local L = Gladdy.L
local ShadowsightTimer = Gladdy:NewModule("Shadowsight Timer", nil, {
shadowsightTimerEnabled = true,
shadowsightTimerLocked = false,
shadowsightTimerScale = 1,
shadowsightTimerRelPoint1 = "CENTER",
shadowsightTimerRelPoint2 = "CENTER",
shadowsightTimerX = 0,
shadowsightTimerY = 0,
shadowsightAnnounce = true,
shadowsightTimerStartTime = 91,
shadowsightTimerResetTime = 120,
shadowsightTimerShowTwoTimer = false,
shadowsightTimerFrameStrata = "HIGH",
shadowsightTimerFrameLevel = 20,
})
-- /run LibStub("Gladdy").modules["Shadowsight Timer"]:AURA_GAIN(nil, nil, 34709)
-- /run LibStub("Gladdy").modules["Shadowsight Timer"].timerFrame1:SetAlpha(0)
function ShadowsightTimer:OnEvent(event, ...)
self[event](self, ...)
end
function ShadowsightTimer:Initialize()
self.locale = Gladdy:GetArenaTimer()
self:RegisterMessage("JOINED_ARENA")
self:CreateAnchor()
end
function ShadowsightTimer:Reset()
self.anchor:Hide()
for i=1,2 do
self["timerFrame" .. i].active = false
self["timerFrame" .. i]:SetScript("OnUpdate", nil)
self["timerFrame" .. i].font:SetTextColor(1, 0.8, 0)
end
self:UnregisterEvent("CHAT_MSG_BG_SYSTEM_NEUTRAL")
self:SetScript("OnEvent", nil)
end
---------------------------
-- FRAME SETUP
---------------------------
function ShadowsightTimer:CreateTimerFrame(anchor, name, points)
local backdrop = {
bgFile = "Interface/Tooltips/UI-Tooltip-Background",
edgeFile = "",
tile = true, tileSize = 16, edgeSize = 10,
insets = {left = 0, right = 0, top = 0, bottom = 0}
}
self[name] = CreateFrame("Frame", nil, anchor, BackdropTemplateMixin and "BackdropTemplate")
self[name]:SetPoint(points[1], anchor, points[2])
self[name]:SetBackdrop(backdrop)
self[name]:SetBackdropColor(0,0,0,0.8)
self[name]:SetHeight(17)
self[name]:SetWidth(35)
self[name].texture = self[name]:CreateTexture(nil,"OVERLAY")
self[name].texture:SetWidth(16)
self[name].texture:SetHeight(16)
self[name].texture:SetTexture("Interface\\Icons\\Spell_Shadow_EvilEye")
self[name].texture:SetTexCoord(0.125,0.875,0.125,0.875)
self[name].texture:SetPoint("RIGHT", self[name], "LEFT")
self[name].font = self[name]:CreateFontString(nil,"OVERLAY","GameFontNormal")
self[name].font:SetPoint("LEFT", 5, 0)
self[name].font:SetJustifyH("LEFT")
self[name].font:SetTextColor(1, 0.8, 0)
self[name]:SetFrameStrata(Gladdy.db.shadowsightTimerFrameStrata)
self[name]:SetFrameLevel(Gladdy.db.shadowsightTimerFrameLevel)
end
function ShadowsightTimer:CreateAnchor()
self.anchor = CreateFrame("Frame")
self.anchor:SetMovable(true)
self.anchor:EnableMouse(true)
self.anchor:SetWidth(35)
self.anchor:SetHeight(17)
self.anchor:SetPoint(Gladdy.db.shadowsightTimerRelPoint1, nil, Gladdy.db.shadowsightTimerRelPoint, Gladdy.db.shadowsightTimerX, Gladdy.db.shadowsightTimerY)
self.anchor:SetScript("OnMouseDown",function(self) self:StartMoving() end)
self.anchor:SetScript("OnMouseUp",function(self)
self:StopMovingOrSizing()
Gladdy.db.shadowsightTimerRelPoint1,_,Gladdy.db.shadowsightTimerRelPoint2,Gladdy.db.shadowsightTimerX,Gladdy.db.shadowsightTimerY = self:GetPoint()
end)
self.anchor:SetScale(Gladdy.db.shadowsightTimerScale)
self.anchor:Hide()
self:CreateTimerFrame(self.anchor, "timerFrame1", {"TOP", "TOP"})
local show = Gladdy.db.shadowsightTimerShowTwoTimer
self:CreateTimerFrame(show and self.timerFrame1 or self.anchor, "timerFrame2", show and {"TOP", "BOTTOM"} or {"TOP", "TOP"})
end
function ShadowsightTimer:UpdateFrameOnce()
self.anchor:EnableMouse(not Gladdy.db.shadowsightTimerLocked)
self.anchor:SetFrameStrata(Gladdy.db.shadowsightTimerFrameStrata)
self.anchor:SetFrameLevel(Gladdy.db.shadowsightTimerFrameLevel)
self.timerFrame1:SetFrameStrata(Gladdy.db.shadowsightTimerFrameStrata)
self.timerFrame1:SetFrameLevel(Gladdy.db.shadowsightTimerFrameLevel)
self.timerFrame2:SetFrameStrata(Gladdy.db.shadowsightTimerFrameStrata)
self.timerFrame2:SetFrameLevel(Gladdy.db.shadowsightTimerFrameLevel)
if Gladdy.db.shadowsightTimerEnabled then
self.anchor:SetScale(Gladdy.db.shadowsightTimerScale)
self.anchor:ClearAllPoints()
self.anchor:SetPoint(Gladdy.db.shadowsightTimerRelPoint1, nil, Gladdy.db.shadowsightTimerRelPoint2, Gladdy.db.shadowsightTimerX, Gladdy.db.shadowsightTimerY)
if Gladdy.frame.testing or Gladdy.curBracket then
self.anchor:Show()
end
if Gladdy.db.shadowsightTimerShowTwoTimer then
self.anchor:SetHeight(34)
self.timerFrame2:ClearAllPoints()
self.timerFrame2:SetPoint("TOP", self.timerFrame1, "BOTTOM")
ShadowsightTimer:NotifyStart()
else
self.anchor:SetHeight(17)
self.timerFrame2:ClearAllPoints()
self.timerFrame2:SetPoint("TOP", self.anchor, "TOP")
ShadowsightTimer:NotifyStart()
end
else
self.anchor:SetScale(Gladdy.db.shadowsightTimerScale)
self.anchor:ClearAllPoints()
self.anchor:SetPoint(Gladdy.db.shadowsightTimerRelPoint1, nil, Gladdy.db.shadowsightTimerRelPoint2, Gladdy.db.shadowsightTimerX, Gladdy.db.shadowsightTimerY)
self.anchor:Hide()
end
end
---------------------------
-- EVENT HANDLING
---------------------------
function ShadowsightTimer:JOINED_ARENA()
if Gladdy.db.shadowsightTimerEnabled then
self:RegisterEvent("CHAT_MSG_BG_SYSTEM_NEUTRAL")
self:SetScript("OnEvent", ShadowsightTimer.OnEvent)
for i=1,2 do
self["timerFrame" .. i].font:SetText("1:30")
self["timerFrame" .. i].font:SetTextColor(1, 0.8, 0)
end
self.anchor:Show()
end
end
function ShadowsightTimer:AURA_GAIN(unit, auraType, spellID)
if (spellID == 34709 and Gladdy.db.shadowsightTimerEnabled) then
self:Start(Gladdy.db.shadowsightTimerResetTime, self:GetHiddenTimer())
end
end
function ShadowsightTimer:CHAT_MSG_BG_SYSTEM_NEUTRAL(msg)
for k,v in pairs(self.locale) do
if str_find(msg, v) then
if k == 0 then
self:Start(nil, self.timerFrame1)
self:Start(nil, self.timerFrame2)
end
end
end
end
---------------------------
-- TEST
---------------------------
function ShadowsightTimer:Test()
if Gladdy.db.shadowsightTimerEnabled then
self.anchor:Show()
ShadowsightTimer:JOINED_ARENA()
self:Start(20, self.timerFrame1)
self:Start(25, self.timerFrame2)
end
end
---------------------------
-- TIMER
---------------------------
function ShadowsightTimer:Start(time, frame)
frame.endTime = time or Gladdy.db.shadowsightTimerStartTime
frame.active = true
ShadowsightTimer:NotifyStart()
frame.announced = nil
frame.timeSinceLastUpdate = 0
frame.font:SetTextColor(1, 0.8, 0)
frame:SetScript("OnUpdate", ShadowsightTimer.OnUpdate)
end
function ShadowsightTimer.OnUpdate(self, elapsed)
self.timeSinceLastUpdate = self.timeSinceLastUpdate + elapsed;
self.endTime = self.endTime - elapsed
if (self.timeSinceLastUpdate > 0.01) then
self.font:SetFormattedText(floor(self.endTime / 60) .. ":" .. "%02d", self.endTime - floor(self.endTime / 60) * 60)
self.timeSinceLastUpdate = 0;
if floor(self.endTime) == 15 and Gladdy.db.shadowsightAnnounce and not self.announced then
self.announced = true
Gladdy:SendMessage("SHADOWSIGHT", L["Shadowsight up in %ds"]:format(15))
end
end
if self.endTime <= 0 then
if Gladdy.db.shadowsightAnnounce then
Gladdy:SendMessage("SHADOWSIGHT", L["Shadowsight up!"])
end
self:SetScript("OnUpdate", nil)
self.font:SetText("0:00")
self.font:SetTextColor(0, 1, 0)
self.active = false
ShadowsightTimer:NotifyEnd()
end
end
function ShadowsightTimer:NotifyStart()
local show = Gladdy.db.shadowsightTimerShowTwoTimer
if self.timerFrame1.active and self.timerFrame2.active then
if self.timerFrame1.endTime < self.timerFrame2.endTime then
self.timerFrame1:SetAlpha(1)
self.timerFrame2:SetAlpha(show and 1 or 0)
else
self.timerFrame1:SetAlpha(show and 1 or 0)
self.timerFrame2:SetAlpha(1)
end
else
if self.timerFrame1.active then
self.timerFrame1:SetAlpha(1)
self.timerFrame2:SetAlpha(show and 1 or 0)
elseif self.timerFrame2.active then
self.timerFrame1:SetAlpha(show and 1 or 0)
self.timerFrame2:SetAlpha(1)
else
self.timerFrame1:SetAlpha(1)
self.timerFrame2:SetAlpha(show and 1 or 0)
end
end
end
function ShadowsightTimer:NotifyEnd()
local show = Gladdy.db.shadowsightTimerShowTwoTimer
if self.timerFrame1.active then
self.timerFrame1:SetAlpha(1)
self.timerFrame2:SetAlpha(show and 1 or 0)
elseif self.timerFrame2.active then
self.timerFrame1:SetAlpha(show and 1 or 0)
self.timerFrame2:SetAlpha(1)
else
self.timerFrame1:SetAlpha(1)
self.timerFrame2:SetAlpha(show and 1 or 0)
end
end
function ShadowsightTimer:GetHiddenTimer()
if self.timerFrame1.active and self.timerFrame2.active then
return self.timerFrame1.endTime < self.timerFrame2.endTime and self.timerFrame1 or self.timerFrame2
else
return self.timerFrame1.active and self.timerFrame2 or self.timerFrame1
end
end
---------------------------
-- OPTIONS
---------------------------
function ShadowsightTimer:GetOptions()
return {
headerShadowsight = {
type = "header",
name = L["Shadowsight Timer"],
order = 2,
},
shadowsightTimerEnabled = Gladdy:option({
type = "toggle",
name = L["Enabled"],
--desc = L["Turns countdown before the start of an arena match on/off."],
order = 3,
}),
shadowsightTimerLocked = Gladdy:option({
type = "toggle",
name = L["Locked"],
--desc = L["Turns countdown before the start of an arena match on/off."],
order = 4,
}),
shadowsightTimerShowTwoTimer = Gladdy:option({
type = "toggle",
name = L["Show two timers"],
order = 5,
}),
shadowsightAnnounce = Gladdy:option({
type = "toggle",
name = L["Announce"],
--desc = L["Turns countdown before the start of an arena match on/off."],
order = 6,
}),
group = {
type = "group",
childGroups = "tree",
name = L["Frame"],
order = 7,
args = {
general = {
type = "group",
name = L["Scale"],
order = 1,
args = {
header = {
type = "header",
name = L["Scale"],
order = 1,
},
shadowsightTimerScale = Gladdy:option({
type = "range",
name = L["Scale"],
order = 2,
min = 0.1,
max = 5,
step = 0.1,
width = "full",
}),
},
},
cooldown = {
type = "group",
name = L["Cooldown"],
order = 2,
args = {
header = {
type = "header",
name = L["Shadowsight CDs"],
order = 1,
},
shadowsightTimerStartTime = Gladdy:option({
type = "range",
name = L["Start Time"],
desc = L["Start time in seconds"],
min = 80,
max = 100,
order = 2,
step = 0.1,
width = "full",
}),
shadowsightTimerResetTime = Gladdy:option({
type = "range",
name = L["Reset Time"],
desc = L["Reset time in seconds"],
min = 110,
max = 130,
order = 3,
step = 0.1,
width = "full",
}),
},
},
--[[font = {
type = "group",
name = L["Font"],
order = 3,
args = {
header = {
type = "header",
name = L["Font"],
order = 4,
},
racialFont = Gladdy:option({
type = "select",
name = L["Font"],
desc = L["Font of the cooldown"],
order = 11,
dialogControl = "LSM30_Font",
values = AceGUIWidgetLSMlists.font,
}),
racialFontScale = Gladdy:option({
type = "range",
name = L["Font scale"],
desc = L["Scale of the font"],
order = 12,
min = 0.1,
max = 2,
step = 0.1,
width = "full",
}),
},
},--]]
frameStrata = {
type = "group",
name = L["Frame Strata and Level"],
order = 6,
args = {
headerAuraLevel = {
type = "header",
name = L["Frame Strata and Level"],
order = 1,
},
shadowsightTimerFrameStrata = Gladdy:option({
type = "select",
name = L["Frame Strata"],
order = 2,
values = Gladdy.frameStrata,
sorting = Gladdy.frameStrataSorting,
width = "full",
}),
shadowsightTimerFrameLevel = Gladdy:option({
type = "range",
name = L["Frame Level"],
min = 0,
max = 500,
step = 1,
order = 3,
width = "full",
}),
},
},
},
},
}
end