Validate SuperWoW channel fallbacks

This commit is contained in:
Dusk-92
2026-08-26 09:10:01 +02:00
parent c8bbc6eef6
commit d4d3d746f7
3 changed files with 70 additions and 12 deletions
+12 -3
View File
@@ -120,10 +120,19 @@ API.GetChannelInfo = function(unit)
local name, displayName, texture, startTime, endTime, isTradeSkill,
notInterruptible, spellID = _G.C_Spell.UnitChannelInfo(unit)
if not name or not startTime or not endTime then return end
if not name then return end
-- ClassicAPI can know that a remote unit is channeling even when the
-- channel began before it was observed, in which case timing is nil. Keep
-- the normalized first value nil, but expose the live spell identity in
-- trailing values so castbar modules can safely try a timed SuperWoW cache.
if not startTime or not endTime then
return nil, nil, nil, nil, nil, nil, nil,
notInterruptible, spellID, true
end
return name, "", displayName or "", texture, startTime, endTime,
isTradeSkill, notInterruptible, spellID
isTradeSkill, notInterruptible, spellID, true
end
API.IsSpellInRange = function(spell, unit)
@@ -346,4 +355,4 @@ API.UnitGUID = function(unit)
if API.unitguid then
return _G.UnitGUID(unit)
end
end
end
+29 -4
View File
@@ -27,6 +27,28 @@ local function QueryLegacy(query)
end
end
local function QuerySuperWoW(guid, channelSpellID, hasChannel)
if not guid then return end
local cached = ShaguTweaks.libcast.db[guid]
if not cached then return end
if cached.channel then
if not hasChannel or cached.spellID ~= channelSpellID then return end
local channel, nameSubtext, text, texture, startTime, endTime, isTradeSkill = LegacyChannelInfo(guid)
if channel then
return channel, nameSubtext, text, texture, startTime, endTime, isTradeSkill, true
end
return
end
local cast, nameSubtext, text, texture, startTime, endTime, isTradeSkill = LegacyCastingInfo(guid)
if cast then
return cast, nameSubtext, text, texture, startTime, endTime, isTradeSkill, false
end
end
module.enable = function(self)
if ShaguPlates then return end
@@ -111,17 +133,20 @@ module.enable = function(self)
return cast, nameSubtext, text, texture, startTime, endTime, isTradeSkill, false
end
local channel
channel, nameSubtext, text, texture, startTime, endTime, isTradeSkill = API.GetChannelInfo(unit)
local channel, notInterruptible, channelSpellID, hasChannel
channel, nameSubtext, text, texture, startTime, endTime, isTradeSkill,
notInterruptible, channelSpellID, hasChannel = API.GetChannelInfo(unit)
if channel then
return channel, nameSubtext, text, texture, startTime, endTime, isTradeSkill, true
end
-- With a real ClassicAPI unit token, "no cast" is authoritative. Never
-- fall through to the old name-keyed database, otherwise two mobs with
-- the same name can incorrectly share a castbar.
-- the same name can incorrectly share a castbar. The GUID-keyed
-- SuperWoW fallback remains safe; channels must also match ClassicAPI's
-- live channel spellID before their cached timing is trusted.
if ShaguTweaks.superwow_active and plate.guid then
return QueryLegacy(plate.guid)
return QuerySuperWoW(plate.guid, channelSpellID, hasChannel)
end
return
end
+29 -5
View File
@@ -76,6 +76,28 @@ local function QueryLegacy(query)
end
end
local function QuerySuperWoW(guid, channelSpellID, hasChannel)
if not guid then return end
local cached = ShaguTweaks.libcast.db[guid]
if not cached then return end
if cached.channel then
if not hasChannel or cached.spellID ~= channelSpellID then return end
local channel, nameSubtext, text, texture, startTime, endTime, isTradeSkill = LegacyChannelInfo(guid)
if channel then
return channel, nameSubtext, text, texture, startTime, endTime, isTradeSkill, true
end
return
end
local cast, nameSubtext, text, texture, startTime, endTime, isTradeSkill = LegacyCastingInfo(guid)
if cast then
return cast, nameSubtext, text, texture, startTime, endTime, isTradeSkill, false
end
end
local function QueryCast(unit)
if not unit then return end
@@ -89,18 +111,20 @@ local function QueryCast(unit)
return cast, nameSubtext, text, texture, startTime, endTime, isTradeSkill, false
end
local channel
channel, nameSubtext, text, texture, startTime, endTime, isTradeSkill = API.GetChannelInfo(unit)
local channel, notInterruptible, channelSpellID, hasChannel
channel, nameSubtext, text, texture, startTime, endTime, isTradeSkill,
notInterruptible, channelSpellID, hasChannel = API.GetChannelInfo(unit)
if channel then
return channel, nameSubtext, text, texture, startTime, endTime, isTradeSkill, true
end
-- SuperWoW's GUID-keyed legacy cache is still safe because it cannot
-- collide merely because two creatures share the same display name.
-- SuperWoW remains the GUID-keyed fallback for regular casts. Channels
-- additionally require ClassicAPI's authoritative live state and matching
-- spellID, preventing a stale cached channel from becoming a ghost bar.
if ShaguTweaks.superwow_active and not UnitIsUnit(unit, "player") then
local guid = API.UnitGUID(unit)
if guid then
local a, b, c, d, e, f, g, h = QueryLegacy(guid)
local a, b, c, d, e, f, g, h = QuerySuperWoW(guid, channelSpellID, hasChannel)
if a then return a, b, c, d, e, f, g, h end
end
end