mirror of
https://github.com/brues-code/pfUI.git
synced 2026-10-26 05:50:50 +00:00
nameplates: hide castbar on remote interrupt / caster death (#11)
ClassicAPI's remote-cast cache is stamped from SMSG_SPELL_START and only expires by computed end time — 1.12 keeps no per-unit interrupt record, so an interrupted cast kept animating on the plate until its would-be finish (BG flag caps being the loudest repro). Nampower does surface the missing signal in Lua: SPELL_FAILED_OTHER (casterGuid, spellId; fired from the SMSG_SPELL_FAILED_OTHER handler) and UNIT_DIED (guid). Stamp a guid-keyed suppression time on either event and have GetCastInfo drop any cast that started before the stamp; a newer cast clears its unit's entry. Both castbar paths (dedicated target frame + central loop) already funnel through GetCastInfo, so one check covers them. The handler only stamps when the unit actually has a tracked cast, and flags the plate via castUpdate for a same-tick hide.
This commit is contained in:
@@ -63,6 +63,14 @@ pfUI:RegisterModule("nameplates", function ()
|
|||||||
|
|
||||||
local raidGuidCache = {} -- guid -> name (rebuilt on RAID_ROSTER_UPDATE/PARTY_MEMBERS_CHANGED)
|
local raidGuidCache = {} -- guid -> name (rebuilt on RAID_ROSTER_UPDATE/PARTY_MEMBERS_CHANGED)
|
||||||
|
|
||||||
|
-- ClassicAPI's remote-cast cache has no interrupt signal — an interrupted
|
||||||
|
-- cast keeps being reported until its computed end time (issue #11). When
|
||||||
|
-- nampower tells us a remote cast failed (SPELL_FAILED_OTHER) or the caster
|
||||||
|
-- died (UNIT_DIED), we stamp the event time here (engine-ms domain, same as
|
||||||
|
-- startMs) and GetCastInfo drops any cast that started before the stamp. A
|
||||||
|
-- newer cast clears its unit's entry.
|
||||||
|
local castSuppressed = {} -- guid -> suppression time (GetTime()*1000)
|
||||||
|
|
||||||
-- Resolve a plate GUID to its cast/channel info via C_Spell. Returns a
|
-- Resolve a plate GUID to its cast/channel info via C_Spell. Returns a
|
||||||
-- compact struct (spellName / icon / startTime / endTime / duration /
|
-- compact struct (spellName / icon / startTime / endTime / duration /
|
||||||
-- isChannel) or nil when the unit isn't casting / the GUID can't map to a
|
-- isChannel) or nil when the unit isn't casting / the GUID can't map to a
|
||||||
@@ -78,6 +86,11 @@ pfUI:RegisterModule("nameplates", function ()
|
|||||||
isChannel = true
|
isChannel = true
|
||||||
end
|
end
|
||||||
if not name or not startMs or not endMs then return nil end
|
if not name or not startMs or not endMs then return nil end
|
||||||
|
local supp = castSuppressed[guid]
|
||||||
|
if supp then
|
||||||
|
if startMs <= supp then return nil end
|
||||||
|
castSuppressed[guid] = nil
|
||||||
|
end
|
||||||
return {
|
return {
|
||||||
spellName = name,
|
spellName = name,
|
||||||
spellID = spellID,
|
spellID = spellID,
|
||||||
@@ -474,6 +487,9 @@ nameplates:RegisterEvent("PARTY_MEMBERS_CHANGED")
|
|||||||
nameplates:RegisterEvent("NAME_PLATE_CREATED")
|
nameplates:RegisterEvent("NAME_PLATE_CREATED")
|
||||||
nameplates:RegisterEvent("NAME_PLATE_UNIT_ADDED")
|
nameplates:RegisterEvent("NAME_PLATE_UNIT_ADDED")
|
||||||
nameplates:RegisterEvent("NAME_PLATE_UNIT_REMOVED")
|
nameplates:RegisterEvent("NAME_PLATE_UNIT_REMOVED")
|
||||||
|
-- nampower: remote cast interrupted / caster died — see castSuppressed
|
||||||
|
nameplates:RegisterEvent("SPELL_FAILED_OTHER")
|
||||||
|
nameplates:RegisterEvent("UNIT_DIED")
|
||||||
if GetUnitField then
|
if GetUnitField then
|
||||||
nameplates:RegisterEvent("UNIT_FLAGS_GUID")
|
nameplates:RegisterEvent("UNIT_FLAGS_GUID")
|
||||||
nameplates:RegisterEvent("UNIT_AURA_GUID")
|
nameplates:RegisterEvent("UNIT_AURA_GUID")
|
||||||
@@ -594,6 +610,19 @@ end
|
|||||||
plate.nameplate.auraUpdate = true
|
plate.nameplate.auraUpdate = true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
elseif event == "SPELL_FAILED_OTHER" or event == "UNIT_DIED" then
|
||||||
|
-- Nampower: arg1 = guid. Only stamp when the unit actually has a
|
||||||
|
-- tracked cast — keeps the table from accumulating an entry for every
|
||||||
|
-- combat-log death. Flag the plate so the castbar hides this tick
|
||||||
|
-- instead of waiting out the throttle.
|
||||||
|
if arg1 and GetCastInfo(arg1) then
|
||||||
|
castSuppressed[arg1] = GetTime() * 1000
|
||||||
|
local plate = C_NamePlate.GetNamePlateForGUID(arg1)
|
||||||
|
if plate and plate.nameplate then
|
||||||
|
plate.nameplate.castUpdate = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
elseif event == "PLAYER_TARGET_CHANGED" then
|
elseif event == "PLAYER_TARGET_CHANGED" then
|
||||||
-- Flag target plate for update via GUID registry
|
-- Flag target plate for update via GUID registry
|
||||||
local targetGuid = UnitGUID("target")
|
local targetGuid = UnitGUID("target")
|
||||||
|
|||||||
Reference in New Issue
Block a user