diff --git a/modules/nameplates.lua b/modules/nameplates.lua index f9844587..a83da9d3 100644 --- a/modules/nameplates.lua +++ b/modules/nameplates.lua @@ -283,15 +283,35 @@ pfUI:RegisterModule("nameplates", function () end end - local function TotemPlate(name) - if C.nameplates.totemicons == "1" then - for totem, icon in pairs(L["totems"]) do - if string.find(name, totem) then return icon end - end + -- Numeric CreatureType.dbc id for the plate's unit (8 = Critter, 11 = Totem). + -- It's fixed per unit, so cache it and reset on plate reuse. nil while the GUID + -- can't resolve yet (incl. the no-SuperWoW case, where cachedGuid is empty). + -- Locale-proof and covers custom units for free -- no name tables needed. + local function CreatureType(plate) + local guid = plate.cachedGuid + if not guid or guid == "" then return nil end + if not plate.creatureType then + plate.creatureType = UnitCreatureTypeID(guid) -- nil retries next call end + return plate.creatureType end - local function HidePlate(unittype, name, fullhp, target) + -- Totem icon, read straight from the game: + -- * Passive totems self-cast their provided buff, so they carry exactly one + -- aura whose icon IS the totem's icon (Totem::Summon TOTEM_PASSIVE). + -- * Active totems (Searing/Magma/Fire Nova) cast at enemies and hold no + -- self-aura, so their icon arrives via UNIT_SPELLCAST_SUCCEEDED (cached + -- into plate.totemIcon by the event handler); nil here until then. + local function TotemPlate(plate) + if C.nameplates.totemicons ~= "1" then return nil end + if CreatureType(plate) ~= 11 then return nil end + if plate.totemIcon then return plate.totemIcon end + local auras = C_UnitAuras.GetUnitAuras(plate.cachedGuid) + if auras and auras[1] then plate.totemIcon = auras[1].icon end + return plate.totemIcon + end + + local function HidePlate(unittype, fullhp, target, plate) -- keep some plates always visible according to config if C.nameplates.fullhealth == "1" and not fullhp then return nil end if C.nameplates.target == "1" and target then return nil end @@ -307,14 +327,10 @@ pfUI:RegisterModule("nameplates", function () return true elseif C.nameplates.friendlyplayer == "1" and unittype == "FRIENDLY_PLAYER" then return true - elseif C.nameplates.critters == "1" and unittype == "NEUTRAL_NPC" then - for i, critter in pairs(L["critters"]) do - if string.lower(name) == string.lower(critter) then return true end - end - elseif C.nameplates.totems == "1" then - for totem in pairs(L["totems"]) do - if string.find(name, totem) then return true end - end + elseif C.nameplates.critters == "1" and CreatureType(plate) == 8 then + return true + elseif C.nameplates.totems == "1" and CreatureType(plate) == 11 then + return true end -- nothing to hide @@ -483,6 +499,7 @@ nameplates:RegisterEvent("UNIT_SPELLCAST_START") nameplates:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START") nameplates:RegisterEvent("UNIT_SPELLCAST_STOP") nameplates:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP") +nameplates:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED") nameplates:RegisterEvent("PLAYER_GUILD_UPDATE") nameplates:SetScript("OnEvent", function() @@ -569,6 +586,8 @@ nameplates:RegisterEvent("PLAYER_GUILD_UPDATE") local guid = UnitGUID(arg1) plate.nameplate.cachedGuid = guid plate.nameplate.unit = arg1 + plate.nameplate.creatureType = nil -- recompute for the new unit + plate.nameplate.totemIcon = nil if guid then plateByGuid[guid] = plate.nameplate -- Seed: the unit may already be mid-cast (its UNIT_SPELLCAST_START @@ -646,6 +665,22 @@ nameplates:RegisterEvent("PLAYER_GUILD_UPDATE") end end + elseif event == "UNIT_SPELLCAST_SUCCEEDED" then + -- Active totems (Searing/Magma/Fire Nova) carry no self-aura, so their + -- attack cast is the only icon source. Capture it once per totem, gated on + -- creature type so a normal caster's spell never styles it as a totem. + if arg1 and strfind(arg1, "^nameplate") then + local guid = UnitGUID(arg1) + local plate = guid and plateByGuid[guid] + if plate and not plate.totemIcon and arg3 and CreatureType(plate) == 11 then + local tex = C_Spell.GetSpellTexture(arg3) + if tex then + plate.totemIcon = tex + plate.castUpdate = true -- re-render now so the icon shows + end + end + end + elseif event == "UNIT_AURA" then -- ClassicAPI: fires with arg1 == "nameplateN" when a unit's aura set -- changes (add/remove/modify). Flag the matching plate so OnUpdate does a @@ -1072,11 +1107,11 @@ nameplates:RegisterEvent("PLAYER_GUILD_UPDATE") end -- hide frames according to the configuration - local TotemIcon = TotemPlate(name) + local TotemIcon = TotemPlate(plate) if TotemIcon then - -- create totem icon - plate.totem.icon:SetTexture("Interface\\Icons\\" .. TotemIcon) + -- icon resolved from the totem's aura / attack cast (already a full path) + plate.totem.icon:SetTexture(TotemIcon) plate.glow:Hide() plate.level:Hide() @@ -1084,7 +1119,7 @@ nameplates:RegisterEvent("PLAYER_GUILD_UPDATE") plate.health:Hide() plate.guild:Hide() plate.totem:Show() - elseif HidePlate(unittype, name, (hpmax-hp == hpmin), target) then + elseif HidePlate(unittype, (hpmax-hp == hpmin), target, plate) then plate.level:SetPoint("RIGHT", plate.name, "LEFT", -3, 0) plate.name:SetParent(plate) plate.guild:SetPoint("BOTTOM", plate.name, "BOTTOM", -2, -(font_size + 2))