local PA , ACL , ACH = unpack ( _G.ProjectAzilroka )
local MXP = PA : NewModule ( ' MasterXP ' , ' AceTimer-3.0 ' , ' AceEvent-3.0 ' )
local L = ACL
MXP.Title = L [ ' |cFF16C3F2Master|r |cFFFFFFFFExperience|r ' ]
MXP.Description = L [ ' Shows Experience Bars for Party / Battle.net Friends ' ]
MXP.Authors = ' Azilroka '
MXP.isEnabled = false
PA.MXP , _G.MasterExperience = MXP , MXP
local _G = _G
local min , max , format = min , max , format
local tostring , tonumber = tostring , tonumber
local wipe = wipe
local strsplit = strsplit
local CreateFrame = CreateFrame
local GetXPExhaustion = GetXPExhaustion
local IsXPUserDisabled = IsXPUserDisabled
if not IsXPUserDisabled then
function IsXPUserDisabled ( ) return false end
end
local GetQuestLogRewardXP = GetQuestLogRewardXP
local IsPlayerAtEffectiveMaxLevel = IsPlayerAtEffectiveMaxLevel
local UnitXP , UnitXPMax = UnitXP , UnitXPMax
local BNGetInfo = BNGetInfo
local QuestLogXP , ZoneQuestXP , CompletedQuestXP = 0 , 0 , 0
local CurrentXP , XPToLevel , RestedXP , CurrentLevel
MXP.playerRealm = format ( ' %s-%s ' , UnitName ( " player " ) , gsub ( GetRealmName ( ) , ' [%s%-] ' , ' ' ) )
MXP.battleTag = MXP.isBNConnected and select ( 2 , BNGetInfo ( ) )
MXP.BNFriends = { }
MXP.isBNConnected = false
MXP.MasterExperience = CreateFrame ( ' Frame ' , ' MasterExperience ' , PA.PetBattleFrameHider )
MXP.MasterExperience : SetSize ( 250 , 400 )
MXP.MasterExperience : SetPoint ( ' BOTTOM ' , _G.UIParent , ' BOTTOM ' , 0 , 43 )
MXP.MasterExperience . Bars = { }
if not ( PA.Tukui or PA.ElvUI ) then
MXP.MasterExperience : SetMovable ( true )
end
function MXP : CheckQuests ( questID , zoneOnly )
if not questID or questID == 0 then
return
end
local isCompleted = _G.C_QuestLog . ReadyForTurnIn ( questID )
local experience = GetQuestLogRewardXP ( questID )
if zoneOnly then
ZoneQuestXP = ZoneQuestXP + experience
else
QuestLogXP = QuestLogXP + experience
end
if isCompleted then
CompletedQuestXP = CompletedQuestXP + experience
end
end
function MXP : AssignInfo ( bar , infoString )
if infoString then
-- Split the String
bar.Info . name , bar.Info . class , bar.Info . level ,
bar.Info . atMaxLevel , bar.Info . xpDisabled ,
bar.Info . CurrentXP , bar.Info . XPToLevel , bar.Info . RestedXP ,
bar.Info . QuestLogXP , bar.Info . ZoneQuestXP , bar.Info . CompletedQuestXP = strsplit ( " : " , infoString )
-- Convert Strings to Number
bar.Info . CurrentXP , bar.Info . XPToLevel , bar.Info . RestedXP , bar.Info . QuestLogXP , bar.Info . ZoneQuestXP , bar.Info . CompletedQuestXP = tonumber ( bar.Info . CurrentXP ) , tonumber ( bar.Info . XPToLevel ) , tonumber ( bar.Info . RestedXP ) , tonumber ( bar.Info . QuestLogXP ) , tonumber ( bar.Info . ZoneQuestXP ) , tonumber ( bar.Info . CompletedQuestXP )
-- Convert String to Boolean
bar.Info . atMaxLevel , bar.Info . xpDisabled = bar.Info . atMaxLevel == ' true ' , bar.Info . xpDisabled == ' true '
end
return bar.Info
end
function MXP : UpdateBar ( barID , infoString )
local bar = MXP.MasterExperience . Bars [ barID ] or MXP : CreateBar ( )
bar : Show ( )
local info = MXP : AssignInfo ( bar , infoString )
if info.XPToLevel <= 0 then info.XPToLevel = 1 end
local remainXP = info.XPToLevel - info.CurrentXP
local remainPercent = remainXP / info.XPToLevel
info.RemainTotal , info.RemainBars = remainPercent * 100 , remainPercent * 20
info.PercentXP , info.RemainXP = ( info.CurrentXP / info.XPToLevel ) * 100 , remainXP
-- Set the Colors
local expColor , restedColor , questColor = MXP.db . Colors.Experience , MXP.db . Colors.Rested , MXP.db . Colors.Quest
if MXP.db . ColorByClass and info.class then
expColor = MXP : ConvertColorToClass ( expColor , PA : GetClassColor ( info.class ) )
restedColor = MXP : ConvertColorToClass ( restedColor , PA : GetClassColor ( info.class ) , .6 )
end
bar : SetStatusBarColor ( expColor.r , expColor.g , expColor.b , expColor.a )
bar.Rested : SetStatusBarColor ( restedColor.r , restedColor.g , restedColor.b , restedColor.a )
bar.Quest : SetStatusBarColor ( questColor.r , questColor.g , questColor.b , questColor.a )
local displayString , textFormat = ' ' , ' CURPERCREM '
if info.atMaxLevel or info.xpDisabled then
bar : SetMinMaxValues ( 0 , 1 )
bar : SetValue ( 1 )
if displayString ~= ' NONE ' then
displayString = info.xpDisabled and L [ " Disabled " ] or L [ " Max Level " ]
end
else
bar : SetMinMaxValues ( 0 , info.XPToLevel )
bar : SetValue ( info.CurrentXP )
if textFormat == ' PERCENT ' then
displayString = format ( ' %.2f%% ' , info.PercentXP )
elseif textFormat == ' CURMAX ' then
displayString = format ( ' %s - %s ' , info.CurrentXP , info.XPToLevel )
elseif textFormat == ' CURPERC ' then
displayString = format ( ' %s - %.2f%% ' , info.CurrentXP , info.PercentXP )
elseif textFormat == ' CUR ' then
displayString = format ( ' %s ' , info.CurrentXP )
elseif textFormat == ' REM ' then
displayString = format ( ' %s ' , info.RemainXP )
elseif textFormat == ' CURREM ' then
displayString = format ( ' %s - %s ' , info.CurrentXP , info.RemainXP )
elseif textFormat == ' CURPERCREM ' then
displayString = format ( ' %s - %.2f%% (%s) ' , info.CurrentXP , info.PercentXP , info.RemainXP )
end
local isRested = info.RestedXP and info.RestedXP > 0
if isRested then
bar.Rested : SetMinMaxValues ( 0 , info.XPToLevel )
bar.Rested : SetValue ( min ( info.CurrentXP + info.RestedXP , info.XPToLevel ) )
info.PercentRested = ( info.RestedXP / info.XPToLevel ) * 100
if textFormat == ' PERCENT ' then
displayString = format ( ' %s R:%.2f%% ' , displayString , info.PercentRested )
elseif textFormat == ' CURPERC ' then
displayString = format ( ' %s R:%s [%.2f%%] ' , displayString , info.RestedXP , info.PercentRested )
elseif textFormat ~= ' NONE ' then
displayString = format ( ' %s R:%s ' , displayString , info.RestedXP )
end
end
local hasQuestXP = info.QuestLogXP > 0
if hasQuestXP then
info.QuestPercent = ( info.QuestLogXP / info.XPToLevel ) * 100
bar.Quest : SetMinMaxValues ( 0 , info.XPToLevel )
bar.Quest : SetValue ( min ( info.CurrentXP + info.QuestLogXP , info.XPToLevel ) )
if textFormat == ' PERCENT ' then
displayString = format ( ' %s Q:%.2f%% ' , displayString , info.QuestPercent )
elseif textFormat == ' CURPERC ' then
displayString = format ( ' %s Q:%s [%.2f%%] ' , displayString , info.QuestLogXP , info.QuestPercent )
elseif textFormat ~= ' NONE ' then
displayString = format ( ' %s Q:%s ' , displayString , info.QuestLogXP )
end
end
displayString = format ( ' %s %s - %s ' , L [ ' Lvl ' ] , info.level , displayString )
bar.Rested : SetShown ( isRested )
bar.Quest : SetShown ( hasQuestXP )
end
bar.Text : SetText ( displayString )
bar.Name : SetText ( MXP.BNFriends [ info.name ] and MXP.BNFriends [ info.name ] . accountName or info.name )
local numShown = 0
for _ , Bar in ipairs ( MXP.MasterExperience . Bars ) do
if Bar : IsShown ( ) then
numShown = numShown + 1
end
end
MXP.MasterExperience : SetSize ( max ( MXP.db . Width , numShown * MXP.db . Width ) , max ( MXP.db . Height , numShown * MXP.db . Height ) )
if MXP.MasterExperience . mover then
MXP.MasterExperience . mover : SetSize ( MXP.MasterExperience : GetSize ( ) )
end
end
function MXP : Bar_OnEnter ( )
if MXP.db . MouseOver then
_G.UIFrameFadeIn ( self , 0.4 , self : GetAlpha ( ) , 1 )
end
if self.Info . atMaxLevel or self.Info . xpDisabled then return end
_G.GameTooltip : ClearLines ( )
_G.GameTooltip : SetOwner ( self , ' ANCHOR_CURSOR ' , 0 , - 4 )
_G.GameTooltip : AddLine ( format ( " %s's %s " , MXP.BNFriends [ self.Info . name ] and MXP.BNFriends [ self.Info . name ] . accountName or self.Info . name , L [ " Experience " ] ) )
_G.GameTooltip : AddLine ( ' ' )
_G.GameTooltip : AddDoubleLine ( L [ " XP: " ] , format ( ' %d / %d (%.2f%%) ' , self.Info . CurrentXP , self.Info . XPToLevel , self.Info . PercentXP ) , 1 , 1 , 1 )
_G.GameTooltip : AddDoubleLine ( L [ " Remaining: " ] , format ( ' %s (%.2f%% - %d ' .. L [ " Bars " ] .. ' ) ' , self.Info . RemainXP , self.Info . RemainTotal , self.Info . RemainBars ) , 1 , 1 , 1 )
if self.Info . QuestLogXP and self.Info . QuestLogXP > 0 then
_G.GameTooltip : AddDoubleLine ( L [ " Quest Log XP: " ] , format ( ' +%d (%.2f%%) ' , self.Info . QuestLogXP , self.Info . QuestPercent ) , 1 , 1 , 1 )
end
if self.Info . RestedXP and self.Info . RestedXP > 0 then
_G.GameTooltip : AddDoubleLine ( L [ " Rested: " ] , format ( ' +%d (%.2f%%) ' , self.Info . RestedXP , self.Info . PercentRested ) , 1 , 1 , 1 )
end
_G.GameTooltip : Show ( )
end
function MXP : Bar_OnLeave ( )
if MXP.db . MouseOver then
_G.UIFrameFadeIn ( self , 0.4 , self : GetAlpha ( ) , 0 )
end
_G.GameTooltip_Hide ( self )
end
function MXP : GetBarPoints ( barIndex )
local point = MXP.db . GrowthDirection == ' UP ' and ' BOTTOM ' or ' TOP '
local relativeFrame = barIndex == 1 and MXP.MasterExperience or MXP.MasterExperience . Bars [ barIndex - 1 ]
local relativePoint = ( barIndex == 1 or MXP.db . GrowthDirection == ' DOWN ' ) and ' BOTTOM ' or ' TOP '
local yOffset = barIndex == 1 and 0 or MXP.db . GrowthDirection == ' UP ' and 2 or - 2
return point , relativeFrame , relativePoint , yOffset
end
function MXP : CreateBar ( )
local barIndex = ( # MXP.MasterExperience . Bars + 1 )
local Bar = CreateFrame ( ' StatusBar ' , ' MasterXP_Bar ' .. barIndex , MXP.MasterExperience )
PA : CreateBackdrop ( Bar )
Bar : SetStatusBarTexture ( PA.Solid )
Bar : Hide ( )
Bar : SetSize ( MXP.db . Width , MXP.db . Height )
Bar : SetScript ( ' OnEnter ' , MXP.Bar_OnEnter )
Bar : SetScript ( ' OnLeave ' , MXP.Bar_OnLeave )
Bar.Info = { }
local point , relativeFrame , relativePoint , yOffset = MXP : GetBarPoints ( barIndex )
Bar : SetPoint ( point , relativeFrame , relativePoint , 0 , yOffset )
Bar.Text = Bar : CreateFontString ( nil , ' OVERLAY ' )
Bar.Text : SetFont ( PA.Libs . LSM : Fetch ( ' font ' , MXP.db . Font ) , MXP.db . FontSize , MXP.db . FontFlag )
Bar.Text : SetPoint ( ' CENTER ' )
Bar.Name = Bar : CreateFontString ( nil , ' OVERLAY ' )
Bar.Name : SetFont ( PA.Libs . LSM : Fetch ( ' font ' , MXP.db . Font ) , MXP.db . FontSize , MXP.db . FontFlag )
Bar.Name : SetJustifyV ( ' MIDDLE ' )
Bar.Name : SetJustifyH ( ' RIGHT ' )
Bar.Name : SetPoint ( ' RIGHT ' , Bar , ' LEFT ' , - 2 , 0 )
Bar.Rested = CreateFrame ( ' StatusBar ' , ' $parent_Rested ' , Bar )
Bar.Rested : SetFrameLevel ( Bar : GetFrameLevel ( ) )
Bar.Rested : Hide ( )
Bar.Rested : SetStatusBarTexture ( PA.Solid , ' ARTWORK ' , - 2 )
Bar.Rested : SetAllPoints ( )
Bar.Quest = CreateFrame ( ' StatusBar ' , ' $parent_Quest ' , Bar )
Bar.Quest : SetFrameLevel ( Bar : GetFrameLevel ( ) )
Bar.Quest : Hide ( )
Bar.Quest : SetStatusBarTexture ( PA.Solid , ' ARTWORK ' , - 1 )
Bar.Quest : SetAllPoints ( )
MXP.MasterExperience . Bars [ barIndex ] = Bar
return Bar
end
function MXP : UPDATE_EXHAUSTION ( )
RestedXP = GetXPExhaustion ( )
end
function MXP : PLAYER_LEVEL_UP ( )
CurrentLevel = UnitLevel ( ' player ' )
end
function MXP : PLAYER_XP_UPDATE ( )
CurrentXP , XPToLevel = UnitXP ( ' player ' ) , UnitXPMax ( ' player ' )
end
function MXP : QUEST_LOG_UPDATE ( )
QuestLogXP , ZoneQuestXP , CompletedQuestXP = 0 , 0 , 0
if PA.Retail then
for i = 1 , C_QuestLog.GetNumQuestLogEntries ( ) do
local info = C_QuestLog.GetInfo ( i )
if info and not info.isHidden then
MXP : CheckQuests ( C_QuestLog.GetQuestIDForLogIndex ( i ) , info.isOnMap )
end
end
else
for i = 1 , GetNumQuestLogEntries ( ) do
local name , _ , _ , isHeader , _ , isCompleted , _ , questID = GetQuestLogTitle ( i )
local experience = GetQuestLogRewardXP ( questID )
QuestLogXP = QuestLogXP + experience
if isCompleted then
CompletedQuestXP = CompletedQuestXP + experience
end
end
end
MXP : SendMessage ( )
end
local newColorTable = { }
function MXP : ConvertColorToClass ( colorTable , classColorTable , multiplier )
wipe ( newColorTable )
multiplier = multiplier or 1
for key in pairs ( classColorTable ) do
if colorTable [ key ] then
newColorTable [ key ] = classColorTable [ key ] * multiplier
end
end
return newColorTable
end
function MXP : ClearBars ( )
for _ , bar in ipairs ( MXP.MasterExperience . Bars ) do
wipe ( bar.Info )
bar : Hide ( )
bar : SetAlpha ( 1 )
end
end
function MXP : GetAssignedBar ( name )
local numBars = # MXP.MasterExperience . Bars
if ( not numBars or numBars == 0 ) then
return 1
else
for i = 1 , numBars do
if MXP.MasterExperience . Bars [ i ] and ( MXP.MasterExperience . Bars [ i ] . Info.name == name or not MXP.MasterExperience . Bars [ i ] . Info.name ) then
return i
end
end
return numBars + 1
end
end
function MXP : UpdateAllBars ( )
MXP : ClearBars ( )
local inParty = IsInGroup ( ) and not IsInRaid ( )
if MXP.db . BattleNet and MXP.isBNConnected or MXP.db . Party and inParty then
MXP : SendMessage ( )
end
if MXP.db . Party and inParty then
C_ChatInfo.SendAddonMessage ( ' PA_MXP ' , ' REQUESTINFO ' , ' PARTY ' )
end
if MXP.db . BattleNet and MXP.isBNConnected then
for _ , info in pairs ( MXP.BNFriends ) do
if info.presenceID then
BNSendGameData ( info.presenceID , ' PA_MXP ' , ' REQUESTINFO ' )
end
end
end
end
function MXP : BattleNetUpdate ( _ , friendIndex )
if C_BattleNet and MXP.isBNConnected and friendIndex then
local hideBar = true
local friendInfo = C_BattleNet.GetFriendAccountInfo ( friendIndex )
for gameIndex = 1 , C_BattleNet.GetFriendNumGameAccounts ( friendIndex ) do
local info = C_BattleNet.GetFriendGameAccountInfo ( friendIndex , gameIndex )
if info and info.clientProgram == ' WoW ' then
BNSendGameData ( info.gameAccountID , ' PA_MXP ' , ' REQUESTINFO ' )
hideBar = false
end
end
if hideBar then
local bar = MXP.MasterExperience . Bars [ MXP : GetAssignedBar ( friendInfo.battleTag ) ]
if bar then
bar : Hide ( )
end
end
end
end
function MXP : UpdateCurrentBars ( )
local font , fontSize , fontFlag = PA.Libs . LSM : Fetch ( ' font ' , MXP.db . Font ) , MXP.db . FontSize , MXP.db . FontFlag
for barIndex , bar in ipairs ( MXP.MasterExperience . Bars ) do
MXP : UpdateBar ( barIndex )
bar : SetSize ( MXP.db . Width , MXP.db . Height )
bar : ClearAllPoints ( )
bar : SetAlpha ( MXP.db . MouseOver and 0 or 1 )
bar.Text : SetFont ( font , fontSize , fontFlag )
bar.Name : SetFont ( font , fontSize , fontFlag )
local point , relativeFrame , relativePoint , yOffset = MXP : GetBarPoints ( barIndex )
bar : SetPoint ( point , relativeFrame , relativePoint , 0 , yOffset )
end
end
function MXP : SendMessage ( )
if not IsPlayerInWorld ( ) then return end
if MXP.db . Party and IsInGroup ( LE_PARTY_CATEGORY_HOME ) and not IsInRaid ( ) then
local message = format ( ' %s:%s:%d:%s:%s:%d:%d:%d:%d:%d:%d:%d ' , MXP.playerRealm , PA.MyClass or UnitClass ( ' player ' ) , CurrentLevel or UnitLevel ( ' player ' ) , tostring ( IsPlayerAtEffectiveMaxLevel ( ) ) , tostring ( IsXPUserDisabled ( ) ) , CurrentXP or 0 , XPToLevel or 0 , RestedXP or 0 , QuestLogXP or 0 , ZoneQuestXP or 0 , CompletedQuestXP or 0 )
C_ChatInfo.SendAddonMessage ( ' PA_MXP ' , message , ' PARTY ' )
end
if MXP.db . BattleNet and MXP.isBNConnected then
local message = format ( ' %s:%s:%d:%s:%s:%d:%d:%d:%d:%d:%d:%d ' , MXP.battleTag , PA.MyClass or UnitClass ( ' player ' ) , CurrentLevel or UnitLevel ( ' player ' ) , tostring ( IsPlayerAtEffectiveMaxLevel ( ) ) , tostring ( IsXPUserDisabled ( ) ) , CurrentXP or 0 , XPToLevel or 0 , RestedXP or 0 , QuestLogXP or 0 , ZoneQuestXP or 0 , CompletedQuestXP or 0 )
for _ , info in pairs ( MXP.BNFriends ) do
if info.presenceID then
BNSendGameData ( info.presenceID , ' PA_MXP ' , message )
end
end
end
end
function MXP : HandleBNET ( )
wipe ( MXP.BNFriends )
if MXP.isBNConnected and C_BattleNet then
MXP : BattleTag ( )
local _ , numBNetOnline = BNGetNumFriends ( )
for friendIndex = 1 , numBNetOnline do
local friendInfo = C_BattleNet.GetFriendAccountInfo ( friendIndex )
for gameIndex = 1 , C_BattleNet.GetFriendNumGameAccounts ( friendIndex ) do
local info = C_BattleNet.GetFriendGameAccountInfo ( friendIndex , gameIndex )
if info and info.clientProgram == ' WoW ' then
MXP.BNFriends [ friendInfo.battleTag ] = { presenceID = info.gameAccountID , accountName = friendInfo.accountName }
MXP.BNFriends [ info.gameAccountID ] = { battleTag = friendInfo.battleTag , accountName = friendInfo.accountName }
end
end
end
end
end
function MXP : HandleBNStatus ( )
MXP.isBNConnected = _G.BNConnected ( )
end
function MXP : BattleTag ( )
if not MXP.battleTag then
MXP.battleTag = MXP.isBNConnected and select ( 2 , BNGetInfo ( ) )
end
end
function MXP : RecieveMessage ( event , prefix , message , _ , sender )
if prefix ~= ' PA_MXP ' then return end
if event == ' CHAT_MSG_ADDON ' and sender ~= MXP.playerRealm then
if message == ' REQUESTINFO ' then
MXP : SendMessage ( )
else
MXP : UpdateBar ( MXP : GetAssignedBar ( sender ) , message )
end
elseif event == ' BN_CHAT_MSG_ADDON ' and MXP.db . BattleNet and MXP.BNFriends [ sender ] then
if message == ' REQUESTINFO ' then
MXP : SendMessage ( )
else
MXP : UpdateBar ( MXP : GetAssignedBar ( MXP.BNFriends [ sender ] . battleTag ) , message )
end
end
end
function MXP : GetOptions ( )
local MasterExperience = ACH : Group ( MXP.Title , MXP.Description , nil , nil , function ( info ) return MXP.db [ info [ # info ] ] end )
PA.Options . args.MasterExperience = MasterExperience
MasterExperience.args . Description = ACH : Description ( MXP.Description , 0 )
MasterExperience.args . Enable = ACH : Toggle ( L [ ' Enable ' ] , nil , 1 , nil , nil , nil , nil , function ( info , value ) MXP.db [ info [ # info ] ] = value if not MXP.isEnabled then MXP : Initialize ( ) else _G.StaticPopup_Show ( ' PROJECTAZILROKA_RL ' ) end end )
MasterExperience.args . General = ACH : Group ( L [ ' General ' ] , nil , 2 , nil , function ( info ) return MXP.db [ info [ # info ] ] end , function ( info , value ) MXP.db [ info [ # info ] ] = value MXP : UpdateCurrentBars ( ) end )
MasterExperience.args . General.inline = true
MasterExperience.args . General.args . Party = ACH : Toggle ( L [ ' Party ' ] , nil , 0 , nil , nil , nil , nil , function ( info , value ) MXP.db [ info [ # info ] ] = value MXP : UpdateAllBars ( ) end )
MasterExperience.args . General.args . BattleNet = ACH : Toggle ( L [ ' BattleNet ' ] , nil , 1 , nil , nil , nil , nil , function ( info , value ) MXP.db [ info [ # info ] ] = value MXP : UpdateAllBars ( ) end )
MasterExperience.args . General.args . MouseOver = ACH : Toggle ( L [ ' MouseOver ' ] , nil , 2 )
MasterExperience.args . General.args . GrowthDirection = ACH : Select ( L [ ' Growth Direction ' ] , nil , 3 , { UP = ' Up ' , DOWN = ' Down ' } )
MasterExperience.args . General.args . FontGroup = ACH : Group ( L [ ' Font ' ] , nil , 3 )
MasterExperience.args . General.args . FontGroup.inline = true
MasterExperience.args . General.args . FontGroup.args . Font = ACH : SharedMediaFont ( L [ ' Font ' ] , nil , 1 )
MasterExperience.args . General.args . FontGroup.args . FontSize = ACH : Range ( L [ ' Font Size ' ] , nil , 2 , { min = 6 , max = 22 , step = 1 } )
MasterExperience.args . General.args . FontGroup.args . FontFlag = ACH : FontFlags ( L [ ' Font Outline ' ] , nil , 3 )
MasterExperience.args . General.args . SizeGroup = ACH : Group ( L [ ' Size ' ] , nil , - 2 , nil , nil , function ( info , value ) MXP.db [ info [ # info ] ] = value MXP : UpdateCurrentBars ( ) end )
MasterExperience.args . General.args . SizeGroup.args . Width = ACH : Range ( L [ ' Width ' ] , nil , 1 , { min = 1 , max = 512 , step = 1 } )
MasterExperience.args . General.args . SizeGroup.args . Height = ACH : Range ( L [ ' Height ' ] , nil , 2 , { min = 1 , max = 64 , step = 1 } )
MasterExperience.args . General.args . Colors = ACH : Group ( L [ ' Colors ' ] , nil , - 1 , nil , function ( info ) local t = MXP.db . Colors [ info [ # info ] ] return t.r , t.g , t.b , t.a end , function ( info , r , g , b , a ) local t = MXP.db . Colors [ info [ # info ] ] t.r , t.g , t.b , t.a = r , g , b , a MXP : UpdateCurrentBars ( ) end )
MasterExperience.args . General.args . Colors.args . ColorByClass = ACH : Toggle ( L [ ' Color By Class ' ] , nil , 0 , nil , nil , nil , function ( info ) return MXP.db [ info [ # info ] ] end , function ( info , value ) MXP.db [ info [ # info ] ] = value MXP : UpdateCurrentBars ( ) end )
MasterExperience.args . General.args . Colors.args . Experience = ACH : Color ( L [ ' Experience ' ] , nil , 1 , true )
MasterExperience.args . General.args . Colors.args . Rested = ACH : Color ( L [ ' Rested ' ] , nil , 2 , true )
MasterExperience.args . General.args . Colors.args . Quest = ACH : Color ( ' Quest ' , nil , 3 , true )
MasterExperience.args . AuthorHeader = ACH : Header ( L [ ' Authors: ' ] , - 2 )
MasterExperience.args . Authors = ACH : Description ( MXP.Authors , - 1 , ' large ' )
end
function MXP : BuildProfile ( )
PA.Defaults . profile.MasterExperience = {
Enable = false ,
ColorByClass = false ,
BattleNet = true ,
Party = true ,
GrowthDirection = ' UP ' ,
Width = 256 ,
Height = 20 ,
Font = ' Arial Narrow ' ,
FontSize = 12 ,
FontFlag = ' OUTLINE ' ,
Colors = {
Experience = { r = 0 , g = .4 , b = 1 , a = .8 } ,
Rested = { r = 1 , g = 0 , b = 1 , a = .2 } ,
Quest = { r = 0 , g = 1 , b = 0 , a = .5 }
} ,
}
end
function MXP : UpdateSettings ( )
MXP.db = PA.db . MasterExperience
end
function MXP : Initialize ( )
if MXP.db . Enable ~= true then
return
end
MXP.isEnabled = true
_G.C_ChatInfo . RegisterAddonMessagePrefix ( ' PA_MXP ' )
if PA.Tukui then
_G.Tukui [ 1 ] . Movers : RegisterFrame ( MXP.MasterExperience )
elseif PA.ElvUI then
_G.ElvUI [ 1 ] : CreateMover ( MXP.MasterExperience , ' MasterExperienceMover ' , ' Master Experience Anchor ' , nil , nil , nil , ' ALL,GENERAL ' , nil , ' ProjectAzilroka,MasterExperience ' )
else
MXP.MasterExperience : SetScript ( ' OnDragStart ' , MXP.MasterExperience . StartMoving )
MXP.MasterExperience : SetScript ( ' OnDragStop ' , MXP.MasterExperience . StopMovingOrSizing )
end
MXP : RegisterEvent ( ' BN_CHAT_MSG_ADDON ' , ' RecieveMessage ' )
MXP : RegisterEvent ( ' CHAT_MSG_ADDON ' , ' RecieveMessage ' )
MXP : RegisterEvent ( ' DISABLE_XP_GAIN ' , ' SendMessage ' )
MXP : RegisterEvent ( ' ENABLE_XP_GAIN ' , ' SendMessage ' )
MXP : RegisterEvent ( ' QUEST_LOG_UPDATE ' )
MXP : RegisterEvent ( ' GROUP_ROSTER_UPDATE ' , ' UpdateAllBars ' )
MXP : RegisterEvent ( ' BN_FRIEND_INFO_CHANGED ' , ' BattleNetUpdate ' )
MXP : RegisterEvent ( ' BN_FRIEND_ACCOUNT_ONLINE ' , ' HandleBNET ' )
MXP : RegisterEvent ( ' BN_FRIEND_ACCOUNT_OFFLINE ' , ' HandleBNET ' )
MXP : RegisterEvent ( ' PLAYER_XP_UPDATE ' )
MXP : RegisterEvent ( ' UPDATE_EXHAUSTION ' )
MXP : RegisterEvent ( ' PLAYER_LEVEL_UP ' )
MXP : RegisterEvent ( " BN_CONNECTED " , ' HandleBNStatus ' )
MXP : RegisterEvent ( " BN_DISCONNECTED " , ' HandleBNStatus ' )
MXP : BattleTag ( )
MXP : HandleBNStatus ( )
MXP : HandleBNET ( )
MXP : UPDATE_EXHAUSTION ( )
MXP : PLAYER_XP_UPDATE ( )
MXP : QUEST_LOG_UPDATE ( )
MXP : PLAYER_LEVEL_UP ( )
MXP : UpdateAllBars ( )
if IsPlayerAtEffectiveMaxLevel ( ) then -- Place in recieve only mode.
MXP : SendMessage ( )
else
MXP : ScheduleRepeatingTimer ( ' SendMessage ' , 2 )
end
end