mirror of
https://github.com/brues-code/pfUI.git
synced 2026-10-04 12:40:02 +00:00
Replace libtotem with ClassicAPI's native totem tracker
ClassicAPI now ships GetTotemInfo/GetTotemTimeLeft/GetTotemDuration/ TargetTotem plus a native PLAYER_TOTEM_UPDATE event, backed by a data-driven tracker (slot from the Spell.dbc summon effect, duration from SpellDuration.dbc, and object-manager death detection). That's exactly what libtotem hand-rolled -- and better -- so delete the library outright: its spellid/icon tables, the CastSpellByName/CastSpell/UseAction hooks, the SPELL_GO commit path, and the active-totem bookkeeping. modules/totems.lua becomes a thin consumer of the native API: - Driven by PLAYER_TOTEM_UPDATE; drop the shaman tick-poller that only existed because vanilla had no totem event. - Fix the GetTotemInfo call sites: the native 1st return is tool presence, not "summoned", so key active state on name/start instead. - Right-click a totem icon to TargetTotem it; tooltip shows remaining time via GetTotemTimeLeft. modules/turtle-wow.lua: drop the Totemic Recall handler that poked libtotem:Clean() -- the native tracker detects the totems despawning and clears the slots itself. Also clean up the now-orphaned translation string and a stale libtotem mention in libdebuff's comment.
This commit is contained in:
Vendored
-1
@@ -876,7 +876,6 @@ pfUI_translation["deDE"] = {
|
||||
["XP Percentage"] = nil,
|
||||
["Yellow Border On Neutral Units"] = nil,
|
||||
["Yes"] = nil,
|
||||
["You gain (.+) Mana from Totemic Recall"] = nil,
|
||||
["You got"] = nil,
|
||||
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = nil,
|
||||
["Your items have been repaired for"] = nil,
|
||||
|
||||
Vendored
-1
@@ -892,7 +892,6 @@ pfUI_translation["enUS"] = {
|
||||
["XP Percentage"] = nil,
|
||||
["Yellow Border On Neutral Units"] = nil,
|
||||
["Yes"] = nil,
|
||||
["You gain (.+) Mana from Totemic Recall"] = nil,
|
||||
["You got"] = nil,
|
||||
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = nil,
|
||||
["Your items have been repaired for"] = nil,
|
||||
|
||||
Vendored
-1
@@ -876,7 +876,6 @@ pfUI_translation["esES"] = {
|
||||
["XP Percentage"] = "Porcentaje de exp.",
|
||||
["Yellow Border On Neutral Units"] = "Borde amarillo en unidades neutrales",
|
||||
["Yes"] = "Sí",
|
||||
["You gain (.+) Mana from Totemic Recall"] = nil,
|
||||
["You got"] = "Obtienes",
|
||||
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = "Ahora su interfaz está configurada.\n\nPara la configuración avanzada, abra la configuración |cff33ffccpf|rUI por el menú de escape o escriba \"|cffffffaa/pfui|r\" en el chat.",
|
||||
["Your items have been repaired for"] = "Tus objetos se han reparado por",
|
||||
|
||||
Vendored
-1
@@ -876,7 +876,6 @@ pfUI_translation["frFR"] = {
|
||||
["XP Percentage"] = "Pourcentage de la barre d'expérience",
|
||||
["Yellow Border On Neutral Units"] = "Bordure jaune sur les unités neutres",
|
||||
["Yes"] = "Oui",
|
||||
["You gain (.+) Mana from Totemic Recall"] = nil,
|
||||
["You got"] = "Vous avez",
|
||||
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = nil,
|
||||
["Your items have been repaired for"] = "Vos objets ont été réparés pour",
|
||||
|
||||
Vendored
-1
@@ -876,7 +876,6 @@ pfUI_translation["koKR"] = {
|
||||
["XP Percentage"] = "경험치 퍼센트",
|
||||
["Yellow Border On Neutral Units"] = nil,
|
||||
["Yes"] = nil,
|
||||
["You gain (.+) Mana from Totemic Recall"] = nil,
|
||||
["You got"] = nil,
|
||||
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = nil,
|
||||
["Your items have been repaired for"] = nil,
|
||||
|
||||
Vendored
-1
@@ -876,7 +876,6 @@ pfUI_translation["ruRU"] = {
|
||||
["XP Percentage"] = "Процент опыта",
|
||||
["Yellow Border On Neutral Units"] = "Желтые границы на нейтральных юнитах",
|
||||
["Yes"] = "Да",
|
||||
["You gain (.+) Mana from Totemic Recall"] = nil,
|
||||
["You got"] = "Вы получили",
|
||||
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = "Теперь ваш интерфейс настроен.\n\nДля расширенной настройки откройте \"Настройки |cff33ffccpf|rUI\" с помощью escape меню или введите \"|cffffffaa/pfui|r\" в чат.\n\nЖелаю хорошего путешествия!\n\n|cffaaaaaa- Shagu",
|
||||
["Your items have been repaired for"] = "Ваши предметы были отремонтированы за",
|
||||
|
||||
Vendored
-1
@@ -877,7 +877,6 @@ pfUI_translation["zhCN"] = {
|
||||
["XP Percentage"] = "经验百分比",
|
||||
["Yellow Border On Neutral Units"] = "显示中立单位黄色边框",
|
||||
["Yes"] = "是",
|
||||
["You gain (.+) Mana from Totemic Recall"] = "你从图腾召回获得了(.+)点法力值",
|
||||
["You got"] = "你已得到",
|
||||
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = "你的界面现在已经完成设置.高级设置请点击游戏菜单或者输入命令/pfui进行设置.祝您游戏愉快",
|
||||
["Your items have been repaired for"] = "你的物品已经修好了",
|
||||
|
||||
Vendored
-1
@@ -876,7 +876,6 @@ pfUI_translation["zhTW"] = {
|
||||
["XP Percentage"] = "經驗百分比",
|
||||
["Yellow Border On Neutral Units"] = nil,
|
||||
["Yes"] = nil,
|
||||
["You gain (.+) Mana from Totemic Recall"] = nil,
|
||||
["You got"] = nil,
|
||||
["Your interface is now set up.\n\nFor advanced configuration, just open the |cff33ffccpf|rUI settings via the escape menu or type \"|cffffffaa/pfui|r\" into the chat.\n\n Have a nice trip!\n\n|cffaaaaaa- Shagu"] = "您的UI已經設置完畢.使用遊戲菜單或在聊天窗口輸入\"|cffffffaa/pfui|r\"開啟高級設置.祝您遊戲愉快!\n\n|cffaaaaaa- Shagu",
|
||||
["Your items have been repaired for"] = "你的物品已經修好了",
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
<Include file="..\libs\librange.lua"/>
|
||||
<Include file="..\libs\libunitscan.lua"/>
|
||||
<Include file="..\libs\libhealth.lua"/>
|
||||
<Include file="..\libs\libtotem.lua"/>
|
||||
<Include file="..\libs\libthrottle.lua"/>
|
||||
<Include file="..\libs\libpredict.lua"/>
|
||||
<Include file="..\libs\libbagsort.lua"/>
|
||||
|
||||
+1
-1
@@ -16,7 +16,7 @@ setfenv(1, pfUI:GetEnvironment())
|
||||
-- non-player expirationTime). What remains in libdebuff is the cast-event
|
||||
-- bookkeeping consumed by GetBestAuraCast (libpredict HoT tracking) and the
|
||||
-- libdebuff_*_hooks broadcast surface (subscribers in actionbar / swingtimer
|
||||
-- / libtotem react to SPELL_GO and SPELL_FAILED).
|
||||
-- react to SPELL_GO and SPELL_FAILED).
|
||||
|
||||
-- return instantly when another libdebuff is already active
|
||||
if pfUI.api.libdebuff then return end
|
||||
|
||||
@@ -1,275 +0,0 @@
|
||||
-- load pfUI environment
|
||||
setfenv(1, pfUI:GetEnvironment())
|
||||
|
||||
--[[ libtotem ]]--
|
||||
-- A pfUI library that tries to emulate the TotemAPI that was introduced in Patch 2.4.
|
||||
-- It detects and saves all current totems of the player and returns information based
|
||||
-- on the totem slot ID. The function GetTotemInfo is supposed to work as it would
|
||||
-- on later expansions.
|
||||
--
|
||||
-- GetTotemInfo(id)
|
||||
-- Returns totem informations on the givent totem slot
|
||||
-- active, name, start, duration, icon
|
||||
|
||||
-- return instantly when another libtotem is already active
|
||||
if pfUI.api.libtotem then return end
|
||||
|
||||
MAX_TOTEMS = MAX_TOTEMS or 4
|
||||
FIRE_TOTEM_SLOT = FIRE_TOTEM_SLOT or 1
|
||||
EARTH_TOTEM_SLOT = EARTH_TOTEM_SLOT or 2
|
||||
WATER_TOTEM_SLOT = WATER_TOTEM_SLOT or 3
|
||||
AIR_TOTEM_SLOT = AIR_TOTEM_SLOT or 4
|
||||
|
||||
local _, class = UnitClass("player")
|
||||
|
||||
local libtotem
|
||||
local active = { [1] = {}, [2] = {}, [3] = {}, [4] = {} }
|
||||
|
||||
-- SpellID -> { slot, duration } mapping
|
||||
-- rank-specific durations are handled via spellId directly
|
||||
local spellids = {
|
||||
-- FIRE (slot 1)
|
||||
[1535] = { slot = FIRE_TOTEM_SLOT, duration = 5 }, -- Fire Nova Totem R1
|
||||
[8498] = { slot = FIRE_TOTEM_SLOT, duration = 5 }, -- Fire Nova Totem R2
|
||||
[8499] = { slot = FIRE_TOTEM_SLOT, duration = 5 }, -- Fire Nova Totem R3
|
||||
[11314] = { slot = FIRE_TOTEM_SLOT, duration = 5 }, -- Fire Nova Totem R4
|
||||
[11315] = { slot = FIRE_TOTEM_SLOT, duration = 5 }, -- Fire Nova Totem R5
|
||||
[8227] = { slot = FIRE_TOTEM_SLOT, duration = 120 }, -- Flametongue Totem R1
|
||||
[8249] = { slot = FIRE_TOTEM_SLOT, duration = 120 }, -- Flametongue Totem R2
|
||||
[10526] = { slot = FIRE_TOTEM_SLOT, duration = 120 }, -- Flametongue Totem R3
|
||||
[16387] = { slot = FIRE_TOTEM_SLOT, duration = 120 }, -- Flametongue Totem R4
|
||||
[8184] = { slot = FIRE_TOTEM_SLOT, duration = 120 }, -- Frost Resistance Totem R1
|
||||
[10478] = { slot = FIRE_TOTEM_SLOT, duration = 120 }, -- Frost Resistance Totem R2
|
||||
[10479] = { slot = FIRE_TOTEM_SLOT, duration = 120 }, -- Frost Resistance Totem R3
|
||||
[8190] = { slot = FIRE_TOTEM_SLOT, duration = 20 }, -- Magma Totem R1
|
||||
[10585] = { slot = FIRE_TOTEM_SLOT, duration = 20 }, -- Magma Totem R2
|
||||
[10586] = { slot = FIRE_TOTEM_SLOT, duration = 20 }, -- Magma Totem R3
|
||||
[10587] = { slot = FIRE_TOTEM_SLOT, duration = 20 }, -- Magma Totem R4
|
||||
[3599] = { slot = FIRE_TOTEM_SLOT, duration = 30 }, -- Searing Totem R1
|
||||
[6363] = { slot = FIRE_TOTEM_SLOT, duration = 35 }, -- Searing Totem R2
|
||||
[6364] = { slot = FIRE_TOTEM_SLOT, duration = 40 }, -- Searing Totem R3
|
||||
[6365] = { slot = FIRE_TOTEM_SLOT, duration = 45 }, -- Searing Totem R4
|
||||
[10437] = { slot = FIRE_TOTEM_SLOT, duration = 50 }, -- Searing Totem R5
|
||||
[10438] = { slot = FIRE_TOTEM_SLOT, duration = 55 }, -- Searing Totem R6
|
||||
|
||||
-- EARTH (slot 2)
|
||||
[2484] = { slot = EARTH_TOTEM_SLOT, duration = 45 }, -- Earthbind Totem
|
||||
[5730] = { slot = EARTH_TOTEM_SLOT, duration = 15 }, -- Stoneclaw Totem R1
|
||||
[6390] = { slot = EARTH_TOTEM_SLOT, duration = 15 }, -- Stoneclaw Totem R2
|
||||
[6391] = { slot = EARTH_TOTEM_SLOT, duration = 15 }, -- Stoneclaw Totem R3
|
||||
[6392] = { slot = EARTH_TOTEM_SLOT, duration = 15 }, -- Stoneclaw Totem R4
|
||||
[10427] = { slot = EARTH_TOTEM_SLOT, duration = 15 }, -- Stoneclaw Totem R5
|
||||
[10428] = { slot = EARTH_TOTEM_SLOT, duration = 15 }, -- Stoneclaw Totem R6
|
||||
[8071] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Stoneskin Totem R1
|
||||
[8154] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Stoneskin Totem R2
|
||||
[8155] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Stoneskin Totem R3
|
||||
[10406] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Stoneskin Totem R4
|
||||
[10407] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Stoneskin Totem R5
|
||||
[10408] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Stoneskin Totem R6
|
||||
[8075] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Strength of Earth Totem R1
|
||||
[8160] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Strength of Earth Totem R2
|
||||
[8161] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Strength of Earth Totem R3
|
||||
[10442] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Strength of Earth Totem R4
|
||||
[25361] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Strength of Earth Totem R5
|
||||
[8143] = { slot = EARTH_TOTEM_SLOT, duration = 120 }, -- Tremor Totem
|
||||
|
||||
-- WATER (slot 3)
|
||||
[8170] = { slot = WATER_TOTEM_SLOT, duration = 120 }, -- Disease Cleansing Totem
|
||||
[8185] = { slot = WATER_TOTEM_SLOT, duration = 120 }, -- Fire Resistance Totem R1
|
||||
[10537] = { slot = WATER_TOTEM_SLOT, duration = 120 }, -- Fire Resistance Totem R2
|
||||
[10538] = { slot = WATER_TOTEM_SLOT, duration = 120 }, -- Fire Resistance Totem R3
|
||||
[5394] = { slot = WATER_TOTEM_SLOT, duration = 60 }, -- Healing Stream Totem R1
|
||||
[6375] = { slot = WATER_TOTEM_SLOT, duration = 60 }, -- Healing Stream Totem R2
|
||||
[6377] = { slot = WATER_TOTEM_SLOT, duration = 60 }, -- Healing Stream Totem R3
|
||||
[10462] = { slot = WATER_TOTEM_SLOT, duration = 60 }, -- Healing Stream Totem R4
|
||||
[10463] = { slot = WATER_TOTEM_SLOT, duration = 60 }, -- Healing Stream Totem R5
|
||||
[5675] = { slot = WATER_TOTEM_SLOT, duration = 60 }, -- Mana Spring Totem R1
|
||||
[10495] = { slot = WATER_TOTEM_SLOT, duration = 60 }, -- Mana Spring Totem R2
|
||||
[10496] = { slot = WATER_TOTEM_SLOT, duration = 60 }, -- Mana Spring Totem R3
|
||||
[10497] = { slot = WATER_TOTEM_SLOT, duration = 60 }, -- Mana Spring Totem R4
|
||||
[16190] = { slot = WATER_TOTEM_SLOT, duration = 12 }, -- Mana Tide Totem
|
||||
[8166] = { slot = WATER_TOTEM_SLOT, duration = 120 }, -- Poison Cleansing Totem
|
||||
|
||||
-- AIR (slot 4)
|
||||
[8835] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Grace of Air Totem R1
|
||||
[10627] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Grace of Air Totem R2
|
||||
[8177] = { slot = AIR_TOTEM_SLOT, duration = 45 }, -- Grounding Totem
|
||||
[10595] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Nature Resistance Totem R1
|
||||
[10600] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Nature Resistance Totem R2
|
||||
[10601] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Nature Resistance Totem R3
|
||||
[25359] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Tranquil Air Totem
|
||||
[8512] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Windfury Totem R1
|
||||
[10613] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Windfury Totem R2
|
||||
[10614] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Windfury Totem R3
|
||||
[15107] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Windwall Totem R1
|
||||
[15421] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Windwall Totem R2
|
||||
[15422] = { slot = AIR_TOTEM_SLOT, duration = 120 }, -- Windwall Totem R3
|
||||
}
|
||||
|
||||
-- icon-based fallback table (used by CastSpell/UseAction hooks that don't have spellId)
|
||||
local totems = {
|
||||
[FIRE_TOTEM_SLOT] = {
|
||||
["Spell_Fire_SealOfFire"] = {[-1] = 5},
|
||||
["Spell_Nature_GuardianWard"] = {[-1] = 120},
|
||||
["Spell_FrostResistanceTotem_01"] = {[-1] = 120},
|
||||
["Spell_Fire_SelfDestruct"] = {[-1] = 20},
|
||||
["Spell_Fire_SearingTotem"] = {[-1] = 55,[1] = 30,[2] = 35,[3] = 40,[4] = 45,[5] = 50,[6] = 55},
|
||||
},
|
||||
[EARTH_TOTEM_SLOT] = {
|
||||
["Spell_Nature_StrengthOfEarthTotem02"] = {[-1] = 45},
|
||||
["Spell_Nature_StoneClawTotem"] = {[-1] = 15},
|
||||
["Spell_Nature_StoneSkinTotem"] = {[-1] = 120},
|
||||
["Spell_Nature_EarthBindTotem"] = {[-1] = 120},
|
||||
["Spell_Nature_TremorTotem"] = {[-1] = 120},
|
||||
},
|
||||
[WATER_TOTEM_SLOT] = {
|
||||
["Spell_Nature_DiseaseCleansingTotem"] = {[-1] = 120},
|
||||
["Spell_FireResistanceTotem_01"] = {[-1] = 120},
|
||||
["INV_Spear_04"] = {[-1] = 60},
|
||||
["Spell_Nature_ManaRegenTotem"] = {[-1] = 60},
|
||||
["Spell_Frost_SummonWaterElemental"] = {[-1] = 12},
|
||||
["Spell_Nature_PoisonCleansingTotem"] = {[-1] = 120},
|
||||
},
|
||||
[AIR_TOTEM_SLOT] = {
|
||||
["Spell_Nature_InvisibilityTotem"] = {[-1] = 120},
|
||||
["Spell_Nature_GroundingTotem"] = {[-1] = 45},
|
||||
["Spell_Nature_NatureResistanceTotem"] = {[-1] = 120},
|
||||
["Spell_Nature_Brilliance"] = {[-1] = 120},
|
||||
["Spell_Nature_Windfury"] = {[-1] = 120},
|
||||
["Spell_Nature_EarthBind"] = {[-1] = 120},
|
||||
},
|
||||
}
|
||||
|
||||
GetTotemInfo = function(id)
|
||||
if not active[id] or not active[id].name then return end
|
||||
if active[id].start + active[id].duration - GetTime() < 0 then
|
||||
libtotem:Clean(id)
|
||||
return nil
|
||||
end
|
||||
return 1, active[id].name, active[id].start, active[id].duration, active[id].icon
|
||||
end
|
||||
|
||||
if class ~= "SHAMAN" then return end
|
||||
|
||||
libtotem = CreateFrame("Frame")
|
||||
libtotem:RegisterEvent("PLAYER_DEAD")
|
||||
libtotem:SetScript("OnEvent", function()
|
||||
if event == "PLAYER_DEAD" then
|
||||
for i = 1, 4 do libtotem:Clean(i) end
|
||||
end
|
||||
end)
|
||||
|
||||
libtotem.totems = totems
|
||||
|
||||
libtotem.Clean = function(self, slot)
|
||||
active[slot].name = nil
|
||||
active[slot].start = nil
|
||||
active[slot].duration = nil
|
||||
active[slot].icon = nil
|
||||
end
|
||||
|
||||
-- Direct SpellID commit (Nampower SPELL_GO_SELF, most accurate)
|
||||
libtotem.CommitBySpellId = function(spellId, icon)
|
||||
local data = spellids[spellId]
|
||||
if not data then return false end
|
||||
local slot = data.slot
|
||||
active[slot].name = active[slot].pending_name or active[slot].name
|
||||
active[slot].duration = data.duration
|
||||
active[slot].icon = icon or active[slot].pending_icon
|
||||
active[slot].start = GetTime()
|
||||
active[slot].pending_name = nil
|
||||
active[slot].pending_icon = nil
|
||||
return true
|
||||
end
|
||||
|
||||
-- Fallback: icon-based lookup (for CastSpell/UseAction without spellId)
|
||||
libtotem.CheckAddQueue = function(self, name, rank, icon, spellId)
|
||||
-- if we have a spellId, just store the name/icon as pending for SPELL_GO
|
||||
if spellId and spellids[spellId] then
|
||||
local slot = spellids[spellId].slot
|
||||
active[slot].pending_name = name
|
||||
active[slot].pending_icon = icon
|
||||
return true
|
||||
end
|
||||
|
||||
-- icon-based fallback
|
||||
for slot = 1, 4 do
|
||||
for texture, data in pairs(totems[slot]) do
|
||||
if string.find(icon, texture, 1) then
|
||||
if rank then
|
||||
_, _, rank = string.find(rank, "%s(%d+)")
|
||||
end
|
||||
local duration
|
||||
if rank and tonumber(rank) and data[tonumber(rank)] then
|
||||
duration = data[tonumber(rank)]
|
||||
else
|
||||
duration = data[-1]
|
||||
end
|
||||
active[slot].pending_name = name
|
||||
active[slot].pending_icon = icon
|
||||
active[slot].pending_duration = duration
|
||||
return true
|
||||
end
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
-- assign library to global space
|
||||
pfUI.api.libtotem = libtotem
|
||||
|
||||
-- SPELL_GO_SELF from libdebuff: commit directly by SpellID, no queue needed
|
||||
pfUI.libdebuff_spell_go_hooks = pfUI.libdebuff_spell_go_hooks or {}
|
||||
pfUI.libdebuff_spell_go_hooks["libtotem"] = function(spellId)
|
||||
if not spellId then return end
|
||||
local data = spellids[spellId]
|
||||
if not data then return end
|
||||
local slot = data.slot
|
||||
-- use pending name/icon if available (set by CastSpellByName hook), else GetSpellInfo
|
||||
local name = active[slot].pending_name
|
||||
local icon = active[slot].pending_icon
|
||||
if not name then
|
||||
name = C_Spell.GetSpellName(spellId)
|
||||
end
|
||||
active[slot].name = name
|
||||
active[slot].duration = data.duration
|
||||
active[slot].icon = icon
|
||||
active[slot].start = GetTime()
|
||||
active[slot].pending_name = nil
|
||||
active[slot].pending_icon = nil
|
||||
active[slot].pending_duration = nil
|
||||
end
|
||||
|
||||
-- Hook CastSpellByName to store pending name/icon per slot
|
||||
hooksecurefunc("CastSpellByName", function(effect, target)
|
||||
local name, rank, icon, _, _, _, spellId = libspell.GetSpellInfo(effect)
|
||||
if not name then return end
|
||||
libtotem:CheckAddQueue(name, rank, icon, spellId)
|
||||
end)
|
||||
|
||||
-- Hook CastSpell to store pending name/icon per slot
|
||||
hooksecurefunc("CastSpell", function(id, bookType)
|
||||
if not id or not bookType then return end
|
||||
if bookType ~= BOOKTYPE_SPELL and bookType ~= BOOKTYPE_PET then return end
|
||||
local name, rank, icon, _, _, _, spellId = libspell.GetSpellInfo(id, bookType)
|
||||
if not name then return end
|
||||
libtotem:CheckAddQueue(name, rank, icon, spellId)
|
||||
end)
|
||||
|
||||
-- Hook UseAction. GetActionInfo + GetMacroSpell give us the spellID
|
||||
-- directly for both spell-action and macro-action slots, so the
|
||||
-- tooltip-scan fallback (and the "no spellId available" caveat) goes away.
|
||||
hooksecurefunc("UseAction", function(slot, target, selfcast)
|
||||
if not IsCurrentAction(slot) then return end
|
||||
local kind, id = GetActionInfo(slot)
|
||||
local name, rank, spellID
|
||||
if kind == "spell" then
|
||||
spellID = id
|
||||
local spellInfo = C_Spell.GetSpellInfo(id)
|
||||
name, rank = spellInfo.name, spellInfo.rank
|
||||
elseif kind == "macro" then
|
||||
name, rank, spellID = GetMacroSpell(id)
|
||||
end
|
||||
if not name then return end
|
||||
libtotem:CheckAddQueue(name, rank, GetActionTexture(slot), spellID)
|
||||
end)
|
||||
+19
-20
@@ -1,6 +1,4 @@
|
||||
pfUI:RegisterModule("totems", function ()
|
||||
local _, class = UnitClass("player")
|
||||
|
||||
local slots = {
|
||||
[FIRE_TOTEM_SLOT] = { r = .5, g = .2, b = .1 },
|
||||
[EARTH_TOTEM_SLOT] = { r = .2, g = .4, b = .1 },
|
||||
@@ -15,43 +13,44 @@ pfUI:RegisterModule("totems", function ()
|
||||
totems:RefreshList()
|
||||
end)
|
||||
|
||||
if class == "SHAMAN" then
|
||||
-- there's no totem event in vanilla using ticks instead
|
||||
local eventemu = CreateFrame("Frame")
|
||||
eventemu:SetScript("OnUpdate", function()
|
||||
if ( this.tick or 1) > GetTime() then return else this.tick = GetTime() + .5 end
|
||||
totems:RefreshList()
|
||||
end)
|
||||
end
|
||||
|
||||
totems.OnEnter = function(self)
|
||||
if not this.id then return end
|
||||
local active, name, start, duration, icon = GetTotemInfo(this.id)
|
||||
if not name or not active then return end -- Prüfen ob name gültig ist
|
||||
-- native GetTotemInfo's 1st return is tool presence, not "summoned";
|
||||
-- a live totem shows a non-empty name / non-zero start.
|
||||
local _, name = GetTotemInfo(this.id)
|
||||
if not name or name == "" then return end
|
||||
local color = slots[this.id]
|
||||
GameTooltip:SetOwner(this, "ANCHOR_LEFT")
|
||||
GameTooltip:SetText(name, color.r+.2, color.g+.2, color.b+.2)
|
||||
local timeleft = GetTotemTimeLeft(this.id)
|
||||
if timeleft and timeleft > 0 then
|
||||
GameTooltip:AddLine(string.format("%d:%02d", floor(timeleft/60), floor(mod(timeleft, 60))), 1, 1, 1)
|
||||
end
|
||||
GameTooltip:Show()
|
||||
end
|
||||
end
|
||||
|
||||
totems.OnLeave = function(self)
|
||||
GameTooltip:Hide()
|
||||
end
|
||||
|
||||
totems.OnClick = function(self)
|
||||
if this.id and arg1 and arg1 == "LeftButton" then
|
||||
-- Try to recast totem on left click
|
||||
local active, name, start, duration, icon = GetTotemInfo(this.id)
|
||||
if name then CastSpellByName(name) end
|
||||
if not this.id then return end
|
||||
if arg1 == "LeftButton" then
|
||||
-- recast the totem on left click
|
||||
local _, name = GetTotemInfo(this.id)
|
||||
if name and name ~= "" then CastSpellByName(name) end
|
||||
elseif arg1 == "RightButton" then
|
||||
-- target the totem on right click
|
||||
TargetTotem(this.id)
|
||||
end
|
||||
end
|
||||
|
||||
totems.RefreshList = function(self)
|
||||
local count = 0
|
||||
for i = 1, MAX_TOTEMS do
|
||||
local active, name, start, duration, icon = GetTotemInfo(i)
|
||||
local _, _, start, duration, icon = GetTotemInfo(i)
|
||||
|
||||
if active and icon and icon ~= "" then
|
||||
if start and start > 0 and icon and icon ~= "" then
|
||||
count = count + 1
|
||||
local color = slots[i]
|
||||
|
||||
|
||||
@@ -86,18 +86,6 @@ pfUI:RegisterModule("turtle-wow", function ()
|
||||
L["debuffs"]['Moonfire'] = {[1]=9.0,[2]=18.0,[3]=18.0,[4]=18.0,[5]=18.0,[6]=18.0,[7]=18.0,[8]=18.0,[9]=18.0,[10]=18.0,[0]=18.0}
|
||||
L["debuffs"]['Deep Wound'] = {[0]=6.0}
|
||||
|
||||
-- turtle wow totemic recall clear totem indicators
|
||||
local _, class = UnitClass("player")
|
||||
if libtotem and class == "SHAMAN" then
|
||||
local trecall = CreateFrame("Frame", "pfTotemsRecall", UIParent)
|
||||
trecall:RegisterEvent("CHAT_MSG_SPELL_SELF_BUFF")
|
||||
trecall:SetScript("OnEvent", function()
|
||||
if arg1 and string.find(arg1, T["You gain (.+) Mana from Totemic Recall"]) then
|
||||
for i = 1, 4 do libtotem:Clean(i) end
|
||||
end
|
||||
end)
|
||||
end
|
||||
|
||||
local delay = CreateFrame("Frame")
|
||||
delay:SetScript("OnUpdate", function()
|
||||
this:Hide()
|
||||
|
||||
Reference in New Issue
Block a user