docs(client): document worldserver DBC sync for Paragon character create

Explains why Character Creation Failed occurs when the client has
patch-enUS-4 but Docker/native data/dbc is still vanilla: ChrClasses
row 12 only exists in the patched DBC set. Adds Docker volume copy
steps, native install path, and log verification.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Docker Build
2026-05-09 12:00:04 -04:00
parent 526022e2bc
commit 20a24b7935
@@ -52,6 +52,90 @@ worldserver image is older than commit `4d2a80d` (the
`character_paragon_panel_spell_revoked` migration). Pull both ends to `character_paragon_panel_spell_revoked` migration). Pull both ends to
the same release tag and rebuild the worldserver image. the same release tag and rebuild the worldserver image.
If the **client** shows the Paragon class on the create screen but the
server replies **Character Creation Failed** when you pick it: the
worldserver's on-disk DBC set still does not define class **12**
(`ChrClasses.dbc`). SQL migrations alone cannot fix that when
`chrclasses_dbc` in MySQL is empty (normal for stock AC — AzerothCore
loads `.dbc` files from `data/dbc/` and only *merges* optional DB rows
on top). See **Worldserver DBC sync** below.
---
## Worldserver DBC sync (required for Paragon character create)
The Fractured **client** learns about Paragon from `patch-enUS-4.MPQ`
(DBC + GlueXML). The **worldserver** never reads your MPQs — it reads
plain `.dbc` files under its `DataDir` (`.../data/dbc/` by default).
Stock Docker installs populate `data/dbc/` from a vanilla 3.3.5a
extract (`ac-client-data-init` in `docker-compose.yml`). That tree has
no `ChrClasses` row for id **12**, so `CharacterHandler` rejects the
create with `CHAR_CREATE_FAILED` and logs:
`Class (12) not found in DBC while creating new char ... wrong DBC files or cheater?`
**Fix:** merge every `.dbc` that ships inside `patch-enUS-4.MPQ` under
`DBFilesClient/` (or the archive's `dbc/` root — same layout depending
on tool) into the server's `data/dbc/` directory, then restart
**only** `ac-worldserver`. Copy the **whole** set from the MPQ, not
just `ChrClasses.dbc`, so dependent stores (`CharBaseInfo`,
`SkillRaceClassInfo`, `TalentTab`, `PowerDisplay`, etc.) stay consistent
with the client patch.
### Extract from the MPQ (any OS)
Use Ladik's MPQ Editor, `mpqcli`, or any StormLib tool. You want every
`*.dbc` that Fractured added or changed in that patch, staged into a
host folder (example: `./paragon-dbc-extract/`).
### Docker: write into the named volume
Compose uses `${DOCKER_VOL_DATA:-ac-client-data}` (see
`docker-compose.yml`). Discover the real volume name:
```bash
docker volume ls | grep -i client-data
```
Copy extracted `.dbc` files into the volume's `dbc/` subdirectory.
Example (Linux / macOS — adjust volume name and host path):
```bash
docker run --rm \
-v ac-client-data:/data \
-v "$PWD/paragon-dbc-extract:/patch:ro" \
alpine sh -c 'cp -f /patch/*.dbc /data/dbc/'
docker compose restart ac-worldserver
```
Windows PowerShell (same idea; escape backticks if you wrap lines):
```powershell
docker run --rm `
-v ac-client-data:/data `
-v ${PWD}\paragon-dbc-extract:/patch:ro `
alpine sh -c "cp -f /patch/*.dbc /data/dbc/"
docker compose restart ac-worldserver
```
If your compose **project** name prefixes the volume (e.g.
`fractured_ac-client-data`), use that full name from `docker volume ls`.
### Native install (no Docker)
Copy the same extracted `.dbc` files into:
`<CMAKE_INSTALL_PREFIX>/data/dbc/`
then restart `worldserver`.
### Verify
After restart, search startup logs for errors mentioning `ChrClasses` or
`dbc`. On failure you would still see the `Class (12) not found` line at
create time — if that disappears, the DBC merge worked.
--- ---
## Building the patches yourself ## Building the patches yourself