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!
Monk Stagger Bar is bugged
429x ...ceShadowedUnitFrames/modules/monkstagger.lua:44: attempt to compare number with nil
[string "@ShadowedUnitFrames/modules/monkstagger.lua"]:44: in function `Update'
[string "@ShadowedUnitFrames/modules/monkstagger.lua"]:34: in function `?'
[string "@ShadowedUnitFrames/modules/units.lua"]:36: in function `FullUpdate'
[string "@ShadowedUnitFrames/modules/units.lua"]:1556: in function <ShadowedUnitFrames/modules/units.lua:1520>
Locals:
self = <table> {
moduleClass = "MONK"
moduleHasBar = true
Update = <function> defined @ShadowedUnitFrames/modules/monkstagger.lua:37
UpdateMinMax = <function> defined @ShadowedUnitFrames/modules/monkstagger.lua:30
OnEnable = <function> defined @ShadowedUnitFrames/modules/monkstagger.lua:4
OnLayoutApplied = <function> defined @ShadowedUnitFrames/modules/monkstagger.lua:24
moduleKey = "staggerBar"
moduleSpec = <table> {
}
moduleName = "Stagger bar"
OnDisable = <function> defined @ShadowedUnitFrames/modules/monkstagger.lua:20
}
frame = SUFUnitplayer {
BottomLeftCorner = Texture {
}
OnEnter = <function> defined @ShadowedUnitFrames/modules/units.lua:670
UnregisterAll = <function> defined @ShadowedUnitFrames/modules/units.lua:145
OnBackdropLoaded = <function> defined @SharedXML/Backdrop.lua:152
GetBackdropColor = <function> defined @SharedXML/Backdrop.lua:390
powerBar = StatusBar {
}
ClearBackdrop = <function> defined @SharedXML/Backdrop.lua:282
unitType = "player"
staggerBar = StatusBar {
}
highlight = Frame {
}
unitInitialized = true
unit = "player"
ReregisterUnitEvents = <function> defined @ShadowedUnitFrames/modules/units.lua:41
SetupTextureCoordinates = <function> defined @SharedXML/Backdrop.lua:214
HasBackdropInfo = <function> defined @SharedXML/Backdrop.lua:278
RegisterUnitEvent = <function> defined @ShadowedUnitFrames/modules/units.lua:112
fontStrings = <table> {
}
GetEdgeSize = <function> defined @SharedXML/Backdrop.lua:188
TopEdge = Texture {
}
unitOwner = "player"
chi = Frame {
}
fullUpdates = <table> {
}
UnregisterUpdateFunc = <function> defined @ShadowedUnitFrames/modules/units.lua:135
combatText = Frame {
}
incHeal = StatusBar {
}
SetBackdropColor = <function> defined @SharedXML/Backdrop.lua:399
LeftEdge = Texture {
}
portrait = Texture {
}
registeredEvents = <table> {
}
UnitClassToken = <function> defined @ShadowedUnitFrames/modules/units.lua:685
TopLeftCorner = Texture {
}
RegisterNormalEvent = <function> defined @ShadowedUnitFrames/modules/units.lua:62
SetVisibility = <function> defined @ShadowedUnitFrames/modules/units.lua:246
topFrameLevel = 5
ApplyBackdrop = <function> defined @SharedXML/Backdrop.lua:294
SetBackdrop = <function> defined @SharedXML/Backdrop.lua:329
GetBackdropBorderColor = <function> defined @SharedXML/Backdrop.lua:409
GetBackdrop = <function> defined @SharedXML/Backdrop.lua:347
SetRangeAlpha = <function> defined @ShadowedUnitFrames/modules/units.lua:179
visibility = <table> {
}
SetBorderBlendMode = <function> defined @SharedXML/Backdrop.lua:266
BottomEdge = Texture {
}
RightEdge = Texture {
}
isDead = false
unitRealType = "player"
unitGUID = "Player-1096-06080EF8"
Center = Texture {
}
vehicleUnit = "vehicle"
OnLeave = <function> defined @ShadowedUnitFrames/modules/units.lua:678
backdropInfo = <table> {
}
OnBackdropSizeChanged = <function> defined @SharedXML/Backdrop.lua:182
hasStateWatch = false
incAbsorb = StatusBar {
}
0 = <userdata>
SetBackdropBorderColor = <function> defined @SharedXML/Backdrop.lua:422
highFrame = Frame {
}
healthBar = StatusBar {
}
BottomRightCorner = Texture {
}
RegisterUpdateFunc = <function> defined @ShadowedUnitFrames/modules/units.lua:118
UnregisterSingleEvent = <function> defined @ShadowedUnitFrames/modules/units.lua:95
DisableRangeAlpha = <function> defined @ShadowedUnitFrames/modules/units.lua:171
SetBlockColor = <function> defined @ShadowedUnitFrames/modules/units.lua:191
TopRightCorner = Texture {
}
portraitTexture = Texture {
}
indicators = Frame {
}
BlizzRegisterUnitEvent = <function> defined =[C]:-1
In reply to Adrenaliinz: ya getting this, hundreds of errors over and over
In reply to Adrenaliinz: I don't know what the ACTUAL fix for this error is, there seems to be some change of namespace or name for the constant for the Stagger thresholds, but you can open monkstagger.lua and change :
STAGGER_YELLOW_TRANSITION to 0.3
and STAGGER_RED_TRANSITION to 0.6
and this error will stop. For some reason these variables are not being found by the addon and I don't know what changed about them, and can't seem to find a source for info on the changes.
In reply to Centias: Thank you, nice fix!
getting a bug with monk stagger
Message: ...ce/AddOns/ShadowedUnitFrames/modules/monkstagger.lua:44: attempt to compare number with nil
Time: Sun Nov 26 00:35:02 2023
Count: 1
Stack: ...ce/AddOns/ShadowedUnitFrames/modules/monkstagger.lua:44: attempt to compare number with nil
[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"]:274: in function `LoadUnits'
[string "@Interface/AddOns/ShadowedUnitFrames/ShadowedUnitFrames.lua"]:86: in function `OnInitialize'
[string "@Interface/AddOns/ShadowedUnitFrames/ShadowedUnitFrames.lua"]:932: in function <...ace/AddOns/ShadowedUnitFrames/ShadowedUnitFrames.lua:930>
Locals: self = <table> {
CheckPlayerZone = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/units.lua:1454
InitializeArena = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/units.lua:1438
headerUnits = <table> {
}
CheckGroupedUnitStatus = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/units.lua:392
CheckVehicleStatus = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/units.lua:342
CreateBar = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/units.lua:1423
canCure = <table> {
}
ProfileChanged = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/units.lua:1390
PositionHeaderChildren = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/units.lua:761
unitEvents = <table> {
}
UninitializeFrame = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/units.lua:1342
CheckUnitStatus = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/units.lua:369
LoadGroupHeader = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/units.lua:1063
OnAttributeChanged = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/units.lua:440
CheckPetUnitUpdated = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/units.lua:382
zoneUnits = <table> {
}
OnEvent = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/units.lua:211
ReloadHeader = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/units.lua:742
childUnits = <table> {
}
LoadUnit = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/units.lua:956
headerFrames = <table> {
}
LoadZoneHeader = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/units.lua:1157
LoadSplitGroupHeader = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/units.lua:999
unitFrames = <table> {
}
SetHeaderAttributes = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/units.lua:797
CheckGroupVisibility = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/units.lua:782
CreateUnit = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/units.lua:694
moduleKey = "units"
frameList = <table> {
}
InitializeFrame = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/units.lua:1323
LoadChildUnit = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/units.lua:1278
remappedUnits = <table> {
}
}
frame = SUFUnitplayer {
vehicleUnit = "vehicle"
OnEnter = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/highlight.lua:9
UnregisterAll = <function> defined @Interface/AddOns/ShadowedUnitFrames/modules/units.lua:145
OnBackdropLoaded = <function> defined @Interface/SharedXML/Backdrop.lua:152
GetBackdropColor = <function> defined @Interface/SharedXML/Backdrop.lua:390
powerBar = StatusBar {
}
disableRangeAlpha = true
ClearBackdrop = <function> def
Shaman mana bar option for enh and ele. This for some reason applys to resto aswell. its awkward to see 2 mana bars
In reply to elvuson: Unfortunately I think this addon is just no longer maintained, they don't care, because this issue is still there since July :(
I love the look and functionality of this addon. I had to disable though because it dropped my FPS by 15 in Valdrakken. In 2k it dropped to 30FPS even after lowering many graphics settings.
AMD Ryzen 5600x
AMD 6950xt
32gb Ram
Win11
Please please fix the lack of color options. Not sure if it's a classic only problem, but someone else reported it below. Here's what it looks like: https://i.ibb.co/s3vyLjB/Screenshot-1.png
Advanced options are turned on, etc. No way to customize a static color, mana, or cast bar, etc.
me three
In reply to Skewhaze: I made a report, but for the moment as i dont know how to fix it better i found how to temporally fix it.
In the file monkstagger.lua, linke 44 and 46.
Change the stagger_yellow_transition by "30" and the red on by 60 (found info that said it change at these percent). I couldnt find how it's supposed to be writed so i just changed it into flat number.
Should looks like this :
if( percent < 30 ) then
state = "STAGGER_GREEN"
elseif( percent < 60 ) then
state = "STAGGER_YELLOW"
else
state = "STAGGER_RED"
end
Hi! any chance to update to 10.2 ?
sup, I play classic hc and the frames don't get populated with buffs/debuffs when unlocked for setup which is kinda tedious. Someone got a solution?
Changes in the API are now protecting range checking access to addons. So for now, in order to stop the errors, turn off the range check feature in SUF options for the 'target'. until a fix is uploaded officially.
I am not the creator nor maintainer of this addon, just a simple user and enjoyer of it. That being said Blizzard made some changes to the WOW Api in order to break addons that trivialize difficult raid content. 'Check Unit Status' is now a protected function. I am going to have a quick look at the lua files. specifically units.lua. but ideally the original creator or someone that maintains this would need to update it and send a new version out for release. until then u can ignore the errors using bug grabber or similar lua error catcher. Or, and not ideally, turn the addon off. There are certainly other frame addon options but they are all in the same boat until a fix is put out.
In reply to 420psilo: both seem not to care anymore lol last update was like so long ago. have u found a temp fix for it and paste here?
Me too!
Feature request: pet color bar option for happiness
I get this error every second on monk tank.
3103x ...ceShadowedUnitFrames/modules/monkstagger.lua:44: attempt to compare number with nil
[string "@ShadowedUnitFrames/modules/monkstagger.lua"]:44: in function `Update'
[string "@ShadowedUnitFrames/modules/monkstagger.lua"]:34: 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"]:274: in function `LoadUnits'
[string "@ShadowedUnitFrames/ShadowedUnitFrames.lua"]:86: in function `OnInitialize'
[string "@ShadowedUnitFrames/ShadowedUnitFrames.lua"]:932: in function <...aceShadowedUnitFrames/ShadowedUnitFrames.lua:930>
Locals:
self = <table> {
moduleClass = "MONK"
moduleHasBar = true
Update = <function> defined @ShadowedUnitFrames/modules/monkstagger.lua:37
UpdateMinMax = <function> defined @ShadowedUnitFrames/modules/monkstagger.lua:30
OnEnable = <function> defined @ShadowedUnitFrames/modules/monkstagger.lua:4
OnLayoutApplied = <function> defined @ShadowedUnitFrames/modules/monkstagger.lua:24
moduleKey = "staggerBar"
moduleSpec = <table> {
}
moduleName = "Stagger bar"
OnDisable = <function> defined @ShadowedUnitFrames/modules/monkstagger.lua:20
}
frame = SUFUnitplayer {
0 = <userdata>
OnEnter = <function> defined @ShadowedUnitFrames/modules/units.lua:670
UnregisterAll = <function> defined @ShadowedUnitFrames/modules/units.lua:145
OnBackdropLoaded = <function> defined @SharedXML/Backdrop.lua:152
auras = <table> {
}
GetBackdropColor = <function> defined @SharedXML/Backdrop.lua:390
powerBar = StatusBar {
}
ClearBackdrop = <function> defined @SharedXML/Backdrop.lua:282
unitType = "player"
staggerBar = StatusBar {
}
indicators = Frame {
}
unitInitialized = true
unit = "player"
ReregisterUnitEvents = <function> defined @ShadowedUnitFrames/modules/units.lua:41
SetupTextureCoordinates = <function> defined @SharedXML/Backdrop.lua:214
HasBackdropInfo = <function> defined @SharedXML/Backdrop.lua:278
RegisterUnitEvent = <function> defined @ShadowedUnitFrames/modules/units.lua:112
fontStrings = <table> {
}
GetEdgeSize = <function> defined @SharedXML/Backdrop.lua:188
TopEdge = Texture {
}
unitOwner = "player"
fullUpdates = <table> {
}
UnregisterUpdateFunc = <function> defined @ShadowedUnitFrames/modules/units.lua:135
combatText = Frame {
}
incHeal = StatusBar {
}
FullUpdate = <function> defined @ShadowedUnitFrames/modules/units.lua:33
portraitModel = PlayerModel {
}
portrait = PlayerModel {
}
registeredEvents = <table> {
}
UnitClassToken = <function> defined @ShadowedUnitFrames/modules/units.lua:685
TopLeftCorner = Texture {
}
RegisterNormalEvent = <function> defined @ShadowedUnitFrames/modules/units.lua:62
SetVisibility = <function> defined @ShadowedUnitFrames/modules/units.lua:246
topFrameLevel = 5
ApplyBackdrop = <function> defined @SharedXML/Backdrop.lua:294
SetBackdrop = <function> defined @SharedXML/Backdrop.lua:329
GetBackdropBorderColor = <function> defined @SharedXML/Backdrop.lua:409
GetBackdrop = <function> defined @SharedXML/Backdrop.lua:347
SetRangeAlpha = <function> defined @ShadowedUnitFrames/modules/units.lua:179
visibility = <table> {
}
SetBorderBlendMode = <function> defined @SharedXML/Backdrop.lua:266
isDead = false
unitGUID = "Player-1615-0A31A28A"
Center = Texture {
}
unitRealType = "player"
RightEdge = Texture {
}
LeftEdge = Texture {
}
BottomEdge = Texture {
}
highFrame = Frame {
}
backdropInfo = <table> {
}
OnBackdropSizeChanged = <function> defined @SharedXML/Backdrop.lua:182
OnLeave = <function> defined @ShadowedUnitFrames/modules/units.lua:678
incAbsorb = StatusBar {
}
comboPoints = Frame {
}
vehicleUnit = "vehicle"
BottomRightCorner = Texture {
}
BottomLeftCorner = Texture {
}
SetBackdropBorderColor = <function> defined @SharedXML/Backdrop.lua:422
healthBar = StatusBar {
}
TopRightCorner = Texture {
}
UnregisterSingleEvent = <function> defined @ShadowedUnitFrames/modules/units.lua:95
DisableRangeAlpha = <function> defined @ShadowedUnitFrames/modules/units.lua:171
RegisterUpdateFunc = <function> defined @ShadowedUnitFrames/modules/units.lua:118
SetBlockColor = <function> defined @ShadowedUnitFrames/modules/units.lua:191
SetBarColor = <function> defined @AddOn
Seem to be missing all color options in General > Color aside from High-Low Health options. Advanced mode is on and creating a new profile does not fix the issue. Also tried turning off all other addons and reinstalling SUF entirely. Importing another profile works to make the options show however, only on said profile.