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
until it gets fixed, solution to making bags work is turn off "Display Money" option in Frame settings. Gold wont show on bags but least they open. Have to turn off Display money for bank tab and guild bank tab to
Todays update has cause my bags not to open. pressing my keybind Shift-b does not open my bags. this update has caused many errors with multiple other add-ons.
In reply to RandyM: Same.
In reply to RandyM: same, no bags opening, even when reverting to old update for Bartender and Bagnon, nothin :(
to fix issues with today's patch on anniversary realms,
1.) Navigate to World of Warcraft\_classic_era_\Interface\AddOns\Bartender4\libs\LibActionButton-1.0 and open up the .lua file
2.) Scroll down until you see the functions, pick a spot between the end of a function and the next one starting(dont paste it into an existing function), paste in this new function once:
function Generic:OnButtonStateChanged(...)
end
3.) Save and reload
edit: to clarify, you only need this one time in the lua file. i put mine after line 275, right between the 'end' and 'function SetupSecureSnippets(button)'.
In reply to spacious: This doesnt make sense, 80% of that file is functions. Theres over 100 functions called out, and atleast another 90 under the button mapping sections. And about 4-5x's as many 'end's called out
Do you have line #'s or any other starting point? Because to me it looks like i gotta add that line in 200+ times.
In reply to AbsoluTalenT:
sorry, i meant just add it 1 single time after ANY function. you dont need to add it after every 'end'. you just dont want to add it into another function. ill edit my post to clarify this
In reply to spacious: Thank you. And solution works great. I know enough with some things, not so much of others. Maybe I overthunk your original message and confused myself.
I am also having the same issues.
I get this error everytime i hover over my action bars with my mouse. Im on wow anniversary servers
Message: ...ddOns/Blizzard_SharedXMLBase/ButtonStateBehavior.lua:39: attempt to call method 'OnButtonStateChanged' (a nil value)
Time: Tue Apr 8 12:03:53 2025
Count: 185
Stack:
[Interface/AddOns/Blizzard_SharedXMLBase/ButtonStateBehavior.lua]:39: in function 'OnEnter'
[Interface/AddOns/Blizzard_Flyout/Flyout.lua]:28: in function 'OnEnter'
[Interface/AddOns/Bartender4/libs/LibActionButton-1.0/LibActionButton-1.0.lua]:1078: in function <...er4/libs/LibActionButton-1.0/LibActionButton-1.0.lua:1064>
Locals:
self = BT4Button36 {
NormalTexture = BT4Button36NormalTexture {
}
HotKey = BT4Button36HotKey {
}
action = 0
NewActionTexture = Texture {
}
over = true
flashing = 0
Flash = BT4Button36Flash {
}
state_actions = <table> {
}
FlyoutBorderShadow = BT4Button36FlyoutBorderShadow {
}
Border = BT4Button36Border {
}
Name = BT4Button36Name {
}
_state_action = 36
icon = BT4Button36Icon {
}
Count = BT4Button36Count {
}
AutoCastable = Texture {
}
SpellHighlightAnim = AnimationGroup {
}
rangeTimer = -1
header = BT4Bar3 {
}
id = 36
AutoCastShine = BT4Button36Shine {
}
SpellHighlightTexture = Texture {
}
__LAB_Version = 120
outOfRange = false
config = <table> {
}
FlyoutBorder = BT4Button36FlyoutBorder {
}
_state_type = "action"
state_types = <table> {
}
FlyoutArrow = BT4Button36FlyoutArrow {
}
cooldown = BT4Button36Cooldown {
}
zoneAbilityDisabled = false
}
(*temporary) = nil
(*temporary) = BT4Button36 {
NormalTexture = BT4Button36NormalTexture {
}
HotKey = BT4Button36HotKey {
}
action = 0
NewActionTexture = Texture {
}
over = true
flashing = 0
Flash = BT4Button36Flash {
}
state_actions = <table> {
}
FlyoutBorderShadow = BT4Button36FlyoutBorderShadow {
}
Border = BT4Button36Border {
}
Name = BT4Button36Name {
}
_state_action = 36
icon = BT4Button36Icon {
}
Count = BT4Button36Count {
}
AutoCastable = Texture {
}
SpellHighlightAnim = AnimationGroup {
}
rangeTimer = -1
header = BT4Bar3 {
}
id = 36
AutoCastShine = BT4Button36Shine {
}
SpellHighlightTexture = Texture {
}
__LAB_Version = 120
outOfRange = false
config = <table> {
}
FlyoutBorder = BT4Button36FlyoutBorder {
}
_state_type = "action"
state_types = <table> {
}
FlyoutArrow = BT4Button36FlyoutArrow {
}
cooldown = BT4Button36Cooldown {
}
zoneAbilityDisabled = false
}
(*temporary) = "attempt to call method 'OnButtonStateChanged' (a nil value)"
i get this error multiple times on a daily basis
65x ...zzard_ActionBar/Mainline/MainMenuBarMicroButtons.lua:1763: attempt to compare two nil values
[Blizzard_ActionBar/Mainline/MainMenuBarMicroButtons.lua]:1763: in function 'GetEdgeButton'
[Blizzard_ActionBar/Mainline/MainMenuBarMicroButtons.lua]:1791: in function 'UpdateHelpTicketButtonAnchor'
[Blizzard_ActionBar/Mainline/MainMenuBarMicroButtons.lua]:1850: in function 'Layout'
[Blizzard_SharedXML/LayoutFrame.lua]:14: in function <Blizzard_SharedXML/LayoutFrame.lua:12>
[C]: ?
[C]: in function 'Show'
[Blizzard_UIParentPanelManager/Mainline/UIParentPanelManager.lua]:448: in function 'SetUIPanel'
[Blizzard_UIParentPanelManager/Mainline/UIParentPanelManager.lua]:532: in function 'HideUIPanelImplementation'
[Blizzard_UIParentPanelManager/Mainline/UIParentPanelManager.lua]:521: in function 'HideUIPanel'
[Blizzard_UIParentPanelManager/Mainline/UIParentPanelManager.lua]:178: in function <...ParentPanelManager/Mainline/UIParentPanelManager.lua:169>
[C]: in function 'SetAttribute'
[Blizzard_UIParentPanelManager/Mainline/UIParentPanelManager.lua]:913: in function <...ParentPanelManager/Mainline/UIParentPanelManager.lua:896>
[C]: in function 'HideUIPanel'
[Blizzard_FrameXML/Shared/CinematicFrame.lua]:97: in function <...eBlizzard_FrameXML/Shared/CinematicFrame.lua:81>
Locals:
self = MicroMenu {
layoutFramesGoingRight = true
isHorizontal = true
normalScale = 1
dirty = false
oldGridSettings = <table> {
}
childYPadding = -5
layoutFramesGoingUp = false
numButtons = 12
stride = 12
childXPadding = -5
}
rightMost = false
topMost = true
firstButton = HelpMicroButton {
FlashBorder = Texture {
}
layoutIndex = 10
textureName = "GameMenu"
FlashContent = Texture {
}
Background = Texture {
}
PushedBackground = Texture {
}
QuickKeybindHighlightTexture = Texture {
}
tooltipText = "Customer Support"
}
lastButton = HelpMicroButton {
FlashBorder = Texture {
}
layoutIndex = 10
textureName = "GameMenu"
FlashContent = Texture {
}
Background = Texture {
}
PushedBackground = Texture {
}
QuickKeybindHighlightTexture = Texture {
}
tooltipText = "Customer Support"
}
firstButtonX = nil
firstButtonY = nil
lastButtonX = nil
lastButtonY = nil
(*temporary) = true
(*temporary) = 1
(*temporary) = 2
(*temporary) = "attempt to compare two nil values"
every time i swap from preservation to devastation spec, i get this error. Also happens when I swap from disc to shadow. This error only seems to show when I swap from spec profiles that have stance bar enabled to spec profile that don't
1767x Bartender4/Bar.lua:123: attempt to compare nil with number
[Bartender4/Bar.lua]:123: in function <Bartender4/Bar.lua:121>
Locals:
self = BT4BarStanceBar {
disabled = true
buttons = <table> {
}
id = "StanceBar"
hidedriver = <table> {
}
faded = true
config = <table> {
}
name = "Stance Bar"
numbuttons = 1
elapsed = 0.044000
overlay = BT4BarStanceBarOverlay {
}
}
elapsed = 0.013000
(*temporary) = 0.044000
(*temporary) = nil
(*temporary) = "attempt to compare nil with number"
the empty slots are always visible with addon v4.15.16 in classic anniversary hardcore
I'm having a lot of issues with Bartender and Vehicle UI in this season.
Specifically in the Cinderbrew Meadery, on the boss where you mount the bees while in combat, very often the vehicle UI doesn't show up at all. And the times it does, it does not go away after dismounting the bee.
I've tried both using the default Blizzard vehicle UI and Bartener's "possess bar" option. Neither of them work properly while entering a vehicle in combat.
Does anyone have any tips on how to get this working reliably?
ehi guys hey guys this error appears every time you get into the new car and you give up at undermine
840x ...zzard_ActionBar/Mainline/MainMenuBarMicroButtons.lua:1763: attempt to compare number with nil
[Blizzard_ActionBar/Mainline/MainMenuBarMicroButtons.lua]:1763: in function 'GetEdgeButton'
[Blizzard_ActionBar/Mainline/MainMenuBarMicroButtons.lua]:1791: in function 'UpdateHelpTicketButtonAnchor'
[Blizzard_ActionBar/Mainline/MainMenuBarMicroButtons.lua]:1850: in function 'Layout'
[Blizzard_ActionBar/Mainline/MainMenuBarMicroButtons.lua]:1914: in function 'Layout'
[Blizzard_ActionBar/Mainline/MainMenuBarMicroButtons.lua]:457: in function <...zzard_ActionBar/Mainline/MainMenuBarMicroButtons.lua:456>
[C]: ?
[C]: ?
[C]: in function 'SetParent'
[Bartender4/MicroMenu.lua]:161: in function <Bartender4/MicroMenu.lua:149>
[tail call]: ?
[C]: in function 'SetParent'
[Blizzard_ActionBar/Mainline/MainMenuBarMicroButtons.lua]:93: in function 'ResetMicroMenuPosition'
[Blizzard_ActionBarController/Mainline/ActionBarController.lua]:218: in function 'ValidateActionBarTransition'
[Blizzard_ActionBarController/Mainline/ActionBarController.lua]:175: in function <...ActionBarController/Mainline/ActionBarController.lua:143>
[C]: in function 'ActionBarController_UpdateAll'
[Blizzard_ActionBarController/Mainline/ActionBarController.lua]:66: in function <...ActionBarController/Mainline/ActionBarController.lua:55>
Locals:
self = MicroMenu {
dirty = false
childYPadding = -5
oldGridSettings = <table> {
}
layoutFramesGoingUp = false
normalScale = 1
stride = 12
layoutFramesGoingRight = true
isHorizontal = true
numButtons = 12
childXPadding = -5
}
rightMost = false
topMost = true
firstButton = CharacterMicroButton {
FlashBorder = Texture {
}
PortraitMask = MaskTexture {
}
QuickKeybindHighlightTexture = Texture {
}
Portrait = Texture {
}
tooltipText = "Info personaggio"
Background = Texture {
}
PushedBackground = Texture {
}
layoutIndex = 1
PushedShadow = Texture {
}
Shadow = Texture {
}
commandName = "TOGGLECHARACTER0"
}
lastButton = HelpMicroButton {
FlashBorder = Texture {
}
layoutIndex = 10
textureName = "GameMenu"
FlashContent = Texture {
}
Background = Texture {
}
PushedBackground = Texture {
}
QuickKeybindHighlightTexture = Texture {
}
tooltipText = "Assistenza Clienti"
}
firstButtonX = 638.417786
firstButtonY = 19.850410
lastButtonX = nil
lastButtonY = nil
(*temporary) = true
(*temporary) = 2
(*temporary) = 3
(*temporary) = "attempt to compare number with nil"
i'm notoriously bad at googling things, any results i find tend to be 10 years out of date, the total opposite of what i'm trying to do, or just completely unrelated x_x
so in pet battles, the default wow ui takes over - awesome.
but in vehicles, the default wow ui does not take over, and i just have Bar 1 with the buttons as usual.
but i want the default wow vehicle ui to appear :(
i've tried flicking every possible setting in bartender on/off for paging, swapping, vehicle bar disabled/enabled, etc., honestly everything and anything i can find. no luck :(
anyone have any ideas?
In reply to catbeef:
Playing with it a bit, the G99 breakneck (the undermine car) has a vehicle UI when bartender is enabled, but I cannot get bartender to show it. None of the vehicle-related settings on bar 1 or the separate vehicle bar entry in settings appear to have any effect.
Keep getting this error, not exactly sure how to fix it.
1024x ...zzard_ActionBar/Mainline/MainMenuBarMicroButtons.lua:1763: attempt to compare number with nil
[Blizzard_ActionBar/Mainline/MainMenuBarMicroButtons.lua]:1763: in function 'GetEdgeButton'
[Blizzard_ActionBar/Mainline/MainMenuBarMicroButtons.lua]:1791: in function 'UpdateHelpTicketButtonAnchor'
[Blizzard_ActionBar/Mainline/MainMenuBarMicroButtons.lua]:1850: in function 'Layout'
[Blizzard_ActionBar/Mainline/MainMenuBarMicroButtons.lua]:1914: in function 'Layout'
[Blizzard_ActionBar/Mainline/MainMenuBarMicroButtons.lua]:457: in function <...zzard_ActionBar/Mainline/MainMenuBarMicroButtons.lua:456>
[C]: ?
[C]: ?
[C]: in function 'SetParent'
[Bartender4/MicroMenu.lua]:166: in function <Bartender4/MicroMenu.lua:154>
[tail call]: ?
[C]: in function 'SetParent'
[Blizzard_ActionBar/Mainline/MainMenuBarMicroButtons.lua]:93: in function 'ResetMicroMenuPosition'
[Blizzard_ActionBarController/Mainline/ActionBarController.lua]:218: in function 'ValidateActionBarTransition'
[Blizzard_ActionBarController/Mainline/ActionBarController.lua]:175: in function <...ActionBarController/Mainline/ActionBarController.lua:143>
[C]: in function 'ActionBarController_UpdateAll'
[Blizzard_ActionBarController/Mainline/ActionBarController.lua]:66: in function <...ActionBarController/Mainline/ActionBarController.lua:55>
Locals:
self = MicroMenu {
dirty = false
childYPadding = -5
oldGridSettings = <table> {
}
layoutFramesGoingUp = false
normalScale = 1
stride = 12
layoutFramesGoingRight = true
isHorizontal = true
numButtons = 12
childXPadding = -5
}
rightMost = false
topMost = true
firstButton = CharacterMicroButton {
FlashBorder = Texture {
}
PortraitMask = MaskTexture {
}
QuickKeybindHighlightTexture = Texture {
}
Portrait = Texture {
}
tooltipText = "Character Info |cffffd200(C)|r"
Background = Texture {
}
PushedBackground = Texture {
}
layoutIndex = 1
PushedShadow = Texture {
}
Shadow = Texture {
}
commandName = "TOGGLECHARACTER0"
}
lastButton = HelpMicroButton {
FlashBorder = Texture {
}
layoutIndex = 10
textureName = "GameMenu"
FlashContent = Texture {
}
Background = Texture {
}
PushedBackground = Texture {
}
QuickKeybindHighlightTexture = Texture {
}
tooltipText = "Customer Support"
}
firstButtonX = 16
firstButtonY = 20
lastButtonX = nil
lastButtonY = nil
(*temporary) = true
(*temporary) = 2
(*temporary) = 3
(*temporary) = "attempt to compare number with nil"
PSA for anyone who is experiencing the green bag icon bug:
I believe it's a conflict caused by the newest version of Prat (3.9.64). Try installing the previous version of Prat (3.9.63) for now as this fixed the issue for me.
Same issue. happens after every /reload or character swap