Files
MetaHunt/modules/zhunter/zButtonAspect.lua
T
2026-03-23 22:25:10 +01:00

394 lines
12 KiB
Lua

local function zButtonAspect_GetRoot()
return MTH_ZH_GetSavedRoot()
end
local root = zButtonAspect_GetRoot()
if not root["zButtonAspect"] then
root["zButtonAspect"] = {}
root["zButtonAspect"]["spells"] = {1, 2, 3, 4, 5, 6, 7, 8}
root["zButtonAspect"]["rows"] = 1
root["zButtonAspect"]["horizontal"] = nil
root["zButtonAspect"]["vertical"] = nil
root["zButtonAspect"]["firstbutton"] = "RIGHT"
root["zButtonAspect"]["enabled"] = 1
root["zButtonAspect"]["tooltip"] = 1
root["zButtonAspect"]["parent"] = {}
root["zButtonAspect"]["parent"]["size"] = 36
root["zButtonAspect"]["parent"]["hide"] = nil
root["zButtonAspect"]["parent"]["circle"] = 1
root["zButtonAspect"]["children"] = {}
root["zButtonAspect"]["children"]["size"] = 36
root["zButtonAspect"]["children"]["hideonclick"] = 1
end
ZHunterMod_Aspect_Spells = {
ZHUNTER_ASPECT_HAWK,
ZHUNTER_ASPECT_MONKEY,
ZHUNTER_ASPECT_WOLF,
ZHUNTER_ASPECT_CHEETAH,
ZHUNTER_ASPECT_PACK,
ZHUNTER_ASPECT_WILD,
ZHUNTER_ASPECT_BEAST,
ZHUNTER_ASPECT_VIPER
}
local ZHUNTER_ASPECT_MAX = table.getn(ZHunterMod_Aspect_Spells)
local zButtonAspect_LastAuraUpdateAt = 0
local zButtonAspect_MinAuraInterval = 0.15
local zButtonAspect_MinAuraIntervalCombat = 0.60
local zButtonAspect_LastAuraTexture = nil
local zButtonAspect_LastParentId = nil
local zButtonAspect_AuraProbeTextLeft1 = nil
local function zButtonAspect_GetSaved()
local currentRoot = zButtonAspect_GetRoot()
if not currentRoot["zButtonAspect"] then
currentRoot["zButtonAspect"] = {}
end
return currentRoot["zButtonAspect"]
end
local function zButtonAspect_EnsureConfig()
local saved = zButtonAspect_GetSaved()
saved["count"] = nil
if saved["rows"] == nil then
saved["rows"] = 1
end
if saved["firstbutton"] == nil then
saved["firstbutton"] = "RIGHT"
end
if saved["enabled"] == nil then
saved["enabled"] = 1
end
if saved["tooltip"] == nil then
saved["tooltip"] = 1
end
if not saved["parent"] then
saved["parent"] = {}
end
if saved["parent"]["size"] == nil then
saved["parent"]["size"] = 36
end
if saved["parent"]["circle"] == nil then
saved["parent"]["circle"] = 1
end
if not saved["children"] then
saved["children"] = {}
end
if saved["children"]["size"] == nil then
saved["children"]["size"] = 36
end
if saved["children"]["hideonclick"] == nil then
saved["children"]["hideonclick"] = 1
end
if not saved["spells"] then
saved["spells"] = {}
end
if not saved["visible"] then
saved["visible"] = {}
end
for i = 1, ZHUNTER_ASPECT_MAX do
if not tonumber(saved["spells"][i]) then
saved["spells"][i] = i
end
if saved["visible"][i] == nil then
saved["visible"][i] = 1
end
end
end
local function zButtonAspect_ApplyRuntimeSettings()
if not zButtonAspect then
return
end
local saved = zButtonAspect_GetSaved()
zButtonAspect.tooltip = saved["tooltip"] and true or false
zButtonAspect.hideonclick = saved["children"] and saved["children"]["hideonclick"] and true or false
zButtonAspect.expandonhover = saved["children"] and saved["children"]["expandonhover"] and true or false
zButtonAspect.fadetimer = saved["children"] and tonumber(saved["children"]["fadetimer"]) or 0
end
local function zButtonAspect_IsKnownAspectSpellId(spellId)
if not spellId then
return false
end
local spellName = GetSpellName(spellId, "spell")
if not spellName or spellName == "" then
return false
end
for i = 1, table.getn(ZHunterMod_Aspect_Spells) do
if ZHunterMod_Aspect_Spells[i] == spellName then
return true
end
end
return false
end
local function zButtonAspect_EnsureValidParentId()
if not (zButtonAspect and zButtonAspect.count) then
return
end
if zButtonAspect_IsKnownAspectSpellId(zButtonAspect.id) then
return
end
for i = 1, zButtonAspect.count do
local child = getglobal(zButtonAspect.name .. i)
if child and child.id and zButtonAspect_IsKnownAspectSpellId(child.id) then
zButtonAspect.id = child.id
zButtonAspect.isspell = 1
ZSpellButton_UpdateButton(zButtonAspect)
ZSpellButton_UpdateCooldown(zButtonAspect)
return
end
end
end
function zButtonAspect_OnLoad()
this:RegisterEvent("VARIABLES_LOADED")
end
function zButtonAspect_OnEvent()
if event == "VARIABLES_LOADED" then
if not zButtonAspect then
return
end
if UnitClass("player") ~= ZHUNTER_HUNTER then
zButtonAspect:UnregisterAllEvents()
zButtonAspect:Hide()
return
end
zButtonAspect_CreateButtons()
MTH_ZH_AspectAdjust = CreateFrame("Frame", "MTH_ZH_AspectAdjust")
MTH_ZH_AspectAdjust:RegisterEvent("PLAYER_AURAS_CHANGED")
MTH_ZH_AspectAdjust:RegisterEvent("PLAYER_ENTERING_WORLD")
MTH_ZH_AspectAdjust:RegisterEvent("SPELLS_CHANGED")
MTH_ZH_AspectAdjust:RegisterEvent("CHARACTER_POINTS_CHANGED")
MTH_ZH_AspectAdjust:RegisterEvent("LEARNED_SPELL_IN_TAB")
MTH_ZH_AspectAdjust:SetScript("OnEvent", MTH_ZH_AspectAdjust_OnEvent)
zButtonAspect_Tooltip = CreateFrame("GameTooltip", "MTH_ZH_AspectProbe", nil, "GameTooltipTemplate")
if zButtonAspect_Tooltip and zButtonAspect_Tooltip.GetName then
local tooltipName = zButtonAspect_Tooltip:GetName()
if tooltipName then
zButtonAspect_AuraProbeTextLeft1 = getglobal(tooltipName .. "TextLeft1")
end
end
zButtonAspect_SetupSizeAndPosition()
end
end
function zButtonAspect_CreateButtons()
zButtonAspect_EnsureConfig()
local saved = zButtonAspect_GetSaved()
ZSpellButton_CreateChildren(zButtonAspect, "zButtonAspect", ZHUNTER_ASPECT_MAX)
local info = {}
local infoIndex = 1
for i=1, table.getn(ZHunterMod_Aspect_Spells) do
if not tonumber(saved["spells"][i]) then
info = ZHunterMod_Aspect_Spells
saved["spells"] = {1, 2, 3, 4, 5, 6, 7}
break
end
local spellIndex = saved["spells"][i]
if saved["visible"][spellIndex] ~= false then
info[infoIndex] = ZHunterMod_Aspect_Spells[spellIndex]
infoIndex = infoIndex + 1
end
end
zButtonAspect.found = ZSpellButton_SetButtons(zButtonAspect, info)
zButtonAspect_ApplyRuntimeSettings()
zButtonAspect_EnsureValidParentId()
end
function zButtonAspect_SetupSizeAndPosition()
zButtonAspect_EnsureConfig()
local saved = zButtonAspect_GetSaved()
if saved["enabled"] == false or saved["enabled"] == 0 then
if MTH_ZH_AspectAdjust and MTH_ZH_AspectAdjust.SetScript then
MTH_ZH_AspectAdjust:SetScript("OnEvent", nil)
end
if zButtonAspect and zButtonAspect.Hide then
zButtonAspect:Hide()
end
return
end
if MTH_ZH_AspectAdjust and MTH_ZH_AspectAdjust.SetScript then
MTH_ZH_AspectAdjust:SetScript("OnEvent", MTH_ZH_AspectAdjust_OnEvent)
end
local displayCount = zButtonAspect.found or ZHUNTER_ASPECT_MAX
if displayCount < 0 then
displayCount = 0
end
ZSpellButton_SetSize(zButtonAspect, saved["parent"]["size"])
ZSpellButton_SetSize(zButtonAspect, saved["children"]["size"], 1)
ZSpellButton_SetExpandDirection(zButtonAspect, saved["firstbutton"])
ZSpellButton_ArrangeChildren(zButtonAspect, saved["rows"],
displayCount, saved["horizontal"],
saved["vertical"])
end
function zButtonAspect_Reset()
local currentRoot = zButtonAspect_GetRoot()
currentRoot["zButtonAspect"] = {}
local saved = zButtonAspect_GetSaved()
saved["spells"] = {1, 2, 3, 4, 5, 6, 7}
saved["rows"] = 1
saved["horizontal"] = nil
saved["vertical"] = nil
saved["firstbutton"] = "RIGHT"
saved["enabled"] = 1
saved["tooltip"] = 1
saved["parent"] = {}
saved["parent"]["size"] = 36
saved["parent"]["hide"] = nil
saved["parent"]["circle"] = 1
saved["children"] = {}
saved["children"]["size"] = 36
saved["children"]["hideonclick"] = 1
saved["visible"] = {1, 1, 1, 1, 1, 1, 1}
zButtonAspect_EnsureConfig()
end
function MTH_ZH_AspectAdjust_OnEvent()
if not zButtonAspect or not zButtonAspect.count then
return
end
if event == "PLAYER_AURAS_CHANGED" then
local now = GetTime and GetTime() or 0
local minInterval = zButtonAspect_MinAuraInterval
if UnitAffectingCombat and UnitAffectingCombat("player") then
minInterval = zButtonAspect_MinAuraIntervalCombat
end
if now > 0 and zButtonAspect_LastAuraUpdateAt > 0 and (now - zButtonAspect_LastAuraUpdateAt) < minInterval then
return
end
zButtonAspect_LastAuraUpdateAt = now
end
if event == "SPELLS_CHANGED" or event == "CHARACTER_POINTS_CHANGED" or event == "LEARNED_SPELL_IN_TAB" then
zButtonAspect_CreateButtons()
zButtonAspect_SetupSizeAndPosition()
zButtonAspect_EnsureValidParentId()
end
if event == "PLAYER_AURAS_CHANGED" or event == "PLAYER_ENTERING_WORLD"
or event == "SPELLS_CHANGED" or event == "CHARACTER_POINTS_CHANGED" or event == "LEARNED_SPELL_IN_TAB" then
zButtonAspect_EnsureValidParentId()
if not zButtonAspect1.id then
return
end
local button
local isParentTooltipOwned = GameTooltip and GameTooltip.IsOwned and GameTooltip:IsOwned(zButtonAspect)
local childrenShown = zButtonAspect.children and zButtonAspect.children.IsShown and zButtonAspect.children:IsShown()
local needChildIconScan = (event ~= "PLAYER_AURAS_CHANGED") or childrenShown or isParentTooltipOwned
local buttontextures = nil
local hasDuplicateChildTexture = nil
if needChildIconScan then
buttontextures = {}
local textureSeen = {}
for i=1, zButtonAspect.count do
button = getglobal(zButtonAspect.name..i)
button.icon = nil
if button.id then
local btnTexture = GetSpellTexture(button.id, "spell")
if btnTexture then
if textureSeen[btnTexture] then
hasDuplicateChildTexture = true
elseif hasDuplicateChildTexture == nil then
hasDuplicateChildTexture = false
end
textureSeen[btnTexture] = 1
buttontextures[btnTexture] = button
end
end
end
end
local i = 1
local texture = GetSpellTexture(zButtonAspect1.id, "spell")
local buff = UnitBuff("player", i)
local spellname, buffname
local newParentId = zButtonAspect1.id
while buff do
if texture == buff and zButtonAspect2.id then
newParentId = zButtonAspect2.id
end
if needChildIconScan and buttontextures[buff] then
if hasDuplicateChildTexture then
zButtonAspect_Tooltip:SetOwner(this, "ANCHOR_NONE")
zButtonAspect_Tooltip:SetUnitBuff("player", i)
if zButtonAspect_AuraProbeTextLeft1 and zButtonAspect_AuraProbeTextLeft1.GetText then
buffname = zButtonAspect_AuraProbeTextLeft1:GetText()
else
buffname = nil
end
spellname = GetSpellName(buttontextures[buff].id, "spell")
if buffname == spellname then
buttontextures[buff].icon = "Interface\\Icons\\Spell_Nature_WispSplode"
end
else
buttontextures[buff].icon = "Interface\\Icons\\Spell_Nature_WispSplode"
end
end
i = i + 1
buff = UnitBuff("player", i)
end
if event == "PLAYER_AURAS_CHANGED" and zButtonAspect_LastAuraTexture == texture and zButtonAspect.id == newParentId and zButtonAspect_LastParentId == newParentId and not isParentTooltipOwned then
return
end
zButtonAspect_LastAuraTexture = texture
zButtonAspect_LastParentId = newParentId
zButtonAspect.id = newParentId
ZSpellButton_UpdateButton(zButtonAspect)
ZSpellButton_UpdateCooldown(zButtonAspect)
if needChildIconScan then
for i=1, zButtonAspect.count do
button = getglobal(zButtonAspect.name..i)
if button.id then
ZSpellButton_UpdateButton(button)
end
end
end
if isParentTooltipOwned then
ZSpellButtonParent_OnEnter(zButtonAspect)
end
end
end
function zButtonAspect_KeyBinding(index)
if MTH_ZH_IsModuleEnabled and not MTH_ZH_IsModuleEnabled() then
return
end
local button
if index then
button = getglobal("zButtonAspect"..index)
else
button = zButtonAspect
end
if button.id then
CastSpell(button.id, "spell")
if zButtonAspect.hideonclick then
if type(ZSpellButton_SetChildrenExpanded) == "function" then
ZSpellButton_SetChildrenExpanded(zButtonAspect, false)
elseif zButtonAspect.children then
zButtonAspect.children:Hide()
end
end
end
end
SLASH_zButtonAspect1 = "/ZAspect"
SlashCmdList["zButtonAspect"] = function(msg)
if MTH_ZH_HandleDisabledSlash and MTH_ZH_HandleDisabledSlash("Aspect button is disabled while module 'zhunter' is disabled.") then
return
end
if msg == "reset" then
zButtonAspect_Reset()
zButtonAspect:ClearAllPoints()
zButtonAspect:SetPoint("CENTER", UIParent, "CENTER", -60, 0)
elseif msg == "options" then
MTH_OpenOptions("Aspect")
else
MTH_ZH_Print("Possible Commands: \"options\", \"reset\"")
end
end