promotional bannermobile promotional banner

The ForgeDMC Toolkit

ForgeDMC is a suite of lightweight, standalone Lua modules designed for the modern World of Warcraft API . It provides all the functionality of the aging Ace3 library suite—plus common utility libs—without the heavy memory footprint!

File Details

ForgeV1.0.zip

  • R
  • Mar 23, 2026
  • 80.10 KB
  • 242
  • 12.0.5
  • Retail

File Name

Forge.zip

Supported Versions

  • 12.0.5

v1.1.0 — 2026-03-21  ·  Bug-fix & completion release

### 🔴 Critical fixes (would not load)

**ForgeDB.lua**
- `ForgeDB:New()` constructor was entirely missing — body now written
- Removed duplicate file body (file was concatenated with itself) that
  caused a Lua syntax error preventing the entire addon from loading
- `char` scope key now uses `UnitName("player") .. "-" .. GetRealmName()`
  for true per-character-realm uniqueness
- `applyDefaults()`: fixed edge-case where a non-table `target[k]` blocked
  a table-typed default from being stamped (deep-copied the default instead)
- `DeleteProfile()`: added assertion that the profile actually exists

**ForgeLocale.lua** *(complete rewrite)*
- Previous file contained a full copy of `ForgeWidgets.lua` and registered
  `_G.ForgeWidgets` — no locale system existed at all
- New implementation: `Register(addonName, locale)` returns a proxy table;
  `L["key"] = true` marks a key as using itself as the translation (enUS pattern)
- `Get(addonName)` returns the proxy for the current client locale with
  automatic `enUS` fallback, then first-registered fallback, then key-as-string
- Reads from unregistered keys return the key string — never `nil`, never errors
- Added `GetRegisteredLocales()`, `IsLocaleRegistered()`, `DumpLocale()` utilities
- Fully idempotent: calling `Register` twice for the same addon+locale is safe

---

### 🟡 Naming fixes (wrong global exported)

**ForgeComm.lua**
- Renamed `NativeComm` → `ForgeComm` throughout to match toolkit convention
- Added `SendChunked(prefix, message, channel, target)` — splits payloads into
  250-byte packets with a `FGC|total|seq|payload` header; the receiver's callback
  fires once with the fully reassembled string, transparent to the caller
- `Send()` now asserts message ≤ 255 bytes and explicitly directs larger payloads
  to `SendChunked()` with a clear error message
- Added warning log when `RegisterAddonMessagePrefix` fails (Blizzard ~64 cap)
- Cleans up `_incoming` reassembly buffer after successful delivery

**ForgeOptions.lua**
- Renamed `NativeOptions` → `ForgeOptions` throughout
- Fixed `Settings.RegisterAddOnSetting()` argument order to match the actual
  Dragonflight/TWW API signature: `(category, varName, key, db, varType, label, default)`
  (was passing `label` as `name` and omitting `label` in the display position)
- Replaced the broken `panelMethods` copy-onto-`NativeOptions` pattern with a
  proper `Panel` metatable — instances from `:Create()` now correctly inherit
  methods without shared-state confusion
- Added `AddHeader(text)` — section label via `Settings.CreateSectionHeader` (TWW+)
- Added `CreateSubcategory(title)` — child category in the Settings sidebar
- `databaseTable` parameter to `:Create()` is now optional

---

### 🟡 Runtime bug fixes

**ForgeTimer.lua**
- `invoke()`: function callbacks now receive `self` as the first argument
  (was `callback(...)` — self was silently dropped; now `callback(self, ...)`)
- Added `Throttle(key, interval, callback, ...)` — fire-immediately then
  block for interval; complements `Debounce`
- Added `CancelDebounce(key)` — cancel a pending debounce without firing it
- `CancelAllTimers()` now also cancels pending debounce and throttle handles

**ForgeWidgets.lua**
- `CreateCheckBox()`: was crashing with `_G[nil.."Text"]` because `CheckButton`
  was created with `nil` name; now generates a unique name via `uniqueName()`
  so `UICheckButtonTemplate`'s `<n>Text` sub-frame is always accessible
- `CreateSlider()`: same crash (`_G[nil.."Low"]` etc.); fixed with unique name
- `CreateDropdown()`: `UIDropDownMenuTemplate` is deprecated in TWW 11.0+;
  now auto-detects `DropdownButtonMixin` and uses `WowStyle1DropdownTemplate`
  on 11.0+ clients, falling back to legacy template on older clients
- `CreateEditBox()`: added `OnEscapePressed` to clear focus (standard UX)
- Added `CreateTabStrip(parent, tabNames, onTabChange)` — horizontal tab button
  row with active-state highlighting; returns the strip frame and a `showTab(index)`
  function for programmatic tab switching
- `uniqueName(prefix)` internal counter generates collision-free global frame names

---

## v1.0.0 — 2026-03-20  ·  Initial release

### Core Toolkit (Ace3 replacements)
- **ForgeCore** — AceAddon + AceEvent + AceConsole
- **ForgeDB** — AceDB-3.0
- **ForgeComm** — AceComm-3.0
- **ForgeHook** — AceHook-3.0
- **ForgeLocale** — AceLocale-3.0
- **ForgeOptions** — AceConfig + AceConfigDialog + AceConfigRegistry + AceDBOptions
- **ForgeTimer** — AceTimer + AceBucket
- **ForgeWidgets** — AceGUI-3.0

### Extended Toolkit (common library replacements)
- **ForgeStub** — LibStub
- **ForgeBabble** — LibBabble-Boss/Faction/SubZone-3.0
- **ForgeBroker** — LibDataBroker-1.1 + LibDBIcon-1.0
- **ForgeMinimapButton** — LibDBIcon-1.0
- **ForgeDialog** — LibDialog-1.0
- **ForgeGeo** — HereBeDragons
- **ForgeGlow** — LibCustomGlow
- **ForgeMedia** — LibSharedMedia-3.0
- **ForgePacker** — LibDeflate (serialisation layer) + AceSerializer
- **ForgeQueue** — ChatThrottleLib
- **ForgeRange** — LibRangeCheck
- **ForgeSkin** — Masque
- **ForgeWindow** — LibWindow