Files
coa-quartz/Quartz/modules/GCD.lua
T
Andrew6810 3b75efe038 init
2022-10-21 07:30:59 -07:00

291 lines
7.3 KiB
Lua

--[[
Copyright (C) 2006-2007 Nymbia
Copyright (C) 2010 Hendrik "Nevcairiel" Leppkes < h.leppkes@gmail.com >
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
]]
local Quartz3 = LibStub("AceAddon-3.0"):GetAddon("Quartz3")
local L = LibStub("AceLocale-3.0"):GetLocale("Quartz3")
local MODNAME = "GCD"
local GCD = Quartz3:NewModule(MODNAME, "AceEvent-3.0")
local Player = Quartz3:GetModule("Player")
----------------------------
-- Upvalues
local CreateFrame, GetTime, UIParent, GetSpellCooldown = CreateFrame, GetTime, UIParent, GetSpellCooldown
local unpack = unpack
local gcdbar, gcdbar_width, gcdspark
local starttime, duration, warned
local db, getOptions
local defaults = {
profile = {
sparkcolor = {1, 1, 1},
gcdalpha = 0.9,
gcdheight = 4,
gcdposition = "bottom",
gcdgap = -4,
deplete = false,
x = 500,
y = 300,
}
}
local function OnUpdate()
if not starttime then return gcdbar:Hide() end
gcdspark:ClearAllPoints()
local perc = (GetTime() - starttime) / duration
if perc > 1 then
return gcdbar:Hide()
else
if db.deplete then
gcdspark:SetPoint("CENTER", gcdbar, "LEFT", gcdbar_width * (1-perc), 0)
else
gcdspark:SetPoint("CENTER", gcdbar, "LEFT", gcdbar_width * perc, 0)
end
end
end
local function OnHide()
gcdbar:SetScript("OnUpdate", nil)
end
local function OnShow()
gcdbar:SetScript("OnUpdate", OnUpdate)
end
function GCD:OnInitialize()
self.db = Quartz3.db:RegisterNamespace(MODNAME, defaults)
db = self.db.profile
self:SetEnabledState(Quartz3:GetModuleEnabled(MODNAME))
Quartz3:RegisterModuleOptions(MODNAME, getOptions, L["GCD"])
end
function GCD:OnEnable()
--self:RegisterEvent("UNIT_SPELLCAST_SENT","CheckGCD")
self:RegisterEvent("UNIT_SPELLCAST_START","CheckGCD")
self:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED","CheckGCD")
if not gcdbar then
gcdbar = CreateFrame("Frame", "Quartz3GCDBar", UIParent)
gcdbar:SetFrameStrata("HIGH")
gcdbar:SetScript("OnShow", OnShow)
gcdbar:SetScript("OnHide", OnHide)
gcdbar:SetMovable(true)
gcdbar:RegisterForDrag("LeftButton")
gcdbar:SetClampedToScreen(true)
gcdspark = gcdbar:CreateTexture(nil, "DIALOG")
gcdbar:Hide()
end
self:ApplySettings()
end
function GCD:OnDisable()
gcdbar:Hide()
end
function GCD:CheckGCD(event, unit, spell)
if unit == "player" then
local start, dur = GetSpellCooldown(spell)
if dur and dur > 0 and dur <= 1.5 then
starttime = start
duration = dur
gcdbar:Show()
end
end
end
function GCD:ApplySettings()
db = self.db.profile
if gcdbar and self:IsEnabled() then
gcdbar:ClearAllPoints()
gcdbar:SetHeight(db.gcdheight)
gcdbar_width = Player.Bar:GetWidth() - 8
gcdbar:SetWidth(gcdbar_width)
gcdbar:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16})
gcdbar:SetBackdropColor(0,0,0)
gcdbar:SetAlpha(db.gcdalpha)
gcdbar:SetScale(Player.db.profile.scale)
if db.gcdposition == "bottom" then
gcdbar:SetPoint("TOP", Player.Bar, "BOTTOM", 0, -1 * db.gcdgap)
elseif db.gcdposition == "top" then
gcdbar:SetPoint("BOTTOM", Player.Bar, "TOP", 0, db.gcdgap)
else -- L["Free"]
gcdbar:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", db.x, db.y)
end
gcdspark:SetTexture("Interface\\CastingBar\\UI-CastingBar-Spark")
gcdspark:SetVertexColor(unpack(db.sparkcolor))
gcdspark:SetBlendMode("ADD")
gcdspark:SetWidth(25)
gcdspark:SetHeight(db.gcdheight*2.5)
end
end
do
local locked = true
local function nothing()
end
local function dragstart()
gcdbar:StartMoving()
end
local function dragstop()
db.x = gcdbar:GetLeft()
db.y = gcdbar:GetBottom()
gcdbar:StopMovingOrSizing()
end
local function hiddennofree()
return db.gcdposition ~= "free"
end
local function setOpt(info, value)
db[info[#info]] = value
GCD:ApplySettings()
end
local function getOpt(info)
return db[info[#info]]
end
local function getColor(info)
return unpack(getOpt(info))
end
local function setColor(info, r, g, b, a)
setOpt(info, {r, g, b, a})
end
local options
function getOptions()
if not options then
options = {
type = "group",
name = L["Global Cooldown"],
order = 600,
get = getOpt,
set = setOpt,
args = {
toggle = {
type = "toggle",
name = L["Enable"],
desc = L["Enable"],
get = function()
return Quartz3:GetModuleEnabled(MODNAME)
end,
set = function(info, v)
Quartz3:SetModuleEnabled(MODNAME, v)
end,
order = 100,
},
sparkcolor = {
type = "color",
name = L["Spark Color"],
desc = L["Set the color of the GCD bar spark"],
get = getColor,
set = setColor,
order = 103,
},
gcdheight = {
type = "range",
name = L["Height"],
desc = L["Set the height of the GCD bar"],
min = 1, max = 30, step = 1,
order = 104,
},
gcdalpha = {
type = "range",
name = L["Alpha"],
desc = L["Set the alpha of the GCD bar"],
min = 0.05, max = 1, bigStep = 0.05,
isPercent = true,
order = 105,
},
gcdposition = {
type = "select",
name = L["Bar Position"],
desc = L["Set the position of the GCD bar"],
values = {["top"] = L["Top"], ["bottom"] = L["Bottom"], ["free"] = L["Free"]},
order = 106,
},
lock = {
type = "toggle",
name = L["Lock"],
desc = L["Toggle Cast Bar lock"],
get = function()
return locked
end,
set = function(info, v)
if v then
gcdbar.Hide = nil
gcdbar:EnableMouse(false)
gcdbar:SetScript("OnDragStart", nil)
gcdbar:SetScript("OnDragStop", nil)
gcdbar:Hide()
else
gcdbar:Show()
gcdbar:EnableMouse(true)
gcdbar:SetScript("OnDragStart", dragstart)
gcdbar:SetScript("OnDragStop", dragstop)
gcdbar:SetAlpha(1)
gcdbar.Hide = nothing
end
locked = v
end,
hidden = hiddennofree,
order = 107,
},
x = {
type = "range",
name = L["X"],
desc = L["Set an exact X value for this bar's position."],
min = 0, max = 2560, step = 1,
order = 108,
hidden = hiddennofree,
},
y = {
type = "range",
name = L["Y"],
desc = L["Set an exact Y value for this bar's position."],
min = 0, max = 1600, step = 1,
order = 108,
hidden = hiddennofree,
},
gcdgap = {
type = "range",
name = L["Gap"],
desc = L["Tweak the distance of the GCD bar from the cast bar"],
min = -35, max = 35, step = 1,
order = 109,
},
deplete = {
type = "toggle",
name = L["Deplete"],
desc = L["Reverses the direction of the GCD spark, causing it to move right-to-left"],
order = 110,
},
},
}
end
return options
end
end