vanilla-wow-addons – Rev 1
?pathlinks?
--[[
TODO;
Get options load probs localized
allow reset of session data
HonorBar at lvl 60.
Experience from mob text.
Add second tier text vars
Figure out profile deletion
Element offsets
Start hooking
Vertical bars.
Circular bars.
More time to.... text...
More text bars.
DAB optional dependencies for frame attachment.
Help tooltips for config
Identify and fix position label wierdness
Custom texture addons
Element defaults
OnMousover for bar/elements
]]
BEB.CurrentVersion = 0.87
BEB.textevents = {}
BEB.TimeThisSession = 1
local VARIABLES_LOADED
local ENTERING_WORLD
BEB.XpThisSession = 0
BEB.RateThisSession = 0
BEB.RestState = -1
BEB.XpMobsTS = 0
BEB.MobsTS = 0
BEB.Flashers = {}
BEB.Flashframes = {}
local UpdateFrequency = 5
local TimeFromLastUpdate = 0
local StringOnUpdate = 0
BEB.LOG_10 = math.log(10)
BEB.Elements ={ "BEBBackground", "BEBBarText", "BEBMarkers", "BEBRestedXpBar", "BEBRestedXpTick",
"BEBRestedXpTickGlow", "BEBXpBar", "BEBXpTick"}
BEB.XpPerLvl = {400,900,1400,2100,2800,3600,4400,5400,6500,7600,8800,10100,11400,12900,14400,16000,17700,19400,21300,23200,
25200,27300,29400,31700,34000,36400,38900,41400,44300,47400,50800,54500,58600,62800,67100,71600,76100,80800,85700,90700,
95800,101000,106300,111800,117500,123200,129100,135100,141200,147500,153900,160400,167100,173900,180800,187900,195000,
202300,209800,217400}
function BEB.OnLoad()
SlashCmdList["BEB"] = BEB.Slash_Handler
SLASH_BEB1 = "/beb"
SLASH_BEB2 = "/basicexperiencebar"
this:RegisterEvent("PLAYER_ENTERING_WORLD")
this:RegisterEvent("VARIABLES_LOADED")
end
function BEB.OnEvent(event)
if (event == "VARIABLES_LOADED") then
VARIABLES_LOADED = true
if ( ENTERING_WORLD ) then
BEB.Initialize()
end
elseif (event == "PLAYER_ENTERING_WORLD") then
ENTERING_WORLD = true
if ( VARIABLES_LOADED ) then
BEB.Initialize()
end
elseif (event == "PLAYER_LEVEL_UP") then
BEB.XpThisSession = BEB.XpThisSession + (UnitXPMax("player") - BEB.OldXp)
BEB.OldXp = 0
elseif (event == "PLAYER_UPDATE_RESTING") then
BEB.UpdateFlashers()
-- BEB.SetColors("force")
BEB.UpdateElement("BEBRestedXpTickGlow")
elseif (event == "PLAYER_XP_UPDATE") then
BEB.XpThisSession = BEB.XpThisSession + (UnitXP("player") - BEB.OldXp)
BEB.OldXp = UnitXP("player")
BEB.UpdateElement("BEBXpBar")
BEB.UpdateElement("BEBRestedXpBar")
BEB.UpdateElement("BEBRestedXpTick")
elseif (event == "CHAT_MSG_COMBAT_XP_GAIN") then
local _,_,xp,_ = string.find(arg1, BEB.LOCALIZED.XpSearchString)
if (xp) then
local _,_,rxp = string.find(arg1, BEB.LOCALIZED.RestedSearchString)
BEB.XpMobsTS = BEB.XpMobsTS + tonumber(xp) - (tonumber(rxp) or 0)
BEB.MobsTS = BEB.MobsTS + 1;
end
elseif (event == "UPDATE_EXHAUSTION") then
BEB.UpdateElement("BEBRestedXpBar")
BEB.UpdateElement("BEBRestedXpTick")
BEB.UpdateElement("BEBRestedXpTickGlow")
BEB.SetColors()
elseif (event == "PLAYER_LOGOUT") then
if (BEBCharSettings.BEBProfile) then
BEB.SaveProfile(BEBCharSettings.BEBProfile)
end
end
end
function BEB.Initialize()
local INDEX = UnitName("player").." of "..GetCVar("realmName")
if (BEBCharSettings) then
if (BEBCharSettings.BEBMain.BEBProfile) then
BEB.LoadProfile(BEBCharSettings.BEBProfile)
end
end
if BEBINITIALIZED then
return
end
BEBMain:RegisterEvent("PLAYER_LOGOUT")
BEBMain:RegisterEvent("PLAYER_LEVEL_UP")
BEBMain:RegisterEvent("PLAYER_UPDATE_RESTING")
BEBMain:RegisterEvent("PLAYER_XP_UPDATE")
BEBMain:RegisterEvent("CHAT_MSG_COMBAT_XP_GAIN")
BEBMain:RegisterEvent("UPDATE_EXHAUSTION")
BEBMain:RegisterForClicks("LeftButtonUp","RightButtonUp")
-- Set default local vals
BEB.StartTime = GetTime() - 1
BEB.OldXp = UnitXP("player") or 0
-- Setup default settings and saved variables
if (not BEBGlobal) then
BEBGlobal = {}
BEBGlobal.profiles = {}
BEBGlobal.Chars = {}
BEB.DefaultSettings()
elseif (not BEBCharSettings) then
BEB.DefaultSettings()
elseif (BEBCharSettings.Version < BEB.CurrentVersion) then
BEB.DefaultSettings()
end
if (BEBCharSettings.BEBProfile) then
BEB.SaveProfile(BEBCharSettings.BEBProfile)
end
BEBGlobal.Chars[INDEX] = {Profile = BEBCharSettings.BEBProfile, Version = BEBCharSettings.Version}
--count profiles for the dropdown menu... move to BEBOptions?
local numprofiles = 0
for _,_ in BEBGlobal.profiles do
numprofiles = numprofiles + 1
end
table.setn(BEBGlobal.profiles,numprofiles)
BEB.SetupBars()
BEBINITIALIZED = true
BEB.OnEvent("PLAYER_UPDATE_RESTING")
end
function BEB.Slash_Handler(msg)
local command, param
local index = string.find(msg, " ")
if(index) then
command = string.sub(msg, 1, (index - 1))
param = string.sub(msg, (index + 1) )
else
command = msg
end
if (command == "") then
if (not IsAddOnLoaded("BEBOptions")) then
local loaded,reason = LoadAddOn("BEBOptions")
if (not loaded) then
if (reason == "DISABLED") then
BEB.Feedback(BEB.TEXT.optionsdisabled)
elseif (reason == "MISSING") then
BEB.Feedback(BEB.TEXT.optionsmissing)
elseif (reason == "CORRUPT") then
BEB.Feedback(BEB.TEXT.optionscorrupt)
elseif (reason == "INTERFACE_VERSION") then
BEB.Feedback(BEB.TEXT.optionsversion)
else
BEB.Feedback(BEB.TEXT.optionsnoload1..reason..BEB.TEXT.optionsnoload2)
end
return
end
end
if (BEBConfigFrame:IsVisible()) then
BEBConfigFrame:Hide()
else
BEBConfigFrame:Show()
end
else
if (command == "help") then
BEB.Feedback(BEB.TEXT.validcommands)
elseif (command == "defaults") then
BEB.LoadDefaults()
else
BEB.Feedback(BEB.TEXT.invalidcommand)
end
end
end
function BEB.DefaultSettings()
if (not BEBCharSettings) then
BEBCharSettings = {}
BEBCharSettings.Version = 0
end
if (BEBCharSettings.Version < 0.7) then
BEBCharSettings = {
BEBBackground = {
maxrestcolor = {0, 0, 0, .25},
restcolor = {0, 0, 0, .25},
shown = true,
texture = "PlainBackdrop",
unrestcolor = {0, 0, 0, .25}
},
BEBBarText = {
clicktext = true,
location = {
point = "CENTER",
relpoint = "CENTER",
x = 0,
y = 0
},
maxrestcolor = {1, 1, 1, 1},
mouseover = false,
restcolor = {1, 1, 1, 1},
shown = true,
size = {y=10},
text = {string = "Lvl $plv, XP $cxp/$mxp, $pdl% , $rxp Rested Xp."},
unrestcolor = {1, 1, 1, 1}
},
BEBMain = {
dragable = true,
enabled = true,
location = {
point = "CENTER",
relpoint = "CENTER",
relto = "UIParent",
x = 0,
y = -337
},
size = {x=1024,y=12}
},
BEBMarkers = {
maxrestcolor = {1, 1, 1, 1},
restcolor = {1, 1, 1, 1},
shown = true,
texture = "BEB-ExperienceBarMarkers",
unrestcolor = {1, 1, 1, 1}
},
BEBProfile = false,
BEBRestedXpBar = {
maxrestcolor = {0.2, 0.3, 0.65, 1},
restcolor = {0.2, 0.3, 0.65, 1},
shown = true,
texture = "BEB-BarFill-RoundedLight"
},
BEBRestedXpTick = {
location = {x=0,y=0},
maxrestcolor = {1, 0, 0, 1},
restcolor = {1, 1, 1, 1},
shown = true,
size = {x=27,y=26},
texture = "BEB-ExhaustionTicks"
},
BEBRestedXpTickGlow = {
flashing = true,
maxrestcolor = {1, 0.8, 0.8, 1},
restcolor = {1, 1, 1, 1},
shown = true,
texture = "BEB-ExhaustionTicksGlow"
},
BEBXpBar = {
maxrestcolor = {0.4, 0, 0.7, 1},
restcolor = {0.4, 0, 0.7, 1},
texture = "BEB-BarFill-RoundedLight",
unrestcolor = {0.6, 0, 0.5, 1}
},
BEBXpTick = {
location = {x=0,y=0},
maxrestcolor = {1, 1, 1, 1},
restcolor = {1, 1, 1, 1},
shown = true,
size = {x=27,y=26},
texture = "BEB-ExhaustionTicks",
unrestcolor = {1, 1, 1, 1}
},
Version = 0.7,
}
end
if (BEBCharSettings.Version < 0.71) then
BEBCharSettings.BEBBackground.flashing = false
BEBCharSettings.BEBXpBar.flashing = false
BEBCharSettings.BEBRestedXpBar.flashing = false
BEBCharSettings.BEBMarkers.flashing = false
BEBCharSettings.BEBXpTick.flashing = false
BEBCharSettings.BEBRestedXpTick.flashing = false
BEBCharSettings.BEBBarText.flashing = false
BEBCharSettings.Version = 0.71
end
if (BEBCharSettings.Version < 0.82) then
BEBCharSettings.BEBMain.level = 5
BEBCharSettings.BEBBackground.level = 6
BEBCharSettings.BEBXpBar.level = 7
BEBCharSettings.BEBRestedXpBar.level = 7
BEBCharSettings.BEBMarkers.level = 8
BEBCharSettings.BEBXpTick.level = 9
BEBCharSettings.BEBRestedXpTick.level = 9
BEBCharSettings.BEBRestedXpTickGlow.level = 10
BEBCharSettings.BEBBarText.level = 10
BEBCharSettings.Version = 0.82
end
if (BEBCharSettings.Version < 0.84) then
BEBCharSettings.BEBMain.strata = "HIGH"
BEBCharSettings.BEBBackground.strata = "HIGH"
BEBCharSettings.BEBXpBar.strata = "HIGH"
BEBCharSettings.BEBRestedXpBar.strata = "HIGH"
BEBCharSettings.BEBMarkers.strata = "HIGH"
BEBCharSettings.BEBXpTick.strata = "HIGH"
BEBCharSettings.BEBRestedXpTick.strata = "HIGH"
BEBCharSettings.BEBRestedXpTickGlow.strata = "HIGH"
BEBCharSettings.BEBBarText.strata = "HIGH"
BEBCharSettings.Version = 0.84
end
if (BEBCharSettings.Version < 0.86) then
BEBCharSettings.BEBMain.enabled = nil
BEBCharSettings.Version = 0.86
end
if (BEBCharSettings.Version < BEB.CurrentVersion) then
BEBCharSettings.Version = BEB.CurrentVersion
end
end
function BEB.OnDragStart()
if(not BEBCharSettings.BEBMain.dragable) then
BEB.Feedback(BEB.TEXT.framelocked)
else
BEBMain:StartMoving()
end
end
function BEB.OnDragStop()
BEBMain:StopMovingOrSizing()
BEB.GetPosition()
BEBMain:SetUserPlaced(false)
end
function BEB.OnClick(arg1)
if (arg1 == "RightButton") then
BEB.Slash_Handler("")
elseif (arg1 == "LeftButton") then
if (BEBCharSettings.BEBBarText.shown and BEBCharSettings.BEBBarText.clicktext) then
ChatFrameEditBox:Insert(BEBBarText.textframe:GetText())
end
end
end
function BEB.OnEnter()
if (BEBCharSettings.BEBBarText.shown and BEBCharSettings.BEBBarText.mouseover) then
BEBBarText:Show()
end
end
function BEB.OnLeave()
if (BEBCharSettings.BEBBarText.shown and BEBCharSettings.BEBBarText.mouseover) then
BEBBarText:Hide()
end
end
function BEB.GetPosition()
local BEBPoint = {}
local BEBRelPoint = {}
local point = BEBCharSettings.BEBMain.location.point
local relpoint = BEBCharSettings.BEBMain.location.relpoint
local relto = getglobal(BEBCharSettings.BEBMain.location.relto)
if (point == "CENTER") then
BEBPoint.x, BEBPoint.y = BEBMain:GetCenter()
elseif (point == "TOPRIGHT") then
BEBPoint.x, BEBPoint.y = BEBMain:GetRight(), BEBMain:GetTop()
elseif (point == "TOPLEFT") then
BEBPoint.x, BEBPoint.y = BEBMain:GetLeft(), BEBMain:GetTop()
elseif (point == "BOTTOMRIGHT") then
BEBPoint.x, BEBPoint.y = BEBMain:GetRight(), BEBMain:GetBottom()
elseif (point == "BOTTOMLEFT") then
BEBPoint.x, BEBPoint.y = BEBMain:GetLeft(), BEBMain:GetBottom()
elseif (point == "TOP") then
BEBPoint.x, _, BEBPoint.y = BEBMain:GetCenter(), BEBMain:GetTop()
elseif (point == "BOTTOM") then
BEBPoint.x, _, BEBPoint.y = BEBMain:GetCenter(), BEBMain:GetBottom()
elseif (point == "LEFT") then
BEBPoint.x, _, BEBPoint.y = BEBMain:GetLeft(), BEBMain:GetCenter()
elseif (point == "RIGHT") then
BEBPoint.x, _, BEBPoint.y = BEBMain:GetRight(), BEBMain:GetCenter()
end
if (relpoint == "CENTER") then
BEBRelPoint.x, BEBRelPoint.y = relto:GetCenter()
elseif (relpoint == "TOPRIGHT") then
BEBRelPoint.x, BEBRelPoint.y = relto:GetRight(), relto:GetTop()
elseif (relpoint == "TOPLEFT") then
BEBRelPoint.x, BEBRelPoint.y = relto:GetLeft(), relto:GetTop()
elseif (relpoint == "BOTTOMRIGHT") then
BEBRelPoint.x, BEBRelPoint.y = relto:GetRight(), relto:GetBottom()
elseif (relpoint == "BOTTOMLEFT") then
BEBRelPoint.x, BEBRelPoint.y = relto:GetLeft(), relto:GetBottom()
elseif (relpoint == "TOP") then
BEBRelPoint.x, _, BEBRelPoint.y = relto:GetCenter(), relto:GetTop()
elseif (relpoint == "BOTTOM") then
BEBRelPoint.x, _, BEBRelPoint.y = relto:GetCenter(), relto:GetBottom()
elseif (relpoint == "LEFT") then
BEBRelPoint.x, _, BEBRelPoint.y = relto:GetLeft(), relto:GetCenter()
elseif (relpoint == "RIGHT") then
BEBRelPoint.x, _, BEBRelPoint.y = relto:GetRight(), relto:GetCenter()
end
BEBCharSettings.BEBMain.location.x, BEBCharSettings.BEBMain.location.y = BEBPoint.x - BEBRelPoint.x, BEBPoint.y - BEBRelPoint.y
end
function BEB.IsFrame(frameName)
if (getglobal(frameName)) then
local var = getglobal(frameName)
return ((type(var) == "table") and (type(var[0]) == "userdata") and (type(var.GetName) == "function") and (var:GetName() == frameName))
else
return false
end
end
function BEB.CompileString(instring, Frame)
for k,_ in BEB.textevents do
BEBTextEventFrame:UnregisterEvent(k)
end
local frame = Frame:GetName()
local outstring = {}
local i = 1
local length = string.len(instring)
local count = 0
while (i<=length) do
count = count +1
outstring[count] = {}
local start,_ = string.find(instring,"%$",i)
if (start == i) then
local substring = string.sub(instring, i, i+3)
outstring[count].string = substring
if (BEB.VARIABLE_FUNCTIONS[substring]) then
outstring[count].func = BEB.VARIABLE_FUNCTIONS[substring].func
outstring[count].text = outstring[count].func()
for _,event in BEB.VARIABLE_FUNCTIONS[substring].events do
if (BEB.textevents[event]) then
if (BEB.textevents[event][frame]) then
table.insert(BEB.textevents[event][frame],count)
else
BEB.textevents[event][frame] = {count}
end
else
BEB.textevents[event] = {[frame] = {count}}
end
end
end
i = i+4
elseif (not start) then
outstring[count].string = string.sub(instring, i, length)
outstring[count].text = outstring[count].string
i = length +1
else
outstring[count].string = string.sub(instring, i, start-1)
outstring[count].text = outstring[count].string
i = start
end
end
outstring.count = count
Frame.texttable = outstring
for k,_ in BEB.textevents do
BEBTextEventFrame:RegisterEvent(k)
end
end
function BEB.TexturePath(var)
if (string.find(var, "Interface\\")) then
return var
else
return "Interface\\AddOns\\BEB\\Textures\\"..var
end
end
function BEB.LoadProfile(bebprofile)
if (BEBGlobal.profiles[bebprofile]) then
if (BEBCharSettings.BEBProfile == bebprofile) then
BEBCharSettings = BEB.TableCopy(BEBGlobal.profiles[bebprofile])
BEBCharSettings.BEBProfile = bebprofile
else
BEBCharSettings = BEB.TableCopy(BEBGlobal.profiles[bebprofile])
end
else
BEB.FeedBack(BEB.TEXT.profilemissing)
BEBCharSettings.BEBProfile = false
end
end
function BEB.SaveProfile(bebprofile)
BEBGlobal.profiles[bebprofile] = BEB.TableCopy(BEBCharSettings)
BEBGlobal.profiles[bebprofile].BEBProfile = false
end
function BEB.TableCopy(a)
local b={}
for k,v in a do
if type(v) == "table" then
b[k] = BEB.TableCopy(v)
else
b[k]=v
end
end
return b
end
function BEB.SetupBars()
local elements = {"BEBMain","BEBBackground","BEBXpBar","BEBRestedXpBar","BEBMarkers","BEBXpTick","BEBRestedXpTick","BEBRestedXpTickGlow","BEBBarText"}
for _,v in ipairs(elements) do
BEB.SetupElement(v)
end
BEB.SetColors(nil, true)
end
function BEB.SetupElement(element)
if (element == "BEBProfile") then
return
end
local Element = getglobal(element)
if (BEBCharSettings[element].flashing) then
BEB.Flashframes[element] = true
if ((IsResting() == 1) and (not Element.flashing)) then
BEB.StartFlashing(element,0.7,0.2,1)
end
else
BEB.Flashframes[element] = nil
if ((IsResting() == 1) and Element.flashing) then
BEB.StopFlashing(element)
end
end
Element:SetFrameLevel(BEBCharSettings[element].level)
Element:SetFrameStrata(BEBCharSettings[element].strata)
if (element == "BEBMain") then
if (BEB.IsFrame(BEBCharSettings.BEBMain.location.relto)) then
BEBMain:ClearAllPoints()
local Location = BEBCharSettings.BEBMain.location
BEBMain:SetPoint(Location.point, Location.relto, Location.relpoint, Location.x, Location.y)
else
BEB.Feedback(BEB.TEXT.framewasinvalid)
BEBMain:SetPoint("CENTER","UIParent","CENTER",0,0)
end
BEBMain:SetWidth(BEBCharSettings.BEBMain.size.x)
BEBMain:SetHeight(BEBCharSettings.BEBMain.size.y)
if (BEBCharSettings.BEBMain.dragable == true) then
BEBMain:RegisterForDrag("LeftButton")
else
BEBMain:RegisterForDrag()
end
BEBBarText:SetHeight(BEBCharSettings.BEBMain.size.y)
BEBXpBar:SetHeight(BEBCharSettings.BEBMain.size.y)
BEBRestedXpBar:SetHeight(BEBCharSettings.BEBMain.size.y)
BEB.BEBMainWidth = BEBMain:GetWidth()
elseif (element == "BEBBackground") then
if (BEBCharSettings.BEBBackground.shown) then
BEBBackground:ClearAllPoints()
BEBBackground:SetPoint("TOPLEFT", BEBMain, "TOPLEFT", 0, 0)
BEBBackground:SetPoint("BOTTOMRIGHT", BEBMain, "BOTTOMRIGHT", 0, 0)
BEBBackground.texture:SetTexture(BEB.TexturePath(BEBCharSettings.BEBBackground.texture))
BEBBackground:Show()
else
BEBBackground:Hide()
end
elseif (element == "BEBXpBar") then
BEBXpBar:ClearAllPoints()
BEBXpBar:SetPoint("LEFT", BEBMain, "LEFT", 0, 0)
BEBXpBar.texture:SetTexture(BEB.TexturePath(BEBCharSettings.BEBXpBar.texture))
elseif (element == "BEBRestedXpBar") then
if (BEBCharSettings.BEBRestedXpBar.shown) then
BEBRestedXpBar:ClearAllPoints()
BEBRestedXpBar:SetPoint("LEFT", BEBXpBar, "RIGHT", 0, 0)
BEBRestedXpBar.texture:SetTexture(BEB.TexturePath(BEBCharSettings.BEBRestedXpBar.texture))
BEBRestedXpBar:Show()
else
BEBRestedXpBar:Hide()
end
elseif (element == "BEBMarkers") then
if (BEBCharSettings.BEBMarkers.shown) then
BEBMarkers:ClearAllPoints()
BEBMarkers:SetPoint("TOPLEFT", BEBMain, "TOPLEFT", 0, 0)
BEBMarkers:SetPoint("BOTTOMRIGHT", BEBMain, "BOTTOMRIGHT", 0, 0)
BEBMarkers.texture:SetTexture(BEB.TexturePath(BEBCharSettings.BEBMarkers.texture))
BEBMarkers:Show()
else
BEBMarkers:Hide()
end
elseif (element == "BEBXpTick") then
if (BEBCharSettings.BEBXpTick.shown) then
BEBXpTick:ClearAllPoints()
BEBXpTick:SetPoint("CENTER", "BEBXpBar", "RIGHT", BEBCharSettings.BEBXpTick.location.x, BEBCharSettings.BEBXpTick.location.y)
BEBXpTick.texture:SetTexture(BEB.TexturePath(BEBCharSettings.BEBXpTick.texture))
BEBXpTick.texture:SetTexCoord(0,0.5,0,0.5)
BEBXpTick:Show()
else
BEBXpTick:Hide()
end
BEBXpTick:SetWidth(BEBCharSettings.BEBXpTick.size.x)
BEBXpTick:SetHeight(BEBCharSettings.BEBXpTick.size.y)
elseif (element == "BEBRestedXpTick") then
if (BEBCharSettings.BEBRestedXpTick.shown) then
BEBRestedXpTick.texture:SetTexture(BEB.TexturePath(BEBCharSettings.BEBRestedXpTick.texture))
BEBRestedXpTick:SetWidth(BEBCharSettings.BEBRestedXpTick.size.x)
BEBRestedXpTick:SetHeight(BEBCharSettings.BEBRestedXpTick.size.y)
BEBRestedXpTick:Show()
else
BEBRestedXpTick:Hide()
end
elseif (element == "BEBRestedXpTickGlow") then
if (BEBCharSettings.BEBRestedXpTickGlow.shown) then
BEBRestedXpTickGlow.texture:SetTexture(BEB.TexturePath(BEBCharSettings.BEBRestedXpTickGlow.texture))
BEBRestedXpTickGlow:ClearAllPoints()
BEBRestedXpTickGlow:SetPoint("TOPLEFT", "BEBRestedXpTick", "TOPLEFT", 0, 0)
BEBRestedXpTickGlow:SetPoint("BOTTOMRIGHT", "BEBRestedXpTick", "BOTTOMRIGHT", 0, 0)
end
elseif (element == "BEBBarText") then
if (BEBCharSettings.BEBBarText.shown) then
BEB.CompileString(BEBCharSettings.BEBBarText.text.string, BEBBarText)
BEBBarText:ClearAllPoints()
BEBBarText:SetPoint(BEBCharSettings.BEBBarText.location.point, "BEBMain", BEBCharSettings.BEBBarText.location.relpoint, BEBCharSettings.BEBBarText.location.x, BEBCharSettings.BEBBarText.location.y)
BEB.StringEvent("WRITE_ALL", element)
if (BEBCharSettings.BEBBarText.mouseover) then
BEBBarText:Hide()
else
BEBBarText:Show()
end
else
BEBBarText:Hide()
end
BEBBarText.textframe:SetTextHeight(BEBCharSettings.BEBBarText.size.y)
local scale = BEBMain:GetScale()
BEBMain:SetScale(scale + 0.1)
BEBMain:SetScale(scale)
end
BEB.UpdateElement(element)
end
function BEB.SetColors(element, force) -- do not use the numbers 0, 1 or 2 for force
BEB.OldRestState = force or BEB.RestState
if (GetRestState() == 1) then
if (GetXPExhaustion() == (UnitXPMax("player")*1.5)) then
BEB.RestState = 2
else
BEB.RestState = 1
end
else
BEB.RestState = 0
end
if (BEB.RestState ~= BEB.OldRestState) then
if (element) then
BEB.SetElementColor(element)
else
for _,v in BEB.Elements do
BEB.SetElementColor(v)
end
end
end
end
function BEB.SetElementColor(element)
local Element = getglobal(element)
if ((BEB.RestState == 0) and BEBCharSettings[element].unrestcolor) then
(Element.texture or Element.textframe):SetVertexColor(unpack(BEBCharSettings[element].unrestcolor))
elseif ((BEB.RestState == 1) and BEBCharSettings[element].restcolor) then
(Element.texture or Element.textframe):SetVertexColor(unpack(BEBCharSettings[element].restcolor))
elseif ((BEB.RestState == 2) and BEBCharSettings[element].maxrestcolor) then
(Element.texture or Element.textframe):SetVertexColor(unpack(BEBCharSettings[element].maxrestcolor))
end
end
function BEB.UpdateElement(element)
if (element == "BEBXpBar") then
BEB.BEBScale = BEB.BEBMainWidth / UnitXPMax("player")
if ((not UnitXP("player")) or (UnitXP("player") == 0)) then
BEB.BEBXpWidth = 1
else
BEB.BEBXpWidth = BEB.BEBScale * UnitXP("player")
end
BEBXpBar:SetWidth(BEB.BEBXpWidth)
BEBXpBar.texture:SetTexCoord(0,(BEB.BEBXpWidth/BEB.BEBMainWidth),0,1)
elseif (element == "BEBRestedXpBar") then
if ((GetRestState() == 1) and BEBCharSettings.BEBRestedXpBar.shown) then
if ((UnitXP("player")+GetXPExhaustion()) > UnitXPMax("player")) then
BEBRestedXpBar:SetWidth(BEB.BEBMainWidth - BEB.BEBXpWidth)
BEBRestedXpBar.texture:SetTexCoord((BEB.BEBXpWidth/BEB.BEBMainWidth),1,0,1)
else
local BEBRestedXpWidth = (UnitXP("player")+GetXPExhaustion())*BEB.BEBScale
BEBRestedXpBar:SetWidth(BEBRestedXpWidth - BEB.BEBXpWidth)
BEBRestedXpBar.texture:SetTexCoord((BEB.BEBXpWidth/BEB.BEBMainWidth),(BEBRestedXpWidth/BEB.BEBMainWidth),0,1)
end
else
BEBRestedXpBar:Hide()
end
elseif (element == "BEBRestedXpTick") then
if ((GetRestState() == 1) and BEBCharSettings.BEBRestedXpTick.shown) then
local position
local xp, rest, xpmax, level = UnitXP("player"), GetXPExhaustion(), UnitXPMax("player"), UnitLevel("player")
if (level < 59) then
if ((xp + rest - xpmax) > BEB.XpPerLvl[level+1]) then
position = ((xp + rest - xpmax - BEB.XpPerLvl[level+1])/BEB.XpPerLvl[level+2]) * BEB.BEBMainWidth
BEBRestedXpTick.texture:SetTexCoord(0, 0.5, 0.5, 1)
BEB.BEBRestState = 3
elseif ((xp + rest) > xpmax) then
position = ((xp + rest - xpmax)/BEB.XpPerLvl[level+1]) * BEB.BEBMainWidth
BEBRestedXpTick.texture:SetTexCoord(0.5, 1, 0, 0.5)
BEB.BEBRestState = 2
else
position = (xp + rest)*BEB.BEBScale
BEBRestedXpTick.texture:SetTexCoord(0, 0.5, 0, 0.5)
BEB.BEBRestState = 1
end
elseif (level == 59) then
if ((xp + rest - xpmax) > BEB.XpPerLvl[level+1]) then
position = BEB.BEBMainWidth
BEBRestedXpTick.texture:SetTexCoord(0, 0.5, 0.5, 1)
BEB.BEBRestState = 3
elseif ((xp + rest) > xpmax) then
position = ((xp + rest - xpmax)/BEB.XpPerLvl[level+1]) * BEB.BEBMainWidth
BEBRestedXpTick.texture:SetTexCoord(0.5, 1, 0, 0.5)
BEB.BEBRestState = 2
else
position = (xp + rest)*BEB.BEBScale
BEBRestedXpTick.texture:SetTexCoord(0, 0.5, 0, 0.5)
BEB.BEBRestState = 1
end
elseif (level == 60) then
if ((xp + rest) > xpmax) then
position = BEB.BEBMainWidth
BEBRestedXpTick.texture:SetTexCoord(0.5, 1, 0, 0.5)
BEB.BEBRestState = 2
else
position = (xp + rest)*BEB.BEBScale
BEBRestedXpTick.texture:SetTexCoord(0, 0.5, 0, 0.5)
BEB.BEBRestState = 1
end
end
local offsets = BEBCharSettings.BEBRestedXpTick.location
BEBRestedXpTick:SetPoint("CENTER" ,"BEBMain" ,"LEFT", (position + offsets.x), offsets.y)
BEBRestedXpTick:Show()
else
BEBRestedXpTick:Hide()
BEB.BEBRestState = 0
end
elseif (element == "BEBRestedXpTickGlow") then
if (BEBCharSettings.BEBRestedXpTickGlow.shown and (BEB.BEBRestState ~= 0) and (IsResting() == 1)) then
if (BEB.BEBRestState == 1) then
BEBRestedXpTickGlow.texture:SetTexCoord(0, 0.5, 0, 0.5)
BEBRestedXpTickGlow:Show()
elseif (BEB.BEBRestState == 2) then
BEBRestedXpTickGlow.texture:SetTexCoord(0.5, 1, 0, 0.5)
BEBRestedXpTickGlow:Show()
elseif (BEB.BEBRestState == 3) then
BEBRestedXpTickGlow.texture:SetTexCoord(0, 0.5, 0.5, 1)
BEBRestedXpTickGlow:Show()
end
else
BEBRestedXpTickGlow:Hide()
end
end
end
function BEB.OnUpdate(elapsed)
if (BEBINITIALIZED) then
if (BEB.TextTimeToHide) then
if (BEB.TextTimeToHide > 0) then
BEB.TextTimeToHide = BEB.TextTimeToHide - elapsed
else
BEB.TextTimeToHide = nil
BEBBarText:Hide()
end
end
BEB.TimeThisSession = GetTime() - BEB.StartTime
BEB.RateThisSession = BEB.XpThisSession/BEB.TimeThisSession
TimeFromLastUpdate = TimeFromLastUpdate + elapsed
if (TimeFromLastUpdate > UpdateFrequency) then
BEB.UpdateElement("BEBXpBar")
BEB.UpdateElement("BEBRestedXpBar")
BEB.UpdateElement("BEBRestedXpTick")
BEB.UpdateElement("BEBRestedXpTickGlow")
BEB.SetColors()
TimeFromLastUpdate = 0
end
if (BEB.textevents["ON_UPDATE"]) then
StringOnUpdate = StringOnUpdate +elapsed
if (StringOnUpdate > 0.5) then
BEB.StringEvent("ON_UPDATE")
StringOnUpdate = 0
end
end
BEB.Flashing(elapsed)
end
end
function BEB.StringEvent(event,writeframe)
if (BEB.textevents[event]) then
for frame,table in BEB.textevents[event] do
local Frame = getglobal(frame)
local text = ""
for _,n in table do
Frame.texttable[n].text = Frame.texttable[n].func()
end
for i=1,Frame.texttable.count do
text = text..Frame.texttable[i].text
end
if (Frame.textframe) then
Frame.textframe:SetText(text)
Frame:SetWidth(Frame.textframe:GetWidth())
else
Frame.text = text
end
end
elseif (event == "WRITE_ALL") then
local Frame = getglobal(writeframe)
local text = ""
for i=1,Frame.texttable.count do
text = text..Frame.texttable[i].text
end
if (Frame.textframe) then
Frame.textframe:SetText(text)
Frame:SetWidth(Frame.textframe:GetWidth())
else
Frame.text = text
end
end
end
function BEB.Feedback(msg)
DEFAULT_CHAT_FRAME:AddMessage( msg, 1.0, 1.0, 0.0 );
end
function BEB.StartFlashing(element,rate,min,max)
local Element = getglobal(element)
if (not BEB.Flashers[element]) then
BEB.Flashers[element] = Element
Element.rate = rate
Element.min = min
Element.max = max
Element.scale = (max-min)/rate
Element.time = rate
if (Element.textframe) then
Element.textframe:SetAlpha(max)
elseif (Element.texture) then
Element.texture:SetAlpha(max)
end
end
end
function BEB.StopFlashing(element)
local Element = getglobal(element)
BEB.Flashers[element] = nil
Element.rate = nil
Element.min = nil
Element.max = nil
Element.scale = nil
Element.time = nil
-- SetElementAlpha(element)
end
function BEB.Flashing(elapsed)
for k,v in BEB.Flashers do
BEB.doFlash(k,v,elapsed)
end
end
function BEB.doFlash(element,Element,elapsed)
if (Element.shown) then
Element.time = Element.time - elapsed
while (Element.time < 0) do
Element.time = Element.rate + Element.time
Element.reversed = not Element.reversed
-- if (Element.cycles) then
-- Element.cycles = Element.cycles - 0.5
-- if (Element.cycles == 0) then
-- BEB.StopFlashing(element)
-- Element.cycles = nil
-- return
-- end
-- end
end
if (Element.reversed) then
if (Element.textframe) then
Element.textframe:SetAlpha(Element.max-(Element.scale*Element.time))
elseif (Element.texture) then
Element.texture:SetAlpha(Element.max-(Element.scale*Element.time))
end
else
if (Element.textframe) then
Element.textframe:SetAlpha(Element.min+(Element.scale*Element.time))
elseif (Element.texture) then
Element.texture:SetAlpha(Element.min+(Element.scale*Element.time))
end
end
end
end
function BEB.UpdateFlashers()
if (IsResting() == 1) then
for v,_ in BEB.Flashframes do
BEB.StartFlashing(v,0.7,0.2,1)
end
else
for v,_ in BEB.Flashframes do
BEB.StopFlashing(v)
BEB.SetColors(v, true)
end
end
end
function BEB.SecondsToTime(seconds)
if (seconds < 60) then
return math.floor(seconds).."s"
elseif (seconds < 3600) then
return math.floor(seconds/60).."m"..math.floor(math.mod(seconds,60)).."s"
elseif (seconds < 86400) then
return math.floor(seconds/3600).."h"..math.floor(math.mod(seconds,3600)/60).."m"
else
return math.floor(seconds/86400).."d"..math.floor(math.mod(seconds,86400)/3600).."h"
end
end
function BEB.round(num, idp)
local mult = 10^(idp or 0)
return math.ceil((num*mult)-0.5) / mult
end
function BEB.sigfigs(num, figs)
if (num == 0) then
return 0
else
local expo = math.floor(math.log(math.abs(num))/BEB.LOG_10)
return BEB.round(num, (figs-expo)-1)
end
end
function BEB.LoadDefaults()
if ( not BEBINITIALIZED ) then
BEBConfigFrame:Hide()
return
end
BEBCharSettings = nil
BEB.DefaultSettings()
BEB.SetupBars()
BEB.Feedback(BEB.TEXT.defaultsloaded)
BEBOPTIONS.OnShow()
end
Generated by GNU Enscript 1.6.5.90.