Jump to content

[ForgeUI v9] In-Game Visual UI Builder for 3.3.5a — Design, Script & Export Working Addons

By zgzagan
in Want To Sell

Recommended Posts

FORGE UI

Visual UI App Builder for World of Warcraft 3.3.5a

AzerothCore  ·  mod-ale  ·  AIO

01_splash.png

Watch the video demo   |   $49Get it on Ko-fi


Design a complete addon interface inside the game client — drag, anchor, style, script and preview it live — then export a Client + Server Lua pair that drops into lua_scripts/ and runs on your realm. No frame code written by hand, no reload cycle to see a change.

01  THE PROBLEM IT SOLVES

Hand-writing 3.3.5a frame code is a slow feedback loop. Every anchor tweak costs a /reload. Every texture UV is trial and error. Nothing shows you what a layout looks like until it is already written, and nested SetPoint chains with parent/child anchoring are where most custom UI work quietly dies.

ForgeUI replaces that with direct manipulation. You see the frame while you build it, at real client resolution, with real textures and real 3D models — and the code comes out at the end instead of at the beginning.

02_editor.png

02  ARCHITECTURE

  • Client-side editor delivered as an AIO addon; the server half is ALE (mod-ale) Lua
  • Layouts persist to a single table in acore_characters, keyed by player GUID, stored as a V2 document with tags and timestamps
  • The exporter walks the widget document tree and emits flat, dependency-ordered Lua — no runtime framework, no library dependency in the output
  • Exported addons do not require ForgeUI to be installed. They are standalone AIO scripts
  • Export runs chunked across frames, so a large layout does not hitch the client while generating
  • ~250 client modules, load-ordered by filename prefix

03  WHAT THE EXPORTER PRODUCES

The Export panel generates a Client script and a Server script straight from the canvas document:

05_export.png

Structurally, exported client code looks like this:

-- Generated by ForgeUI - Client script
local AIO = AIO or require("AIO")
AIO.AddAddon()
if not CreateFrame then return end

-- Re-runnable: AddHandlers errors on a second run after a hot
-- reload, forcing a ReloadUI modal. Reuse the live table instead.
local _FU_HKEY = "_FU_AIOH_MyShop"
local H = _G[_FU_HKEY]
if not H then
    H = AIO.AddHandlers("MyShop", {})
    _G[_FU_HKEY] = H
end

local ViewRoots = {}

local function ShowView(name)
    for k, f in pairs(ViewRoots) do
        if k == name then f:Show() else f:Hide() end
    end
end

local rf_Main = CreateFrame("Frame", "MyShop_Main", UIParent)
rf_Main:SetSize(420, 300)
rf_Main:SetPoint("CENTER", UIParent, "CENTER", 0, 0)
ViewRoots["Main"] = rf_Main

local rf_Main_bg = rf_Main:CreateTexture(nil, "BACKGROUND")
rf_Main_bg:SetAllPoints(rf_Main)
rf_Main_bg:SetTexture(0.08, 0.09, 0.12, 0.95)

local btn_Buy = CreateFrame("Button", nil, rf_Main)
btn_Buy:SetSize(120, 28)
btn_Buy:SetPoint("TOPLEFT", rf_Main, "TOPLEFT", 24, -48)
btn_Buy:SetScript("OnClick", function(self, button)
    AIO.Msg():Add("MyShop", "BuyItem", 49426):Send()
end)

ShowView("Main")

SLASH_MYSHOP1 = "/myshop"
SlashCmdList["MYSHOP"] = function(msg)
    local cmd = tostring(msg or ""):lower():match("^%s*(%S*)")
    if cmd == "show" then rf_Main:Show()
    elseif cmd == "hide" then rf_Main:Hide()
    elseif rf_Main:IsShown() then rf_Main:Hide()
    else rf_Main:Show() end
end

Plain frame code you can read, diff and hand-edit. The slash command, the show/hide arguments (so it is scriptable from macros or other addons), the view switching, the re-run guard and any per-widget scripts you wrote are all generated for you.

The paired Server script arrives with AIO handler registration and hooks ready for your own logic:

-- Generated by ForgeUI - Server script (ALE)
local AIO = AIO or require("AIO")
local H   = AIO.AddHandlers("MyShop", {})

-- Button click hook
function H.OnButtonClick(player, buttonId, buttonName)
    if not player or not player:IsInWorld() then return end
    AIO.Msg()
        :Add("MyShop", "OnServerReply", {
            msg = "Hello " .. player:GetName() .. "!",
        })
        :Send(player)
end

-- Player login hook
RegisterPlayerEvent(3, function(event, player)
    AIO.Msg()
        :Add("MyShop", "OnPlayerLogin", {
            name  = player:GetName(),
            level = player:GetLevel(),
        })
        :Send(player)
end)

(Standalone Addon and FrameXML output modes are visible in the panel marked "SOON" — they are planned, not functional in v9. Stated upfront rather than discovered after purchase.)

04  THE EDITOR

  • Canvas — grid, snap, rulers, smart edge-alignment guides, zoom 5%–3200%, middle-mouse pan, hold Alt to bypass snap
  • Widgets — Frame, ScrollFrame, Button, Checkbox, Texture, FontString, Model, CloseButton
  • Composites & groups — Store Card, Info Panel, Search Bar, plus WoW Panel, Dialog Window, Tab Panel, Tooltip Frame, Resource Bar and Action Button templates
  • Inspector — transform, opacity, anchor, fill, texture path and layer, TexCoord editing with a visual UV picker, and a Texture Adjust block with tone / saturation / lightness / contrast and a live before-after preview
  • Hierarchy — parent/child tree with filtering, folder grouping and reparenting
  • Views — independent screens per document; each widget belongs to one, and ShowView() / HideView() are generated automatically
  • Preview and Test modes — run the layout live in-game without leaving the editor
  • Undo/redo, duplicate, arrow-key nudging, snap-size nudging, right-click context menu, lock
  • Console with an inline Lua REPL against live editor state
  • Style Library — Dark Panel, WoW Tooltip, WoW Dialog, WoW Parchment, WoW Gold, Glass and more

05  3D MODEL SUPPORT

The Model widget is a real PlayerModel rendering live on the canvas, in preview, and in the exported addon — not a static placeholder image.

03_modelbrowser.png

  • Sources: unit (player / target / pet / focus), any .m2 path, or an NPC entry
  • Model Browser indexing 14,700+ client models into categories — Creatures, Spell Effects, Weapons, Shields, Characters, Interface, World — plus Units and a persistent Recents list
  • Per-category and global search
  • Live preview with per-model auto-framing: drag to rotate, right-drag to pan, wheel to zoom, right-click to reset, double-click to apply
  • Creatures resolve textured through their NPC entry via the included server script, instead of rendering as untextured white geometry
  • Apply stores the model and your exact camera transform on the widget — scale, facing, and X/Y/Z offsets — so the framing you set is the framing that ships in the export

06  SCRIPTING

Every widget gets a full script editor: per-event Lua with syntax highlighting, line numbers, a handler list organised by category, and Save / Run against the live client.

04_scripteditor.png

  • Events grouped by Lifecycle (OnShow, OnHide, OnEvent, OnLoad), Update Loop (OnUpdate), Mouse (OnClick, OnDoubleClick, OnEnter, OnLeave, OnMouseDown, OnMouseUp), Drag (OnDragStart, OnDragStop) and Layout (OnSizeChanged)
  • The correct handler signature is emitted per event type, validated against what each widget actually supports
  • Snippets library — one-click insert for play sound on click, toggle frame visibility, fade in on show, tooltip on hover, start/stop moving, AIO send message, get player health, pulse scale animation, clamp to screen, hide after delay, and more
  • API reference and Behaviors panels built in
  • Output, Errors, REPL and Events tabs underneath, with severity filters
  • Scripts compile on save and are embedded into the export automatically

07  DEV TOOLS

A live inspector for what your UI is actually doing at runtime — the part that usually does not exist at all on 3.3.5a.

06_devtools.png

  • Profiler — per-handler fire counts, average ms, total ms and a distribution bar; sort by fire count, time or memory; export to CSV
  • Live trace console, an events feed, an errors panel and a registered-listener list
  • Realtime AIO connection state, ping, UI and game FPS, and addon memory in the status bar

08  LOCALIZATION

Nine languages — EN / ES / PT / DE / FR / IT / RU / ZH / KO — auto-detected from GetLocale() and switchable at runtime with no /reload.

07_locale.png

A bundled Unicode fallback font supplies Cyrillic, Chinese and Korean glyphs on Latin clients, so translated strings never degrade into question marks. Adding your own locale is one dictionary block in one file; missing keys fall back to English.

09  REQUIREMENTS

  • Server — AzerothCore (latest) + mod-ale + AIO by Rochet2
  • Client — WoW 3.3.5a with the AIO client addon
  • Database — MySQL access to run the included single-table schema against acore_characters

Built and tested on AzerothCore + mod-ale. It is not a drop-in for TrinityCore/Eluna setups.

10  WHAT YOU GET

  • The full ForgeUI addon — client modules, server ALE scripts, SQL schema
  • Patched AIO (Rochet2's, with a duplicate-initialization fix on reload) so you do not have to source it separately
  • Unicode font pack
  • README with install, slash command reference, keyboard shortcuts and troubleshooting
  • Free updates

$49

https://ko-fi.com/s/7808d43d8a

Discord zgzagan  ·  zagan.framer.ai


Questions in-thread or on Discord. If you want to see a specific panel built before you buy, tell me what it is and I will record it.

Built on AzerothCore, mod-ale and AIO by Rochet2 — full credits in the README.

Link to comment
Share on other sites

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...