Bartender4
Bartender4 is a full ActionBar replacement mod. It provides you with all the features needed to fully customization most aspects of your action and related bars.
Status for Dragonflight / 10.0
- Hold-to-cast is not currently available for addons
- Action Bars have been slightly re-arranged in Bartender4 for Dragonflight
- Bar 1-8 now reflect Blizzard Bars 1-8 (these are old 1, 3-6, and the 3 new bars)
- The old bars 7-10 are now called "Class Bar 1-4" (Shapeshifting, Stances, etc)
- The old bar 2 is now called Bonus Action Bar
Features
- Support for all Action Bars and all related bars
- 10 Action Bars (13 in Dragonflight!)
- Stance Bar
- Pet Bar
- Bag Bar
- Micro Menu
- XP/Reputation Bar
- All Bars are fully customizable (Scale, Alpha, Fade-Out settings, ...)
- Very flexible and customizable Show/Hide driver based on Macro Conditions
- Additional Layout and Paging settings for Action Bars
- Page all bars based on Stance or Modifier
- Possess Bar support
- Custom State driver support with Macro Conditions
- Options to hide specific elements of the buttons (Macro Text, HotKey, more could be added on demand)
- StickyFrames support
- Masque/ButtonFacade support!
- Easy Hotkey Binding using KeyBound
- Options to control the hiding of the default blizzard artwork (you might still want that to be displayed..)
FAQ
Q: I cannot move/drag my skills on my bars?
A: Hold Shift to move skills safely. You can also unlock your bars in the Bartender4 options, but using Shift is safer and recommended.
Q: How do i access the Configuration?
A: You can open the configuration with the Slash Commands (/bt or /bartender) or through the Bartender4 LDB plugin.
Q: Where are my keybindings? And how do i bind new keys?
A: Bartender4 buttons should automatically inherit keybindings from the Blizzard bars. For new keybindings, you can use KeyBound to re-bind your keys. You can access KeyBound by its slash command (/kb) or through the button in the BT4 config. Hover a button, press key → voila!
Q: Can I skin the buttons beyond the built-in options?
A: Bartender4 allows skinning through Masque! After installing both Bartender4 and Masque, you can customize the BT4 appearance in the Masque options.
Q: How do i disable the snapping of the bars?
A: Currently, you can temporarily override the snapping by holding down the Shift Key while moving your bars, or uncheck the option in the popup when your bars are unlocked.
Feature Requests/Bug Tracker
Please submit Bugs and/or Feature Requests using the Ticket System on the WoWAce Project page or in the Bartender4 Forum Thread. Please provide as many information as possible, including your client language, the exact version you are running, how to reproduce any errors, and a stack trace, if applicable.
Links
WoWAce Project: Bartender4 on WoWAce
Custom State Header: Info page on WoWAce
honestly, very impressed that it's working today. i updated my addons today and then instantly forgot that this one still might've needed to be reverted. so glad it didn't. thanks man!
Thank you so much for the update so fast I was getting the worst error, I cannot live without bartender so happy I set it up the first time been hooked ever since. <3 Praylus
I don't know how many years ago I first used this mod. 18? 20? Every time I return to WoW, it's still here, still working. And was quickly fixed when an issue arose today. Thanks, donation incoming.
error today 26/12/2025
Message: Interface/AddOns/Blizzard_Flyout/Flyout.lua:96: attempt to index field 'popup' (a nil value)
Time: Wed Feb 26 07:08:39 2025
Count: 2
Stack:
[Interface/AddOns/Blizzard_FrameXML/SecureHandlers.lua]:296: in function <...nterface/AddOns/Blizzard_FrameXML/SecureHandlers.lua:279>
[tail call]: ?
Locals:
self = BT4Button47 {
NewActionTexture = Texture {
}
BorderShadow = Texture {
}
TargetReticleAnimFrame = Frame {
}
icon = BT4Button47Icon {
}
SlotArt = Texture {
}
InterruptDisplay = Frame {
}
popupOffset = -4
arrowCrossAxisSize = 7
HighlightTexture = Texture {
}
flashing = 0
CooldownFlash = Frame {
}
IconMask = MaskTexture {
}
arrowMainAxisSize = 18
SpellHighlightAnim = AnimationGroup {
}
PushedTexture = Texture {
}
Name = BT4Button47Name {
}
_state_type = "action"
state_types = <table> {
}
down = true
arrowDownTexture = "UI-HUD-ActionBar-Flyout-Down"
AutoCastOverlay = Frame {
}
Border = BT4Button47Border {
}
openArrowOffset = 2
arrowNormalTexture = "UI-HUD-ActionBar-Flyout"
_state_action = 47
SpellCastAnimFrame = Frame {
}
closedArrowOffset = 4
popupDirection = "UP"
rangeTimer = -1
zoneAbilityDisabled = false
arrowOverTexture = "UI-HUD-ActionBar-Flyout-Mouseover"
config = <table> {
}
state_actions = <table> {
}
id = 47
CheckedTexture = Texture {
}
NormalTexture = BT4Button47NormalTexture {
}
action = 0
Arrow = Texture {
}
Count = BT4Button47Count {
}
HotKey = BT4Button47HotKey {
}
TextOverlayContainer = Frame {
}
LevelLinkLockIcon = Texture {
}
Flash = BT4Button47Flash {
}
SpellHighlightTexture = Texture {
}
__LAB_Version = 119
outOfRange = false
header = BT4Bar4 {
}
SlotBackground = Texture {
}
popupCrossAxisSize = 47
cooldown = BT4Button47Cooldown {
}
}
header = BT4Bar4 {
module = <table> {
}
currentButtonOffset = 0
elapsed = 0
hidedriver = <table> {
}
buttons = <table> {
}
id = "4"
overlay = BT4Bar4Overlay {
}
config = <table> {
}
name = "Bar 5"
bindingmapping = "MULTIACTIONBAR4BUTTON%d"
statebutton = <table> {
}
buttonConfig = <table> {
}
numbuttons = 12
}
preBody = " if self:GetAttribute("type") == "action" then
local type, action = GetActionInfo(self:GetAttribute("action"))
if type == "flyout" and self:GetAttribute("LABUseCustomFlyout") then
local flyoutHandler = owner:GetFrameRef("flyoutHandler")
if not down and flyoutHandler then
flyoutHandler:SetAttribute("flyoutParentHandle", self)
flyoutHandler:RunAttribute("HandleFlyout", action)
end
self:CallMethod("UpdateFlyout")
return false
end
-- hide the flyout
local flyoutHandler = owner:GetFrameRef("flyoutHandler")
if flyoutHandler then
flyoutHandler:Hide()
end
-- if this is a pickup click, disable on-down casting
-- it should get re-enabled in the post handler, or the OnDragStart handler, whichever occurs
if button ~= "Keybind" and ((self:GetAttribute("unlockedpreventdrag") and not self:GetAttribute("buttonlock")) or IsModifiedClick("PICKUPACTION")) and not self:GetAttribute("LABdisableDragNDrop") then
self:CallMethod("ToggleOnDownForPickpostBody = " local type, action = GetActionInfo(self:GetAttribute("action"))
if message ~= format("%s|%s", tostring(type), tostring(action)) then
self:RunAttribute("UpdateState", self:GetAttribute("state"))
end
-- re-enable ondown casting if needed
if self:GetAttribute("LABToggledOnDown") then
self:SetAttribute("LABToggledOnDown", nil)
self:CallMethod("ToggleOnDownForPickup", false)
end
"
button = "LeftButton"
down = false
message = "summonmount
il"
newbutton = "LeftButton"
In reply to armour61: read comments
cool
For those unable to currently use bartender and know how to comment here if you click on Versions next to the Comments link that took you here, there is alpha release indicated by the A in the box on the left hand side, and it appears to be working. ie not giving the flyout error
In reply to Groggynod3D:
Thank you worked for me!
Any new updates for the patch?
Bartender seems to have all the buttons/bars ineffective, not functional with this lastest wow version. I have to disable it within Addons for my buttons to once again work.
Whenever I enter a vehicle the abilities never work besides the exit. I can only click on the vehicle ability instead of hitting a keybind for it. Is there a way to fix this? I remade my profile 3 times now trying to figure this out.
found this a few comments down. It got my buttons working. Seems to be a solid temp fix. https://www.curseforge.com/wow/addons/libactionbutton-1-0/files/6097057
In reply to starrskream:
did nothing for me, still getting this error.
Blizzard_Flyout/Flyout.lua:96: attempt to index field 'popup' (a nil value)
[Blizzard_FrameXML/SecureHandlers.lua]:40: in function <Blizzard_FrameXML/SecureHandlers.lua:39>
[Blizzard_FrameXML/SecureHandlers.lua]:268: in function <Blizzard_FrameXML/SecureHandlers.lua:263>
[Blizzard_FrameXML/SecureHandlers.lua]:296: in function <Blizzard_FrameXML/SecureHandlers.lua:279>
In reply to railander:
nvm i see it's the alpha version, that did solve it.
thank you.
In reply to starrskream:
That fixed it for me! Thanks!
latest update 11.1 EVERY SINGLE BUTTON causes an LUA ERROR.
Message: Interface/AddOns/Blizzard_Flyout/Flyout.lua:96: attempt to index field 'popup' (a nil value)
Time: Tue Feb 25 20:55:53 2025
Count: 2
Stack:
[Interface/AddOns/Blizzard_FrameXML/SecureHandlers.lua]:296: in function <...nterface/AddOns/Blizzard_FrameXML/SecureHandlers.lua:279>
[tail call]: ?
Locals:
self = BT4Button74 {
NewActionTexture = Texture {
}
BorderShadow = Texture {
}
TargetReticleAnimFrame = Frame {
}
icon = BT4Button74Icon {
}
SlotArt = Texture {
}
InterruptDisplay = Frame {
}
popupOffset = -4
arrowCrossAxisSize = 7
HighlightTexture = Texture {
}
flashing = 0
CooldownFlash = Frame {
}
IconMask = MaskTexture {
}
arrowMainAxisSize = 18
SpellHighlightAnim = AnimationGroup {
}
PushedTexture = Texture {
}
Name = BT4Button74Name {
}
_state_type = "action"
state_types = <table> {
}
arrowDownTexture = "UI-HUD-ActionBar-Flyout-Down"
AutoCastOverlay = Frame {
}
Border = BT4Button74Border {
}
openArrowOffset = 2
arrowNormalTexture = "UI-HUD-ActionBar-Flyout"
_state_action = 74
SpellCastAnimFrame = Frame {
}
over = true
closedArrowOffset = 4
popupDirection = "UP"
rangeTimer = -1
zoneAbilityDisabled = false
arrowOverTexture = "UI-HUD-ActionBar-Flyout-Mouseover"
config = <table> {
}
state_actions = <table> {
}
id = 74
CheckedTexture = Texture {
}
NormalTexture = BT4Button74NormalTexture {
}
action = 0
Arrow = Texture {
}
Count = BT4Button74Count {
}
HotKey = BT4Button74HotKey {
}
TextOverlayContainer = Frame {
}
LevelLinkLockIcon = Texture {
}
Flash = BT4Button74Flash {
}
SpellHighlightTexture = Texture {
}
__LAB_Version = 119
outOfRange = false
header = BT4Bar7 {
}
SlotBackground = Texture {
}
popupCrossAxisSize = 47
cooldown = BT4Button74Cooldown {
}
}
header = BT4Bar7 {
currentButtonOffset = 0
elapsed = 0
hidedriver = <table> {
}
buttons = <table> {
}
id = "7"
module = <table> {
}
config = <table> {
}
name = "Class Bar 1"
overlay = BT4Bar7Overlay {
}
statebutton = <table> {
}
buttonConfig = <table> {
}
numbuttons = 12
}
preBody = " if self:GetAttribute("type") == "action" then
local type, action = GetActionInfo(self:GetAttribute("action"))
if type == "flyout" and self:GetAttribute("LABUseCustomFlyout") then
local flyoutHandler = owner:GetFrameRef("flyoutHandler")
if not down and flyoutHandler then
flyoutHandler:SetAttribute("flyoutParentHandle", self)
flyoutHandler:RunAttribute("HandleFlyout", action)
end
self:CallMethod("UpdateFlyout")
return false
end
-- hide the flyout
local flyoutHandler = owner:GetFrameRef("flyoutHandler")
if flyoutHandler then
flyoutHandler:Hide()
end
-- if this is a pickup click, disable on-down casting
-- it should get re-enabled in the post handler, or the OnDragStart handler, whichever occurs
if button ~= "Keybind" and ((self:GetAttribute("unlockedpreventdrag") and not self:GetAttribute("buttonlock")) or IsModifiedClick("PICKUPACTION")) and not self:GetAttribute("LABdisableDragNDrop") then
self:CallMethod("ToggleOnDownForPickpostBody = " local type, action = GetActionInfo(self:GetAttribute("action"))
if message ~= format("%s|%s", tostring(type), tostring(action)) then
self:RunAttribute("UpdateState", self:GetAttribute("state"))
end
-- re-enable ondown casting if needed
if self:GetAttribute("LABToggledOnDown") then
self:SetAttribute("LABToggledOnDown", nil)
self:CallMethod("ToggleOnDownForPickup", false)
end
"
button = "LeftButton"
down = false
message = "spell|462031"
newbutton = nil
Completely broken first day of patch - cannot use any abilities or buttons if bartender is enabled - please fix asap.
4-4.15.2 is borked. :(
4.15.2 doesnt seem to be working either. Any ideas? I tried to use the alpha version jan 19th and jan 10th with same results.
After today's update I updated this addon again. None of my icons can be selected and be used. They appear as static objects.