Shadowed Unit Frames
SUF focuses on a simple configuration while maintaining the flexibility that most users will care about, preventing unnecessary bloating of the addon that sacrifices performance. While you aren't going to be able to set the health bar to be exactly 3.14 pixels outside of the unit frames, you can change options you actually care about such as bar height, ordering, frame height and so on. To speed up configuration, you can configure multiple units at the same time through the global configuration. For example, if you want to set the height of the Player, Target, Focus and Party frames to 50 then the height of Target's Target, Target's Target of Target, Focus Target to 30 you can easily do this by changing two options instead of having to do it seven times.
However, should you need a little bit of extra configuration do not despair! An advanced option is included that will unlock additional configuration giving finer control over the configuration.
Shadowed Unit Frames in WoW Classic
There is in-development Beta versions available for WoW Classic!
Note that WoW Classic does not provide all the information that you might be used to:
- There is no Focus Frame
- Information about the HP of enemies is not available, and they'll show as 100 HP
- Cast Bars for anyone but the player himself are not available
- Debuffs have no duration information
Some of this data can be restored with additional libraries/addons, but it'll always be guesswork and potentially inaccurate. Shadowed Unit Frames comes bundled with LibClassicDurations for debuff durations. Mob HP can be provided by Real Mob Health, which you need to install manually.
Note on copying your layout from Retail to Classic:
In general you cannot copy your layout between the two versions, since they are quite different, and doing so will result in certain elements exclusive to one version (like Pet Happiness on Classic) not always working properly. There are some provisions in the code that makes copying from Retail to Classic mostly work, use at your own risk - however, never copy a Layout from Classic to Retail, this will absolutely result in the Class-specific power bars and other elements not available on Classic to cease to function.
Slash commands: /shadoweduf (/suf)
Anchoring
Are you driven crazy by your party frames not aligning up exactly with your player frames, even if it's only half a pixel off? The anchoring system will let you solve all alignment issues, by allowing you to anchor a frame to another and set a simple offset from the frame it is anchored to, or by manually setting the X/Y position of the frame.
Using the screen shot as an example, if you drag the player frame the other frames will move with the player frame preserving the alignment and spacing. Each frame can still be manually positioned wherever you want, but this gives you a way of easily anchoring and moving frames around without having to use a ruler.
Zone configuration (Disabling options/units by zone type)
Units and modules can be enabled or disabled based on the type of zone you are in. For example, if you want to see party targets and party pets while you are in an arena but nowhere else then you can use the visibility options to enable it only while inside an arena. Modules can also be disabled by zone type, if you want to see party auras while in a raid instance but nowhere else you can disable the module in raid instances only.
Profiles do not have to be swapped and it is all automatic.
Units
Supports unit frames are as follows:
Player: Player, Pet, Pet Target
General: Target, Target of Target, Target of Target of Target, Focus, Focus Target
Party: Party, Party Pets, Party Targets, Party ToT
Raid: Raid, Raid Pet, Main Tank, Main Tank Target, Main Assist, Main Assist Target, Boss, Boss Target, Boss ToT, Main Assist ToT, Main Tank ToT
Arena: Arena, Arena Target, Arena Pets, Arena ToT
Battleground: Battleground, Battleground Target, Battleground Target
Features
- Tags: Includes a simple tagging system that can be customized in virtually any way using Lua, even if something isn't included by default odds are you can make the tags
- Incoming Heals: Supports the Blizzard Events for incoming heal data, no external libraries needed
- Auras: Can be set to only show auras you casted, or can cast on others. Can enlarge auras that you casted, and hide the cooldown ring on the timers of auras you didn't cast as well to make it more obvious which ones you casted and which ones you didn't
- Aura Timers: You will need a mod such as OmniCC to show timers on buffs and debuffs
- Aura Indicators: Display colored squares or icons for certain auras on any unit
- Fader: Fades frames when out of combat and inactive (100% mana/no target)
- Class Power (Eclipse, Holy Power, etc): Supports all of the class power features from Eclipse to Burning Embers.
- Highlighting: Border highlighting of frames based on mousing over them, curable debuffs, aggro or you are targeting/focusing them
- Range Checking: Fades frames out that are out of range of you
- Exportable Layouts: If you have a layout, or your friend has a layout you want to try out you can export/import SUF layouts by going to /suf -> Layout Manager
- Profiles: You can change from any profile to another one without reloading your UI, should you want to use a completely different layout based on zone you can easily switch profiles without hassle
Pretty much all the general unit frame settings are in, health bars, cast bars, power bars, portraits, indicators and so on.
Modules
Basic module support is included, should you be interested in building a module see the documentation on github for more information.
Feedback
For feature requests and bug reports, please continue to use the Ticket tracker. Feel free to ask on the thread first, if you're unsure what to do!
How do I add more translations so they can be incorporated into the addon?
I haven't been able to save my UI in Edit Mode with SUF enabled. Anyone else getting that?
In reply to Townie: Same for me
Quick fix:
in health.lua and highlight.lua add in the beggining of each file following code
local UnitDebuff = function ( unit, index, filter )
return AuraUtil.UnpackAuraData( C_UnitAuras.GetDebuffDataByIndex( unit, index, filter ) )
end
In reply to RYankov: it worked. The LUA errors have stopped.
In reply to RYankov: Thank you very much!
Definitely busted since the August 13th update. Party frames are wonky asf.
8/13, runic power on my player frame isn't tracking - it's just showing 0.
8/14 The party frames are not properly tracking buffs and debuffs. However the player and target frames still are.
In reply to Tazmagor:
Raid frames buff/debuff tracking is also not working.
Hello! I'm getting this pretty constantly as of today (Aug. 14) and I don't know which part of SUF it's saying is busted. It doesn't look like it's the XP thing?
48x ...faceShadowedUnitFrames/modules/highlight.lua:182: attempt to call global 'UnitDebuff' (a nil value)
[string "@ShadowedUnitFrames/modules/highlight.lua"]:182: in function `?'
[string "@ShadowedUnitFrames/modules/units.lua"]:36: in function `FullUpdate'
[string "@ShadowedUnitFrames/modules/units.lua"]:375: in function `CheckUnitStatus'
[string "@ShadowedUnitFrames/modules/units.lua"]:614: in function <ShadowedUnitFrames/modules/units.lua:440>
[string "=[C]"]: in function `SetAttribute'
[string "@ShadowedUnitFrames/modules/units.lua"]:964: in function `LoadUnit'
[string "@ShadowedUnitFrames/modules/units.lua"]:1337: in function `InitializeFrame'
[string "@ShadowedUnitFrames/ShadowedUnitFrames.lua"]:281: in function `LoadUnits'
[string "@ShadowedUnitFrames/ShadowedUnitFrames.lua"]:86: in function `OnInitialize'
[string "@ShadowedUnitFrames/ShadowedUnitFrames.lua"]:947: in function <...aceShadowedUnitFrames/ShadowedUnitFrames.lua:945>
Locals:
self = <table> {
moduleKey = "highlight"
moduleName = "Highlight"
}
frame = SUFUnitplayer {
BottomLeftCorner = Texture {
}
powerBar = StatusBar {
}
emptyBar = StatusBar {
}
priestBar = StatusBar {
}
highlight = Frame {
}
unitInitialized = true
unit = "player"
fontStrings = <table> {
}
TopEdge = Texture {
}
unitOwner = "player"
fullUpdates = <table> {
}
combatText = Frame {
}
BottomRightCorner = Texture {
}
portraitModel = PlayerModel {
}
portrait = PlayerModel {
}
registeredEvents = <table> {
}
TopLeftCorner = Texture {
}
topFrameLevel = 5
altPowerBar = StatusBar {
}
visibility = <table> {
}
isDead = false
unitRealType = "player"
unitGUID = "Player-3683-09F9152F"
Center = Texture {
}
vehicleUnit = "vehicle"
backdropInfo = <table> {
}
RightEdge = Texture {
}
LeftEdge = Texture {
}
BottomEdge = Texture {
}
highFrame = Frame {
}
healthBar = StatusBar {
}
TopRightCorner = Texture {
}
unitType = "player"
indicators = Frame {
}
healAbsorb = StatusBar {
}
}
id = 1
(*temporary) = nil
(*temporary) = "player"
(*temporary) = 1
(*temporary) = "attempt to call global 'UnitDebuff' (a nil value)"
canCure = <table> {
}
I opened this PR https://github.com/Nevcairiel/ShadowedUnitFrames/pull/51 that fixes the problem with the XP/rep bar showing. It's a simple change to make locally while you wait for an official fix. In the xp.lua change
local name, reaction, min, max, current = GetWatchedFactionInfo()
if( not name ) then
frame.xpBar.rep:Hide()
return
end
to
local factionData = C_Reputation.GetWatchedFactionData()
if( not factionData ) then
frame.xpBar.rep:Hide()
return
end
local name, reaction, min, max, current = factionData.name, factionData.reaction, factionData.currentReactionThreshold, factionData.nextReactionThreshold, factionData.currentStanding
In reply to sterrosa:
Thanks for your link and information, it now works.
Since 11.0.0 I cannot see the xp bar.
I have unchecked the xp bar reloaded and then rechecked without success.
It seems to be there as when I check uncheck the resource bar expand contracts as if the xp bar is coloured black, yet I cannot find a colour selector for the xp bar.
Is this a known issue? how do I fix this?
awesome, ty. I will try that! :)
I hope this can be fixed soon, bc it's annoying and pops up a LUA error every 60 seconds. If anybody has a workaround other than disabling the addon that would be appreciated.
In reply to thebl4ckd0g: I am also getting this error on load (and after every /reload) using SUF v4.4.9. You can make the error go away for now by disabling the XP/Rep bar in SUF.
Type /suf to enter settings -> Unit Configuration -> Player -> Bars (tab at top) -> Class/misc bars -> uncheck "Enable XP/Rep bar", then close the settings and type /reload.
Getting the following error as soon as I login the game (there are actually 4 of them; AtlasLoot seems to be erroring out with the same thing):
Message: Interface/AddOns/ShadowedUnitFrames/modules/xp.lua:89: attempt to call global 'GetWatchedFactionInfo' (a nil value)
Time: Thu Aug 1 17:58:24 2024
Count: 1
Stack: Interface/AddOns/ShadowedUnitFrames/modules/xp.lua:89: attempt to call global 'GetWatchedFactionInfo' (a nil value)
[string "@Interface/AddOns/ShadowedUnitFrames/modules/xp.lua"]:89: in function `UpdateRep'
[string "@Interface/AddOns/ShadowedUnitFrames/modules/xp.lua"]:139: in function `?'
[string "@Interface/AddOns/ShadowedUnitFrames/modules/units.lua"]:36: in function `FullUpdate'
[string "@Interface/AddOns/ShadowedUnitFrames/modules/units.lua"]:375: in function `CheckUnitStatus'
[string "@Interface/AddOns/ShadowedUnitFrames/modules/units.lua"]:614: in function <...nterface/AddOns/ShadowedUnitFrames/modules/units.lua:440>
[string "=[C]"]: in function `SetAttribute'
[string "@Interface/AddOns/ShadowedUnitFrames/modules/units.lua"]:964: in function `LoadUnit'
[string "@Interface/AddOns/ShadowedUnitFrames/modules/units.lua"]:1337: in function `InitializeFrame'
[string "@Interface/AddOns/ShadowedUnitFrames/ShadowedUnitFrames.lua"]:281: in function `LoadUnits'
[string "@Interface/AddOns/ShadowedUnitFrames/ShadowedUnitFrames.lua"]:86: in function `OnInitialize'
[string "@Interface/AddOns/ShadowedUnitFrames/ShadowedUnitFrames.lua"]:947: in function <...ace/AddOns/ShadowedUnitFrames/ShadowedUnitFrames.lua:945>
Locals: self = <table> {
moduleHasBar = true
moduleKey = "xpBar"
moduleName = "XP/Rep bar"
}
frame = SUFUnitplayer {
vehicleUnit = "vehicle"
auras = <table> {
}
castBar = Frame {
}
powerBar = StatusBar {
}
unitType = "player"
highlight = Frame {
}
unitInitialized = true
unit = "player"
fontStrings = <table> {
}
TopEdge = Texture {
}
unitOwner = "player"
fullUpdates = <table> {
}
combatText = Frame {
}
incHeal = StatusBar {
}
portraitModel = PlayerModel {
}
portrait = PlayerModel {
}
registeredEvents = <table> {
}
topFrameLevel = 5
visibility = <table> {
}
isDead = false
unitGUID = "Player-53-004C85DE"
Center = Texture {
}
RightEdge = Texture {
}
LeftEdge = Texture {
}
unitRealType = "player"
BottomEdge = Texture {
}
BottomRightCorner = Texture {
}
highFrame = Frame {
}
backdropInfo = <table> {
}
BottomLeftCorner = Texture {
}
incAbsorb = StatusBar {
}
comboPoints = Frame {
}
TopRightCorner = Texture {
}
TopLeftCorner = Texture {
}
healthBar = StatusBar {
}
altPowerBar = StatusBar {
}
indicators = Frame {
}
xpBar = Frame {
}
healAbsorb = StatusBar {
}
unitEventOverrides = <table> {
}
}
(*temporary) = nil
(*temporary) = "attempt to call global 'GetWatchedFactionInfo' (a nil value)"
L = <table> {
Turns this widget into a bar that can be resized and ordered just like health and power bars. = "Turns this widget into a bar that can be resized and ordered just like health and power bars."
Whether to show any debuffs you can remove, cure or steal. = "Whether to show any debuffs you can remove, cure or steal."
Ready Status = "Ready Status"
Screen = "Screen"
Health bar color used as the transitional color for 50% -> 0% on players, as well as when your pet is very unhappy. = "Health bar color used as the transitional color for 50% -> 0% on players, as well as when your pet is very unhappy."
Health bar color used as the transitional color for 100% -> 50% on players, as well as when your pet is happy. = "Health bar color used as the transitional color for 100% -> 50% on players, as well as when your pet is happy."
Priest mana bar = "Priest mana bar"
Raid = "Raid"
Adds totem bars with timers before they expire to the player frame. = "Adds totem bars with timers before they expire to the player frame."
Disabled in %s = "Disabled in %s"
If the unit has heals incoming, it will show the absolute incoming heal value, otherwise it will show the units name. = "If the unit has heals incoming, it will show the absolute incoming heal value, otherwise it will show the units name."
Food = "Food"
D
Greetings! Moving cursor over frame produces these two errors. Hope this helps!
28x ...faceShadowedUnitFrames/modules/highlight.lua:15: attempt to call field 'OnEnter' (a nil value)
[string "@ShadowedUnitFrames/modules/highlight.lua"]:15: in function `OnEnter'
[string "@ShadowedUnitFrames/modules/units.lua"]:660: in function <ShadowedUnitFrames/modules/units.lua:658>
Locals:
frame = SUFUnittarget {
BottomLeftCorner = Texture {
}
auras = <table> {
}
RightEdge = Texture {
}
unitType = "target"
indicators = Frame {
}
unitInitialized = true
unit = "target"
fontStrings = <table> {
}
TopEdge = Texture {
}
unitOwner = "target"
fullUpdates = <table> {
}
incHeal = StatusBar {
}
LeftEdge = Texture {
}
Center = Texture {
}
unitGUID = "Player-162-0BA28304"
highFrame = Frame {
}
registeredEvents = <table> {
}
topFrameLevel = 5
isDead = false
altPowerBar = StatusBar {
}
visibility = <table> {
}
highlight = Frame {
}
unitRealType = "target"
backdropInfo = <table> {
}
hasStateWatch = false
incAbsorb = StatusBar {
}
TopLeftCorner = Texture {
}
healthBar = StatusBar {
}
BottomEdge = Texture {
}
BottomRightCorner = Texture {
}
TopRightCorner = Texture {
}
originalUnit = "target"
healAbsorb = StatusBar {
}
isUnitVolatile = true
}
(*temporary) = nil
(*temporary) = SUFUnittarget {
BottomLeftCorner = Texture {
}
auras = <table> {
}
RightEdge = Texture {
}
unitType = "target"
indicators = Frame {
}
unitInitialized = true
unit = "target"
fontStrings = <table> {
}
TopEdge = Texture {
}
unitOwner = "target"
fullUpdates = <table> {
}
incHeal = StatusBar {
}
LeftEdge = Texture {
}
Center = Texture {
}
unitGUID = "Player-162-0BA28304"
highFrame = Frame {
}
registeredEvents = <table> {
}
topFrameLevel = 5
isDead = false
altPowerBar = StatusBar {
}
visibility = <table> {
}
highlight = Frame {
}
unitRealType = "target"
backdropInfo = <table> {
}
hasStateWatch = false
incAbsorb = StatusBar {
}
TopLeftCorner = Texture {
}
healthBar = StatusBar {
}
BottomEdge = Texture {
}
BottomRightCorner = Texture {
}
TopRightCorner = Texture {
}
originalUnit = "target"
healAbsorb = StatusBar {
}
isUnitVolatile = true
}
(*temporary) = "attempt to call field 'OnEnter' (a nil value)"
Highlight = <table> {
moduleKey = "highlight"
moduleName = "Highlight"
}
28x ...faceShadowedUnitFrames/modules/highlight.lua:24: attempt to call field 'OnLeave' (a nil value)
[string "@ShadowedUnitFrames/modules/highlight.lua"]:24: in function `OnLeave'
[string "@ShadowedUnitFrames/modules/units.lua"]:666: in function <ShadowedUnitFrames/modules/units.lua:664>
Locals:
frame = SUFUnittarget {
BottomLeftCorner = Texture {
}
auras = <table> {
}
RightEdge = Texture {
}
unitType = "target"
indicators = Frame {
}
unitInitialized = true
unit = "target"
fontStrings = <table> {
}
TopEdge = Texture {
}
unitOwner = "target"
fullUpdates = <table> {
}
incHeal = StatusBar {
}
LeftEdge = Texture {
}
Center = Texture {
}
unitGUID = "Player-162-0BA28304"
highFrame = Frame {
}
registeredEvents = <table> {
}
topFrameLevel = 5
isDead = false
altPowerBar = StatusBar {
}
visibility = <table> {
}
highlight = Frame {
}
unitRealType = "target"
backdropInfo = <table> {
}
hasStateWatch = false
incAbsorb = StatusBar {
}
TopLeftCorner = Texture {
}
healthBar = StatusBar {
}
BottomEdge = Texture {
}
BottomRightCorner = Texture {
}
TopRightCorner = Texture {
}
originalUnit = "target"
healAbsorb = StatusBar {
}
isUnitVolatile = true
}
(*temporary) = nil
(*temporary) = SUFUnittarget {
BottomLeftCorner = Texture {
}
auras = <table> {
}
RightEdge = Texture {
}
unitType = "target"
indicators = Frame {
}
unitInitialized = true
unit = "target"
fontStrings = <table> {
}
TopEdge = Texture {
}
unitOwner = "target"
fullUpdates = <table> {
}
incHeal = StatusBar {
}
LeftEdge = Texture {
}
Center = Texture {
}
unitGUID = "Player-162-0BA28304"
highFrame = Frame {
}
registeredEvents = <table> {
}
topFrameLevel = 5
isDead = false
altPowerBar = StatusBar {
}
visibility = <table> {
}
highlight = Frame {
}
unitRealType = "target"
backdropInfo = <table> {
}
hasStateWatch = false
incAbsorb = StatusBar {
}
TopLeftCorner = Texture {
}
healthBar = StatusBar {
}
BottomEdge = Texture {
}
BottomRightCorner = Texture {
}
TopRightCorner = Texture {
}
originalUnit = "target"
healAbsorb = StatusBar {
}
isUnitVolatile = true
}
(*temporary) = "attempt to call field 'OnLeave' (a nil value)"
Highlight = <table> {
moduleKey = "highlight"
moduleName = "Highlight"
}
Report 1: Hello i am using suf for cataclysm classic: i am getting this lua Error, it began to appear when i started using the option Range Indicator in boss frames
1x [ADDON_ACTION_BLOCKED] AddOn 'ShadowedUnitFrames' tried to call the protected function 'CheckInteractDistance()'.
[string "@!BugGrabber/BugGrabber.lua"]:485: in function <!BugGrabber/BugGrabber.lua:485>
[string "=[C]"]: in function `CheckInteractDistance'
[string "@ShadowedUnitFrames/modules/range.lua"]:53: in function <ShadowedUnitFrames/modules/range.lua:33>
Locals:
Skipped (In Encounter)
Report 2: Cataclysm suf, there is a problem with range check for classes, when i am in my mage and i need to see if my priest for power infusion is in range (40 yd) in raid frames is fine, but when i am in my warlock is not showing 40 yd range in raid frame it fade at 30 yd, and i though my priest is too far when he is not, the config is the same for my warlock and mage so is something with range per class