Quantcast

-Bars are now created dynamically when needed.

Xruptor [01-19-11 - 16:15]
-Bars are now created dynamically when needed.
-Changed the way how buffs/debuffs are processed.
-Only active buffs/debuffs bars are now processed rather then MAX_TIMERS amount.
Filename
XanBuffTimers.lua
diff --git a/XanBuffTimers.lua b/XanBuffTimers.lua
index c6df6f9..925b993 100644
--- a/XanBuffTimers.lua
+++ b/XanBuffTimers.lua
@@ -11,6 +11,8 @@ local targetGUID = 0
 local focusGUID = 0
 local UnitAura = UnitAura
 local UnitIsUnit = UnitIsUnit
+local UnitGUID = UnitGUID
+local UnitName = UnitName

 local pointT = {
 	["target"] = "XBT_Anchor",
@@ -36,12 +38,6 @@ function f:PLAYER_LOGIN()
 	f:CreateAnchor("XBT_Anchor", UIParent, "xanBuffTimers: Target Anchor")
 	f:CreateAnchor("XBT_FocusAnchor", UIParent, "xanBuffTimers: Focus Anchor")

-	--create our timers
-	for i=1,MAX_TIMERS do
-		timers[i] = f:CreateBuffTimers()
-		timersFocus[i] = f:CreateBuffTimers()
-	end
-
 	f:UnregisterEvent("PLAYER_LOGIN")
 	f.PLAYER_LOGIN = nil

@@ -71,8 +67,12 @@ function f:PLAYER_LOGIN()
 					if scalenum and scalenum ~= "" and tonumber(scalenum) then
 						XBT_DB.scale = tonumber(scalenum)
 						for i=1, MAX_TIMERS do
-							timers[i]:SetScale(tonumber(scalenum))
-							timersFocus[i]:SetScale(tonumber(scalenum))
+							if timers[i] then
+								timers[i]:SetScale(tonumber(scalenum))
+							end
+							if timersFocus[i] then
+								timersFocus[i]:SetScale(tonumber(scalenum))
+							end
 						end
 						DEFAULT_CHAT_FRAME:AddMessage("xanBuffTimers: Scale has been set to ["..tonumber(scalenum).."]")
 						return true
@@ -350,13 +350,13 @@ end

 function f:ProcessBuffs(sT, sdTimer)
 	--only process for as many timers as we are using
-	local countBuffs = 0
+	local slotNum = 0

 	for i=1, MAX_TIMERS do
-
 		local name, _, icon, count, _, duration, expTime, unitCaster, _, _, spellId = UnitAura(sT, i, 'HELPFUL|PLAYER')
-		local passChk = false
+		if not name then break end

+		local passChk = false
 		--only allow non-cancel auras if the user allowed it
 		if XBT_DB.auras then
 			--auras are on so basically were allowing everything
@@ -368,16 +368,19 @@ function f:ProcessBuffs(sT, sdTimer)

 		--UnitIsUnit is used JUST IN CASE (you never know lol)
 		if passChk and name and unitCaster and UnitIsUnit(unitCaster, "player") then
+			--get the next timer slot we can use
+			slotNum = slotNum + 1
+			if not sdTimer[slotNum] then sdTimer[slotNum] = f:CreateBuffTimers() end --create the timer if it doesn't exist
 			if not duration or duration <= 0 then expTime = 0 end --just in case for non-cancel auras
-			sdTimer[i].id = sT
-			sdTimer[i].spellName = name
-			sdTimer[i].spellId = spellId
-			sdTimer[i].iconTex = icon
-			sdTimer[i].icon:SetTexture(icon)
-			sdTimer[i].startTime = (expTime - duration) or 0
-			sdTimer[i].durationTime = duration or 0
-			sdTimer[i].endTime = expTime or 0
-			sdTimer[i].stacks = count or 0
+			sdTimer[slotNum].id = sT
+			sdTimer[slotNum].spellName = name
+			sdTimer[slotNum].spellId = spellId
+			sdTimer[slotNum].iconTex = icon
+			sdTimer[slotNum].icon:SetTexture(icon)
+			sdTimer[slotNum].startTime = (expTime - duration) or 0
+			sdTimer[slotNum].durationTime = duration or 0
+			sdTimer[slotNum].endTime = expTime or 0
+			sdTimer[slotNum].stacks = count or 0
 				--this has to check for duration=0 because we cannot divide by zero
 				local tmpBL
 				if duration > 0 then
@@ -386,16 +389,19 @@ function f:ProcessBuffs(sT, sdTimer)
 					tmpBL = string.len(BAR_TEXT)
 				end
 				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
-			countBuffs = countBuffs + 1
-		else
+			sdTimer[slotNum].tmpBL = tmpBL
+			sdTimer[slotNum].active = true
+			if not sdTimer[slotNum]:IsVisible() then sdTimer[slotNum]:Show() end
+		end
+	end
+	--clear everything else
+	for i=(slotNum+1), #sdTimer do
+		if sdTimer[i] then
 			sdTimer[i].active = false
 			if sdTimer[i]:IsVisible() then sdTimer[i]:Hide() end
 		end
 	end
-	if countBuffs > 0 then
+	if slotNum > 0 then
 		f:ArrangeBuffs(false, sT)
 	end
 end
@@ -403,7 +409,7 @@ end
 function f:ClearBuffs(sdTimer)
 	local adj = 0

-	for i=1, MAX_TIMERS do
+	for i=1, #sdTimer do
 		if sdTimer[i].active then
 			sdTimer[i].active = false
 		end