Validate SuperWoW channel fallbacks
This commit is contained in:
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user