Get an Epic Experience with Premium


Buffs & Debuffs Login to Add Favorites
  • World of Warcraft
  • 1,838 Monthly Downloads
  • Supports: 6.0.3
  • 455,590 Total Downloads
  • Updated 11/09/2014
  • Created 02/16/2009
  • 591 Favorites
  • Project Site
  • Comments
  • Release Type: Release
  • License: GNU General Public License version 3 (GPLv3)
  • Newest File: 2.5.16

About ButtonTimers

ButtonTimers is action buttons with timers attached. The timers can be configured to show a buff/debuff or the cooldown of a spell. The timers are highly configurable, with lots of options to play with.

Important note:

There are a limited number of action slots (1-120). These correspond to 10 bars of 12 buttons each. These are the same 120 slots that every action bar mod has to use (Bartender, PitBull, Blizzard's standard UI, etc.)

Chances are you aren't using all 12 slots on all 10 bars. You can configure ButtonTimers to use any of the 120 action slots you want. Do this with the "First button on bar is.." slider in the bar configuration.

If you don't change the "First button on bar is..", the bars will default to bars 10, 9, 8, 7. Note that bars 7-9 are by default the stance bars, so if your class uses stances you may wish to change it.

Getting Started:

When you first start the mod, you will see 4 bars of 12 buttons each. Open up the options (in the interface->addons panel), and disable the bars you won't be using. Next change the number of buttons from 12 to however many buttons you would like to see.

Now change the action slots the bar is showing you. Just take the action offset slider and slide it until you see some unused action buttons. Then drag the spells/abilities of your choice onto the bar.

The default is to track dots/debuffs/buffs. If that's what you want the timer to reflect, you are done. If you want to see a cooldown instead, select the configuration for the button and change the selector from "Aura" to "Cooldown".

There are lots of configuration options, go ahead and play with them. But that should be enough to get you started.

Bar configuration options are:

  • '''Bar Enabled:''' enable / disable the bar.
  • '''Hide out of combat:''' don't show the bar out of combat.
  • '''Bar Locked:''' lock the bar in position so that it cannot be dragged.
  • '''Orientation:''' horizontal or vertical layout for the buttons on the bar. You can also put the timers on the buttons themselves.
  • '''Timer Location:''' you can select whether you want the bar be on the left or right of the button (in vertical orientation) or above/below the button (in horizontal orientation)
  • '''Button Spacing:''' the space between the buttons on the bar.
  • '''Bar Scale:''' size the whole bar larger or smaller
  • '''Bar Length:''' length of the timer bar
  • '''Button Count:''' number of buttons on the bar (1-12)
  • '''First button on bar is..''' action slot number of the first button on the bar. Blizzard gives 120 action slots, which are traditionally allocated into 10 bars, but this mod gives a finer control over which slots you wish to use. Just slide this control until you find some unused slots.

Button options are:

  • '''Type:''' Set whether you wish to monitor a cooldown or an aura on the default bar target. You can also monitor both aura and cooldown. The cooldown will show up on the button and the aura timer on the bar if you select both.
  • '''Timer Type:''' The timer can either be shown as a percentage of the aura/cooldown duration or in fixed time. For example, if you choose a fixed time with a time of 10s, a full bar will always represent 10 or more seconds. This makes it easier to see which aura/cooldown will complete first, regardless of the spell's length.
    • '''Bar Time:''' This sets the max time displayed on a fixed time timer bar. Any timer durations longer than Bar Time will show as a full bar.
  • '''Show others' spells:''' By default, the timer will only monitor auras on the target if you were the caster of the spell. Click this button if you wish to see other's spells as well. The timer will always show your own spell if you have one on the target. Note: Pet spells do not count as being cast by you, so if you wish to monitor a pet spell then click this button.
  • '''Other Auras:''' By default, an aura timer will monitor the bar's default target for an aura matching the name of the spell on the action button. In this field you can enter additional auras (in a comma separated list) to look for.
    • "Show Aura Icon:" When checked, the icon on the button will update to match the aura we are showing the timer for.
    • "Ignore Button Aura:" When checked, timers will only be created for the auras specified in the Other Auras field. If Show Aura Icon is also checked, then the icon on the button when no timer is present will be the first aura listed in the Other Auras field.
  • '''Cooldown spell:''' By default, a cooldown timer will monitor the cooldown on the action on the bar. But you can also enter a spell name to monitor instead.
  • '''Bar Color:''' The color of the timer bar.
  • '''Target:''' This will select the default target (to target, focus target, self, party, pet) for all actions on the bar. It also controls what target to monitor for auras.
  • '''Use as spell target:''' If set, target will be the spell target as well as the target to monitor for the selected aura.
  • '''Warn less than cast time:''' Change the bar color when timer less than cast time. Also tints the action button.
  • '''Warning Bar Color:''' Bar color for timers when remaining time less than cast time.
    • "Adjust Cast Time:" Additional number of seconds to add, or subtract, from the cast time. Set this value to the effect's duration * 0.3 for the warn color to show when its safe to refresh an effect without wastage.
  • '''Adjust Timer:''' Number of seconds to add to timer (can be negative).

Command line options:

'''/buttontimers reset''' - reset bar positions to default

'''/buttontimers config''' - open the configuration dialog (can also be accessed on Blizzards interface -> addons panel)

r63 | stencil | 2014-11-09 20:54:58 +0000 (Sun, 09 Nov 2014) | 1 line
Changed paths:
   A /tags/2.5.16 (from /trunk:62)

Tagging as 2.5.16
r62 | stencil | 2014-11-09 20:44:07 +0000 (Sun, 09 Nov 2014) | 1 line
Changed paths:
   M /trunk/ButtonTimers.toc
   M /trunk/Core.lua

bug fix - errors when "warn < cast time" is checked but button doesn't have an action
r60 | stencil | 2014-11-06 11:10:30 +0000 (Thu, 06 Nov 2014) | 1 line
Changed paths:
   M /trunk/ButtonTimers.toc
   M /trunk/Core.lua
   M /trunk/locale/enUS.lua

Added a cast time adjustment field to the option for warning when the cast time is less than the remaining duration of an aura. Useful for identifying when its safe to refresh the effect without clipping.
r58 | stencil | 2014-10-15 09:25:27 +0000 (Wed, 15 Oct 2014) | 1 line
Changed paths:
   M /trunk/ButtonTimers.toc
   M /trunk/Core.lua

bug fix - return values for GetSpellInfo changed, affects us when we're looking at the casttime of a spell
r56 | stencil | 2014-10-15 01:58:29 +0000 (Wed, 15 Oct 2014) | 1 line
Changed paths:
   M /trunk/ButtonTimers.toc

... and version number /facepalm
r55 | stencil | 2014-10-15 01:57:37 +0000 (Wed, 15 Oct 2014) | 1 line
Changed paths:
   M /trunk/ButtonTimers.toc

bumping toc file


First Previous Page 12 of 61 Next Last
  • #767

    I cannot reproduce your problem.  I log in, drop my totems, and the timer shows.  I drop searing totem again and the timer updates.  I even tried turning off all other addons (except ACP and a bug catcher) and replaced my dev working copy with the BETA build downloaded off the curse site; it appeared to be working just fine.

    A couple of things we can try from here.  The first is that you could open up wtf\...\savedvariables\buttontimers.lua and find the config info saved out for that button and post it here.  You should be able to find that button fast by searching for ["target"] = 8.  Otherwise (and if its not 8 its not set to totem) the data is now structured in the save file and so you should be able to find that toon's profile, then the bar and then the button.

    Otherwise, you've already shown that you know code so you may have to debug by print statement to try to see what the problem is.  The totem check isn't much different than what you had written.

  • #763

    first of all, i would like to say big thanks to the author of this great addon! it's help me a lot to do a nice dps on my main lock. but some time ago i start leveling my alt - shaman. and i was really disappointed that ButtonTimers can't track my Searing Totem. so i decide to make some changes to fix this. here is a list of my changes. you can apply them in any text editor to the appropriate files. of course, i didn't do a lot of testings with different configurations, but after all, addon still work fine for my lock and shaman.
    here is a list of my changes:
    in file locale\enUS.lua (and any other in this folder if you are using different languages), after line #41 add following:
    L["Totem"] = true

    now come a lot of changes in core.lua file:
    change lines 25-27 to look like this:
    ABT_TOTEM = 8
    ABT_TARGET_NAMES = { [ABT_TARGET]="target", [ABT_FOCUS]="focus", [ABT_PLAYER]="player", [ABT_PARTY]="party", [ABT_PET]="pet", [ABT_VEHICLE]="vehicle", [ABT_TOTEM]=L["Totem"] }
    ABT_AURA = 1

    then, change the line 252 to look like this:
                values = { [ABT_TARGET]=L["Target"], [ABT_FOCUS]=L["Focus"], [ABT_PLAYER]=L["Player"], [ABT_PARTY]=L["Party/Raid Member"], [ABT_PET]=L["Pet"], [ABT_VEHICLE]=L["Vehicle"], [ABT_TOTEM]="Totem" },

    add this bunch of text after line 1251, right before function GetDebuffs definition:
    function ABT:ProcessDeBuff(button, barIdx, buttonIdx, useTimer, useStatusbar, tickPrediction, showAuraIcon, effect, actionslot, name, iconTexture, count, duration, expirationTime)
            local currenttime = GetTime()
               local timeLeft = expirationTime-currenttime
               local timeStart = expirationTime - duration
               local add = tonumber(ABT:GetValue (barIdx, buttonIdx, "timerAdjust"))

    --        if (effect == "Searing Totem" or effect == "Fire Elemental Totem") then
    --            DEFAULT_CHAT_FRAME:AddMessage("ProcessDeBuff for button="..buttonIdx..": actionslot="..ABT:NS(actionslot).. ", name="..ABT:NS(name)..", duration="..ABT:NS(duration)..", timeLeft="..timeLeft);
    --        end

               if useTimer then
                   button.timer.expirationTime = expirationTime + (add or 0)-- time left on this effect
                   if (button.timer.expirationTime <= 0) then
                       button.timer.expirationTime = nil
               elseif useStatusbar then
                   button.countdown.expirationTime = expirationTime + (add or 0)-- time left on this effect
                   if (button.countdown.expirationTime <= 0) then
                       button.countdown.expirationTime = nil
                       button.effect = nil
                       button.count = count
                       local barTime
                       if ABT:GetValue (barIdx, buttonIdx, "barType") == ABT_FIXED then
                           barTime = ABT:GetValue (barIdx, buttonIdx, "barTime")
                           barTime = duration
                       button.tex.max = barTime
                       if button.tex.timerColor then
                           button.tex:SetVertexColor (unpack(button.tex.timerColor))
                       if button.tex.warnColor then
                           button.castTime = ABT:GetCastTime (button)
                       if tickPrediction then
                           button.effect = effect
                       local spellText = nil
                       if ABT:GetValue (barIdx, nil, "orientation") == ABT_HORIZONTAL then
                           if count > 1 then
                               spellText = "x"..ABT:NS(count)
                       else -- orientation == ABT_VERTICAL
                           spellText = effect

                           if count > 1 then
                               spellText = spellText.." x"..ABT:NS(count)
                           if target ~= "target" then
                               spellText = spellText..": "..ABT:NS(UnitName(target))

                       if button.tickLength then
                           if (timeLeft > (duration - button.tickLength)) then
                               ABT:SetTickTime (button, duration - button.tickLength)
                           elseif timeLeft < button.tickLength then
               ABT:DebugPrint ("bar"..barIdx.."button"..buttonIdx.."showAuraIcon="..ABT:NS(showAuraIcon).." a="..ABT:NS(button.timer.expirationTime).." b="..ABT:NS(button.countdown.expirationTime))
               if ((button.timer.expirationTime or button.countdown.expirationTime) and showAuraIcon and actionslot) then
                   button.texture = iconTexture
                   button.defaultTexture = GetActionTexture(actionslot)
                   ABT:DebugPrint ("bar"..barIdx.."button"..buttonIdx.." setting icon to: "..ABT:NS(iconTexture))

    then replace the whole GetDebuffs function by this one:
    function ABT:GetDebuffs()
        ABT:DebugTrace ("GetDebuffs", true)
        local unit = nil
    --    ABT:DebugPrint ("GetDebuffs "..ABT:NS(event).." "..ABT:NS(arg1))
        -- loop over buttons looking for aura timer buttons matching the target
        local barIdx = 1
        local buttonIdx = 0
            barIdx, buttonIdx = ABT:GetNextButton(barIdx, buttonIdx)
    --        ABT:DebugPrint ("bar="..ABT:NS(barIdx).." button="..ABT:NS(buttonIdx))
            if barIdx and buttonIdx then
                local button = ABT_Buttons[barIdx][buttonIdx]
                local key = "bar"..barIdx.."button"..buttonIdx
                local timerType = ABT:GetValue (barIdx, buttonIdx, "timerType")
                local location = ABT:GetValue(barIdx, nil, "location")
                local target = button.targetUnit
                if (target == nil) then target = "target" end
                local showOthers = ABT:GetValue (barIdx, buttonIdx, "showOthers")
                local buttonFound = false -- haven't yet found a match for this button
                local useTimer = (timerType == ABT_AURA and location == ABT_ONBUTTONS)
                local useStatusbar = (timerType == ABT_BOTH or (timerType == ABT_AURA and location ~= ABT_ONBUTTONS))
                local tickPrediction = ABT:GetValue(barIdx, buttonIdx, "showTickPrediction")
                local showAuraIcon = ABT:GetValue(barIdx, buttonIdx, "showAuraIcon")
                local actionslot = button.button:GetAttribute("action")
                if (timerType == ABT_AURA or timerType == ABT_BOTH) then -- aura timer
                    local effectList = ABT:parseList (ABT:GetValue (barIdx, buttonIdx, "auras"))
                    -- build effects list
                    if actionslot then
                        local actionType, actionId, actionSubType = GetActionInfo (actionslot)
    --                ABT:DebugPrint ("type="..ABT:NS(actionType).." id="..ABT:NS(actionId).." subtype="..ABT:NS(actionSubType).." slot="..actionslot)
                        if actionType == "spell" then
                            local spellName = nil
                            if actionSubType == "pet" and actionslot > 120 then
                                spellName = GetPetActionInfo (actionslot-120)
                            elseif actionId > 0 then
                                spellName = GetSpellInfo ( actionId )
                            effectList[100] = spellName

    --                DEFAULT_CHAT_FRAME:AddMessage("checking button "..buttonIdx..": timerType: "..ABT:NS(timerType).. ", location: "..ABT:NS(location)..", target: "..ABT:NS(target)..", actionslot: "..ABT:NS(actionslot)..", EffectList: "..ABT:NS(effectList)..", target: "..ABT:GetValue (barIdx, buttonIdx, "target"));

                    -- now look for the aura for this button
                       local effect
                       for _, effect in pairs(effectList) do
                        if (target == "Totem") then
                            for totemId=1, 4 do
                                local _, totemName, startTime, duration = GetTotemInfo (totemId);
        --                        DEFAULT_CHAT_FRAME:AddMessage("checking slot "..totemId.." with totem "..totemName.." for equality with " .. ABT:NS(spellName));
                                if (totemName == effect) then
                                    local expirationTime = startTime + duration
                                    local _, _, icon = GetSpellInfo (effect);
        --                            DEFAULT_CHAT_FRAME:AddMessage("Totem found! start time="..startTime..", duration="..duration..", expiration="..expirationTime..", icon="..ABT:NS(icon));
                                    ABT:ProcessDeBuff (button, barIdx, buttonIdx, useTimer, useStatusbar, tickPrediction, showAuraIcon, totemName, actionslot, totemName, icon, 1, duration, expirationTime)
                                    buttonFound = true
                            local effectId = tonumber(effect)
                            for debuff = 1, 2 do -- check debuffs, then buffs
                                for index = 1, 40 do
        --                            ABT:DebugPrint ("Looking for -"..effect.."- on button "..button:GetName().." target="..ABT:NS(target))
                                    local name, rank, iconTexture, count, debuffType, duration, timeLeft, expirationTime, isMine, caster, spellId
                                    timeLeft = nil
                                    isMine = nil
                                    expirationTime = nil
                                    if debuff == 1 then
                                        name, rank, iconTexture, count, debuffType, duration, expirationTime, caster, _, _, spellId = UnitDebuff (target, index); -- 3.0
                                        if (name == "Jinx: Curse of the Elements") then
        --                                    ABT:DebugPrint ("now I found effect "..ABT:NS(name).." id="..ABT:NS(spellId).." on target: "" caster="..ABT:NS(caster))
        --                                    ABT:DebugPrint ("try to match against effect="..ABT:NS(effect).." id="..ABT:NS(effectId))
                                        name, rank, iconTexture, count, debuffType, duration, expirationTime, caster, _, _, spellId = UnitBuff (target, index); -- 3.0

                                    if name == nil then break end -- no more buffs/debuffs

                                    -- the effect was found on the mob, now lets see if it's ours
                                    -- use the effect if it is ours, or if the anyCaster flag is set and the button
                                    -- was not previously found. This will prioritize our own spells for display if multiple
                                    -- matching effects are found
                                    isMine = (caster == "player" or caster == "pet" or caster == "vehicle")
                                    if ((name ~= nil and name == effect) or (effectId ~= nil and effectId == spellId)) and (isMine or (showOthers and not buttonFound)) then
                                        if (name == "Jinx: Curse of the Elements") then
                                            ABT:DebugPrint ("match! "..ABT:NS(name).." rank="..ABT:NS(rank).." count="..ABT:NS(count).." type="..ABT:NS(debuffType).." duration="..ABT:NS(duration).." timeLeft="..ABT:NS(timeLeft).." expirationTime="..ABT:NS(expirationTime).." id="..ABT:NS(spellId).." on target: "" caster="..ABT:NS(caster))
                                        ABT:ProcessDeBuff(button, barIdx, buttonIdx, useTimer, useStatusbar, tickPrediction, showAuraIcon, effect, actionslot, name, iconTexture, count, duration, expirationTime)
                                        buttonFound = true

                    if not buttonFound then
                        if useTimer then
                            button.timer.expirationTime = nil
                        elseif useStatusbar then
                            button.countdown.expirationTime = nil
        until buttonIdx == nil
    --    ABT:DebugPrint ("Exiting GetDebufs buttonIdx="..ABT:NS(buttonIdx))
        ABT:DebugTrace ("GetDebuffs")

    if all of above is too complicated, i can upload somewhere my modified version...

    this changes introduce new category for targets - totem. f.e. if you want to place Searing Totem on the right time, drop your Searing Totem spell to one of the ButtonTimer buttons and set a target as "Totem", Type as "Aura".

    Last edited by Nameless76 on 3/22/2012 3:00:08 AM
  • #764

    Cool!  Thanks for your contribution.  I'm in the process of adding this to my local dev copy.  I need to first review the original functions to make sure I understand what they were supposed to do and then exactly what your changes are.  I've already noted a perf issue carried over from the the original version that I'll want to recode.

  • #761

    i love this addon, only problem i have with it is it doesnt save my set up the way i want it, for example, i have 7 different spells being tracked, and it randomly chooses one or two of them to not track, or wont put bars up but tick off numbers instead...any suggestions?

  • #762

    You said "it randomly chooses one or two of them to not track."  By random do you mean it actually changes which couple of trackers don't show correctly from target to target or combat to combat?  That would be utterly bizarre ...

    If instead its always the same trackers that aren't working right then please describe what it is you are trying to track as well as what options you have set in the configuration ui for that button (aura vs cooldown, target vs player, etc, etc).

  • #756

    i have instaled on an external. think i have to updat the externals drivers idk ill try that. sorry for the spam i hope it works cause i need this addon

  • #754

    i have tried dl this like 4 times still cant get it to appear maybe i am doing something wrong? i have tried the last two updates you did.

  • #757

    Well, I've tested it by downloading the latest and disabling all other addons and it worked.  Do you run with an addon for catching Lua errors like Bugsack?  Might want to try installing something like that and then seeing if it catches any errors that were occuring in login that you otherwise couldn't see.

  • #755

    its my wow i guess cause i cant get any of my addons to update or show up on my screen

  • #753

    thx.... thx so much for looking at this and also fixing it!!!!!!!!

  • #748

    Hi, same here, i just installed the latest version and there is no way i can get it show on my screen, it is listed in the addons list tho, and it is present in the game folder..:S


    UPDATE: seems like r11 works just fine at the moment, also the profiles are a huge upgrade. Thank you so much!

    Last edited by caminfo on 2/16/2012 2:23:10 AM
  • #744

    Just installed the latest version 2.3 this morning and it doesnt show up in my Interface Addons. Its in the wow folder on my computer, it shows in the addon window of the log on window but not when Im ingame in the interface. Ive gone back and installed the 2.2.2 version and thats back to working normally and appears in the interface window.


    I dont think its anything that I did thats wrong...or at least I hope not.


    I rely on this addon so much I cant play my ranged deeps classes without it 



  • #747

    Hi, I have the same problem. Marek

  • #752

    It's working, thanks a lot for very quick fix.

  • #751



    Thanks that worked, everything is buttony yumminess again.



  • To post a comment, please login or register a new account.
Login to Curse

Don't have an account? Create One.

Get an epic experience with Curse Premium
  • Faster addon downloads
  • Premium-Only Beta Giveaways
  • Ad-Free Curse experience
  • Premium Curse Client
  • and many More Features
  • Learn More »

Gamepedia Free-shirt Giveaway