diff --git a/XanDebuffTimers.lua b/XanDebuffTimers.lua
index b3adbae..43c2480 100644
--- a/XanDebuffTimers.lua
+++ b/XanDebuffTimers.lua
@@ -1,4 +1,4 @@
---Inspired by TextTimers
+--Inspired by TextTimers, Please give credit to Sagewind where possible
local timers = {}
local timersFocus = {}
@@ -6,6 +6,7 @@ local MAX_TIMERS = 15
local ICON_SIZE = 20
local BAR_ADJUST = 25
local BAR_TEXT = "llllllllllllllllllllllllllllllllllllllll"
+local band = bit.band
local targetGUID = 0
local focusGUID = 0
@@ -23,7 +24,8 @@ function f:PLAYER_LOGIN()
if not XDT_DB then XDT_DB = {} end
if XDT_DB.scale == nil then XDT_DB.scale = 1 end
- if XDT_DB.grow == nil then XDT_DB.grow = true end
+ if XDT_DB.grow == nil then XDT_DB.grow = false end
+ if XDT_DB.sort == nil then XDT_DB.sort = false end
--create our anchors
f:CreateAnchor("XDT_Anchor", UIParent)
@@ -35,14 +37,13 @@ function f:PLAYER_LOGIN()
timersFocus[i] = f:CreateDebuffTimers()
end
- --do our growth process for the debuff bars (SETPOINT)
- f:ProcessGrowth()
+ f:UnregisterEvent("PLAYER_LOGIN")
+ f.PLAYER_LOGIN = nil
f:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
f:RegisterEvent("PLAYER_TARGET_CHANGED")
f:RegisterEvent("PLAYER_FOCUS_CHANGED")
- f:RegisterEvent("UNIT_AURA")
-
+
SLASH_XANDEBUFFTIMERS1 = "/xandebufftimers"
SLASH_XANDEBUFFTIMERS2 = "/xdt"
SLASH_XANDEBUFFTIMERS3 = "/xandt"
@@ -81,7 +82,15 @@ function f:PLAYER_LOGIN()
XDT_DB.grow = true
DEFAULT_CHAT_FRAME:AddMessage("XanDebuffTimers: Bars will now grow [|cFF99CC33DOWN|r]")
end
- f:ProcessGrowth()
+ return true
+ elseif c and c:lower() == "sort" then
+ if XDT_DB.sort then
+ XDT_DB.sort = false
+ DEFAULT_CHAT_FRAME:AddMessage("XanDebuffTimers: Bars sort [|cFF99CC33DESCENDING|r]")
+ else
+ XDT_DB.sort = true
+ DEFAULT_CHAT_FRAME:AddMessage("XanDebuffTimers: Bars sort [|cFF99CC33ASCENDING|r]")
+ end
return true
end
end
@@ -90,22 +99,11 @@ function f:PLAYER_LOGIN()
DEFAULT_CHAT_FRAME:AddMessage("/xdt anchor - toggles a movable anchor")
DEFAULT_CHAT_FRAME:AddMessage("/xdt scale # - sets the scale size of the bars")
DEFAULT_CHAT_FRAME:AddMessage("/xdt grow - changes the direction in which the bars grow (UP/DOWN)")
+ DEFAULT_CHAT_FRAME:AddMessage("/xdt sort - changes the sorting of the bars. (ASCENDING/DESCENDING)")
end
local ver = tonumber(GetAddOnMetadata("XanDebuffTimers","Version")) or 'Unknown'
DEFAULT_CHAT_FRAME:AddMessage("|cFF99CC33XanDebuffTimers|r [v|cFFDF2B2B"..ver.."|r] loaded: /xdt")
-
- f:UnregisterEvent("PLAYER_LOGIN")
- f.PLAYER_LOGIN = nil
-end
-
-function f:UNIT_AURA(event, unit)
- if not unit then return end
- if unit == "target" and UnitGUID(unit) and UnitGUID(unit) == targetGUID then
- f:ProcessDebuffs("target", timers)
- elseif unit == "focus" and UnitGUID(unit) and UnitGUID(unit) == focusGUID then
- f:ProcessDebuffs("focus", timersFocus)
- end
end
function f:PLAYER_TARGET_CHANGED()
@@ -142,7 +140,16 @@ function f:COMBAT_LOG_EVENT_UNFILTERED(event, timestamp, eventType, srcGUID, src
f:ClearDebuffs(timersFocus)
focusGUID = 0
end
+
+ elseif eventType == "SPELL_AURA_APPLIED" or eventType == "SPELL_AURA_REMOVED" or eventType == "SPELL_AURA_REFRESH" and band(srcFlags, COMBATLOG_OBJECT_AFFILIATION_MINE) ~= 0 then
+ --process the spells based on GUID
+ if dstGUID == targetGUID then
+ f:ProcessDebuffs("target", timers)
+ elseif dstGUID == focusGUID then
+ f:ProcessDebuffs("focus", timersFocus)
+ end
end
+
end
----------------------
@@ -226,6 +233,7 @@ local TimerOnUpdate = function(self, time)
local beforeEnd = self.endTime - GetTime()
local barLength = ceil( string.len(BAR_TEXT) * (beforeEnd / self.durationTime) )
+ if barLength > string.len(BAR_TEXT) then barLength = string.len(BAR_TEXT) end
if barLength <= 0 then
self.active = false
@@ -236,7 +244,7 @@ local TimerOnUpdate = function(self, time)
self.tmpBL = barLength
self.Bar:SetText( string.sub(BAR_TEXT, 1, barLength) )
- self.Bar:SetTextColor(f:getBarColor(self.durationTime, beforeEnd, false))
+ self.Bar:SetTextColor(f:getBarColor(self.durationTime, beforeEnd))
if self.stacks > 0 then
self.stacktext:SetText(self.stacks)
else
@@ -279,7 +287,7 @@ function f:CreateDebuffTimers()
Frm.timetext:SetPoint("RIGHT", Frm.icon, "LEFT" , -5, 0)
Frm.Bar = Frm:CreateFontString(nil, "GameFontNormal")
- Frm.Bar:SetFont(STANDARD_TEXT_FONT, 14, "OUTLINE")
+ Frm.Bar:SetFont(STANDARD_TEXT_FONT, 14, "OUTLINE, MONOCHROME")
Frm.Bar:SetText(BAR_TEXT)
Frm.Bar:SetPoint("LEFT", Frm.icon, "RIGHT", 1, 0)
@@ -291,37 +299,16 @@ function f:CreateDebuffTimers()
end
-function f:ProcessGrowth()
- local adj = 0
- for i=1,MAX_TIMERS do
- if XDT_DB.grow then
- timers[i]:ClearAllPoints()
- timers[i]:SetPoint("TOPLEFT", "XDT_Anchor", "BOTTOMRIGHT", 0, adj)
- --FOCUS
- timersFocus[i]:ClearAllPoints()
- timersFocus[i]:SetPoint("TOPLEFT", "XDT_FocusAnchor", "BOTTOMRIGHT", 0, adj)
- else
- timers[i]:ClearAllPoints()
- timers[i]:SetPoint("BOTTOMLEFT", "XDT_Anchor", "TOPRIGHT", 0, (adj * -1))
- --FOCUS
- timersFocus[i]:ClearAllPoints()
- timersFocus[i]:SetPoint("BOTTOMLEFT", "XDT_FocusAnchor", "TOPRIGHT", 0, (adj * -1))
- end
- adj = adj - BAR_ADJUST
- end
-end
----------------------
-- Debuff Functions --
----------------------
function f:ProcessDebuffs(sT, sdTimer)
- if f.selfProcessingBuffs then return end
- f.selfProcessingBuffs = true
-
--only process for as many timers as we are using
local countBuffs = 0
for i=1, MAX_TIMERS do
- local name, _, icon, count, _, duration, expTime, unitCaster, _, _, spellId = UnitAura(sT, i, 'HARMFUL|PLAYER')
+ local name, _, icon, count, _, duration, expTime, unitCaster, _, _, spellId = UnitAura(sT, i, 'HARMFUL|PLAYER')
+ --UnitIsUnit is used JUST IN CASE (you never know lol)
if name and unitCaster and UnitIsUnit(unitCaster, "player") then
sdTimer[i].id = sT
sdTimer[i].spellName = name
@@ -333,6 +320,7 @@ function f:ProcessDebuffs(sT, sdTimer)
sdTimer[i].endTime = expTime
sdTimer[i].stacks = count or 0
local tmpBL = ceil( string.len(BAR_TEXT) * ( (expTime - GetTime()) / duration ) )
+ if tmpBL > string.len(BAR_TEXT) then tmpBL = string.len(BAR_TEXT) end
sdTimer[i].tmpBL = tmpBL
sdTimer[i].active = true
if not sdTimer[i]:IsVisible() then sdTimer[i]:Show() end
@@ -342,9 +330,6 @@ function f:ProcessDebuffs(sT, sdTimer)
if sdTimer[i]:IsVisible() then sdTimer[i]:Hide() end
end
end
-
- f.selfProcessingBuffs = nil
-
if countBuffs > 0 then
f:ArrangeDebuffs(false, sT)
end
@@ -360,8 +345,6 @@ function f:ClearDebuffs(sdTimer)
end
function f:ArrangeDebuffs(throttle, id)
- if f.selfProcessingBuffs then return end
-
--to prevent spam and reduce CPU use
if throttle then
if not f.ADT then f.ADT = GetTime() end
@@ -395,9 +378,20 @@ function f:ArrangeDebuffs(throttle, id)
end
--sort by the size of the progressbar... duh
- table.sort(active, function(a,b) return (a.tmpBL > b.tmpBL) end)
+ if XDT_DB.grow then
+ if XDT_DB.sort then
+ table.sort(active, function(a,b) return (a.tmpBL < b.tmpBL) end)
+ else
+ table.sort(active, function(a,b) return (a.tmpBL > b.tmpBL) end)
+ end
+ else
+ if XDT_DB.sort then
+ table.sort(active, function(a,b) return (a.tmpBL > b.tmpBL) end)
+ else
+ table.sort(active, function(a,b) return (a.tmpBL < b.tmpBL) end)
+ end
+ end
-
--rearrange order
for i=1, #active do
if XDT_DB.grow then
@@ -426,8 +420,8 @@ function f:SaveLayout(frame)
XDT_DB[frame] = {
["point"] = "CENTER",
["relativePoint"] = "CENTER",
- ["xOfs"] = 0,
- ["yOfs"] = 0,
+ ["PosX"] = 0,
+ ["PosY"] = 0,
}
opt = XDT_DB[frame];
end
@@ -436,9 +430,7 @@ function f:SaveLayout(frame)
local scale = f:GetEffectiveScale();
opt.PosX = f:GetLeft() * scale;
opt.PosY = f:GetTop() * scale;
- --opt.Width = f:GetWidth();
- --opt.Height = f:GetHeight();
-
+
end
function f:RestoreLayout(frame)
@@ -452,8 +444,8 @@ function f:RestoreLayout(frame)
XDT_DB[frame] = {
["point"] = "CENTER",
["relativePoint"] = "CENTER",
- ["xOfs"] = 0,
- ["yOfs"] = 0,
+ ["PosX"] = 0,
+ ["PosY"] = 0,
}
opt = XDT_DB[frame];
end
@@ -462,11 +454,11 @@ function f:RestoreLayout(frame)
local y = opt.PosY;
local s = f:GetEffectiveScale();
- if not x or not y then
+ if not x or not y then
f:ClearAllPoints();
f:SetPoint("CENTER", UIParent, "CENTER", 0, 0);
return
- end
+ end
--calculate the scale
x,y = x/s,y/s;
@@ -477,20 +469,14 @@ function f:RestoreLayout(frame)
end
-function f:getBarColor(dur, expR, reverse)
+function f:getBarColor(dur, expR)
local r
local g = 1
local cur = 2 * expR/dur
if cur > 1 then
- r = 2 - cur
- else
- r = 1
- g = cur
- end
- if reverse then
- return g, r, 0
+ return 2 - cur, 1, 0
else
- return r, g, 0
+ return 1, cur, 0
end
end
diff --git a/XanDebuffTimers.toc b/XanDebuffTimers.toc
index a7f1181..d20e72b 100644
--- a/XanDebuffTimers.toc
+++ b/XanDebuffTimers.toc
@@ -2,7 +2,7 @@
## Title: XanDebuffTimers
## Notes: A small text based progress bar system for target debuffs.
## Author: Xanthos
-## Version: 1.6
+## Version: 1.5
## SavedVariablesPerCharacter: XDT_DB
XanDebuffTimers.lua