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.

280 lines
11 KiB

local PA = _G.ProjectAzilroka
local TB = PA:NewModule('TorghastBuffs', 'AceEvent-3.0')
local LSM = PA.LSM
PA.TB = TB
TB.Title = PA.ACL['|cFF16C3F2Torghast|r|cFFFFFFFFBuffs|r']
TB.Description = PA.ACL['Torghast Buffs']
TB.Authors = 'Azilroka'
TB.isEnabled = false
_G.TorghastBuffs = TB
local _G = _G
local format = format
local select, unpack = select, unpack
local strfind = strfind
local strmatch = strmatch
local tinsert = tinsert
local RegisterStateDriver = RegisterStateDriver
local UnregisterStateDriver = UnregisterStateDriver
local GetItemQualityColor = GetItemQualityColor
local CreateFrame = CreateFrame
local UIParent = UIParent
local UnitAura = UnitAura
local CopyTable = CopyTable
local DIRECTION_TO_POINT = { DOWN_RIGHT = 'TOPLEFT', DOWN_LEFT = 'TOPRIGHT', UP_RIGHT = 'BOTTOMLEFT', UP_LEFT = 'BOTTOMRIGHT', RIGHT_DOWN = 'TOPLEFT', RIGHT_UP = 'BOTTOMLEFT', LEFT_DOWN = 'TOPRIGHT', LEFT_UP = 'BOTTOMRIGHT' }
local DIRECTION_TO_HORIZONTAL_SPACING_MULTIPLIER = { DOWN_RIGHT = 1, DOWN_LEFT = -1, UP_RIGHT = 1, UP_LEFT = -1, RIGHT_DOWN = 1, RIGHT_UP = 1, LEFT_DOWN = -1, LEFT_UP = -1 }
local DIRECTION_TO_VERTICAL_SPACING_MULTIPLIER = { DOWN_RIGHT = -1, DOWN_LEFT = -1, UP_RIGHT = 1, UP_LEFT = 1, RIGHT_DOWN = -1, RIGHT_UP = 1, LEFT_DOWN = -1, LEFT_UP = 1 }
local IS_HORIZONTAL_GROWTH = { RIGHT_DOWN = true, RIGHT_UP = true, LEFT_DOWN = true, LEFT_UP = true }
local MasqueButtonData = { Icon = nil, Highlight = nil, FloatingBG = nil, Cooldown = nil, Flash = nil, Pushed = nil, Normal = nil, Disabled = nil, Checked = nil, Border = nil, AutoCastable = nil, HotKey = nil, Count = false, Name = nil, Duration = false, AutoCast = nil }
TB.Holder = CreateFrame('Frame', 'TorghastBuffsHolder', PA.PetBattleFrameHider)
TB.Holder:SetPoint('BOTTOM', UIParent, 'BOTTOM', 0, 360)
TB.Headers = {}
function TB:MasqueData(texture, highlight)
local btnData = CopyTable(MasqueButtonData)
btnData.Icon = texture
btnData.Highlight = highlight
return btnData
end
function TB:CreateIcon(button)
button.texture = button:CreateTexture(nil, 'ARTWORK')
PA:SetInside(button.texture)
button.texture:SetTexCoord(unpack(PA.TexCoords))
button.count = button:CreateFontString(nil, 'OVERLAY')
button.highlight = button:CreateTexture(nil, 'HIGHLIGHT')
button.highlight:SetColorTexture(1, 1, 1, .45)
PA:SetInside(button.highlight)
button.unit = button:GetParent().unit
TB:UpdateIcon(button)
button:SetScript('OnAttributeChanged', TB.OnAttributeChanged)
if TB.MasqueGroup and TB.db.Masque then
TB.MasqueGroup:AddButton(button, TB:MasqueData(button.texture, button.highlight))
if button.__MSQ_BaseFrame then button.__MSQ_BaseFrame:SetFrameLevel(2) end --Lower the framelevel to fix issue with buttons created during combat
TB.MasqueGroup:ReSkin()
else
PA:SetTemplate(button)
end
end
function TB:UpdateIcon(button)
button.count:ClearAllPoints()
button.count:Point('BOTTOMRIGHT', TB.db.countXOffset, TB.db.countYOffset)
button.count:FontTemplate(LSM:Fetch('font', TB.db.countFont), TB.db.countFontSize, TB.db.countFontOutline)
end
function TB:UpdateAura(button, index)
local name, texture, count, _, _, _, _, _, _, spellID = UnitAura(button.unit, index, 'MAW')
local atlas = _G.C_Spell.GetMawPowerBorderAtlasBySpellID(spellID)
local colorIndex = atlas and (strfind(atlas, 'purple') and 4 or strfind(atlas, 'blue') and 3 or strfind(atlas, 'green') and 2)
if colorIndex then
local r, g, b = GetItemQualityColor(colorIndex)
button:SetBackdropBorderColor(r, g, b)
else
PA:SetTemplate(button)
end
button.count:SetText(count > 1 and counti or "")
button.texture:SetTexture(texture)
end
function TB:OnAttributeChanged(attribute, value)
if attribute == 'index' then
TB:UpdateAura(self, value)
end
end
function TB:UpdateHeader(header)
header:SetAttribute('consolidateDuration', -1)
header:SetAttribute('consolidateTo', 0)
header:SetAttribute('template', format('TorghastBuffsTemplate%d', TB.db.size))
header:SetAttribute('sortMethod', TB.db.sortMethod)
header:SetAttribute('sortDirection', TB.db.sortDir)
header:SetAttribute('maxWraps', TB.db.maxWraps)
header:SetAttribute('wrapAfter', TB.db.wrapAfter)
header:SetAttribute('point', DIRECTION_TO_POINT[TB.db.growthDirection])
if IS_HORIZONTAL_GROWTH[TB.db.growthDirection] then
header:SetAttribute('minWidth', ((TB.db.wrapAfter == 1 and 0 or TB.db.horizontalSpacing) + TB.db.size) * TB.db.wrapAfter)
header:SetAttribute('minHeight', (TB.db.verticalSpacing + TB.db.size) * TB.db.maxWraps)
header:SetAttribute('xOffset', DIRECTION_TO_HORIZONTAL_SPACING_MULTIPLIER[TB.db.growthDirection] * (TB.db.horizontalSpacing + TB.db.size))
header:SetAttribute('yOffset', 0)
header:SetAttribute('wrapXOffset', 0)
header:SetAttribute('wrapYOffset', DIRECTION_TO_VERTICAL_SPACING_MULTIPLIER[TB.db.growthDirection] * (TB.db.verticalSpacing + TB.db.size))
else
header:SetAttribute('minWidth', (TB.db.horizontalSpacing + TB.db.size) * TB.db.maxWraps)
header:SetAttribute('minHeight', ((TB.db.wrapAfter == 1 and 0 or TB.db.verticalSpacing) + TB.db.size) * TB.db.wrapAfter)
header:SetAttribute('xOffset', 0)
header:SetAttribute('yOffset', DIRECTION_TO_VERTICAL_SPACING_MULTIPLIER[TB.db.growthDirection] * (TB.db.verticalSpacing + TB.db.size))
header:SetAttribute('wrapXOffset', DIRECTION_TO_HORIZONTAL_SPACING_MULTIPLIER[TB.db.growthDirection] * (TB.db.horizontalSpacing + TB.db.size))
header:SetAttribute('wrapYOffset', 0)
end
local index = 1
local child = select(index, header:GetChildren())
while child do
child:Size(TB.db.size, TB.db.size)
TB:UpdateIcon(child)
-- Blizzard bug fix, icons arent being hidden when you reduce the amount of maximum buttons
if index > (TB.db.maxWraps * TB.db.wrapAfter) and child:IsShown() then
child:Hide()
end
index = index + 1
child = select(index, header:GetChildren())
end
if TB.MasqueGroup and TB.db.Masque then
TB.MasqueBuffs:ReSkin()
end
TB.Holder:SetSize(header:GetAttribute("minWidth") + 10, header:GetAttribute("minHeight") * 5)
end
function TB:CreateAuraHeader(unit, unitName)
local header = CreateFrame('Frame', 'TorghastBuffs_'..unitName, TB.Holder, 'SecureAuraHeaderTemplate')
header:SetClampedToScreen(true)
header:SetAttribute('unit', unit)
header:SetAttribute('filter', 'MAW')
header.unit = unit
header.unitName = header:CreateFontString()
header.unitName:SetPoint('BOTTOM', header, 'TOP')
TB:UpdateHeader(header)
tinsert(TB.Headers, header)
return header
end
function TB:UpdateAllHeaders()
for _, header in pairs(TB.Headers) do
TB:UpdateHeader(header)
end
end
function TB:HandleVisibility()
for _, header in pairs(TB.Headers) do
if IsInJailersTower() then
if header.unit == 'player' then
RegisterStateDriver(header, 'visibility', '[petbattle] hide; show')
else
RegisterStateDriver(header, 'visibility', format('[@%s, exists][group] show; hide', header.unit))
end
header.unitName:SetFont(PA.LSM:Fetch('font', PA.LSM:GetDefault('font')), 12, 'THICKOUTLINE')
if UnitExists(header.unit) then
header.unitName:SetText(UnitName(header.unit))
local color = RAID_CLASS_COLORS[select(2, UnitClass(header.unit))]
header.unitName:SetTextColor(color.r, color.g, color.b)
end
else
UnregisterStateDriver(header, 'visibility')
header:Hide()
end
end
end
function TB:GetOptions()
TB:UpdateSettings()
local TorghastBuffs = PA.ACH:Group(TB.Title, TB.Description, nil, nil, function(info) return TB.db[info[#info]] end, function(info, value) TB.db[info[#info]] = value TB:UpdateAllHeaders() end)
PA.Options.args.TorghastBuffs = TorghastBuffs
TorghastBuffs.args.Description = PA.ACH:Description(TB.Description, 0)
TorghastBuffs.args.Enable = PA.ACH:Toggle(PA.ACL['Enable'], nil, 1, nil, nil, nil, nil, function(info, value) TB.db[info[#info]] = value if (not TB.isEnabled) then TB:Initialize() else _G.StaticPopup_Show('PROJECTAZILROKA_RL') end end)
TorghastBuffs.args.General = PA.ACH:Group(PA.ACL['General'], nil, 2)
TorghastBuffs.args.General.inline = true
TorghastBuffs.args.General.args.Masque = PA.ACH:Toggle(PA.ACL['Masque Support'], nil, 1)
TorghastBuffs.args.General.args.size = PA.ACH:Range(PA.ACL["Size"], PA.ACL["Set the size of the individual auras."], 2, { min = 16, max = 60, step = 2 })
TorghastBuffs.args.General.args.growthDirection = PA.ACH:Select(PA.ACL["Growth Direction"], PA.ACL["The direction the auras will grow and then the direction they will grow after they reach the wrap after limit."], 4, PA.GrowthDirection)
TorghastBuffs.args.General.args.wrapAfter = PA.ACH:Range(PA.ACL["Wrap After"], PA.ACL["Begin a new row or column after this many auras."], 5, { min = 1, max = 32, step = 1 })
TorghastBuffs.args.General.args.maxWraps = PA.ACH:Range(PA.ACL["Max Wraps"], PA.ACL["Limit the number of rows or columns."], 6, { min = 1, max = 32, step = 1 })
TorghastBuffs.args.General.args.horizontalSpacing = PA.ACH:Range(PA.ACL["Horizontal Spacing"], nil, 7, { min = 0, max = 50, step = 1 })
TorghastBuffs.args.General.args.verticalSpacing = PA.ACH:Range(PA.ACL["Vertical Spacing"], nil, 8, { min = 0, max = 50, step = 1 })
TorghastBuffs.args.General.args.sortMethod = PA.ACH:Select(PA.ACL["Sort Method"], PA.ACL["Defines how the group is sorted."], 9, { INDEX = PA.ACL["Index"], NAME = PA.ACL["Name"] })
TorghastBuffs.args.General.args.sortDir = PA.ACH:Select(PA.ACL["Sort Direction"], PA.ACL["Defines the sort order of the selected sort method."], 10, { ['+'] = PA.ACL["Ascending"], ['-'] = PA.ACL["Descending"] })
TorghastBuffs.args.AuthorHeader = PA.ACH:Header(PA.ACL['Authors:'], -2)
TorghastBuffs.args.Authors = PA.ACH:Description(TB.Authors, -1, 'large')
end
function TB:BuildProfile()
PA.Defaults.profile.TorghastBuffs = {
Enable = true,
Masque = false,
countFont = 'Homespun',
countFontOutline = 'MONOCHROMEOUTLINE',
countFontSize = 10,
countXOffset = 0,
countYOffset = 0,
growthDirection = 'LEFT_DOWN',
horizontalSpacing = 2,
maxWraps = 5,
size = 24,
sortDir = '-',
sortMethod = 'INDEX',
verticalSpacing = 2,
wrapAfter = 10,
}
end
function TB:UpdateSettings()
TB.db = PA.db.TorghastBuffs
end
function TB:Initialize()
TB:UpdateSettings()
if TB.db.Enable ~= true then
return
end
TB.isEnabled = true
if PA.Masque and TB.db.Masque then
PA.Masque:Register('TorghastBuffs', function() end)
TB.MasqueGroup = PA.Masque:Group('TorghastBuffs')
end
TB.Holder.PlayerBuffFrame = TB:CreateAuraHeader('player', 'Player')
TB.Holder.PlayerBuffFrame:ClearAllPoints()
TB.Holder.PlayerBuffFrame:SetPoint('TOPLEFT', TB.Holder, 'TOPLEFT', 0, 0)
TB.Holder.PlayerBuffFrame:UnregisterAllEvents()
TB.Holder.PlayerBuffFrame:RegisterUnitEvent('UNIT_AURA', 'player')
for i = 1, 4 do
local name = format('Party%dBuffFrame', i)
TB.Holder[name] = TB:CreateAuraHeader('party'..i, 'Party'..i)
TB.Holder[name]:ClearAllPoints()
TB.Holder[name]:SetPoint('TOPLEFT', i == 1 and TB.Holder.PlayerBuffFrame or TB.Holder[format('Party%dBuffFrame', i - 1)], 'BOTTOMLEFT', 0, -25)
TB.Holder[name]:UnregisterAllEvents()
TB.Holder[name]:RegisterUnitEvent('UNIT_AURA', 'party'..i)
end
if PA.ElvUI then
_G.ElvUI[1]:CreateMover(TB.Holder, 'TorghastBuffsMover', "Torghast Buffs", nil, nil, nil, 'ALL,GENERAL', nil, 'ProjectAzilroka,TorghastBuffs')
end
TB:RegisterEvent('PLAYER_ENTERING_WORLD', 'HandleVisibility')
end