Files
coa-kui-nameplates/Kui_Nameplates/Modules/ComboPoints.lua
T
2023-05-22 20:03:54 -07:00

203 lines
5.3 KiB
Lua

--[[
-- Kui_Nameplates
-- By Kesava at curse.com
-- All rights reserved
-- Backported by: Kader at https://github.com/bkader
]]
local addon = LibStub("AceAddon-3.0"):GetAddon("KuiNameplates")
local mod = addon:NewModule("ComboPoints", addon.Prototype, "AceEvent-3.0")
local L = LibStub("AceLocale-3.0"):GetLocale("KuiNameplates")
local _
mod.uiName = L["Combo points"]
local ICON_SPACING = -1
local anticipationWasActive
local colours = {
full = {1, 1, .1},
partial = {.79, .55, .18},
anti = {1, .3, .3},
glowFull = {1, 1, .1, .6},
glowPartial = {0, 0, 0, .3},
glowAnti = {1, .1, .1, .8}
}
local sizes = {}
local defaultSizes = {}
local function ComboPointsUpdate(self)
if self.points and self.points > 0 then
if self.points == 5 then
self.colour = colours.full
self.glowColour = colours.glowFull
else
self.colour = colours.partial
self.glowColour = colours.glowPartial
end
for i = 1, 5 do
if i <= self.points then
self[i]:SetAlpha(1)
else
self[i]:SetAlpha(.3)
end
self[i]:SetVertexColor(unpack(self.colour))
self.glows[i]:SetVertexColor(unpack(self.glowColour))
end
self:Show()
elseif self:IsShown() then
self:Hide()
end
end
-------------------------------------------------------------- Event handlers --
function mod:UNIT_COMBO_POINTS(event, unit)
-- only works for player > target
if unit ~= "player" then
return
end
local f = addon:GetUnitPlate("target")
if f and f.combopoints then
local points = GetComboPoints("player", "target")
f.combopoints.points = points
f.combopoints:Update()
if points > 0 then
-- clear points on other frames
for _, frame in pairs(addon.frameList) do
if frame.kui.combopoints and frame.kui ~= f then
self:HideComboPoints(nil, frame.kui)
end
end
end
end
end
---------------------------------------------------------------------- Target --
function mod:OnFrameTarget(msg, frame, is_target)
if is_target then
self:UNIT_COMBO_POINTS(nil, "player")
end
end
---------------------------------------------------------------------- Create --
function mod:CreateComboPoints(msg, frame)
-- create combo point icons
frame.combopoints = CreateFrame("Frame", nil, frame.overlay)
frame.combopoints.glows = {}
frame.combopoints:Hide()
local pcp
for i = 0, 4 do
-- create individual combo point icons
-- size and position of first icon is set in ScaleComboPoints
local cp = frame.combopoints:CreateTexture(nil, "ARTWORK")
cp:SetDrawLayer("ARTWORK", 2)
cp:SetTexture("Interface\\AddOns\\Kui_Nameplates\\Media\\combopoint-round")
if i > 0 then
cp:SetPoint("LEFT", pcp, "RIGHT", ICON_SPACING, 0)
end
tinsert(frame.combopoints, i + 1, cp)
pcp = cp
-- and their glows
local glow = frame.combopoints:CreateTexture(nil, "ARTWORK")
glow:SetDrawLayer("ARTWORK", 1)
glow:SetTexture("Interface\\AddOns\\Kui_Nameplates\\Media\\combopoint-glow")
glow:SetPoint("CENTER", cp)
tinsert(frame.combopoints.glows, i + 1, glow)
end
self:ScaleComboPoints(frame)
frame.combopoints.Update = ComboPointsUpdate
end
-- update/set frame sizes ------------------------------------------------------
function mod:ScaleComboPoints(frame)
for i, cp in ipairs(frame.combopoints) do
cp:SetSize(sizes.combopoints, sizes.combopoints)
if i == 1 then
-- place first icon to offset others to center
cp:SetPoint("BOTTOM", frame.overlay, "BOTTOM", -(sizes.combopoints + ICON_SPACING) * 2, -3)
end
frame.combopoints.glows[i]:SetSize(sizes.combopoints + 8, sizes.combopoints + 8)
end
end
------------------------------------------------------------------------ Hide --
function mod:HideComboPoints(msg, frame)
if frame.combopoints then
frame.combopoints.points = nil
frame.combopoints:Update()
end
end
---------------------------------------------------- Post db change functions --
mod:AddConfigChanged("enabled", function(v) mod:Toggle(v) end)
mod:AddConfigChanged(
"scale",
function(v)
sizes.combopoints = defaultSizes.combopoints * v
end,
function(f, v)
mod:ScaleComboPoints(f)
end
)
-------------------------------------------------------------------- Register --
function mod:GetOptions()
return {
enabled = {
type = "toggle",
name = L["Show combo points"],
desc = L["Show combo points on the target"],
order = 0
},
scale = {
type = "range",
name = L["Icon scale"],
desc = L["The scale of the combo point icons and glow"],
order = 5,
min = 0.1,
softMin = 0.5,
softMax = 2
}
}
end
function mod:OnInitialize()
self.db = addon.db:RegisterNamespace(self.moduleName, {profile = {enabled = true, scale = 1}})
defaultSizes.combopoints = 6.5
-- scale size with user option
self.configChangedFuncs.scale.ro(self.db.profile.scale)
addon:InitModuleOptions(self)
mod:SetEnabledState(self.db.profile.enabled)
end
function mod:OnEnable()
self:RegisterMessage("KuiNameplates_PostCreate", "CreateComboPoints")
self:RegisterMessage("KuiNameplates_PostHide", "HideComboPoints")
self:RegisterMessage("KuiNameplates_PostTarget", "OnFrameTarget")
self:RegisterEvent("UNIT_COMBO_POINTS")
for _, frame in pairs(addon.frameList) do
if not frame.combopoints then
self:CreateComboPoints(nil, frame.kui)
end
end
end
function mod:OnDisable()
self:UnregisterEvent("UNIT_COMBO_POINTS")
for _, frame in pairs(addon.frameList) do
self:HideComboPoints(nil, frame.kui)
end
end