This page answers the question that stops most people before they ever reach SETUP.md: where does the client come from?
Short answer: from Blizzard, by you. The World of Warcraft client is a free download — a subscription is only required to play on Blizzard’s own realms. Nothing in this project ships, mirrors or redistributes it, and you do not need anyone else’s copy.
Do not download the client from a torrent tracker or a file-sharing site. Redistributing Blizzard’s client is copyright infringement, third-party builds are unverifiable binaries you would be running on your own machine, and it is completely unnecessary — the official download is free and takes one command. See DISCLAIMER.md.
| A Battle.net account | Free to create. No subscription needed to download. |
| Disk space | ~100 GB for a full modern retail install. |
| The right build | This project tracks 12.0.7.68974, the live retail build. The build must match your world database. |
C:\Program Files (x86)\World of Warcraft\_retail_.Caveat: the app always installs the current live build. If retail has moved past the build your server expects, this gives you a client newer than your database and login fails with a version mismatch.
Nothing can install an old build for you. Not the Battle.net app, and not Battle.Net-Installer below — it drives Blizzard’s Agent, which only ever fetches whatever is live right now. There is no argument for a build id or a buildconfig hash, and Blizzard does not serve arbitrary past builds.
Check what is live before downloading:
(Invoke-WebRequest 'http://us.patch.battle.net:1119/wow/versions' -UseBasicParsing).Content
The VersionsName column on the us row is the build you will get.
scripts/setup-client.ps1 runs this check for you and refuses to start a
download that would produce the wrong build.
If the live build is newer than your server’s, there are two real options:
scripts/setup-client.ps1 -SkipInstall.This repository tracks the live build, currently 12.0.7.68974. That is the deliberate policy — anyone can download it today, so a newcomer is never stuck. Retail will move again; when it does, take option 1.
Moving the server is far less work than it sounds.
maps,vmapsandmmapsare versioned by TrinityCore’s own format, not by the game build, so they usually carry over untouched — 68275 → 68974 needed no re-extraction of any of them. In practice it is: rebuild the core, refreshdbc, apply the new world SQL, setgamebuild. See SETUP.md.
Battle.Net-Installer drives Blizzard’s own Battle.net Agent to install, update or repair a product into a directory you choose. It is not a downloader that works around Blizzard — it uses Blizzard’s Agent and CDN, which is why it needs the Battle.net app installed and recently logged in.
Requirements: Windows, .NET 8.0, Battle.net installed and authenticated. Only products marked Active in the TACT database will install.
BNetInstaller.exe --prod wow --lang enUS --dir "C:\Games\WoW_Midnight" --uid wow --verbose false
| Flag | Meaning |
|---|---|
--prod |
TACT product code. wow is retail — the Product field in .build.info of any existing install confirms it. |
--lang |
Asset language, e.g. enUS, ruRU. Availability varies per product. |
--dir |
Install directory. |
--uid |
Agent UID, when it differs from the product code. |
--repair |
Repair instead of install/update. |
--verbose false. Verbose progress reporting reads the cursor
position and crashes when there is no interactive desktop session.Agent error 2310 — as of 2026-08-08 this tool does not work at all.
Verified on a machine where it worked in July: the upstream v2.1 release
fails with Agent Error: 2310, and so does a fresh build of the
fork whose pull request
#27 (“Nice try Blizzard”) fixed 2310 back in February 2026. Both fail
identically, with the Agent running and authenticated, with and without
--uid, in any locale, into an empty directory.
Blizzard evidently tightened Agent-side validation again. The February fix
set MonitorPid to a real process id and added proper JSON headers; that is
no longer enough. Until someone updates the tool, use Option A — the
Battle.net app installs WoW into a directory you choose and is not affected.
(An earlier version of this page blamed a missing phoenix-agent/1.0
User-Agent. That was wrong — upstream has always sent that header.)
If you only need the client to extract server data rather than to play, you can skip this entirely: the TrinityCore extractors read Blizzard’s CASC storage online. See Extracting without a full install.
Verified against a working retail install (~131 GB):
WoW_Midnight\
├── .build.info <- product + exact version live here
├── .product.db
├── Data\ <- CASC storage (config, data, indices, …)
├── _retail_\
│ ├── Wow.exe <- the game binary
│ └── WTF\Config.wtf <- the one file you edit
├── Arctium Game Launcher.exe <- at the ROOT, not inside _retail_
└── World of Warcraft Launcher.exe
Two details that trip people up: Arctium sits at the install root, beside
_retail_ — not next to Wow.exe. And the file you edit is
_retail_\WTF\Config.wtf, not a Config.wtf at the root.
Everything downstream depends on this. The fastest and most reliable check is
.build.info in the install root — it is a pipe-delimited text file, and the
Version field holds the exact build:
# Windows (PowerShell)
Get-Content .build.info | Select-String "12\.0\.7"
You are looking for the build your server runs — 12.0.7.68974 here. The same file’s Product field should
read wow (retail) — that is the product code to pass to --prod.
You can also read the build on the login screen (bottom corner), or from
Wow.exe → Properties → Details.
If the build does not match your world database, login fails every time with a version mismatch. There is no workaround other than aligning the two.
If you installed through the Battle.net app, it will happily update the client out from under you and break the match. Either keep a separate copy of the client folder that the app does not manage, or install with Option B into a directory the app knows nothing about.
mapextractor, vmap4extractor +
vmap4assembler, and mmaps_generator run inside your client folder and
produce dbc/, maps/, vmaps/, mmaps/, cameras/. Those go to your
server’s data directory. This is covered in SETUP.md.Config.wtf. This is covered in CONNECT.md.The extracted data is Blizzard’s. It stays on your machine and your server. It is never shared, and it is not in this repository.
The TrinityCore extractors can read Blizzard’s CASC storage online, so a server can be built from a data-only fetch rather than a complete game install. This is how the reference server for this project was built. It is still Blizzard’s data, fetched from Blizzard, under the same terms — the convenience is that you do not need the full client sitting on the server host.
See SETUP.md for the extractor flags.
| Symptom | Cause | Fix |
|---|---|---|
| Login screen build ≠ the server’s | Client auto-updated, or was installed at the live build | It cannot be downgraded — move the server to the live build, or restore an install of the old one and stop the Battle.net app managing that folder |
| Extractors find no data | Run from the wrong directory | Run them inside the client folder, next to WoW.exe |
| CASC download is enormous | The cache is kept alongside the data | The CASC cache can be deleted after extraction; it re-downloads on demand |
| “Version mismatch” at login | Client build ≠ world DB build | Align the two — see above |
Once the build matches and the data is extracted, continue to SETUP.md and then CONNECT.md.