From d3cc5dd20dccd4809cd08e8ec694763d2cdd3059 Mon Sep 17 00:00:00 2001 From: Dusk-92 Date: Sun, 23 Aug 2026 21:57:46 +0200 Subject: [PATCH] Use ClassicAPI nameplate tokens for castbars --- mods/nameplate-castbar.lua | 97 ++++++++++++++++++++++++++++---------- 1 file changed, 73 insertions(+), 24 deletions(-) diff --git a/mods/nameplate-castbar.lua b/mods/nameplate-castbar.lua index 9d4c64e..dfeb227 100644 --- a/mods/nameplate-castbar.lua +++ b/mods/nameplate-castbar.lua @@ -1,7 +1,8 @@ local _G = ShaguTweaks.GetGlobalEnv() local T = ShaguTweaks.T -local UnitCastingInfo = ShaguTweaks.UnitCastingInfo -local UnitChannelInfo = ShaguTweaks.UnitChannelInfo +local API = ShaguTweaks.API +local LegacyCastingInfo = ShaguTweaks.UnitCastingInfo +local LegacyChannelInfo = ShaguTweaks.UnitChannelInfo local module = ShaguTweaks:register({ title = T["Nameplate Castbar"], @@ -11,6 +12,53 @@ local module = ShaguTweaks:register({ enabled = true, }) +local function QueryLegacy(query) + if not query then return end + + local cast, nameSubtext, text, texture, startTime, endTime, isTradeSkill = LegacyCastingInfo(query) + if cast then + return cast, nameSubtext, text, texture, startTime, endTime, isTradeSkill, false + end + + local channel + channel, nameSubtext, text, texture, startTime, endTime, isTradeSkill = LegacyChannelInfo(query) + if channel then + return channel, nameSubtext, text, texture, startTime, endTime, isTradeSkill, true + end +end + +local function QueryPlateCast(plate) + -- nameplateN is positional, so verify its GUID before trusting a token kept + -- on the frame across nameplate pool recycling/reordering. + local unit = plate.unit + if unit and plate.guid and API.UnitGUID(unit) ~= plate.guid then + unit = nil + end + + if unit then + local cast, nameSubtext, text, texture, startTime, endTime, isTradeSkill = API.GetCastInfo(unit) + if cast then + return cast, nameSubtext, text, texture, startTime, endTime, isTradeSkill, false + end + + local channel + channel, nameSubtext, text, texture, startTime, endTime, isTradeSkill = API.GetChannelInfo(unit) + if channel then + return channel, nameSubtext, text, texture, startTime, endTime, isTradeSkill, true + end + end + + -- SuperWoW remains the second source, keyed by stable GUID. + if ShaguTweaks.superwow_active and plate.guid then + local a, b, c, d, e, f, g, h = QueryLegacy(plate.guid) + if a then return a, b, c, d, e, f, g, h end + end + + -- Final compatibility fallback: ShaguTweaks' original name/combat-log DB. + local name = plate.name and plate.name:GetText() + return QueryLegacy(name) +end + module.enable = function(self) if ShaguPlates then return end @@ -72,47 +120,48 @@ module.enable = function(self) plate.castbar:Hide() end - -- scan for casts and show castbar - table.insert(ShaguTweaks.libnameplate.OnUpdate, function() + -- Keep OnUpdate only for smooth bar animation. Cast discovery itself now + -- prefers ClassicAPI's engine/server-backed unit cast state. + table.insert(ShaguTweaks.libnameplate.OnUpdate, function(plate) + plate = plate or this + -- create castbar if not existing - if not this.castbar then create_castbar(this) end + if not plate.castbar then create_castbar(plate) end - local name = this.name:GetText() - local cast, nameSubtext, text, texture, startTime, endTime, isTradeSkill = UnitCastingInfo(name) + local cast, nameSubtext, text, texture, startTime, endTime, isTradeSkill, isChannel = QueryPlateCast(plate) - -- read enemy casts from SuperWoW if enabled - if ShaguTweaks.superwow_active then - cast, nameSubtext, text, texture, startTime, endTime, isTradeSkill = UnitCastingInfo(this:GetName(1)) - end - - if cast then + if cast and startTime and endTime and endTime > startTime then local duration = endTime - startTime local max = duration / 1000 local cur = GetTime() - startTime / 1000 + if isChannel then + cur = max + startTime/1000 - GetTime() + end + cur = cur > max and max or cur cur = cur < 0 and 0 or cur - this.castbar:Show() - this.castbar:SetMinMaxValues(0, duration / 1000) - this.castbar:SetValue(cur) + plate.castbar:Show() + plate.castbar:SetMinMaxValues(0, max) + plate.castbar:SetValue(cur) local percent = cur / max - local x = this.castbar:GetWidth()*percent - this.castbar.spark:SetPoint("CENTER", this.castbar, "LEFT", x, 0) + local x = plate.castbar:GetWidth()*percent + plate.castbar.spark:SetPoint("CENTER", plate.castbar, "LEFT", x, 0) - this.castbar.text:SetText(cast) + plate.castbar.text:SetText(cast) if texture then - this.castbar.texture.icon:SetTexture(texture) - this.castbar.texture.icon:Show() + plate.castbar.texture.icon:SetTexture(texture) + plate.castbar.texture.icon:Show() else - this.castbar.texture.icon:Hide() + plate.castbar.texture.icon:Hide() end - this.castbar:SetAlpha(this:GetAlpha()) + plate.castbar:SetAlpha(plate:GetAlpha()) else - this.castbar:Hide() + plate.castbar:Hide() end end) end