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