promotional bannermobile promotional banner

Project Roth

Project Roth is the revival of an old classic wow UI mod called Roth_UI modeled after Diablo UI. Revival has tried to keep it as close to original with new features and the ability to work with new interfce standards.

File Details

Roth_UI_v2.3.0.zip

  • R
  • Apr 24, 2026
  • 4.90 MB
  • 18
  • 2.5.5+4
  • Classic TBC

File Name

Roth_UI_v2.3.0.zip

Supported Versions

  • 2.5.5
  • 2.5.4
  • 2.5.3
  • 2.5.2
  • 2.5.1

Version 2.3.0 - Comprehensive Taint & Anniversary Compatibility Overhaul
--------------------------------------------------------------------------

SHINYBUFFS - FULL ANNIVERSARY EDITION REWRITE:
• Complete rewrite of ShinyBuffs to work with Anniversary Edition's modern
  BuffFrame/DebuffFrame API (BuffFrame.auraFrames / DebuffFrame.auraFrames)
• Dual-API engine: auto-detects modern vs legacy (BuffButton globals) API at
  login and uses the appropriate skinning path
• Modern API hooks: BuffFrame.UpdateAuraButtons, DebuffFrame.UpdateAuraButtons,
  BuffFrame.UpdateGridLayout, DebuffFrame.UpdateGridLayout — skins are applied
  after every Blizzard aura update, not on a timer
• UNIT_AURA event fallback with 0.15s debounce for redundancy
• Initial skin applied 0.5s after PEW to ensure Blizzard setup is complete
• IsSkinnableAura() guard filters out PrivateAuraAnchors and incomplete frames
• Shared duration bar driver (SB_DurationDriver) replaces per-icon OnUpdate
  handlers — single OnUpdate iterates all active bars at 0.1s interval
• Duration bars support both modern buttonInfo.expirationTime and legacy
  UnitBuff/UnitDebuff fallback for timer accuracy
• /sbdiag debug command prints API mode, frame counts, shown counts, and
  attempts a manual skin pass for troubleshooting

SHINYBUFFS - LAYOUT ENGINE:
• New layout system drives Blizzard's AuraContainer grid properties directly:
  iconStride, addIconsToRight, addIconsToTop, iconPadding
• ComputePadding() calculates correct iconPadding accounting for custom skin
  size, backdrop insets, and duration bar height
• Buffs Per Row slider (2-32) — controls how many buffs before wrapping
• Debuffs Per Row slider (2-32) — independent from buff row count
• Buff/Debuff Growth Direction dropdowns:
  - Horizontal: Left to Right / Right to Left
  - Vertical: Top to Bottom / Bottom to Top
• Buff Size slider (20-60px) — resizes buff icons, backgrounds, and bars live
• Debuff Size slider (20-60px) — independent from buff size
• Buff Padding slider (-10 to +30) — extra spacing between buff icons
• Debuff Padding slider (-10 to +30) — independent from buff padding
• All layout sliders apply changes in real-time as the slider moves (no
  confirm needed) via ApplyLayoutSettings() → UpdateGridLayout() → Reskin

SHINYBUFFS - OPTIONS PANEL:
• Full AceConfig options panel under Escape > Options > AddOns > ShinyBuffs
• Text Options: Font selector (LSM), Font Flag (None/Outline/Mono Outline),
  White Duration Text toggle, Who Cast tooltip toggle
• Buff Font Sizes: Duration size, Count size sliders (6-24)
• Debuff Font Sizes: Duration size, Count size sliders (6-24)
• Skin Options: Border texture/width/color (or by-class), Debuff Type Border
  toggle, Debuff Overlay Alpha, Statusbar texture/color (or by-class),
  Background texture/color (or by-class)
• Layout Options: X/Y Offset inputs, Show Anchor toggle, Buffs/Debuffs per
  row, growth directions, frame sizes, padding
• Profile: Character-specific settings toggle, Copy from Default, Profile Reset

MOVABLE BUFFS & DEBUFFS:
• Integrated MovableBuffs module into Roth_UI (no longer a separate addon)
  - Drag anchor frame with "Buffs - Drag Me" label
  - `/roth movebuffs` toggles buff frame lock/unlock (drag to reposition)
  - `/roth resetbuffs` resets buff frame to default position
  - Position saved per-character via Roth_UI_DB_GLOB.movableBuffs
  - AuraContainer locked to center of anchor for consistent buff placement
• New MovableDebuffs module mirroring buff anchor system
  - Separate drag anchor with "Debuffs - Drag Me" label
  - `/roth movedebuffs` toggles debuff frame lock/unlock
  - `/roth resetdebuffs` resets debuff frame to default position
  - Position saved per-character via Roth_UI_DB_GLOB.movableDebuffs
• Both modules use deferred SetPoint via dirty flag + OnUpdate to minimize taint
• Buff/debuff anchors grow from center of drag handle regardless of growth
  direction (up/down) for intuitive placement

TARGET FRAME DEBUFF SIZING:
• Added target frame debuff size slider to Roth UI options panel
  (Escape > Options > AddOns > Roth UI)
• Adjustable via `/roth` settings — changes apply in real-time

TAINT ELIMINATION - ACTION BARS (6 files):
• Replaced direct SetAlpha/ClearAllPoints/SetPoint on MainMenuBar with
  RegisterStateDriver(MainMenuBar, "visibility", "hide") — runs in secure
  context, zero taint (bar1.lua)
• Same RegisterStateDriver fix applied to MultiBarBottomLeft (bar2.lua),
  MultiBarBottomRight (bar3.lua), MultiBarRight + MultiBarLeft (bar4.lua),
  and MultiBarLeft (bar5.lua)
• Removed all SetAlpha(0)/EnableMouse(false)/ClearAllPoints()/SetPoint(-5000)
  patterns on Blizzard multi-bar frames — these tainted EditMode and propagated
  to CompactPartyFrame:SetSize() via ADDON_ACTION_BLOCKED

TAINT ELIMINATION - HIDE_BLIZZART.LUA:
• Removed MicroButtonAndBagsBar, EditModeExpandedState, and
  MainMenuBarVehicleLeaveButton from the framesToHide list (all secure frames)
• Removed blind iteration of MainMenuBar:GetChildren() and
  MainMenuBarArtFrame:GetChildren() that called SetAlpha(0)/Hide() on every
  non-action-button child — major taint source
• Removed ActionBarController child modifications

TAINT ELIMINATION - MICROMENU.LUA:
• Removed MainMenuBar:ClearAllPoints() and MainMenuBar:SetScript("OnShow", nil)
  — both directly tainted MainMenuBar
• Removed MicroMenuContainer width/height/position syncing code that wrote to
  a Blizzard-managed frame

TAINT ELIMINATION - CAST BARS (4 files):
• Removed CastingBarFrame.Show = CastingBarFrame.Hide method replacement in
  oUF castbar.lua, units/player.lua, units/pet.lua, and UITweaks.lua
• Replacing Show on Blizzard frames spreads taint through every secure code
  path that later calls Show — now uses UnregisterAllEvents + Hide only

TAINT ELIMINATION - CHAT:
• Replaced global FCF_FadeInChatFrame/FCF_FadeOutChatFrame/FCFTab_UpdateColors
  function replacements with hooksecurefunc — replacing Blizzard globals taints
  the entire FCF chat frame pipeline
• Fixed CombatLogQuickButtonFrame_Custom HookScript("OnShow", .Hide) infinite
  loop — now uses SetAlpha(0) + EnableMouse(false)
• Removed duplicate CHAT_FONT_HEIGHTS mutation (RothFont handles it)

TAINT ELIMINATION - BUFF/DEBUFF SYSTEM:
• Replaced GameTooltip.SetUnitAura method table replacement in ShinyBuffs with
  hooksecurefunc — method replacement taints tooltip execution paths
• Replaced BuffFrame_UpdateAllBuffAnchors global replacement with hooksecurefunc
• Guarded rButtonTemplate hooks for BuffFrame_UpdateAllBuffAnchors and
  DebuffButton_UpdateAnchors with existence checks (may not exist on Anniversary)
• MovableBuffs/MovableDebuffs: Deferred all SetPoint hook work to next frame
  via dirty flag + OnUpdate — hooks now only set a boolean, zero frame
  modifications inside hook bodies

TAINT ELIMINATION - MINIMAP:
• Replaced hooksecurefunc(btn, "Show", ...) on minimap buttons (LFG, tracking,
  calendar, zoom) with a lightweight periodic repositioner — Show hooks spread
  taint through secure button paths
• Changed Minimap:SetScript("OnMouseWheel") to HookScript to preserve existing
  scroll behavior

TAINT ELIMINATION - OTHER:
• Removed ZoneTextFrame/SubZoneTextFrame SetFrameStrata modification in
  target.lua (Blizzard notification frames)
• Removed dead event handler block in ouf.lua referencing undefined globals
  (toggleHeaders, id, isHacked, shouldHack) — was non-functional but hazardous

CRASH FIXES:
• Fixed rLib:CopyTable calling undefined copyTable() — now correctly calls
  rLib:CopyTable recursively
• Added SpellFlyout nil guard in framefader.lua — SpellFlyout does not exist
  on TBC Anniversary, caused Lua error on load
• Added missing defaultFadeIn/defaultFadeOut definitions in framefader.lua —
  rButtonBarFader would crash when called without explicit fade params

ANNIVERSARY EDITION API COMPATIBILITY:
• Defined ALTERNATE_POWER_INDEX in oUF power.lua with Enum fallback — was
  referencing undefined nil global
• Guarded UnitAlternatePowerInfo with existence check
• Guarded GetSpecializationInfoByID/GetArenaOpponentSpec in oUF health.lua
  and power.lua — these APIs may not exist on TBC Anniversary
• Guarded UnitIsTapDenied with existence check in health.lua and power.lua
• Fixed pvp.lua prestige detection — was using tocVersion >= 70000 which
  incorrectly activates on Anniversary; now checks UnitPrestige/GetPrestigeInfo
  API existence directly
• Fixed GetTalentInfo(3,2,1) in core/bars.lua — was using MoP-style 3-param
  call; now uses pcall with TBC-correct 2-param call and MAX_COMBO_POINTS fallback
• Guarded all retail-only constants in oUF classicons.lua: SPELL_POWER_CHI,
  SPELL_POWER_HOLY_POWER, SPELL_POWER_SOUL_SHARDS, SPELL_POWER_ARCANE_CHARGES,
  SPEC_MONK_WINDWALKER, SPEC_PALADIN_RETRIBUTION, SPEC_MAGE_ARCANE
• Guarded GetSpecialization() and IsPlayerSpell() in classicons.lua Visibility
• Guarded all retail-only oUF tags: curmana, maxmana (safe Enum fallback),
  soulshards, holypower, chi, arcanecharges (Enum + GetSpecialization checks),
  and arenaspec (GetArenaOpponentSpec + GetSpecializationInfoByID checks)
• Guarded C_Map.GetBestMapForUnit/GetPlayerMapPosition in rInfostrings with
  fallback to legacy GetPlayerMapPosition API
• Fixed coordinate format string from %.2d (integer) to %.0f (float)

KNOWN ISSUES:
• rMinimap still directly modifies MinimapCluster position/scale (functional,
  deferred to future refactor)
• PetActionBarFrame reparenting in petbar.lua modifies a Blizzard frame
  (low taint risk, pet bar is dynamic)