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