mirror of
https://github.com/brues-code/pfUI.git
synced 2026-10-04 04:30:01 +00:00
Detect nameplate totems and critters by creature type
Replace the localized L["totems"] / L["critters"] name-substring matching with ClassicAPI's UnitCreatureTypeID (CreatureType.dbc: 8 = Critter, 11 = Totem), cached per plate and reset on reuse. Locale-independent, covers custom/Turtle units, rejects mobs merely named "...Totem...", and cheaper than the per-plate name loop. Totem icons now come straight from the game instead of a hand-picked table: passive totems self-cast their provided buff, so their single aura's icon is read via C_UnitAuras.GetUnitAuras; active totems (Searing/Magma/Fire Nova) carry no self-aura, so their icon is captured from UNIT_SPELLCAST_SUCCEEDED (C_Spell.GetSpellTexture) and cached. Detection and icons read through the plate's ClassicAPI-provided GUID (cachedGuid).
This commit is contained in:
+53
-18
@@ -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))
|
||||
|
||||
Reference in New Issue
Block a user