You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

261 lines
11 KiB

local _, Cell = ...
local L = Cell.L
local F = Cell.funcs
local I = Cell.iFuncs
-------------------------------------------------
-- custom indicators
-------------------------------------------------
local enabledIndicators = {}
local customIndicators = {
["buff"] = {},
["debuff"] = {},
}
Cell.snippetVars.enabledIndicators = enabledIndicators
Cell.snippetVars.customIndicators = customIndicators
--! init enabledIndicators & customIndicators
local function UpdateTablesForIndicator(indicatorTable)
local indicatorName = indicatorTable["indicatorName"]
local auraType = indicatorTable["auraType"]
-- keep custom indicators in table
if indicatorTable["enabled"] then enabledIndicators[indicatorName] = true end
-- NOTE: icons is different from other custom indicators, more like the Debuffs indicator
if indicatorTable["type"] == "icons" then
customIndicators[auraType][indicatorName] = {
["auras"] = F:ConvertSpellTable(indicatorTable["auras"], indicatorTable["trackByName"]), -- auras to match
["isIcons"] = true,
["found"] = {},
["num"] = indicatorTable["num"],
}
else
customIndicators[auraType][indicatorName] = {
["auras"] = F:ConvertSpellTable(indicatorTable["auras"], indicatorTable["trackByName"]), -- auras to match
["top"] = {}, -- top aura details
["topOrder"] = {}, -- top aura order
}
end
if auraType == "buff" then
customIndicators[auraType][indicatorName]["castBy"] = indicatorTable["castBy"]
customIndicators[auraType][indicatorName]["_auras"] = F:Copy(indicatorTable["auras"]) --* save ids
customIndicators[auraType][indicatorName]["trackByName"] = indicatorTable["trackByName"]
end
end
function I:CreateIndicator(parent, indicatorTable, noTableUpdate)
local indicatorName = indicatorTable["indicatorName"]
local indicator
if indicatorTable["type"] == "icon" then
indicator = I:CreateAura_BarIcon(parent:GetName()..indicatorName, parent.widget.overlayFrame)
elseif indicatorTable["type"] == "text" then
indicator = I:CreateAura_Text(parent:GetName()..indicatorName, parent.widget.overlayFrame)
elseif indicatorTable["type"] == "bar" then
indicator = I:CreateAura_Bar(parent:GetName()..indicatorName, parent.widget.overlayFrame)
elseif indicatorTable["type"] == "rect" then
indicator = I:CreateAura_Rect(parent:GetName()..indicatorName, parent.widget.overlayFrame)
elseif indicatorTable["type"] == "icons" then
indicator = I:CreateAura_Icons(parent:GetName()..indicatorName, parent.widget.overlayFrame, 10)
elseif indicatorTable["type"] == "color" then
indicator = I:CreateAura_Color(parent:GetName()..indicatorName, parent)
elseif indicatorTable["type"] == "texture" then
indicator = I:CreateAura_Texture(parent:GetName()..indicatorName, parent.widget.overlayFrame)
elseif indicatorTable["type"] == "glow" then
indicator = I:CreateAura_Glow(parent:GetName()..indicatorName, parent)
elseif indicatorTable["type"] == "overlay" then
indicator = I:CreateAura_Overlay(parent:GetName()..indicatorName, parent)
end
parent.indicators[indicatorName] = indicator
if not noTableUpdate then
UpdateTablesForIndicator(indicatorTable)
end
return indicator
end
function I:RemoveIndicator(parent, indicatorName, auraType)
local indicator = parent.indicators[indicatorName]
indicator:ClearAllPoints()
indicator:Hide()
indicator:SetParent(nil)
parent.indicators[indicatorName] = nil
enabledIndicators[indicatorName] = nil
customIndicators[auraType][indicatorName] = nil
end
-- used for switching to a new layout
function I:RemoveAllCustomIndicators(parent)
if parent ~= CellIndicatorsPreviewButton then
wipe(enabledIndicators)
wipe(customIndicators["buff"])
wipe(customIndicators["debuff"])
end
for indicatorName, indicator in pairs(parent.indicators) do
if string.find(indicatorName, "^indicator") then
indicator:ClearAllPoints()
indicator:Hide()
indicator:SetParent(nil)
parent.indicators[indicatorName] = nil
end
end
end
function I:ResetCustomIndicatorTables()
-- clear
wipe(enabledIndicators)
wipe(customIndicators["buff"])
wipe(customIndicators["debuff"])
-- update customs
for i = Cell.defaults.builtIns + 1, #Cell.vars.currentLayoutTable.indicators do
UpdateTablesForIndicator(Cell.vars.currentLayoutTable.indicators[i])
end
end
local function UpdateCustomIndicators(layout, indicatorName, setting, value, value2)
if layout and layout ~= Cell.vars.currentLayout then return end
if not indicatorName or not string.find(indicatorName, "^indicator") then return end
if setting == "enabled" then
if value then
enabledIndicators[indicatorName] = true
else
enabledIndicators[indicatorName] = nil
end
elseif setting == "auras" then
customIndicators[value][indicatorName]["_auras"] = F:Copy(value2) --* save ids
customIndicators[value][indicatorName]["auras"] = F:ConvertSpellTable(value2, customIndicators[value][indicatorName]["trackByName"])
elseif setting == "checkbutton" then
if customIndicators["buff"][indicatorName] then
customIndicators["buff"][indicatorName][value] = value2
if value == "trackByName" then
customIndicators["buff"][indicatorName]["auras"] = F:ConvertSpellTable(customIndicators["buff"][indicatorName]["_auras"], value2)
end
elseif customIndicators["debuff"][indicatorName] then
customIndicators["debuff"][indicatorName][value] = value2
end
else -- num, castBy
if customIndicators["buff"][indicatorName] then
customIndicators["buff"][indicatorName][setting] = value
elseif customIndicators["debuff"][indicatorName] then
customIndicators["debuff"][indicatorName][setting] = value
end
end
end
Cell:RegisterCallback("UpdateIndicators", "UpdateCustomIndicators", UpdateCustomIndicators)
-------------------------------------------------
-- reset
-------------------------------------------------
function I:ResetCustomIndicators(unitButton, auraType)
local unit = unitButton.state.displayedUnit
for indicatorName, indicatorTable in pairs(customIndicators[auraType]) do
if enabledIndicators[indicatorName] and unitButton.indicators[indicatorName] then
unitButton.indicators[indicatorName]:Hide(true)
if indicatorTable["isIcons"] then
indicatorTable["found"][unit] = 0
else
indicatorTable["topOrder"][unit] = 999
if not indicatorTable["top"][unit] then
indicatorTable["top"][unit] = {}
else
wipe(indicatorTable["top"][unit])
end
end
end
end
end
-------------------------------------------------
-- update
-------------------------------------------------
local function Update(indicator, indicatorTable, unit, spell, start, duration, debuffType, icon, count, refreshing)
if indicatorTable["isIcons"] then
if indicatorTable["found"][unit] < indicatorTable["num"] then
indicatorTable["found"][unit] = indicatorTable["found"][unit] + 1
indicator:UpdateSize(indicatorTable["found"][unit])
indicator[indicatorTable["found"][unit]]:SetCooldown(start, duration, debuffType, icon, count, refreshing)
indicator:Show()
end
else
if indicatorTable["auras"][spell] < indicatorTable["topOrder"][unit] then
indicatorTable["topOrder"][unit] = indicatorTable["auras"][spell]
indicatorTable["top"][unit]["start"] = start
indicatorTable["top"][unit]["duration"] = duration
indicatorTable["top"][unit]["debuffType"] = debuffType
indicatorTable["top"][unit]["texture"] = icon
indicatorTable["top"][unit]["count"] = count
indicatorTable["top"][unit]["refreshing"] = refreshing
end
end
end
function I:UpdateCustomIndicators(unitButton, auraInfo, refreshing)
local unit = unitButton.state.displayedUnit
local auraType = auraInfo.isHelpful and "buff" or "debuff"
local icon = auraInfo.icon
local debuffType = auraInfo.isHarmful and (auraInfo.dispelName or "")
local count = auraInfo.applications
local duration = auraInfo.duration
local start = (auraInfo.expirationTime or 0) - auraInfo.duration
local spellId = auraInfo.spellId
local spellName = auraInfo.name
local castByMe = auraInfo.sourceUnit == "player" or auraInfo.sourceUnit == "pet"
-- check Bleed
if auraInfo.isHarmful then
debuffType = I:CheckDebuffType(debuffType, spellId)
end
for indicatorName, indicatorTable in pairs(customIndicators[auraType]) do
if indicatorName and enabledIndicators[indicatorName] and unitButton.indicators[indicatorName] then
local spell --* trackByName
if indicatorTable["trackByName"] then
spell = spellName
else
spell = spellId
end
if indicatorTable["auras"][spell] or (indicatorTable["auras"][0] and duration ~= 0) then -- is in indicator spell list
if auraType == "buff" then
-- check caster
if (indicatorTable["castBy"] == "me" and castByMe) or (indicatorTable["castBy"] == "others" and not castByMe) or (indicatorTable["castBy"] == "anyone") then
Update(unitButton.indicators[indicatorName], indicatorTable, unit, spell, start, duration, debuffType, icon, count, refreshing)
end
else -- debuff
Update(unitButton.indicators[indicatorName], indicatorTable, unit, spell, start, duration, debuffType, icon, count, refreshing)
end
end
end
end
end
-------------------------------------------------
-- show
-------------------------------------------------
function I:ShowCustomIndicators(unitButton, auraType)
local unit = unitButton.state.displayedUnit
for indicatorName, indicatorTable in pairs(customIndicators[auraType]) do
if indicatorName and enabledIndicators[indicatorName] and unitButton.indicators[indicatorName] then
if not indicatorTable["isIcons"] then
if indicatorTable["top"][unit]["start"] then
unitButton.indicators[indicatorName]:SetCooldown(
indicatorTable["top"][unit]["start"],
indicatorTable["top"][unit]["duration"],
indicatorTable["top"][unit]["debuffType"],
indicatorTable["top"][unit]["texture"],
indicatorTable["top"][unit]["count"],
indicatorTable["top"][unit]["refreshing"])
end
end
end
end
end