Setting up a separate modding environment for AzerothCore and creating client-side mods using DBC edits, symlinks, and MPQ-style patches.
This article builds on the setup from AzerothCore local setup and focuses on client-side modding, not core development.
If you want concrete examples of server-side modding (pure C++ and ALE/AIO-based), see AzerothCore server-side modules for a short overview and links.
The goal is to have a clean, reproducible workflow for:
The examples and paths here assume a 3.3.5a client.
For modding, it helps to explicitly separate three things:
I keep two configurations in parallel:
Using Git worktrees / workspaces for the core and a client version switcher (for example, rs-realmctl) makes this much easier.
Use a small docker-compose.yml that brings up two MySQL instances:
3321 – development DB (where you iterate on changes).3322 – source DB (kept clean, used as a "before" reference).This lets you easily diff data (e.g. with Keira3, direct SQL, or export scripts) and quickly reset the dev DB from the reference DB when experiments go wrong.
Copy and adjust the usual config files for the modding environment:
worldserver.confauthserver.confKey changes:
authserver once to populate the auth DB.realmlist entry:
worldserver -d (or with -c to create missing tables) to let it populate the world DB.After this, you have a fully-initialized realm dedicated to modding.
Many powerful changes (new visuals, models, spell behaviors, etc.) require client-side DBC edits in addition to server DB changes.
The basic pattern:
This section describes a workflow built around:
Example layout on the desktop:
cd ~/Desktop
# Server-side custom DBC folder
acore-custom-dbc -> /home/pc/wd/wow/acore-custom/env/dist/data/dbc
# Editor export folders
WDBXEditor-Export -> /home/pc/wd/wow/tools/WDBXEditor/Export
WoWSpellEditor-Export -> /home/pc/wd/wow/tools/WoW\ Spell\ Editor/Export
cd acore-custom-dbc
ls
ItemCondExtCosts.dbc
Item.dbc -> /home/pc/wd/wow/tools/WDBXEditor/Export/Item.dbc
Spell.dbc -> /home/pc/wd/wow/tools/WoW\ Spell\ Editor/Export/Spell.dbc
SpellMissile.dbc -> /home/pc/wd/wow/tools/WoW\ Spell\ Editor/Export/SpellMissile.dbc
SpellMissileMotion.dbc -> /home/pc/wd/wow/tools/WoW\ Spell\ Editor/Export/SpellMissileMotion.dbc
...
The idea:
data/dbc folder (acore-custom-dbc) only contains real files or symlinks.Export/ folders.Export/ and effectively in the core's dbc/ folder.Important: for some DBCs (notably
Item.dbc), running a modified version server-side can cause startup issues. In that case, keep the server DBC unpatched and only ship a patched copy to the client (see MPQ section below).
Two editors work well together:
CreatureDisplayInfo.dbc, CreatureModelData.dbc, Item.dbc, etc.).Spell.dbc, SpellMissile*.dbc, SpellVisual*.dbc, and a small patch-4.MPQ with related data.Because WDBXEditor's default file dialogs are clumsy for repeated use, the symlink approach above lets you always open and save from the same, simple paths.
On WoW 3.3.5a, the client uses a strict, path-based virtual filesystem inside MPQ archives. A helpful trick: a folder whose name ends with .MPQ is treated like an MPQ archive. If you drop files inside with the correct structure, the client will load them.
You can create a staging area like this:
python -m build_mpq.cli create /home/pc/Desktop/acore-custom-staging/patch-Z.MPQ
This creates something like:
/home/pc/Desktop/acore-custom-staging/patch-Z.MPQ
├── Cameras
├── Character
├── Creatures
├── DBFilesClient
│ ├── CreatureDisplayInfo.dbc -> /home/pc/wd/wow/tools/WDBXEditor/Export/CreatureDisplayInfo.dbc
│ ├── CreatureModelData.dbc -> /home/pc/wd/wow/tools/WDBXEditor/Export/CreatureModelData.dbc
│ ├── Item.dbc -> /home/pc/wd/wow/tools/WDBXEditor/Export/Item.dbc
│ ├── patch-4.MPQ -> /home/pc/wd/wow/tools/WoW\ Spell\ Editor/Export/patch-4.MPQ
│ ├── Spell.dbc -> /home/pc/wd/wow/tools/WoW\ Spell\ Editor/Export/Spell.dbc
│ ├── SpellMissile.dbc -> /home/pc/wd/wow/tools/WoW\ Spell\ Editor/Export/SpellMissile.dbc
│ ├── SpellMissileMotion.dbc -> /home/pc/wd/wow/tools/WoW\ Spell\ Editor/Export/SpellMissileMotion.dbc
│ ├── SpellVisual.dbc -> /home/pc/wd/wow/tools/WoW\ Spell\ Editor/Export/SpellVisual.dbc
│ ├── SpellVisualEffectName.dbc -> ...
│ ├── SpellVisualKit.dbc -> ...
│ ├── SpellVisualKitAreaModel.dbc -> ...
│ ├── SpellVisualKitModelAttach.dbc -> ...
│ └── SpellVisualPrecastTransitions.dbc -> ...
├── Fonts
...
Now symlink this folder into your client Data/ directory:
ln -s \
"/home/pc/Desktop/acore-custom-staging/patch-Z.MPQ" \
~/Games/wow335/Data
Because the client treats patch-Z.MPQ as an archive, it will load your custom DBFilesClient/* content when starting.
If you prefer working with real MPQ files, you can also use tools like mpqcli:
mv mpqcli-linux-amd64-glibc mpqcli
chmod +x mpqcli
# place mpqcli somewhere on $PATH so you can call `mpqcli` from anywhere
Then point it at your staging folders to build an actual .MPQ file.
As a concrete example, imagine a caravan event starting in Goldshire and traveling to another outpost. This can be implemented in many ways:
Server-side work for such an event might include:
Client-side work often requires:
CreatureDisplayInfo.dbc and CreatureModelData.dbc.You can take inspiration from guides such as the stoneharry/DBC-Editing-Workflow style approach for structuring client changes.
Copying creatures by hand is tedious because a single creature definition touches many linked tables:
creature_templatecreature_equip_templatecreature_model_info / addonssmart_scripts (if using SmartAI)Modern versions of Keira3 include features to duplicate an existing creature and automatically handle the related tables. This turns a multi-table manual copy into a single operation, and is ideal when:
Similarly, you can:
For quick client testing of custom items, you can use a helper addon like CustomItemFix to avoid immediate client patching at the cost of some limitations (for example, not being able to place the item directly on action bars).
Some example visual/gameobject IDs that are often useful when prototyping:
SpellVisual ID 66206 – rope beam style effect.GameObjectDisplay / related visual ID 46342.These are just references; you should always confirm IDs in your own client/DB tooling.
Some recurring friction points when modding 3.3.5a:
/gm) to look up and preview entries.DBFilesClient/ and related subfolders.With this environment in place, you can now:
Future articles can dive deeper into:
mod-ale) with server modules for richer UX.Cross-Core Study: AzerothCore, TrinityCore, and MaNGOS Comparison
AzerothCore Server-Side Modules (Examples)