diff --git a/ElvUI/Core/install.lua b/ElvUI/Core/install.lua
index ef3d4be..ec8e861 100644
--- a/ElvUI/Core/install.lua
+++ b/ElvUI/Core/install.lua
@@ -665,17 +665,17 @@ local function SetupAuras(style)
UF:Configure_AuraBars(frame)
end
- frame = UF["focus"]
- E:CopyTable(E.db.unitframe.units.focus.buffs, P.unitframe.units.focus.buffs)
- E:CopyTable(E.db.unitframe.units.focus.debuffs, P.unitframe.units.focus.debuffs)
- E:CopyTable(E.db.unitframe.units.focus.aurabar, P.unitframe.units.focus.aurabar)
- E.db.unitframe.units.focus.smartAuraDisplay = P.unitframe.units.focus.smartAuraDisplay
+ -- frame = UF["focus"]
+ -- E:CopyTable(E.db.unitframe.units.focus.buffs, P.unitframe.units.focus.buffs)
+ -- E:CopyTable(E.db.unitframe.units.focus.debuffs, P.unitframe.units.focus.debuffs)
+ -- E:CopyTable(E.db.unitframe.units.focus.aurabar, P.unitframe.units.focus.aurabar)
+ -- E.db.unitframe.units.focus.smartAuraDisplay = P.unitframe.units.focus.smartAuraDisplay
- if frame then
- UF:Configure_Auras(frame, "Buffs")
- UF:Configure_Auras(frame, "Debuffs")
- UF:Configure_AuraBars(frame)
- end
+ -- if frame then
+ -- UF:Configure_Auras(frame, "Buffs")
+ -- UF:Configure_Auras(frame, "Debuffs")
+ -- UF:Configure_AuraBars(frame)
+ -- end
if not style then
E.db.unitframe.units.player.buffs.enable = true
diff --git a/ElvUI/Libraries/Load_Libraries.xml b/ElvUI/Libraries/Load_Libraries.xml
index 4b9c2ae..ea430d1 100644
--- a/ElvUI/Libraries/Load_Libraries.xml
+++ b/ElvUI/Libraries/Load_Libraries.xml
@@ -17,6 +17,7 @@
+
diff --git a/ElvUI/Libraries/oUF/elements/auras.lua b/ElvUI/Libraries/oUF/elements/auras.lua
index c67bac0..30508e2 100644
--- a/ElvUI/Libraries/oUF/elements/auras.lua
+++ b/ElvUI/Libraries/oUF/elements/auras.lua
@@ -64,8 +64,8 @@ button.isDebuff - indicates if the button holds a debuff (boolean)
local ns = oUF
local oUF = ns.oUF
-local tinsert = table.insert
-local floor, min = math.floor, math.min
+local tinsert, getn = table.insert, table.getn
+local floor, min, mod = math.floor, math.min, math.mod
local CreateFrame = CreateFrame
local GetTime = GetTime
@@ -250,7 +250,7 @@ local function SetPosition(element, from, to)
-- Bail out if the to range is out of scope.
if(not button) then break end
- local col = (i - 1) % cols
+ local col = mod((i - 1), cols)
local row = floor((i - 1) / cols)
button:ClearAllPoints()
@@ -277,7 +277,7 @@ local function filterIcons(element, unit, filter, limit, isDebuff, offset, dontH
end
if not dontHide then
- for i = visible + offset + 1, #element do
+ for i = visible + offset + 1, getn(element) do
element[i]:Hide()
end
end
diff --git a/ElvUI/Libraries/oUF/elements/elements.xml b/ElvUI/Libraries/oUF/elements/elements.xml
index 91f969b..d3455b9 100644
--- a/ElvUI/Libraries/oUF/elements/elements.xml
+++ b/ElvUI/Libraries/oUF/elements/elements.xml
@@ -1,6 +1,6 @@
-
+
diff --git a/ElvUI/Libraries/oUF_Plugins/oUF_AuraBars/oUF_AuraBars.lua b/ElvUI/Libraries/oUF_Plugins/oUF_AuraBars/oUF_AuraBars.lua
new file mode 100644
index 0000000..2ec4b0e
--- /dev/null
+++ b/ElvUI/Libraries/oUF_Plugins/oUF_AuraBars/oUF_AuraBars.lua
@@ -0,0 +1,391 @@
+local ns = oUF
+local oUF = ns.oUF
+assert(oUF, "oUF_AuraBars was unable to locate oUF install.")
+
+local format = string.format
+local floor, huge, min = math.floor, math.huge, math.min
+local tsort, getn = table.sort, table.getn
+local tremove = table.remove
+local random = math.random
+
+local CreateFrame = CreateFrame
+local UnitAura = UnitAura
+local UnitIsFriend = UnitIsFriend
+
+local DAY, HOUR, MINUTE = 86400, 3600, 60
+local function FormatTime(s)
+ if s < MINUTE then
+ return ("%.1fs"):format(s)
+ elseif s < HOUR then
+ return ("%dm %ds"):format(s/60%60, s%60)
+ elseif s < DAY then
+ return ("%dh %dm"):format(s/(60*60), s/60%60)
+ else
+ return ("%dd %dh"):format(s/DAY, (s / HOUR) - (floor(s/DAY) * 24))
+ end
+end
+
+local function UpdateTooltip(self)
+ GameTooltip:SetUnitAura(self.__unit, self:GetParent().aura.name, self:GetParent().aura.rank, self:GetParent().aura.filter)
+end
+
+local function OnEnter(self)
+ if(not self:IsVisible()) then return end
+ GameTooltip:SetOwner(self, "ANCHOR_BOTTOMRIGHT")
+ self:UpdateTooltip()
+end
+
+local function OnLeave(self)
+ GameTooltip:Hide()
+end
+
+local function SetAnchors(self)
+ local bars = self.bars
+
+ for index = 1, getn(bars) do
+ local frame = bars[index]
+ local anchor = frame.anchor
+ frame:Height(self.auraBarHeight or 20)
+ frame.statusBar.iconHolder:Size(frame:GetHeight())
+ frame:Width((self.auraBarWidth or self:GetWidth()) - (frame:GetHeight() + (self.gap or 0)))
+ frame:ClearAllPoints()
+ if self.down == true then
+ if self == anchor then -- Root frame so indent for icon
+ frame:SetPoint("TOPLEFT", anchor, "TOPLEFT", (frame:GetHeight() + (self.gap or 0) ), -1)
+ else
+ frame:SetPoint("TOPLEFT", anchor, "BOTTOMLEFT", 0, (-self.spacing or 0))
+ end
+ else
+ if self == anchor then -- Root frame so indent for icon
+ frame:SetPoint("BOTTOMLEFT", anchor, "BOTTOMLEFT", (frame:GetHeight() + (self.gap or 0)), 1)
+ else
+ frame:SetPoint("BOTTOMLEFT", anchor, "TOPLEFT", 0, (self.spacing or 0))
+ end
+ end
+ end
+end
+
+local function CreateAuraBar(oUF, anchor)
+ local auraBarParent = oUF.AuraBars
+
+ local frame = CreateFrame("Frame", nil, auraBarParent)
+ frame:Height(auraBarParent.auraBarHeight or 20)
+ frame:Width((auraBarParent.auraBarWidth or auraBarParent:GetWidth()) - (frame:GetHeight() + (auraBarParent.gap or 0)))
+ frame.anchor = anchor
+
+ -- the main bar
+ local statusBar = CreateFrame("StatusBar", nil, frame)
+ statusBar:SetStatusBarTexture(auraBarParent.auraBarTexture or [[Interface\TargetingFrame\UI-StatusBar]])
+ statusBar:SetAlpha(auraBarParent.fgalpha or 1)
+ statusBar:SetAllPoints(frame)
+
+ frame.statusBar = statusBar
+
+ if auraBarParent.down == true then
+ if auraBarParent == anchor then -- Root frame so indent for icon
+ frame:SetPoint("TOPLEFT", anchor, "TOPLEFT", (frame:GetHeight() + (auraBarParent.gap or 0) ), -1)
+ else
+ frame:SetPoint("TOPLEFT", anchor, "BOTTOMLEFT", 0, (-auraBarParent.spacing or 0))
+ end
+ else
+ if auraBarParent == anchor then -- Root frame so indent for icon
+ frame:SetPoint("BOTTOMLEFT", anchor, "BOTTOMLEFT", (frame:GetHeight() + (auraBarParent.gap or 0)), 1)
+ else
+ frame:SetPoint("BOTTOMLEFT", anchor, "TOPLEFT", 0, (auraBarParent.spacing or 0))
+ end
+ end
+
+ local spark = statusBar:CreateTexture(nil, "OVERLAY", nil);
+ spark:SetTexture([[Interface\CastingBar\UI-CastingBar-Spark]]);
+ spark:Width(12);
+ spark:SetBlendMode("ADD");
+ spark:SetPoint("CENTER", statusBar:GetStatusBarTexture(), "RIGHT")
+ statusBar.spark = spark
+
+ statusBar.iconHolder = CreateFrame("Button", nil, statusBar)
+ statusBar.iconHolder:SetHeight(frame:GetHeight())
+ statusBar.iconHolder:SetWidth(frame:GetHeight())
+ statusBar.iconHolder:SetPoint("BOTTOMRIGHT", frame, "BOTTOMLEFT", -auraBarParent.gap, 0)
+ statusBar.iconHolder.__unit = oUF.unit
+ statusBar.iconHolder:SetScript("OnEnter", OnEnter)
+ statusBar.iconHolder:SetScript("OnLeave", OnLeave)
+ statusBar.iconHolder.UpdateTooltip = UpdateTooltip
+
+ statusBar.icon = statusBar.iconHolder:CreateTexture(nil, "BACKGROUND")
+ statusBar.icon:SetTexCoord(.07, .93, .07, .93)
+ statusBar.icon:SetAllPoints()
+
+ statusBar.spelltime = statusBar:CreateFontString(nil, "ARTWORK")
+ if auraBarParent.spellTimeObject then
+ statusBar.spelltime:SetFontObject(auraBarParent.spellTimeObject)
+ else
+ statusBar.spelltime:SetFont(auraBarParent.spellTimeFont or [[Fonts\FRIZQT__.TTF]], auraBarParent.spellTimeSize or 10)
+ end
+ statusBar.spelltime:SetTextColor(1 ,1, 1)
+ statusBar.spelltime:SetJustifyH"RIGHT"
+ statusBar.spelltime:SetJustifyV"CENTER"
+ statusBar.spelltime:SetPoint"RIGHT"
+
+ statusBar.spellname = statusBar:CreateFontString(nil, "ARTWORK")
+ if auraBarParent.spellNameObject then
+ statusBar.spellname:SetFontObject(auraBarParent.spellNameObject)
+ else
+ statusBar.spellname:SetFont(auraBarParent.spellNameFont or [[Fonts\FRIZQT__.TTF]], auraBarParent.spellNameSize or 10)
+ end
+ statusBar.spellname:SetTextColor(1, 1, 1)
+ statusBar.spellname:SetJustifyH"LEFT"
+ statusBar.spellname:SetJustifyV"CENTER"
+ statusBar.spellname:SetPoint"LEFT"
+ statusBar.spellname:SetPoint("RIGHT", statusBar.spelltime, "LEFT")
+
+ if auraBarParent.PostCreateBar then
+ auraBarParent.PostCreateBar(frame)
+ end
+
+ return frame
+end
+
+local function UpdateBars(auraBars)
+ local bars = auraBars.bars
+ local timenow = GetTime()
+
+ for index = 1, #bars do
+ local frame = bars[index]
+ local bar = frame.statusBar
+ if not frame:IsVisible() then
+ break
+ end
+ if bar.aura.noTime then
+ bar.spelltime:SetText()
+ bar.spark:Hide()
+ else
+ local timeleft = bar.aura.expirationTime - timenow
+ bar:SetValue(timeleft)
+ bar.spelltime:SetText(FormatTime(timeleft))
+ if auraBars.spark == true then
+ if (auraBars.scaleTime and ((auraBars.scaleTime <= 0) or (auraBars.scaleTime > 0 and timeleft < auraBars.scaleTime))) then
+ bar.spark:Show()
+ else
+ bar.spark:Hide()
+ end
+ end
+ end
+ end
+end
+
+local function DefaultFilter(self, unit, name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate)
+ if unitCaster == "player" and not shouldConsolidate then
+ return true
+ end
+end
+
+local sort = function(a, b)
+ local compa, compb = a.noTime and huge or a.expirationTime, b.noTime and huge or b.expirationTime
+ return compa > compb
+end
+
+local function Update(self, event, unit)
+ if self.unit ~= unit then return end
+ local auraBars = self.AuraBars
+ local helpOrHarm
+ local isFriend = UnitIsFriend("player", unit) == 1 and true or false
+ local both = false
+
+ if auraBars.friendlyAuraType and auraBars.enemyAuraType then
+ if isFriend then
+ helpOrHarm = auraBars.friendlyAuraType
+ else
+ helpOrHarm = auraBars.enemyAuraType
+ end
+ else
+ helpOrHarm = isFriend and "HELPFUL" or "HARMFUL"
+ end
+
+ if helpOrHarm == "BOTH" then
+ both = true
+ helpOrHarm = "HELPFUL"
+ end
+
+ -- Create a table of auras to display
+ local auras = {}
+ local lastAuraIndex = 0
+ local counter = 0
+ if(auraBars.forceShow) then
+ for index = 1, auraBars.maxBars do
+ local spellID = 47540
+ local name, rank, icon = GetSpellInfo(spellID)
+ local count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate = 5, "Magic", 0, 0, "player", nil, nil
+ lastAuraIndex = lastAuraIndex + 1
+ auras[lastAuraIndex] = {}
+ auras[lastAuraIndex].spellID = spellID
+ auras[lastAuraIndex].name = name
+ auras[lastAuraIndex].rank = rank
+ auras[lastAuraIndex].icon = icon
+ auras[lastAuraIndex].count = count
+ auras[lastAuraIndex].debuffType = debuffType
+ auras[lastAuraIndex].duration = duration
+ auras[lastAuraIndex].expirationTime = expirationTime
+ auras[lastAuraIndex].unitCaster = unitCaster
+ auras[lastAuraIndex].isStealable = isStealable
+ auras[lastAuraIndex].noTime = (duration == 0 and expirationTime == 0)
+ auras[lastAuraIndex].filter = helpOrHarm
+ auras[lastAuraIndex].shouldConsolidate = shouldConsolidate
+ end
+ else
+ for index = 1, 40 do
+ local name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate, spellID
+
+ if not both then
+ name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate, spellID = UnitAura(unit, index, helpOrHarm)
+
+ if not name then break end
+ else
+ name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate, spellID = UnitAura(unit, index, "HELPFUL")
+
+ if not name then
+ name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate, spellID = UnitAura(unit, index, "HARMFUL")
+
+ if not name then break end
+ end
+ end
+
+ if (auraBars.filter or DefaultFilter)(self, unit, name, rank, icon, count, debuffType, duration, expirationTime, unitCaster, isStealable, shouldConsolidate, spellID) then
+ lastAuraIndex = lastAuraIndex + 1
+ auras[lastAuraIndex] = {}
+ auras[lastAuraIndex].spellID = spellID
+ auras[lastAuraIndex].name = name
+ auras[lastAuraIndex].rank = rank
+ auras[lastAuraIndex].icon = icon
+ auras[lastAuraIndex].count = count
+ auras[lastAuraIndex].debuffType = debuffType
+ auras[lastAuraIndex].duration = duration
+ auras[lastAuraIndex].expirationTime = expirationTime
+ auras[lastAuraIndex].unitCaster = unitCaster
+ auras[lastAuraIndex].isStealable = isStealable
+ auras[lastAuraIndex].noTime = (duration == 0 and expirationTime == 0)
+ auras[lastAuraIndex].filter = helpOrHarm
+ auras[lastAuraIndex].shouldConsolidate = shouldConsolidate
+ end
+ end
+ end
+
+ if(auraBars.sort and not auraBars.forceShow) then
+ tsort(auras, type(auraBars.sort) == "function" and auraBars.sort or sort)
+ end
+
+ for i=1, #auras do
+ if(i > auraBars.maxBars) then
+ tremove(auras, i)
+ else
+ lastAuraIndex = i
+ end
+ end
+
+ -- Show and configure bars for buffs/debuffs.
+ local bars = auraBars.bars
+ if lastAuraIndex == 0 then
+ self.AuraBars:Height(1)
+ end
+
+ for index = 1 , lastAuraIndex do
+ if (auraBars:GetWidth() == 0) then break; end
+ local aura = auras[index]
+ local frame = bars[index]
+
+ if not frame then
+ frame = CreateAuraBar(self, index == 1 and auraBars or bars[index - 1])
+ bars[index] = frame
+ end
+
+ if index == lastAuraIndex then
+ if self.AuraBars.down then
+ self.AuraBars:Height(self.AuraBars:GetTop() - frame:GetBottom())
+ elseif frame:GetTop() and self.AuraBars:GetBottom() then
+ self.AuraBars:Height(frame:GetTop() - self.AuraBars:GetBottom())
+ else
+ self.AuraBars:Height(20)
+ end
+ end
+
+ local bar = frame.statusBar
+ frame.index = index
+
+ -- Backup the details of the aura onto the bar, so the OnUpdate function can use it
+ bar.aura = aura
+
+ -- Configure
+ if bar.aura.noTime then
+ bar:SetMinMaxValues(0, 1)
+ bar:SetValue(1)
+ else
+ if auraBars.scaleTime and auraBars.scaleTime > 0 then
+ local maxvalue = min(auraBars.scaleTime, bar.aura.duration)
+ bar:SetMinMaxValues(0, auraBars.scaleTime)
+ bar:Width(
+ ( maxvalue / auraBars.scaleTime ) *
+ ( ( auraBars.auraBarWidth or auraBars:GetWidth() ) -
+ ( bar:GetHeight() + (auraBars.gap or 0) ) ) ) -- icon size + gap
+ else
+ bar:SetMinMaxValues(0, bar.aura.duration)
+ end
+ bar:SetValue(bar.aura.expirationTime - GetTime())
+ end
+
+ bar.icon:SetTexture(bar.aura.icon)
+
+ bar.spellname:SetText(bar.aura.count > 1 and format("%s [%d]", bar.aura.name, bar.aura.count) or bar.aura.name)
+ bar.spelltime:SetText(not bar.noTime and FormatTime(bar.aura.expirationTime-GetTime()))
+
+ -- Colour bars
+ local r, g, b = .2, .6, 1 -- Colour for buffs
+ if auraBars.buffColor then
+ r, g, b = unpack(auraBars.buffColor)
+ end
+
+ if helpOrHarm == "HARMFUL" then
+ local debuffType = bar.aura.debuffType and bar.aura.debuffType or "none"
+
+ r, g, b = DebuffTypeColor[debuffType].r, DebuffTypeColor[debuffType].g, DebuffTypeColor[debuffType].b
+ if auraBars.debuffColor then
+ r, g, b = unpack(auraBars.debuffColor)
+ else
+ if debuffType == "none" and auraBars.defaultDebuffColor then
+ r, g, b = unpack(auraBars.defaultDebuffColor)
+ end
+ end
+ end
+ bar:SetStatusBarColor(r, g, b)
+ frame:Show()
+ end
+
+ -- Hide unused bars.
+ for index = lastAuraIndex + 1, getn(bars) do
+ bars[index]:Hide()
+ end
+
+ if auraBars.PostUpdate then
+ auraBars:PostUpdate(event, unit)
+ end
+end
+
+local function Enable(self)
+ if self.AuraBars then
+ self:RegisterEvent("UNIT_AURA", Update)
+ self.AuraBars:Height(1)
+ self.AuraBars.bars = self.AuraBars.bars or {}
+ self.AuraBars.SetAnchors = SetAnchors
+ self.AuraBars:SetScript("OnUpdate", UpdateBars)
+ self.AuraBars.maxBars = self.AuraBars.maxBars or 40
+ return true
+ end
+end
+
+local function Disable(self)
+ local auraFrame = self.AuraBars
+ if auraFrame then
+ self:UnregisterEvent("UNIT_AURA", Update)
+ auraFrame:SetScript("OnUpdate", nil)
+ end
+end
+
+oUF:AddElement("AuraBars", Update, Enable, Disable)
diff --git a/ElvUI/Libraries/oUF_Plugins/oUF_Plugins.xml b/ElvUI/Libraries/oUF_Plugins/oUF_Plugins.xml
new file mode 100644
index 0000000..de8fb86
--- /dev/null
+++ b/ElvUI/Libraries/oUF_Plugins/oUF_Plugins.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/ElvUI/Modules/UnitFrames/Elements/AuraBars.lua b/ElvUI/Modules/UnitFrames/Elements/AuraBars.lua
new file mode 100644
index 0000000..202720c
--- /dev/null
+++ b/ElvUI/Modules/UnitFrames/Elements/AuraBars.lua
@@ -0,0 +1,287 @@
+local E, L, V, P, G = unpack(ElvUI) --Inport: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
+local UF = E:GetModule("UnitFrames")
+
+--Cache global variables
+--Lua functions
+local match = string.match
+local strsplit = strsplit
+local tostring = tostring
+local format = format
+local select = select
+local getn = table.getn
+--WoW API / Variables
+local CreateFrame = CreateFrame
+local IsShiftKeyDown = IsShiftKeyDown
+local IsAltKeyDown = IsAltKeyDown
+local IsControlKeyDown = IsControlKeyDown
+local UnitIsFriend = UnitIsFriend
+local UnitIsUnit = UnitIsUnit
+local UnitCanAttack = UnitCanAttack
+local RAID_CLASS_COLORS = RAID_CLASS_COLORS
+
+function UF:Construct_AuraBars()
+ local bar = self.statusBar
+
+ E:SetTemplate(self, "Default", nil, nil, UF.thinBorders, true)
+ local inset = UF.thinBorders and E.mult or nil
+ bar:SetInside(self, inset, inset)
+ UF["statusbars"][bar] = true
+ UF:Update_StatusBar(bar)
+
+ UF:Configure_FontString(bar.spelltime)
+ UF:Configure_FontString(bar.spellname)
+ UF:Update_FontString(bar.spelltime)
+ UF:Update_FontString(bar.spellname)
+
+ bar.spellname:ClearAllPoints()
+ bar.spellname:Point("LEFT", bar, "LEFT", 2, 0)
+ bar.spellname:Point("RIGHT", bar.spelltime, "LEFT", -4, 0)
+ bar.spellname:SetWordWrap(false)
+
+ bar.iconHolder:SetTemplate("Default", nil, nil, UF.thinBorders, true)
+ bar.icon:SetInside(bar.iconHolder, inset, inset)
+ bar.icon:SetDrawLayer("OVERLAY")
+
+ bar.bg = bar:CreateTexture(nil, "BORDER")
+ bar.bg:Hide()
+
+
+ bar.iconHolder:RegisterForClicks("RightButtonUp")
+ bar.iconHolder:SetScript("OnClick", function(self)
+ if E.db.unitframe.auraBlacklistModifier == "NONE" or not ((E.db.unitframe.auraBlacklistModifier == "SHIFT" and IsShiftKeyDown()) or (E.db.unitframe.auraBlacklistModifier == "ALT" and IsAltKeyDown()) or (E.db.unitframe.auraBlacklistModifier == "CTRL" and IsControlKeyDown())) then return; end
+ local auraName = self:GetParent().aura.name
+
+ if auraName then
+ E:Print(format(L["The spell '%s' has been added to the Blacklist unitframe aura filter."], auraName))
+ E.global["unitframe"]["aurafilters"]["Blacklist"]["spells"][auraName] = {
+ ["enable"] = true,
+ ["priority"] = 0,
+ }
+ UF:Update_AllFrames()
+ end
+ end)
+end
+
+function UF:Construct_AuraBarHeader(frame)
+ local auraBar = CreateFrame("Frame", nil, frame)
+ auraBar:SetFrameLevel(frame.RaisedElementParent:GetFrameLevel() + 10) --Make them appear above any text element
+ auraBar.PostCreateBar = UF.Construct_AuraBars
+ auraBar.gap = (-frame.BORDER + frame.SPACING*3)
+ auraBar.spacing = (-frame.BORDER + frame.SPACING*3)
+ auraBar.spark = true
+ auraBar.filter = UF.AuraBarFilter
+ auraBar.PostUpdate = UF.ColorizeAuraBars
+
+ return auraBar
+end
+
+function UF:Configure_AuraBars(frame)
+ if not frame.VARIABLES_SET then return end
+ local auraBars = frame.AuraBars
+ local db = frame.db
+ if db.aurabar.enable then
+ if not frame:IsElementEnabled("AuraBars") then
+ frame:EnableElement("AuraBars")
+ end
+ auraBars:Show()
+ auraBars.friendlyAuraType = db.aurabar.friendlyAuraType
+ auraBars.enemyAuraType = db.aurabar.enemyAuraType
+ auraBars.scaleTime = db.aurabar.uniformThreshold
+
+ local buffColor = self.db.colors.auraBarBuff
+ local debuffColor = self.db.colors.auraBarDebuff
+ local attachTo = frame
+
+ if(E:CheckClassColor(buffColor.r, buffColor.g, buffColor.b)) then
+ buffColor = E.myclass == "PRIEST" and E.PriestColors or (CUSTOM_CLASS_COLORS and CUSTOM_CLASS_COLORS[E.myclass] or RAID_CLASS_COLORS[E.myclass])
+ end
+
+ if(E:CheckClassColor(debuffColor.r, debuffColor.g, debuffColor.b)) then
+ debuffColor = E.myclass == "PRIEST" and E.PriestColors or (CUSTOM_CLASS_COLORS and CUSTOM_CLASS_COLORS[E.myclass] or RAID_CLASS_COLORS[E.myclass])
+ end
+
+ if db.aurabar.attachTo == "BUFFS" then
+ attachTo = frame.Buffs
+ elseif db.aurabar.attachTo == "DEBUFFS" then
+ attachTo = frame.Debuffs
+ elseif db.aurabar.attachTo == "PLAYER_AURABARS" and ElvUF_Player then
+ attachTo = ElvUF_Player.AuraBars
+ end
+
+ local anchorPoint, anchorTo = "BOTTOM", "TOP"
+ if db.aurabar.anchorPoint == "BELOW" then
+ anchorPoint, anchorTo = "TOP", "BOTTOM"
+ end
+
+ local yOffset
+ local spacing = (((db.aurabar.attachTo == "FRAME" and 3) or (db.aurabar.attachTo == "PLAYER_AURABARS" and 4) or 2) * frame.SPACING)
+ local border = (((db.aurabar.attachTo == "FRAME" or db.aurabar.attachTo == "PLAYER_AURABARS") and 2 or 1) * frame.BORDER)
+
+ if db.aurabar.anchorPoint == "BELOW" then
+ yOffset = -spacing + border - (not db.aurabar.yOffset and 0 or db.aurabar.yOffset)
+ else
+ yOffset = spacing - border + (not db.aurabar.yOffset and 0 or db.aurabar.yOffset)
+ end
+
+ local xOffset = (db.aurabar.attachTo == "FRAME" and frame.SPACING or 0)
+ local offsetLeft = xOffset + ((db.aurabar.attachTo == "FRAME" and ((anchorTo == "TOP" and frame.ORIENTATION ~= "LEFT") or (anchorTo == "BOTTOM" and frame.ORIENTATION == "LEFT"))) and frame.POWERBAR_OFFSET or 0)
+ local offsetRight = -xOffset - ((db.aurabar.attachTo == "FRAME" and ((anchorTo == "TOP" and frame.ORIENTATION ~= "RIGHT") or (anchorTo == "BOTTOM" and frame.ORIENTATION == "RIGHT"))) and frame.POWERBAR_OFFSET or 0)
+
+ auraBars.auraBarHeight = db.aurabar.height
+ auraBars:ClearAllPoints()
+ E:Point(auraBars, anchorPoint.."LEFT", attachTo, anchorTo.."LEFT", offsetLeft, yOffset)
+ E:Point(auraBars, anchorPoint.."RIGHT", attachTo, anchorTo.."RIGHT", offsetRight, yOffset)
+ auraBars.buffColor = {buffColor.r, buffColor.g, buffColor.b}
+ if UF.db.colors.auraBarByType then
+ auraBars.debuffColor = nil;
+ auraBars.defaultDebuffColor = {debuffColor.r, debuffColor.g, debuffColor.b}
+ else
+ auraBars.debuffColor = {debuffColor.r, debuffColor.g, debuffColor.b}
+ auraBars.defaultDebuffColor = nil;
+ end
+ auraBars.down = db.aurabar.anchorPoint == "BELOW"
+
+ if db.aurabar.sort == "TIME_REMAINING" then
+ auraBars.sort = true --default function
+ elseif db.aurabar.sort == "TIME_REMAINING_REVERSE" then
+ auraBars.sort = self.SortAuraBarReverse
+ elseif db.aurabar.sort == "TIME_DURATION" then
+ auraBars.sort = self.SortAuraBarDuration
+ elseif db.aurabar.sort == "TIME_DURATION_REVERSE" then
+ auraBars.sort = self.SortAuraBarDurationReverse
+ elseif db.aurabar.sort == "NAME" then
+ auraBars.sort = self.SortAuraBarName
+ else
+ auraBars.sort = nil
+ end
+
+ auraBars.maxBars = db.aurabar.maxBars
+ auraBars.forceShow = frame.forceShowAuras
+ -- auraBars:SetAnchors()
+ else
+ if frame:IsElementEnabled("AuraBars") then
+ frame:DisableElement("AuraBars")
+ auraBars:Hide()
+ end
+ end
+end
+
+local huge = math.huge
+function UF.SortAuraBarReverse(a, b)
+ local compa, compb = a.noTime and huge or a.expirationTime, b.noTime and huge or b.expirationTime
+ return compa < compb
+end
+
+function UF.SortAuraBarDuration(a, b)
+ local compa, compb = a.noTime and huge or a.duration, b.noTime and huge or b.duration
+ return compa > compb
+end
+
+function UF.SortAuraBarDurationReverse(a, b)
+ local compa, compb = a.noTime and huge or a.duration, b.noTime and huge or b.duration
+ return compa < compb
+end
+
+function UF.SortAuraBarName(a, b)
+ return a.name > b.name
+end
+
+function UF:CheckFilter(name, caster, spellID, isFriend, isPlayer, isUnit, allowDuration, noDuration, canDispell, ...)
+ -- local friendCheck, filterName, filter, filterType, spellList, spell
+ -- for i=1, select("#", ...) do
+ -- filterName = select(i, ...)
+ -- friendCheck = (isFriend and match(filterName, "^Friendly:([^,]*)")) or (not isFriend and match(filterName, "^Enemy:([^,]*)")) or nil
+ -- if friendCheck ~= false then
+ -- if friendCheck ~= nil and (G.unitframe.specialFilters[friendCheck] or E.global.unitframe.aurafilters[friendCheck]) then
+ -- filterName = friendCheck -- this is for our filters to handle Friendly and Enemy
+ -- end
+ -- filter = E.global.unitframe.aurafilters[filterName]
+ -- if filter then
+ -- filterType = filter.type
+ -- spellList = filter.spells
+ -- spell = spellList and (spellList[spellID] or spellList[name])
+
+ -- if filterType and (filterType == "Whitelist") and (spell and spell.enable) and allowDuration then
+ -- return true, spell.priority -- this is the only difference from auarbars code
+ -- elseif filterType and (filterType == "Blacklist") and (spell and spell.enable) then
+ -- return false
+ -- end
+ -- elseif filterName == "Personal" and isPlayer and allowDuration then
+ -- return true
+ -- elseif filterName == "nonPersonal" and (not isPlayer) and allowDuration then
+ -- return true
+ -- elseif filterName == "CastByUnit" and (caster and isUnit) and allowDuration then
+ -- return true
+ -- elseif filterName == "notCastByUnit" and (caster and not isUnit) and allowDuration then
+ -- return true
+ -- elseif filterName == "Dispellable" and canDispell and allowDuration then
+ -- return true
+ -- elseif filterName == "blockNoDuration" and noDuration then
+ -- return false
+ -- elseif filterName == "blockNonPersonal" and (not isPlayer) then
+ -- return false
+ -- end
+ -- end
+ -- end
+end
+
+function UF:AuraBarFilter(unit, name, _, _, _, debuffType, duration, _, unitCaster, isStealable, _, spellID)
+ if not self.db then return; end
+ local db = self.db.aurabar
+
+ if not name then return nil end
+ local filterCheck, isUnit, isFriend, isPlayer, canDispell, allowDuration, noDuration
+
+ if db.priority ~= "" then
+ noDuration = (not duration or duration == 0)
+ isFriend = unit and UnitIsFriend("player", unit) and not UnitCanAttack("player", unit)
+ isPlayer = (unitCaster == "player" or unitCaster == "vehicle")
+ isUnit = unit and unitCaster and UnitIsUnit(unit, unitCaster)
+ canDispell = (self.type == "Buffs" and isStealable) or (self.type == "Debuffs" and debuffType and E:IsDispellableByMe(debuffType))
+ allowDuration = noDuration or (duration and (duration > 0) and (db.maxDuration == 0 or duration <= db.maxDuration) and (db.minDuration == 0 or duration >= db.minDuration))
+ filterCheck = UF:CheckFilter(name, unitCaster, spellID, isFriend, isPlayer, isUnit, allowDuration, noDuration, canDispell, strsplit(",", db.priority))
+ else
+ filterCheck = true -- Allow all auras to be shown when the filter list is empty
+ end
+
+ return filterCheck
+end
+
+function UF:ColorizeAuraBars()
+ local bars = self.bars
+ for index = 1, getn(bars) do
+ local frame = bars[index]
+ if not frame:IsVisible() then break end
+ local spellName = frame.statusBar.aura.name
+ local spellID = frame.statusBar.aura.spellID
+ local colors = E.global.unitframe.AuraBarColors[spellID] or E.global.unitframe.AuraBarColors[tostring(spellID)] or E.global.unitframe.AuraBarColors[spellName]
+
+ if E.db.unitframe.colors.auraBarTurtle and (E.global.unitframe.aurafilters.TurtleBuffs.spells[spellID] or E.global.unitframe.aurafilters.TurtleBuffs.spells[spellName]) and not colors then
+ colors = E.db.unitframe.colors.auraBarTurtleColor
+ end
+
+ if colors then
+ frame.statusBar:SetStatusBarColor(colors.r, colors.g, colors.b)
+ frame.statusBar.bg:SetTexture(colors.r * 0.25, colors.g * 0.25, colors.b * 0.25)
+ else
+ local r, g, b = frame.statusBar:GetStatusBarColor()
+ frame.statusBar.bg:SetTexture(r * 0.25, g * 0.25, b * 0.25)
+ end
+
+ if UF.db.colors.transparentAurabars and not frame.statusBar.isTransparent then
+ UF:ToggleTransparentStatusBar(true, frame.statusBar, frame.statusBar.bg, nil, true)
+ elseif(frame.statusBar.isTransparent and not UF.db.colors.transparentAurabars) then
+ UF:ToggleTransparentStatusBar(false, frame.statusBar, frame.statusBar.bg, nil, true)
+ end
+
+ if(UF.db.colors.transparentAurabars) then
+ local _, _, _, alpha = frame:GetBackdropColor()
+ if colors then
+ frame:SetBackdropColor(colors.r * 0.58, colors.g * 0.58, colors.b * 0.58, alpha)
+ else
+ local r, g, b = frame.statusBar:GetStatusBarColor()
+ frame:SetBackdropColor(r * 0.58, g * 0.58, b * 0.58, alpha)
+ end
+ end
+ end
+end
\ No newline at end of file
diff --git a/ElvUI/Modules/UnitFrames/Elements/Auras.lua b/ElvUI/Modules/UnitFrames/Elements/Auras.lua
index b66dc7e..4c514fa 100644
--- a/ElvUI/Modules/UnitFrames/Elements/Auras.lua
+++ b/ElvUI/Modules/UnitFrames/Elements/Auras.lua
@@ -29,7 +29,7 @@ function UF:Construct_Buffs(frame)
buffs:SetFrameLevel(frame.RaisedElementParent:GetFrameLevel() + 10) --Make them appear above any text element
buffs.type = "buffs"
--Set initial width to prevent division by zero. This value doesn't matter, as it will be updated later
- buffs:Width(100)
+ E:Width(buffs, 100)
return buffs
end
@@ -44,7 +44,7 @@ function UF:Construct_Debuffs(frame)
debuffs.type = "debuffs"
debuffs:SetFrameLevel(frame.RaisedElementParent:GetFrameLevel() + 10) --Make them appear above any text element
--Set initial width to prevent division by zero. This value doesn't matter, as it will be updated later
- debuffs:Width(100)
+ E:Width(debuffs, 100)
return debuffs
end
@@ -77,10 +77,10 @@ function UF:Construct_AuraIcon(button)
button:RegisterForClicks("RightButtonUp")
button:SetScript("OnClick", function(self)
- if E.db.unitframe.auraBlacklistModifier == "NONE"
- or not ((E.db.unitframe.auraBlacklistModifier == "SHIFT" and IsShiftKeyDown())
- or (E.db.unitframe.auraBlacklistModifier == "ALT" and IsAltKeyDown())
- or (E.db.unitframe.auraBlacklistModifier == "CTRL" and IsControlKeyDown())) then return end
+ if E.db.unitframe.auraBlacklistModifier == "NONE"
+ or not ((E.db.unitframe.auraBlacklistModifier == "SHIFT" and IsShiftKeyDown())
+ or (E.db.unitframe.auraBlacklistModifier == "ALT" and IsAltKeyDown())
+ or (E.db.unitframe.auraBlacklistModifier == "CTRL" and IsControlKeyDown())) then return end
local auraName = self.name
@@ -119,7 +119,6 @@ function UF:Configure_Auras(frame, auraType)
if not frame.VARIABLES_SET then return end
local db = frame.db
- print(format("DEBUG: UF:Configure_Auras(%s, %s)", frame:GetName(), auraType))
local auras = frame[auraType]
auraType = lower(auraType)
local rows = db[auraType].numrows
@@ -132,7 +131,7 @@ function UF:Configure_Auras(frame, auraType)
totalWidth = totalWidth - powerOffset
end
end
- auras:Width(totalWidth)
+ E:Width(auras, totalWidth)
auras.forceShow = frame.forceShowAuras
auras.num = db[auraType].perrow * rows
@@ -143,8 +142,8 @@ function UF:Configure_Auras(frame, auraType)
end
local attachTo = self:GetAuraAnchorFrame(frame, db[auraType].attachTo, db.debuffs.attachTo == "BUFFS" and db.buffs.attachTo == "DEBUFFS")
- --Use frame.SPACING override since it may be different from E.Spacing due to forced thin borders
- local x, y = E:GetXYOffset(db[auraType].anchorPoint, frame.SPACING)
+ --Use frame.SPACING override since it may be different from E.Spacing due to forced thin borders
+ local x, y = E:GetXYOffset(db[auraType].anchorPoint, frame.SPACING)
if db[auraType].attachTo == "FRAME" then
y = 0
@@ -165,8 +164,8 @@ function UF:Configure_Auras(frame, auraType)
end
auras:ClearAllPoints()
- auras:Point(E.InversePoints[db[auraType].anchorPoint], attachTo, db[auraType].anchorPoint, x + db[auraType].xOffset, y + db[auraType].yOffset)
- auras:Height(auras.size * rows)
+ E:Point(auras, E.InversePoints[db[auraType].anchorPoint], attachTo, db[auraType].anchorPoint, x + db[auraType].xOffset, y + db[auraType].yOffset)
+ E:Height(auras, auras.size * rows)
auras["growth-y"] = find(db[auraType].anchorPoint, "TOP") and "UP" or "DOWN"
auras["growth-x"] = db[auraType].anchorPoint == "LEFT" and "LEFT" or db[auraType].anchorPoint == "RIGHT" and "RIGHT" or (find(db[auraType].anchorPoint, "LEFT") and "RIGHT" or "LEFT")
auras.initialAnchor = E.InversePoints[db[auraType].anchorPoint]
@@ -304,7 +303,7 @@ function UF:SortAuras()
--Sorting by Index is Default
if self.db.sortMethod == "TIME_REMAINING" then
tsort(self, SortAurasByTime)
- elseif self.db.sortMethod == "NAME" then
+ elseif self.db.sortMethod == "NAME" then
tsort(self, SortAurasByName)
elseif self.db.sortMethod == "DURATION" then
tsort(self, SortAurasByDuration)
@@ -378,7 +377,7 @@ function UF:PostUpdateAura(unit, button)
button.icon:SetDesaturated((unit and not find(unit, "arena%d")) and true or false)
else
local color = (button.dtype and DebuffTypeColor[button.dtype]) or DebuffTypeColor.none
- button:SetBackdropBorderColor(color.r * 0.6, color.g * 0.6, color.b * 0.6)
+ button:SetBackdropBorderColor(color.r * 0.6, color.g * 0.6, color.b * 0.6)
button.icon:SetDesaturated(false)
end
else
diff --git a/ElvUI/Modules/UnitFrames/Elements/Load_Elements.xml b/ElvUI/Modules/UnitFrames/Elements/Load_Elements.xml
index adc58a4..d67a736 100644
--- a/ElvUI/Modules/UnitFrames/Elements/Load_Elements.xml
+++ b/ElvUI/Modules/UnitFrames/Elements/Load_Elements.xml
@@ -1,4 +1,5 @@
+
diff --git a/ElvUI/Modules/UnitFrames/Units/Load_Units.xml b/ElvUI/Modules/UnitFrames/Units/Load_Units.xml
index ba62950..b5abfb3 100644
--- a/ElvUI/Modules/UnitFrames/Units/Load_Units.xml
+++ b/ElvUI/Modules/UnitFrames/Units/Load_Units.xml
@@ -2,9 +2,4 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/ElvUI/Modules/UnitFrames/Units/Player.lua b/ElvUI/Modules/UnitFrames/Units/Player.lua
index 71d058d..8bd9e2f 100644
--- a/ElvUI/Modules/UnitFrames/Units/Player.lua
+++ b/ElvUI/Modules/UnitFrames/Units/Player.lua
@@ -22,9 +22,13 @@ function UF:Construct_PlayerFrame(frame)
frame.Portrait3D = self:Construct_Portrait(frame, "model")
frame.Portrait2D = self:Construct_Portrait(frame, "texture")
+ frame.Buffs = self:Construct_Buffs(frame)
+ frame.Debuffs = self:Construct_Debuffs(frame)
+ -- frame.Castbar = self:Construct_Castbar(frame, L["Player Castbar"])
frame.RaidTargetIndicator = UF:Construct_RaidIcon(frame)
frame.RestingIndicator = self:Construct_RestingIndicator(frame)
frame.CombatIndicator = self:Construct_CombatIndicator(frame)
+ frame.AuraBars = self:Construct_AuraBarHeader(frame)
frame.InfoPanel = self:Construct_InfoPanel(frame)
frame:SetPoint("BOTTOMLEFT", E.UIParent, "BOTTOM", -413, 68)
diff --git a/ElvUI/Modules/UnitFrames/Units/Target.lua b/ElvUI/Modules/UnitFrames/Units/Target.lua
index ce6baf7..e721df5 100644
--- a/ElvUI/Modules/UnitFrames/Units/Target.lua
+++ b/ElvUI/Modules/UnitFrames/Units/Target.lua
@@ -20,8 +20,11 @@ function UF:Construct_TargetFrame(frame)
frame.Portrait3D = self:Construct_Portrait(frame, "model")
frame.Portrait2D = self:Construct_Portrait(frame, "texture")
+ frame.Buffs = self:Construct_Buffs(frame)
+ frame.Debuffs = self:Construct_Debuffs(frame)
frame.RaidTargetIndicator = UF:Construct_RaidIcon(frame)
frame.InfoPanel = self:Construct_InfoPanel(frame)
+ frame.AuraBars = self:Construct_AuraBarHeader(frame)
frame:SetPoint("BOTTOMRIGHT", E.UIParent, "BOTTOM", 413, 68)
E:CreateMover(frame, frame:GetName().."Mover", L["Target Frame"], nil, nil, nil, "ALL,SOLO")