vanilla-wow-addons – Rev 1
?pathlinks?
local ElkBuffBar = {}
function ElkBuffBar:Init()
BuffFrame:Hide()
TemporaryEnchantFrame:Hide()
self.frame = ElkBuffBarFrame
self.frame:ClearAllPoints()
self.frame.owner = self
self.frame:SetScript("OnEvent", function() this.owner:OnEvent() end)
self.frame:RegisterEvent("ADDON_LOADED")
self.tooltip = ElkBuffTooltip
self.numBuffButtons = 0
self.numBuffsShown = 0
self.UpdateTime = 0
self.FlashTime = 0
self.FlashState = 0
self.Layout = {}
self.old_hasMainHandEnchant = nil
self.old_mainHandName = ""
self.old_mainHandExpiration = 0
self.old_mainHandCharges = 0
self.old_hasOffHandEnchant = nil
self.old_offHandName = ""
self.old_offHandExpiration = 0
self.old_offHandCharges = 0
self.compost = AceLibrary("Compost-2.0")
if (IsAddOnLoaded("ItemDB_Money")) then
EquipCompare_RegisterExclusion("^ElkBuffButton")
end
end
function ElkBuffBar:OnEvent()
if event == "ADDON_LOADED" and arg1 == "ElkBuffBar" then
self.frame:UnregisterEvent("ADDON_LOADED")
self:InitSettings()
self.frame:RegisterEvent("PLAYER_AURAS_CHANGED")
self.frame:SetScript("OnUpdate", function() this.owner:OnUpdate(arg1) end)
self.frame:SetScript("OnLeave", function() this.owner:StopMoving() end)
SLASH_ELKBUFFBAR1 = "/ebb"
SLASH_ELKBUFFBAR2 = "/elkbuffbar"
SlashCmdList["ELKBUFFBAR"] = function(msg) ElkBuffBarFrame.owner:SlashCommandHandler(msg) end
elseif event == "PLAYER_AURAS_CHANGED" then
self:UpdateBuffs()
end
end
function ElkBuffBar:InitSettings()
if not ElkBuffBarOptions then
ElkBuffBarOptions = {
["width"] = 250,
["height"] = 20,
["scale"] = 1,
["anchor"] = "TOPRIGHT",
["locked"] = nil,
["alpha"] = 1,
["icon"] = "LEFT",
["sort"] = "DEFAULT",
["timer"] = "DEFAULT",
["invert"] = nil,
["spacing"] = 0,
["group"] = 5,
["dbcolor"] = true,
}
end
if not ElkBuffBarOptions.width then ElkBuffBarOptions.width = 250 end
if not ElkBuffBarOptions.height then ElkBuffBarOptions.height = 20 end
if not ElkBuffBarOptions.scale then ElkBuffBarOptions.scale = 1 end
if not ElkBuffBarOptions.anchor then ElkBuffBarOptions.anchor = "TOPRIGHT" end
if not ElkBuffBarOptions.alpha then ElkBuffBarOptions.alpha = 1 end
if not ElkBuffBarOptions.icon then ElkBuffBarOptions.icon = "LEFT" end
if not ElkBuffBarOptions.sort then ElkBuffBarOptions.sort = "DEFAULT" end
if not ElkBuffBarOptions.timer then ElkBuffBarOptions.timer = "DEFAULT" end
if not ElkBuffBarOptions.spacing then ElkBuffBarOptions.spacing = 0 end
if not ElkBuffBarOptions.group then ElkBuffBarOptions.group = 5 end
if not ElkBuffBarOptions.dbcolor then ElkBuffBarOptions.dbcolor = true end
if not ElkBuffBarOptions.x then ElkBuffBarOptions.x = floor(GetScreenWidth() * .5 / (GetCVar("uiscale") * ElkBuffBarOptions.scale)) end
if not ElkBuffBarOptions.y then ElkBuffBarOptions.y = floor(GetScreenHeight() * .5 / (GetCVar("uiscale") * ElkBuffBarOptions.scale)) end
self:UpdateLayout()
end
local function buffssort_bytimeleft(a, b)
if (not a or not b) then
return true
end
if a[5] == 1 then
if b[5] == 1 then
return a[2] < b[2]
else
return true
end
end
if b[5] == 1 then
return false
end
if a[3] > b[3] then
return true
end
if a[3] < b[3] then
return false
end
return a[2] < b[2]
end
local function buffssort_bytimemax(a, b)
if (not a or not b) then
return true
end
if a[5] == 1 then
if b[5] == 1 then
return a[2] < b[2]
else
return true
end
end
if b[5] == 1 then
return false
end
if a[4] > b[4] then
return true
end
if a[4] < b[4] then
return false
end
return a[2] < b[2]
end
local function isEmpty(ttbl)
for _,_ in ttbl do
return false
end
return true
end
function ElkBuffBar:UpdateBuffs()
local maxtimes = self.compost:Acquire()
local buffssort = self.compost:Acquire()
for i = 1, self.numBuffsShown do
local button = getglobal("ElkBuffButton"..i)
if not maxtimes[button.name] or maxtimes[button.name] < button.maxtime then
maxtimes[button.name] = button.maxtime
end
end
local numBuffs = 0
local buffIndex, untilCancelled
local i = 0
while true do
buffIndex, untilCancelled = GetPlayerBuff(i, "HELPFUL")
if buffIndex < 0 then break end
local timeleft = GetPlayerBuffTimeLeft(buffIndex)
local timemax = timeleft
local name = self:GetBuffName(buffIndex)
if (name) then
if maxtimes[name] and timemax < maxtimes[name] then
timemax = maxtimes[name]
end
end
table.insert(buffssort, self.compost:Acquire(buffIndex, name, timeleft, timemax, untilCancelled))
i = i + 1
end
if ElkBuffBarOptions.sort == "TIMEMAX" then
table.sort(buffssort, buffssort_bytimemax)
elseif ElkBuffBarOptions.sort == "TIMELEFT" then
table.sort(buffssort, buffssort_bytimeleft)
end
for it = 1, table.getn(buffssort) do
numBuffs = numBuffs + 1
self:SetBuffButtonBuff(numBuffs, buffssort[it][1], buffssort[it][2], buffssort[it][3], buffssort[it][4], buffssort[it][5])
end
buffssort = self.compost:Reclaim(buffssort, 1)
buffssort = self.compost:Acquire()
i = 0
while true do
buffIndex, untilCancelled = GetPlayerBuff(i, "HARMFUL")
if buffIndex < 0 then break end
local timeleft = GetPlayerBuffTimeLeft(buffIndex)
local timemax = timeleft
local name = self:GetBuffName(buffIndex)
if (name) then
if maxtimes[name] and timemax < maxtimes[name] then
timemax = maxtimes[name]
end
end
table.insert(buffssort, self.compost:Acquire(buffIndex, name, timeleft, timemax, untilCancelled))
i = i + 1
end
if ElkBuffBarOptions.sort == "TIMEMAX" then
table.sort(buffssort, buffssort_bytimemax)
elseif ElkBuffBarOptions.sort == "TIMELEFT" then
table.sort(buffssort, buffssort_bytimeleft)
end
for it = 1, table.getn(buffssort) do
numBuffs = numBuffs + 1
self:SetBuffButtonDebuff(numBuffs, buffssort[it][1], buffssort[it][2], buffssort[it][3], buffssort[it][4], buffssort[it][5])
end
buffssort = self.compost:Reclaim(buffssort, 1)
buffssort = self.compost:Acquire()
local hasMainHandEnchant, mainHandExpiration, mainHandCharges, hasOffHandEnchant, offHandExpiration, offHandCharges = GetWeaponEnchantInfo()
if ( hasMainHandEnchant ) then
local timeleft = mainHandExpiration / 1000
local timemax = timeleft
local id = GetInventorySlotInfo("MainHandSlot")
local name = self:GetTempBuffName(id)
if (name) then
if maxtimes[name] and timemax < maxtimes[name] then
timemax = maxtimes[name]
end
end
table.insert(buffssort, self.compost:Acquire(id, name, timeleft, timemax, mainHandCharges))
end
if ( hasOffHandEnchant ) then
local timeleft = offHandExpiration / 1000
local timemax = timeleft
local id = GetInventorySlotInfo("SecondaryHandSlot")
local name = self:GetTempBuffName(id)
if (name) then
if maxtimes[name] and timemax < maxtimes[name] then
timemax = maxtimes[name]
end
end
oldn = table.getn(buffssort)
table.insert(buffssort, self.compost:Acquire(id, name, timeleft, timemax, offHandCharges))
end
if ElkBuffBarOptions.sort == "TIMEMAX" then
table.sort(buffssort, buffssort_bytimemax)
elseif ElkBuffBarOptions.sort == "TIMELEFT" then
table.sort(buffssort, buffssort_bytimeleft)
end
for it = 1, table.getn(buffssort) do
numBuffs = numBuffs + 1
self:SetBuffButtonWeapon(numBuffs, buffssort[it][1], buffssort[it][2], buffssort[it][3], buffssort[it][4], buffssort[it][5])
end
self:Cleanup(numBuffs)
self.numBuffsShown = numBuffs
self:UpdateButtonPositions()
maxtimes = self.compost:Reclaim(maxtimes)
buffssort = self.compost:Reclaim(buffssort, 1)
end
function ElkBuffBar:SetBuffButtonBuff(buttonid, id, buffname, timeleft, timemax, cancel)
self:CreateButtons(buttonid)
local button = getglobal("ElkBuffButton"..buttonid)
local bar = getglobal("ElkBuffButton"..buttonid.."TimeBar")
local icon = getglobal("ElkBuffButton"..buttonid.."Icon")
local name = getglobal("ElkBuffButton"..buttonid.."DescribeText")
local buffCount = getglobal("ElkBuffButton"..buttonid.."Count")
local duration = getglobal("ElkBuffButton"..buttonid.."DurationText")
local debuff = getglobal("ElkBuffButton"..buttonid.."DebuffBorder")
local tench = getglobal("ElkBuffButton"..buttonid.."TEnchBorder")
button:SetAlpha(self.frame:GetAlpha())
button.type = "BUFF"
button.id = id
button.untilCancelled = cancel
button:SetBackdropColor(0.3, 0.5, 1, 0.5)
bar:SetStatusBarColor(0, 0.5, 1, 0.8)
icon:SetTexture(GetPlayerBuffTexture(id))
button.timeleft = timeleft
button.maxtime = timemax
bar:SetMinMaxValues(0, button.maxtime)
button.name = buffname or "Buff "..id
local count = GetPlayerBuffApplications(id)
if ( count > 1 ) then
name:SetText((buffname or "Buff "..id).." x"..count)
buffCount:SetText(count)
buffCount:Show()
else
name:SetText(buffname or "Buff "..id)
buffCount:Hide()
end
debuff:Hide()
tench:Hide()
button:Show()
end
function ElkBuffBar:SetBuffButtonDebuff(buttonid, id, buffname, timeleft, timemax, cancel)
self:CreateButtons(buttonid)
local button = getglobal("ElkBuffButton"..buttonid)
local bar = getglobal("ElkBuffButton"..buttonid.."TimeBar")
local icon = getglobal("ElkBuffButton"..buttonid.."Icon")
local name = getglobal("ElkBuffButton"..buttonid.."DescribeText")
local buffCount = getglobal("ElkBuffButton"..buttonid.."Count")
local duration = getglobal("ElkBuffButton"..buttonid.."DurationText")
local debuff = getglobal("ElkBuffButton"..buttonid.."DebuffBorder")
local tench = getglobal("ElkBuffButton"..buttonid.."TEnchBorder")
button:SetAlpha(self.frame:GetAlpha())
button.type = "DEBUFF"
button.id = id
button.untilCancelled = cancel
button:SetBackdropColor(1, 0, 0, 0.5)
icon:SetTexture(GetPlayerBuffTexture(id))
button.timeleft = timeleft
button.maxtime = timemax
bar:SetMinMaxValues(0, button.maxtime)
button.name = buffname or "Debuff "..id
local count = GetPlayerBuffApplications(id)
if ( count > 1 ) then
name:SetText((buffname or "Debuff "..id).." x"..count)
buffCount:SetText(count)
buffCount:Show()
else
name:SetText(buffname or "Debuff "..id)
buffCount:Hide()
end
local color
local debuffType = GetPlayerBuffDispelType(id)
if ( debuffType ) then
color = DebuffTypeColor[debuffType]
else
color = DebuffTypeColor["none"]
end
debuff:SetVertexColor(color.r, color.g, color.b)
if ElkBuffBarOptions.dbcolor then
bar:SetStatusBarColor(color.r, color.g, color.b, 0.8)
else
bar:SetStatusBarColor(1, 0, 0, 0.8)
end
debuff:Show()
tench:Hide()
button:Show()
end
function ElkBuffBar:SetBuffButtonWeapon(buttonid, id, buffname, timeleft, timemax, count)
self:CreateButtons(buttonid)
local button = getglobal("ElkBuffButton"..buttonid)
local bar = getglobal("ElkBuffButton"..buttonid.."TimeBar")
local icon = getglobal("ElkBuffButton"..buttonid.."Icon")
local name = getglobal("ElkBuffButton"..buttonid.."DescribeText")
local buffCount = getglobal("ElkBuffButton"..buttonid.."Count")
local duration = getglobal("ElkBuffButton"..buttonid.."DurationText")
local debuff = getglobal("ElkBuffButton"..buttonid.."DebuffBorder")
local tench = getglobal("ElkBuffButton"..buttonid.."TEnchBorder")
button:SetAlpha(self.frame:GetAlpha())
button.type = "WEAPON"
button.id = id
button.untilCancelled = 0
button:SetBackdropColor(0.5, 0, 0.5, 0.5)
bar:SetStatusBarColor(0.5, 0, 0.5, 0.8)
icon:SetTexture(GetInventoryItemTexture("player", id))
button.timeleft = timeleft
button.maxtime = timemax
bar:SetMinMaxValues(0, button.maxtime)
button.name = buffname or "Weapon "..id
if ( count > 1 ) then
name:SetText((buffname or "Weapon "..id).." x"..count)
buffCount:SetText(count)
buffCount:Show()
else
name:SetText(buffname or "Weapon "..id)
buffCount:Hide()
end
debuff:Hide()
tench:Show()
button:Show()
end
function ElkBuffBar:CreateButtons(numButtons)
if numButtons > self.numBuffButtons then
for i = self.numBuffButtons + 1, numButtons do
local f = CreateFrame("Button", "ElkBuffButton"..i, self.frame, "ElkBuffBar_BuffButtonTemplate")
self:UpdateButtonPosition(i)
self:UpdateButtonHeight(i)
self:UpdateButtonIcon(i)
self:UpdateButtonTimer(i)
f.owner = self
f:SetScript("OnMouseDown", function() if arg1 == "LeftButton" then this.isMoving = true; this.owner:StartMoving() end end)
f:SetScript("OnMouseUp", function() if arg1 == "LeftButton" then this.isMoving = false; this.owner:StopMoving() end end)
f:SetScript("OnHide", function() if this.isMoving then this.owner:StopMoving() end end)
f:RegisterForClicks("RightButtonUp")
f:SetScript("OnClick", function() this.owner:ButtonOnClick() end)
f:SetScript("OnEnter", function() this.owner:ButtonOnEnter() end)
f:SetScript("OnLeave", function() this.owner:ButtonOnLeave() end)
getglobal("ElkBuffButton"..i.."DescribeText"):SetTextColor(1, 1, 1)
getglobal("ElkBuffButton"..i.."DurationText"):SetTextColor(1, 1, 1)
end
self.numBuffButtons = numButtons
end
end
function ElkBuffBar:Cleanup(numBuffs)
if numBuffs < self.numBuffButtons then
for i = numBuffs + 1, self.numBuffButtons do
local button = getglobal("ElkBuffButton"..i)
button.id = nil
button:Hide()
end
end
end
function ElkBuffBar:GetBuffName(id)
self.tooltip:SetPlayerBuff(id)
local toolTipText = getglobal("ElkBuffTooltipTextLeft1")
if (toolTipText) then
return toolTipText:GetText() or id
end
return id
end
function ElkBuffBar:GetTempBuffName(id)
self.tooltip:SetInventoryItem("player", id)
for i=1,self.tooltip:NumLines() do
local toolTipText = getglobal("ElkBuffTooltipTextLeft" .. i)
local _, _, buffname = string.find(toolTipText:GetText(), "^([^%(]+) %(%d+ [^%)]+%)")
if buffname then
return buffname
end
end
local itemlink = GetInventoryItemLink("player", id);
if (itemlink) then
local _, _, name = string.find(itemlink, "|c%x+|Hitem:%d+:%d+:%d+:%d+|h%[(.-)%]|h|r");
return name or "Weapon "..id
end
return "Weapon "..id
end
function ElkBuffBar:OnUpdate(elapsed)
local hasMainHandEnchant, mainHandExpiration, mainHandCharges, hasOffHandEnchant, offHandExpiration, offHandCharges = GetWeaponEnchantInfo()
local mainHandName = ""
if hasMainHandEnchant then
mainHandName = self:GetTempBuffName(GetInventorySlotInfo("MainHandSlot"))
end
local offHandName = ""
if hasOffHandEnchant then
offHandName = self:GetTempBuffName(GetInventorySlotInfo("SecondaryHandSlot"))
end
hasMainHandEnchant = hasMainHandEnchant or false
mainHandName = mainHandName or ""
mainHandExpiration = mainHandExpiration or 0
mainHandCharges = mainHandCharges or 0
hasOffHandEnchant = hasOffHandEnchant or false
offHandName = offHandName or ""
offHandExpiration = offHandExpiration or 0
offHandCharges = offHandCharges or 0
if hasMainHandEnchant ~= self.old_hasMainHandEnchant or mainHandName ~= self.old_mainHandName or mainHandExpiration > self.old_mainHandExpiration or mainHandCharges ~= self.old_mainHandCharges or hasOffHandEnchant ~= self.old_hasOffHandEnchant or offHandName ~= self.old_offHandName or offHandExpiration > self.old_offHandExpiration or offHandCharges ~= self.old_offHandCharges then
self:UpdateBuffs()
end
self.old_hasMainHandEnchant = hasMainHandEnchant
self.old_mainHandName = mainHandName
self.old_mainHandExpiration = mainHandExpiration
self.old_mainHandCharges = mainHandCharges
self.old_hasOffHandEnchant = hasOffHandEnchant
self.old_offHandName = offHandName
self.old_offHandExpiration = offHandExpiration
self.old_offHandCharges = offHandCharges
if ( self.UpdateTime > 0 ) then
self.UpdateTime = self.UpdateTime - elapsed
else
self.UpdateTime = self.UpdateTime + TOOLTIP_UPDATE_TIME
end
self.FlashTime = self.FlashTime - elapsed
if ( self.FlashTime < 0 ) then
local overtime = -self.FlashTime
if ( self.FlashState == 0 ) then
self.FlashState = 1
self.FlashTime = BUFF_FLASH_TIME_ON
else
self.FlashState = 0
self.FlashTime = BUFF_FLASH_TIME_OFF
end
if ( overtime < self.FlashTime ) then
self.FlashTime = self.FlashTime - overtime
end
end
if ( self.FlashState == 1 ) then
self.BuffAlphaValue = (BUFF_FLASH_TIME_ON - self.FlashTime) / BUFF_FLASH_TIME_ON
else
self.BuffAlphaValue = self.FlashTime / BUFF_FLASH_TIME_ON
end
self.BuffAlphaValue = ((self.BuffAlphaValue * (1 - BUFF_MIN_ALPHA)) + BUFF_MIN_ALPHA) * self.frame:GetAlpha()
local mustupdate = nil
for i = 1, self.numBuffsShown do
local button = getglobal("ElkBuffButton"..i)
local duration = getglobal("ElkBuffButton"..i.."DurationText")
local bar = getglobal("ElkBuffButton"..i.."TimeBar")
if button.untilCancelled ~= 1 then
local timeleft = 0
if button.type == "BUFF" or button.type == "DEBUFF" then
timeleft = GetPlayerBuffTimeLeft(button.id)
elseif button.type == "WEAPON" then
local hasMainHandEnchant, mainHandExpiration, mainHandCharges, hasOffHandEnchant, offHandExpiration, offHandCharges = GetWeaponEnchantInfo()
if button.id == GetInventorySlotInfo("MainHandSlot") then
timeleft = mainHandExpiration / 1000
end
if button.id == GetInventorySlotInfo("SecondaryHandSlot") then
timeleft = offHandExpiration / 1000
end
end
if ( timeleft < BUFF_WARNING_TIME ) then
button:SetAlpha(self.BuffAlphaValue)
else
button:SetAlpha(self.frame:GetAlpha())
end
if ElkBuffBarOptions.timer == "DEFAULT" then
duration:SetText(SecondsToTimeAbbrev(timeleft))
duration:Show()
elseif ElkBuffBarOptions.timer == "FULL" then
local seconds = timeleft
local temptime
local time = ""
if seconds >= 3600 then
tempTime = floor(seconds / 3600)
time = time..tempTime..":"
seconds = mod(seconds, 3600)
end
if seconds >= 60 then
tempTime = floor(seconds / 60)
if time ~= "" and tempTime < 10 then
time = time.."0"..tempTime..":"
else
time = time..tempTime..":"
end
seconds = mod(seconds, 60)
end
if seconds >= 0 then
tempTime = format("%d", seconds)
if time ~= "" and seconds < 10 then
time = time.."0"..tempTime
else
time = time..tempTime
end
end
duration:SetText(time)
duration:Show()
else
duration:Hide()
end
bar:SetValue(timeleft)
bar:Show()
if button.timeleft < timeleft then
mustupdate = true
end
button.timeleft = timeleft
else
duration:Hide()
bar:Hide()
end
end
if mustupdate then
self:UpdateBuffs()
end
if ( self.UpdateTime > 0 ) then
return
end
if ( GameTooltip:IsOwned(this) ) then
self:ButtonOnEnter()
end
end
function ElkBuffBar:ButtonOnEnter()
if this.type == "BUFF" or this.type == "DEBUFF" then
GameTooltip:SetOwner(this, "ANCHOR_BOTTOMLEFT")
GameTooltip:SetPlayerBuff(this.id)
elseif this.type == "WEAPON" then
GameTooltip:SetOwner(this, "ANCHOR_BOTTOMLEFT")
GameTooltip:SetInventoryItem("player", this.id)
end
end
function ElkBuffBar:ButtonOnLeave()
GameTooltip:Hide()
end
function ElkBuffBar:ButtonOnClick()
if this.type == "BUFF" or this.type == "DEBUFF" then
CancelPlayerBuff(this.id)
end
end
function ElkBuffBar:StartMoving()
if not self.Layout.locked then
self.frame:StartMoving()
end
end
function ElkBuffBar:StopMoving()
self.frame:StopMovingOrSizing()
if ElkBuffBarOptions.anchor == "TOPLEFT" then
ElkBuffBarOptions.x = floor(self.frame:GetLeft() + .5)
ElkBuffBarOptions.y = floor(self.frame:GetTop() + .5)
elseif ElkBuffBarOptions.anchor == "TOPRIGHT" then
ElkBuffBarOptions.x = floor(self.frame:GetRight() + .5)
ElkBuffBarOptions.y = floor(self.frame:GetTop() + .5)
elseif ElkBuffBarOptions.anchor == "BOTTOMLEFT" then
ElkBuffBarOptions.x = floor(self.frame:GetLeft() + .5)
ElkBuffBarOptions.y = floor(self.frame:GetBottom() + .5)
elseif ElkBuffBarOptions.anchor == "BOTTOMRIGHT" then
ElkBuffBarOptions.x = floor(self.frame:GetRight() + .5)
ElkBuffBarOptions.y = floor(self.frame:GetBottom() + .5)
end
self:UpdateLayout()
end
function ElkBuffBar:UpdateLayout()
if not self.Layout.width or self.Layout.width ~= ElkBuffBarOptions.width then
self.frame:SetWidth(ElkBuffBarOptions.width)
self.Layout.width = ElkBuffBarOptions.width
end
if not self.Layout.height or self.Layout.height ~= ElkBuffBarOptions.height then
for i = 1, self.numBuffButtons do
self:UpdateButtonHeight(i)
end
self.Layout.height = ElkBuffBarOptions.height
end
if not self.Layout.scale or self.Layout.scale ~= ElkBuffBarOptions.scale then
self.frame:SetScale(ElkBuffBarOptions.scale)
if self.Layout.scale and ElkBuffBarOptions.x and ElkBuffBarOptions.y then
ElkBuffBarOptions.x = floor(ElkBuffBarOptions.x * self.Layout.scale / ElkBuffBarOptions.scale)
ElkBuffBarOptions.y = floor(ElkBuffBarOptions.y * self.Layout.scale / ElkBuffBarOptions.scale)
end
self.Layout.scale = ElkBuffBarOptions.scale
end
if ElkBuffBarOptions.x and ElkBuffBarOptions.y and ((not self.Layout.x or self.Layout.x ~= ElkBuffBarOptions.x) or (not self.Layout.y or self.Layout.y ~= ElkBuffBarOptions.y) or (not self.Layout.anchor or self.Layout.anchor ~= ElkBuffBarOptions.anchor)) then
if self.Layout.anchor and self.Layout.anchor ~= ElkBuffBarOptions.anchor then
local x, y
if self.Layout.anchor == "TOPLEFT" then
x = ElkBuffBarOptions.x
y = ElkBuffBarOptions.y - self.frame:GetHeight()
elseif self.Layout.anchor == "TOPRIGHT" then
x = ElkBuffBarOptions.x - self.frame:GetWidth()
y = ElkBuffBarOptions.y - self.frame:GetHeight()
elseif self.Layout.anchor == "BOTTOMLEFT" then
x = ElkBuffBarOptions.x
y = ElkBuffBarOptions.y
elseif self.Layout.anchor == "BOTTOMRIGHT" then
x = ElkBuffBarOptions.x - self.frame:GetWidth()
y = ElkBuffBarOptions.y
end
if ElkBuffBarOptions.anchor == "TOPLEFT" then
ElkBuffBarOptions.x = floor(x + .5)
ElkBuffBarOptions.y = floor(y + self.frame:GetHeight() + .5)
elseif ElkBuffBarOptions.anchor == "TOPRIGHT" then
ElkBuffBarOptions.x = floor(x + self.frame:GetWidth() + .5)
ElkBuffBarOptions.y = floor(y + self.frame:GetHeight() + .5)
elseif ElkBuffBarOptions.anchor == "BOTTOMLEFT" then
ElkBuffBarOptions.x = floor(x + .5)
ElkBuffBarOptions.y = floor(y + .5)
elseif ElkBuffBarOptions.anchor == "BOTTOMRIGHT" then
ElkBuffBarOptions.x = floor(x + self.frame:GetWidth() + .5)
ElkBuffBarOptions.y = floor(y + .5)
end
end
self.frame:ClearAllPoints()
self.frame:SetPoint(ElkBuffBarOptions.anchor, UIParent, "BOTTOMLEFT", ElkBuffBarOptions.x, ElkBuffBarOptions.y)
self.Layout.x = ElkBuffBarOptions.x
self.Layout.y = ElkBuffBarOptions.y
self.Layout.anchor = ElkBuffBarOptions.anchor
end
if (not self.Layout.locked and ElkBuffBarOptions.locked) or (self.Layout.locked and not ElkBuffBarOptions.locked) then
self.Layout.locked = ElkBuffBarOptions.locked
end
if not self.Layout.alpha or self.Layout.alpha ~= ElkBuffBarOptions.alpha then
self.frame:SetAlpha(ElkBuffBarOptions.alpha)
self.Layout.alpha = ElkBuffBarOptions.alpha
end
if not self.Layout.icon or self.Layout.icon ~= ElkBuffBarOptions.icon then
for i = 1, self.numBuffButtons do
self:UpdateButtonIcon(i)
end
self.Layout.icon = ElkBuffBarOptions.icon
end
if not self.Layout.sort or self.Layout.sort ~= ElkBuffBarOptions.sort then
self:UpdateBuffs()
self.Layout.sort = ElkBuffBarOptions.sort
end
if not self.Layout.timer or self.Layout.timer ~= ElkBuffBarOptions.timer then
for i = 1, self.numBuffButtons do
self:UpdateButtonTimer(i)
end
self.Layout.timer = ElkBuffBarOptions.timer
end
if (not self.Layout.invert and ElkBuffBarOptions.invert) or (self.Layout.invert and not ElkBuffBarOptions.invert) then
self:UpdateButtonPositions()
self.Layout.invert = ElkBuffBarOptions.invert
end
if not self.Layout.spacing or self.Layout.spacing ~= ElkBuffBarOptions.spacing then
self:UpdateButtonPositions()
self.Layout.spacing = ElkBuffBarOptions.spacing
end
if not self.Layout.group or self.Layout.group ~= ElkBuffBarOptions.group then
self:UpdateButtonPositions()
self.Layout.group = ElkBuffBarOptions.group
end
if not self.Layout.dbcolor or self.Layout.dbcolor ~= ElkBuffBarOptions.dbcolor then
self:UpdateBuffs()
self.Layout.dbcolor = ElkBuffBarOptions.dbcolor
end
end
function ElkBuffBar:UpdateButtonHeight(buttonid)
local button = getglobal("ElkBuffButton"..buttonid)
local icon = getglobal("ElkBuffButton"..buttonid.."Icon")
button:SetHeight(ElkBuffBarOptions.height)
icon:SetWidth(ElkBuffBarOptions.height)
icon:SetHeight(ElkBuffBarOptions.height)
self:UpdateButtonIcon(buttonid)
self:UpdateButtonPositions(true)
end
function ElkBuffBar:UpdateButtonIcon(buttonid)
local button = getglobal("ElkBuffButton"..buttonid)
local icon = getglobal("ElkBuffButton"..buttonid.."Icon")
local bar = getglobal("ElkBuffButton"..buttonid.."TimeBar")
if ElkBuffBarOptions.icon == "LEFT" then
icon:ClearAllPoints()
icon:SetPoint("TOPLEFT", button, "TOPLEFT")
icon:Show()
bar:ClearAllPoints()
bar:SetPoint("TOPLEFT", button, "TOPLEFT", ElkBuffBarOptions.height, 0)
bar:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT")
elseif ElkBuffBarOptions.icon == "RIGHT" then
icon:ClearAllPoints()
icon:SetPoint("TOPRIGHT", button, "TOPRIGHT")
icon:Show()
bar:ClearAllPoints()
bar:SetPoint("TOPLEFT", button, "TOPLEFT")
bar:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", -ElkBuffBarOptions.height, 0)
else
icon:Hide()
bar:ClearAllPoints()
bar:SetPoint("TOPLEFT", button, "TOPLEFT")
bar:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT")
end
end
function ElkBuffBar:UpdateButtonTimer(buttonid)
local name = getglobal("ElkBuffButton"..buttonid.."DescribeText")
local duration = getglobal("ElkBuffButton"..buttonid.."DurationText")
if ElkBuffBarOptions.timer == "NONE" then
name:SetPoint("RIGHT", -2, 0)
duration:SetText("")
duration:Hide()
else
name:SetPoint("RIGHT", -35, 0)
duration:SetText("")
duration:Show()
end
end
function ElkBuffBar:UpdateButtonPosition(buttonid, space)
local space = space or 0
local button = getglobal("ElkBuffButton"..buttonid)
button:ClearAllPoints()
button:SetPoint("LEFT", self.frame, "LEFT")
button:SetPoint("RIGHT", self.frame, "RIGHT")
if buttonid > 1 then
if (ElkBuffBarOptions.invert) then
button:SetPoint("BOTTOM", getglobal("ElkBuffButton"..(buttonid-1)), "TOP", 0, space)
else
button:SetPoint("TOP", getglobal("ElkBuffButton"..(buttonid-1)), "BOTTOM", 0, -space)
end
else
if (ElkBuffBarOptions.invert) then
button:SetPoint("BOTTOM", self.frame, "BOTTOM")
else
button:SetPoint("TOP", self.frame, "TOP")
end
end
end
function ElkBuffBar:UpdateButtonPositions(onlyheight)
if self.numBuffsShown > 0 then
local groupspacer = 0
local lasttype
for i = 1, self.numBuffsShown do
local button = getglobal("ElkBuffButton"..i)
if lasttype and button.type ~= lasttype then
if not onlyheight then
self:UpdateButtonPosition(i, ElkBuffBarOptions.spacing + ElkBuffBarOptions.group)
end
groupspacer = groupspacer + 1
elseif not onlyheight then
self:UpdateButtonPosition(i, ElkBuffBarOptions.spacing)
end
lasttype = button.type
end
self.frame:SetHeight(self.numBuffsShown * ElkBuffBarOptions.height + (self.numBuffsShown - 1) * ElkBuffBarOptions.spacing + groupspacer * ElkBuffBarOptions.group)
else
self.frame:SetHeight(ElkBuffBarOptions.height)
end
end
function ElkBuffBar:SlashCommandHandler(msg)
local _, _, carg1, carg2 = string.find(msg, "^([^ ]+)$")
if not carg1 then
_, _, carg1, carg2 = string.find(msg, "^([^ ]+)[ ]+([^ ]+)")
end
if carg1 then
carg1 = string.lower(carg1)
end
-- print("|cffffff00[ElkBuffBar]|r msg is >|cffff0000"..(msg or "NIL").."|r<, carg1 is >|cffff0000"..(carg1 or "NIL").."|r<, carg2 is >|cffff0000"..(carg2 or "NIL").."|r<")
if not carg1 then
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r command line options:")
DEFAULT_CHAT_FRAME:AddMessage(" - reset : resets all values to default")
DEFAULT_CHAT_FRAME:AddMessage(" - resetpos : resets position and scale to default")
DEFAULT_CHAT_FRAME:AddMessage(" - width [100+] : sets the button's width (is |cffff0000"..ElkBuffBarOptions.width.."|r)")
DEFAULT_CHAT_FRAME:AddMessage(" - height [10+] : sets the button's height (is |cffff0000"..ElkBuffBarOptions.height.."|r)")
DEFAULT_CHAT_FRAME:AddMessage(" - scale [0.0+] : sets the button's scale (is |cffff0000"..ElkBuffBarOptions.scale.."|r)")
DEFAULT_CHAT_FRAME:AddMessage(" - anchor [TOPLEFT/-RIGHT/BOTTOMLEFT/-RIGHT] : sets anchor (is |cffff0000"..ElkBuffBarOptions.anchor.."|r)")
DEFAULT_CHAT_FRAME:AddMessage(" - locked [TRUE/FALSE] : toggles locked state (is |cffff0000"..(ElkBuffBarOptions.locked and "TRUE" or "FALSE").."|r)")
DEFAULT_CHAT_FRAME:AddMessage(" - alpha [0.0-1.0] : sets the button's alpha value (is |cffff0000"..ElkBuffBarOptions.alpha.."|r)")
DEFAULT_CHAT_FRAME:AddMessage(" - icon [LEFT/RIGHT/NONE] : sets the icon positions (is |cffff0000"..ElkBuffBarOptions.icon.."|r)")
DEFAULT_CHAT_FRAME:AddMessage(" - sort [DEFAULT/TIMEMAX/TIMELEFT] : sets the sort style (is |cffff0000"..ElkBuffBarOptions.sort.."|r)")
DEFAULT_CHAT_FRAME:AddMessage(" - timer [DEFAULT/NONE/FULL] : sets the timer style (is |cffff0000"..ElkBuffBarOptions.timer.."|r)")
DEFAULT_CHAT_FRAME:AddMessage(" - invert [TRUE/FALSE] : toggles inverting of buffs (is |cffff0000"..(ElkBuffBarOptions.invert and "TRUE" or "FALSE").."|r)")
DEFAULT_CHAT_FRAME:AddMessage(" - spacing [0+] : set space between bars (is |cffff0000"..ElkBuffBarOptions.spacing.."|r)")
DEFAULT_CHAT_FRAME:AddMessage(" - group [0+] : set additionsl space between the buff groups (is |cffff0000"..ElkBuffBarOptions.group.."|r)")
DEFAULT_CHAT_FRAME:AddMessage(" - dbcolor [TRUE/FALSE] : toggles type colored debuffs (is |cffff0000"..(ElkBuffBarOptions.dbcolor and "TRUE" or "FALSE").."|r)")
elseif carg1 == "reset" then
ElkBuffBarOptions = nil
self:InitSettings()
elseif carg1 == "resetpos" then
ElkBuffBarOptions.scale = nil
ElkBuffBarOptions.x = nil
ElkBuffBarOptions.y = nil
self:InitSettings()
elseif carg1 == "width" then
if carg2 then
carg2 = floor(tonumber(carg2))
if carg2 < 100 then
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r WIDTH must be >= 100")
else
ElkBuffBarOptions.width = carg2
self:UpdateLayout()
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r WIDTH now set to |cffff0000"..ElkBuffBarOptions.width.."|r")
end
else
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r WIDTH is |cffff0000"..ElkBuffBarOptions.width.."|r")
end
elseif carg1 == "height" then
if carg2 then
carg2 = floor(tonumber(carg2))
if carg2 < 10 then
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r HEIGHT must be >= 10")
else
ElkBuffBarOptions.height = carg2
self:UpdateLayout()
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r HEIGHT now set to |cffff0000"..ElkBuffBarOptions.height.."|r")
end
else
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r HEIGHT is |cffff0000"..ElkBuffBarOptions.height.."|r")
end
elseif carg1 == "scale" then
if carg2 then
carg2 = tonumber(carg2)
if carg2 <= 0 then
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r SCALE must be > 0.0")
else
ElkBuffBarOptions.scale = carg2
self:UpdateLayout()
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r SCALE now set to |cffff0000"..ElkBuffBarOptions.scale.."|r")
end
else
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r SCALE is |cffff0000"..ElkBuffBarOptions.scale.."|r")
end
elseif carg1 == "anchor" then
if carg2 then
carg2 = string.upper(carg2)
if carg2 ~= "TOPLEFT" and carg2 ~= "TOPRIGHT" and carg2 ~= "BOTTOMLEFT" and carg2 ~= "BOTTOMRIGHT" then
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r ANCHOR must be TOPLEFT, TOPRIGHT, BOTTOMLEFT or BOTTOMRIGHT")
else
ElkBuffBarOptions.anchor = carg2
self:UpdateLayout()
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r ANCHOR now set to |cffff0000"..ElkBuffBarOptions.anchor.."|r")
end
else
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r ANCHOR is |cffff0000"..ElkBuffBarOptions.anchor.."|r")
end
elseif carg1 == "locked" then
if carg2 then
carg2 = string.lower(carg2)
if carg2 ~= "true" and carg2 ~= "false" then
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r LOCKED must be TRUE or FALSE")
else
if carg2 == "true" then
ElkBuffBarOptions.locked = true
else
ElkBuffBarOptions.locked = nil
end
self:UpdateLayout()
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r LOCKED now set to |cffff0000"..(ElkBuffBarOptions.locked and "TRUE" or "FALSE").."|r")
end
else
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r LOCKED is |cffff0000"..(ElkBuffBarOptions.locked and "TRUE" or "FALSE").."|r")
end
elseif carg1 == "alpha" then
if carg2 then
carg2 = tonumber(carg2)
if carg2 < 0 or carg2 > 1 then
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r ALPHA must be >= 0.0 and <= 1.0")
else
ElkBuffBarOptions.alpha = carg2
self:UpdateLayout()
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r ALPHA now set to |cffff0000"..ElkBuffBarOptions.alpha.."|r")
end
else
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r ALPHA is |cffff0000"..ElkBuffBarOptions.alpha.."|r")
end
elseif carg1 == "icon" then
if carg2 then
carg2 = string.upper(carg2)
if carg2 ~= "LEFT" and carg2 ~= "RIGHT" and carg2 ~= "NONE" then
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r ICON must be LEFT, RIGHT or NONE")
else
ElkBuffBarOptions.icon = carg2
self:UpdateLayout()
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r ICON now set to |cffff0000"..ElkBuffBarOptions.icon.."|r")
end
else
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r ICON is |cffff0000"..ElkBuffBarOptions.icon.."|r")
end
elseif carg1 == "sort" then
if carg2 then
carg2 = string.upper(carg2)
if carg2 ~= "DEFAULT" and carg2 ~= "TIMEMAX" and carg2 ~= "TIMELEFT" then
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r SORT must be DEFAULT, TIMEMAX or TIMELEFT")
else
ElkBuffBarOptions.sort = carg2
self:UpdateLayout()
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r SORT now set to |cffff0000"..ElkBuffBarOptions.sort.."|r")
end
else
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r SORT is |cffff0000"..ElkBuffBarOptions.sort.."|r")
end
elseif carg1 == "timer" then
if carg2 then
carg2 = string.upper(carg2)
if carg2 ~= "DEFAULT" and carg2 ~= "NONE" and carg2 ~= "FULL" then
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r TIMER must be DEFAULT, NONE or FULL")
else
ElkBuffBarOptions.timer = carg2
self:UpdateLayout()
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r TIMER now set to |cffff0000"..ElkBuffBarOptions.timer.."|r")
end
else
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r TIMER is |cffff0000"..ElkBuffBarOptions.timer.."|r")
end
elseif carg1 == "invert" then
if carg2 then
carg2 = string.lower(carg2)
if carg2 ~= "true" and carg2 ~= "false" then
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r INVERT must be TRUE or FALSE")
else
if carg2 == "true" then
ElkBuffBarOptions.invert = true
else
ElkBuffBarOptions.invert = nil
end
self:UpdateLayout()
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r INVERT now set to |cffff0000"..(ElkBuffBarOptions.invert and "TRUE" or "FALSE").."|r")
end
else
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r INVERT is |cffff0000"..(ElkBuffBarOptions.invert and "TRUE" or "FALSE").."|r")
end
elseif carg1 == "spacing" then
if carg2 then
carg2 = floor(tonumber(carg2))
if carg2 < 0 then
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r SPACING must be >= 0")
else
ElkBuffBarOptions.spacing = carg2
self:UpdateLayout()
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r SPACING now set to |cffff0000"..ElkBuffBarOptions.spacing.."|r")
end
else
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r SPACING is |cffff0000"..ElkBuffBarOptions.spacing.."|r")
end
elseif carg1 == "group" then
if carg2 then
carg2 = floor(tonumber(carg2))
if carg2 < 0 then
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r GROUP must be >= 0")
else
ElkBuffBarOptions.group = carg2
self:UpdateLayout()
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r GROUP now set to |cffff0000"..ElkBuffBarOptions.group.."|r")
end
else
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r GROUP is |cffff0000"..ElkBuffBarOptions.group.."|r")
end
elseif carg1 == "dbcolor" then
if carg2 then
carg2 = string.lower(carg2)
if carg2 ~= "true" and carg2 ~= "false" then
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r DBCOLOR must be TRUE or FALSE")
else
if carg2 == "true" then
ElkBuffBarOptions.dbcolor = true
else
ElkBuffBarOptions.dbcolor = nil
end
self:UpdateLayout()
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r DBCOLOR now set to |cffff0000"..(ElkBuffBarOptions.dbcolor and "TRUE" or "FALSE").."|r")
end
else
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r DBCOLOR is |cffff0000"..(ElkBuffBarOptions.dbcolor and "TRUE" or "FALSE").."|r")
end
else
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[ElkBuffBar]|r "..carg1.." is no valid parameter.")
end
end
ElkBuffBar:Init()
Generated by GNU Enscript 1.6.5.90.