promotional bannermobile promotional banner

FCUI - ForeverClassicUI

Restore the classic Vanilla WoW interface in WoW Forever with modular, toggleable UI elements.
Back to Files

Forever Classic UI 0.1.0 Beta 6

File nameForeverClassicUI-v0.1.0-beta.6.zip
Uploader
tynas_tynas_
Uploaded
Sep 26, 2026
Downloads
726
Size
105.6 KB
Flavors
ClassicForever
File ID
8985140
Type
R
Release
Supported game versions
  • 1.60.1
  • 1.15.9

What's new

Forever Classic UI 0.1.0 Beta 6

The release that came out of reading a working addon.

docs/ClassicUIForever/ is ClassicUI Forever v0.11.0 by justawower -- a published addon, eleven releases in, that runs on the same client FCUI targets. Comparing the two turned several of this project's "STILL ASSUMED" entries into answers, and the answers were not flattering. The full comparison is in docs/COMPARISON_CLASSICUIFOREVER.md; this is what changed because of it.

Nothing here has been seen in a client yet. What has changed is that the reasons to expect it to work are now evidence rather than inference: six new assertions in tests/check_api.py check the frame names, the secure template and the scroll API against Blizzard's own source on the forever branch.

Fixed

  • FCUI no longer raises a Lua error on its own player frame at login. This is the headline. Forever hands out "secret values" -- real values the client refuses to let insecure code inspect -- and the player's own power is one of them, even out of combat. Compatibility/Units.lua wrote UnitHealth(unit) or 0 and level <= 0; UI/Widgets.lua wrote maximum > 0 and math.min(math.max(current or 0, 0), maximum). A truth test, a comparison and arithmetic: three ways to raise on the same value. The first Refresh after PLAYER_LOGIN hit all of them, SafeCall swallowed it, and the player was left with a blank frame and a warning.

    Every unit read now either guards with IsSecret before touching the value, or hands it straight to a widget setter -- which takes a secret without complaint. The rule is "pass it through, never compute with it".

    Thirteen call sites across five files. Compatibility/Safety.lua gained the three primitives (IsSecret, Safe, Public) that the rest of the addon now goes through, and which it already had the reasoning for but was not using outside two files.

  • Errors reach the error handler again. FCUI:SafeCall used a bare pcall, so a module fault produced one truncated warning line and nothing else: no stack, no file, and nothing for BugSack to catch. It is now xpcall with geterrorhandler(), which keeps the addon alive and reports the fault where a player already knows to look.

  • A blocked action is no longer invisible. ADDON_ACTION_BLOCKED and ADDON_ACTION_FORBIDDEN are now listened for, and the last six are kept with the time and whether they happened in combat. /fcui status prints them. This is the one class of failure no pcall catches and no offline layer models, and FCUI had no way to see it at all.

Changed

  • The player and target frames are dressed, not replaced. FCUI used to park Blizzard's PlayerFrame and draw FCUI_PlayerFrame in its place, driven by ten events. That threw away everything it did not redraw: clicking, the unit right-click menu, auras, vehicle swaps, rest and combat states, PvP flags, raid markers, threat. It also meant reading unit values by hand, which is what the secret-value bug above was.

    The client's frame now stays alive, visible and in charge. FCUI re-textures the plate region Blizzard already has, fades the bar art it does not want, and puts its own bars in a child frame. Blizzard's own name and level FontStrings are moved onto that child and left for Blizzard to fill -- which is why four of the ten events are gone.

    Party Frames and the Minimap already worked this way and HANDOVER §8 records why; this extends the same pattern, through the same Compatibility/Reskin.lua, to the two frames that mattered most. FOREVER mode restores every captured region and needs no reload.

    Every number in the two modules is transcribed from Blizzard's own classic_era PlayerFrame.xml and TargetFrame.xml. An earlier draft carried a (19, 4) offset borrowed from how the reference addon crops its plate; that offset describes its crop, not this client. Forever's PlayerFrame is 232x100 and so is Vanilla's, so 1.x offsets apply as written.

  • The spell book casts in combat. Its slots were plain buttons calling C_SpellBook.CastSpellBookItem from an insecure OnClick. The old comment argued that Blizzard's own template does the same, which is true and beside the point: Blizzard's code is secure because Blizzard shipped it. The same call from addon code is refused the moment a fight starts, silently, with ADDON_ACTION_BLOCKED.

    Slots are now SecureActionButtonTemplate buttons carrying the spell as an attribute, so the client casts on the player's click. Consequences, all deliberate and all documented in the file: a modified click picks the spell up instead of casting it (as 1.x did); the page freezes during a fight, because rewriting a slot's attribute is refused and showing a new icon over an old attribute would be worse than a stale page; and the page catches up at PLAYER_REGEN_ENABLED.

  • One TOC instead of four. ForeverClassicUI_Mainline.toc declared ## Interface: 120100. Forever is a mainline-family client, so there was a real chance it read that file on a 16001 client and flagged the addon out of date -- or refused to load it. A suffixed TOC is only ever a liability for a client whose suffix nobody has confirmed. There is now one file with ## Interface: 16001, 120100, 50504, 11509, Forever first, which is what the reference addon does with the two numbers it targets.

  • Classic nameplates are one click instead of a chore. FCUI correctly refuses to write nameplateStyle itself: that fires Blizzard's own callback, which then runs tainted, and tainted code on this client may not compare the secrets guarding unit health -- so every plate errors half-built. It used to print "type /console nameplateStyle 6" and leave it there. The options panel now carries a secure macro button that runs the command as the player, so nothing of FCUI's is on the stack. Forever ships a real Enum.NamePlateStyle.Classic, so flipping that switch remains the right design; only the way to flip it was missing.

Added

  • UI/Textures.lua, and the beginning of an answer to the art problem. Two things go wrong with naming a client path and hoping. A missing file draws nothing and raises nothing, silently, for the whole session. And Forever redrew some files under their old names, so the path resolves and the art loads and it is the modern art -- which is why FCUI's "Classic" unit frames came out looking like retail ones.

    Every art path now goes through one resolver that reads SetTexture's return value, falls back to the other copy, and records per path which one took. /fcui probe prints it. FCUI may ship its own copy of a file under media/, and five paths are marked as preferred because the client's file at them is no longer the 1.x art.

    media/ is empty and the addon works without it. The art cannot come from docs/ClassicUIForever/media/: that addon is licensed all rights reserved. addon/ForeverClassicUI/media/README.md has the list of 56 files and how to extract them from a Classic Era client.

  • tests/check_media.py (layer 4b), which keeps the manifest and media/ in agreement in both directions, and runs without network or Docker.

  • Six assertions in tests/check_api.py (45 -> 51), covering the frame names the new unit-frame skin depends on, SecureActionButtonTemplate, and FauxScrollFrame_Update.

  • An addon compartment entry, plus the IconTexture and Category the TOC was missing.

Fixed, after the first real screenshots

Loïc ran beta.5 in a client. Five things the screenshots showed, and what happened to each.

  • The secret-value error, verbatim. "attempt to perform numeric conversion on a secret number value (execution tainted by 'ForeverClassicUI')", from playerFrame in OnEvent, repeating. That is the bug above, word for word, and the fix above is the fix.

  • The options panel was drawn over the world, permanently. CreateFrame returns a shown frame; this one is a child of UIParent with no backdrop and nothing ever hid it, so the title, the subtitle and every mode row sat in the top-left corner of the game from login onwards. It is hidden at build time now, as Blizzard's own canvas panels are in their XML.

  • A missing texture draws as a BLACK BLOCK, not as nothing. The Classic quest log came out as a black slab with "No Active Quests" on it. FCUI's own Compatibility/Safety.lua had said so in a comment since beta.4 and nothing acted on it. Three consequences, all fixed:

    • UI.SetTexture asks GetFileIDFromPath before writing and writes nothing when neither the client nor media/ has the file. Writing the path is what paints the block.
    • Skin.Dress and the new UI.ReskinWithArt refuse to touch one of Blizzard's regions at all when there is no 1.x art for it. Re-texturing its plate with a missing file would replace art that renders perfectly well with a black rectangle, and the coords and size were being applied regardless, so the client's own art survived cropped to a sheet that was never there.
    • A module whose art is missing no longer offers Classic. All of the art or none of it: a half-dressed unit frame -- Forever's modern plate with 1.x text positions and our bars over it -- is worse than leaving the frame alone. The player frame, target frame, minimap, spell book and quest log each check, the Options panel greys the button out, and one line at login says which elements and where to read about it. Degrading to "does nothing" beats degrading to "looks broken".
  • Blizzard's blocked-action popup. The call was not identified from a screenshot -- which is exactly why the watchdog above exists -- but two of the three hide strategies could produce it, and neither had to exist. HideNativeFrame now has one strategy, SetAlpha(0) plus EnableMouse(false), for every frame. Re-parenting is gone (it taints a frame Edit Mode owns, and the guard against that was a probe that had to be right every time), and so is Hide() plus an OnShow hook (refused outright on a protected frame in combat). Neither remaining call is protected, so the combat guard on restore is gone too, and FCUI:GetHiddenParent with it.

Removed

  • UI.CreateUnitFrame, UI.SetClassification and the per-side art table they read. Nothing builds a replacement unit frame any more. The draw-order assertions that covered them moved onto the new skin layer, where the rule they protect -- Vanilla's plate draws over the bar ends -- still holds.

Forever Classic UI 0.1.0 Beta 5

The last three modules -- Classic Party Frames, a Classic Minimap and Classic action bar art -- and a fix to how FCUI takes Blizzard's frames out of the layout, found by reading how another addon that actually runs on Forever refuses to do what FCUI was doing.

Every module in the plan now exists.

Fixed

  • FCUI no longer re-parents a frame Edit Mode owns. This is the important one, and it affects the player frame and the target frame that shipped in Beta 4 turned on by default. EditModeSystemMixin:OnSystemLoad replaces five of a frame's own methods -- SetPoint, ClearAllPoints, SetScale, SetShown and Hide -- with Blizzard's. Re-parenting such a frame taints it, and Blizzard's own repositioning is then blocked the next time it happens in combat. BetterBlizzFrames hit exactly this on PetFrame and documents it: ADDON_ACTION_BLOCKED on ClearAllPointsBase. FCUI's restore path was the worse half, calling four of those five in a row at the precise moment the player was asking for their native UI back.

    Such frames are now neutralised with SetAlpha(0) and EnableMouse(false), the two useful methods Edit Mode does not replace, and nothing else is touched. Nothing is re-parented, re-anchored, re-scaled, hidden or shown. Restoring puts back two numbers.

    Whether a frame is Edit Mode's is probed on the frame, not guessed from the client version, so a client without Edit Mode keeps the behaviour it has always had, unchanged. No offline layer could have caught this: ADDON_ACTION_BLOCKED is not a Lua error, so it fails no pcall and no syntax check.

  • /fcui probe now reports, per native frame, which of the three strategies it resolved to. A tester reporting alpha against PlayerFrame on Forever is what confirms the fix landed.

Added

  • Classic Party Frames. The Vanilla plate, the Vanilla bar geometry, the dark backing behind the bar cluster, the party flash when a member is your target, and the portrait debuff overlay -- all transcribed from Blizzard's own PartyFrameTemplates.xml.

    FCUI restyles Blizzard's party frames rather than replacing them, which is the opposite of what every other unit-frame module here does. A party frame's job is to be clicked, and Blizzard's are secure buttons: left click targets, right click opens the unit menu, and the secure state driver keeps them correct through a roster change mid-combat, which addon code is not allowed to do. A replacement that looked right and could not be clicked would be a regression dressed as a feature.

    So targeting, menus, roster handling, auras, pets, ready checks and offline status all stay Blizzard's and keep working. FCUI supplies the look. The module listens to four events instead of the twenty-one a replacement would have needed.

    Every write is captured before it happens and reversed when you switch back to Forever -- no /reload. A region whose original state cannot be read cleanly is left alone entirely rather than changed in a way FCUI could not undo.

  • Classic Minimap. The Vanilla ring around the map, the Vanilla zone-name strip, and Vanilla art on the zoom buttons. Both crops are Blizzard's own values, read out of Classic Era's Minimap.xml rather than measured by eye.

    The catch, and the reason this module re-applies itself: Forever rewrites its minimap skin from a CVar callback. Its Camelot/Skin.lua registers against rotateMinimap and re-sets the ring's atlas and size whenever you toggle map rotation. Anything applied once and left alone would be undone the first time a player touched that setting. FCUI re-applies from a post-hook on SetAtlas and from CVAR_UPDATE, each covering the other's gap.

    Nothing is resized. Forever's map is sized from atlas data by Blizzard's own code, inside a cluster that is both an Edit Mode system and a self-resizing layout frame. Making it Vanilla's 140px would mean fighting both on every rotation change. The Vanilla art is fitted to Forever's dimensions instead, so the ring is very slightly wider than it is tall.

  • Classic action bar art. The Vanilla dwarf-stone bar under your action buttons, the Vanilla gryphons at both ends, Blizzard's retail frame and divider strips faded out.

    Art only, and that is the whole design. "Classic action bars" sounds like it means replacing them. It cannot: action buttons are secure buttons, an addon may not move, hide or re-anchor them in combat, and a replacement button cannot cast anything without being a secure button itself. What is possible is that Blizzard's frame art is a handful of ordinary unprotected textures sitting on that protected frame, and swapping a texture is not a protected action. So every button stays exactly where Blizzard put it and only the scenery around them changes.

    The stone follows the bar's width rather than being fixed, so rescaling the bar in Edit Mode does not stretch it.

Notes

If you are updating from Beta 4, do so. The Edit Mode fix above affects the player frame and target frame, which Beta 4 shipped turned on by default.

All three new modules default to Forever, so installing this changes nothing until you opt in, and all three are offered on Forever and Retail only. Classic Era and Mists already draw the Vanilla party frames, minimap border and bar art themselves, so the Classic button is greyed out there. That is decided by asking the client what it actually draws, never by checking a version number.

None of the three moves anything. They restyle Blizzard's own frames in place, which is what keeps every clickable thing clickable. Your party frames, minimap and action bar stay where Edit Mode puts them, at Forever's spacing and size. "Classic" here means the Vanilla look, not the Vanilla layout.

Switching any of them back to Forever restores Blizzard's art with no /reload. A region whose original state cannot be read cleanly is left alone entirely rather than changed in a way FCUI could not undo.

Per module:

  • Party frames -- after a vehicle transition during combat, the bars keep Blizzard's geometry under the Vanilla plate until combat ends, then correct themselves. Moving them mid-combat is refused by the game, and the workaround costs more than the defect.
  • Minimap -- Forever's zoom buttons stay hidden until you hover the map. FCUI gives them Vanilla art but does not change when they appear.
  • Action bars -- only two of Vanilla's four stone strips are used: the two that carried the twelve button slots. The other two held the bag slots and the micro menu, which on Forever are separate systems living elsewhere.
  • Action bars -- hiding them disables the twelve buttons' mouse handling as well as the bar's. Hiding a frame does not disable its children, and an invisible bar you can still click by accident is worse than one you can see.

The bags setting is removed. Bags were cancelled, not deferred.

Still unverified

Said plainly, because it has not changed: none of this has ever run in a real WoW client. Every measurement is transcribed from Blizzard's own published UI source and checked against it automatically, but no offline layer can open the game. Three things in this release are most likely to be wrong, and all three are visual:

  • Whether the party frames' bar masks really come off. A leftover mask would crop the Vanilla bars at both ends.
  • Whether the minimap ring looks noticeably oval. It is fitted to Forever's frame rather than the map being resized, which costs about 5% of aspect.
  • Whether the button slots drawn in the Vanilla stone line up with the real action buttons. Vanilla's art was made for Vanilla's button spacing.

Run /fcui probe, /reload, and send the lastProbe block from your WTF folder. It now reports which strategy FCUI resolved for every Blizzard frame it touches, which is the one thing that confirms the Edit Mode fix landed.

Forever Classic UI 0.1.0 Beta 4

Two new Classic panels, and the first round of fixes driven by real in-game feedback on other Forever addons rather than by offline analysis alone.

Added

  • /fcui probe. A diagnostic dump written to SavedVariables as well as chat. It reports the client build, every capability flag as detected rather than as assumed, which native frame name FCUI actually resolved for each module, each module's mode and supported modes, whether every texture the addon draws with exists in this client's data, and a three-deep tree of the player frame, target frame and cast bar with texture paths. Run it, /reload, and send the lastProbe block from the WTF folder. This closes the project's biggest gap: the offline layers prove FCUI matches Blizzard's published source, but none of them can run the real Forever client.

Fixed

  • The frame art now draws over the bars, as Vanilla does. The bevel around each health and mana bar is part of the plate, and in Vanilla the bar ends run underneath it. FCUI drew the bars on top instead, which is the retail look and left them sitting flat on the art with their ends showing. The art now lives on its own child frame above the bars, with frame levels set explicitly -- which is Blizzard's own structure, not a workaround: Classic Era's TargetFrame.xml puts the art on $parentTextureFrame and pins the bars down with useParentLevel="true". Same fix for the target-of-target plate.
  • The cast bar border no longer sits under the fill. Blizzard's cast bar template is the status bar and carries its border, icon and spark as its own textures at sublevels above the fill. FCUI hung them off a parent frame, so the fill painted over the border's inner bevel.
  • Classic nameplates no longer break Blizzard's nameplates on Forever. FCUI used to set the nameplateStyle CVar itself. On a client that guards unit health behind secret values, that fires Blizzard's own CVar callback from addon code, which taints it — and tainted code may no longer compare those secrets, so every nameplate errors half-built. FCUI now asks you to type /console nameplateStyle 6 once instead. Chat commands run untainted and the value is saved with your character, so it is a one-time action. This was the only FCUI module that would have failed outright on Forever.
  • FCUI no longer writes a field onto Blizzard's frames. The suppression flag used when hiding a child frame lived on Blizzard's frame. The same bookkeeping now lives in a table of FCUI's own, which keeps FCUI clear of the question entirely on a client where tainting Blizzard's frame code is fatal.
  • Forbidden frames are no longer treated as usable. A forbidden frame answers a name-and-type check perfectly well and then raises a Lua error the moment it is used. Every native frame FCUI resolves is now checked with IsForbidden first.
  • Secret values can no longer poison a restore. Anchors captured when a native frame is parked are read through a guard that drops values the client refuses to expose. Previously a secret anchor would have been stored without complaint and thrown later, inside the restore path — at the exact moment the user was trying to get their native UI back. An anchor that cannot be read cleanly is now dropped, and Blizzard's own anchors are left alone instead.
  • A native frame that becomes unreachable while parked is reported and released rather than retried forever.

Added — the two Classic panels

Both default to Forever until they have been seen in a real client, so installing this changes nothing until you opt in.

  • Classic Spellbook. The Vanilla parchment book, transcribed from Blizzard's own SpellBookFrame.xml, drawn from live game data: twelve slots a page in two columns, skill-line tabs down the right edge, ranks, passives, cooldowns, real tooltips, drag to an action bar and click to cast. No spell list ships with the addon; everything comes from C_SpellBook.
  • Classic Quest Log. The Vanilla book, list above detail in one window, the way Vanilla actually did it. Zone headers collapse and expand, quests carry their level and difficulty colour, tracking drives Blizzard's own watch list, and Abandon goes through Blizzard's confirmation.
  • On Forever the quest counter reads out of 40, read from C_QuestLog.GetMaxNumQuestsCanAccept() rather than written into the addon. The old 20-quest cap appears nowhere.
  • P and L keep working. In Classic mode they open FCUI's book; in Forever mode they run Blizzard's own code untouched.

Notes

  • Both panels are offered on Forever and Retail only. Classic Era and Mists lack the API and already ship these exact windows themselves, so FCUI leaves them alone there and the Classic button is greyed out.
  • Neither panel offers Hidden. A spellbook or quest log you cannot open is not a UI preference.
  • Existing settings are preserved: the two new entries are simply added to your profile as Forever.

Forever Classic UI 0.1.0 Beta 3

Every module now supports Classic mode.

Added

  • Classic Target of Target. The Vanilla plate, transcribed from Blizzard's own template. It rides the bottom-right corner of the Classic target frame and follows it when you move it. Set the target frame to Forever and the plate keeps its own position instead of disappearing, so you can mix the two.
  • Classic Nameplates. FCUI does not draw nameplates. Every supported client already ships a Classic nameplate style of its own, so this mode selects it and Forever mode restores whatever you had before, remembered across reloads.

Note

Turning nameplates back to Forever restores your original style. Disabling the addon outright does not: a setting outlives the addon that changed it. Switch the module back first, or change the style in Blizzard's own options.

Forever Classic UI 0.1.0 Beta 2

Visual fidelity pass. Every measurement in the Classic frames is now transcribed from Blizzard's own Vanilla UI source instead of estimated.

Fixed

  • The Classic player frame drew no art at all. It referenced a texture that does not exist; Vanilla draws both unit frames from the same file and mirrors the player.
  • The elite / rare dragon painted a second full frame over the target's health and mana bars. It now swaps the base texture, as Blizzard does.
  • Portrait, health and mana bars, name and level were all a few pixels off on both frames, and the two bars had a gap where Vanilla overlaps them.
  • The cast bar border sat centred on the fill instead of above it, and the spell icon was undersized.

Added

  • Cast bar spark, cast bar shield for non-interruptible casts, and the correct artwork for rare-elite and minus (critter) targets.

Forever Classic UI 0.1.0 Beta

Initial public beta release of Forever Classic UI.

Included

  • Modular Classic / Forever / Hidden UI system
  • Classic Player Frame
  • Classic Target Frame
  • Classic Player Cast Bar
  • Classic Target Cast Bar
  • Configuration panel
  • SavedVariables support
  • Multi-client compatibility layer

Experimental

  • WoW Forever compatibility
  • Classic UI geometry and positioning
  • Blizzard frame replacement behavior

Not yet available in Classic mode

  • Target of Target
  • Nameplates

These modules currently support Forever and Hidden modes only.

Known limitations

  • Visual rendering has not yet been validated inside the WoW Forever client.
  • Some in-client texture paths still require verification.
  • Protected frame / taint behavior requires in-game testing.

Feedback and bug reports are welcome.

This mod has no related projects