--Created by Tehu of Garona -- -- --Credit goes out to the creators of AvgXP and AvgXPPlus for the AvgXP functions --Credit goes out to the creator of TotalXP for the XP needed until 60 function --Credit goes out the the creator of the original XPBar (non titan that is :P) for the sizing functions TITAN_XPBAR_FREQUENCY=1 local restxp=nil PLAYER_ENTERING_WORLD=0 TITAN_XPBAR_BUTTON_TEXT_XP="XP: %s" TITAN_XPBAR_BUTTON_TEXT_NIL="%s" TITAN_XPBAR_BUTTON_TEXT_NEEDED="%s XP" TITAN_XPBAR_BUTTON_TEXT_NPCT="%s" TITAN_XPBAR_MENU_TEXT="XPBar" TITAN_XPBAR_MENU_SHOW_STATUS="Show XP Statusbar" TITAN_XPBAR_MENU_HIDE_STATUS="Hide XP Statusbar" TITAN_XPBAR_TOOLTIP_XP="Current XP:" TITAN_XPBAR_TOOLTIP_LEV="Level XP:" TITAN_XPBAR_TOOLTIP_REST="Rested XP:" TITAN_XPBAR_TOOLTIP_NEED="XP Until Next Level:" TITAN_XPBAR_TOOLTIP_PERCENT="" TITAN_XPBAR_TOOLTIP="Experience Tooltip" TITAN_XPBAR_TOOLTIP_CURRLEV="Currently Level:" TITAN_XPBAR_TOOLTIP_XPTO60="XP Remaining Until 60" TITAN_XPBAR_TOOLTIP_XPSOFAR="XP Gained Since Level 1" TITAN_XPBAR_TOOLTIP_XPTO60PCT="" TITAN_XPBAR_TOOLTIP_XPSOFARPCT="" TITAN_XPBAR_TOTAL_TIME_PLAYED = "Total Time Played:" TITAN_XPBAR_LEVEL_TIME_PLAYED = "Time Played This Level:" TITAN_XPBAR_SESSION_TIME_PLAYED = "Time Played This Session:" TITAN_XPBAR_SESSION_XP = "XP Gained This Session:" TITAN_XPBAR_PER_HOUR_LEVEL = "XP Per Hour This Level:" TITAN_XPBAR_PER_HOUR_SESSION = "XP Per Hour This Session:" TITAN_XPBAR_EST_TIME_TO_LEVEL_LEVEL_RATE = "Time To Level At This Level's Rate:" TITAN_XPBAR_EST_TIME_TO_LEVEL_SESSION_RATE = "Time To Level At This Session's Rate:" TITAN_XPBAR_TOTAL_KILLS="Total Kills This Session:" TITAN_XPBAR_TOTAL_NKILLS="Total Kills Needed To Level:" TITAN_XPBAR_AVGXP="Average XP Gained Per Kill:" TITAN_XPBAR_MENU_SHOW_TEXT="Show Average XP Text" TITAN_XPBAR_NKILLS=" Needed: %s" TITAN_XPBAR_KILLS=" Kills: %s" TITAN_XPBAR_AVGXPTEXT="AVG XP: %s" TITAN_XPBAR_MENU_SHOWCURR="Display Current Level Info" TITAN_XPBAR_MENU_SHOWNEXT="Display XP Needed Until Next Level" TITAN_XPBAR_MENU_CHAT="Enable Chat Output" LBLUE_FONT_COLOR="|cff55A9FF" TXP_pos = {}; RegisterForSave("TXP_pos"); AVG_pos = {}; RegisterForSave("AVG_pos"); function TitanPanelXPBarButton_OnLoad() SlashCmdList["TXP"] = TXP_SlashHandler SLASH_TXP1 = "/txp"; SlashCmdList["TEST"] = TXP_TestHandler; SLASH_TEST1 = "/test" DEFAULT_CHAT_FRAME:AddMessage("TitanXPBar Loaded, /txp for options", 1, 1, 0) this:RegisterEvent("VARIABLES_LOADED") this:RegisterEvent("UPDATE_EXHAUSTION") this:RegisterEvent("PLAYER_ENTERING_WORLD") this:RegisterEvent("CHAT_MSG_COMBAT_XP_GAIN"); this:RegisterEvent("UNIT_NAME_UPDATE"); this:RegisterEvent("PLAYER_TARGET_CHANGED"); this:RegisterEvent("PLAYER_LEVEL_UP") this:RegisterEvent("PLAYER_XP_UPDATE"); this.registry={ id="XPBar", menuText = TITAN_XPBAR_MENU_TEXT, buttonTextFunction="TitanPanelXPBarButton_GetButtonText", tooltipTitle = TITAN_XPBAR_TOOLTIP, tooltipTextFunction = "TitanPanelXPBarButton_GetTooltipText", } totalkilled=0 avgxp=0 totalxpgained=0 lastxpgained=0 numleft=0 bar = {255, 255, 255} end function TXP_TestHandler(msg) RegisterForSave("test_Args"); test_Args=tyn_Parser(msg); end function tyn_Parser(commandline) local t = {}; local k, v; local msg=commandline; for k, v in string.gfind(msg, "(%w+)=\"(.-)\"") do t[k] = v end msg=string.gsub(msg, "(%w+)=\"(.-)\"", "") for k, v in string.gfind(msg, "(%w+)=(%w+)") do t[k] = v end msg=string.gsub(msg, "(%w+)=(%w+)", "") for k in string.gfind(msg, "(%w+)") do t[k] = true; end return t; end function TitanPanelXPBarButton_OnEvent(event) local rxp,curr,max,needed,currpcent,needpcent,currlev,nextlev=TitanPanelXPBarButton_GetXPBarInfo() TitanPanelButton_UpdateButton("XPBar") Statusbar_Update() if (TitanSettings.Chat == nil) then if (event == "PLAYER_XP_UPDATE") then DEFAULT_CHAT_FRAME:AddMessage(LBLUE_FONT_COLOR..curr.."/"..max.." XP ("..needpcent..") to go"..FONT_COLOR_CODE_CLOSE) DEFAULT_CHAT_FRAME:AddMessage(LBLUE_FONT_COLOR..needed.." XP Until Level "..nextlev..FONT_COLOR_CODE_CLOSE) end end if (event == "PLAYER_ENTERING_WORLD") then if (PLAYER_ENTERING_WORLD == 0) then this.initXP = UnitXP("player"); this.accumXP = 0; this.sessionXP = 0; PLAYER_ENTERING_WORLD = 1 end elseif (event == "PLAYER_XP_UPDATE") then if (not this.initXP) then this.initXP = UnitXP("player"); this.accumXP = 0; this.sessionXP = 0; end this.sessionXP = UnitXP("player") - this.initXP + this.accumXP; elseif (event == "PLAYER_LEVEL_UP") then this.accumXP = this.accumXP + UnitXPMax("player") - this.initXP; this.initXP = 0; end if(event=="CHAT_MSG_COMBAT_XP_GAIN") then for mobile_name, xp in string.gfind(arg1, "(.+) dies, you gain (%d+) experience.") do lastxpgained = tonumber(xp) totalkilled = totalkilled + 1 totalxpgained = totalxpgained + lastxpgained end end if( (totalkilled > 0) and (totalkilled~=nil) ) then avgxp = floor(totalxpgained / totalkilled * 100) / 100; end if( (avgxp > 0) and (avgxp~=nil) ) then numleft = ( UnitXPMax("player") - UnitXP("player") ) / avgxp; numleft = ceil(numleft); end if (event == "VARIABLES_LOADED") then if (XPBar_Width) then XPBG:SetWidth(XPBar_Width); XPStatus:SetWidth(XPBar_Width); end if (XPBar_Height) then XPBG:SetHeight(XPBar_Height); XPStatus:SetHeight(XPBar_Height); end if (AVGXP_Locked) then TXP_SlashHandler('lock'); end TXP() AVG() end end function TitanPanelXPBarButton_GetButtonText(id) local rxp,curr,max,needed,currpcent,needpcent,currlev,nextlev=TitanPanelXPBarButton_GetXPBarInfo() local button, id = TitanUtils_GetButton(id, true); if (rxp == nil) then rxp=0 else rxp=rxp end if (TitanSettings.Status == 1) then XPStatus:Hide() end if (TitanSettings.Status == nil) then XPStatus:Show() end if (TitanSettings.Showtext == nil) then getglobal("AVGText"):SetText("AVG XP: "..TitanUtils_GetHighlightText(avgxp).." Kills: "..TitanUtils_GetHighlightText(totalkilled).." Needed: "..TitanUtils_GetHighlightText(numleft)) AVGXPButton:Show() end if (TitanSettings.Showtext == 1) then AVGXPButton:Hide() end if (TitanSettings.XPFormat == 1) then return format(TITAN_XPBAR_BUTTON_TEXT_XP,TitanUtils_GetHighlightText(curr)).."/".. format(TITAN_XPBAR_BUTTON_TEXT_NIL,TitanUtils_GetHighlightText(max)).." + (".. format(TITAN_XPBAR_BUTTON_TEXT_NIL,TitanUtils_GetHighlightText(rxp)).." Rested)" end if (TitanSettings.XPFormat == nil) then return format(TITAN_XPBAR_BUTTON_TEXT_NEEDED,TitanUtils_GetHighlightText(needed)).." (".. format(TITAN_XPBAR_BUTTON_TEXT_NPCT,TitanUtils_GetHighlightText(needpcent))..") until ".. format(TITAN_XPBAR_BUTTON_TEXT_NIL,TitanUtils_GetHighlightText(nextlev)).." (".. format(TITAN_XPBAR_BUTTON_TEXT_NIL,TitanUtils_GetHighlightText(rxp)).." Rested)" end end function TitanPanelXPBarButton_GetXPBarInfo() local rxp=GetXPExhaustion("player") local max=UnitXPMax("player") local curr=UnitXP("player") local needed=max - curr local currpercent=string.format("%.2f", ( curr / max) * 100) local needpcent=string.format("%.2f", ( needed / max) * 100) local currlev=UnitLevel("player") local nextlev=currlev + 1 return rxp,curr,max,needed,currpercent.."%",needpcent.."%",currlev,nextlev end function TitanPanelXPBarButton_GetTooltipText() local rxp,curr,max,needed,currpercent,needpcent,currlev=TitanPanelXPBarButton_GetXPBarInfo() local totalxp,totalMaxXP,totalxppct,needxp,needxppct,totalgpct,totalnpct=totalxp(level) local totalTime = TitanUtils_GetTotalTime(); local sessionTime = TitanUtils_GetSessionTime(); local levelTime = TitanUtils_GetLevelTime(); local xpPerHourThisLevel = curr / levelTime * 3600; local xpPerHourThisSession = this.sessionXP / sessionTime * 3600; local estTimeToLevelThisLevel = TitanUtils_Ternary((curr == 0), -1, needed / curr * levelTime); local estTimeToLevelThisSession = TitanUtils_Ternary((this.sessionXP == 0), -1, needed / this.sessionXP * sessionTime); if (rxp == nil) then rxp=0 rxppcent=0 .."%" else rxppcent=floor(rxp*100/max) .."%" end return "".. TITAN_XPBAR_TOOLTIP_CURRLEV.." "..GetBlueText(currlev).."\n".. "\n".. TITAN_XPBAR_TOOLTIP_XP.." "..TitanUtils_GetHighlightText(curr).." ".. TITAN_XPBAR_TOOLTIP_PERCENT.." ("..TitanUtils_GetHighlightText(currpercent)..")".."\n".. TITAN_XPBAR_TOOLTIP_LEV.." "..TitanUtils_GetHighlightText(max).."\n".. TITAN_XPBAR_TOOLTIP_NEED.." "..TitanUtils_GetHighlightText(needed).." ".. TITAN_XPBAR_TOOLTIP_PERCENT.." ("..TitanUtils_GetHighlightText(needpcent)..")".."\n".. TITAN_XPBAR_TOOLTIP_REST.." "..TitanUtils_GetHighlightText(rxp).." ".. TITAN_XPBAR_TOOLTIP_PERCENT.." ("..TitanUtils_GetHighlightText(rxppcent)..")".."\n".."\n".. TITAN_XPBAR_TOOLTIP_XPSOFAR..": "..GetBlueText(totalxp).." (".. TITAN_XPBAR_TOOLTIP_XPSOFARPCT..""..GetBlueText(totalgpct)..")".."\n".. TITAN_XPBAR_TOOLTIP_XPTO60.." "..GetBlueText(needxp).." (".. TITAN_XPBAR_TOOLTIP_XPTO60PCT..""..GetBlueText(totalnpct)..")".."\n".."\n".. TITAN_XPBAR_SESSION_XP.." "..TitanUtils_GetGreenText(this.sessionXP).."\n".. TITAN_XPBAR_AVGXP.." "..TitanUtils_GetGreenText(avgxp).."\n".."\n".. TITAN_XPBAR_TOTAL_KILLS.." "..GetBlueText(totalkilled).."\n".. TITAN_XPBAR_TOTAL_NKILLS.." "..GetBlueText(numleft).."\n".."\n".. TITAN_XPBAR_PER_HOUR_LEVEL.." "..TitanUtils_GetHighlightText(floor((xpPerHourThisLevel / 100) *100)).."\n".. TITAN_XPBAR_PER_HOUR_SESSION.." "..TitanUtils_GetHighlightText(floor((xpPerHourThisSession / 100)*100)).."\n".."\n".. TITAN_XPBAR_TOTAL_TIME_PLAYED.." "..TitanUtils_GetHighlightText(TitanUtils_GetAbbrTimeText(totalTime)).."\n".. TITAN_XPBAR_EST_TIME_TO_LEVEL_LEVEL_RATE.." "..TitanUtils_GetHighlightText(TitanUtils_GetAbbrTimeText(estTimeToLevelThisLevel)).."\n".. TITAN_XPBAR_EST_TIME_TO_LEVEL_SESSION_RATE.." "..TitanUtils_GetHighlightText(TitanUtils_GetAbbrTimeText(estTimeToLevelThisSession)) end function GetBlueText(text) if (text) then return LBLUE_FONT_COLOR..text..FONT_COLOR_CODE_CLOSE; end end function Statusbar_Update() local currValue = UnitXP("player"); local maxValue = UnitXPMax("player"); XPStatus:SetMinMaxValues(0, maxValue); XPStatus:SetValue(currValue); XPBG:SetMinMaxValues(0, maxValue); XPBG:SetValue(maxValue) XPStatus:ClearAllPoints(); XPStatus:SetPoint("BOTTOM", "UIParent", "BOTTOM", TXP_pos["LOCATIONX"], TXP_pos["LOCATIONY"]); AVGText:ClearAllPoints(); AVGText:SetPoint("BOTTOM", "UIParent", "BOTTOM", AVG_pos["LOCX"], AVG_pos["LOCY"]); end function TitanPanelRightClickMenu_PrepareXPBarMenu() local id = "XPBar"; local info; TitanPanelRightClickMenu_AddTitle(TitanPlugins[id].menuText); info = {}; info.text = TITAN_XPBAR_MENU_SHOWCURR info.func = TitanPanelXPBarButton_ShowCurr info.checked=TitanSettings.XPFormat UIDropDownMenu_AddButton(info); info = {}; info.text = TITAN_XPBAR_MENU_SHOWNEXT info.func = TitanPanelXPBarButton_ShowNext info.checked=TitanUtils_Toggle(TitanSettings.XPFormat) UIDropDownMenu_AddButton(info) TitanPanelRightClickMenu_AddSpacer() info = {}; info.text = TITAN_XPBAR_MENU_SHOW_STATUS; info.func = TitanPanelXPBarButton_ShowStatus; info.checked = TitanUtils_Toggle(TitanSettings.Status); UIDropDownMenu_AddButton(info); info = {}; info.disabled = nil info.text = TITAN_XPBAR_MENU_SHOW_TEXT info.func = TitanPanelXPBarButton_ShowText info.checked = TitanUtils_Toggle(TitanSettings.Showtext) UIDropDownMenu_AddButton(info) info = {}; info.text = TITAN_XPBAR_MENU_CHAT info.func = TitanPanelXPBarButton_Chat info.checked = TitanUtils_Toggle(TitanSettings.Chat) UIDropDownMenu_AddButton(info) info = {} info.text = "Enable Shift+Click Output" info.func = TitanPanelXPBarButton_Shift info.checked = TitanUtils_Toggle(TitanSettings.Shift) UIDropDownMenu_AddButton(info) TitanPanelRightClickMenu_AddSpacer(); TitanPanelRightClickMenu_AddCommand(TITAN_PANEL_MENU_HIDE, id, TITAN_PANEL_MENU_FUNC_HIDE); end function TitanPanelXPBarButton_ShowStatus() TitanSettings.Status = TitanUtils_Toggle(TitanSettings.Status) TitanPanelButton_UpdateButton("XPBar"); end function totalxp(level) myLevel = UnitLevel("player"); myCurrXP = UnitXP("player"); myMaxXP = UnitXPMax("player"); myTNLXP = myMaxXP - myCurrXP; xpl = { 0, 400, 1300, 2700, 4800, 7600, 11200, 15700, 21100, 27600, 35200, 44000, 54100, 65500, 78400, 92800, 108800, 126500, 145900, 167200, 190400, 215600, 242900, 272300, 304000, 338000, 374400, 413300, 454700, 499000, 546400, 597200, 651900, 710500, 773300, 840300, 911900, 988000, 1068800, 1154500, 1245200, 1341000, 1442000, 1548300, 1660100, 1777500, 1900700, 2029800, 2164900, 2306100, 2453600, 2607500, 2767900, 2935000, 3108900, 3289700, 3477600, 3672600, 3874900, 4084700 } local totalxp = xpl[myLevel] + myCurrXP; local totalMaxXP = xpl[60]; local totalxppct = totalxp / totalMaxXP; local needxp = totalMaxXP - totalxp local needxppct = (totalMaxXP - totalxp) / totalMaxXP local totalgpct = floor(totalxppct * 10000) / 100 local totalnpct = floor(needxppct * 10000) / 100 return totalxp,totalMaxXP,totalxppct,needxp,needxppct,totalgpct.."%",totalnpct.."%" end function TitanPanelXPBarButton_ShowText() TitanSettings.Showtext=TitanUtils_Toggle(TitanSettings.Showtext) TitanPanelButton_UpdateButton("XPBar") end function TitanPanelXPBarButton_Chat() TitanSettings.Chat=TitanUtils_Toggle(TitanSettings.Chat) end function TitanPanelXPBarButton_ShowCurr() TitanSettings.XPFormat=1 TitanPanelButton_UpdateButton("XPBar") end function TitanPanelXPBarButton_ShowNext() TitanSettings.XPFormat=nil TitanPanelButton_UpdateButton("XPBar") end function TitanPanelXPBarButton_Shift() TitanSettings.Shift=TitanUtils_Toggle(TitanSettings.Shift) TitanPanelButton_UpdateButton("XPBar") end function TitanPanelXPBarButton_OnClick() local rxp,curr,max,needed,currpercent,needpcent,currlev,nextlev=TitanPanelXPBarButton_GetXPBarInfo() if (IsShiftKeyDown()) then if (not chatFrame) then chatFrame = DEFAULT_CHAT_FRAME; end chatType = chatFrame.editBox.chatType; if (TitanSettings.Shift == nil) then if (ChatFrameEditBox:IsVisible()) then ChatFrameEditBox:Insert("Currently "..curr.."/"..max.." XP with "..needed.." XP ("..needpcent..") until level "..nextlev); else SendChatMessage("Currently "..curr.."/"..max.." XP with "..needed.." XP ("..needpcent..") until level "..nextlev); end end end end function TXP_SlashHandler(msg) if (msg == 'help') then msg = nil end --if (msg == '') then -- DEFAULT_CHAT_FRAME:AddMessage("Usage: /txp height=## width=## x=## y=## avgx=## avgy=##", 1, 1, 0) -- DEFAULT_CHAT_FRAME:AddMessage("Typing just '/txp x' (or y) will display the current x (or y) position", 1, 1, 0) --end if msg then local LOCK = false; local UNLOCK = false; local param = TXP_Split(msg, " "); local i = 1; while ( param[i] ~= nil ) do local current = string.lower(param[i]); if (string.sub(current, 1, 7)=="height=") then local height=tonumber(string.sub(current, 8)); if (height) then if (height<10) then height=10; end XPBar_Height = height; XPBG:SetHeight(XPBar_Height); XPStatus:SetHeight(XPBar_Height); end end if (string.sub(current, 1, 6)=="width=") then local width=tonumber(string.sub(current, 7)); if (width) then if (width<50) then width=50; end XPBar_Width = width; XPBG:SetWidth(XPBar_Width); XPStatus:SetWidth(XPBar_Width); end end if (current == "x") then DEFAULT_CHAT_FRAME:AddMessage("Current Statusbar X = " ..TXP_pos["LOCATIONX"], 1, 1, 0); end if (current == "") then DEFAULT_CHAT_FRAME:AddMessage("Use: /txp height=## width=## x=## y=## avgx=## avgy=##", 1, 1, 0) DEFAULT_CHAT_FRAME:AddMessage("Typing just '/txp x'(or y) will display the current x (or y) position", 1, 1, 0) DEFAULT_CHAT_FRAME:AddMessage("The same works for avgx and avgy", 1, 1, 0) end if (string.sub(current, 1, 2)=="x=") then local xpos=tonumber(string.sub(current,3)) if (xpos) then if (xpos==0) then xpos=0 end TXP_pos["LOCATIONX"] = xpos end end if (current == "y") then DEFAULT_CHAT_FRAME:AddMessage("Current Statusbar Y = " ..TXP_pos["LOCATIONY"], 1, 1, 0); end if (current == "avgx") then DEFAULT_CHAT_FRAME:AddMessage("Current AVGXP X = " ..AVG_pos["LOCX"], 1, 1, 0); end if (current == "avgy") then DEFAULT_CHAT_FRAME:AddMessage("Current AVGXP Y = " ..AVG_pos["LOCY"], 1, 1, 0); end if (string.sub(current, 1, 2)=="y=") then local ypos=tonumber(string.sub(current,3)) if (ypos) then if (ypos == 0) then ypos=0 end TXP_pos["LOCATIONY"] = ypos end end if (string.sub(current, 1, 5)=="avgx=") then local avgxpos=tonumber(string.sub(current,6)) if (avgxpos) then if (avgxpos == 0) then avgxpos=0 end AVG_pos["LOCX"] = avgxpos end end if (string.sub(current, 1, 5)=="avgy=") then local avgypos=tonumber(string.sub(current,6)) if (avgypos) then if (avgypos == 0) then avgypos=0 end AVG_pos["LOCY"] = avgypos end end i = i + 1; end Statusbar_Update(); TXP() AVG() end end function TXP_Split(toCut, separator) local splitted = {}; local i = 0; local regEx = "([^" .. separator .. "]*)" .. separator .. "?"; for item in string.gfind(toCut .. separator, regEx) do i = i + 1; splitted[i] = TXP_Trim(item) or ''; end splitted[i] = nil; return splitted; end function TXP_Trim (s) return (string.gsub(s, "^%s*(.-)%s*$", "%1")); end function TXP() if ( not TXP_pos["LOCATIONX"] ) then TXP_pos["LOCATIONX"] = "0"; end if ( not TXP_pos["LOCATIONY"] ) then TXP_pos["LOCATIONY"] = "90"; end end function AVG() if ( not AVG_pos["LOCX"] ) then AVG_pos["LOCX"] = "0"; end if ( not AVG_pos["LOCY"] ) then AVG_pos["LOCY"] = "90"; end end