Files
Nanami-Plates/ComboPoints.lua
2026-03-20 10:20:05 +08:00

194 lines
6.4 KiB
Lua

NanamiPlates_ComboPoints = {}
local NP = NanamiPlates
local Settings = NP.Settings
local GetComboPoints = GetComboPoints
local UnitExists = UnitExists
local CreateFrame = CreateFrame
local MAX_COMBO_POINTS = 5
local CP_SIZE = 10
local CP_SPACING = 3
local COMBO_COLORS = {
{0.3, 1.0, 0.3, 1},
{0.6, 1.0, 0.0, 1},
{1.0, 0.85, 0.0, 1},
{1.0, 0.45, 0.0, 1},
{1.0, 0.1, 0.1, 1},
}
local _, playerClass = UnitClass("player")
playerClass = playerClass or ""
local canUseComboPoints = (playerClass == "ROGUE" or playerClass == "DRUID")
function NanamiPlates_ComboPoints:CanUseComboPoints()
return canUseComboPoints
end
function NanamiPlates_ComboPoints:CreateComboPointFrames(nameplate)
if not canUseComboPoints then return end
nameplate.comboPoints = {}
local plateName = nameplate:GetName() or "UnknownPlate"
local size = Settings.comboPointsSize or CP_SIZE
for i = 1, MAX_COMBO_POINTS do
local cp = CreateFrame("Frame", plateName .. "CP" .. i, nameplate)
cp:SetWidth(size)
cp:SetHeight(size)
cp:SetFrameLevel(nameplate.health:GetFrameLevel() + 6)
cp:EnableMouse(false)
-- Outer glow/shadow
cp.glow = cp:CreateTexture(nil, "BACKGROUND")
cp.glow:SetTexture("Interface\\Buttons\\WHITE8X8")
cp.glow:SetPoint("CENTER", cp, "CENTER", 0, 0)
cp.glow:SetWidth(size + 4)
cp.glow:SetHeight(size + 4)
cp.glow:SetVertexColor(0, 0, 0, 0.6)
cp.glow:SetDrawLayer("BACKGROUND")
-- Border (themed)
cp.border = cp:CreateTexture(nil, "BORDER")
cp.border:SetTexture("Interface\\Buttons\\WHITE8X8")
cp.border:SetPoint("CENTER", cp, "CENTER", 0, 0)
cp.border:SetWidth(size + 2)
cp.border:SetHeight(size + 2)
local brR, brG, brB = NP.GetThemeColor("panelBorder", 0.55, 0.30, 0.42, 1)
cp.border:SetVertexColor(brR, brG, brB, 1)
cp.border:SetDrawLayer("BORDER")
-- Main fill
cp.icon = cp:CreateTexture(nil, "ARTWORK")
cp.icon:SetTexture("Interface\\Buttons\\WHITE8X8")
cp.icon:SetPoint("CENTER", cp, "CENTER", 0, 0)
cp.icon:SetWidth(size)
cp.icon:SetHeight(size)
cp.icon:SetVertexColor(0.12, 0.08, 0.12, 0.6)
cp.icon:SetDrawLayer("ARTWORK")
-- Number text
cp.text = cp:CreateFontString(nil, "OVERLAY")
cp.text:SetFont(NP.GetFont(), size - 2, NP.GetFontOutline())
cp.text:SetPoint("CENTER", cp, "CENTER", 0, 0)
cp.text:SetText("")
cp.text:SetDrawLayer("OVERLAY")
cp.active = false
cp:Hide()
nameplate.comboPoints[i] = cp
end
end
function NanamiPlates_ComboPoints:UpdateComboPoints(nameplate, isTarget)
if not canUseComboPoints then return 0 end
if not nameplate.comboPoints then return 0 end
if not Settings.showComboPoints then
for i = 1, MAX_COMBO_POINTS do
if nameplate.comboPoints[i] then nameplate.comboPoints[i]:Hide() end
end
return 0
end
local numPoints = 0
if isTarget and UnitExists("target") then
numPoints = GetComboPoints("player", "target") or 0
end
local size = Settings.comboPointsSize or CP_SIZE
for i = 1, MAX_COMBO_POINTS do
local cp = nameplate.comboPoints[i]
if cp then
cp:SetWidth(size)
cp:SetHeight(size)
cp.glow:SetWidth(size + 4)
cp.glow:SetHeight(size + 4)
cp.border:SetWidth(size + 2)
cp.border:SetHeight(size + 2)
cp.icon:SetWidth(size)
cp.icon:SetHeight(size)
cp.text:SetFont(NP.GetFont(), size - 2 > 6 and size - 2 or 6, NP.GetFontOutline())
if i <= numPoints then
local color = COMBO_COLORS[i] or COMBO_COLORS[MAX_COMBO_POINTS]
cp.icon:SetVertexColor(color[1], color[2], color[3], 1)
cp.glow:SetVertexColor(color[1] * 0.4, color[2] * 0.4, color[3] * 0.4, 0.7)
cp.text:SetText(i)
cp.text:SetTextColor(1, 1, 1, 0.9)
cp.active = true
cp:Show()
elseif numPoints > 0 then
cp.icon:SetVertexColor(0.12, 0.08, 0.12, 0.5)
cp.glow:SetVertexColor(0, 0, 0, 0.4)
cp.text:SetText("")
cp.active = false
cp:Show()
else
cp:Hide()
end
end
end
return numPoints
end
function NanamiPlates_ComboPoints:UpdateComboPointPositions(nameplate, numDebuffs)
if not canUseComboPoints then return end
if not nameplate.comboPoints then return end
if not Settings.showComboPoints then return end
if not nameplate.healthBG then return end
local numVisible = 0
for i = 1, MAX_COMBO_POINTS do
if nameplate.comboPoints[i] and nameplate.comboPoints[i]:IsShown() then
numVisible = MAX_COMBO_POINTS
break
end
end
if numVisible == 0 then
if nameplate.name and nameplate._cpNameOffset then
nameplate.name:ClearAllPoints()
nameplate.name:SetPoint("BOTTOM", nameplate.healthBG, "TOP", 0, 2)
nameplate._cpNameOffset = nil
end
return
end
local size = Settings.comboPointsSize or CP_SIZE
local spacing = CP_SPACING
local totalWidth = (size * MAX_COMBO_POINTS) + (spacing * (MAX_COMBO_POINTS - 1))
local startOffset = -totalWidth / 2 + size / 2
for i = 1, MAX_COMBO_POINTS do
local cp = nameplate.comboPoints[i]
if cp then
cp:ClearAllPoints()
local xOffset = startOffset + (i - 1) * (size + spacing)
cp:SetPoint("BOTTOM", nameplate.healthBG, "TOP", xOffset, 2)
end
end
if nameplate.name then
nameplate.name:ClearAllPoints()
nameplate.name:SetPoint("BOTTOM", nameplate.healthBG, "TOP", 0, 2 + size + 2)
nameplate._cpNameOffset = true
end
end
function NanamiPlates_ComboPoints:HideComboPoints(nameplate)
if not nameplate.comboPoints then return end
for i = 1, MAX_COMBO_POINTS do
if nameplate.comboPoints[i] then nameplate.comboPoints[i]:Hide() end
end
if nameplate.name and nameplate._cpNameOffset then
nameplate.name:ClearAllPoints()
nameplate.name:SetPoint("BOTTOM", nameplate.healthBG, "TOP", 0, 2)
nameplate._cpNameOffset = nil
end
end
NanamiPlates.ComboPoints = NanamiPlates_ComboPoints