WoW Files Setup sheet
In progress · R&D WoW Files R&D branch Build 12.0.0+

Midnight Era setup

12.0.0+

There is no server to set up. This sheet covers the R&D workflow instead: recording clean captures, diffing opcodes, and keeping the tooling ready for the first playable build.

Core branch
main
Protocol build
undetermined
Client required
live retail client
Max level
Disk
500 GB
Build time
≈ 20 min

Before you record

Everything below assumes a clean host
  • A client you already ownCaptures come from your own licensed session. Nothing here provides or patches a client.
  • Roughly 500 GB freeCapture files are large and you keep the raw ones for re-diffing later.
  • GCC 13+ · CMake 3.20+ · PostgreSQL 16The harness and pipeline compile from source. No prebuilt binaries are published.
  • Read the terms firstRecording traffic from a live service may violate its terms. That decision is yours to make knowingly.

Research tracks

All 3 shown in full

Packet capture

Client side · ongoing

Build the capture harness

The harness records a session alongside your own client. It never modifies, injects into, or automates the client — it reads traffic you generate by playing normally.

bash · r&d
$ tar --zstd -xf wf-capture-tools.tar.zst -C ~/wf
$ cd ~/wf && cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
$ cmake --build build -j$(nproc)

Record a session

Tag every capture with the build number and locale. Untagged captures are unusable — the diff pipeline cannot place them in the timeline.

bash · r&d
$ ./build/wfcap --iface eth0 --build 12.0.0 --locale enUS -o caps/
# handshake and movement captures are the current priority

Scrub and submit

Strip account identifiers before anything leaves your machine. The scrubber is not optional and submission refuses unscrubbed files.

bash · r&d
$ ./build/wfscrub caps/*.wfc
$ ./build/wfsubmit caps/*.wfc --track capture
Your account, your risk. Read the terms of service for any client you capture from before you record anything.

Opcode diffing

Pipeline · per build

Build the diff pipeline

The pipeline ingests capture files and emits a candidate opcode table. It compares each new client build against the last mapped one.

bash · r&d
$ tar --zstd -xf wf-capture-tools.tar.zst -C ~/wf
$ cd ~/wf && cmake -B build -S . -DCMAKE_BUILD_TYPE=Release
$ cmake --build build -j$(nproc) --target wf

Diff two builds

Point the tool at your capture directory and the two build numbers. Ambiguous mappings get flagged rather than guessed.

bash · r&d
$ wf diff --from 11.0.7 --to 12.0.0 --captures caps/ -o delta.json
$ wf review delta.json   # manual sign-off on flagged entries

Verify against independent sources

A mapping needs two captures from different contributors before it merges. This is the rule that keeps the table honest.

bash · r&d
$ wf verify delta.json --min-sources 2
$ wf publish delta.json --changelog feeds/midnight.md
Nothing here boots a server. The output is a table, not a realm.

Tooling & schema

Extractors · ongoing

Build the extractors in debug mode

Tooling tracks client format changes so that the day a world server exists, extraction already works. Debug builds keep the assertions on.

bash · r&d
$ cmake -B build -S core -DWF_RND=1 -DCMAKE_BUILD_TYPE=Debug
$ cmake --build build -j$(nproc) --target extractors

Draft table layouts from resolved opcodes

Schema drafting runs off the accepted opcode table. It produces SQL you can read and lint, not SQL you should import.

bash · r&d
$ wf schema draft --from delta.json -o sql/draft/
$ wf schema lint sql/draft/*.sql
Do not import this. The draft schema changes weekly and is not migration-safe.

Keep the build green

The CMake target has to build on every commit even though nothing runs yet. That discipline is what makes the first playable build cheap.

bash · ci
$ wf ci local --target extractors --target schema
$ git commit -m "extractors: track 12.0.0 chunk header change"

Configuration keys

Edit before first launch
KeyValueWhat it does
capture.iface
wf.toml
eth0
Interface the harness listens on.
capture.build
wf.toml
12.0.0
Written into every capture header. Wrong value corrupts the diff timeline.
scrub.strict
wf.toml
true
Refuses to submit if any account identifier survives the pass.
diff.min_sources
wf.toml
2
Independent captures required before a mapping is accepted.

Verify it worked

In order — each one gates the next
  • Harness recordsA short session produces a non-empty .wfc file with the right build tag in its header.
  • Scrubber runs cleanwfscrub reports zero surviving identifiers. If it reports any, do not submit.
  • Diff produces a deltaThe pipeline emits candidate mappings rather than an empty table.
  • Build stays greenThe CMake targets still compile after your change.

When it goes wrong

The four failures everyone hits
Capture file is emptywfcap wrote 0 bytes
Wrong interface. List them with ip -br link and pass the one carrying game traffic, not the loopback.
Submission refusedunscrubbed capture rejected
Run wfscrub over the files first. Submission will not accept raw captures, by design.
Diff table is emptyno candidate mappings
The captures are all from one build. A diff needs both sides of the comparison.
Mapping never mergesawaiting second source
Two independent captures are required. Yours alone will sit in review until someone else records the same exchange.

License terms you inherit

Copyleft obligations

This core carries copyleft terms from its lineage. Anything you distribute travels under the same license, with source.

Network clause

Serving a modified core publicly counts as distribution under the stricter terms. A private realm does not trigger it.

Access terms

Bundles are issued per operator and are not transferable. Do not rehost them or pass them on.

Client files — not licensed here

Maps, DBC, and art stay under the publisher's terms. Extract from a client you own; never redistribute them.

Keep reading