From e70c8025c252ed829f4025286a96ad03916b96fb Mon Sep 17 00:00:00 2001 From: Brues <5278969+brues-code@users.noreply.github.com> Date: Thu, 22 Oct 2026 23:43:44 -0500 Subject: [PATCH] Draw the ranged swing timer as a native center-fill StatusBar The ranged bar faked its fills with three textures resized and re-texcoorded every frame. A StatusBar with ClassicAPI's SetFillStyle covers all of it: CENTER for hunters (reload drains to the middle, the deadzone grows back out in the warn color), STANDARD otherwise. --- modules/swingtimer.lua | 90 +++++++----------------------------------- 1 file changed, 15 insertions(+), 75 deletions(-) diff --git a/modules/swingtimer.lua b/modules/swingtimer.lua index 4b852f18..110716de 100644 --- a/modules/swingtimer.lua +++ b/modules/swingtimer.lua @@ -190,36 +190,19 @@ pfUI:RegisterModule("swingtimer", function () CreateBackdropShadow(pfUI.swingtimer.offhand) -- Ranged bar - pfUI.swingtimer.ranged = CreateFrame("Frame", "pfSwingTimerRanged", UIParent) + -- Hunters fill from the center: the bar drains toward the middle during + -- the reload, then the auto shot deadzone grows back out in the warn color. + pfUI.swingtimer.ranged = CreateFrame("StatusBar", "pfSwingTimerRanged", UIParent) pfUI.swingtimer.ranged:SetPoint("BOTTOM", UIParent, "CENTER", -189, 83) pfUI.swingtimer.ranged:SetWidth(sw_width) pfUI.swingtimer.ranged:SetHeight(sw_height) + pfUI.swingtimer.ranged:SetMinMaxValues(0, 1) + pfUI.swingtimer.ranged:SetValue(0) + pfUI.swingtimer.ranged:SetStatusBarTexture(sw_texture) + pfUI.swingtimer.ranged:SetStatusBarColor(raR, raG, raB, raA) + pfUI.swingtimer.ranged:SetFillStyle(isHunter and "CENTER" or "STANDARD") pfUI.swingtimer.ranged:Hide() - pfUI.swingtimer.ranged.left = pfUI.swingtimer.ranged:CreateTexture(nil, "ARTWORK") - pfUI.swingtimer.ranged.left:SetTexture(sw_texture) - pfUI.swingtimer.ranged.left:SetPoint("RIGHT", pfUI.swingtimer.ranged, "CENTER", 0, 0) - pfUI.swingtimer.ranged.left:SetHeight(sw_height) - pfUI.swingtimer.ranged.left:SetWidth(sw_width / 2) - pfUI.swingtimer.ranged.left:SetTexCoord(0, 0.5, 0, 1) - pfUI.swingtimer.ranged.left:SetVertexColor(raR, raG, raB, raA) - - pfUI.swingtimer.ranged.right = pfUI.swingtimer.ranged:CreateTexture(nil, "ARTWORK") - pfUI.swingtimer.ranged.right:SetTexture(sw_texture) - pfUI.swingtimer.ranged.right:SetPoint("LEFT", pfUI.swingtimer.ranged, "CENTER", 0, 0) - pfUI.swingtimer.ranged.right:SetHeight(sw_height) - pfUI.swingtimer.ranged.right:SetWidth(sw_width / 2) - pfUI.swingtimer.ranged.right:SetTexCoord(0.5, 1, 0, 1) - pfUI.swingtimer.ranged.right:SetVertexColor(raR, raG, raB, raA) - - pfUI.swingtimer.ranged.warn = pfUI.swingtimer.ranged:CreateTexture(nil, "ARTWORK") - pfUI.swingtimer.ranged.warn:SetTexture(sw_texture) - pfUI.swingtimer.ranged.warn:SetPoint("CENTER", pfUI.swingtimer.ranged, "CENTER", 0, 0) - pfUI.swingtimer.ranged.warn:SetHeight(sw_height) - pfUI.swingtimer.ranged.warn:SetWidth(1) - pfUI.swingtimer.ranged.warn:SetVertexColor(rwR, rwG, rwB, rwA) - pfUI.swingtimer.ranged.warn:Hide() - pfUI.swingtimer.ranged.text = pfUI.swingtimer.ranged:CreateFontString("Status", "DIALOG", "GameFontNormal") pfUI.swingtimer.ranged.text:SetPoint("CENTER", pfUI.swingtimer.ranged, "CENTER", 0, 0) pfUI.swingtimer.ranged.text:SetFont(pfUI.font_default, sw_fontsize, "OUTLINE") @@ -324,26 +307,8 @@ pfUI:RegisterModule("swingtimer", function () S.raTimer = remaining S.raActive = true - if isHunter then - pfUI.swingtimer.ranged.left:ClearAllPoints() - pfUI.swingtimer.ranged.left:SetPoint("RIGHT", pfUI.swingtimer.ranged, "CENTER", 0, 0) - pfUI.swingtimer.ranged.left:SetWidth(sw_width / 2) - pfUI.swingtimer.ranged.left:SetTexCoord(0, 0.5, 0, 1) - pfUI.swingtimer.ranged.right:SetWidth(sw_width / 2) - pfUI.swingtimer.ranged.right:SetTexCoord(0.5, 1, 0, 1) - else - pfUI.swingtimer.ranged.left:ClearAllPoints() - pfUI.swingtimer.ranged.left:SetPoint("TOPLEFT", pfUI.swingtimer.ranged, "TOPLEFT", 0, 0) - pfUI.swingtimer.ranged.left:SetWidth(0.1) - pfUI.swingtimer.ranged.left:Hide() - pfUI.swingtimer.ranged.left:SetTexCoord(0, 0, 0, 1) - pfUI.swingtimer.ranged.right:SetWidth(0.1) - pfUI.swingtimer.ranged.right:Hide() - end - pfUI.swingtimer.ranged.left:SetVertexColor(raR, raG, raB, raA) - pfUI.swingtimer.ranged.right:SetVertexColor(raR, raG, raB, raA) - pfUI.swingtimer.ranged.warn:SetWidth(1) - pfUI.swingtimer.ranged.warn:Hide() + pfUI.swingtimer.ranged:SetStatusBarColor(raR, raG, raB, raA) + pfUI.swingtimer.ranged:SetValue(isHunter and 1 or 0) pfUI.swingtimer.ranged:Show() pfUI.swingtimer:Show() end @@ -614,30 +579,12 @@ pfUI:RegisterModule("swingtimer", function () local remaining = S.raTimer if isHunter then local DEADZONE = 0.5 - local halfW = sw_width / 2 if remaining > DEADZONE then - local elapsed = S.raTimerMax - remaining - local phase1dur = S.raTimerMax - DEADZONE - local p = elapsed / phase1dur - local w = halfW * (1 - p) - if w < 1 then w = 1 end - pfUI.swingtimer.ranged.left:Show() - pfUI.swingtimer.ranged.left:SetWidth(w) - pfUI.swingtimer.ranged.left:SetTexCoord(0, (1 - p) * 0.5, 0, 1) - pfUI.swingtimer.ranged.left:SetVertexColor(raR, raG, raB, raA) - pfUI.swingtimer.ranged.right:Show() - pfUI.swingtimer.ranged.right:SetWidth(w) - pfUI.swingtimer.ranged.right:SetTexCoord(1 - (1 - p) * 0.5, 1, 0, 1) - pfUI.swingtimer.ranged.right:SetVertexColor(raR, raG, raB, raA) - pfUI.swingtimer.ranged.warn:Hide() + pfUI.swingtimer.ranged:SetStatusBarColor(raR, raG, raB, raA) + pfUI.swingtimer.ranged:SetValue((remaining - DEADZONE) / (S.raTimerMax - DEADZONE)) else - local p = 1 - (remaining / DEADZONE) - local w = sw_width * p - if w < 1 then w = 1 end - pfUI.swingtimer.ranged.left:Hide() - pfUI.swingtimer.ranged.right:Hide() - pfUI.swingtimer.ranged.warn:SetWidth(w) - pfUI.swingtimer.ranged.warn:Show() + pfUI.swingtimer.ranged:SetStatusBarColor(rwR, rwG, rwB, rwA) + pfUI.swingtimer.ranged:SetValue(1 - (remaining / DEADZONE)) end if sw_showtext then if remaining <= 0.5 then @@ -647,14 +594,7 @@ pfUI:RegisterModule("swingtimer", function () end end else - local progress = 1 - (remaining / S.raTimerMax) - local w = sw_width * progress - if w < 1 then w = 1 end - pfUI.swingtimer.ranged.left:Show() - pfUI.swingtimer.ranged.left:SetWidth(w) - pfUI.swingtimer.ranged.left:SetTexCoord(0, progress, 0, 1) - pfUI.swingtimer.ranged.right:Hide() - pfUI.swingtimer.ranged.warn:Hide() + pfUI.swingtimer.ranged:SetValue(1 - (remaining / S.raTimerMax)) if sw_showtext then pfUI.swingtimer.ranged.text:SetFormattedText("%.1f", math.floor(remaining * 10) / 10) end